From b4a0257915d8ed78937a56e396cc2351c3ae96c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= Date: Thu, 19 Feb 2026 22:53:44 +0100 Subject: [PATCH 1/5] feat: Enhance Model Catalog with labels --- .../src/Bridge/AiMlApi/ModelCatalog.php | 125 +++++++- .../src/Bridge/Albert/ModelCatalog.php | 6 +- .../src/Bridge/Anthropic/ModelCatalog.php | 19 +- .../src/Bridge/Bedrock/ModelCatalog.php | 35 ++- .../src/Bridge/Cartesia/ModelCatalog.php | 4 +- .../src/Bridge/Cerebras/ModelCatalog.php | 12 +- .../src/Bridge/Decart/ModelCatalog.php | 9 +- .../src/Bridge/DeepSeek/ModelCatalog.php | 4 +- .../Bridge/DockerModelRunner/ModelCatalog.php | 22 +- .../src/Bridge/ElevenLabs/ModelCatalog.php | 14 +- .../src/Bridge/Gemini/ModelCatalog.php | 19 +- .../src/Bridge/LmStudio/ModelCatalog.php | 4 +- src/platform/src/Bridge/Meta/ModelCatalog.php | 17 +- .../src/Bridge/Mistral/ModelCatalog.php | 18 +- .../src/Bridge/Ollama/ModelCatalog.php | 24 +- .../src/Bridge/OpenAi/ModelCatalog.php | 30 +- .../src/Bridge/OpenRouter/ModelCatalog.php | 280 +++++++++++++++++- src/platform/src/Bridge/Ovh/ModelCatalog.php | 16 +- .../src/Bridge/Perplexity/ModelCatalog.php | 7 +- .../src/Bridge/Replicate/ModelCatalog.php | 17 +- .../src/Bridge/Scaleway/ModelCatalog.php | 14 +- .../src/Bridge/VertexAi/ModelCatalog.php | 11 +- .../src/Bridge/Voyage/ModelCatalog.php | 13 +- src/platform/src/Model.php | 14 + .../src/ModelCatalog/AbstractModelCatalog.php | 6 +- .../ModelCatalog/ModelCatalogInterface.php | 6 +- .../TemplateRendererListenerTest.php | 2 +- src/platform/tests/ModelTest.php | 19 +- .../PlatformSubscriberTest.php | 6 +- .../StructuredOutput/ResultConverterTest.php | 4 +- 30 files changed, 736 insertions(+), 41 deletions(-) diff --git a/src/platform/src/Bridge/AiMlApi/ModelCatalog.php b/src/platform/src/Bridge/AiMlApi/ModelCatalog.php index b23bc2c7a6..3c83265a5d 100644 --- a/src/platform/src/Bridge/AiMlApi/ModelCatalog.php +++ b/src/platform/src/Bridge/AiMlApi/ModelCatalog.php @@ -22,7 +22,7 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { @@ -30,6 +30,7 @@ public function __construct(array $additionalModels = []) // Completion models (GPT variants) 'gpt-3.5-turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-3.5 Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -39,6 +40,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-3.5-turbo-0125' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-3.5 Turbo 0125', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -48,6 +50,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-3.5-turbo-1106' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-3.5 Turbo 1106', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -57,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -68,6 +72,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-2024-08-06' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o 2024-08-06', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -79,6 +84,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-2024-05-13' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o 2024-05-13', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -90,6 +96,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -101,6 +108,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini-2024-07-18' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Mini 2024-07-18', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -112,6 +120,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4-turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4 Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -122,6 +131,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -131,6 +141,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4-turbo-2024-04-09' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4 Turbo 2024-04-09', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -140,6 +151,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4-0125-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4 0125 Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -149,6 +161,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4-1106-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4 1106 Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -158,6 +171,7 @@ public function __construct(array $additionalModels = []) ], 'chatgpt-4o-latest' => [ 'class' => CompletionsModel::class, + 'label' => 'ChatGPT 4o Latest', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -169,6 +183,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-audio-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Audio Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -180,6 +195,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini-audio-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Mini Audio Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -191,6 +207,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-search-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Search Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -202,6 +219,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini-search-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-4o Mini Search Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -213,6 +231,7 @@ public function __construct(array $additionalModels = []) ], 'o1-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'O1 Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -221,6 +240,7 @@ public function __construct(array $additionalModels = []) ], 'o1-mini-2024-09-12' => [ 'class' => CompletionsModel::class, + 'label' => 'O1 Mini 2024-09-12', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -229,6 +249,7 @@ public function __construct(array $additionalModels = []) ], 'o1' => [ 'class' => CompletionsModel::class, + 'label' => 'O1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -237,6 +258,7 @@ public function __construct(array $additionalModels = []) ], 'o3-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'O3 Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -247,6 +269,7 @@ public function __construct(array $additionalModels = []) // OpenAI future models 'openai/o3-2025-04-16' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI O3 2025-04-16', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -255,6 +278,7 @@ public function __construct(array $additionalModels = []) ], 'openai/o3-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI O3 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -263,6 +287,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-4.1-2025-04-14' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-4.1 2025-04-14', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -272,6 +297,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-4.1-mini-2025-04-14' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-4.1 Mini 2025-04-14', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -281,6 +307,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-4.1-nano-2025-04-14' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-4.1 Nano 2025-04-14', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -290,6 +317,7 @@ public function __construct(array $additionalModels = []) ], 'openai/o4-mini-2025-04-16' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI O4 Mini 2025-04-16', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -298,6 +326,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-oss-20b' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-OSS 20B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -307,6 +336,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-oss-120b' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-OSS 120B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -316,6 +346,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-5-2025-08-07' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-5 2025-08-07', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -325,6 +356,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-5-mini-2025-08-07' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-5 Mini 2025-08-07', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -334,6 +366,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-5-nano-2025-08-07' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-5 Nano 2025-08-07', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -343,6 +376,7 @@ public function __construct(array $additionalModels = []) ], 'openai/gpt-5-chat-latest' => [ 'class' => CompletionsModel::class, + 'label' => 'OpenAI GPT-5 Chat Latest', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -353,6 +387,7 @@ public function __construct(array $additionalModels = []) // DeepSeek models 'deepseek-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -362,6 +397,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -371,6 +407,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-chat-v3-0324' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat v3 0324', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -380,6 +417,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-r1' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -387,6 +425,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek-reasoner' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Reasoner', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -394,6 +433,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-prover-v2' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Prover v2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -401,6 +441,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-chat-v3.1' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat v3.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -410,6 +451,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek/deepseek-reasoner-v3.1' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Reasoner v3.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -418,6 +460,7 @@ public function __construct(array $additionalModels = []) // Qwen models 'Qwen/Qwen2-72B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2 72B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -427,6 +470,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-max' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Max', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -436,6 +480,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Plus', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -445,6 +490,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -454,6 +500,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-max-2025-01-25' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Max 2025-01-25', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -463,6 +510,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen/Qwen2.5-72B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 72B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -472,6 +520,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen/QwQ-32B' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen QwQ 32B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -481,6 +530,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen/Qwen3-235B-A22B-fp8-tput' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 3 235B A22B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -490,6 +540,7 @@ public function __construct(array $additionalModels = []) ], 'alibaba/qwen3-32b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 3 32B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -499,6 +550,7 @@ public function __construct(array $additionalModels = []) ], 'alibaba/qwen3-coder-480b-a35b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 3 Coder 480B A35B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -508,6 +560,7 @@ public function __construct(array $additionalModels = []) ], 'alibaba/qwen3-235b-a22b-thinking-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 3 235B A22B Thinking', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -515,6 +568,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen/Qwen2.5-7B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 7B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -524,6 +578,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen/Qwen2.5-Coder-32B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 Coder 32B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -534,6 +589,7 @@ public function __construct(array $additionalModels = []) // Mistral models 'mistralai/Mixtral-8x7B-Instruct-v0.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Mixtral 8x7B Instruct v0.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -543,6 +599,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/Mistral-7B-Instruct-v0.2' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral 7B Instruct v0.2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -552,6 +609,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/Mistral-7B-Instruct-v0.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral 7B Instruct v0.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -561,6 +619,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/Mistral-7B-Instruct-v0.3' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral 7B Instruct v0.3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -570,6 +629,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/mistral-tiny' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Tiny', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -579,6 +639,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/mistral-nemo' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Nemo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -588,6 +649,7 @@ public function __construct(array $additionalModels = []) ], 'mistralai/codestral-2501' => [ 'class' => CompletionsModel::class, + 'label' => 'Codestral 2501', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -598,6 +660,7 @@ public function __construct(array $additionalModels = []) // Meta Llama models 'meta-llama/Llama-3.3-70B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.3 70B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -607,6 +670,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Llama-3.2-3B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 3B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -616,6 +680,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Meta-Llama-3-8B-Instruct-Lite' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3 8B Instruct Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -625,6 +690,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Llama-3-70b-chat-hf' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3 70B Chat', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -634,6 +700,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 405B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -643,6 +710,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 8B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -652,6 +720,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 70B Instruct Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -661,6 +730,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/llama-4-scout' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 4 Scout', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -670,6 +740,7 @@ public function __construct(array $additionalModels = []) ], 'meta-llama/llama-4-maverick' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 4 Maverick', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -680,6 +751,7 @@ public function __construct(array $additionalModels = []) // Claude models 'claude-3-opus-20240229' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3 Opus', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -690,6 +762,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-haiku-20240307' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3 Haiku', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -700,6 +773,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-sonnet-20240620' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Sonnet', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -710,6 +784,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-sonnet-20241022' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Sonnet 20241022', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -720,6 +795,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-haiku-20241022' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Haiku 20241022', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -730,6 +806,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-7-sonnet-20250219' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.7 Sonnet', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -740,6 +817,7 @@ public function __construct(array $additionalModels = []) ], 'anthropic/claude-opus-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -750,6 +828,7 @@ public function __construct(array $additionalModels = []) ], 'anthropic/claude-sonnet-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Sonnet 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -760,6 +839,7 @@ public function __construct(array $additionalModels = []) ], 'anthropic/claude-opus-4.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -770,6 +850,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-1' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -780,6 +861,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-1-20250805' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4.1 20250805', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -791,6 +873,7 @@ public function __construct(array $additionalModels = []) // Gemini models 'gemini-2.0-flash-exp' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.0 Flash Exp', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -801,6 +884,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.0 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -811,6 +895,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -821,6 +906,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemini-2.5-flash-lite-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Lite Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -831,6 +917,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemini-2.5-flash' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -841,6 +928,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemini-2.5-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -851,6 +939,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemma-2-27b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 2 27B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -860,6 +949,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemma-3-4b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 4B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -869,6 +959,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemma-3-12b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 12B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -878,6 +969,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemma-3-27b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 27B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -887,6 +979,7 @@ public function __construct(array $additionalModels = []) ], 'google/gemma-3n-e4b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 Nano E4B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -897,6 +990,7 @@ public function __construct(array $additionalModels = []) // X.AI models 'x-ai/grok-3-beta' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3 Beta', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -906,6 +1000,7 @@ public function __construct(array $additionalModels = []) ], 'x-ai/grok-3-mini-beta' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3 Mini Beta', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -915,6 +1010,7 @@ public function __construct(array $additionalModels = []) ], 'x-ai/grok-4-07-09' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 4 07-09', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -925,6 +1021,7 @@ public function __construct(array $additionalModels = []) // Other models 'anthracite-org/magnum-v4-72b' => [ 'class' => CompletionsModel::class, + 'label' => 'Magnum v4 72B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -934,6 +1031,7 @@ public function __construct(array $additionalModels = []) ], 'nvidia/llama-3.1-nemotron-70b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Nvidia Llama 3.1 Nemotron 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -943,6 +1041,7 @@ public function __construct(array $additionalModels = []) ], 'cohere/command-r-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Cohere Command R+', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -952,6 +1051,7 @@ public function __construct(array $additionalModels = []) ], 'cohere/command-a' => [ 'class' => CompletionsModel::class, + 'label' => 'Cohere Command A', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -961,6 +1061,7 @@ public function __construct(array $additionalModels = []) ], 'MiniMax-Text-01' => [ 'class' => CompletionsModel::class, + 'label' => 'MiniMax Text 01', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -970,6 +1071,7 @@ public function __construct(array $additionalModels = []) ], 'minimax/m1' => [ 'class' => CompletionsModel::class, + 'label' => 'MiniMax M1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -979,6 +1081,7 @@ public function __construct(array $additionalModels = []) ], 'moonshot/kimi-k2-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2 Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -988,6 +1091,7 @@ public function __construct(array $additionalModels = []) ], 'perplexity/sonar' => [ 'class' => CompletionsModel::class, + 'label' => 'Perplexity Sonar', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -997,6 +1101,7 @@ public function __construct(array $additionalModels = []) ], 'perplexity/sonar-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'Perplexity Sonar Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -1006,6 +1111,7 @@ public function __construct(array $additionalModels = []) ], 'zhipu/glm-4.5-air' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5 Air', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -1015,6 +1121,7 @@ public function __construct(array $additionalModels = []) ], 'zhipu/glm-4.5' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -1025,66 +1132,82 @@ public function __construct(array $additionalModels = []) // Embedding models 'text-embedding-3-small' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding 3 Small (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'text-embedding-3-large' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding 3 Large (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'text-embedding-ada-002' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding Ada 002 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'togethercomputer/m2-bert-80M-32k-retrieval' => [ 'class' => EmbeddingsModel::class, + 'label' => 'M2-BERT 80M 32K Retrieval (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'BAAI/bge-base-en-v1.5' => [ 'class' => EmbeddingsModel::class, + 'label' => 'BGE Base EN v1.5 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'BAAI/bge-large-en-v1.' => [ 'class' => EmbeddingsModel::class, + 'label' => 'BGE Large EN v1.5 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-large-2-instruct' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Large 2 Instruct (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-finance-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Finance 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-multilingual-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Multilingual 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-law-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Law 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-code-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Code 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-large-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage Large 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Voyage 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'textembedding-gecko@003' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding Gecko 003 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'textembedding-gecko-multilingual@001' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding Gecko Multilingual 001 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'text-multilingual-embedding-002' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Multilingual Embedding 002 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], ]; diff --git a/src/platform/src/Bridge/Albert/ModelCatalog.php b/src/platform/src/Bridge/Albert/ModelCatalog.php index 1a7a6ec79f..4e6c74434f 100644 --- a/src/platform/src/Bridge/Albert/ModelCatalog.php +++ b/src/platform/src/Bridge/Albert/ModelCatalog.php @@ -23,13 +23,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array, capabilities: list}> $additionalModels + * @param array, label: string, capabilities: list}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'openweight-small' => [ 'class' => CompletionsModel::class, + 'label' => 'Openweight Small', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -38,6 +39,7 @@ public function __construct(array $additionalModels = []) ], 'openweight-medium' => [ 'class' => CompletionsModel::class, + 'label' => 'Openweight Medium', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -46,6 +48,7 @@ public function __construct(array $additionalModels = []) ], 'openweight-large' => [ 'class' => CompletionsModel::class, + 'label' => 'Openweight Large', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -54,6 +57,7 @@ public function __construct(array $additionalModels = []) ], 'openweight-embeddings' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Openweight Embeddings (Embeddings)', 'capabilities' => [Capability::INPUT_TEXT, Capability::EMBEDDINGS], ], ]; diff --git a/src/platform/src/Bridge/Anthropic/ModelCatalog.php b/src/platform/src/Bridge/Anthropic/ModelCatalog.php index c28883c4d4..d115986d54 100644 --- a/src/platform/src/Bridge/Anthropic/ModelCatalog.php +++ b/src/platform/src/Bridge/Anthropic/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'claude-3-haiku-20240307' => [ 'class' => Claude::class, + 'label' => 'Claude 3 Haiku', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-opus-20240229' => [ 'class' => Claude::class, + 'label' => 'Claude 3 Opus', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -47,6 +49,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-haiku-latest' => [ 'class' => Claude::class, + 'label' => 'Claude 3.5 Haiku', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -57,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-haiku-20241022' => [ 'class' => Claude::class, + 'label' => 'Claude 3.5 Haiku', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -67,6 +71,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-7-sonnet-latest' => [ 'class' => Claude::class, + 'label' => 'Claude 3.7 Sonnet', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -78,6 +83,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-7-sonnet-20250219' => [ 'class' => Claude::class, + 'label' => 'Claude 3.7 Sonnet', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -89,6 +95,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-20250514' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -100,6 +107,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-0' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -111,6 +119,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-20250514' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -122,6 +131,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-0' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -133,6 +143,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-1' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -143,8 +154,8 @@ public function __construct(array $additionalModels = []) Capability::TOOL_CALLING, ], ], - 'claude-opus-4-1-20250805' => [ - 'class' => Claude::class, + 'claude-opus-4-1-20250805' =>[ 'class' => Claude::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -157,6 +168,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-5-20250929' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4.5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -169,6 +181,7 @@ public function __construct(array $additionalModels = []) ], 'claude-haiku-4-5-20251001' => [ 'class' => Claude::class, + 'label' => 'Claude Haiku 4.5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, diff --git a/src/platform/src/Bridge/Bedrock/ModelCatalog.php b/src/platform/src/Bridge/Bedrock/ModelCatalog.php index bc535d897b..1ccf629a13 100644 --- a/src/platform/src/Bridge/Bedrock/ModelCatalog.php +++ b/src/platform/src/Bridge/Bedrock/ModelCatalog.php @@ -23,13 +23,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array, label: string}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'nova-micro' => [ 'class' => Nova::class, + 'label' => 'Amazon Nova Micro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'nova-lite' => [ 'class' => Nova::class, + 'label' => 'Amazon Nova Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -46,6 +48,7 @@ public function __construct(array $additionalModels = []) ], 'nova-pro' => [ 'class' => Nova::class, + 'label' => 'Amazon Nova Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -55,6 +58,7 @@ public function __construct(array $additionalModels = []) ], 'nova-premier' => [ 'class' => Nova::class, + 'label' => 'Amazon Nova Premier', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -65,6 +69,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-7-sonnet-20250219' => [ 'class' => Claude::class, + 'label' => 'Claude 3.7 Sonnet 2025-02-19', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -75,6 +80,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-haiku-20240307' => [ 'class' => Claude::class, + 'label' => 'Claude 3 Haiku 2024-03-07', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -85,6 +91,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-haiku-latest' => [ 'class' => Claude::class, + 'label' => 'Claude 3.5 Haiku (Latest)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -95,6 +102,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-sonnet-20240229' => [ 'class' => Claude::class, + 'label' => 'Claude 3 Sonnet 2024-02-29', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -105,6 +113,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-5-sonnet-latest' => [ 'class' => Claude::class, + 'label' => 'Claude 3.5 Sonnet (Latest)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -115,6 +124,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-7-sonnet-latest' => [ 'class' => Claude::class, + 'label' => 'Claude 3.7 Sonnet (Latest)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -125,6 +135,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-20250514' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4 2025-05-14', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -135,6 +146,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-0' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -145,6 +157,7 @@ public function __construct(array $additionalModels = []) ], 'claude-3-opus-20240229' => [ 'class' => Claude::class, + 'label' => 'Claude 3 Opus 2024-02-29', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -155,6 +168,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-20250514' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4 2025-05-14', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -165,6 +179,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-0' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -175,6 +190,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-1' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -185,6 +201,7 @@ public function __construct(array $additionalModels = []) ], 'claude-opus-4-5-20251101' => [ 'class' => Claude::class, + 'label' => 'Claude Opus 4.5 2025-11-01', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -195,6 +212,7 @@ public function __construct(array $additionalModels = []) ], 'claude-sonnet-4-5-20250929' => [ 'class' => Claude::class, + 'label' => 'Claude Sonnet 4.5 2025-09-29', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -205,6 +223,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.3-70B-Instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.3 70B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -212,6 +231,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-90b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 90B Vision (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -219,6 +239,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-11b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 11B Vision (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -226,6 +247,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -233,6 +255,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -240,6 +263,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -247,6 +271,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -254,6 +279,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-405b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 405B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -261,6 +287,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -268,6 +295,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -275,6 +303,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -282,6 +311,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -289,6 +319,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -296,6 +327,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B (Instruct)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -303,6 +335,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/Cartesia/ModelCatalog.php b/src/platform/src/Bridge/Cartesia/ModelCatalog.php index 00413e281e..a673b78946 100644 --- a/src/platform/src/Bridge/Cartesia/ModelCatalog.php +++ b/src/platform/src/Bridge/Cartesia/ModelCatalog.php @@ -20,19 +20,21 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'sonic-3' => [ 'class' => Cartesia::class, + 'label' => 'Sonic 3 (TTS)', 'capabilities' => [ Capability::TEXT_TO_SPEECH, ], ], 'ink-whisper' => [ 'class' => Cartesia::class, + 'label' => 'Ink Whisper (STT)', 'capabilities' => [ Capability::SPEECH_TO_TEXT, ], diff --git a/src/platform/src/Bridge/Cerebras/ModelCatalog.php b/src/platform/src/Bridge/Cerebras/ModelCatalog.php index 2688a0ad35..f362533988 100644 --- a/src/platform/src/Bridge/Cerebras/ModelCatalog.php +++ b/src/platform/src/Bridge/Cerebras/ModelCatalog.php @@ -22,13 +22,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'llama-4-scout-17b-16e-instruct' => [ 'class' => Model::class, + 'label' => 'Llama 4 Scout 17B 16E Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -38,6 +39,7 @@ public function __construct(array $additionalModels = []) ], 'llama3.1-8b' => [ 'class' => Model::class, + 'label' => 'Llama 3.1 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -47,6 +49,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.3-70b' => [ 'class' => Model::class, + 'label' => 'Llama 3.3 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -56,6 +59,7 @@ public function __construct(array $additionalModels = []) ], 'llama-4-maverick-17b-128e-instruct' => [ 'class' => Model::class, + 'label' => 'Llama 4 Maverick 17B 128E Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -65,6 +69,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-3-32b' => [ 'class' => Model::class, + 'label' => 'Qwen 3 32B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -75,6 +80,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-3-235b-a22b-instruct-2507' => [ 'class' => Model::class, + 'label' => 'Qwen 3 235B A22B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -84,6 +90,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-3-235b-a22b-thinking-2507' => [ 'class' => Model::class, + 'label' => 'Qwen 3 235B A22B Thinking', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -93,6 +100,7 @@ public function __construct(array $additionalModels = []) ], 'qwen-3-coder-480b' => [ 'class' => Model::class, + 'label' => 'Qwen 3 Coder 480B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -102,6 +110,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-oss-120b' => [ 'class' => Model::class, + 'label' => 'GPT-OSS 120B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, @@ -112,6 +121,7 @@ public function __construct(array $additionalModels = []) ], 'zai-glm-4.7' => [ 'class' => Model::class, + 'label' => 'ZAI GLM 4.7', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_STRUCTURED, diff --git a/src/platform/src/Bridge/Decart/ModelCatalog.php b/src/platform/src/Bridge/Decart/ModelCatalog.php index 3292935a0c..ac25f49d22 100644 --- a/src/platform/src/Bridge/Decart/ModelCatalog.php +++ b/src/platform/src/Bridge/Decart/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array, label: string}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'lucy-dev-i2v' => [ 'class' => Decart::class, + 'label' => 'Lucy Dev (Image To Video)', 'capabilities' => [ Capability::IMAGE_TO_VIDEO, Capability::VIDEO_TO_VIDEO, @@ -34,12 +35,14 @@ public function __construct(array $additionalModels = []) ], 'lucy-pro-t2i' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Text To Image)', 'capabilities' => [ Capability::TEXT_TO_IMAGE, ], ], 'lucy-pro-t2v' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Text To Video)', 'capabilities' => [ Capability::TEXT_TO_VIDEO, Capability::IMAGE_TO_VIDEO, @@ -47,24 +50,28 @@ public function __construct(array $additionalModels = []) ], 'lucy-pro-i2i' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Image To Image)', 'capabilities' => [ Capability::IMAGE_TO_IMAGE, ], ], 'lucy-pro-i2v' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Image To Video)', 'capabilities' => [ Capability::IMAGE_TO_VIDEO, ], ], 'lucy-pro-v2v' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Video To Video)', 'capabilities' => [ Capability::VIDEO_TO_VIDEO, ], ], 'lucy-pro-flf2v' => [ 'class' => Decart::class, + 'label' => 'Lucy Pro (Face Looping Frame To Video)', 'capabilities' => [ Capability::IMAGE_TO_VIDEO, ], diff --git a/src/platform/src/Bridge/DeepSeek/ModelCatalog.php b/src/platform/src/Bridge/DeepSeek/ModelCatalog.php index ce66f62837..69bf4bdd3f 100644 --- a/src/platform/src/Bridge/DeepSeek/ModelCatalog.php +++ b/src/platform/src/Bridge/DeepSeek/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'deepseek-chat' => [ 'class' => DeepSeek::class, + 'label' => 'DeepSeek Chat', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -36,6 +37,7 @@ public function __construct(array $additionalModels = []) ], 'deepseek-reasoner' => [ 'class' => DeepSeek::class, + 'label' => 'DeepSeek Reasoner', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/DockerModelRunner/ModelCatalog.php b/src/platform/src/Bridge/DockerModelRunner/ModelCatalog.php index 5dd8378143..309b817fa5 100644 --- a/src/platform/src/Bridge/DockerModelRunner/ModelCatalog.php +++ b/src/platform/src/Bridge/DockerModelRunner/ModelCatalog.php @@ -20,7 +20,7 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array, label: string}> $additionalModels */ public function __construct(array $additionalModels = []) { @@ -28,6 +28,7 @@ public function __construct(array $additionalModels = []) // Completions models 'ai/gemma3n' => [ 'class' => Completions::class, + 'label' => 'Gemma 3 Nano', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -35,6 +36,7 @@ public function __construct(array $additionalModels = []) ], 'ai/gemma3' => [ 'class' => Completions::class, + 'label' => 'Gemma 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -42,6 +44,7 @@ public function __construct(array $additionalModels = []) ], 'ai/qwen2.5' => [ 'class' => Completions::class, + 'label' => 'Qwen 2.5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -49,6 +52,7 @@ public function __construct(array $additionalModels = []) ], 'ai/qwen3' => [ 'class' => Completions::class, + 'label' => 'Qwen 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -56,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'ai/qwen3-coder' => [ 'class' => Completions::class, + 'label' => 'Qwen 3 Coder', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -63,6 +68,7 @@ public function __construct(array $additionalModels = []) ], 'ai/llama3.1' => [ 'class' => Completions::class, + 'label' => 'Llama 3.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -70,6 +76,7 @@ public function __construct(array $additionalModels = []) ], 'ai/llama3.2' => [ 'class' => Completions::class, + 'label' => 'Llama 3.2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -77,6 +84,7 @@ public function __construct(array $additionalModels = []) ], 'ai/llama3.3' => [ 'class' => Completions::class, + 'label' => 'Llama 3.3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -84,6 +92,7 @@ public function __construct(array $additionalModels = []) ], 'ai/mistral' => [ 'class' => Completions::class, + 'label' => 'Mistral', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -91,6 +100,7 @@ public function __construct(array $additionalModels = []) ], 'ai/mistral-nemo' => [ 'class' => Completions::class, + 'label' => 'Mistral Nemo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -98,6 +108,7 @@ public function __construct(array $additionalModels = []) ], 'ai/phi4' => [ 'class' => Completions::class, + 'label' => 'Phi 4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -105,6 +116,7 @@ public function __construct(array $additionalModels = []) ], 'ai/deepseek-r1-distill-llama' => [ 'class' => Completions::class, + 'label' => 'DeepSeek R1 Distill Llama', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -112,6 +124,7 @@ public function __construct(array $additionalModels = []) ], 'ai/seed-oss' => [ 'class' => Completions::class, + 'label' => 'Seed-OSS', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -119,6 +132,7 @@ public function __construct(array $additionalModels = []) ], 'ai/gpt-oss' => [ 'class' => Completions::class, + 'label' => 'GPT-OSS', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -126,6 +140,7 @@ public function __construct(array $additionalModels = []) ], 'ai/smollm2' => [ 'class' => Completions::class, + 'label' => 'SmolLM 2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -133,6 +148,7 @@ public function __construct(array $additionalModels = []) ], 'ai/smollm3' => [ 'class' => Completions::class, + 'label' => 'SmolLM 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -141,6 +157,7 @@ public function __construct(array $additionalModels = []) // Embeddings models 'ai/nomic-embed-text-v1.5' => [ 'class' => Embeddings::class, + 'label' => 'Nomic Embed Text v1.5 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, @@ -148,6 +165,7 @@ public function __construct(array $additionalModels = []) ], 'ai/mxbai-embed-large' => [ 'class' => Embeddings::class, + 'label' => 'MXBai Embed Large (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, @@ -155,6 +173,7 @@ public function __construct(array $additionalModels = []) ], 'ai/embeddinggemma' => [ 'class' => Embeddings::class, + 'label' => 'Embedding Gemma (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, @@ -162,6 +181,7 @@ public function __construct(array $additionalModels = []) ], 'ai/granite-embedding-multilingual' => [ 'class' => Embeddings::class, + 'label' => 'Granite Embedding Multilingual (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, diff --git a/src/platform/src/Bridge/ElevenLabs/ModelCatalog.php b/src/platform/src/Bridge/ElevenLabs/ModelCatalog.php index 5e3dfe0fa5..f91dd02b36 100644 --- a/src/platform/src/Bridge/ElevenLabs/ModelCatalog.php +++ b/src/platform/src/Bridge/ElevenLabs/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'eleven_v3' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs V3 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -35,6 +36,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_ttv_v3' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs TTV V3 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -43,6 +45,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_multilingual_v2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Multilingual V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -51,6 +54,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_flash_v2_5' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Flash V2.5 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -59,6 +63,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_flashv2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Flash V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -67,6 +72,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_turbo_v2_5' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Turbo V2.5 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -75,6 +81,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_turbo_v2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Turbo V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -83,6 +90,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_multilingual_sts_v2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Multilingual STS V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -91,6 +99,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_multilingual_ttv_v2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs Multilingual TTV V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -99,6 +108,7 @@ public function __construct(array $additionalModels = []) ], 'eleven_english_sts_v2' => [ 'class' => ElevenLabs::class, + 'label' => 'ElevenLabs English STS V2 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -107,6 +117,7 @@ public function __construct(array $additionalModels = []) ], 'scribe_v1' => [ 'class' => ElevenLabs::class, + 'label' => 'Scribe V1 (STT)', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::OUTPUT_TEXT, @@ -115,6 +126,7 @@ public function __construct(array $additionalModels = []) ], 'scribe_v1_experimental' => [ 'class' => ElevenLabs::class, + 'label' => 'Scribe V1 Experimental (STT)', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/Gemini/ModelCatalog.php b/src/platform/src/Bridge/Gemini/ModelCatalog.php index c57da7198f..845e86c544 100644 --- a/src/platform/src/Bridge/Gemini/ModelCatalog.php +++ b/src/platform/src/Bridge/Gemini/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'gemini-3-flash-preview' => [ 'class' => Gemini::class, + 'label' => 'Gemini 3 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -39,6 +40,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-3-pro-preview' => [ 'class' => Gemini::class, + 'label' => 'Gemini 3 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -51,6 +53,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-3-pro-image-preview' => [ 'class' => Gemini::class, + 'label' => 'Gemini 3 Pro Vision', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -60,6 +63,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash-image' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Flash Vision', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -69,6 +73,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -81,6 +86,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-pro' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -93,6 +99,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash-lite' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Flash Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -105,6 +112,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.0 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -116,6 +124,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-pro-exp-02-05' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.0 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -127,6 +136,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash-lite-preview-02-05' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.0 Flash Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -138,6 +148,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash-thinking-exp-01-21' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.0 Flash Thinking', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -149,6 +160,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-1.5-flash' => [ 'class' => Gemini::class, + 'label' => 'Gemini 1.5 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -160,6 +172,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash-preview-tts' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Flash (TTS)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_AUDIO, @@ -168,6 +181,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-pro-preview-tts' => [ 'class' => Gemini::class, + 'label' => 'Gemini 2.5 Pro (TTS)', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_AUDIO, @@ -176,14 +190,17 @@ public function __construct(array $additionalModels = []) ], 'gemini-embedding-exp-03-07' => [ 'class' => Embeddings::class, + 'label' => 'Gemini Embedding (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'text-embedding-004' => [ 'class' => Embeddings::class, + 'label' => 'Text Embedding 004 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'embedding-001' => [ 'class' => Embeddings::class, + 'label' => 'Embedding 001 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], ]; diff --git a/src/platform/src/Bridge/LmStudio/ModelCatalog.php b/src/platform/src/Bridge/LmStudio/ModelCatalog.php index 3ec1a02e9e..2be53fea50 100644 --- a/src/platform/src/Bridge/LmStudio/ModelCatalog.php +++ b/src/platform/src/Bridge/LmStudio/ModelCatalog.php @@ -22,13 +22,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'gemma-3-4b-it-qat' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 4B IT QAT', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -39,6 +40,7 @@ public function __construct(array $additionalModels = []) ], 'text-embedding-nomic-embed-text-v2-moe' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding Nomic EMbed Text V2 MOE (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, diff --git a/src/platform/src/Bridge/Meta/ModelCatalog.php b/src/platform/src/Bridge/Meta/ModelCatalog.php index 422499cca5..5126c76994 100644 --- a/src/platform/src/Bridge/Meta/ModelCatalog.php +++ b/src/platform/src/Bridge/Meta/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'llama-3.3-70B-Instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -34,6 +35,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-90b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 90B Vision Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -42,6 +44,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-11b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 11B Vision Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -50,6 +53,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -57,6 +61,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -64,6 +69,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -71,6 +77,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -78,6 +85,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-405b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 405B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -85,6 +93,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -92,6 +101,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -99,6 +109,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -106,6 +117,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -113,6 +125,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -120,6 +133,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -127,6 +141,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/Mistral/ModelCatalog.php b/src/platform/src/Bridge/Mistral/ModelCatalog.php index 3b893c0ed5..fc8deca823 100644 --- a/src/platform/src/Bridge/Mistral/ModelCatalog.php +++ b/src/platform/src/Bridge/Mistral/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'codestral-latest' => [ 'class' => Mistral::class, + 'label' => 'Codestral', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'devstral-medium-latest' => [ 'class' => Mistral::class, + 'label' => 'Devstral Medium', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -47,6 +49,7 @@ public function __construct(array $additionalModels = []) ], 'devstral-small-latest' => [ 'class' => Mistral::class, + 'label' => 'Devstral Small', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -57,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-large-latest' => [ 'class' => Mistral::class, + 'label' => 'Mistral Large', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -67,6 +71,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-medium-latest' => [ 'class' => Mistral::class, + 'label' => 'Mistral Medium', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -78,6 +83,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-small-latest' => [ 'class' => Mistral::class, + 'label' => 'Mistral Small', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -89,6 +95,7 @@ public function __construct(array $additionalModels = []) ], 'open-mistral-nemo' => [ 'class' => Mistral::class, + 'label' => 'Open Mistral Nemo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -99,6 +106,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-saba-latest' => [ 'class' => Mistral::class, + 'label' => 'Mistral Saba', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -108,6 +116,7 @@ public function __construct(array $additionalModels = []) ], 'ministral-3b-latest' => [ 'class' => Mistral::class, + 'label' => 'Ministral 3B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -118,6 +127,7 @@ public function __construct(array $additionalModels = []) ], 'ministral-8b-latest' => [ 'class' => Mistral::class, + 'label' => 'Ministral 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -128,6 +138,7 @@ public function __construct(array $additionalModels = []) ], 'ministral-14b-latest' => [ 'class' => Mistral::class, + 'label' => 'Ministral 14B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -138,6 +149,7 @@ public function __construct(array $additionalModels = []) ], 'pixstral-large-latest' => [ 'class' => Mistral::class, + 'label' => 'Pixstral Large', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -149,6 +161,7 @@ public function __construct(array $additionalModels = []) ], 'pixstral-12b-latest' => [ 'class' => Mistral::class, + 'label' => 'Pixstral 12B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -160,6 +173,7 @@ public function __construct(array $additionalModels = []) ], 'voxtral-small-latest' => [ 'class' => Mistral::class, + 'label' => 'Voxtral Small', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -171,6 +185,7 @@ public function __construct(array $additionalModels = []) ], 'voxtral-mini-latest' => [ 'class' => Mistral::class, + 'label' => 'Voxtral Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -182,6 +197,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-embed' => [ 'class' => Embeddings::class, + 'label' => 'Mistral Embed (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], ]; diff --git a/src/platform/src/Bridge/Ollama/ModelCatalog.php b/src/platform/src/Bridge/Ollama/ModelCatalog.php index 80c0bb22d1..51079e745e 100644 --- a/src/platform/src/Bridge/Ollama/ModelCatalog.php +++ b/src/platform/src/Bridge/Ollama/ModelCatalog.php @@ -21,13 +21,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array, capabilities: list}> $additionalModels + * @param array, capabilities: list, label: string}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'deepseek-r1' => [ 'class' => Ollama::class, + 'label' => 'DeepSeek R1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-oss' => [ 'class' => Ollama::class, + 'label' => 'GPT-OSS', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -46,6 +48,7 @@ public function __construct(array $additionalModels = []) ], 'llama3.1' => [ 'class' => Ollama::class, + 'label' => 'Llama 3.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -55,6 +58,7 @@ public function __construct(array $additionalModels = []) ], 'llama3.2' => [ 'class' => Ollama::class, + 'label' => 'Llama 3.2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -64,6 +68,7 @@ public function __construct(array $additionalModels = []) ], 'llama3' => [ 'class' => Ollama::class, + 'label' => 'Llama 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -73,6 +78,7 @@ public function __construct(array $additionalModels = []) ], 'mistral' => [ 'class' => Ollama::class, + 'label' => 'Mistral', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -82,6 +88,7 @@ public function __construct(array $additionalModels = []) ], 'qwen3' => [ 'class' => Ollama::class, + 'label' => 'Qwen 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -91,6 +98,7 @@ public function __construct(array $additionalModels = []) ], 'qwen' => [ 'class' => Ollama::class, + 'label' => 'Qwen', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -100,6 +108,7 @@ public function __construct(array $additionalModels = []) ], 'qwen2' => [ 'class' => Ollama::class, + 'label' => 'Qwen 2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -109,6 +118,7 @@ public function __construct(array $additionalModels = []) ], 'qwen2.5' => [ 'class' => Ollama::class, + 'label' => 'Qwen 2.5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -118,6 +128,7 @@ public function __construct(array $additionalModels = []) ], 'qwen2.5-coder' => [ 'class' => Ollama::class, + 'label' => 'Qwen 2.5 Coder', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -127,6 +138,7 @@ public function __construct(array $additionalModels = []) ], 'gemma3n' => [ 'class' => Ollama::class, + 'label' => 'Gemma 3 Nano', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -135,6 +147,7 @@ public function __construct(array $additionalModels = []) ], 'gemma3' => [ 'class' => Ollama::class, + 'label' => 'Gemma 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -143,6 +156,7 @@ public function __construct(array $additionalModels = []) ], 'qwen2.5vl' => [ 'class' => Ollama::class, + 'label' => 'Qwen 2.5 VL', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -151,6 +165,7 @@ public function __construct(array $additionalModels = []) ], 'llava' => [ 'class' => Ollama::class, + 'label' => 'LLaVA', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -159,6 +174,7 @@ public function __construct(array $additionalModels = []) ], 'phi3' => [ 'class' => Ollama::class, + 'label' => 'Phi 3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -167,6 +183,7 @@ public function __construct(array $additionalModels = []) ], 'gemma2' => [ 'class' => Ollama::class, + 'label' => 'Gemma 2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -175,6 +192,7 @@ public function __construct(array $additionalModels = []) ], 'gemma' => [ 'class' => Ollama::class, + 'label' => 'Gemma', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -183,6 +201,7 @@ public function __construct(array $additionalModels = []) ], 'llama2' => [ 'class' => Ollama::class, + 'label' => 'Llama 2', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -191,6 +210,7 @@ public function __construct(array $additionalModels = []) ], 'nomic-embed-text' => [ 'class' => Ollama::class, + 'label' => 'Nomic Embed Text (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, @@ -199,6 +219,7 @@ public function __construct(array $additionalModels = []) ], 'bge-m3' => [ 'class' => Ollama::class, + 'label' => 'BGE-M3 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, @@ -207,6 +228,7 @@ public function __construct(array $additionalModels = []) ], 'all-minilm' => [ 'class' => Ollama::class, + 'label' => 'All MiniLM (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, diff --git a/src/platform/src/Bridge/OpenAi/ModelCatalog.php b/src/platform/src/Bridge/OpenAi/ModelCatalog.php index ef74cdbc6a..6a44874786 100644 --- a/src/platform/src/Bridge/OpenAi/ModelCatalog.php +++ b/src/platform/src/Bridge/OpenAi/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'gpt-3.5-turbo' => [ 'class' => Gpt::class, + 'label' => 'GPT-3.5 Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -36,6 +37,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-3.5-turbo-instruct' => [ 'class' => Gpt::class, + 'label' => 'GPT-3.5 Turbo Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -45,6 +47,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4' => [ 'class' => Gpt::class, + 'label' => 'GPT-4', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -54,6 +57,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4-turbo' => [ 'class' => Gpt::class, + 'label' => 'GPT-4 Turbo', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -65,6 +69,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o' => [ 'class' => Gpt::class, + 'label' => 'GPT-4o', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -77,6 +82,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini' => [ 'class' => Gpt::class, + 'label' => 'GPT-4o Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -89,6 +95,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-audio-preview' => [ 'class' => Gpt::class, + 'label' => 'GPT-4o Audio', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -105,6 +112,7 @@ public function __construct(array $additionalModels = []) ], 'o3' => [ 'class' => Gpt::class, + 'label' => 'O3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -115,6 +123,7 @@ public function __construct(array $additionalModels = []) ], 'o3-mini' => [ 'class' => Gpt::class, + 'label' => 'O3 Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -127,6 +136,7 @@ public function __construct(array $additionalModels = []) ], 'o3-mini-high' => [ 'class' => Gpt::class, + 'label' => 'O3 Mini High', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -136,6 +146,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4.5-preview' => [ 'class' => Gpt::class, + 'label' => 'GPT-4.5 Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -148,6 +159,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4.1' => [ 'class' => Gpt::class, + 'label' => 'GPT-4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -160,6 +172,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4.1-mini' => [ 'class' => Gpt::class, + 'label' => 'GPT-4.1 Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -172,6 +185,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4.1-nano' => [ 'class' => Gpt::class, + 'label' => 'GPT-4.1 Nano', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -184,6 +198,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-5' => [ 'class' => Gpt::class, + 'label' => 'GPT-5', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -196,6 +211,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-5-chat-latest' => [ 'class' => Gpt::class, + 'label' => 'GPT-5 Chat', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -206,6 +222,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-5-mini' => [ 'class' => Gpt::class, + 'label' => 'GPT-5 Mini', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -218,6 +235,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-5-nano' => [ 'class' => Gpt::class, + 'label' => 'GPT-5 Nano', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -230,6 +248,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-5.2' => [ 'class' => Gpt::class, + 'label' => 'GPT-5.2', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_MESSAGES, @@ -242,18 +261,22 @@ public function __construct(array $additionalModels = []) ], 'text-embedding-ada-002' => [ 'class' => Embeddings::class, + 'label' => 'Text Embedding Ada 002 (Embeddings)', 'capabilities' => [Capability::INPUT_TEXT, Capability::EMBEDDINGS], ], 'text-embedding-3-large' => [ 'class' => Embeddings::class, + 'label' => 'Text Embedding 3 Large (Embeddings)', 'capabilities' => [Capability::INPUT_TEXT, Capability::EMBEDDINGS], ], 'text-embedding-3-small' => [ 'class' => Embeddings::class, + 'label' => 'Text Embedding 3 Small (Embeddings)', 'capabilities' => [Capability::INPUT_TEXT, Capability::EMBEDDINGS], ], 'tts-1' => [ 'class' => TextToSpeech::class, + 'label' => 'TTS-1 (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -261,6 +284,7 @@ public function __construct(array $additionalModels = []) ], 'tts-1-hd' => [ 'class' => TextToSpeech::class, + 'label' => 'TTS-1 HD (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -268,6 +292,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-4o-mini-tts' => [ 'class' => TextToSpeech::class, + 'label' => 'GPT-4o Mini TTS (TTS)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_AUDIO, @@ -275,6 +300,7 @@ public function __construct(array $additionalModels = []) ], 'whisper-1' => [ 'class' => Whisper::class, + 'label' => 'Whisper (STT)', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::OUTPUT_TEXT, @@ -282,6 +308,7 @@ public function __construct(array $additionalModels = []) ], 'dall-e-2' => [ 'class' => DallE::class, + 'label' => 'DALL-E 2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_IMAGE, @@ -289,6 +316,7 @@ public function __construct(array $additionalModels = []) ], 'dall-e-3' => [ 'class' => DallE::class, + 'label' => 'DALL-E 3', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_IMAGE, diff --git a/src/platform/src/Bridge/OpenRouter/ModelCatalog.php b/src/platform/src/Bridge/OpenRouter/ModelCatalog.php index 1ab4685bd7..d7c0a7ba5b 100644 --- a/src/platform/src/Bridge/OpenRouter/ModelCatalog.php +++ b/src/platform/src/Bridge/OpenRouter/ModelCatalog.php @@ -23,7 +23,7 @@ final class ModelCatalog extends AbstractOpenRouterModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct( array $additionalModels = [], @@ -38,6 +38,7 @@ public function __construct( // Models 'x-ai/grok-4.1-fast' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 4.1 Fast', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -46,6 +47,7 @@ public function __construct( ], 'google/gemini-3-pro-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 3 Pro Preview', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -57,6 +59,7 @@ public function __construct( ], 'deepcogito/cogito-v2.1-671b' => [ 'class' => CompletionsModel::class, + 'label' => 'Cogito V2.1 671B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -64,6 +67,7 @@ public function __construct( ], 'openai/gpt-5.1' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5.1', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -73,6 +77,7 @@ public function __construct( ], 'openai/gpt-5.1-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5.1 Chat', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -82,6 +87,7 @@ public function __construct( ], 'openai/gpt-5.1-codex' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5.1 Codex', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -90,6 +96,7 @@ public function __construct( ], 'openai/gpt-5.1-codex-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5.1 Codex Mini', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -98,6 +105,7 @@ public function __construct( ], 'kwaipilot/kat-coder-pro:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Kat Coder Pro Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -105,6 +113,7 @@ public function __construct( ], 'moonshotai/kimi-linear-48b-a3b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi Linear 48B A3B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -112,6 +121,7 @@ public function __construct( ], 'moonshotai/kimi-k2-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2 Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -119,6 +129,7 @@ public function __construct( ], 'amazon/nova-premier-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'Nova Premier V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -127,6 +138,7 @@ public function __construct( ], 'perplexity/sonar-pro-search' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar Pro Search', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -135,6 +147,7 @@ public function __construct( ], 'mistralai/voxtral-small-24b-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Voxtral Small 24B 2507', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_AUDIO, @@ -143,6 +156,7 @@ public function __construct( ], 'openai/gpt-oss-safeguard-20b' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT OSS Safeguard 20B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -150,6 +164,7 @@ public function __construct( ], 'nvidia/nemotron-nano-12b-v2-vl:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Nemotron Nano 12B V2 VL Free', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -159,6 +174,7 @@ public function __construct( ], 'nvidia/nemotron-nano-12b-v2-vl' => [ 'class' => CompletionsModel::class, + 'label' => 'Nemotron Nano 12B V2 VL', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -168,6 +184,7 @@ public function __construct( ], 'minimax/minimax-m2' => [ 'class' => CompletionsModel::class, + 'label' => 'Minimax M2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -175,6 +192,7 @@ public function __construct( ], 'liquid/lfm2-8b-a1b' => [ 'class' => CompletionsModel::class, + 'label' => 'LFM2 8B A1B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -182,6 +200,7 @@ public function __construct( ], 'liquid/lfm-2.2-6b' => [ 'class' => CompletionsModel::class, + 'label' => 'LFM 2.2 6B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -189,6 +208,7 @@ public function __construct( ], 'ibm-granite/granite-4.0-h-micro' => [ 'class' => CompletionsModel::class, + 'label' => 'Granite 4.0 H Micro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -196,6 +216,7 @@ public function __construct( ], 'deepcogito/cogito-v2-preview-llama-405b' => [ 'class' => CompletionsModel::class, + 'label' => 'Cogito V2 Preview Llama 405B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -203,6 +224,7 @@ public function __construct( ], 'openai/gpt-5-image-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Image Mini', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -213,6 +235,7 @@ public function __construct( ], 'anthropic/claude-haiku-4.5' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Haiku 4.5', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -221,6 +244,7 @@ public function __construct( ], 'qwen/qwen3-vl-8b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 8B Thinking', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -229,6 +253,7 @@ public function __construct( ], 'qwen/qwen3-vl-8b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 8B Instruct', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -237,6 +262,7 @@ public function __construct( ], 'openai/gpt-5-image' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Image', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -247,6 +273,7 @@ public function __construct( ], 'openai/o3-deep-research' => [ 'class' => CompletionsModel::class, + 'label' => 'O3 Deep Research', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -256,6 +283,7 @@ public function __construct( ], 'openai/o4-mini-deep-research' => [ 'class' => CompletionsModel::class, + 'label' => 'O4 Mini Deep Research', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -265,6 +293,7 @@ public function __construct( ], 'nvidia/llama-3.3-nemotron-super-49b-v1.5' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.3 Nemotron Super 49B V1.5', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -272,6 +301,7 @@ public function __construct( ], 'baidu/ernie-4.5-21b-a3b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Ernie 4.5 21B A3B Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -279,6 +309,7 @@ public function __construct( ], 'google/gemini-2.5-flash-image' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Image', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -288,6 +319,7 @@ public function __construct( ], 'qwen/qwen3-vl-30b-a3b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 30B A3B Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -296,6 +328,7 @@ public function __construct( ], 'qwen/qwen3-vl-30b-a3b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 30B A3B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -304,6 +337,7 @@ public function __construct( ], 'openai/gpt-5-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Pro', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -313,6 +347,7 @@ public function __construct( ], 'z-ai/glm-4.6' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.6', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -320,6 +355,7 @@ public function __construct( ], 'z-ai/glm-4.6:exacto' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.6 Exacto', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -327,6 +363,7 @@ public function __construct( ], 'anthropic/claude-sonnet-4.5' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Sonnet 4.5', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -336,6 +373,7 @@ public function __construct( ], 'deepseek/deepseek-v3.2-exp' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek V3.2 Exp', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -343,6 +381,7 @@ public function __construct( ], 'thedrummer/cydonia-24b-v4.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Cydonia 24B V4.1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -350,6 +389,7 @@ public function __construct( ], 'relace/relace-apply-3' => [ 'class' => CompletionsModel::class, + 'label' => 'Relace Apply 3', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -357,6 +397,7 @@ public function __construct( ], 'google/gemini-2.5-flash-preview-09-2025' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Preview 09 2025', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_PDF, @@ -368,6 +409,7 @@ public function __construct( ], 'google/gemini-2.5-flash-lite-preview-09-2025' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Lite Preview 09 2025', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -379,6 +421,7 @@ public function __construct( ], 'qwen/qwen3-vl-235b-a22b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 235B A22B Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -387,6 +430,7 @@ public function __construct( ], 'qwen/qwen3-vl-235b-a22b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 VL 235B A22B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -395,6 +439,7 @@ public function __construct( ], 'qwen/qwen3-max' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Max', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -402,6 +447,7 @@ public function __construct( ], 'qwen/qwen3-coder-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder Plus', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -409,6 +455,7 @@ public function __construct( ], 'openai/gpt-5-codex' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Codex', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -417,6 +464,7 @@ public function __construct( ], 'deepseek/deepseek-v3.1-terminus' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek V3.1 Terminus', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -424,6 +472,7 @@ public function __construct( ], 'deepseek/deepseek-v3.1-terminus:exacto' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek V3.1 Terminus Exacto', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -431,6 +480,7 @@ public function __construct( ], 'x-ai/grok-4-fast' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 4 Fast', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -439,6 +489,7 @@ public function __construct( ], 'alibaba/tongyi-deepresearch-30b-a3b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Tongyi Deepresearch 30B A3B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -446,6 +497,7 @@ public function __construct( ], 'alibaba/tongyi-deepresearch-30b-a3b' => [ 'class' => CompletionsModel::class, + 'label' => 'Tongyi Deepresearch 30B A3B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -453,6 +505,7 @@ public function __construct( ], 'qwen/qwen3-coder-flash' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder Flash', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -460,6 +513,7 @@ public function __construct( ], 'arcee-ai/afm-4.5b' => [ 'class' => CompletionsModel::class, + 'label' => 'AFM 4.5B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -467,6 +521,7 @@ public function __construct( ], 'opengvlab/internvl3-78b' => [ 'class' => CompletionsModel::class, + 'label' => 'InternVL3 78B', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -475,6 +530,7 @@ public function __construct( ], 'qwen/qwen3-next-80b-a3b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Next 80B A3B Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -482,6 +538,7 @@ public function __construct( ], 'qwen/qwen3-next-80b-a3b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Next 80B A3B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -489,6 +546,7 @@ public function __construct( ], 'meituan/longcat-flash-chat:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Longcat Flash Chat Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -496,6 +554,7 @@ public function __construct( ], 'meituan/longcat-flash-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'Longcat Flash Chat', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -503,6 +562,7 @@ public function __construct( ], 'qwen/qwen-plus-2025-07-28' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Plus 2025 07 28', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -510,6 +570,7 @@ public function __construct( ], 'qwen/qwen-plus-2025-07-28:thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Plus 2025 07 28 Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -517,6 +578,7 @@ public function __construct( ], 'nvidia/nemotron-nano-9b-v2:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Nemotron Nano 9B V2 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -524,6 +586,7 @@ public function __construct( ], 'nvidia/nemotron-nano-9b-v2' => [ 'class' => CompletionsModel::class, + 'label' => 'Nemotron Nano 9B V2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -531,6 +594,7 @@ public function __construct( ], 'moonshotai/kimi-k2-0905' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2 0905', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -538,6 +602,7 @@ public function __construct( ], 'moonshotai/kimi-k2-0905:exacto' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2 0905 Exacto', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -545,6 +610,7 @@ public function __construct( ], 'deepcogito/cogito-v2-preview-llama-70b' => [ 'class' => CompletionsModel::class, + 'label' => 'Cogito V2 Preview Llama 70B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -552,6 +618,7 @@ public function __construct( ], 'deepcogito/cogito-v2-preview-llama-109b-moe' => [ 'class' => CompletionsModel::class, + 'label' => 'Cogito V2 Preview Llama 109B MOE', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -560,6 +627,7 @@ public function __construct( ], 'deepcogito/cogito-v2-preview-deepseek-671b' => [ 'class' => CompletionsModel::class, + 'label' => 'Cogito V2 Preview DeepSeek 671B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -567,6 +635,7 @@ public function __construct( ], 'stepfun-ai/step3' => [ 'class' => CompletionsModel::class, + 'label' => 'Step 3', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -575,6 +644,7 @@ public function __construct( ], 'qwen/qwen3-30b-a3b-thinking-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 30B A3B Thinking 2507', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -582,6 +652,7 @@ public function __construct( ], 'x-ai/grok-code-fast-1' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok Code Fast 1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -589,6 +660,7 @@ public function __construct( ], 'nousresearch/hermes-4-70b' => [ 'class' => CompletionsModel::class, + 'label' => 'Hermes 4 70B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -596,6 +668,7 @@ public function __construct( ], 'nousresearch/hermes-4-405b' => [ 'class' => CompletionsModel::class, + 'label' => 'Hermes 4 405B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -603,6 +676,7 @@ public function __construct( ], 'google/gemini-2.5-flash-image-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Image Preview', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -612,6 +686,7 @@ public function __construct( ], 'deepseek/deepseek-chat-v3.1' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat V3.1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -619,6 +694,7 @@ public function __construct( ], 'openai/gpt-audio' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT Audio', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::INPUT_TEXT, @@ -628,6 +704,7 @@ public function __construct( ], 'openai/gpt-audio-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT Audio Mini', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::INPUT_TEXT, @@ -637,6 +714,7 @@ public function __construct( ], 'openai/gpt-4o-audio-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4O Audio Preview', 'capabilities' => [ Capability::INPUT_AUDIO, Capability::INPUT_TEXT, @@ -646,6 +724,7 @@ public function __construct( ], 'mistralai/mistral-medium-3.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Medium 3.1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -654,6 +733,7 @@ public function __construct( ], 'baidu/ernie-4.5-21b-a3b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ernie 4.5 21B A3B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -661,6 +741,7 @@ public function __construct( ], 'baidu/ernie-4.5-vl-28b-a3b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ernie 4.5 VL 28B A3B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -669,6 +750,7 @@ public function __construct( ], 'z-ai/glm-4.5v' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5V', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -677,6 +759,7 @@ public function __construct( ], 'ai21/jamba-mini-1.7' => [ 'class' => CompletionsModel::class, + 'label' => 'Jamba Mini 1.7', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -684,6 +767,7 @@ public function __construct( ], 'ai21/jamba-large-1.7' => [ 'class' => CompletionsModel::class, + 'label' => 'Jamba Large 1.7', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -691,6 +775,7 @@ public function __construct( ], 'openai/gpt-5-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Chat', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -700,6 +785,7 @@ public function __construct( ], 'openai/gpt-5' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -709,6 +795,7 @@ public function __construct( ], 'openai/gpt-5-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Mini', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -718,6 +805,7 @@ public function __construct( ], 'openai/gpt-5-nano' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 5 Nano', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -727,6 +815,7 @@ public function __construct( ], 'openai/gpt-oss-120b' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT OSS 120B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -734,6 +823,7 @@ public function __construct( ], 'openai/gpt-oss-120b:exacto' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT OSS 120B Exacto', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -741,6 +831,7 @@ public function __construct( ], 'openai/gpt-oss-20b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT OSS 20B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -748,6 +839,7 @@ public function __construct( ], 'openai/gpt-oss-20b' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT OSS 20B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -755,6 +847,7 @@ public function __construct( ], 'anthropic/claude-opus-4.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -764,6 +857,7 @@ public function __construct( ], 'mistralai/codestral-2508' => [ 'class' => CompletionsModel::class, + 'label' => 'Codestral 2508', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -771,6 +865,7 @@ public function __construct( ], 'qwen/qwen3-coder-30b-a3b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder 30B A3B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -778,6 +873,7 @@ public function __construct( ], 'qwen/qwen3-30b-a3b-instruct-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 30B A3B Instruct 2507', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -785,6 +881,7 @@ public function __construct( ], 'z-ai/glm-4.5' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -792,6 +889,7 @@ public function __construct( ], 'z-ai/glm-4.5-air:free' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5 Air Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -799,6 +897,7 @@ public function __construct( ], 'z-ai/glm-4.5-air' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.5 Air', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -806,6 +905,7 @@ public function __construct( ], 'qwen/qwen3-235b-a22b-thinking-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 235B A22B Thinking 2507', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -813,6 +913,7 @@ public function __construct( ], 'z-ai/glm-4-32b' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4 32B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -820,6 +921,7 @@ public function __construct( ], 'qwen/qwen3-coder:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -827,6 +929,7 @@ public function __construct( ], 'qwen/qwen3-coder' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -834,6 +937,7 @@ public function __construct( ], 'qwen/qwen3-coder:exacto' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder Exacto', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -841,6 +945,7 @@ public function __construct( ], 'bytedance/ui-tars-1.5-7b' => [ 'class' => CompletionsModel::class, + 'label' => 'UI TARS 1.5 7B', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -849,6 +954,7 @@ public function __construct( ], 'google/gemini-2.5-flash-lite' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash Lite', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -860,6 +966,7 @@ public function __construct( ], 'qwen/qwen3-235b-a22b-2507' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 235B A22B 2507', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -867,6 +974,7 @@ public function __construct( ], 'switchpoint/router' => [ 'class' => CompletionsModel::class, + 'label' => 'Switchpoint Router', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -874,6 +982,7 @@ public function __construct( ], 'moonshotai/kimi-k2:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -881,6 +990,7 @@ public function __construct( ], 'moonshotai/kimi-k2' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi K2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -888,6 +998,7 @@ public function __construct( ], 'thudm/glm-4.1v-9b-thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'GLM 4.1V 9B Thinking', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -896,6 +1007,7 @@ public function __construct( ], 'mistralai/devstral-medium' => [ 'class' => CompletionsModel::class, + 'label' => 'Devstral Medium', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -903,6 +1015,7 @@ public function __construct( ], 'mistralai/devstral-small' => [ 'class' => CompletionsModel::class, + 'label' => 'Devstral Small', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -910,6 +1023,7 @@ public function __construct( ], 'cognitivecomputations/dolphin-mistral-24b-venice-edition:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Dolphin Mistral 24B Venice Edition Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -917,6 +1031,7 @@ public function __construct( ], 'x-ai/grok-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 4', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -925,6 +1040,7 @@ public function __construct( ], 'google/gemma-3n-e2b-it:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3N E2B IT Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -932,6 +1048,7 @@ public function __construct( ], 'tencent/hunyuan-a13b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Hunyuan A13B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -939,6 +1056,7 @@ public function __construct( ], 'tngtech/deepseek-r1t2-chimera:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1T2 Chimera Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -946,6 +1064,7 @@ public function __construct( ], 'tngtech/deepseek-r1t2-chimera' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1T2 Chimera', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -953,6 +1072,7 @@ public function __construct( ], 'morph/morph-v3-large' => [ 'class' => CompletionsModel::class, + 'label' => 'Morph V3 Large', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -960,6 +1080,7 @@ public function __construct( ], 'morph/morph-v3-fast' => [ 'class' => CompletionsModel::class, + 'label' => 'Morph V3 Fast', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -967,6 +1088,7 @@ public function __construct( ], 'baidu/ernie-4.5-vl-424b-a47b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ernie 4.5 VL 424B A47B', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -975,6 +1097,7 @@ public function __construct( ], 'baidu/ernie-4.5-300b-a47b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ernie 4.5 300B A47B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -982,6 +1105,7 @@ public function __construct( ], 'thedrummer/anubis-70b-v1.1' => [ 'class' => CompletionsModel::class, + 'label' => 'Anubis 70B V1.1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -989,6 +1113,7 @@ public function __construct( ], 'inception/mercury' => [ 'class' => CompletionsModel::class, + 'label' => 'Mercury', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -996,6 +1121,7 @@ public function __construct( ], 'mistralai/mistral-small-3.2-24b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 3.2 24B Instruct Free', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1004,6 +1130,7 @@ public function __construct( ], 'mistralai/mistral-small-3.2-24b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 3.2 24B Instruct', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1012,6 +1139,7 @@ public function __construct( ], 'minimax/minimax-m1' => [ 'class' => CompletionsModel::class, + 'label' => 'Minimax M1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1019,6 +1147,7 @@ public function __construct( ], 'google/gemini-2.5-flash' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Flash', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -1030,6 +1159,7 @@ public function __construct( ], 'google/gemini-2.5-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Pro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1041,6 +1171,7 @@ public function __construct( ], 'moonshotai/kimi-dev-72b' => [ 'class' => CompletionsModel::class, + 'label' => 'Kimi Dev 72B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1048,6 +1179,7 @@ public function __construct( ], 'openai/o3-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'O3 Pro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_PDF, @@ -1057,6 +1189,7 @@ public function __construct( ], 'x-ai/grok-3-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3 Mini', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1064,6 +1197,7 @@ public function __construct( ], 'x-ai/grok-3' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1071,6 +1205,7 @@ public function __construct( ], 'mistralai/magistral-small-2506' => [ 'class' => CompletionsModel::class, + 'label' => 'Magistral Small 2506', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1078,6 +1213,7 @@ public function __construct( ], 'mistralai/magistral-medium-2506:thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Magistral Medium 2506 Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1085,6 +1221,7 @@ public function __construct( ], 'mistralai/magistral-medium-2506' => [ 'class' => CompletionsModel::class, + 'label' => 'Magistral Medium 2506', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1092,6 +1229,7 @@ public function __construct( ], 'google/gemini-2.5-pro-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Pro Preview', 'capabilities' => [ Capability::INPUT_PDF, Capability::INPUT_IMAGE, @@ -1102,6 +1240,7 @@ public function __construct( ], 'deepseek/deepseek-r1-0528-qwen3-8b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 0528 Qwen3 8B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1109,6 +1248,7 @@ public function __construct( ], 'deepseek/deepseek-r1-0528-qwen3-8b' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 0528 Qwen3 8B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1116,6 +1256,7 @@ public function __construct( ], 'deepseek/deepseek-r1-0528:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 0528 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1123,6 +1264,7 @@ public function __construct( ], 'deepseek/deepseek-r1-0528' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 0528', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1130,6 +1272,7 @@ public function __construct( ], 'anthropic/claude-opus-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Opus 4', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1139,6 +1282,7 @@ public function __construct( ], 'anthropic/claude-sonnet-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude Sonnet 4', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1148,6 +1292,7 @@ public function __construct( ], 'mistralai/devstral-small-2505' => [ 'class' => CompletionsModel::class, + 'label' => 'Devstral Small 2505', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1155,6 +1300,7 @@ public function __construct( ], 'google/gemma-3n-e4b-it:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3N E4B IT Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1162,6 +1308,7 @@ public function __construct( ], 'google/gemma-3n-e4b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3N E4B IT', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1169,6 +1316,7 @@ public function __construct( ], 'openai/codex-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'Codex Mini', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1177,6 +1325,7 @@ public function __construct( ], 'nousresearch/deephermes-3-mistral-24b-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'Deephermes 3 Mistral 24B Preview', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1184,6 +1333,7 @@ public function __construct( ], 'mistralai/mistral-medium-3' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Medium 3', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1192,6 +1342,7 @@ public function __construct( ], 'google/gemini-2.5-pro-preview-05-06' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.5 Pro Preview 05 06', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1203,6 +1354,7 @@ public function __construct( ], 'arcee-ai/spotlight' => [ 'class' => CompletionsModel::class, + 'label' => 'Spotlight', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1211,6 +1363,7 @@ public function __construct( ], 'arcee-ai/maestro-reasoning' => [ 'class' => CompletionsModel::class, + 'label' => 'Maestro Reasoning', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1218,6 +1371,7 @@ public function __construct( ], 'arcee-ai/virtuoso-large' => [ 'class' => CompletionsModel::class, + 'label' => 'Virtuoso Large', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1225,6 +1379,7 @@ public function __construct( ], 'arcee-ai/coder-large' => [ 'class' => CompletionsModel::class, + 'label' => 'Coder Large', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1232,6 +1387,7 @@ public function __construct( ], 'microsoft/phi-4-reasoning-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Phi 4 Reasoning Plus', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1239,6 +1395,7 @@ public function __construct( ], 'inception/mercury-coder' => [ 'class' => CompletionsModel::class, + 'label' => 'Mercury Coder', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1246,6 +1403,7 @@ public function __construct( ], 'qwen/qwen3-4b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 4B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1253,6 +1411,7 @@ public function __construct( ], 'deepseek/deepseek-prover-v2' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Prover V2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1260,6 +1419,7 @@ public function __construct( ], 'meta-llama/llama-guard-4-12b' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama Guard 4 12B', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1268,6 +1428,7 @@ public function __construct( ], 'qwen/qwen3-30b-a3b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 30B A3B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1275,6 +1436,7 @@ public function __construct( ], 'qwen/qwen3-30b-a3b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 30B A3B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1282,6 +1444,7 @@ public function __construct( ], 'qwen/qwen3-8b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 8B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1289,6 +1452,7 @@ public function __construct( ], 'qwen/qwen3-14b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 14B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1296,6 +1460,7 @@ public function __construct( ], 'qwen/qwen3-14b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 14B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1303,6 +1468,7 @@ public function __construct( ], 'qwen/qwen3-32b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 32B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1310,6 +1476,7 @@ public function __construct( ], 'qwen/qwen3-235b-a22b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 235B A22B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1317,6 +1484,7 @@ public function __construct( ], 'qwen/qwen3-235b-a22b' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 235B A22B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1324,6 +1492,7 @@ public function __construct( ], 'tngtech/deepseek-r1t-chimera:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1T Chimera Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1331,6 +1500,7 @@ public function __construct( ], 'tngtech/deepseek-r1t-chimera' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1T Chimera', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1338,6 +1508,7 @@ public function __construct( ], 'microsoft/mai-ds-r1:free' => [ 'class' => CompletionsModel::class, + 'label' => 'MAI DS R1 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1345,6 +1516,7 @@ public function __construct( ], 'microsoft/mai-ds-r1' => [ 'class' => CompletionsModel::class, + 'label' => 'MAI DS R1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1352,6 +1524,7 @@ public function __construct( ], 'openai/o4-mini-high' => [ 'class' => CompletionsModel::class, + 'label' => 'O4 Mini High', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1361,6 +1534,7 @@ public function __construct( ], 'openai/o3' => [ 'class' => CompletionsModel::class, + 'label' => 'O3', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1370,6 +1544,7 @@ public function __construct( ], 'openai/o4-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'O4 Mini', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1379,6 +1554,7 @@ public function __construct( ], 'qwen/qwen2.5-coder-7b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 Coder 7B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1386,6 +1562,7 @@ public function __construct( ], 'openai/gpt-4.1' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4.1', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1395,6 +1572,7 @@ public function __construct( ], 'openai/gpt-4.1-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4.1 Mini', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1404,6 +1582,7 @@ public function __construct( ], 'openai/gpt-4.1-nano' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4.1 Nano', 'capabilities' => [ Capability::INPUT_IMAGE, Capability::INPUT_TEXT, @@ -1413,6 +1592,7 @@ public function __construct( ], 'eleutherai/llemma_7b' => [ 'class' => CompletionsModel::class, + 'label' => 'LLeMMA 7B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1420,6 +1600,7 @@ public function __construct( ], 'alfredpros/codellama-7b-instruct-solidity' => [ 'class' => CompletionsModel::class, + 'label' => 'Codellama 7B Instruct Solidity', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1427,6 +1608,7 @@ public function __construct( ], 'arliai/qwq-32b-arliai-rpr-v1:free' => [ 'class' => CompletionsModel::class, + 'label' => 'QwQ 32B Arliai RPR V1 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1434,6 +1616,7 @@ public function __construct( ], 'arliai/qwq-32b-arliai-rpr-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'QwQ 32B Arliai RPR V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1441,6 +1624,7 @@ public function __construct( ], 'x-ai/grok-3-mini-beta' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3 Mini Beta', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1448,6 +1632,7 @@ public function __construct( ], 'x-ai/grok-3-beta' => [ 'class' => CompletionsModel::class, + 'label' => 'Grok 3 Beta', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1455,6 +1640,7 @@ public function __construct( ], 'nvidia/llama-3.1-nemotron-ultra-253b-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 Nemotron Ultra 253B V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1462,6 +1648,7 @@ public function __construct( ], 'meta-llama/llama-4-maverick' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 4 Maverick', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1470,6 +1657,7 @@ public function __construct( ], 'meta-llama/llama-4-scout' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 4 Scout', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1478,6 +1666,7 @@ public function __construct( ], 'qwen/qwen2.5-vl-32b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 VL 32B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1486,6 +1675,7 @@ public function __construct( ], 'qwen/qwen2.5-vl-32b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 VL 32B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1494,6 +1684,7 @@ public function __construct( ], 'deepseek/deepseek-chat-v3-0324:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat V3 0324 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1501,6 +1692,7 @@ public function __construct( ], 'deepseek/deepseek-chat-v3-0324' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat V3 0324', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1508,6 +1700,7 @@ public function __construct( ], 'openai/o1-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'O1 Pro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1517,6 +1710,7 @@ public function __construct( ], 'mistralai/mistral-small-3.1-24b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 3.1 24B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1525,6 +1719,7 @@ public function __construct( ], 'mistralai/mistral-small-3.1-24b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 3.1 24B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1533,6 +1728,7 @@ public function __construct( ], 'allenai/olmo-2-0325-32b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'OLMo 2 0325 32B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1540,6 +1736,7 @@ public function __construct( ], 'google/gemma-3-4b-it:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 4B IT Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1548,6 +1745,7 @@ public function __construct( ], 'google/gemma-3-4b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 4B IT', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1556,6 +1754,7 @@ public function __construct( ], 'google/gemma-3-12b-it:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 12B IT Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1564,6 +1763,7 @@ public function __construct( ], 'google/gemma-3-12b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 12B IT', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1572,6 +1772,7 @@ public function __construct( ], 'cohere/command-a' => [ 'class' => CompletionsModel::class, + 'label' => 'Command A', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1579,6 +1780,7 @@ public function __construct( ], 'openai/gpt-4o-mini-search-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4O Mini Search Preview', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1586,6 +1788,7 @@ public function __construct( ], 'openai/gpt-4o-search-preview' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4O Search Preview', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1593,6 +1796,7 @@ public function __construct( ], 'google/gemma-3-27b-it:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 27B IT Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1601,6 +1805,7 @@ public function __construct( ], 'google/gemma-3-27b-it' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemma 3 27B IT', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1609,6 +1814,7 @@ public function __construct( ], 'thedrummer/skyfall-36b-v2' => [ 'class' => CompletionsModel::class, + 'label' => 'Skyfall 36B V2', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1616,6 +1822,7 @@ public function __construct( ], 'microsoft/phi-4-multimodal-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Phi 4 Multimodal Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1624,6 +1831,7 @@ public function __construct( ], 'perplexity/sonar-reasoning-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar Reasoning Pro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1632,6 +1840,7 @@ public function __construct( ], 'perplexity/sonar-pro' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar Pro', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1640,6 +1849,7 @@ public function __construct( ], 'perplexity/sonar-deep-research' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar Deep Research', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1647,6 +1857,7 @@ public function __construct( ], 'qwen/qwq-32b' => [ 'class' => CompletionsModel::class, + 'label' => 'QwQ 32B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1654,6 +1865,7 @@ public function __construct( ], 'google/gemini-2.0-flash-lite-001' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.0 Flash Lite 001', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1665,6 +1877,7 @@ public function __construct( ], 'anthropic/claude-3.7-sonnet:thinking' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.7 Sonnet Thinking', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1674,6 +1887,7 @@ public function __construct( ], 'anthropic/claude-3.7-sonnet' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.7 Sonnet', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1683,6 +1897,7 @@ public function __construct( ], 'mistralai/mistral-saba' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Saba', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1690,6 +1905,7 @@ public function __construct( ], 'meta-llama/llama-guard-3-8b' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama Guard 3 8B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1697,6 +1913,7 @@ public function __construct( ], 'openai/o3-mini-high' => [ 'class' => CompletionsModel::class, + 'label' => 'O3 Mini High', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_PDF, @@ -1705,6 +1922,7 @@ public function __construct( ], 'google/gemini-2.0-flash-001' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.0 Flash 001', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1716,6 +1934,7 @@ public function __construct( ], 'qwen/qwen-vl-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen VL Plus', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1724,6 +1943,7 @@ public function __construct( ], 'aion-labs/aion-1.0' => [ 'class' => CompletionsModel::class, + 'label' => 'Aion 1.0', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1731,6 +1951,7 @@ public function __construct( ], 'aion-labs/aion-1.0-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'Aion 1.0 Mini', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1738,6 +1959,7 @@ public function __construct( ], 'aion-labs/aion-rp-llama-3.1-8b' => [ 'class' => CompletionsModel::class, + 'label' => 'Aion RP Llama 3.1 8B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1745,6 +1967,7 @@ public function __construct( ], 'qwen/qwen-vl-max' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen VL Max', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1753,6 +1976,7 @@ public function __construct( ], 'qwen/qwen-turbo' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Turbo', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1760,6 +1984,7 @@ public function __construct( ], 'qwen/qwen2.5-vl-72b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 VL 72B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1768,6 +1993,7 @@ public function __construct( ], 'qwen/qwen-plus' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Plus', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1775,6 +2001,7 @@ public function __construct( ], 'qwen/qwen-max' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen Max', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1782,6 +2009,7 @@ public function __construct( ], 'openai/o3-mini' => [ 'class' => CompletionsModel::class, + 'label' => 'O3 Mini', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_PDF, @@ -1790,6 +2018,7 @@ public function __construct( ], 'mistralai/mistral-small-24b-instruct-2501:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 24B Instruct 2501 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1797,6 +2026,7 @@ public function __construct( ], 'mistralai/mistral-small-24b-instruct-2501' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 24B Instruct 2501', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1804,6 +2034,7 @@ public function __construct( ], 'deepseek/deepseek-r1-distill-qwen-32b' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 Distill Qwen 32B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1811,6 +2042,7 @@ public function __construct( ], 'deepseek/deepseek-r1-distill-qwen-14b' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 Distill Qwen 14B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1818,6 +2050,7 @@ public function __construct( ], 'perplexity/sonar-reasoning' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar Reasoning', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1825,6 +2058,7 @@ public function __construct( ], 'perplexity/sonar' => [ 'class' => CompletionsModel::class, + 'label' => 'Sonar', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1833,6 +2067,7 @@ public function __construct( ], 'deepseek/deepseek-r1-distill-llama-70b:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 Distill Llama 70B Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1840,6 +2075,7 @@ public function __construct( ], 'deepseek/deepseek-r1-distill-llama-70b' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 Distill Llama 70B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1847,6 +2083,7 @@ public function __construct( ], 'deepseek/deepseek-r1:free' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1 Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1854,6 +2091,7 @@ public function __construct( ], 'deepseek/deepseek-r1' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek R1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1861,6 +2099,7 @@ public function __construct( ], 'minimax/minimax-01' => [ 'class' => CompletionsModel::class, + 'label' => 'Minimax 01', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1869,6 +2108,7 @@ public function __construct( ], 'mistralai/codestral-2501' => [ 'class' => CompletionsModel::class, + 'label' => 'Codestral 2501', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1876,6 +2116,7 @@ public function __construct( ], 'microsoft/phi-4' => [ 'class' => CompletionsModel::class, + 'label' => 'Phi 4', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1883,6 +2124,7 @@ public function __construct( ], 'sao10k/l3.1-70b-hanami-x1' => [ 'class' => CompletionsModel::class, + 'label' => 'L3.1 70B Hanami X1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1890,6 +2132,7 @@ public function __construct( ], 'deepseek/deepseek-chat' => [ 'class' => CompletionsModel::class, + 'label' => 'DeepSeek Chat', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1897,6 +2140,7 @@ public function __construct( ], 'sao10k/l3.3-euryale-70b' => [ 'class' => CompletionsModel::class, + 'label' => 'L3.3 Euryale 70B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1904,6 +2148,7 @@ public function __construct( ], 'openai/o1' => [ 'class' => CompletionsModel::class, + 'label' => 'O1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1913,6 +2158,7 @@ public function __construct( ], 'cohere/command-r7b-12-2024' => [ 'class' => CompletionsModel::class, + 'label' => 'Command R7B 12 2024', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1920,6 +2166,7 @@ public function __construct( ], 'google/gemini-2.0-flash-exp:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Gemini 2.0 Flash Exp Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1928,6 +2175,7 @@ public function __construct( ], 'meta-llama/llama-3.3-70b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.3 70B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1935,6 +2183,7 @@ public function __construct( ], 'meta-llama/llama-3.3-70b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.3 70B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1942,6 +2191,7 @@ public function __construct( ], 'amazon/nova-lite-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'Nova Lite V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1950,6 +2200,7 @@ public function __construct( ], 'amazon/nova-micro-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'Nova Micro V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1957,6 +2208,7 @@ public function __construct( ], 'amazon/nova-pro-v1' => [ 'class' => CompletionsModel::class, + 'label' => 'Nova Pro V1', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1965,6 +2217,7 @@ public function __construct( ], 'openai/gpt-4o-2024-11-20' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT 4O 2024 11 20', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1974,6 +2227,7 @@ public function __construct( ], 'mistralai/mistral-large-2411' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Large 2411', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1981,6 +2235,7 @@ public function __construct( ], 'mistralai/mistral-large-2407' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Large 2407', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -1988,6 +2243,7 @@ public function __construct( ], 'mistralai/pixtral-large-2411' => [ 'class' => CompletionsModel::class, + 'label' => 'Pixtral Large 2411', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -1996,6 +2252,7 @@ public function __construct( ], 'qwen/qwen-2.5-coder-32b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 Coder 32B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2003,6 +2260,7 @@ public function __construct( ], 'qwen/qwen-2.5-coder-32b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 Coder 32B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2010,6 +2268,7 @@ public function __construct( ], 'raifle/sorcererlm-8x22b' => [ 'class' => CompletionsModel::class, + 'label' => 'Sorcererlm 8x22B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2017,6 +2276,7 @@ public function __construct( ], 'thedrummer/unslopnemo-12b' => [ 'class' => CompletionsModel::class, + 'label' => 'Unslopnemo 12B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2024,6 +2284,7 @@ public function __construct( ], 'anthropic/claude-3.5-haiku-20241022' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Haiku 20241022', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -2033,6 +2294,7 @@ public function __construct( ], 'anthropic/claude-3.5-haiku' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Haiku', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -2041,6 +2303,7 @@ public function __construct( ], 'anthracite-org/magnum-v4-72b' => [ 'class' => CompletionsModel::class, + 'label' => 'Magnum V4 72B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2048,6 +2311,7 @@ public function __construct( ], 'anthropic/claude-3.5-sonnet' => [ 'class' => CompletionsModel::class, + 'label' => 'Claude 3.5 Sonnet', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -2057,6 +2321,7 @@ public function __construct( ], 'mistralai/ministral-3b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ministral 3B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2064,6 +2329,7 @@ public function __construct( ], 'mistralai/ministral-8b' => [ 'class' => CompletionsModel::class, + 'label' => 'Ministral 8B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2071,6 +2337,7 @@ public function __construct( ], 'qwen/qwen-2.5-7b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 7B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2078,6 +2345,7 @@ public function __construct( ], 'nvidia/llama-3.1-nemotron-70b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 Nemotron 70B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2085,6 +2353,7 @@ public function __construct( ], 'inflection/inflection-3-pi' => [ 'class' => CompletionsModel::class, + 'label' => 'Inflection 3 PI', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2092,6 +2361,7 @@ public function __construct( ], 'inflection/inflection-3-productivity' => [ 'class' => CompletionsModel::class, + 'label' => 'Inflection 3 Productivity', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2099,6 +2369,7 @@ public function __construct( ], 'thedrummer/rocinante-12b' => [ 'class' => CompletionsModel::class, + 'label' => 'Rocinante 12B', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2106,6 +2377,7 @@ public function __construct( ], 'meta-llama/llama-3.2-3b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 3B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2113,6 +2385,7 @@ public function __construct( ], 'meta-llama/llama-3.2-3b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 3B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2120,6 +2393,7 @@ public function __construct( ], 'meta-llama/llama-3.2-90b-vision-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 90B Vision Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -2128,6 +2402,7 @@ public function __construct( ], 'meta-llama/llama-3.2-1b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 1B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2135,6 +2410,7 @@ public function __construct( ], 'meta-llama/llama-3.2-11b-vision-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.2 11B Vision Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_IMAGE, @@ -2143,6 +2419,7 @@ public function __construct( ], 'qwen/qwen-2.5-72b-instruct:free' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 72B Instruct Free', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, @@ -2150,6 +2427,7 @@ public function __construct( ], 'qwen/qwen-2.5-72b-instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen 2.5 72B Instruct', 'capabilities' => [ Capability::INPUT_TEXT, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/Ovh/ModelCatalog.php b/src/platform/src/Bridge/Ovh/ModelCatalog.php index fe6330b3be..b9bfc82a43 100644 --- a/src/platform/src/Bridge/Ovh/ModelCatalog.php +++ b/src/platform/src/Bridge/Ovh/ModelCatalog.php @@ -22,13 +22,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'Qwen3Guard-Gen-8B' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Guard Gen 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen3Guard-Gen-0.6B' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Guard Gen 0.6B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -45,6 +47,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen3-Coder-30B-A3B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 Coder 30B A3B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -55,6 +58,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-oss-20b' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-OSS 20B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -65,6 +69,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-oss-120b' => [ 'class' => CompletionsModel::class, + 'label' => 'GPT-OSS 120B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -75,6 +80,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen3-32B' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen3 32B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -85,6 +91,7 @@ public function __construct(array $additionalModels = []) ], 'Mistral-Small-3.2-24B-Instruct-2506' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Small 3.2 24B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -96,6 +103,7 @@ public function __construct(array $additionalModels = []) ], 'Qwen2.5-VL-72B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Qwen2.5 VL 72B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -106,6 +114,7 @@ public function __construct(array $additionalModels = []) ], 'Llama-3.1-8B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.1 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -116,6 +125,7 @@ public function __construct(array $additionalModels = []) ], 'Mistral-7B-Instruct-v0.3' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral 7B Instruct v0.3', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -126,6 +136,7 @@ public function __construct(array $additionalModels = []) ], 'Meta-Llama-3_3-70B-Instruct' => [ 'class' => CompletionsModel::class, + 'label' => 'Llama 3.3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -136,6 +147,7 @@ public function __construct(array $additionalModels = []) ], 'Mistral-Nemo-Instruct-2407' => [ 'class' => CompletionsModel::class, + 'label' => 'Mistral Nemo Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -145,6 +157,7 @@ public function __construct(array $additionalModels = []) ], 'bge-multilingual-gemma2' => [ 'class' => EmbeddingsModel::class, + 'label' => 'BGE Multilingual Gemma2 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, @@ -152,6 +165,7 @@ public function __construct(array $additionalModels = []) ], 'bge-m3' => [ 'class' => EmbeddingsModel::class, + 'label' => 'BGE M3 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::EMBEDDINGS, diff --git a/src/platform/src/Bridge/Perplexity/ModelCatalog.php b/src/platform/src/Bridge/Perplexity/ModelCatalog.php index a6b6aa01bd..c7c582eb21 100644 --- a/src/platform/src/Bridge/Perplexity/ModelCatalog.php +++ b/src/platform/src/Bridge/Perplexity/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'sonar' => [ 'class' => Perplexity::class, + 'label' => 'Sonar', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -38,6 +39,7 @@ public function __construct(array $additionalModels = []) ], 'sonar-pro' => [ 'class' => Perplexity::class, + 'label' => 'Sonar Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -49,6 +51,7 @@ public function __construct(array $additionalModels = []) ], 'sonar-reasoning' => [ 'class' => Perplexity::class, + 'label' => 'Sonar Reasoning', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -60,6 +63,7 @@ public function __construct(array $additionalModels = []) ], 'sonar-reasoning-pro' => [ 'class' => Perplexity::class, + 'label' => 'Sonar Reasoning Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, @@ -71,6 +75,7 @@ public function __construct(array $additionalModels = []) ], 'sonar-deep-research' => [ 'class' => Perplexity::class, + 'label' => 'Sonar Deep Research', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_PDF, diff --git a/src/platform/src/Bridge/Replicate/ModelCatalog.php b/src/platform/src/Bridge/Replicate/ModelCatalog.php index 9958d4fc86..75c2fd97dc 100644 --- a/src/platform/src/Bridge/Replicate/ModelCatalog.php +++ b/src/platform/src/Bridge/Replicate/ModelCatalog.php @@ -21,13 +21,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'llama-3.3-70B-Instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -35,6 +36,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-90b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 90B Vision Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -42,6 +44,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-11b-vision-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 11B Vision Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -49,6 +52,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -56,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-3b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 3B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -63,6 +68,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -70,6 +76,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.2-1b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.2 1B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -77,6 +84,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-405b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 405B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -84,6 +92,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -91,6 +100,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -98,6 +108,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -105,6 +116,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3.1 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -112,6 +124,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-70b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -119,6 +132,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b-instruct' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -126,6 +140,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3-8b' => [ 'class' => Llama::class, + 'label' => 'Llama 3 8B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, diff --git a/src/platform/src/Bridge/Scaleway/ModelCatalog.php b/src/platform/src/Bridge/Scaleway/ModelCatalog.php index 93bb4ea3e4..3bb41a63be 100644 --- a/src/platform/src/Bridge/Scaleway/ModelCatalog.php +++ b/src/platform/src/Bridge/Scaleway/ModelCatalog.php @@ -20,13 +20,14 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'deepseek-r1-distill-llama-70b' => [ 'class' => Scaleway::class, + 'label' => 'DeepSeek R1 Distill Llama 70B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -37,6 +38,7 @@ public function __construct(array $additionalModels = []) ], 'gemma-3-27b-it' => [ 'class' => Scaleway::class, + 'label' => 'Gemma 3 27B IT', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -47,6 +49,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.1-8b-instruct' => [ 'class' => Scaleway::class, + 'label' => 'Llama 3.1 8B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -57,6 +60,7 @@ public function __construct(array $additionalModels = []) ], 'llama-3.3-70b-instruct' => [ 'class' => Scaleway::class, + 'label' => 'Llama 3.3 70B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -67,6 +71,7 @@ public function __construct(array $additionalModels = []) ], 'devstral-small-2505' => [ 'class' => Scaleway::class, + 'label' => 'Devstral Small', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -77,6 +82,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-nemo-instruct-2407' => [ 'class' => Scaleway::class, + 'label' => 'Mistral Nemo Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -87,6 +93,7 @@ public function __construct(array $additionalModels = []) ], 'pixtral-12b-2409' => [ 'class' => Scaleway::class, + 'label' => 'Pixtral 12B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -98,6 +105,7 @@ public function __construct(array $additionalModels = []) ], 'mistral-small-3.2-24b-instruct-2506' => [ 'class' => Scaleway::class, + 'label' => 'Mistral Small 3.2 24B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -108,6 +116,7 @@ public function __construct(array $additionalModels = []) ], 'gpt-oss-120b' => [ 'class' => Scaleway::class, + 'label' => 'GPT-OSS 120B', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -118,6 +127,7 @@ public function __construct(array $additionalModels = []) ], 'qwen3-coder-30b-a3b-instruct' => [ 'class' => Scaleway::class, + 'label' => 'Qwen3 Coder 30B A3B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -128,6 +138,7 @@ public function __construct(array $additionalModels = []) ], 'qwen3-235b-a22b-instruct-2507' => [ 'class' => Scaleway::class, + 'label' => 'Qwen3 235B A22B Instruct', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::OUTPUT_TEXT, @@ -138,6 +149,7 @@ public function __construct(array $additionalModels = []) ], 'bge-multilingual-gemma2' => [ 'class' => Embeddings::class, + 'label' => 'BGE Multilingual Gemma2 (Embeddings)', 'capabilities' => [Capability::INPUT_TEXT, Capability::EMBEDDINGS], ], ]; diff --git a/src/platform/src/Bridge/VertexAi/ModelCatalog.php b/src/platform/src/Bridge/VertexAi/ModelCatalog.php index d747982edf..d97061fbc1 100644 --- a/src/platform/src/Bridge/VertexAi/ModelCatalog.php +++ b/src/platform/src/Bridge/VertexAi/ModelCatalog.php @@ -26,7 +26,7 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { @@ -34,6 +34,7 @@ public function __construct(array $additionalModels = []) // Gemini models 'gemini-3-pro-preview' => [ 'class' => Gemini::class, + 'label' => 'Gemini 3 Pro Preview', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -46,6 +47,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-pro' => [ 'class' => GeminiModel::class, + 'label' => 'Gemini 2.5 Pro', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -59,6 +61,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash' => [ 'class' => GeminiModel::class, + 'label' => 'Gemini 2.5 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -72,6 +75,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash' => [ 'class' => GeminiModel::class, + 'label' => 'Gemini 2.0 Flash', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -84,6 +88,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.5-flash-lite' => [ 'class' => GeminiModel::class, + 'label' => 'Gemini 2.5 Flash Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -97,6 +102,7 @@ public function __construct(array $additionalModels = []) ], 'gemini-2.0-flash-lite' => [ 'class' => GeminiModel::class, + 'label' => 'Gemini 2.0 Flash Lite', 'capabilities' => [ Capability::INPUT_MESSAGES, Capability::INPUT_IMAGE, @@ -110,6 +116,7 @@ public function __construct(array $additionalModels = []) // Embeddings models 'gemini-embedding-001' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Gemini Embedding 001 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, @@ -118,6 +125,7 @@ public function __construct(array $additionalModels = []) ], 'text-embedding-005' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Embedding 005 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, @@ -126,6 +134,7 @@ public function __construct(array $additionalModels = []) ], 'text-multilingual-embedding-002' => [ 'class' => EmbeddingsModel::class, + 'label' => 'Text Multilingual Embedding 002 (Embeddings)', 'capabilities' => [ Capability::INPUT_TEXT, Capability::INPUT_MULTIPLE, diff --git a/src/platform/src/Bridge/Voyage/ModelCatalog.php b/src/platform/src/Bridge/Voyage/ModelCatalog.php index a7fa4efc71..cd571bfa6f 100644 --- a/src/platform/src/Bridge/Voyage/ModelCatalog.php +++ b/src/platform/src/Bridge/Voyage/ModelCatalog.php @@ -17,53 +17,64 @@ final class ModelCatalog extends AbstractModelCatalog { /** - * @param array}> $additionalModels + * @param array}> $additionalModels */ public function __construct(array $additionalModels = []) { $defaultModels = [ 'voyage-3.5' => [ 'class' => Voyage::class, + 'label' => 'Voyage 3.5 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-3.5-lite' => [ 'class' => Voyage::class, + 'label' => 'Voyage 3.5 Lite (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-3' => [ 'class' => Voyage::class, + 'label' => 'Voyage 3 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-3-lite' => [ 'class' => Voyage::class, + 'label' => 'Voyage 3 Lite (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-3-large' => [ 'class' => Voyage::class, + 'label' => 'Voyage 3 Large (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-finance-2' => [ 'class' => Voyage::class, + 'label' => 'Voyage Finance 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-multilingual-2' => [ 'class' => Voyage::class, + 'label' => 'Voyage Multilingual 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-law-2' => [ 'class' => Voyage::class, + 'label' => 'Voyage Law 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-code-3' => [ 'class' => Voyage::class, + 'label' => 'Voyage Code 3 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-code-2' => [ 'class' => Voyage::class, + 'label' => 'Voyage Code 2 (Embeddings)', 'capabilities' => [Capability::INPUT_MULTIPLE, Capability::EMBEDDINGS], ], 'voyage-multimodal-3' => [ 'class' => Voyage::class, + 'label' => 'Voyage Multimodal 3 (Embeddings)', 'capabilities' => [ Capability::INPUT_MULTIPLE, Capability::INPUT_MULTIMODAL, diff --git a/src/platform/src/Model.php b/src/platform/src/Model.php index 86b4f397b4..63ac11fcde 100644 --- a/src/platform/src/Model.php +++ b/src/platform/src/Model.php @@ -20,17 +20,23 @@ class Model { /** * @param non-empty-string $name + * @param non-empty-string $label Human-readable display name * @param Capability[] $capabilities * @param array $options The default options for the model usage */ public function __construct( private readonly string $name, + private readonly string $label, private readonly array $capabilities = [], private readonly array $options = [], ) { if ('' === trim($name)) { throw new InvalidArgumentException('Model name cannot be empty.'); } + + if ('' === trim($label)) { + throw new InvalidArgumentException('Model label cannot be empty.'); + } } /** @@ -41,6 +47,14 @@ public function getName(): string return $this->name; } + /** + * @return non-empty-string + */ + public function getLabel(): string + { + return $this->label; + } + /** * @return Capability[] */ diff --git a/src/platform/src/ModelCatalog/AbstractModelCatalog.php b/src/platform/src/ModelCatalog/AbstractModelCatalog.php index e0d2fd5f4e..9b14d9d900 100644 --- a/src/platform/src/ModelCatalog/AbstractModelCatalog.php +++ b/src/platform/src/ModelCatalog/AbstractModelCatalog.php @@ -22,7 +22,7 @@ abstract class AbstractModelCatalog implements ModelCatalogInterface { /** - * @var array}> + * @var array}> */ protected array $models; @@ -48,7 +48,7 @@ public function getModel(string $modelName): Model throw new InvalidArgumentException(\sprintf('Model class "%s" does not exist.', $modelClass)); } - $model = new $modelClass($actualModelName, $modelConfig['capabilities'], $options); + $model = new $modelClass($actualModelName, $modelConfig['label'], $modelConfig['capabilities'], $options); if (!$model instanceof Model) { throw new InvalidArgumentException(\sprintf('Model class "%s" must extend "%s".', $modelClass, Model::class)); } @@ -57,7 +57,7 @@ public function getModel(string $modelName): Model } /** - * @return array}> + * @return array}> */ public function getModels(): array { diff --git a/src/platform/src/ModelCatalog/ModelCatalogInterface.php b/src/platform/src/ModelCatalog/ModelCatalogInterface.php index b57571c1af..6479433f4f 100644 --- a/src/platform/src/ModelCatalog/ModelCatalogInterface.php +++ b/src/platform/src/ModelCatalog/ModelCatalogInterface.php @@ -25,7 +25,11 @@ interface ModelCatalogInterface public function getModel(string $modelName): Model; /** - * @return array}> + * @return array + * }> */ public function getModels(): array; } diff --git a/src/platform/tests/EventListener/TemplateRendererListenerTest.php b/src/platform/tests/EventListener/TemplateRendererListenerTest.php index 6b4fc0a601..24f5924b10 100644 --- a/src/platform/tests/EventListener/TemplateRendererListenerTest.php +++ b/src/platform/tests/EventListener/TemplateRendererListenerTest.php @@ -37,7 +37,7 @@ protected function setUp(): void ]); $this->listener = new TemplateRendererListener($registry); - $this->model = new Model('gpt-4o'); + $this->model = new Model('gpt-4o', 'GPT-4o'); } public function testRendersTemplateWhenTemplateVarsProvided() diff --git a/src/platform/tests/ModelTest.php b/src/platform/tests/ModelTest.php index 85eca67950..02a808f3a6 100644 --- a/src/platform/tests/ModelTest.php +++ b/src/platform/tests/ModelTest.php @@ -19,21 +19,28 @@ final class ModelTest extends TestCase { public function testReturnsName() { - $model = new Model('gpt-4'); + $model = new Model('gpt-4', 'GPT-4'); $this->assertSame('gpt-4', $model->getName()); } + public function testReturnsLabel() + { + $model = new Model('gpt-4', 'GPT-4'); + + $this->assertSame('GPT-4', $model->getLabel()); + } + public function testReturnsCapabilities() { - $model = new Model('gpt-4', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); + $model = new Model('gpt-4', 'GPT-4', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); $this->assertSame([Capability::INPUT_TEXT, Capability::OUTPUT_TEXT], $model->getCapabilities()); } public function testChecksSupportForCapability() { - $model = new Model('gpt-4', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); + $model = new Model('gpt-4', 'GPT-4', [Capability::INPUT_TEXT, Capability::OUTPUT_TEXT]); $this->assertTrue($model->supports(Capability::INPUT_TEXT)); $this->assertTrue($model->supports(Capability::OUTPUT_TEXT)); @@ -42,7 +49,7 @@ public function testChecksSupportForCapability() public function testReturnsEmptyCapabilitiesByDefault() { - $model = new Model('gpt-4'); + $model = new Model('gpt-4', 'GPT-4'); $this->assertSame([], $model->getCapabilities()); } @@ -53,14 +60,14 @@ public function testReturnsOptions() 'temperature' => 0.7, 'max_tokens' => 1024, ]; - $model = new Model('gpt-4', [], $options); + $model = new Model('gpt-4', 'GPT-4', [], $options); $this->assertSame($options, $model->getOptions()); } public function testReturnsEmptyOptionsByDefault() { - $model = new Model('gpt-4'); + $model = new Model('gpt-4', 'GPT-4'); $this->assertSame([], $model->getOptions()); } diff --git a/src/platform/tests/StructuredOutput/PlatformSubscriberTest.php b/src/platform/tests/StructuredOutput/PlatformSubscriberTest.php index 2e0ec0eb55..ac14908106 100644 --- a/src/platform/tests/StructuredOutput/PlatformSubscriberTest.php +++ b/src/platform/tests/StructuredOutput/PlatformSubscriberTest.php @@ -56,7 +56,7 @@ public function testProcessInputWithOutputStructure() public function testProcessInputWithoutOutputStructure() { $processor = new PlatformSubscriber(new ConfigurableResponseFormatFactory()); - $event = new InvocationEvent(new Model('gpt-4'), new MessageBag()); + $event = new InvocationEvent(new Model('gpt-4', 'GPT-4'), new MessageBag()); $processor->processInput($event); @@ -81,7 +81,7 @@ public function testProcessInputThrowsExceptionWhenLlmDoesNotSupportStructuredOu $processor = new PlatformSubscriber(new ConfigurableResponseFormatFactory()); - $model = new Model('gpt-3'); + $model = new Model('gpt-3', 'GPT-3'); $event = new InvocationEvent($model, new MessageBag(), ['response_format' => SomeStructure::class]); $processor->processInput($event); @@ -277,7 +277,7 @@ public function testProcessOutputWithoutResponseFormat() $converter = new PlainConverter($result = new TextResult('{"some": "data"}')); $deferred = new DeferredResult($converter, new InMemoryRawResult()); - $event = new ResultEvent(new Model('gpt4', [Capability::OUTPUT_STRUCTURED]), $deferred); + $event = new ResultEvent(new Model('gpt4', 'GPT-4', [Capability::OUTPUT_STRUCTURED]), $deferred); $processor->processResult($event); diff --git a/src/platform/tests/StructuredOutput/ResultConverterTest.php b/src/platform/tests/StructuredOutput/ResultConverterTest.php index b769216e01..81b9d61e55 100644 --- a/src/platform/tests/StructuredOutput/ResultConverterTest.php +++ b/src/platform/tests/StructuredOutput/ResultConverterTest.php @@ -104,8 +104,8 @@ public function testConvertSupportsAllModels() $innerConverter = new PlainConverter(new TextResult('{}')); $converter = new ResultConverter($innerConverter, new Serializer()); - $this->assertTrue($converter->supports(new Model('any-model'))); - $this->assertTrue($converter->supports(new Model('gpt-4'))); + $this->assertTrue($converter->supports(new Model('any-model', 'Any Model'))); + $this->assertTrue($converter->supports(new Model('gpt-4', 'GPT-4'))); } public function testConvertReturnsNonTextResultUnchanged() From 28a93ad350a8a8beff588c5c949050fae9375760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= Date: Fri, 20 Feb 2026 08:22:15 +0000 Subject: [PATCH 2/5] Additional fixes --- src/platform/src/Bridge/Albert/ApiClient.php | 2 +- .../src/Bridge/AmazeeAi/ModelApiCatalog.php | 51 ++++++++++++++++++- .../Cartesia/Tests/CartesiaClientTest.php | 2 +- .../Tests/CartesiaResultConverterTest.php | 2 +- .../Tests/TextToSpeech/ModelClientTest.php | 2 +- .../TextToSpeech/ResultConverterTest.php | 2 +- .../Tests/Whisper/ResultConverterTest.php | 2 +- .../Tests/Contract/ToolCallNormalizerTest.php | 2 +- .../Tests/Contract/ToolNormalizerTest.php | 2 +- .../AssistantMessageNormalizerTest.php | 2 +- .../Contract/MessageBagNormalizerTest.php | 2 +- .../ToolCallMessageNormalizerTest.php | 2 +- .../Tests/Contract/ToolNormalizerTest.php | 2 +- .../Contract/UserMessageNormalizerTest.php | 2 +- .../Tests/Embeddings/ModelClientTest.php | 2 +- .../VertexAi/Tests/Gemini/ModelClientTest.php | 4 +- .../Multimodal/CollectionNormalizerTest.php | 2 +- .../Multimodal/ImageNormalizerTest.php | 2 +- .../Multimodal/ImageUrlNormalizerTest.php | 2 +- .../Multimodal/MultimodalNormalizerTest.php | 2 +- .../Multimodal/TextNormalizerTest.php | 2 +- .../src/ModelCatalog/FallbackModelCatalog.php | 2 +- 22 files changed, 71 insertions(+), 24 deletions(-) diff --git a/src/platform/src/Bridge/Albert/ApiClient.php b/src/platform/src/Bridge/Albert/ApiClient.php index 0e274d9c1c..bf3dc32e7e 100644 --- a/src/platform/src/Bridge/Albert/ApiClient.php +++ b/src/platform/src/Bridge/Albert/ApiClient.php @@ -37,6 +37,6 @@ public function getModels(): array 'auth_bearer' => $this->apiKey, ]); - return array_map(static fn (array $model) => new Model($model['id']), $result->toArray()['data']); + return array_map(static fn (array $model) => new Model($model['id'], $model['id']), $result->toArray()['data']); } } diff --git a/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php b/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php index 60dba7d64e..b7a21dd8ee 100644 --- a/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php +++ b/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php @@ -46,7 +46,7 @@ public function getModel(string $modelName): Model } /** - * @return array}> + * @return array}> */ public function getModels(): array { @@ -66,7 +66,7 @@ private function preloadRemoteModels(): void } /** - * @return iterable, capabilities: list}> + * @return iterable, label: string, capabilities: list}> */ private function fetchRemoteModels(): iterable { @@ -85,20 +85,67 @@ private function fetchRemoteModels(): iterable $info = $modelInfo['model_info'] ?? []; $mode = $info['mode'] ?? null; + $label = $this->inferLabel($name, $modelInfo); + if ('embedding' === $mode) { yield $name => [ 'class' => EmbeddingsModel::class, + 'label' => $label, 'capabilities' => $this->buildEmbeddingCapabilities($info), ]; } else { yield $name => [ 'class' => CompletionsModel::class, + 'label' => $label, 'capabilities' => $this->buildCompletionsCapabilities($info), ]; } } } + private function inferLabel(string $name, array $modelInfo): string + { + // Generic static mapping for well-known generic names + $map = [ + 'chat' => 'Chat', + 'embeddings' => 'Embeddings', + 'chat_with_image_vision' => 'Chat With Image Vision', + 'chat_with_complex_json' => 'Chat With Complex JSON', + 'chat_with_image' => 'Chat With Image', + ]; + + if (isset($map[$name])) { + return $map[$name]; + } + + // Prefer explicit model key if available (e.g. anthropic.claude-3-haiku-20240307-v1:0) + $raw = $modelInfo['model_info']['key'] ?? $modelInfo['litellm_params']['model'] ?? $name; + + // Try to extract Claude patterns like "claude-3-5-haiku" or + // anthropic.claude-3-5-sonnet-20240620-v1:0 + if (preg_match('/claude[-._]?([0-9]+)(?:-([0-9]+))?(?:-([a-z]+))?/i', $raw, $m)) { + $major = $m[1] ?? null; + $minor = $m[2] ?? null; + $suffix = $m[3] ?? null; + + $version = $major; + if (null !== $minor) { + $version .= '.'.$minor; + } + + $label = 'Claude '.trim($version); + if ($suffix) { + $label .= ' '.ucfirst($suffix); + } + + return $label; + } + + // Fall back to humanizing the model name (replace -, _, . with spaces and title-case) + $human = str_replace(['-', '_', '.'], ' ', $name); + return ucwords($human); + } + /** * @param array $info * diff --git a/src/platform/src/Bridge/Cartesia/Tests/CartesiaClientTest.php b/src/platform/src/Bridge/Cartesia/Tests/CartesiaClientTest.php index 271022a615..1fa76e57dd 100644 --- a/src/platform/src/Bridge/Cartesia/Tests/CartesiaClientTest.php +++ b/src/platform/src/Bridge/Cartesia/Tests/CartesiaClientTest.php @@ -35,7 +35,7 @@ public function testSupportsModel() ); $this->assertTrue($client->supports(new Cartesia('sonic-3'))); - $this->assertFalse($client->supports(new Model('any-model'))); + $this->assertFalse($client->supports(new Model('any-model', 'Any Model'))); } public function testClientCannotPerformOnInvalidModel() diff --git a/src/platform/src/Bridge/Cartesia/Tests/CartesiaResultConverterTest.php b/src/platform/src/Bridge/Cartesia/Tests/CartesiaResultConverterTest.php index da051c9dda..95c21e6375 100644 --- a/src/platform/src/Bridge/Cartesia/Tests/CartesiaResultConverterTest.php +++ b/src/platform/src/Bridge/Cartesia/Tests/CartesiaResultConverterTest.php @@ -26,7 +26,7 @@ public function testSupportsModel() $converter = new CartesiaResultConverter(); $this->assertTrue($converter->supports(new Cartesia('sonic-3'))); - $this->assertFalse($converter->supports(new Model('any-model'))); + $this->assertFalse($converter->supports(new Model('any-model', 'Any Model'))); } public function testConvertSpeechToTextResponse() diff --git a/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ModelClientTest.php b/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ModelClientTest.php index 3d4dd7303b..f31e214653 100644 --- a/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ModelClientTest.php +++ b/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ModelClientTest.php @@ -37,7 +37,7 @@ public function testSupportsTextToSpeechModel() public function testDoesntSupportOtherModels() { $converter = new ResultConverter(); - $model = new Model('test-model'); + $model = new Model('test-model', 'Test Model'); $this->assertFalse($converter->supports($model)); } diff --git a/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ResultConverterTest.php b/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ResultConverterTest.php index e99b21a673..6f92f81d09 100644 --- a/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ResultConverterTest.php +++ b/src/platform/src/Bridge/OpenAi/Tests/TextToSpeech/ResultConverterTest.php @@ -36,7 +36,7 @@ public function testSupportsTextToSpeechModel() public function testDoesntSupportOtherModels() { $converter = new ResultConverter(); - $model = new Model('test-model'); + $model = new Model('test-model', 'Test Model'); $this->assertFalse($converter->supports($model)); } diff --git a/src/platform/src/Bridge/OpenAi/Tests/Whisper/ResultConverterTest.php b/src/platform/src/Bridge/OpenAi/Tests/Whisper/ResultConverterTest.php index 384f9199c6..295d4c69c5 100644 --- a/src/platform/src/Bridge/OpenAi/Tests/Whisper/ResultConverterTest.php +++ b/src/platform/src/Bridge/OpenAi/Tests/Whisper/ResultConverterTest.php @@ -38,7 +38,7 @@ public function testSupportsWhisperModel() public function testDoesNotSupportOtherModels() { - $this->assertFalse($this->resultConverter->supports(new Model('generic-model'))); + $this->assertFalse($this->resultConverter->supports(new Model('generic-model', 'Generic Model'))); } public function testConvertNonVerboseResult() diff --git a/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolCallNormalizerTest.php b/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolCallNormalizerTest.php index 8d8cc11b28..f23477fb88 100644 --- a/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolCallNormalizerTest.php +++ b/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolCallNormalizerTest.php @@ -50,7 +50,7 @@ public static function supportsNormalizationProvider(): \Generator $gpt = new Gpt('o3'); yield 'supported' => [$toolCall, $gpt, true]; - yield 'unsupported model' => [$toolCall, new Model('foo'), false]; + yield 'unsupported model' => [$toolCall, new Model('foo', 'Foo'), false]; yield 'unsupported data' => [new Text('foo'), $gpt, false]; } } diff --git a/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolNormalizerTest.php b/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolNormalizerTest.php index 5a0e1797a5..3894297e87 100644 --- a/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolNormalizerTest.php +++ b/src/platform/src/Bridge/OpenResponses/Tests/Contract/ToolNormalizerTest.php @@ -81,7 +81,7 @@ public static function supportsNormalizationProvider(): \Generator $gpt = new Gpt('o3'); yield 'supported' => [$tool, $gpt, true]; - yield 'unsupported model' => [$tool, new Model('foo'), false]; + yield 'unsupported model' => [$tool, new Model('foo', 'Foo'), false]; yield 'unsupported data' => [new Text('foo'), $gpt, false]; } } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Contract/AssistantMessageNormalizerTest.php b/src/platform/src/Bridge/VertexAi/Tests/Contract/AssistantMessageNormalizerTest.php index 2871d5ccdf..d90337ed6e 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Contract/AssistantMessageNormalizerTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Contract/AssistantMessageNormalizerTest.php @@ -26,7 +26,7 @@ public function testSupportsNormalization() $normalizer = new AssistantMessageNormalizer(); $this->assertTrue($normalizer->supportsNormalization(new AssistantMessage('Hello'), context: [ - Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro'), + Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro', 'Gemini 2.5 Pro'), ])); $this->assertFalse($normalizer->supportsNormalization('not an assistant message')); } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Contract/MessageBagNormalizerTest.php b/src/platform/src/Bridge/VertexAi/Tests/Contract/MessageBagNormalizerTest.php index 3c49314354..d311d004ba 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Contract/MessageBagNormalizerTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Contract/MessageBagNormalizerTest.php @@ -32,7 +32,7 @@ public function testSupportsNormalization() $normalizer = new MessageBagNormalizer(); $this->assertTrue($normalizer->supportsNormalization(new MessageBag(), context: [ - Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro'), + Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro', 'Gemini 2.5 Pro'), ])); $this->assertFalse($normalizer->supportsNormalization('not a message bag')); } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolCallMessageNormalizerTest.php b/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolCallMessageNormalizerTest.php index e4f402223f..524e238f8d 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolCallMessageNormalizerTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolCallMessageNormalizerTest.php @@ -26,7 +26,7 @@ public function testSupportsNormalization() $normalizer = new ToolCallMessageNormalizer(); $this->assertTrue($normalizer->supportsNormalization(new ToolCallMessage(new ToolCall('', '', []), ''), context: [ - Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro'), + Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro', 'Gemini 2.5 Pro'), ])); $this->assertFalse($normalizer->supportsNormalization('not a tool call')); } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolNormalizerTest.php b/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolNormalizerTest.php index d6278236c8..820842b400 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolNormalizerTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Contract/ToolNormalizerTest.php @@ -32,7 +32,7 @@ public function testSupportsNormalization() $normalizer = new ToolNormalizer(); $this->assertTrue($normalizer->supportsNormalization(new Tool(new ExecutionReference(ToolNoParams::class), 'test', 'test'), context: [ - Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro'), + Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro', 'Gemini 2.5 Pro'), ])); $this->assertFalse($normalizer->supportsNormalization('not a tool')); } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Contract/UserMessageNormalizerTest.php b/src/platform/src/Bridge/VertexAi/Tests/Contract/UserMessageNormalizerTest.php index bf13421e8b..84279c2f8e 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Contract/UserMessageNormalizerTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Contract/UserMessageNormalizerTest.php @@ -30,7 +30,7 @@ public function testSupportsNormalization() $normalizer = new UserMessageNormalizer(); $this->assertTrue($normalizer->supportsNormalization(new UserMessage(new Text('Hello')), context: [ - Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro'), + Contract::CONTEXT_MODEL => new Model('gemini-2.5-pro', 'Gemini 2.5 Pro'), ])); $this->assertFalse($normalizer->supportsNormalization('not a user message')); } diff --git a/src/platform/src/Bridge/VertexAi/Tests/Embeddings/ModelClientTest.php b/src/platform/src/Bridge/VertexAi/Tests/Embeddings/ModelClientTest.php index 6b11786f9e..51194edb5e 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Embeddings/ModelClientTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Embeddings/ModelClientTest.php @@ -31,7 +31,7 @@ public function testItGeneratesTheEmbeddingSuccessfully() $client = new ModelClient($httpClient, 'global', 'test'); - $model = new Model('gemini-embedding-001', options: ['outputDimensionality' => 1536, 'task_type' => TaskType::CLASSIFICATION]); + $model = new Model('gemini-embedding-001', 'Gemini Embedding 001 (Embeddings)', options: ['outputDimensionality' => 1536, 'task_type' => TaskType::CLASSIFICATION]); $result = $client->request($model, 'test payload'); diff --git a/src/platform/src/Bridge/VertexAi/Tests/Gemini/ModelClientTest.php b/src/platform/src/Bridge/VertexAi/Tests/Gemini/ModelClientTest.php index 69bf0662fc..f33b0de122 100644 --- a/src/platform/src/Bridge/VertexAi/Tests/Gemini/ModelClientTest.php +++ b/src/platform/src/Bridge/VertexAi/Tests/Gemini/ModelClientTest.php @@ -35,7 +35,7 @@ public function testItInvokesTheTextModelsSuccessfully() $client = new ModelClient($httpClient, 'global', 'test'); - $result = $client->request(new Model('gemini-2.0-flash'), $payload); + $result = $client->request(new Model('gemini-2.0-flash', 'Gemini 2.0 Flash'), $payload); $data = $result->getData(); $info = $result->getObject()->getInfo(); @@ -77,6 +77,6 @@ function ($method, $url, $options) { ); $client = new ModelClient($httpClient, 'global', 'test'); - $client->request(new Model('gemini-2.0-flash'), $payload, ['server_tools' => ['google_search' => true]]); + $client->request(new Model('gemini-2.0-flash', 'Gemini 2.0 Flash'), $payload, ['server_tools' => ['google_search' => true]]); } } diff --git a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/CollectionNormalizerTest.php b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/CollectionNormalizerTest.php index 13cb086131..c621b13932 100644 --- a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/CollectionNormalizerTest.php +++ b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/CollectionNormalizerTest.php @@ -101,7 +101,7 @@ public static function supportsNormalizationProvider(): \Generator yield 'unsupported model' => [ new Collection(), [ - Contract::CONTEXT_MODEL => new Model('some-model', [Capability::INPUT_MULTIMODAL]), + Contract::CONTEXT_MODEL => new Model('some-model', 'Some Model', [Capability::INPUT_MULTIMODAL]), ], false, ]; diff --git a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageNormalizerTest.php b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageNormalizerTest.php index b3daf88b21..8177cf93f3 100644 --- a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageNormalizerTest.php +++ b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageNormalizerTest.php @@ -56,7 +56,7 @@ public static function supportsNormalizationDataProvider(): \Generator yield 'supported' => [$image, new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), true]; yield 'not an image' => [[], new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), false]; yield 'non-multimodal model' => [$image, new Voyage('voyage-3.5'), false]; - yield 'unsupported model' => [$image, new Model('gpt-40'), false]; + yield 'unsupported model' => [$image, new Model('gpt-40', 'GPT-40'), false]; } private static function getFixtureImage(): Image diff --git a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageUrlNormalizerTest.php b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageUrlNormalizerTest.php index 8f335f718f..79970a0ebd 100644 --- a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageUrlNormalizerTest.php +++ b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/ImageUrlNormalizerTest.php @@ -56,6 +56,6 @@ public static function supportsNormalizationDataProvider(): \Generator yield 'supported' => [$url, new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), true]; yield 'not an image' => [[], new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), false]; yield 'non-multimodal model' => [$url, new Voyage('voyage-3.5'), false]; - yield 'unsupported model' => [$url, new Model('gpt-40'), false]; + yield 'unsupported model' => [$url, new Model('gpt-40', 'GPT-40'), false]; } } diff --git a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/MultimodalNormalizerTest.php b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/MultimodalNormalizerTest.php index d01a04dac3..502b3fc8e1 100644 --- a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/MultimodalNormalizerTest.php +++ b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/MultimodalNormalizerTest.php @@ -98,7 +98,7 @@ public static function supportsNormalizationProvider(): \Generator yield 'unsupported model' => [ [$text], - new Model('some-model', [Capability::INPUT_MULTIMODAL]), + new Model('some-model', 'Some Model', [Capability::INPUT_MULTIMODAL]), false, ]; diff --git a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/TextNormalizerTest.php b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/TextNormalizerTest.php index 08fa7a1449..3ca113cdf8 100644 --- a/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/TextNormalizerTest.php +++ b/src/platform/src/Bridge/Voyage/Tests/Contract/Multimodal/TextNormalizerTest.php @@ -55,6 +55,6 @@ public static function supportsNormalizationDataProvider(): \Generator yield 'supported' => [$text, new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), true]; yield 'not text' => [[], new Voyage('voyage-multimodal-3', [Capability::INPUT_MULTIMODAL]), false]; yield 'non-multimodal model' => [$text, new Voyage('voyage-3.5'), false]; - yield 'unsupported model' => [$text, new Model('gpt-40'), false]; + yield 'unsupported model' => [$text, new Model('gpt-40', 'GPT-40'), false]; } } diff --git a/src/platform/src/ModelCatalog/FallbackModelCatalog.php b/src/platform/src/ModelCatalog/FallbackModelCatalog.php index a4a1fe72c3..684cdbb37d 100644 --- a/src/platform/src/ModelCatalog/FallbackModelCatalog.php +++ b/src/platform/src/ModelCatalog/FallbackModelCatalog.php @@ -34,6 +34,6 @@ public function getModel(string $modelName): Model { $parsed = self::parseModelName($modelName); - return new Model($parsed['name'], Capability::cases(), $parsed['options']); + return new Model($parsed['name'], $parsed['name'], Capability::cases(), $parsed['options']); } } From fb9180e517775169d96feb225e42150fac835648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= Date: Fri, 20 Feb 2026 08:37:29 +0000 Subject: [PATCH 3/5] More fixes --- src/platform/src/Bridge/OpenAi/Embeddings.php | 4 +- src/platform/src/Bridge/OpenAi/Gpt.php | 4 +- src/platform/src/Bridge/OpenAi/Whisper.php | 7 ++++ src/platform/src/Model.php | 38 ++++++++++++++++--- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/platform/src/Bridge/OpenAi/Embeddings.php b/src/platform/src/Bridge/OpenAi/Embeddings.php index b7ab0ef6b1..3f11751e72 100644 --- a/src/platform/src/Bridge/OpenAi/Embeddings.php +++ b/src/platform/src/Bridge/OpenAi/Embeddings.php @@ -21,8 +21,8 @@ class Embeddings extends Model /** * @param array $options */ - public function __construct(string $name, array $capabilities = [], array $options = []) + public function __construct(string $name, ?string $label = null, array $capabilities = [], array $options = []) { - parent::__construct($name, $capabilities, $options); + parent::__construct($name, $label ?? $name, $capabilities, $options); } } diff --git a/src/platform/src/Bridge/OpenAi/Gpt.php b/src/platform/src/Bridge/OpenAi/Gpt.php index 02645c0edf..50be57b8b2 100644 --- a/src/platform/src/Bridge/OpenAi/Gpt.php +++ b/src/platform/src/Bridge/OpenAi/Gpt.php @@ -22,8 +22,8 @@ class Gpt extends ResponsesModel /** * @param array $options The default options for the model usage */ - public function __construct(string $name, array $capabilities = [], array $options = []) + public function __construct(string $name, ?string $label = null, array $capabilities = [], array $options = []) { - parent::__construct($name, $capabilities, $options); + parent::__construct($name, $label ?? $name, $capabilities, $options); } } diff --git a/src/platform/src/Bridge/OpenAi/Whisper.php b/src/platform/src/Bridge/OpenAi/Whisper.php index c0255c4801..58ca8dbd22 100644 --- a/src/platform/src/Bridge/OpenAi/Whisper.php +++ b/src/platform/src/Bridge/OpenAi/Whisper.php @@ -18,4 +18,11 @@ */ class Whisper extends Model { + /** + * @param array $options + */ + public function __construct(string $name, ?string $label = null, array $capabilities = [], array $options = []) + { + parent::__construct($name, $label ?? $name, $capabilities, $options); + } } diff --git a/src/platform/src/Model.php b/src/platform/src/Model.php index 63ac11fcde..f0833bd31f 100644 --- a/src/platform/src/Model.php +++ b/src/platform/src/Model.php @@ -18,25 +18,53 @@ */ class Model { + private readonly string $name; + private readonly string $label; + /** + * @var Capability[] + */ + private readonly array $capabilities; + /** + * @var array + */ + private readonly array $options; /** * @param non-empty-string $name - * @param non-empty-string $label Human-readable display name + * @param non-empty-string|array|null $labelOrCapabilities + * Either the human-readable label (string) or the capabilities array (legacy callers) * @param Capability[] $capabilities * @param array $options The default options for the model usage */ public function __construct( - private readonly string $name, - private readonly string $label, - private readonly array $capabilities = [], - private readonly array $options = [], + string $name, + mixed $labelOrCapabilities = null, + array $capabilities = [], + array $options = [], ) { + $this->name = $name; + $this->options = $options; + if ('' === trim($name)) { throw new InvalidArgumentException('Model name cannot be empty.'); } + // Backwards-compatible handling: when callers passed capabilities as the second argument + if (null === $labelOrCapabilities) { + $label = $name; + } elseif (\is_array($labelOrCapabilities)) { + $label = $name; + $capabilities = $labelOrCapabilities; + } else { + $label = (string) $labelOrCapabilities; + } + if ('' === trim($label)) { throw new InvalidArgumentException('Model label cannot be empty.'); } + + // assign resolved label to readonly property via reflection-like approach + $this->label = $label; + $this->capabilities = $capabilities; } /** From 2218d1424b38ba1ea7fb86fb39a88bb130e998a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= Date: Fri, 20 Feb 2026 09:39:05 +0100 Subject: [PATCH 4/5] CS fixes --- .../src/Bridge/AmazeeAi/ModelApiCatalog.php | 1 + src/platform/src/Bridge/Anthropic/ModelCatalog.php | 2 +- src/platform/src/Bridge/OpenAi/Whisper.php | 14 +++++++------- src/platform/src/Model.php | 9 +++++---- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php b/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php index b7a21dd8ee..62aaa18529 100644 --- a/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php +++ b/src/platform/src/Bridge/AmazeeAi/ModelApiCatalog.php @@ -143,6 +143,7 @@ private function inferLabel(string $name, array $modelInfo): string // Fall back to humanizing the model name (replace -, _, . with spaces and title-case) $human = str_replace(['-', '_', '.'], ' ', $name); + return ucwords($human); } diff --git a/src/platform/src/Bridge/Anthropic/ModelCatalog.php b/src/platform/src/Bridge/Anthropic/ModelCatalog.php index d115986d54..26557eaac2 100644 --- a/src/platform/src/Bridge/Anthropic/ModelCatalog.php +++ b/src/platform/src/Bridge/Anthropic/ModelCatalog.php @@ -154,7 +154,7 @@ public function __construct(array $additionalModels = []) Capability::TOOL_CALLING, ], ], - 'claude-opus-4-1-20250805' =>[ 'class' => Claude::class, + 'claude-opus-4-1-20250805' => ['class' => Claude::class, 'label' => 'Claude Opus 4.1', 'capabilities' => [ Capability::INPUT_MESSAGES, diff --git a/src/platform/src/Bridge/OpenAi/Whisper.php b/src/platform/src/Bridge/OpenAi/Whisper.php index 58ca8dbd22..e3996a7b84 100644 --- a/src/platform/src/Bridge/OpenAi/Whisper.php +++ b/src/platform/src/Bridge/OpenAi/Whisper.php @@ -18,11 +18,11 @@ */ class Whisper extends Model { - /** - * @param array $options - */ - public function __construct(string $name, ?string $label = null, array $capabilities = [], array $options = []) - { - parent::__construct($name, $label ?? $name, $capabilities, $options); - } + /** + * @param array $options + */ + public function __construct(string $name, ?string $label = null, array $capabilities = [], array $options = []) + { + parent::__construct($name, $label ?? $name, $capabilities, $options); + } } diff --git a/src/platform/src/Model.php b/src/platform/src/Model.php index f0833bd31f..3d01ae823c 100644 --- a/src/platform/src/Model.php +++ b/src/platform/src/Model.php @@ -28,12 +28,13 @@ class Model * @var array */ private readonly array $options; + /** - * @param non-empty-string $name + * @param non-empty-string $name * @param non-empty-string|array|null $labelOrCapabilities - * Either the human-readable label (string) or the capabilities array (legacy callers) - * @param Capability[] $capabilities - * @param array $options The default options for the model usage + * Either the human-readable label (string) or the capabilities array (legacy callers) + * @param Capability[] $capabilities + * @param array $options The default options for the model usage */ public function __construct( string $name, From fbecfe5ea2ba5b0b9e014fcae7b50fcef3f5ae79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dezs=C5=91=20BICZ=C3=93?= Date: Fri, 20 Feb 2026 08:46:55 +0000 Subject: [PATCH 5/5] More fixes --- src/platform/tests/ModelCatalog/AbstractModelCatalogTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/tests/ModelCatalog/AbstractModelCatalogTest.php b/src/platform/tests/ModelCatalog/AbstractModelCatalogTest.php index d00bc97d54..4b6f5cad89 100644 --- a/src/platform/tests/ModelCatalog/AbstractModelCatalogTest.php +++ b/src/platform/tests/ModelCatalog/AbstractModelCatalogTest.php @@ -166,6 +166,7 @@ public function __construct() $this->models = [ 'test-model' => [ 'class' => Model::class, + 'label' => 'Test Model', 'capabilities' => [Capability::INPUT_TEXT], ], ];