feat(ai): add guarded Claude fallback route

This commit is contained in:
ogt
2026-07-15 15:57:24 +08:00
parent f57845ba5e
commit 5c5eb48091
56 changed files with 4942 additions and 760 deletions

View File

@@ -27,23 +27,23 @@
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"rollups": {
"total_routes": 7,
"total_routes": 8,
"by_kind": {
"ai_router_core": 1,
"ollama_failover": 1,
"alert_governance_lane": 1,
"openclaw_nemo": 1,
"nemotron_candidate": 1,
"paid_cloud_fallback": 1,
"paid_cloud_fallback": 2,
"legacy_registry": 1
},
"by_status": {
"verified": 5,
"verified": 6,
"action_required": 1,
"blocked": 1
},
"by_route_gate": {
"route_preserved": 5,
"route_preserved": 6,
"review_required": 1,
"candidate_blocked": 1
},
@@ -75,11 +75,12 @@
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "AIRouter 的 intent、risk、complexity 只選 Ollama model所有 production generation 共用 GCP-A → GCP-B → host111 → Gemini 跳,不得直選 Claude / NVIDIA / Nemo / OpenClaw。",
"current_policy": "AIRouter 的 intent、risk、complexity 只選 Ollama model所有 production generation 共用 GCP-A → GCP-B → host111 → Claude → Gemini 跳,不得直選 NVIDIA / Nemo / OpenClaw。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "所有 risk / complexity / tool / background / code-review / runbook 路徑共用單一 production chainGemini disabled 時不得被重新加入。",
@@ -96,11 +97,12 @@
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_manifest",
"current_policy": "生產 ConfigMap 與 deployment env 維持 OLLAMA_URL、OLLAMA_SECONDARY_URL、OLLAMA_FALLBACK_URLpolicy order 是 GCP-A → GCP-B → 111再到 Gemini final fallback。",
"current_policy": "生產 ConfigMap 與 deployment env 維持 OLLAMA_URL、OLLAMA_SECONDARY_URL、OLLAMA_FALLBACK_URLpolicy order 是 GCP-A → GCP-B → 111再到 Claude 與 Gemini paid fallback。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "OllamaFailoverManager 只在 primary 不健康時檢查後兩層SLOW Ollama 仍優先於直接燒 Gemini quota。",
@@ -120,11 +122,12 @@
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "告警與 AI governance lane 固定走 GCP-A / GCP-B / host111cloud fallback 只允許 Gemini final hop。",
"current_policy": "告警與 AI governance lane 固定走 GCP-A / GCP-B / host111cloud fallback 只允許受成本閘控制的 Claude 再 Gemini。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "ALERT_AI_ENFORCE_OLLAMA_FIRST=trueALERT_AI_ALLOW_CLOUD_FALLBACK=true 只代表既有 final fallback不代表新增付費呼叫批准。",
@@ -148,9 +151,10 @@
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "Production fallback 不含 OpenClaw/Nemo/NVIDIA/Claude;候選只可離線 replay。",
"fallback_policy": "Production fallback 不含 OpenClaw/Nemo/NVIDIA候選只可離線 replay。",
"evidence_refs": [
"apps/api/src/services/ai_providers/openclaw_nemo.py",
"apps/api/src/services/ai_router.py",
@@ -179,6 +183,31 @@
],
"next_action": "P3 才刷新 primary source evidence 與 5 筆 smoke不得把 P1-004 matrix 當作 Nemotron 升級批准。"
},
{
"route_id": "claude_paid_fallback_policy",
"display_name": "Claude SRE / Architecture Paid Fallback",
"kind": "paid_cloud_fallback",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "Claude Sonnet 5 位於三層 Ollama 之後、Gemini 之前;預設 shadow/no-call只有 persistent enable、deterministic canary/production mode、auth readback 與原子成本 reservation 同時成立才可執行。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "Claude 使用獨立 RPM/request/token/daily/total cost cap、per-provider circuit breaker 與 durable receipt定價未知、Redis 不可用、correlation 缺漏或 disable-state 不可證明時 no-write fail closed。",
"evidence_refs": [
"apps/api/src/services/ai_providers/claude.py",
"apps/api/src/services/ai_rate_limiter.py",
"apps/api/src/services/ai_control.py",
"apps/api/models.json"
],
"next_action": "完成 source/test 後仍須 secret reference readback、5 筆 sanitized replay、shadow scorecard、bounded canary 與 production receipt不得從 source 綠燈宣稱 runtime closure。"
},
{
"route_id": "gemini_final_fallback_policy",
"display_name": "Gemini Final Fallback",
@@ -187,11 +216,12 @@
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "Gemini 是三層 Ollama 之後唯一 final paid fallbackconfigured、enabled、authenticated、verified 與 cost guard 必須分開顯示。",
"current_policy": "Gemini 是三層 Ollama 與 Claude 之後的 final paid fallbackClaude/Gemini 的 configured、enabled、authenticated、verified 與 cost guard 必須分開顯示。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "Gemini 只能由原子 requests/tokens/cost reservation 放行disabled 不重加unknown model/pricing 必須 durable blocked receipt。",
@@ -211,11 +241,12 @@
"risk_level": "medium",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "apps/api/models.json 已發布跳 production routeClaude/NVIDIA/Nemo/OpenClaw 僅保留 non-executable shadow metadata。",
"current_policy": "apps/api/models.json 已發布跳 production routeClaude 是 gated paid fallbackNVIDIA/Nemo/OpenClaw 僅保留 non-executable shadow metadata。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"claude",
"gemini"
],
"fallback_policy": "Registry、ConfigMap、AI Router source 與 runtime readback 必須一致source-only 仍不得宣稱 production closure。",
@@ -271,7 +302,7 @@
"display_name": "AI Router 註解與現況 drift",
"status": "resolved_in_source",
"severity": "low",
"summary": "ai_router.py 現行說明已明確標示舊版路由 supersededprovider 固定跳。",
"summary": "ai_router.py 現行說明已明確標示舊版路由 supersededprovider 固定跳。",
"evidence_refs": [
"apps/api/src/services/ai_router.py"
],
@@ -282,7 +313,7 @@
"display_name": "models.json 與 runtime env 判讀差異",
"status": "resolved_in_source",
"severity": "low",
"summary": "models.json、ConfigMap 與 AI Router 已共用跳 provider identityendpoint URL 仍以 runtime env 與 production readback 為準。",
"summary": "models.json、ConfigMap 與 AI Router 已共用跳 provider identityendpoint URL 仍以 runtime env 與 production readback 為準。",
"evidence_refs": [
"apps/api/models.json",
"k8s/awoooi-prod/06-deployment-api.yaml"
@@ -365,6 +396,7 @@
"shadow_or_canary_allowed": false,
"openclaw_replacement_allowed": false,
"nemotron_shadow_allowed": false,
"claude_direct_call_allowed": false,
"gemini_direct_call_allowed": false,
"secret_read_allowed": false,
"secret_plaintext_allowed": false,

View File

@@ -121,7 +121,7 @@
"status": "action_required",
"risk_level": "critical",
"freshness_status": "source_mismatch",
"health_contract": "目前 AI provider route truth 是 GCP-A → GCP-B → 111Gemini 只作 final fallback。",
"health_contract": "目前 AI provider route truth 是 GCP-A → GCP-B → 111 → Claude → Gemini付費 provider 只能在三層 Ollama 後依序作受控 fallback。",
"endpoint_contract": "`SERVICE-ENDPOINTS.md` 仍有 188 Ollama 參考,`scripts/health_check_session.sh` 又檢查 111 / 110需把 endpoint truth 收斂為 owner-attested source不可直接改路由。",
"evidence_refs": [
"docs/reference/SERVICE-ENDPOINTS.md",