Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/services/providers/adapter_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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",
Expand Down
40 changes: 40 additions & 0 deletions app/services/providers/gemini_openai_adapter.py
Original file line number Diff line number Diff line change
@@ -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 {})
10 changes: 10 additions & 0 deletions app/services/providers/google_adapter.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Loading