From a7f2b9c0f5d8cb2eb8b850414d4915c0a9ecb99d Mon Sep 17 00:00:00 2001 From: OG T Date: Sun, 12 Apr 2026 20:50:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(display):=20=E8=A6=8F=E5=89=87=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E6=94=B9=E9=A1=AF=E7=A4=BA=20=E2=9C=85=20=E5=8F=96?= =?UTF-8?q?=E4=BB=A3=20=F0=9F=94=B4=200%=20+=20=E4=BF=AE=E5=BE=A9=20LLM=20?= =?UTF-8?q?=E5=AD=97=E4=B8=B2=20confidence=20=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - telegram_gateway.py: confidence==0 (規則匹配/Expert fallback) 不再顯示 「🔴 0%」,改顯示「⚙️ 規則匹配 ✅」,兩個 card 類型都修正 - openclaw.py: NIM/Ollama 有時回傳字串 "0.85" 而非 float,導致 isinstance(str, int|float)=False → confidence 被強制設 0.0。 現在先嘗試 float() 解析,解析失敗才 fallback 0.0 Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/openclaw.py | 6 ++++++ apps/api/src/services/telegram_gateway.py | 16 ++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/api/src/services/openclaw.py b/apps/api/src/services/openclaw.py index 71849f37..5ef58e18 100644 --- a/apps/api/src/services/openclaw.py +++ b/apps/api/src/services/openclaw.py @@ -1158,6 +1158,12 @@ class OpenClawService: # Step 2.5: 2026-04-01 Claude Code - 斷片補全 (信心度必須誠實) # 🔴 禁止填入假信心度!截斷 = 0.0,讓 auto-approve 正確判斷 + # 2026-04-12 ogt: NIM/Ollama 有時回傳字串 "0.85",先嘗試 parse 再判斷 + if "confidence" in data and isinstance(data["confidence"], str): + try: + data["confidence"] = float(data["confidence"]) + except (ValueError, TypeError): + data.pop("confidence", None) if "confidence" not in data or not isinstance(data["confidence"], int | float): data["confidence"] = 0.0 # 截斷/缺失 → 0.0,不可偽造 if "risk_level" not in data: diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py index 94a52a7f..021944e0 100644 --- a/apps/api/src/services/telegram_gateway.py +++ b/apps/api/src/services/telegram_gateway.py @@ -275,6 +275,7 @@ class TelegramMessage: # 2026-03-29 ogt: 根據 confidence + ai_provider 動態顯示來源 # confidence > 0 = 真實 AI 分析, confidence == 0 = 規則匹配/降級 # 2026-04-04 ogt: 加入 ai_model 顯示底層模型名稱 + # 2026-04-12 ogt: 規則匹配不顯示 🔴 0%,改用 ✅ 避免誤判為錯誤 if self.confidence > 0 and self.ai_provider: provider_names = { "ollama": "Ollama", @@ -288,10 +289,12 @@ class TelegramMessage: provider_display = provider_names.get(self.ai_provider.lower(), self.ai_provider.upper()) model_suffix = f" ({html.escape(self.ai_model)})" if self.ai_model else "" source_label = f"🤖 {provider_display} 仲裁{model_suffix}" + conf_line = f"{source_label} {conf_emoji} {confidence_pct}%" elif self.confidence > 0: source_label = "🤖 AI 仲裁判定" + conf_line = f"{source_label} {conf_emoji} {confidence_pct}%" else: - source_label = "⚙️ 規則匹配" + conf_line = "⚙️ 規則匹配 ✅" # 2026-04-05 Claude Code: 重設計訊息格式,提升易讀性 # 組裝訊息 @@ -299,7 +302,7 @@ class TelegramMessage: f"{self.status_emoji} {html.escape(self.risk_level)} {html.escape(incident_id)}\n" f"{safe_resource}\n" f"\n" - f"{source_label} {conf_emoji} {confidence_pct}%\n" + f"{conf_line}\n" f"👥 {resp_display}\n" f"💡 {safe_root_cause}\n" ) @@ -379,6 +382,7 @@ class TelegramMessage: # AI Provider 顯示 # 2026-04-04 ogt: 加入 ai_model 顯示底層模型名稱 + # 2026-04-12 ogt: 規則匹配不顯示 🔴 0%,改用 ✅ if self.confidence > 0 and self.ai_provider: provider_names = { "ollama": "Ollama", @@ -391,11 +395,11 @@ class TelegramMessage: } provider_display = provider_names.get(self.ai_provider.lower(), self.ai_provider.upper()) model_suffix = f" ({html.escape(self.ai_model)})" if self.ai_model else "" - source_label = f"🤖 {provider_display} 仲裁{model_suffix}" + conf_line = f"🤖 {provider_display} 仲裁{model_suffix} {conf_emoji} {confidence_pct}%" elif self.confidence > 0: - source_label = "🤖 OpenClaw 仲裁" + conf_line = f"🤖 OpenClaw 仲裁 {conf_emoji} {confidence_pct}%" else: - source_label = "⚙️ 規則匹配" + conf_line = "⚙️ 規則匹配 ✅" # Nemotron 區塊 # 2026-04-09 Claude Sonnet 4.6: 顯示 AI 鏈路 — OpenClaw 用哪個模型,Tool Calling 用哪個模型 @@ -440,7 +444,7 @@ class TelegramMessage: f"{self.status_emoji} {html.escape(self.risk_level)} {html.escape(incident_id)}\n" f"{safe_resource}\n" f"\n" - f"{source_label} {conf_emoji} {confidence_pct}%\n" + f"{conf_line}\n" f"👥 {resp_display}\n" f"💡 {safe_root_cause}\n" )