feat(#875): LLM Router shadow mode + consolidate litellm master key

This commit is contained in:
QihuAI Design committed 2026-08-04 13:16:30 +08:00
1 parent 037c965c26
commit 180409d317
3 files changed
+390 -5

No files matched your search

+28 -1
View File
@@ -193,6 +193,23 @@ from ..middleware.log_service import LogService
from ..capability_registry import resolve_auto_model
try:
from ..core.llm_router import (
resolve_api_key as _llm_resolve_api_key,
route as _llm_route,
set_route_ctx as _set_route_ctx,
SHADOW as _LLM_ROUTER_SHADOW,
)
except Exception as _llm_router_err:
import os as _os, logging as _logging
_logging.getLogger(__name__).warning(f"[chat] llm_router import failed, router disabled: {_llm_router_err}")
def _llm_resolve_api_key(api_url, model_api_key, provider_api_key):
if api_url and "qihu-aiflow-litellm" in api_url:
return _os.environ.get("LITELLM_MASTER_KEY") or "sk-litellm-master-key-aiflow-2026"
return model_api_key or provider_api_key
_llm_route = None
_set_route_ctx = None
_LLM_ROUTER_SHADOW = True
@@ -2820,6 +2837,16 @@ async def _send_message_core(
_try_models.extend([m for m in _fallbacks if m not in _try_models])
# ===== LLM Router(#875 影子模式)=====
try:
if _llm_route is not None:
_set_route_ctx(tenant_id=getattr(current_user, "tenant_id", "") or "", claw_type="web")
_rm = _llm_route("text", db=db, legacy_primary=_try_models[0].name if _try_models else None)
if not _LLM_ROUTER_SHADOW and _rm.models:
_try_models = _rm.models
except Exception as _e:
logger.warning(f"[chat] LLM Router 观测失败(降级忽略): {_e}")
_retry_log = []
_all_failed = False
@@ -3082,8 +3109,8 @@ async def _send_message_core(
# 2026-07-29 fix: 调用 LiteLLM 端点时,必须用 master key (sk-litellm-...) 而非模型自身 key (tp-c...)
# LiteLLM 内置每个 model 的真实 key 在 litellm_config.yaml,chat 不应直接传模型的 key
api_key = _llm_resolve_api_key(api_url, api_key, provider.api_key if provider else None)
if api_url and "qihu-aiflow-litellm" in api_url:
api_key = os.environ.get("LITELLM_MASTER_KEY") or "sk-litellm-master-key-aiflow-2026"
auth_header = None # 用默认 Authorization: Bearer
logger.info("[chat] LiteLLM endpoint detected, using master key instead of model key")