diff --git a/.env.example b/.env.example index 44ef9b936..e3cfad573 100644 --- a/.env.example +++ b/.env.example @@ -45,6 +45,15 @@ CYPHER_ENDPOINT=http://localhost:11434/v1 # CYPHER_MODEL=gemini-2.5-flash # CYPHER_API_KEY=your-google-api-key +# Example 6: All DeepSeek +# ORCHESTRATOR_PROVIDER=deepseek +# ORCHESTRATOR_MODEL=deepseek-reasoner +# ORCHESTRATOR_API_KEY=sk-your-deepseek-key + +# CYPHER_PROVIDER=deepseek +# CYPHER_MODEL=deepseek-chat +# CYPHER_API_KEY=sk-your-deepseek-key + # Memgraph settings MEMGRAPH_HOST=localhost MEMGRAPH_PORT=7687 diff --git a/README.md b/README.md index bf8a1c628..8ce4b1bb8 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,19 @@ CYPHER_MODEL=gemini-2.5-flash CYPHER_API_KEY=your-google-api-key ``` -#### Option 4: Mixed Providers +#### Option 4: All Deepseek Models +```bash +# .env file +ORCHESTRATOR_PROVIDER=deepseek +ORCHESTRATOR_MODEL=deepseek-reasoner +ORCHESTRATOR_API_KEY=sk-your-deepseek-key + +CYPHER_PROVIDER=deepseek +CYPHER_MODEL=deepseek-chat +CYPHER_API_KEY=sk-your-deepseek-key +``` + +#### Option 5: Mixed Providers ```bash # .env file - Google orchestrator + Ollama cypher ORCHESTRATOR_PROVIDER=google @@ -555,8 +567,8 @@ Configuration is managed through environment variables in `.env` file: ### Provider-Specific Settings #### Orchestrator Model Configuration -- `ORCHESTRATOR_PROVIDER`: Provider name (`google`, `openai`, `ollama`) -- `ORCHESTRATOR_MODEL`: Model ID (e.g., `gemini-2.5-pro`, `gpt-4o`, `llama3.2`) +- `ORCHESTRATOR_PROVIDER`: Provider name (`google`, `openai`, `deepseek`, `ollama`) +- `ORCHESTRATOR_MODEL`: Model ID (e.g., `gemini-2.5-pro`, `gpt-4o`, `deepseek-reasoner`, `llama3.2`) - `ORCHESTRATOR_API_KEY`: API key for the provider (if required) - `ORCHESTRATOR_ENDPOINT`: Custom endpoint URL (if required) - `ORCHESTRATOR_PROJECT_ID`: Google Cloud project ID (for Vertex AI) @@ -566,8 +578,8 @@ Configuration is managed through environment variables in `.env` file: - `ORCHESTRATOR_SERVICE_ACCOUNT_FILE`: Path to service account file (for Vertex AI) #### Cypher Model Configuration -- `CYPHER_PROVIDER`: Provider name (`google`, `openai`, `ollama`) -- `CYPHER_MODEL`: Model ID (e.g., `gemini-2.5-flash`, `gpt-4o-mini`, `codellama`) +- `CYPHER_PROVIDER`: Provider name (`google`, `openai`, `deepseek`, `ollama`) +- `CYPHER_MODEL`: Model ID (e.g., `gemini-2.5-flash`, `gpt-4o-mini`, `deepseek-chat`, `codellama`) - `CYPHER_API_KEY`: API key for the provider (if required) - `CYPHER_ENDPOINT`: Custom endpoint URL (if required) - `CYPHER_PROJECT_ID`: Google Cloud project ID (for Vertex AI) diff --git a/codebase_rag/providers/base.py b/codebase_rag/providers/base.py index d525c1e27..e83d3c4ef 100644 --- a/codebase_rag/providers/base.py +++ b/codebase_rag/providers/base.py @@ -125,6 +125,37 @@ def create_model(self, model_id: str, **kwargs: Any) -> OpenAIResponsesModel: return OpenAIResponsesModel(model_id, provider=provider, **kwargs) +class DeepSeekProvider(ModelProvider): + """DeepSeek provider.""" + + def __init__( + self, + api_key: str | None = None, + endpoint: str = "https://api.deepseek.com", + **kwargs: Any, + ) -> None: + super().__init__(**kwargs) + self.api_key = api_key + self.endpoint = endpoint + + @property + def provider_name(self) -> str: + return "deepseek" + + def validate_config(self) -> None: + if not self.api_key: + raise ValueError( + "DeepSeek provider requires api_key. " + "Set ORCHESTRATOR_API_KEY or CYPHER_API_KEY in .env file." + ) + + def create_model(self, model_id: str, **kwargs: Any) -> OpenAIModel: + self.validate_config() + + provider = PydanticOpenAIProvider(api_key=self.api_key, base_url=self.endpoint) + return OpenAIModel(model_id, provider=provider, **kwargs) + + class OllamaProvider(ModelProvider): """Ollama local provider.""" @@ -164,6 +195,7 @@ def create_model(self, model_id: str, **kwargs: Any) -> OpenAIModel: "google": GoogleProvider, "openai": OpenAIProvider, "ollama": OllamaProvider, + "deepseek": DeepSeekProvider, }