fix(display): 規則匹配改顯示 ✅ 取代 🔴 0% + 修復 LLM 字串 confidence 解析
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
Some checks failed
CD Pipeline / build-and-deploy (push) Has been cancelled
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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"🤖 <b>{provider_display} 仲裁</b>{model_suffix}"
|
||||
conf_line = f"{source_label} {conf_emoji} {confidence_pct}%"
|
||||
elif self.confidence > 0:
|
||||
source_label = "🤖 <b>AI 仲裁判定</b>"
|
||||
conf_line = f"{source_label} {conf_emoji} {confidence_pct}%"
|
||||
else:
|
||||
source_label = "⚙️ <b>規則匹配</b>"
|
||||
conf_line = "⚙️ <b>規則匹配</b> ✅"
|
||||
|
||||
# 2026-04-05 Claude Code: 重設計訊息格式,提升易讀性
|
||||
# 組裝訊息
|
||||
@@ -299,7 +302,7 @@ class TelegramMessage:
|
||||
f"{self.status_emoji} <b>{html.escape(self.risk_level)}</b> <code>{html.escape(incident_id)}</code>\n"
|
||||
f"<b>{safe_resource}</b>\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"🤖 <b>{provider_display} 仲裁</b>{model_suffix}"
|
||||
conf_line = f"🤖 <b>{provider_display} 仲裁</b>{model_suffix} {conf_emoji} {confidence_pct}%"
|
||||
elif self.confidence > 0:
|
||||
source_label = "🤖 <b>OpenClaw 仲裁</b>"
|
||||
conf_line = f"🤖 <b>OpenClaw 仲裁</b> {conf_emoji} {confidence_pct}%"
|
||||
else:
|
||||
source_label = "⚙️ <b>規則匹配</b>"
|
||||
conf_line = "⚙️ <b>規則匹配</b> ✅"
|
||||
|
||||
# Nemotron 區塊
|
||||
# 2026-04-09 Claude Sonnet 4.6: 顯示 AI 鏈路 — OpenClaw 用哪個模型,Tool Calling 用哪個模型
|
||||
@@ -440,7 +444,7 @@ class TelegramMessage:
|
||||
f"{self.status_emoji} <b>{html.escape(self.risk_level)}</b> <code>{html.escape(incident_id)}</code>\n"
|
||||
f"<b>{safe_resource}</b>\n"
|
||||
f"\n"
|
||||
f"{source_label} {conf_emoji} {confidence_pct}%\n"
|
||||
f"{conf_line}\n"
|
||||
f"👥 {resp_display}\n"
|
||||
f"💡 {safe_root_cause}\n"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user