Files
awoooi/docs/evaluations/ai_provider_route_matrix_2026-06-05.json
Your Name 45556f8fd1
All checks were successful
CD Pipeline / tests (push) Successful in 1m29s
Code Review / ai-code-review (push) Successful in 15s
CD Pipeline / build-and-deploy (push) Successful in 3m51s
CD Pipeline / post-deploy-checks (push) Successful in 1m30s
feat(governance): 新增 AI Provider 路由矩陣
2026-06-05 13:28:38 +08:00

389 lines
16 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"schema_version": "ai_provider_route_matrix_v1",
"generated_at": "2026-06-05T13:18:00+08:00",
"program_status": {
"overall_completion_percent": 100,
"current_priority": "P1",
"current_task_id": "P1-004",
"next_task_id": "P1-005",
"read_only_mode": true
},
"source_refs": [
"docs/schemas/ai_provider_route_matrix_v1.schema.json",
"docs/HARD_RULES.md#cost-change-approval",
"docs/HARD_RULES.md#iwooos-security-governance",
"apps/api/src/services/ai_router.py",
"apps/api/src/services/ollama_endpoint_resolver.py",
"apps/api/src/services/ollama_failover_manager.py",
"apps/api/src/services/openclaw.py",
"apps/api/src/services/platform_operator_service.py",
"apps/api/src/services/ai_providers/openclaw_nemo.py",
"apps/api/src/services/ai_providers/nemotron.py",
"apps/api/src/services/ai_providers/permissions.py",
"apps/api/models.json",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"rollups": {
"total_routes": 7,
"by_kind": {
"ai_router_core": 1,
"ollama_failover": 1,
"alert_governance_lane": 1,
"openclaw_nemo": 1,
"nemotron_candidate": 1,
"paid_cloud_fallback": 1,
"legacy_registry": 1
},
"by_status": {
"verified": 4,
"action_required": 2,
"blocked": 1
},
"by_route_gate": {
"route_preserved": 4,
"review_required": 1,
"candidate_blocked": 1,
"source_mismatch": 1
},
"route_ids_requiring_action": [
"legacy_models_json_policy",
"openclaw_nemo_rca_lane"
],
"candidate_gate_ids_requiring_approval": [
"nemotron_replay_gate",
"paid_provider_call_gate",
"provider_switch_gate"
],
"source_gap_ids": [
"ai_router_comment_drift",
"legacy_model_registry_order_gap",
"machine_backlog_next_task_gap"
],
"read_only_denials_total": 12,
"provider_switch_allowed_count": 0,
"paid_api_call_allowed_count": 0,
"shadow_or_canary_allowed_count": 0,
"runtime_route_change_allowed_count": 0
},
"provider_routes": [
{
"route_id": "ai_router_execution_policy",
"display_name": "AI Router 執行決策核心",
"kind": "ai_router_core",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "AIRouter 依 intent、risk、complexity 選 providerCRITICAL / DELETE 仍強制 Claude高複雜度或 HIGH 風險走 OpenClaw Nemo低中複雜度走 Ollama。",
"provider_order": [
"ollama",
"openclaw_nemo",
"gemini",
"claude"
],
"fallback_policy": "一般 intent 使用 full fallback chainDIAGNOSE 有專屬 chain且 Ollama 初選會先交 OllamaFailoverManager 重評。",
"evidence_refs": [
"apps/api/src/services/ai_router.py"
],
"next_action": "只讀顯示路由矩陣;任何 provider override 或 fallback chain 變更都需另開批准包。"
},
{
"route_id": "ollama_global_endpoint_order",
"display_name": "Ollama GCP-A → GCP-B → 111",
"kind": "ollama_failover",
"status": "verified",
"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。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"gemini"
],
"fallback_policy": "OllamaFailoverManager 只在 primary 不健康時檢查後兩層SLOW Ollama 仍優先於直接燒 Gemini quota。",
"evidence_refs": [
"apps/api/src/services/ollama_endpoint_resolver.py",
"apps/api/src/services/ollama_failover_manager.py",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "後續 P1-005 可只讀比對 health 缺口;不得在本任務改 OLLAMA_* 或重啟任何 host / pod。"
},
{
"route_id": "alert_ai_ollama_first_lane",
"display_name": "告警 AI Ollama-first Lane",
"kind": "alert_governance_lane",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "告警與 AI governance lane 必須先走 GCP-A / GCP-B / 111cloud fallback 開啟時才加入 OpenClaw Nemo 與 Gemini。",
"provider_order": [
"ollama_gcp_a",
"ollama_gcp_b",
"ollama_local",
"openclaw_nemo",
"gemini"
],
"fallback_policy": "ALERT_AI_ENFORCE_OLLAMA_FIRST=trueALERT_AI_ALLOW_CLOUD_FALLBACK=true 只代表既有 final fallback不代表新增付費呼叫批准。",
"evidence_refs": [
"apps/api/src/services/openclaw.py",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "在 AwoooP Runs / timeline 補 route evidence 時只能讀取既有 route status不得提高 Gemini 呼叫頻率。"
},
{
"route_id": "openclaw_nemo_rca_lane",
"display_name": "OpenClaw Nemo RCA Lane",
"kind": "openclaw_nemo",
"status": "action_required",
"risk_level": "high",
"route_gate": "review_required",
"evidence_status": "committed_source",
"current_policy": "OpenClawNemoProvider 維持 AWOOOI API → OpenClaw 188 → NVIDIA NIM 的 RCA 委派路徑OpenClaw 仍是目前生產仲裁核心。",
"provider_order": [
"openclaw_nemo",
"gemini",
"claude"
],
"fallback_policy": "OpenClaw degraded / low confidence response 會被視為 fallbackableP1-004 只盤點,不更換 incumbent。",
"evidence_refs": [
"apps/api/src/services/ai_providers/openclaw_nemo.py",
"apps/api/src/services/ai_router.py",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
],
"next_action": "後續以 replay / shadow / canary 證據比較候選;驗收前不得宣稱 OpenClaw 可被取代。"
},
{
"route_id": "nemotron_tool_calling_candidate",
"display_name": "Nemotron Tool Calling 候選",
"kind": "nemotron_candidate",
"status": "blocked",
"risk_level": "critical",
"route_gate": "candidate_blocked",
"evidence_status": "blocked_replay_recorded",
"current_policy": "NemotronProvider 可作 tool calling / 離線 evaluator但最近 replay / fast-model smoke 仍未過 latency 與品質 gate不得進 production route、shadow 或 canary。",
"provider_order": [
"nemotron"
],
"fallback_policy": "只保留離線 smoke / replay / sanitized request pack任何 NVIDIA/NIM live 呼叫需另有批准與成本邊界。",
"evidence_refs": [
"apps/api/src/services/ai_providers/nemotron.py",
"apps/api/src/services/ai_providers/permissions.py",
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"next_action": "P3 才刷新 primary source evidence 與 5 筆 smoke不得把 P1-004 matrix 當作 Nemotron 升級批准。"
},
{
"route_id": "gemini_final_fallback_policy",
"display_name": "Gemini Final Fallback",
"kind": "paid_cloud_fallback",
"status": "verified",
"risk_level": "critical",
"route_gate": "route_preserved",
"evidence_status": "committed_source",
"current_policy": "Gemini 是 Ollama 三層失敗後的 final cloud fallback既有 route 可顯示,但本任務不新增 paid probe、不直接呼叫 Gemini、不改 quota。",
"provider_order": [
"gemini",
"claude"
],
"fallback_policy": "所有新增付費 provider 呼叫、頻率提高或 quota 調整都需 cost approvalP1-004 只列路徑。",
"evidence_refs": [
"docs/HARD_RULES.md#cost-change-approval",
"apps/api/src/services/openclaw.py",
"apps/api/src/services/ollama_failover_manager.py",
"apps/api/models.json"
],
"next_action": "P2-004 才能提出成本與 fallback 優化;本階段保持現狀。"
},
{
"route_id": "legacy_models_json_policy",
"display_name": "legacy models.json 路由註記",
"kind": "legacy_registry",
"status": "action_required",
"risk_level": "medium",
"route_gate": "source_mismatch",
"evidence_status": "committed_source",
"current_policy": "apps/api/models.json 仍保留 default_provider=ollama、fallback_order=ollama→gemini→claude、tool_calling_fallback_order=nvidia→gemini→claude 與 GCP-A direct endpoint 註記;生產實際 env 則經 110 proxy 與 AI Router / failover manager 決策。",
"provider_order": [
"ollama",
"gemini",
"claude",
"nvidia"
],
"fallback_policy": "此檔可作 legacy registry evidence不可單獨視為生產路由真相需與 k8s env、AI Router source、runtime route status 一起判讀。",
"evidence_refs": [
"apps/api/models.json",
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "後續做 source-control / owner response 時整理 legacy registry reconciliation不在 P1-004 直接改路由設定。"
}
],
"candidate_gates": [
{
"gate_id": "provider_switch_gate",
"display_name": "Provider 切換 Gate",
"status": "production_change_blocked",
"approval_required": true,
"summary": "provider switch、production routing change、USE_AI_ROUTER 切換與 fallback order 修改全部需要獨立人工批准。",
"evidence_refs": [
"docs/HARD_RULES.md#iwooos-security-governance",
"docs/HARD_RULES.md#cost-change-approval"
],
"next_action": "若未來要切 provider需先準備 replay、shadow/canary、成本與 rollback 批准包。"
},
{
"gate_id": "nemotron_replay_gate",
"display_name": "Nemotron Replay Gate",
"status": "blocked_by_evidence",
"approval_required": true,
"summary": "Nemotron 目前僅保留為離線 specialist / evaluator不得取代 OpenClaw 或進 shadow/canary。",
"evidence_refs": [
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md",
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md"
],
"next_action": "P3 refresh source evidence 後,僅能先做 5 筆 smoke。"
},
{
"gate_id": "paid_provider_call_gate",
"display_name": "付費 Provider 呼叫 Gate",
"status": "cost_approval_required",
"approval_required": true,
"summary": "Gemini / Claude / NVIDIA external call、quota 或頻率提升都需先做成本影響與人工批准。",
"evidence_refs": [
"docs/HARD_RULES.md#cost-change-approval",
"apps/api/models.json"
],
"next_action": "P1-004 不做 live paid callP2-004 才能整理成本優化提案。"
}
],
"source_gaps": [
{
"gap_id": "ai_router_comment_drift",
"display_name": "AI Router 註解與現況 drift",
"status": "action_required",
"severity": "medium",
"summary": "ai_router.py 同時保留 DIAGNOSE 過往變更註解與目前 override人工閱讀時容易把舊註解誤讀成現行路由。",
"evidence_refs": [
"apps/api/src/services/ai_router.py"
],
"next_action": "後續文件同步時整理 route truth 表,不直接改 provider logic。"
},
{
"gap_id": "legacy_model_registry_order_gap",
"display_name": "models.json 與 runtime env 判讀差異",
"status": "action_required",
"severity": "medium",
"summary": "models.json 是 legacy registry生產 OLLAMA_* 以 k8s env 經 110 proxy 為準。若只看 models.json 會誤判 GCP-A direct endpoint。",
"evidence_refs": [
"apps/api/models.json",
"k8s/awoooi-prod/06-deployment-api.yaml"
],
"next_action": "建立 source truth precedenceruntime env / AI Router source / registry / proposal。"
},
{
"gap_id": "machine_backlog_next_task_gap",
"display_name": "P1-005 / P1-006 機器待辦同步缺口",
"status": "proposal_required",
"severity": "low",
"summary": "工作清單 MD 列出 P1-005 / P1-006但目前 committed backlog JSON 仍未納入這兩項P1-004 完成後需在下一階段對齊。",
"evidence_refs": [
"docs/ai/AI_AGENT_AUTOMATION_WORKLIST_2026-06-04.md",
"docs/evaluations/ai_agent_automation_backlog_2026-06-04.json"
],
"next_action": "P1-005 啟動前先決定是否補 machine backlog item避免 UI next_task 跟 MD 不一致。"
}
],
"latest_observations": [
{
"observation_id": "prod_manifest_ai_router_enabled",
"status": "verified",
"summary": "生產 manifest committed env 顯示 USE_AI_ROUTER=trueOLLAMA_* 三層 route 仍經 110 proxyGemini 僅為三層失敗後備援。",
"evidence_refs": [
"k8s/awoooi-prod/04-configmap.yaml",
"k8s/awoooi-prod/06-deployment-api.yaml"
]
},
{
"observation_id": "operator_route_status_exists",
"status": "verified",
"summary": "platform operator service 已有只讀 ai-route-statusP1-004 不新增 live probe 或 paid probe。",
"evidence_refs": [
"apps/api/src/services/platform_operator_service.py",
"apps/api/src/api/v1/platform/operator_runs.py"
]
},
{
"observation_id": "nemotron_candidate_blocked",
"status": "blocked",
"summary": "MASTER 記錄 Nemotron replay / fast-model smoke 未達取代門檻,只能保留為離線候選。",
"evidence_refs": [
"docs/superpowers/specs/2026-04-15-MASTER-ai-autonomous-flywheel-v2.md"
]
}
],
"operator_contract": {
"display_mode": "read_only_ai_provider_route_matrix",
"must_not_interpret_as": [
"provider 切換批准",
"production routing change 批准",
"USE_AI_ROUTER 開關變更批准",
"Gemini / Claude / NVIDIA 付費呼叫批准",
"OpenClaw 取代或降級批准",
"Nemotron 進 shadow / canary 批准",
"fallback order 修改批准",
"Ollama endpoint / ConfigMap 修改批准",
"Secret payload 已讀取或可輸出",
"外部 live probe 或 benchmark 批准",
"workflow / deploy / reload 觸發批准",
"runtime execution 授權"
],
"secret_display_policy": "只顯示 env var 名稱與 redacted metadata不得輸出 API key、token、header 或 payload。",
"provider_switch_policy": "P1-004 只能盤點與顯示;切換 provider 需 replay、shadow/canary、成本、rollback 與獨立人工批准。",
"cost_policy": "新增或提高 Gemini / Claude / NVIDIA 呼叫皆需 cost approval本 snapshot 不呼叫任何 paid provider。",
"runtime_policy": "UI/API 可見不等於 runtime route 已授權active runtime gate 維持 0。"
},
"operation_boundaries": {
"read_only_api_allowed": true,
"provider_switch_allowed": false,
"production_routing_change_allowed": false,
"use_ai_router_toggle_allowed": false,
"fallback_order_change_allowed": false,
"ollama_endpoint_change_allowed": false,
"paid_api_call_allowed": false,
"paid_api_frequency_increase_allowed": false,
"external_provider_probe_allowed": false,
"live_benchmark_allowed": false,
"shadow_or_canary_allowed": false,
"openclaw_replacement_allowed": false,
"nemotron_shadow_allowed": false,
"gemini_direct_call_allowed": false,
"secret_read_allowed": false,
"secret_plaintext_allowed": false,
"notification_send_allowed": false,
"workflow_trigger_allowed": false,
"deploy_trigger_allowed": false,
"reload_trigger_allowed": false,
"runtime_execution_allowed": false
},
"approval_boundaries": {
"provider_switch_approved": false,
"production_routing_change_approved": false,
"cost_change_approved": false,
"shadow_or_canary_approved": false,
"external_provider_call_approved": false,
"openclaw_replacement_approved": false,
"nemotron_replay_approved": false,
"secret_access_approved": false,
"runtime_execution_approved": false
}
}