fix(ollama): enforce prod provider order
All checks were successful
CD Pipeline / tests (push) Successful in 1m21s
Code Review / ai-code-review (push) Successful in 12s
CD Pipeline / build-and-deploy (push) Successful in 5m15s
CD Pipeline / post-deploy-checks (push) Successful in 1m44s

This commit is contained in:
Your Name
2026-05-25 12:35:17 +08:00
parent fe3f1e39fc
commit b9fc8748a5
4 changed files with 64 additions and 4 deletions

View File

@@ -0,0 +1,37 @@
from __future__ import annotations
from pathlib import Path
import yaml
ROOT = Path(__file__).resolve().parents[3]
EXPECTED_ORDER = {
"OLLAMA_URL": "http://192.168.0.110:11435",
"OLLAMA_SECONDARY_URL": "http://192.168.0.110:11436",
"OLLAMA_FALLBACK_URL": "http://192.168.0.110:11437",
}
def _load_single_doc(path: Path) -> dict:
docs = [doc for doc in yaml.safe_load_all(path.read_text()) if doc]
assert docs, f"no YAML documents in {path}"
return docs[0]
def test_prod_configmap_preserves_ollama_policy_order() -> None:
configmap = _load_single_doc(ROOT / "k8s/awoooi-prod/04-configmap.yaml")
assert configmap["data"] | EXPECTED_ORDER == configmap["data"]
assert {configmap["data"][key] for key in EXPECTED_ORDER} == set(EXPECTED_ORDER.values())
def test_prod_deployment_preserves_ollama_policy_order() -> None:
deployment = _load_single_doc(ROOT / "k8s/awoooi-prod/06-deployment-api.yaml")
env = {
item["name"]: item.get("value")
for item in deployment["spec"]["template"]["spec"]["containers"][0]["env"]
}
assert {key: env[key] for key in EXPECTED_ORDER} == EXPECTED_ORDER
assert {env[key] for key in EXPECTED_ORDER} == set(EXPECTED_ORDER.values())

View File

@@ -1,3 +1,26 @@
## 2026-05-25T174 Ollama manifest policy-order guard
**背景**
- T173 推出 health/route cooldown 後,另一個 hotfix `fe3f1e39` 把 production manifest 改成 `11436 -> 11437 -> 11437`
- live route API 因此把 `11436` 顯示成 `ollama_gcp_a`造成「label 看起來是 GCP-A實際跑 GCP-B」的 operator 誤導。
- 統帥已明確要求所有 Ollama 使用順序必須維持 `GCP-A -> GCP-B -> 111 -> Gemini`GCP-A 紅燈要被顯示並 fail over不可直接改名或跳過。
**本次修補**
- 恢復 `k8s/awoooi-prod/04-configmap.yaml``06-deployment-api.yaml`
- `OLLAMA_URL=http://192.168.0.110:11435`
- `OLLAMA_SECONDARY_URL=http://192.168.0.110:11436`
- `OLLAMA_FALLBACK_URL=http://192.168.0.110:11437`
- 新增 `test_ollama_prod_manifest_order.py`,把 production manifest 的 Ollama policy order 鎖成測試,避免再出現 `ollama_gcp_a` label 指到 GCP-B/111。
**注意**
- 這不是否認 GCP-B 可用;正確流程是 policy 先顯示 GCP-A red再由 failover manager 選 GCP-B 或 111。
- 若要暫時跳過 GCP-A必須另有「degraded lane override」欄位與前端明確標示不能改 `OLLAMA_URL` 語意。
---
## 2026-05-25T173 GCP upstream 紅燈驗證與 Ollama endpoint cooldown 降噪
**背景**

View File

@@ -20,8 +20,8 @@ data:
# 2026-05-25 Codex: keep ADR-110 production policy visible and ordered.
# High-volume callers use short endpoint cooldowns when GCP-A/B are down,
# but health/status must still show GCP-A -> GCP-B -> 111 before Gemini.
OLLAMA_URL: "http://192.168.0.110:11436"
OLLAMA_SECONDARY_URL: "http://192.168.0.110:11437"
OLLAMA_URL: "http://192.168.0.110:11435"
OLLAMA_SECONDARY_URL: "http://192.168.0.110:11436"
OLLAMA_FALLBACK_URL: "http://192.168.0.110:11437"
OPENCLAW_URL: "http://192.168.0.188:8088"
KALI_SCANNER_URL: "http://192.168.0.112:8080"

View File

@@ -70,9 +70,9 @@ spec:
- name: TELEGRAM_ENABLE_POLLING
value: "true"
- name: OLLAMA_URL
value: "http://192.168.0.110:11436" # 2026-05-25 Codex: GCP-B via 110 proxy; GCP-A is still offline
value: "http://192.168.0.110:11435" # 2026-05-25 Codex: GCP-A via 110 proxy; health cooldown protects noisy offline probes
- name: OLLAMA_SECONDARY_URL
value: "http://192.168.0.110:11437" # 2026-05-25 Codex: local 111 via 110 proxy while GCP-A is still offline
value: "http://192.168.0.110:11436" # 2026-05-25 Codex: GCP-B via 110 proxy; fallback only after GCP-A is unavailable
- name: OLLAMA_FALLBACK_URL
value: "http://192.168.0.110:11437" # 2026-05-25 Codex: 111 via 110 proxy before Gemini
- name: ALERT_AI_ALLOW_CLOUD_FALLBACK