Feat: openrouter embedding (#17213)

This commit is contained in:
Lynn
2026-07-22 13:17:52 +08:00
committed by GitHub
parent 675c86a7c3
commit fc7d4bdf98

View File

@@ -1323,3 +1323,42 @@ class NewAPIEmbed(OpenAIEmbed):
raise ValueError("url cannot be None")
self.client = OpenAI(api_key=key, base_url=base_url)
self.model_name = model_name.split("___")[0]
class OpenRouterEmbed(Base):
_FACTORY_NAME = "OpenRouter"
def __init__(self, key, model_name, base_url="https://openrouter.ai/api/v1", **kwargs):
if not base_url:
base_url = "https://openrouter.ai/api/v1"
self.base_url = ensure_v1(base_url)
try:
payload = json.loads(key)
except (JSONDecodeError, TypeError):
api_key = key
provider_order = ""
else:
if isinstance(payload, dict):
api_key = payload.get("api_key", "")
provider_order = payload.get("provider_order", "")
else:
api_key = key
provider_order = ""
self.client = OpenAI(api_key=api_key, base_url=self.base_url)
self.model_name = model_name
self.provider_order = provider_order
def _call(self, batch):
extra_body = {"drop_params": True}
if self.provider_order:
order = [s.strip() for s in self.provider_order.split(",") if s.strip()]
extra_body["provider"] = {"order": order, "allow_fallbacks": False}
res = self.client.embeddings.create(input=batch, model=self.model_name, encoding_format="float", extra_body=extra_body)
return [d.embedding for d in _sorted_by_index(res.data)], total_token_count_from_response(res)
def encode(self, texts: list):
return self._batched_encode(texts, self._call, batch_size=16, truncate_to=8191)
def encode_queries(self, text):
vectors, token_count = self._batched_encode([text], self._call, batch_size=16, truncate_to=8191)
return vectors[0], token_count