mirror of
https://github.com/nextcloud/server.git
synced 2026-04-21 06:08:46 -04:00
enh(TextToImage): Add getExpectedRuntime to IProvider and run tasks during request lifetime if possible
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
This commit is contained in:
parent
92cc171a61
commit
8968573d9f
4 changed files with 55 additions and 3 deletions
|
|
@ -36,6 +36,7 @@ use OCP\AppFramework\Http\Attribute\PublicPage;
|
|||
use OCP\AppFramework\Http\Attribute\UserRateLimit;
|
||||
use OCP\AppFramework\Http\DataResponse;
|
||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||
use OCP\DB\Exception;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\IL10N;
|
||||
use OCP\IRequest;
|
||||
|
|
@ -91,7 +92,11 @@ class TextToImageApiController extends \OCP\AppFramework\OCSController {
|
|||
public function schedule(string $input, string $appId, string $identifier = ''): DataResponse {
|
||||
$task = new Task($input, $appId, $this->userId, $identifier);
|
||||
try {
|
||||
$this->textToImageManager->scheduleTask($task);
|
||||
try {
|
||||
$this->textToImageManager->runOrScheduleTask($task);
|
||||
} catch (\RuntimeException) {
|
||||
// noop
|
||||
}
|
||||
|
||||
$json = $task->jsonSerialize();
|
||||
|
||||
|
|
@ -100,6 +105,8 @@ class TextToImageApiController extends \OCP\AppFramework\OCSController {
|
|||
]);
|
||||
} catch (PreConditionNotMetException) {
|
||||
return new DataResponse(['message' => $this->l->t('No text to image provider is available')], Http::STATUS_PRECONDITION_FAILED);
|
||||
} catch (Exception) {
|
||||
return new DataResponse(['message' => $this->l->t('Internal error')], Http::STATUS_INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -187,12 +187,12 @@ class Manager implements IManager {
|
|||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws Exception
|
||||
*/
|
||||
public function scheduleTask(Task $task): void {
|
||||
if (!$this->hasProviders()) {
|
||||
throw new PreConditionNotMetException('No text to image provider is installed that can handle this task');
|
||||
}
|
||||
$this->logger->warning('Scheduling Text2Image Task');
|
||||
$task->setStatus(Task::STATUS_SCHEDULED);
|
||||
$taskEntity = DbTask::fromPublicTask($task);
|
||||
$this->taskMapper->insert($taskEntity);
|
||||
|
|
@ -202,6 +202,36 @@ class Manager implements IManager {
|
|||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function runOrScheduleTask(Task $task) : void {
|
||||
if (!$this->hasProviders()) {
|
||||
throw new PreConditionNotMetException('No text to image provider is installed that can handle this task');
|
||||
}
|
||||
$providers = $this->getProviders();
|
||||
|
||||
$json = $this->config->getAppValue('core', 'ai.text2image_provider', '');
|
||||
if ($json !== '') {
|
||||
try {
|
||||
$className = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
|
||||
$provider = current(array_filter($providers, fn ($provider) => $provider::class === $className));
|
||||
if ($provider !== false) {
|
||||
$providers = [$provider];
|
||||
}
|
||||
} catch (\JsonException $e) {
|
||||
$this->logger->warning('Failed to decode Text2Image setting `ai.text2image_provider`', ['exception' => $e]);
|
||||
}
|
||||
}
|
||||
$maxExecutionTime = (int) ini_get('max_execution_time');
|
||||
// Offload the tttttttask to a background job if the expected runtime of the likely provider is longer than 80% of our max execution time
|
||||
if ($providers[0]->getExpectedRuntime() > $maxExecutionTime * 0.8) {
|
||||
$this->scheduleTask($task);
|
||||
return;
|
||||
}
|
||||
$this->runTask($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ declare(strict_types=1);
|
|||
|
||||
namespace OCP\TextToImage;
|
||||
|
||||
use OCP\DB\Exception;
|
||||
use OCP\PreConditionNotMetException;
|
||||
use OCP\TextToImage\Exception\TaskNotFoundException;
|
||||
use RuntimeException;
|
||||
|
|
@ -55,11 +56,19 @@ interface IManager {
|
|||
* If inference fails a \OCP\TextToImage\Events\TaskFailedEvent will be dispatched instead
|
||||
*
|
||||
* @param Task $task The task to schedule
|
||||
* @throws PreConditionNotMetException If no or not the requested provider was registered but this method was still called
|
||||
* @throws PreConditionNotMetException If no provider was registered but this method was still called
|
||||
* @throws Exception If there was a problem inserting the task into the database
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function scheduleTask(Task $task) : void;
|
||||
|
||||
/**
|
||||
* @throws Exception if there was a problem inserting the task into the database
|
||||
* @throws PreConditionNotMetException if no provider is registered
|
||||
* @throws RuntimeException If the task run fail
|
||||
*/
|
||||
public function runOrScheduleTask(Task $task) : void;
|
||||
|
||||
/**
|
||||
* Delete a task that has been scheduled before
|
||||
*
|
||||
|
|
|
|||
|
|
@ -49,4 +49,10 @@ interface IProvider {
|
|||
* @throws RuntimeException If the text could not be processed
|
||||
*/
|
||||
public function generate(string $prompt, $resource): void;
|
||||
|
||||
/**
|
||||
* The expected runtime for one task with this provider in seconds
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getExpectedRuntime(): int;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue