43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any, Dict
|
|
|
|
__all__ = ["detect_vendor"]
|
|
|
|
|
|
def detect_vendor(payload: Dict[str, Any] | None) -> str:
|
|
"""
|
|
Определение вендора по форме payload.
|
|
Возвращает одно из: "openai" | "gemini" | "claude" | "unknown".
|
|
|
|
Правила (порядок важен):
|
|
- Anthropic (Claude):
|
|
* наличие ключа "anthropic_version" (официальный заголовок/поле)
|
|
* явный маркер provider == "anthropic"
|
|
- Gemini:
|
|
* наличие "contents" или "generationConfig" (Google AI Studio / Vertex)
|
|
- OpenAI:
|
|
* наличие "messages" или "model"
|
|
- Фоллбэк: "unknown"
|
|
"""
|
|
if not isinstance(payload, dict):
|
|
return "unknown"
|
|
|
|
# Явные подсказки, если заранее указали
|
|
hint = str(payload.get("vendor_format") or payload.get("vendor") or "").lower()
|
|
if hint in {"openai", "gemini", "claude"}:
|
|
return hint
|
|
|
|
# Anthropic (Claude)
|
|
if "anthropic_version" in payload or payload.get("provider") == "anthropic":
|
|
return "claude"
|
|
|
|
# Gemini (Google)
|
|
if "contents" in payload or "generationConfig" in payload:
|
|
return "gemini"
|
|
|
|
# OpenAI
|
|
if "messages" in payload or "model" in payload:
|
|
return "openai"
|
|
|
|
return "unknown" |