From de200b9404e8c6602e835154e1c713c844bcacdb Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 24 Mar 2025 07:04:47 +0000 Subject: [PATCH] Fix #2451: Add support for OpenRouter as an embedding provider Co-Authored-By: Joe Moura --- .../utilities/embedding_configurator.py | 13 +++++++ .../utilities/test_embedding_configurator.py | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 tests/utilities/test_embedding_configurator.py diff --git a/src/crewai/utilities/embedding_configurator.py b/src/crewai/utilities/embedding_configurator.py index e523b60f0..5f27211ac 100644 --- a/src/crewai/utilities/embedding_configurator.py +++ b/src/crewai/utilities/embedding_configurator.py @@ -19,6 +19,7 @@ class EmbeddingConfigurator: "huggingface": self._configure_huggingface, "watson": self._configure_watson, "custom": self._configure_custom, + "openrouter": self._configure_openrouter, } def configure_embedder( @@ -210,6 +211,18 @@ class EmbeddingConfigurator: return WatsonEmbeddingFunction() + @staticmethod + def _configure_openrouter(config, model_name): + from chromadb.utils.embedding_functions.openai_embedding_function import ( + OpenAIEmbeddingFunction, + ) + + return OpenAIEmbeddingFunction( + api_key=config.get("api_key") or os.getenv("OPENROUTER_API_KEY"), + api_base=config.get("api_base", "https://openrouter.ai/api/v1"), + model_name=model_name, + ) + @staticmethod def _configure_custom(config): custom_embedder = config.get("embedder") diff --git a/tests/utilities/test_embedding_configurator.py b/tests/utilities/test_embedding_configurator.py new file mode 100644 index 000000000..842a1c1fc --- /dev/null +++ b/tests/utilities/test_embedding_configurator.py @@ -0,0 +1,35 @@ +import os +import pytest +from unittest.mock import patch, MagicMock + +from crewai.utilities.embedding_configurator import EmbeddingConfigurator + + +def test_openrouter_embedder_configuration(): + # Setup + configurator = EmbeddingConfigurator() + mock_openai_embedding = MagicMock() + + with patch( + "chromadb.utils.embedding_functions.openai_embedding_function.OpenAIEmbeddingFunction", + return_value=mock_openai_embedding, + ) as mock_embedder: + # Test with provided config + embedder_config = { + "provider": "openrouter", + "config": { + "api_key": "test-key", + "model": "test-model", + }, + } + + # Execute + result = configurator.configure_embedder(embedder_config) + + # Verify + assert result == mock_openai_embedding + mock_embedder.assert_called_once_with( + api_key="test-key", + api_base="https://openrouter.ai/api/v1", + model_name="test-model", + )