LLM OCP API: Type shenanigans for Visitor pattern

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
(cherry picked from commit 906e9b7014)
This commit is contained in:
Marcel Klehr 2023-06-27 16:43:54 +02:00
parent 4405027471
commit c8bbe8fc75
7 changed files with 30 additions and 34 deletions

View file

@ -5,7 +5,11 @@ namespace OCP\LanguageModel;
use OC\LanguageModel\Db\Task;
/**
* @since 28.0.0
* This is an abstract LanguageModel task that implements basic
* goodies for downstream tasks
* @since 28.0.
* @template T of ILanguageModelProvider
* @template-implements ILanguageModelTask<T>
*/
abstract class AbstractLanguageModelTask implements ILanguageModelTask {
protected ?int $id;
@ -25,21 +29,6 @@ abstract class AbstractLanguageModelTask implements ILanguageModelTask {
) {
}
/**
* @param ILanguageModelProvider $provider
* @return string
* @throws \RuntimeException
* @since 28.0.0
*/
abstract public function visitProvider(ILanguageModelProvider $provider): string;
/**
* @param ILanguageModelProvider $provider
* @return bool
* @since 28.0.0
*/
abstract public function canUseProvider(ILanguageModelProvider $provider): bool;
/**
* @return string
* @since 28.0.0

View file

@ -4,6 +4,7 @@ namespace OCP\LanguageModel;
/**
* @since 28.0.0
* @template-extends AbstractLanguageModelTask<ILanguageModelProvider>
*/
final class FreePromptTask extends AbstractLanguageModelTask {
/**
@ -15,7 +16,7 @@ final class FreePromptTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function visitProvider(ILanguageModelProvider $provider): string {
public function visitProvider($provider): string {
return $provider->prompt($this->getInput());
}
@ -23,7 +24,7 @@ final class FreePromptTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function canUseProvider(ILanguageModelProvider $provider): bool {
public function canUseProvider($provider): bool {
return true;
}

View file

@ -6,6 +6,7 @@ namespace OCP\LanguageModel;
* This LanguageModel Task represents headline generation
* which generates a headline for the passed text
* @since 28.0.0
* @template-extends AbstractLanguageModelTask<IHeadlineProvider>
*/
final class HeadlineTask extends AbstractLanguageModelTask {
/**
@ -17,9 +18,9 @@ final class HeadlineTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function visitProvider(ILanguageModelProvider $provider): string {
if (!$provider instanceof IHeadlineProvider) {
throw new \RuntimeException('SummaryTask#visitProvider expects IHeadlineProvider');
public function visitProvider($provider): string {
if (!$this->canUseProvider($provider)) {
throw new \RuntimeException('HeadlineTask#visitProvider expects IHeadlineProvider');
}
return $provider->findHeadline($this->getInput());
}
@ -28,7 +29,7 @@ final class HeadlineTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function canUseProvider(ILanguageModelProvider $provider): bool {
public function canUseProvider($provider): bool {
return $provider instanceof IHeadlineProvider;
}

View file

@ -29,6 +29,8 @@ namespace OCP\LanguageModel;
use RuntimeException;
/**
* This is the minimum interface is implemented by apps that
* implement a LanguageModel provider
* @since 28.0.0
*/
interface ILanguageModelProvider {

View file

@ -4,6 +4,7 @@ namespace OCP\LanguageModel;
/**
* @since 28.0.0
* @template T of ILanguageModelProvider
*/
interface ILanguageModelTask extends \JsonSerializable {
/**
@ -38,18 +39,18 @@ interface ILanguageModelTask extends \JsonSerializable {
];
/**
* @param ILanguageModelProvider $provider
* @param T $provider
* @return string
* @since 28.0.0
*/
public function visitProvider(ILanguageModelProvider $provider): string;
public function visitProvider($provider): string;
/**
* @param ILanguageModelProvider $provider
* @param T $provider
* @return bool
* @since 28.0.0
*/
public function canUseProvider(ILanguageModelProvider $provider): bool;
public function canUseProvider($provider): bool;
/**

View file

@ -3,9 +3,10 @@
namespace OCP\LanguageModel;
/**
* This LanguageModel Task represents summarization
* This is an absctract LanguageModel Task represents summarization
* which sums up the passed text.
* @since 28.0.0
* @template-extends AbstractLanguageModelTask<ISummaryProvider>
*/
final class SummaryTask extends AbstractLanguageModelTask {
/**
@ -17,8 +18,8 @@ final class SummaryTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function visitProvider(ILanguageModelProvider $provider): string {
if (!$provider instanceof ISummaryProvider) {
public function visitProvider($provider): string {
if (!$this->canUseProvider($provider)) {
throw new \RuntimeException('SummaryTask#visitProvider expects ISummaryProvider');
}
return $provider->summarize($this->getInput());
@ -28,7 +29,7 @@ final class SummaryTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function canUseProvider(ILanguageModelProvider $provider): bool {
public function canUseProvider($provider): bool {
return $provider instanceof ISummaryProvider;
}

View file

@ -6,6 +6,7 @@ namespace OCP\LanguageModel;
* This LanguageModel Task represents topics synthesis
* which outputs comma-separated topics for the passed text
* @since 28.0.0
* @template-extends AbstractLanguageModelTask<ITopicsProvider>
*/
final class TopicsTask extends AbstractLanguageModelTask {
/**
@ -17,9 +18,9 @@ final class TopicsTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function visitProvider(ILanguageModelProvider $provider): string {
if (!$provider instanceof ITopicsProvider) {
throw new \RuntimeException('SummaryTask#visitProvider expects IHeadlineProvider');
public function visitProvider($provider): string {
if (!$this->canUseProvider($provider)) {
throw new \RuntimeException('TopicsTask#visitProvider expects ITopicsProvider');
}
return $provider->findTopics($this->getInput());
}
@ -28,7 +29,7 @@ final class TopicsTask extends AbstractLanguageModelTask {
* @inheritDoc
* @since 28.0.0
*/
public function canUseProvider(ILanguageModelProvider $provider): bool {
public function canUseProvider($provider): bool {
return $provider instanceof ITopicsProvider;
}