diff --git a/app/services/providers/adapter_factory.py b/app/services/providers/adapter_factory.py index e98bb32..b8ca83b 100644 --- a/app/services/providers/adapter_factory.py +++ b/app/services/providers/adapter_factory.py @@ -7,13 +7,13 @@ from .bedrock_adapter import BedrockAdapter from .cohere_adapter import CohereAdapter from .fireworks_adapter import FireworksAdapter -from .google_adapter import GoogleAdapter from .mock_adapter import MockAdapter from .openai_adapter import OpenAIAdapter from .perplexity_adapter import PerplexityAdapter from .tensorblock_adapter import TensorblockAdapter from .zhipu_adapter import ZhipuAdapter from .vertex_adapter import VertexAdapter +from .gemini_openai_adapter import GeminiOpenAIAdapter class ProviderAdapterFactory: @@ -34,7 +34,7 @@ class ProviderAdapterFactory: }, "gemini": { "base_url": "https://generativelanguage.googleapis.com/v1beta", - "adapter": GoogleAdapter, + "adapter": GeminiOpenAIAdapter, }, "xai": { "base_url": "https://api.x.ai/v1", diff --git a/app/services/providers/gemini_openai_adapter.py b/app/services/providers/gemini_openai_adapter.py new file mode 100644 index 0000000..c7af314 --- /dev/null +++ b/app/services/providers/gemini_openai_adapter.py @@ -0,0 +1,40 @@ +from typing import Any + +from app.core.logger import get_logger +from .openai_adapter import OpenAIAdapter + +# Configure logging +logger = get_logger(name="gemini_openai_adapter") + + +class GeminiOpenAIAdapter(OpenAIAdapter): + """Adapter for Google Gemini via the OpenAI-compatible endpoint + + Google now exposes Gemini models behind an OpenAI-compatible REST surface at + https://generativelanguage.googleapis.com/v1beta/openai/… + + We can therefore reuse all logic in OpenAIAdapter. The only wrinkle is that + callers might supply the base_url without the trailing `/openai` segment, + so we normalise it here. + """ + + def __init__( + self, + provider_name: str, + base_url: str | None, + config: dict[str, Any] | None = None, + ): + # Default base URL if none supplied + if not base_url: + base_url = "https://generativelanguage.googleapis.com/v1beta" + + # Ensure the URL ends with the OpenAI compatibility suffix + base_url = base_url.rstrip("/") + if not base_url.endswith("/openai"): + base_url = f"{base_url}/openai" + + logger.debug( + "Initialised GeminiOpenAIAdapter with base_url=%s", base_url + ) + + super().__init__(provider_name, base_url, config=config or {}) \ No newline at end of file diff --git a/app/services/providers/google_adapter.py b/app/services/providers/google_adapter.py index 8a44820..1b5cbf3 100644 --- a/app/services/providers/google_adapter.py +++ b/app/services/providers/google_adapter.py @@ -1,3 +1,13 @@ +"""DEPRECATED – legacy Google Gemini adapter + +This class predates Google’s official OpenAI-compatible endpoint. All new code +should use `GeminiOpenAIAdapter` instead (see `gemini_openai_adapter.py`), which +wraps the same functionality via the standardized REST surface. + +`GoogleAdapter` is retained temporarily to avoid breaking existing integrations +and for reference while migrating any bespoke features that haven’t yet been +replicated in the new adapter. **It will be removed in a future release.** +""" import asyncio import json import os