389 lines
16 KiB
JSON
389 lines
16 KiB
JSON
{
|
||
"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 選 provider;CRITICAL / DELETE 仍強制 Claude,高複雜度或 HIGH 風險走 OpenClaw Nemo,低中複雜度走 Ollama。",
|
||
"provider_order": [
|
||
"ollama",
|
||
"openclaw_nemo",
|
||
"gemini",
|
||
"claude"
|
||
],
|
||
"fallback_policy": "一般 intent 使用 full fallback chain;DIAGNOSE 有專屬 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_URL;policy 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 / 111;cloud fallback 開啟時才加入 OpenClaw Nemo 與 Gemini。",
|
||
"provider_order": [
|
||
"ollama_gcp_a",
|
||
"ollama_gcp_b",
|
||
"ollama_local",
|
||
"openclaw_nemo",
|
||
"gemini"
|
||
],
|
||
"fallback_policy": "ALERT_AI_ENFORCE_OLLAMA_FIRST=true;ALERT_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 會被視為 fallbackable;P1-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 approval;P1-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 call;P2-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 precedence:runtime 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=true,OLLAMA_* 三層 route 仍經 110 proxy,Gemini 僅為三層失敗後備援。",
|
||
"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-status,P1-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
|
||
}
|
||
}
|