From 09bca1f73bccaea9c68ac7fceac1809ca7ba5b70 Mon Sep 17 00:00:00 2001 From: Damian Date: Fri, 20 Jun 2025 22:14:39 +0200 Subject: [PATCH] feat: add support for OpenRouter in configuration Resolves #88 --- src/DependencyInjection/Configuration.php | 5 +++++ src/DependencyInjection/LlmChainExtension.php | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 2612045..c5e2454 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -53,6 +53,11 @@ public function getConfigTreeBuilder(): TreeBuilder ->scalarNode('api_key')->isRequired()->end() ->end() ->end() + ->arrayNode('openrouter') + ->children() + ->scalarNode('api_key')->isRequired()->end() + ->end() + ->end() ->end() ->end() ->arrayNode('chain') diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index 731b5ea..03a8678 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -28,7 +28,9 @@ use PhpLlm\LlmChain\Platform\Bridge\OpenAI\Embeddings; use PhpLlm\LlmChain\Platform\Bridge\OpenAI\GPT; use PhpLlm\LlmChain\Platform\Bridge\OpenAI\PlatformFactory as OpenAIPlatformFactory; +use PhpLlm\LlmChain\Platform\Bridge\OpenRouter\PlatformFactory as OpenRouterPlatformFactory; use PhpLlm\LlmChain\Platform\Bridge\Voyage\Voyage; +use PhpLlm\LlmChain\Platform\Model; use PhpLlm\LlmChain\Platform\ModelClientInterface; use PhpLlm\LlmChain\Platform\Platform; use PhpLlm\LlmChain\Platform\PlatformInterface; @@ -204,6 +206,21 @@ private function processPlatformConfig(string $type, array $platform, ContainerB return; } + if ('openrouter' === $type) { + $platformId = 'llm_chain.platform.openrouter'; + $definition = (new Definition(Platform::class)) + ->setFactory(OpenRouterPlatformFactory::class.'::create') + ->setAutowired(true) + ->setLazy(true) + ->addTag('proxy', ['interface' => PlatformInterface::class]) + ->setArguments(['$apiKey' => $platform['api_key']]) + ->addTag('llm_chain.platform'); + + $container->setDefinition($platformId, $definition); + + return; + } + if ('mistral' === $type) { $platformId = 'llm_chain.platform.mistral'; $definition = (new Definition(Platform::class)) @@ -236,6 +253,7 @@ private function processChainConfig(string $name, array $config, ContainerBuilde 'llama' => Llama::class, 'gemini' => Gemini::class, 'mistral' => Mistral::class, + 'openrouter' => Model::class, default => throw new \InvalidArgumentException(sprintf('Model "%s" is not supported.', $modelName)), }; $modelDefinition = new Definition($modelClass);