diff --git a/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php b/src/platform/src/Bridge/Albert/EmbeddingsModelClient.php index 2c754db5f..726645960 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 311eee2ae..caac9baae 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 c03e034e7..59ae07f30 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 2ac4e58a4..fccffeefa 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 662e0ea7e..2752d3c31 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 a165189fe..498c1c8d7 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 e0f422fa8..3821b22e0 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 669e77a66..6591f41f4 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 f2023296f..8b8bc3f0b 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 716d3a771..c1c16eeed 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 978887b33..0a6094306 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 92edde313..99b2753f6 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 b5f1b7eba..6b4348051 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 28d1a4d0b..e858da4f8 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 002d09171..0cf1d7c93 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 504380469..3eb7246ee 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 a5490c3bc..c8db15500 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 a2be5356a..a7e9091cd 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 4fe27ad8d..7a9cb3ed0 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 2607b83e3..679b1f074 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 a1e0e5cf5..291621317 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 a7b207740..fa659f67e 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 45a3338db..0871b2dd0 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 92cd2e7a8..20ff8ec27 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 8bdd3793f..4f9df723d 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 31776d5a1..1aa895744 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 a1990da62..6b6f14716 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 bf2c1169d..40401fb98 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 2ff201b5b..ec3d44e76 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 d6310ba48..c23274e90 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 b453cf31c..ad0469319 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 75c8776ef..f42eb0735 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 7dc739676..aaf4bdfb2 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 eddf1ba81..e518a83aa 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 e5e55ebad..56e699c2f 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 237a1d693..4d373584b 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 518c2ccff..b084879b4 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 b40a1bbcb..1acef8333 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 da8fe5c23..6fedeb92a 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 8c5e7a0b0..718608b3c 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 29f8a4581..6125c5082 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 dc422e25c..71ef33271 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 b9c7ad373..2dfe68321 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 c705c8a71..92bb9752f 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 cf06c55bf..1d273d641 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 95681e6ad..5a01dd990 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 5a2be7f91..852115891 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 3f838d1ac..adb11c2d5 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 a6b872336..3ddced134 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 a6b84026b..9ccfed0cc 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 736fad0f8..2302e1fdd 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 9fdf7b43e..18964cceb 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 30e40c8db..9ec12b883 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 2a8715f81..5081c77ac 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 21e239e2a..c3191aaf3 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 80472e8e2..a2667fb9f 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 66368f141..063d67231 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 cae4321fd..44d92dba9 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 086b2014e..6d48ce5a3 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 72714e817..608d1a7e0 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 690246752..2c429cec3 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 31c75a0a1..d55b8f25c 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 97ad909ba..355be3463 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 913e1955a..ec64dafad 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 79ab8b8c3..7c44a91f2 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 f5e7376af..c7ca346e4 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 53af5d0e4..9ce9574da 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 18bb24abb..4595619fc 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 3da2a5f66..88292d522 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 a3b912506..8acbb9c13 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 04d3e0624..cb9fda960 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); } /**