From 2888a2a8a23870730b5ab1c289c3be5bbf40c7cb Mon Sep 17 00:00:00 2001 From: Joachim Schole Date: Thu, 25 Apr 2024 17:44:27 +0200 Subject: [PATCH] refactor: refactor connectors a bit so that the settings values become simpler --- .../AbstractHuggingFaceConnector.php | 15 +++- src/connectors/ConnectorInterface.php | 5 +- .../HuggingFaceBlipBaseAltTextGenerator.php | 2 + .../HuggingFaceBlipLargeAltTextGenerator.php | 2 + .../translation/DeeplTranslator.php | 14 +++ .../HuggingFaceOpusMtEnDeTranslator.php | 2 + .../HuggingFaceT5SmallTranslator.php | 2 + src/models/Settings.php | 87 ++++++++++++++----- 8 files changed, 103 insertions(+), 26 deletions(-) diff --git a/src/connectors/AbstractHuggingFaceConnector.php b/src/connectors/AbstractHuggingFaceConnector.php index 48e655a..ac44083 100644 --- a/src/connectors/AbstractHuggingFaceConnector.php +++ b/src/connectors/AbstractHuggingFaceConnector.php @@ -5,8 +5,21 @@ use fork\altify\Plugin; use GuzzleHttp\Client; -class AbstractHuggingFaceConnector implements ConnectorInterface +abstract class AbstractHuggingFaceConnector implements ConnectorInterface { + protected string $name = ''; + protected string $handle = ''; + + public function getName(): string + { + return $this->name; + } + + public function getHandle(): string + { + return $this->handle; + } + protected function getClient(): Client { return new Client([ diff --git a/src/connectors/ConnectorInterface.php b/src/connectors/ConnectorInterface.php index 25015f8..55d37d8 100644 --- a/src/connectors/ConnectorInterface.php +++ b/src/connectors/ConnectorInterface.php @@ -2,4 +2,7 @@ namespace fork\altify\connectors; -interface ConnectorInterface {} +interface ConnectorInterface { + public function getName(): string; + public function getHandle(): string; +} diff --git a/src/connectors/alttextgeneration/HuggingFaceBlipBaseAltTextGenerator.php b/src/connectors/alttextgeneration/HuggingFaceBlipBaseAltTextGenerator.php index 4f310c1..94f80a7 100644 --- a/src/connectors/alttextgeneration/HuggingFaceBlipBaseAltTextGenerator.php +++ b/src/connectors/alttextgeneration/HuggingFaceBlipBaseAltTextGenerator.php @@ -4,5 +4,7 @@ class HuggingFaceBlipBaseAltTextGenerator extends AbstractHuggingFaceAltTextGenerator { + protected string $name = 'BLIP base model (Hugging Face)'; + protected string $handle = 'hfBlipBase'; protected string $modelPath = '/models/Salesforce/blip-image-captioning-base'; } diff --git a/src/connectors/alttextgeneration/HuggingFaceBlipLargeAltTextGenerator.php b/src/connectors/alttextgeneration/HuggingFaceBlipLargeAltTextGenerator.php index 4ddc5f8..2d99c6d 100644 --- a/src/connectors/alttextgeneration/HuggingFaceBlipLargeAltTextGenerator.php +++ b/src/connectors/alttextgeneration/HuggingFaceBlipLargeAltTextGenerator.php @@ -4,5 +4,7 @@ class HuggingFaceBlipLargeAltTextGenerator extends AbstractHuggingFaceAltTextGenerator { + protected string $name = 'BLIP large model (Hugging Face)'; + protected string $handle = 'hfBlipLarge'; protected string $modelPath = '/models/Salesforce/blip-image-captioning-large'; } diff --git a/src/connectors/translation/DeeplTranslator.php b/src/connectors/translation/DeeplTranslator.php index 8637120..e641d39 100644 --- a/src/connectors/translation/DeeplTranslator.php +++ b/src/connectors/translation/DeeplTranslator.php @@ -9,6 +9,19 @@ class DeeplTranslator implements TranslatorInterface { + protected string $name = 'DeepL'; + protected string $handle = 'deepl'; + + public function getName(): string + { + return $this->name; + } + + public function getHandle(): string + { + return $this->handle; + } + /** * @param Asset $image * @return string|null @@ -26,4 +39,5 @@ public function translateAltTextForImage(Asset $image): ?string return $altText; } + } diff --git a/src/connectors/translation/HuggingFaceOpusMtEnDeTranslator.php b/src/connectors/translation/HuggingFaceOpusMtEnDeTranslator.php index 003f6fa..5f453f0 100644 --- a/src/connectors/translation/HuggingFaceOpusMtEnDeTranslator.php +++ b/src/connectors/translation/HuggingFaceOpusMtEnDeTranslator.php @@ -4,5 +4,7 @@ class HuggingFaceOpusMtEnDeTranslator extends AbstractHuggingFaceTranslator { + protected string $name = 'OPUS MT En -> De'; + protected string $handle = 'opusMtEnDe'; protected string $modelPath = '/models/Helsinki-NLP/opus-mt-en-de'; } diff --git a/src/connectors/translation/HuggingFaceT5SmallTranslator.php b/src/connectors/translation/HuggingFaceT5SmallTranslator.php index 67b018e..b745602 100644 --- a/src/connectors/translation/HuggingFaceT5SmallTranslator.php +++ b/src/connectors/translation/HuggingFaceT5SmallTranslator.php @@ -4,5 +4,7 @@ class HuggingFaceT5SmallTranslator extends AbstractHuggingFaceTranslator { + protected string $name = 'T5 small En -> De'; + protected string $handle = 't5SmallEnDe'; protected string $modelPath = '/models/google-t5/t5-small'; } diff --git a/src/models/Settings.php b/src/models/Settings.php index b71141d..823c8ee 100644 --- a/src/models/Settings.php +++ b/src/models/Settings.php @@ -8,6 +8,7 @@ use fork\altify\connectors\alttextgeneration\AltTextGeneratorInterface; use fork\altify\connectors\alttextgeneration\HuggingFaceBlipBaseAltTextGenerator; use fork\altify\connectors\alttextgeneration\HuggingFaceBlipLargeAltTextGenerator; +use fork\altify\connectors\ConnectorInterface; use fork\altify\connectors\translation\DeeplTranslator; use fork\altify\connectors\translation\HuggingFaceOpusMtEnDeTranslator; use fork\altify\connectors\translation\HuggingFaceT5SmallTranslator; @@ -23,19 +24,15 @@ */ class Settings extends Model { - public const GENERATOR_HUGGING_FACE_BLIP_LARGE = 'BLIP large model (Hugging Face)'; - public const GENERATOR_HUGGING_FACE_BLIP_BASE = 'BLIP base model (Hugging Face)'; - private const GENERATOR_MAPPING = [ - self::GENERATOR_HUGGING_FACE_BLIP_LARGE => HuggingFaceBlipLargeAltTextGenerator::class, - self::GENERATOR_HUGGING_FACE_BLIP_BASE => HuggingFaceBlipBaseAltTextGenerator::class + private const GENERATORS = [ + HuggingFaceBlipLargeAltTextGenerator::class, + HuggingFaceBlipBaseAltTextGenerator::class ]; - public const TRANSLATOR_DEEPL = 'DeepL'; - public const TRANSLATOR_HUGGING_FACE_OPUS_MT = 'OPUS MT En -> De'; - public const TRANSLATOR_HUGGING_FACE_T5_SMALL = 'T5 small En -> De'; - private const TRANSLATOR_MAPPING = [ - self::TRANSLATOR_DEEPL => DeeplTranslator::class, - self::TRANSLATOR_HUGGING_FACE_OPUS_MT => HuggingFaceOpusMtEnDeTranslator::class, - self::TRANSLATOR_HUGGING_FACE_T5_SMALL => HuggingFaceT5SmallTranslator::class, + + private const TRANSLATORS = [ + DeeplTranslator::class, + HuggingFaceOpusMtEnDeTranslator::class, + HuggingFaceT5SmallTranslator::class, ]; public ?string $altTextGenerator = null; @@ -59,14 +56,21 @@ public function getDeeplApiKey(): ?string return App::parseEnv($this->deeplApiKey); } + /** + * @return array[] + * @noinspection PhpUnused + */ public function getGeneratorSuggestions(): array { $data = []; - foreach (self::GENERATOR_MAPPING as $name => $hint) { + foreach (self::getAvailableGenerators() as $handle => $classname) { + /** @var AltTextGeneratorInterface $obj */ + $obj = new $classname(); + $data[] = [ - 'name' => $name, - 'hint' => $hint + 'name' => $obj->getName(), + 'hint' => $handle ]; } @@ -76,14 +80,21 @@ public function getGeneratorSuggestions(): array ]]; } + /** + * @return array[] + * @noinspection PhpUnused + */ public function getTranslatorSuggestions(): array { $data = []; - foreach (self::TRANSLATOR_MAPPING as $name => $hint) { + foreach (self::getAvailableTranslators() as $handle => $classname) { + /** @var TranslatorInterface $obj */ + $obj = new $classname(); + $data[] = [ - 'name' => $name, - 'hint' => $hint + 'name' => $obj->getName(), + 'hint' => $handle ]; } @@ -99,10 +110,12 @@ public function getTranslatorSuggestions(): array public function getAltTextGenerator(): AltTextGeneratorInterface { $altTextGenerator = App::parseEnv($this->altTextGenerator); - if (class_exists($altTextGenerator)) { - $className = $altTextGenerator; + $generators = $this->getAvailableGenerators(); + + if (key_exists($altTextGenerator, $generators)) { + $className = $generators[$altTextGenerator]; } else { - $className = self::GENERATOR_MAPPING[$this->altTextGenerator ?? self::GENERATOR_HUGGING_FACE_BLIP_LARGE]; + $className = HuggingFaceBlipLargeAltTextGenerator::class; } if (!is_a($className, AltTextGeneratorInterface::class, true)) { throw new InvalidConfigException(Craft::t( @@ -124,10 +137,12 @@ public function getAltTextGenerator(): AltTextGeneratorInterface public function getAltTextTranslator(): TranslatorInterface { $altTextTranslator = App::parseEnv($this->altTextTranslator); - if (class_exists($altTextTranslator)) { - $className = $altTextTranslator; + $translators = self::getAvailableTranslators(); + + if (key_exists($altTextTranslator, $translators)) { + $className = $translators[$altTextTranslator]; } else { - $className = self::TRANSLATOR_MAPPING[$this->altTextTranslator ?? self::TRANSLATOR_HUGGING_FACE_T5_SMALL]; + $className = HuggingFaceT5SmallTranslator::class; } if (!is_a($className, TranslatorInterface::class, true)) { throw new InvalidConfigException(Craft::t( @@ -142,4 +157,28 @@ public function getAltTextTranslator(): TranslatorInterface return new $className; } + + private static function getAvailableGenerators(): array + { + return self::buildConnectorArray(self::GENERATORS); + } + + private static function getAvailableTranslators(): array + { + return self::buildConnectorArray(self::TRANSLATORS); + } + + private static function buildConnectorArray(array $classnames): array + { + $data = []; + + foreach ($classnames as $classname) { + /** @var ConnectorInterface $obj */ + $obj = new $classname(); + + $data[$obj->getHandle()] = $classname; + } + + return $data; + } }