V10.538 對齊 ai_calls ollama_other provider
All checks were successful
CD Pipeline / deploy (push) Successful in 1m6s

This commit is contained in:
OoO
2026-06-01 02:37:12 +08:00
parent 6e70a6eb47
commit 12c8c7e94d
9 changed files with 105 additions and 5 deletions

View File

@@ -85,6 +85,45 @@ _MAX_CONSECUTIVE_FAILURES = 10
_failure_counter_lock = threading.Lock()
_failure_state = {'count': 0, 'killed': False}
_AI_CALL_PROVIDER_WHITELIST = frozenset({
'gcp_ollama',
'ollama_secondary',
'ollama_111',
'ollama_other',
'gemini',
'claude',
'nim',
'openrouter',
'nim_via_elephant',
})
def _normalize_provider(provider: str) -> str:
"""Return an ai_calls.provider value that satisfies the DB CHECK.
`ollama_other` is telemetry-only: it represents an approved Ollama route
whose concrete host was unknown or failed before a successful host was
selected. It must not be used as a routing target.
"""
text = (provider or '').strip()[:32]
if text in _AI_CALL_PROVIDER_WHITELIST:
return text
lowered = text.lower()
if not lowered or lowered in {'unknown', 'none', 'null', 'ollama', 'ollama_local'}:
return 'ollama_other'
if lowered.startswith('gemini'):
return 'gemini'
if lowered.startswith(('claude', 'anthropic')):
return 'claude'
if lowered.startswith(('nim', 'nvidia', 'meta/')):
return 'nim'
if lowered.startswith('openrouter'):
return 'openrouter'
if 'ollama' in lowered:
return 'ollama_other'
return 'ollama_other'
def _record_failure() -> None:
with _failure_counter_lock:
@@ -145,7 +184,7 @@ class _CallState:
)
self.caller = caller
self.provider = provider
self.provider = _normalize_provider(provider)
self.model = model
self.request_id = request_id
self.input_tokens = 0
@@ -174,7 +213,7 @@ class _CallState:
def set_provider(self, provider: str) -> None:
"""更新實際 provider。適用於 Ollama 三主機 retry 後才知道落點的 caller。"""
if provider:
self.provider = provider[:32]
self.provider = _normalize_provider(provider)
def set_model(self, model: str) -> None:
"""更新實際模型。適用於 host-aware downgrade 後才知道落點模型的 caller。"""
@@ -387,7 +426,7 @@ def _write_to_db(state: _CallState) -> None:
"""),
{
'caller': state.caller[:64] if state.caller else 'unknown',
'provider': (state.provider or 'unknown')[:32],
'provider': _normalize_provider(state.provider),
'model': (state.model or 'unknown')[:128],
'input_tokens': int(state.input_tokens or 0),
'output_tokens': int(state.output_tokens or 0),