feat(ai): add guarded Claude fallback route
This commit is contained in:
@@ -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 chain;Gemini 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_URL;policy order 是 GCP-A → GCP-B → 111,再到 Gemini final fallback。",
|
||||
"current_policy": "生產 ConfigMap 與 deployment env 維持 OLLAMA_URL、OLLAMA_SECONDARY_URL、OLLAMA_FALLBACK_URL;policy 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 / host111;cloud fallback 只允許 Gemini final hop。",
|
||||
"current_policy": "告警與 AI governance lane 固定走 GCP-A / GCP-B / host111;cloud fallback 只允許受成本閘控制的 Claude 再 Gemini。",
|
||||
"provider_order": [
|
||||
"ollama_gcp_a",
|
||||
"ollama_gcp_b",
|
||||
"ollama_local",
|
||||
"claude",
|
||||
"gemini"
|
||||
],
|
||||
"fallback_policy": "ALERT_AI_ENFORCE_OLLAMA_FIRST=true;ALERT_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 fallback;configured、enabled、authenticated、verified 與 cost guard 必須分開顯示。",
|
||||
"current_policy": "Gemini 是三層 Ollama 與 Claude 之後的 final paid fallback;Claude/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 route;Claude/NVIDIA/Nemo/OpenClaw 僅保留 non-executable shadow metadata。",
|
||||
"current_policy": "apps/api/models.json 已發布五跳 production route;Claude 是 gated paid fallback,NVIDIA/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 現行說明已明確標示舊版路由 superseded,provider 固定四跳。",
|
||||
"summary": "ai_router.py 現行說明已明確標示舊版路由 superseded,provider 固定五跳。",
|
||||
"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 identity;endpoint URL 仍以 runtime env 與 production readback 為準。",
|
||||
"summary": "models.json、ConfigMap 與 AI Router 已共用五跳 provider identity;endpoint 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,
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
"status": "action_required",
|
||||
"risk_level": "critical",
|
||||
"freshness_status": "source_mismatch",
|
||||
"health_contract": "目前 AI provider route truth 是 GCP-A → GCP-B → 111;Gemini 只作 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",
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"Canonical Asset Normalize",
|
||||
"Typed Domain Router",
|
||||
"HolmesGPT Investigator",
|
||||
"Ollama RCA / Gemini Critic",
|
||||
"Ollama RCA / Claude Fallback / Gemini Critic",
|
||||
"Deterministic Policy",
|
||||
"Single Controlled Executor",
|
||||
"Independent Verifier",
|
||||
@@ -37,9 +37,10 @@
|
||||
"ollama_gcp_a",
|
||||
"ollama_gcp_b",
|
||||
"ollama_local",
|
||||
"claude",
|
||||
"gemini"
|
||||
],
|
||||
"route_label": "GCP-A -> GCP-B -> host111 Ollama -> Gemini API",
|
||||
"route_label": "GCP-A -> GCP-B -> host111 Ollama -> Anthropic Claude -> Gemini API",
|
||||
"hops": [
|
||||
{
|
||||
"position": 1,
|
||||
@@ -58,17 +59,26 @@
|
||||
},
|
||||
{
|
||||
"position": 4,
|
||||
"provider": "claude",
|
||||
"identity": "Anthropic Claude API"
|
||||
},
|
||||
{
|
||||
"position": 5,
|
||||
"provider": "gemini",
|
||||
"identity": "Gemini API"
|
||||
}
|
||||
],
|
||||
"ollama_role": "primary_rca_and_action_planning",
|
||||
"claude_role": "paid_architecture_rca_and_debug_fallback",
|
||||
"gemini_role": "final_fallback_and_optional_critic_only",
|
||||
"claude_paid_call_allowed": false,
|
||||
"gemini_paid_call_allowed": false,
|
||||
"gemini_cost_cap_status": "explicit_cost_cap_not_approved",
|
||||
"claude_cost_cap_status": "source_configured_shadow_runtime_readback_pending",
|
||||
"gemini_cost_cap_status": "source_configured_runtime_readback_pending",
|
||||
"claude_credential_status": "runtime_secret_reference_verifier_pending_no_secret_value_read",
|
||||
"gemini_credential_status": "runtime_secret_reference_verifier_pending_no_secret_value_read",
|
||||
"production_provider_route_switch_allowed": false,
|
||||
"required_before_gemini_enablement": [
|
||||
"required_before_paid_provider_enablement": [
|
||||
"offline_replay_scorecard",
|
||||
"shadow_comparison",
|
||||
"bounded_canary",
|
||||
@@ -415,7 +425,7 @@
|
||||
"order": 13,
|
||||
"priority": "P0",
|
||||
"phase": "phase_3",
|
||||
"title": "Ollama RCA 與 Gemini Critic/cost gate",
|
||||
"title": "Ollama RCA、Claude fallback 與 Gemini Critic/cost gate",
|
||||
"owner_lane": "ModelRouter",
|
||||
"risk": "critical",
|
||||
"status": "in_progress",
|
||||
@@ -424,13 +434,13 @@
|
||||
],
|
||||
"source_refs": [
|
||||
"apps/api/src/services/ai_router.py",
|
||||
"apps/api/src/services/ollama_failover.py"
|
||||
"apps/api/src/services/ollama_failover_manager.py"
|
||||
],
|
||||
"executor": "ordered model router",
|
||||
"verifier": "provider-attributed replay accuracy, latency and cost readback",
|
||||
"rollback": "Gemini disabled; remain on ordered Ollama chain",
|
||||
"exit_condition": "provider order is enforced and Gemini cannot run without explicit cost cap",
|
||||
"next_action": "verify secret metadata presence without reading value, then build offline comparison"
|
||||
"rollback": "Claude/Gemini disabled; remain on ordered Ollama chain",
|
||||
"exit_condition": "provider order is enforced and paid providers cannot run without explicit cost cap",
|
||||
"next_action": "deploy the disabled-by-default source route, verify secret metadata without reading values, then run replay, shadow comparison and bounded canary"
|
||||
},
|
||||
{
|
||||
"id": "AIA-SRE-014",
|
||||
|
||||
Reference in New Issue
Block a user