diff --git a/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php b/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php index 2c754db5..72664596 100644 --- a/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php +++ b/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Albert; -use Symfony\AI\Platform\Bridge\OpenAi\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -35,7 +35,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawResultInterface diff --git a/src/platform/src/Bridge/Albert/GptModelClient.php b/src/platform/src/Bridge/Albert/GptModelClient.php index 311eee2a..caac9baa 100644 --- a/src/platform/src/Bridge/Albert/GptModelClient.php +++ b/src/platform/src/Bridge/Albert/GptModelClient.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Albert; -use Symfony\AI\Platform\Bridge\OpenAi\Gpt; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -40,7 +40,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Gpt; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawResultInterface diff --git a/src/platform/src/Bridge/Anthropic/Contract/AssistantMessageNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/AssistantMessageNormalizer.php index c03e034e..59ae07f3 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/AssistantMessageNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/AssistantMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\AssistantMessage; use Symfony\AI\Platform\Model; @@ -33,7 +33,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/DocumentNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/DocumentNormalizer.php index 2ac4e58a..fccffeef 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/DocumentNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/DocumentNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\Document; use Symfony\AI\Platform\Model; @@ -28,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_PDF); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/DocumentUrlNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/DocumentUrlNormalizer.php index 662e0ea7..2752d3c3 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/DocumentUrlNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/DocumentUrlNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\DocumentUrl; use Symfony\AI\Platform\Model; @@ -28,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/ImageNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/ImageNormalizer.php index a165189f..498c1c8d 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/ImageNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/ImageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\Image; use Symfony\AI\Platform\Model; @@ -30,7 +30,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_IMAGE); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/ImageUrlNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/ImageUrlNormalizer.php index e0f422fa..3821b22e 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/ImageUrlNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/ImageUrlNormalizer.php @@ -11,9 +11,8 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; -use Symfony\AI\Platform\Message\Content\Image; use Symfony\AI\Platform\Message\Content\ImageUrl; use Symfony\AI\Platform\Model; @@ -29,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_IMAGE) || $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/MessageBagNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/MessageBagNormalizer.php index 669e77a6..6591f41f 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/MessageBagNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/MessageBagNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; @@ -33,7 +33,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/ToolCallMessageNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/ToolCallMessageNormalizer.php index f2023296..8b8bc3f0 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/ToolCallMessageNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/ToolCallMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\ToolCallMessage; use Symfony\AI\Platform\Model; @@ -32,7 +32,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Anthropic/Contract/ToolNormalizer.php b/src/platform/src/Bridge/Anthropic/Contract/ToolNormalizer.php index 716d3a77..c1c16eee 100644 --- a/src/platform/src/Bridge/Anthropic/Contract/ToolNormalizer.php +++ b/src/platform/src/Bridge/Anthropic/Contract/ToolNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic\Contract; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\JsonSchema\Factory; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Model; @@ -31,7 +31,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Anthropic/ModelClient.php b/src/platform/src/Bridge/Anthropic/ModelClient.php index 978887b3..0a609430 100644 --- a/src/platform/src/Bridge/Anthropic/ModelClient.php +++ b/src/platform/src/Bridge/Anthropic/ModelClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -34,7 +35,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Anthropic/ResultConverter.php b/src/platform/src/Bridge/Anthropic/ResultConverter.php index 92edde31..99b2753f 100644 --- a/src/platform/src/Bridge/Anthropic/ResultConverter.php +++ b/src/platform/src/Bridge/Anthropic/ResultConverter.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Anthropic; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; @@ -33,7 +34,7 @@ class ResultConverter implements ResultConverterInterface { public function supports(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } public function convert(RawHttpResult|RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/Azure/Meta/LlamaModelClient.php b/src/platform/src/Bridge/Azure/Meta/LlamaModelClient.php index b5f1b7eb..6b434805 100644 --- a/src/platform/src/Bridge/Azure/Meta/LlamaModelClient.php +++ b/src/platform/src/Bridge/Azure/Meta/LlamaModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Azure\Meta; use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -31,7 +32,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Azure/Meta/LlamaResultConverter.php b/src/platform/src/Bridge/Azure/Meta/LlamaResultConverter.php index 28d1a4d0..e858da4f 100644 --- a/src/platform/src/Bridge/Azure/Meta/LlamaResultConverter.php +++ b/src/platform/src/Bridge/Azure/Meta/LlamaResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Azure\Meta; -use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -25,7 +25,7 @@ { public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawResultInterface $result, array $options = []): TextResult diff --git a/src/platform/src/Bridge/Azure/OpenAi/EmbeddingsModelClient.php b/src/platform/src/Bridge/Azure/OpenAi/EmbeddingsModelClient.php index 002d0917..0cf1d7c9 100644 --- a/src/platform/src/Bridge/Azure/OpenAi/EmbeddingsModelClient.php +++ b/src/platform/src/Bridge/Azure/OpenAi/EmbeddingsModelClient.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Azure\OpenAi; -use Symfony\AI\Platform\Bridge\OpenAi\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -43,7 +43,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Azure/OpenAi/GptModelClient.php b/src/platform/src/Bridge/Azure/OpenAi/GptModelClient.php index 50438046..3eb7246e 100644 --- a/src/platform/src/Bridge/Azure/OpenAi/GptModelClient.php +++ b/src/platform/src/Bridge/Azure/OpenAi/GptModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Azure\OpenAi; use Symfony\AI\Platform\Bridge\OpenAi\Gpt; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -43,7 +44,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Gpt; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, object|array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Azure/OpenAi/WhisperModelClient.php b/src/platform/src/Bridge/Azure/OpenAi/WhisperModelClient.php index a5490c3b..c8db1550 100644 --- a/src/platform/src/Bridge/Azure/OpenAi/WhisperModelClient.php +++ b/src/platform/src/Bridge/Azure/OpenAi/WhisperModelClient.php @@ -11,8 +11,8 @@ namespace Symfony\AI\Platform\Bridge\Azure\OpenAi; -use Symfony\AI\Platform\Bridge\OpenAi\Whisper; use Symfony\AI\Platform\Bridge\OpenAi\Whisper\Task; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -44,7 +44,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Whisper; + return $model->supports(Capability::INPUT_AUDIO); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeModelClient.php b/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeModelClient.php index a2be5356..a7e9091c 100644 --- a/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeModelClient.php +++ b/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeModelClient.php @@ -16,6 +16,7 @@ use AsyncAws\BedrockRuntime\Result\InvokeModelResponse; use Symfony\AI\Platform\Bridge\Anthropic\Claude; use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -36,7 +37,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawBedrockResult diff --git a/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeResultConverter.php b/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeResultConverter.php index 4fe27ad8..7a9cb3ed 100644 --- a/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeResultConverter.php +++ b/src/platform/src/Bridge/Bedrock/Anthropic/ClaudeResultConverter.php @@ -11,8 +11,8 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Anthropic; -use Symfony\AI\Platform\Bridge\Anthropic\Claude; use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -28,7 +28,7 @@ { public function supports(Model $model): bool { - return $model instanceof Claude; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } public function convert(RawResultInterface|RawBedrockResult $result, array $options = []): ToolCallResult|TextResult diff --git a/src/platform/src/Bridge/Bedrock/Meta/LlamaModelClient.php b/src/platform/src/Bridge/Bedrock/Meta/LlamaModelClient.php index 2607b83e..679b1f07 100644 --- a/src/platform/src/Bridge/Bedrock/Meta/LlamaModelClient.php +++ b/src/platform/src/Bridge/Bedrock/Meta/LlamaModelClient.php @@ -15,6 +15,7 @@ use AsyncAws\BedrockRuntime\Input\InvokeModelRequest; use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -30,7 +31,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawBedrockResult diff --git a/src/platform/src/Bridge/Bedrock/Meta/LlamaResultConverter.php b/src/platform/src/Bridge/Bedrock/Meta/LlamaResultConverter.php index a1e0e5cf..29162131 100644 --- a/src/platform/src/Bridge/Bedrock/Meta/LlamaResultConverter.php +++ b/src/platform/src/Bridge/Bedrock/Meta/LlamaResultConverter.php @@ -13,6 +13,7 @@ use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -26,7 +27,7 @@ class LlamaResultConverter implements ResultConverterInterface { public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawResultInterface|RawBedrockResult $result, array $options = []): TextResult diff --git a/src/platform/src/Bridge/Bedrock/Nova/Contract/AssistantMessageNormalizer.php b/src/platform/src/Bridge/Bedrock/Nova/Contract/AssistantMessageNormalizer.php index a7b20774..fa659f67 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/Contract/AssistantMessageNormalizer.php +++ b/src/platform/src/Bridge/Bedrock/Nova/Contract/AssistantMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova\Contract; -use Symfony\AI\Platform\Bridge\Bedrock\Nova\Nova; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\AssistantMessage; use Symfony\AI\Platform\Model; @@ -29,7 +29,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Bedrock/Nova/Contract/MessageBagNormalizer.php b/src/platform/src/Bridge/Bedrock/Nova/Contract/MessageBagNormalizer.php index 45a3338d..0871b2dd 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/Contract/MessageBagNormalizer.php +++ b/src/platform/src/Bridge/Bedrock/Nova/Contract/MessageBagNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova\Contract; -use Symfony\AI\Platform\Bridge\Bedrock\Nova\Nova; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; use Symfony\AI\Platform\Model; @@ -32,7 +32,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolCallMessageNormalizer.php b/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolCallMessageNormalizer.php index 92cd2e7a..20ff8ec2 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolCallMessageNormalizer.php +++ b/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolCallMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova\Contract; -use Symfony\AI\Platform\Bridge\Bedrock\Nova\Nova; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\ToolCallMessage; use Symfony\AI\Platform\Model; @@ -32,7 +32,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolNormalizer.php b/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolNormalizer.php index 8bdd3793..4f9df723 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolNormalizer.php +++ b/src/platform/src/Bridge/Bedrock/Nova/Contract/ToolNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova\Contract; -use Symfony\AI\Platform\Bridge\Bedrock\Nova\Nova; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\JsonSchema\Factory; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Model; @@ -31,7 +31,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Bedrock/Nova/Contract/UserMessageNormalizer.php b/src/platform/src/Bridge/Bedrock/Nova/Contract/UserMessageNormalizer.php index 31776d5a..1aa89574 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/Contract/UserMessageNormalizer.php +++ b/src/platform/src/Bridge/Bedrock/Nova/Contract/UserMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova\Contract; -use Symfony\AI\Platform\Bridge\Bedrock\Nova\Nova; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Message\Content\Image; @@ -33,7 +33,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Bedrock/Nova/NovaModelClient.php b/src/platform/src/Bridge/Bedrock/Nova/NovaModelClient.php index a1990da6..6b6f1471 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/NovaModelClient.php +++ b/src/platform/src/Bridge/Bedrock/Nova/NovaModelClient.php @@ -14,6 +14,7 @@ use AsyncAws\BedrockRuntime\BedrockRuntimeClient; use AsyncAws\BedrockRuntime\Input\InvokeModelRequest; use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -29,7 +30,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawBedrockResult diff --git a/src/platform/src/Bridge/Bedrock/Nova/NovaResultConverter.php b/src/platform/src/Bridge/Bedrock/Nova/NovaResultConverter.php index bf2c1169..40401fb9 100644 --- a/src/platform/src/Bridge/Bedrock/Nova/NovaResultConverter.php +++ b/src/platform/src/Bridge/Bedrock/Nova/NovaResultConverter.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Bedrock\Nova; use Symfony\AI\Platform\Bridge\Bedrock\RawBedrockResult; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -27,7 +28,7 @@ class NovaResultConverter implements ResultConverterInterface { public function supports(Model $model): bool { - return $model instanceof Nova; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } public function convert(RawResultInterface|RawBedrockResult $result, array $options = []): ToolCallResult|TextResult diff --git a/src/platform/src/Bridge/Cerebras/ModelClient.php b/src/platform/src/Bridge/Cerebras/ModelClient.php index 2ff201b5..ec3d44e7 100644 --- a/src/platform/src/Bridge/Cerebras/ModelClient.php +++ b/src/platform/src/Bridge/Cerebras/ModelClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Cerebras; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model as BaseModel; use Symfony\AI\Platform\ModelClientInterface; @@ -42,7 +43,7 @@ public function __construct( public function supports(BaseModel $model): bool { - return $model instanceof Model; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(BaseModel $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Cerebras/ResultConverter.php b/src/platform/src/Bridge/Cerebras/ResultConverter.php index d6310ba4..c23274e9 100644 --- a/src/platform/src/Bridge/Cerebras/ResultConverter.php +++ b/src/platform/src/Bridge/Cerebras/ResultConverter.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Cerebras; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model as BaseModel; use Symfony\AI\Platform\Result\RawHttpResult; @@ -31,7 +32,7 @@ { public function supports(BaseModel $model): bool { - return $model instanceof Model; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawHttpResult|RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/Gemini/Contract/AssistantMessageNormalizer.php b/src/platform/src/Bridge/Gemini/Contract/AssistantMessageNormalizer.php index b453cf31..ad046931 100644 --- a/src/platform/src/Bridge/Gemini/Contract/AssistantMessageNormalizer.php +++ b/src/platform/src/Bridge/Gemini/Contract/AssistantMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Contract; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\AssistantMessage; use Symfony\AI\Platform\Model; @@ -28,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Gemini/Contract/MessageBagNormalizer.php b/src/platform/src/Bridge/Gemini/Contract/MessageBagNormalizer.php index 75c8776e..f42eb073 100644 --- a/src/platform/src/Bridge/Gemini/Contract/MessageBagNormalizer.php +++ b/src/platform/src/Bridge/Gemini/Contract/MessageBagNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Contract; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; use Symfony\AI\Platform\Message\Role; @@ -33,7 +33,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Gemini/Contract/ToolCallMessageNormalizer.php b/src/platform/src/Bridge/Gemini/Contract/ToolCallMessageNormalizer.php index 7dc73967..aaf4bdfb 100644 --- a/src/platform/src/Bridge/Gemini/Contract/ToolCallMessageNormalizer.php +++ b/src/platform/src/Bridge/Gemini/Contract/ToolCallMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Contract; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\ToolCallMessage; use Symfony\AI\Platform\Model; @@ -28,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Gemini/Contract/ToolNormalizer.php b/src/platform/src/Bridge/Gemini/Contract/ToolNormalizer.php index eddf1ba8..e518a83a 100644 --- a/src/platform/src/Bridge/Gemini/Contract/ToolNormalizer.php +++ b/src/platform/src/Bridge/Gemini/Contract/ToolNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Contract; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\JsonSchema\Factory; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Model; @@ -31,7 +31,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Gemini/Contract/UserMessageNormalizer.php b/src/platform/src/Bridge/Gemini/Contract/UserMessageNormalizer.php index e5e55eba..56e699c2 100644 --- a/src/platform/src/Bridge/Gemini/Contract/UserMessageNormalizer.php +++ b/src/platform/src/Bridge/Gemini/Contract/UserMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Contract; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\File; use Symfony\AI\Platform\Message\Content\Text; @@ -30,7 +30,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Gemini/Embeddings/ModelClient.php b/src/platform/src/Bridge/Gemini/Embeddings/ModelClient.php index 237a1d69..4d373584 100644 --- a/src/platform/src/Bridge/Gemini/Embeddings/ModelClient.php +++ b/src/platform/src/Bridge/Gemini/Embeddings/ModelClient.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Embeddings; -use Symfony\AI\Platform\Bridge\Gemini\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -31,7 +31,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Gemini/Embeddings/ResultConverter.php b/src/platform/src/Bridge/Gemini/Embeddings/ResultConverter.php index 518c2ccf..b084879b 100644 --- a/src/platform/src/Bridge/Gemini/Embeddings/ResultConverter.php +++ b/src/platform/src/Bridge/Gemini/Embeddings/ResultConverter.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Embeddings; use Symfony\AI\Platform\Bridge\Gemini\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -26,7 +27,7 @@ { public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function convert(RawResultInterface $result, array $options = []): VectorResult diff --git a/src/platform/src/Bridge/Gemini/Gemini/ModelClient.php b/src/platform/src/Bridge/Gemini/Gemini/ModelClient.php index b40a1bbc..1acef833 100644 --- a/src/platform/src/Bridge/Gemini/Gemini/ModelClient.php +++ b/src/platform/src/Bridge/Gemini/Gemini/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Gemini; use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -35,7 +36,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Gemini/Gemini/ResultConverter.php b/src/platform/src/Bridge/Gemini/Gemini/ResultConverter.php index da8fe5c2..6fedeb92 100644 --- a/src/platform/src/Bridge/Gemini/Gemini/ResultConverter.php +++ b/src/platform/src/Bridge/Gemini/Gemini/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Gemini\Gemini; -use Symfony\AI\Platform\Bridge\Gemini\Gemini; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\ChoiceResult; @@ -33,7 +33,7 @@ { public function supports(Model $model): bool { - return $model instanceof Gemini; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } public function convert(RawResultInterface|RawHttpResult $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/HuggingFace/Contract/FileNormalizer.php b/src/platform/src/Bridge/HuggingFace/Contract/FileNormalizer.php index 8c5e7a0b..718608b3 100644 --- a/src/platform/src/Bridge/HuggingFace/Contract/FileNormalizer.php +++ b/src/platform/src/Bridge/HuggingFace/Contract/FileNormalizer.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\HuggingFace\Contract; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\File; use Symfony\AI\Platform\Model; @@ -27,7 +28,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return true; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/HuggingFace/Contract/MessageBagNormalizer.php b/src/platform/src/Bridge/HuggingFace/Contract/MessageBagNormalizer.php index 29f8a458..6125c508 100644 --- a/src/platform/src/Bridge/HuggingFace/Contract/MessageBagNormalizer.php +++ b/src/platform/src/Bridge/HuggingFace/Contract/MessageBagNormalizer.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\HuggingFace\Contract; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; use Symfony\AI\Platform\Model; @@ -31,7 +32,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return true; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/LmStudio/Completions/ModelClient.php b/src/platform/src/Bridge/LmStudio/Completions/ModelClient.php index dc422e25..71ef3327 100644 --- a/src/platform/src/Bridge/LmStudio/Completions/ModelClient.php +++ b/src/platform/src/Bridge/LmStudio/Completions/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\LmStudio\Completions; use Symfony\AI\Platform\Bridge\LmStudio\Completions; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface as PlatformResponseFactory; use Symfony\AI\Platform\Result\RawHttpResult; @@ -34,7 +35,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Completions; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/LmStudio/Completions/ResultConverter.php b/src/platform/src/Bridge/LmStudio/Completions/ResultConverter.php index b9c7ad37..2dfe6832 100644 --- a/src/platform/src/Bridge/LmStudio/Completions/ResultConverter.php +++ b/src/platform/src/Bridge/LmStudio/Completions/ResultConverter.php @@ -11,7 +11,6 @@ namespace Symfony\AI\Platform\Bridge\LmStudio\Completions; -use Symfony\AI\Platform\Bridge\LmStudio\Completions; use Symfony\AI\Platform\Bridge\OpenAi\Gpt\ResultConverter as OpenAiResponseConverter; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -30,7 +29,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Completions; + return $this->gptResponseConverter->supports($model); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/LmStudio/Embeddings/ModelClient.php b/src/platform/src/Bridge/LmStudio/Embeddings/ModelClient.php index c705c8a7..92bb9752 100644 --- a/src/platform/src/Bridge/LmStudio/Embeddings/ModelClient.php +++ b/src/platform/src/Bridge/LmStudio/Embeddings/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\LmStudio\Embeddings; use Symfony\AI\Platform\Bridge\LmStudio\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface as PlatformResponseFactory; use Symfony\AI\Platform\Result\RawHttpResult; @@ -31,7 +32,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/LmStudio/Embeddings/ResultConverter.php b/src/platform/src/Bridge/LmStudio/Embeddings/ResultConverter.php index cf06c55b..1d273d64 100644 --- a/src/platform/src/Bridge/LmStudio/Embeddings/ResultConverter.php +++ b/src/platform/src/Bridge/LmStudio/Embeddings/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\LmStudio\Embeddings; -use Symfony\AI\Platform\Bridge\LmStudio\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -27,7 +27,7 @@ final class ResultConverter implements ResultConverterInterface { public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function convert(RawResultInterface $result, array $options = []): VectorResult diff --git a/src/platform/src/Bridge/Meta/Contract/MessageBagNormalizer.php b/src/platform/src/Bridge/Meta/Contract/MessageBagNormalizer.php index 95681e6a..5a01dd99 100644 --- a/src/platform/src/Bridge/Meta/Contract/MessageBagNormalizer.php +++ b/src/platform/src/Bridge/Meta/Contract/MessageBagNormalizer.php @@ -11,8 +11,8 @@ namespace Symfony\AI\Platform\Bridge\Meta\Contract; -use Symfony\AI\Platform\Bridge\Meta\Llama; use Symfony\AI\Platform\Bridge\Meta\LlamaPromptConverter; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; use Symfony\AI\Platform\Model; @@ -34,7 +34,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Mistral/Embeddings/ModelClient.php b/src/platform/src/Bridge/Mistral/Embeddings/ModelClient.php index 5a2be7f9..85211589 100644 --- a/src/platform/src/Bridge/Mistral/Embeddings/ModelClient.php +++ b/src/platform/src/Bridge/Mistral/Embeddings/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Mistral\Embeddings; use Symfony\AI\Platform\Bridge\Mistral\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -35,7 +36,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Mistral/Embeddings/ResultConverter.php b/src/platform/src/Bridge/Mistral/Embeddings/ResultConverter.php index 3f838d1a..adb11c2d 100644 --- a/src/platform/src/Bridge/Mistral/Embeddings/ResultConverter.php +++ b/src/platform/src/Bridge/Mistral/Embeddings/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Mistral\Embeddings; -use Symfony\AI\Platform\Bridge\Mistral\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; @@ -27,7 +27,7 @@ { public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function convert(RawResultInterface|RawHttpResult $result, array $options = []): VectorResult diff --git a/src/platform/src/Bridge/Mistral/Llm/ModelClient.php b/src/platform/src/Bridge/Mistral/Llm/ModelClient.php index a6b87233..3ddced13 100644 --- a/src/platform/src/Bridge/Mistral/Llm/ModelClient.php +++ b/src/platform/src/Bridge/Mistral/Llm/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Mistral\Llm; use Symfony\AI\Platform\Bridge\Mistral\Mistral; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -35,7 +36,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Mistral; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Mistral/Llm/ResultConverter.php b/src/platform/src/Bridge/Mistral/Llm/ResultConverter.php index a6b84026..9ccfed0c 100644 --- a/src/platform/src/Bridge/Mistral/Llm/ResultConverter.php +++ b/src/platform/src/Bridge/Mistral/Llm/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Mistral\Llm; -use Symfony\AI\Platform\Bridge\Mistral\Mistral; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\ChoiceResult; @@ -35,7 +35,7 @@ { public function supports(Model $model): bool { - return $model instanceof Mistral; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Ollama/Contract/AssistantMessageNormalizer.php b/src/platform/src/Bridge/Ollama/Contract/AssistantMessageNormalizer.php index 736fad0f..2302e1fd 100644 --- a/src/platform/src/Bridge/Ollama/Contract/AssistantMessageNormalizer.php +++ b/src/platform/src/Bridge/Ollama/Contract/AssistantMessageNormalizer.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Ollama\Contract; -use Symfony\AI\Platform\Bridge\Ollama\Ollama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\AssistantMessage; use Symfony\AI\Platform\Message\Role; @@ -34,7 +34,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Ollama; + return $model->supports(Capability::TOOL_CALLING); } /** diff --git a/src/platform/src/Bridge/Ollama/OllamaClient.php b/src/platform/src/Bridge/Ollama/OllamaClient.php index 9fdf7b43..18964cce 100644 --- a/src/platform/src/Bridge/Ollama/OllamaClient.php +++ b/src/platform/src/Bridge/Ollama/OllamaClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Ollama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -30,7 +31,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Ollama; + return $model->supports(Capability::INPUT_MESSAGES) || $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Ollama/OllamaResultConverter.php b/src/platform/src/Bridge/Ollama/OllamaResultConverter.php index 30e40c8d..9ec12b88 100644 --- a/src/platform/src/Bridge/Ollama/OllamaResultConverter.php +++ b/src/platform/src/Bridge/Ollama/OllamaResultConverter.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Ollama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -29,7 +30,9 @@ { public function supports(Model $model): bool { - return $model instanceof Ollama; + return $model->supports(Capability::INPUT_MULTIPLE) + || $model->supports(Capability::OUTPUT_TEXT) + || $model->supports(Capability::TOOL_CALLING); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/OpenAi/DallE/ModelClient.php b/src/platform/src/Bridge/OpenAi/DallE/ModelClient.php index 2a8715f8..5081c77a 100644 --- a/src/platform/src/Bridge/OpenAi/DallE/ModelClient.php +++ b/src/platform/src/Bridge/OpenAi/DallE/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\DallE; use Symfony\AI\Platform\Bridge\OpenAi\DallE; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -36,7 +37,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof DallE; + return $model->supports(Capability::OUTPUT_IMAGE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/OpenAi/DallE/ResultConverter.php b/src/platform/src/Bridge/OpenAi/DallE/ResultConverter.php index 21e239e2..c3191aaf 100644 --- a/src/platform/src/Bridge/OpenAi/DallE/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/DallE/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\DallE; -use Symfony\AI\Platform\Bridge\OpenAi\DallE; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -27,7 +27,7 @@ { public function supports(Model $model): bool { - return $model instanceof DallE; + return $model->supports(Capability::OUTPUT_IMAGE); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/OpenAi/Embeddings.php b/src/platform/src/Bridge/OpenAi/Embeddings.php index 80472e8e..a2667fb9 100644 --- a/src/platform/src/Bridge/OpenAi/Embeddings.php +++ b/src/platform/src/Bridge/OpenAi/Embeddings.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; /** @@ -27,6 +28,6 @@ class Embeddings extends Model */ public function __construct(string $name = self::TEXT_3_SMALL, array $options = []) { - parent::__construct($name, [], $options); + parent::__construct($name, [Capability::INPUT_MULTIPLE], $options); } } diff --git a/src/platform/src/Bridge/OpenAi/Embeddings/ModelClient.php b/src/platform/src/Bridge/OpenAi/Embeddings/ModelClient.php index 66368f14..063d6723 100644 --- a/src/platform/src/Bridge/OpenAi/Embeddings/ModelClient.php +++ b/src/platform/src/Bridge/OpenAi/Embeddings/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Embeddings; use Symfony\AI\Platform\Bridge\OpenAi\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface as PlatformResponseFactory; @@ -34,7 +35,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/OpenAi/Embeddings/ResultConverter.php b/src/platform/src/Bridge/OpenAi/Embeddings/ResultConverter.php index cae4321f..44d92dba 100644 --- a/src/platform/src/Bridge/OpenAi/Embeddings/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/Embeddings/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Embeddings; -use Symfony\AI\Platform\Bridge\OpenAi\Embeddings; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawHttpResult; @@ -27,7 +27,7 @@ final class ResultConverter implements ResultConverterInterface { public function supports(Model $model): bool { - return $model instanceof Embeddings; + return $model->supports(Capability::INPUT_MULTIPLE); } public function convert(RawResultInterface $result, array $options = []): VectorResult diff --git a/src/platform/src/Bridge/OpenAi/Gpt/ModelClient.php b/src/platform/src/Bridge/OpenAi/Gpt/ModelClient.php index 086b2014..6d48ce5a 100644 --- a/src/platform/src/Bridge/OpenAi/Gpt/ModelClient.php +++ b/src/platform/src/Bridge/OpenAi/Gpt/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Gpt; use Symfony\AI\Platform\Bridge\OpenAi\Gpt; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface as PlatformResponseFactory; @@ -38,7 +39,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Gpt; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php index 72714e81..608d1a7e 100644 --- a/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/Gpt/ResultConverter.php @@ -11,7 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Gpt; -use Symfony\AI\Platform\Bridge\OpenAi\Gpt; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\ContentFilterException; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; @@ -37,7 +37,7 @@ final class ResultConverter implements PlatformResponseConverter { public function supports(Model $model): bool { - return $model instanceof Gpt; + return $model->supports(Capability::OUTPUT_TEXT) || $model->supports(Capability::TOOL_CALLING); } public function convert(RawResultInterface|RawHttpResult $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/OpenAi/Whisper/AudioNormalizer.php b/src/platform/src/Bridge/OpenAi/Whisper/AudioNormalizer.php index 69024675..2c429cec 100644 --- a/src/platform/src/Bridge/OpenAi/Whisper/AudioNormalizer.php +++ b/src/platform/src/Bridge/OpenAi/Whisper/AudioNormalizer.php @@ -11,26 +11,25 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Whisper; -use Symfony\AI\Platform\Bridge\OpenAi\Whisper; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract; +use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\Content\Audio; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use Symfony\AI\Platform\Model; /** * @author Christopher Hertel */ -final class AudioNormalizer implements NormalizerInterface +final class AudioNormalizer extends ModelContractNormalizer { - public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool + protected function supportedDataClass(): string { - return $data instanceof Audio && $context[Contract::CONTEXT_MODEL] instanceof Whisper; + return Audio::class; } - public function getSupportedTypes(?string $format): array + protected function supportsModel(Model $model): bool { - return [ - Audio::class => true, - ]; + return $model->supports(Capability::INPUT_AUDIO); } /** diff --git a/src/platform/src/Bridge/OpenAi/Whisper/ModelClient.php b/src/platform/src/Bridge/OpenAi/Whisper/ModelClient.php index 31c75a0a..d55b8f25 100644 --- a/src/platform/src/Bridge/OpenAi/Whisper/ModelClient.php +++ b/src/platform/src/Bridge/OpenAi/Whisper/ModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Whisper; use Symfony\AI\Platform\Bridge\OpenAi\Whisper; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface as BaseModelClient; @@ -33,7 +34,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Whisper; + return $model->supports(Capability::INPUT_AUDIO); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/OpenAi/Whisper/ResultConverter.php b/src/platform/src/Bridge/OpenAi/Whisper/ResultConverter.php index 97ad909b..355be346 100644 --- a/src/platform/src/Bridge/OpenAi/Whisper/ResultConverter.php +++ b/src/platform/src/Bridge/OpenAi/Whisper/ResultConverter.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\OpenAi\Whisper; use Symfony\AI\Platform\Bridge\OpenAi\Whisper; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; use Symfony\AI\Platform\Result\ResultInterface; @@ -25,7 +26,7 @@ final class ResultConverter implements BaseResponseConverter { public function supports(Model $model): bool { - return $model instanceof Whisper; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/OpenRouter/ModelClient.php b/src/platform/src/Bridge/OpenRouter/ModelClient.php index 913e1955..ec64dafa 100644 --- a/src/platform/src/Bridge/OpenRouter/ModelClient.php +++ b/src/platform/src/Bridge/OpenRouter/ModelClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenRouter; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -36,7 +37,7 @@ public function __construct( public function supports(Model $model): bool { - return true; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/OpenRouter/ResultConverter.php b/src/platform/src/Bridge/OpenRouter/ResultConverter.php index 79ab8b8c..7c44a91f 100644 --- a/src/platform/src/Bridge/OpenRouter/ResultConverter.php +++ b/src/platform/src/Bridge/OpenRouter/ResultConverter.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\OpenRouter; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -25,7 +26,7 @@ { public function supports(Model $model): bool { - return true; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/Replicate/Contract/LlamaMessageBagNormalizer.php b/src/platform/src/Bridge/Replicate/Contract/LlamaMessageBagNormalizer.php index f5e7376a..c7ca346e 100644 --- a/src/platform/src/Bridge/Replicate/Contract/LlamaMessageBagNormalizer.php +++ b/src/platform/src/Bridge/Replicate/Contract/LlamaMessageBagNormalizer.php @@ -11,8 +11,8 @@ namespace Symfony\AI\Platform\Bridge\Replicate\Contract; -use Symfony\AI\Platform\Bridge\Meta\Llama; use Symfony\AI\Platform\Bridge\Meta\LlamaPromptConverter; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\Normalizer\ModelContractNormalizer; use Symfony\AI\Platform\Message\MessageBagInterface; use Symfony\AI\Platform\Message\SystemMessage; @@ -35,7 +35,7 @@ protected function supportedDataClass(): string protected function supportsModel(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::INPUT_MESSAGES); } /** diff --git a/src/platform/src/Bridge/Replicate/LlamaModelClient.php b/src/platform/src/Bridge/Replicate/LlamaModelClient.php index 53af5d0e..9ce9574d 100644 --- a/src/platform/src/Bridge/Replicate/LlamaModelClient.php +++ b/src/platform/src/Bridge/Replicate/LlamaModelClient.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Replicate; use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\InvalidArgumentException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; @@ -29,13 +30,11 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::INPUT_MESSAGES); } public function request(Model $model, array|string $payload, array $options = []): RawHttpResult { - $model instanceof Llama || throw new InvalidArgumentException(\sprintf('The model must be an instance of "%s".', Llama::class)); - return new RawHttpResult( $this->client->request(\sprintf('meta/meta-%s', $model->getName()), 'predictions', $payload) ); diff --git a/src/platform/src/Bridge/Replicate/LlamaResultConverter.php b/src/platform/src/Bridge/Replicate/LlamaResultConverter.php index 18bb24ab..4595619f 100644 --- a/src/platform/src/Bridge/Replicate/LlamaResultConverter.php +++ b/src/platform/src/Bridge/Replicate/LlamaResultConverter.php @@ -12,6 +12,7 @@ namespace Symfony\AI\Platform\Bridge\Replicate; use Symfony\AI\Platform\Bridge\Meta\Llama; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -26,7 +27,7 @@ { public function supports(Model $model): bool { - return $model instanceof Llama; + return $model->supports(Capability::OUTPUT_TEXT); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Bridge/Voyage/ModelClient.php b/src/platform/src/Bridge/Voyage/ModelClient.php index 3da2a5f6..88292d52 100644 --- a/src/platform/src/Bridge/Voyage/ModelClient.php +++ b/src/platform/src/Bridge/Voyage/ModelClient.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Voyage; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\ModelClientInterface; use Symfony\AI\Platform\Result\RawHttpResult; @@ -29,7 +30,7 @@ public function __construct( public function supports(Model $model): bool { - return $model instanceof Voyage; + return $model->supports(Capability::INPUT_MULTIPLE); } public function request(Model $model, object|string|array $payload, array $options = []): RawHttpResult diff --git a/src/platform/src/Bridge/Voyage/ResultConverter.php b/src/platform/src/Bridge/Voyage/ResultConverter.php index a3b91250..8acbb9c1 100644 --- a/src/platform/src/Bridge/Voyage/ResultConverter.php +++ b/src/platform/src/Bridge/Voyage/ResultConverter.php @@ -11,6 +11,7 @@ namespace Symfony\AI\Platform\Bridge\Voyage; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Exception\RuntimeException; use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Result\RawResultInterface; @@ -26,7 +27,7 @@ { public function supports(Model $model): bool { - return $model instanceof Voyage; + return $model->supports(Capability::INPUT_MULTIPLE); } public function convert(RawResultInterface $result, array $options = []): ResultInterface diff --git a/src/platform/src/Contract/Normalizer/ToolNormalizer.php b/src/platform/src/Contract/Normalizer/ToolNormalizer.php index 04d3e062..cb9fda96 100644 --- a/src/platform/src/Contract/Normalizer/ToolNormalizer.php +++ b/src/platform/src/Contract/Normalizer/ToolNormalizer.php @@ -11,27 +11,26 @@ namespace Symfony\AI\Platform\Contract\Normalizer; +use Symfony\AI\Platform\Capability; use Symfony\AI\Platform\Contract\JsonSchema\Factory; +use Symfony\AI\Platform\Model; use Symfony\AI\Platform\Tool\Tool; -use Symfony\Component\Serializer\Normalizer\NormalizerInterface; /** * @phpstan-import-type JsonSchema from Factory * * @author Christopher Hertel */ -class ToolNormalizer implements NormalizerInterface +class ToolNormalizer extends ModelContractNormalizer { - public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool + protected function supportedDataClass(): string { - return $data instanceof Tool; + return Tool::class; } - public function getSupportedTypes(?string $format): array + protected function supportsModel(Model $model): bool { - return [ - Tool::class => true, - ]; + return $model->supports(Capability::TOOL_CALLING); } /**