xtc-backend / app /providers /resolver.py
a3216's picture
deploy: initial release to Hugging Face Spaces
36fae79
Raw
History Blame Contribute Delete
1.77 kB
"""厂商解析:按 provider id / modelPrefix / 默认厂商定位。"""
from __future__ import annotations
from typing import Optional
from ..models.config import AppConfig, Provider
from ..errors import HttpError
def resolve_provider(
config: AppConfig,
*,
provider_id: Optional[str] = None,
model: Optional[str] = None,
) -> Provider:
"""按优先级解析厂商:显式 id > modelPrefix 匹配 > 默认厂商。"""
# 1. 显式 provider_id
if provider_id:
p = config.find_provider(provider_id)
if not p:
raise HttpError(
f"Provider not found or disabled: {provider_id}",
status=404,
code="not_found",
)
return p
# 2. modelPrefix 匹配
if model:
for p in config.providers:
if not p.enabled or not p.model_prefix:
continue
if model.startswith(p.model_prefix):
return p
# 3. 默认厂商
default = config.find_default_provider()
if not default:
raise HttpError(
"No enabled provider configured. Add one in /admin.",
status=503,
code="service_unavailable",
)
return default
def normalize_model(provider: Provider, model: Optional[str], *, fallback: Optional[str] = None) -> str:
"""剥离 provider 前缀,回退到默认模型。"""
if model:
if provider.model_prefix and model.startswith(provider.model_prefix):
return model[len(provider.model_prefix):]
return model
if fallback:
return fallback
if provider.type == "gemini":
from ..config import GEMINI_DEFAULT_MODEL
return GEMINI_DEFAULT_MODEL
return "gpt-4o-mini"