diff --git a/apps/api/src/models/ai.py b/apps/api/src/models/ai.py index a37e5f19..50e72d70 100644 --- a/apps/api/src/models/ai.py +++ b/apps/api/src/models/ai.py @@ -130,11 +130,13 @@ class OpenClawDecision(BaseModel): ) # === 信心度與影響範圍 === + # 2026-03-29 ogt: 移除預設值,強制 LLM 必須輸出真實信心分數 + # 如果 LLM 沒有輸出 confidence,解析時會補 0.5 並標記為 COLLAB confidence: float = Field( - default=0.8, + ..., # REQUIRED - 不允許預設值 ge=0.0, le=1.0, - description="決策信心度 (0-1)", + description="決策信心度 (0-1) - LLM 必須計算", ) affected_services: list[str] = Field( default_factory=list, diff --git a/apps/api/src/services/openclaw.py b/apps/api/src/services/openclaw.py index a022383a..3a03b101 100644 --- a/apps/api/src/services/openclaw.py +++ b/apps/api/src/services/openclaw.py @@ -996,6 +996,17 @@ class OpenClawService: if "suggested_action" not in data: data["suggested_action"] = "NO_ACTION" + # Step 2.5: 2026-03-29 ogt - 強制 confidence 必須由 LLM 輸出 + # 如果 LLM 沒有輸出 confidence,強制設為 0.5 並標記為 COLLAB + if "confidence" not in data or not isinstance(data["confidence"], (int, float)): + logger.warning( + "llm_missing_confidence", + raw_confidence=data.get("confidence"), + forcing_collab=True, + ) + data["confidence"] = 0.5 # 低信心分數 + data["primary_responsibility"] = "COLLAB" # 強制協作處理 + # Step 3: 使用 Pydantic 驗證 (會自動正規化 risk_level, data_impact 等) decision = OpenClawDecision(**data)