From 355f8601c11ff0fdbb671e7738c276ddf6e54109 Mon Sep 17 00:00:00 2001 From: 9qeklajc Date: Wed, 3 Dec 2025 21:58:31 +0100 Subject: [PATCH] embedding integration --- routstr/payment/models.py | 30 ++++++++++++++++++++++++------ routstr/upstream/base.py | 33 +++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/routstr/payment/models.py b/routstr/payment/models.py index 2e3fbd9c..d14b6c58 100644 --- a/routstr/payment/models.py +++ b/routstr/payment/models.py @@ -116,12 +116,30 @@ async def async_fetch_openrouter_models(source_filter: str | None = None) -> lis try: async with httpx.AsyncClient() as client: - response = await client.get(f"{base_url}/models", timeout=30) - response.raise_for_status() - data = response.json() + models_response, embeddings_response = await asyncio.gather( + client.get(f"{base_url}/models", timeout=30), + client.get(f"{base_url}/embeddings/models", timeout=30), + return_exceptions=True + ) + + def process_models_response(response): + if not isinstance(response, Exception): + response.raise_for_status() + data = response.json() + return [ + model + for model in data.get("data", []) + if ":free" not in model.get("id", "").lower() + ] + return [] models_data: list[dict] = [] - for model in data.get("data", []): + models_data.extend(process_models_response(models_response)) + models_data.extend(process_models_response(embeddings_response)) + + # Apply source filter and exclusions + filtered_models = [] + for model in models_data: model_id = model.get("id", "") if source_filter: @@ -139,9 +157,9 @@ async def async_fetch_openrouter_models(source_filter: str | None = None) -> lis ): continue - models_data.append(model) + filtered_models.append(model) - return models_data + return filtered_models except Exception as e: logger.error(f"Error (async) fetching models from OpenRouter API: {e}") return [] diff --git a/routstr/upstream/base.py b/routstr/upstream/base.py index d891c7ac..c39b4e91 100644 --- a/routstr/upstream/base.py +++ b/routstr/upstream/base.py @@ -1780,15 +1780,32 @@ class BaseUpstreamProvider: async def _fetch_openrouter_models(self) -> list[dict]: """Fetch models from OpenRouter API.""" url = "https://openrouter.ai/api/v1/models" + embeddings_url = "https://openrouter.ai/api/v1/embeddings/models" + async with httpx.AsyncClient(timeout=30.0) as client: - response = await client.get(url) - response.raise_for_status() - models = response.json() - return [ - model - for model in models.get("data", []) - if ":free" not in model.get("id", "").lower() - ] + models_response, embeddings_response = await asyncio.gather( + client.get(url), + client.get(embeddings_url), + return_exceptions=True + ) + + all_models = [] + + def process_models_response(response): + if not isinstance(response, Exception): + response.raise_for_status() + data = response.json() + return [ + model + for model in data.get("data", []) + if ":free" not in model.get("id", "").lower() + ] + return [] + + all_models.extend(process_models_response(models_response)) + all_models.extend(process_models_response(embeddings_response)) + + return all_models async def _fetch_provider_models(self) -> dict: """Fetch models from provider's API."""