mirror of
https://github.com/nextcloud/server.git
synced 2026-04-22 06:37:56 -04:00
LLM OCP API: Rework to use Task objects
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
(cherry picked from commit 01dd1a894d)
This commit is contained in:
parent
2e9dea2061
commit
457f1eb407
12 changed files with 185 additions and 150 deletions
72
lib/public/LanguageModel/AbstractLanguageModelTask.php
Normal file
72
lib/public/LanguageModel/AbstractLanguageModelTask.php
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel;
|
||||
|
||||
abstract class AbstractLanguageModelTask {
|
||||
|
||||
public const STATUS_UNKNOWN = 0;
|
||||
public const STATUS_RUNNING = 1;
|
||||
public const STATUS_SUCCESSFUL = 2;
|
||||
public const STATUS_FAILED = 4;
|
||||
|
||||
protected ?int $id;
|
||||
protected int $status = self::STATUS_UNKNOWN;
|
||||
|
||||
public function __construct(
|
||||
protected string $input,
|
||||
protected string $appId,
|
||||
protected ?string $userId,
|
||||
) {
|
||||
}
|
||||
|
||||
abstract public function visitProvider(ILanguageModelProvider $provider): string;
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStatus(): int {
|
||||
return $this->status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $status
|
||||
*/
|
||||
public function setStatus(int $status): void {
|
||||
$this->status = $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int|null
|
||||
*/
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int|null $id
|
||||
*/
|
||||
public function setId(?int $id): void {
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getInput(): string {
|
||||
return $this->input;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAppId(): string {
|
||||
return $this->appId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|null
|
||||
*/
|
||||
public function getUserId(): ?string {
|
||||
return $this->userId;
|
||||
}
|
||||
}
|
||||
|
|
@ -26,6 +26,7 @@ declare(strict_types=1);
|
|||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
use OCP\EventDispatcher\Event;
|
||||
use OCP\LanguageModel\AbstractLanguageModelTask;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
|
|
@ -35,32 +36,16 @@ abstract class AbstractLanguageModelEvent extends Event {
|
|||
* @since 28.0.0
|
||||
*/
|
||||
public function __construct(
|
||||
private int $requestId,
|
||||
private ?string $userId,
|
||||
private string $appId,
|
||||
private AbstractLanguageModelTask $task
|
||||
) {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AbstractLanguageModelTask
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getRequestId(): int {
|
||||
return $this->requestId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getUserId(): ?string {
|
||||
return $this->userId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getAppId(): string {
|
||||
return $this->appId;
|
||||
public function getTask(): AbstractLanguageModelTask {
|
||||
return $this->task;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class PromptFailedEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(int $requestId,
|
||||
?string $userId,
|
||||
string $appId,
|
||||
private string $errorMessage) {
|
||||
parent::__construct($requestId, $userId, $appId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorMessage(): string {
|
||||
return $this->errorMessage;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class PromptSuccessfulEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(int $requestId,
|
||||
?string $userId,
|
||||
string $appId,
|
||||
private string $output) {
|
||||
parent::__construct($requestId, $userId, $appId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOutput(): string {
|
||||
return $this->output;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class SummaryFailedEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(int $requestId,
|
||||
?string $userId,
|
||||
string $appId,
|
||||
private string $errorMessage) {
|
||||
parent::__construct($requestId, $userId, $appId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorMessage(): string {
|
||||
return $this->errorMessage;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class SummarySuccessfulEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(int $requestId,
|
||||
?string $userId,
|
||||
string $appId,
|
||||
private string $output) {
|
||||
parent::__construct($requestId, $userId, $appId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOutput(): string {
|
||||
return $this->output;
|
||||
}
|
||||
}
|
||||
23
lib/public/LanguageModel/Events/TaskFailedEvent.php
Normal file
23
lib/public/LanguageModel/Events/TaskFailedEvent.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
use OCP\LanguageModel\AbstractLanguageModelTask;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class TaskFailedEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(AbstractLanguageModelTask $task,
|
||||
private string $errorMessage) {
|
||||
parent::__construct($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorMessage(): string {
|
||||
return $this->errorMessage;
|
||||
}
|
||||
}
|
||||
23
lib/public/LanguageModel/Events/TaskSuccessfulEvent.php
Normal file
23
lib/public/LanguageModel/Events/TaskSuccessfulEvent.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel\Events;
|
||||
|
||||
use OCP\LanguageModel\AbstractLanguageModelTask;
|
||||
|
||||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
class TaskSuccessfulEvent extends AbstractLanguageModelEvent {
|
||||
|
||||
public function __construct(AbstractLanguageModelTask $task,
|
||||
private string $output) {
|
||||
parent::__construct($task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getErrorMessage(): string {
|
||||
return $this->output;
|
||||
}
|
||||
}
|
||||
25
lib/public/LanguageModel/FreePromptTask.php
Normal file
25
lib/public/LanguageModel/FreePromptTask.php
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class FreePromptTask extends AbstractLanguageModelTask {
|
||||
|
||||
/**
|
||||
* @param ILanguageModelProvider $provider
|
||||
* @throws RuntimeException
|
||||
* @return string
|
||||
*/
|
||||
public function visitProvider(ILanguageModelProvider $provider): string {
|
||||
$this->setStatus(self::STATUS_RUNNING);
|
||||
try {
|
||||
$output = $provider->prompt($this->getInput());
|
||||
} catch (RuntimeException $e) {
|
||||
$this->setStatus(self::STATUS_FAILED);
|
||||
throw $e;
|
||||
}
|
||||
$this->setStatus(self::STATUS_SUCCESSFUL);
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
|
|
@ -27,6 +27,7 @@ declare(strict_types=1);
|
|||
namespace OCP\LanguageModel;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use OCP\LanguageModel\Events\AbstractLanguageModelEvent;
|
||||
use OCP\PreConditionNotMetException;
|
||||
use RuntimeException;
|
||||
|
||||
|
|
@ -37,53 +38,25 @@ interface ILanguageModelManager {
|
|||
public function hasProviders(): bool;
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function hasSummaryProviders(): bool;
|
||||
public function getAvailableTasks(): array;
|
||||
|
||||
/**
|
||||
* @param string $prompt The prompt to call the Language model with
|
||||
* @returns string The output
|
||||
* @throws PreConditionNotMetException If no provider was registered but this method was still called
|
||||
* @throws PreConditionNotMetException If no or not the requested provider was registered but this method was still called
|
||||
* @throws InvalidArgumentException If the file could not be found or is not of a supported type
|
||||
* @throws RuntimeException If the transcription failed for other reasons
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function prompt(string $prompt): string;
|
||||
public function runTask(AbstractLanguageModelTask $task): AbstractLanguageModelEvent;
|
||||
|
||||
/**
|
||||
* Will schedule an LLM inference process in the background. The result will become available
|
||||
* with the \OCP\LanguageModel\Events\PromptFinishedEvent
|
||||
* with the \OCP\LanguageModel\Events\TaskFinishedEvent
|
||||
*
|
||||
* @param string $prompt The prompt to call the Language model with
|
||||
* @param ?string $userId The user that triggered this request (only for convenience, will be available on the TranscriptEvents)
|
||||
* @param string $appId The app that triggered this request (only for convenience, will be available on the TranscriptEvents)
|
||||
* @returns int The id of the prompt request
|
||||
* @throws PreConditionNotMetException If no provider was registered but this method was still called
|
||||
* @throws PreConditionNotMetException If no or not the requested provider was registered but this method was still called
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function schedulePrompt(string $prompt, ?string $userId, string $appId): int;
|
||||
|
||||
/**
|
||||
* Will schedule an LLM inference process in the background. The result will become available
|
||||
* with the \OCP\LanguageModel\Events\PromptFinishedEvent
|
||||
*
|
||||
* @param string $text The text to summarize
|
||||
* @param ?string $userId The user that triggered this request (only for convenience, will be available on the TranscriptEvents)
|
||||
* @param string $appId The app that triggered this request (only for convenience, will be available on the TranscriptEvents)
|
||||
* @returns int The id of the prompt request
|
||||
* @throws PreConditionNotMetException If no summary provider was registered but this method was still called
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function scheduleSummary(string $text, ?string $userId, string $appId): int;
|
||||
|
||||
/**
|
||||
* @param string $text The text to summarize
|
||||
* @returns string The output
|
||||
* @throws PreConditionNotMetException If no summary provider was registered but this method was still called
|
||||
* @throws InvalidArgumentException If the file could not be found or is not of a supported type
|
||||
* @throws RuntimeException If the transcription failed for other reasons
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function summarize(string $text): string;
|
||||
public function scheduleTask(AbstractLanguageModelTask $task) : void;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ use RuntimeException;
|
|||
/**
|
||||
* @since 28.0.0
|
||||
*/
|
||||
interface ISummaryProvider {
|
||||
interface ISummaryProvider extends ILanguageModelProvider {
|
||||
|
||||
/**
|
||||
* @param string $text The text to summarize
|
||||
|
|
|
|||
28
lib/public/LanguageModel/SummaryTask.php
Normal file
28
lib/public/LanguageModel/SummaryTask.php
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
namespace OCP\LanguageModel;
|
||||
|
||||
use RuntimeException;
|
||||
|
||||
class SummaryTask extends AbstractLanguageModelTask {
|
||||
|
||||
/**
|
||||
* @param ILanguageModelProvider&ISummaryProvider $provider
|
||||
* @throws RuntimeException
|
||||
* @return string
|
||||
*/
|
||||
public function visitProvider(ILanguageModelProvider $provider): string {
|
||||
if (!$provider instanceof ISummaryProvider) {
|
||||
throw new \RuntimeException('SummaryTask#visitProvider expects ISummaryProvider');
|
||||
}
|
||||
$this->setStatus(self::STATUS_RUNNING);
|
||||
try {
|
||||
$output = $provider->summarize($this->getInput());
|
||||
} catch (RuntimeException $e) {
|
||||
$this->setStatus(self::STATUS_FAILED);
|
||||
throw $e;
|
||||
}
|
||||
$this->setStatus(self::STATUS_SUCCESSFUL);
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue