diff --git a/apps/api/src/services/telegram_gateway.py b/apps/api/src/services/telegram_gateway.py
index 6d71fde1..a55e035b 100644
--- a/apps/api/src/services/telegram_gateway.py
+++ b/apps/api/src/services/telegram_gateway.py
@@ -221,9 +221,9 @@ class TelegramMessage:
signoz_block = f"━━━━━━━━━━━━━━━━━━━\n{self.signoz_metrics.format()}\n"
# HTML 轉義用戶輸入內容,防止 "Can't parse entities" 錯誤
- safe_resource = html.escape(self.resource_name[:35])
- safe_root_cause = html.escape(self.root_cause[:100])
- safe_action = html.escape(self.suggested_action[:80])
+ safe_resource = html.escape(self.resource_name)
+ safe_root_cause = html.escape(self.root_cause)
+ safe_action = html.escape(self.suggested_action)
safe_downtime = html.escape(self.estimated_downtime)
# 2026-03-29 ogt: AI Token/Cost 顯示
@@ -315,7 +315,7 @@ class TelegramMessage:
f"🔍 SignOz Trace"
)
- return message[:900] # 900 字元上限 (nemotron 版用 1000,因有額外 tool 區塊)
+ return message[:4096] # Telegram 硬限制
def format_with_nemotron(self) -> str:
"""
@@ -372,9 +372,9 @@ class TelegramMessage:
incident_id = f"INC-{self.approval_id[:8].upper()}"
# HTML 轉義
- safe_resource = html.escape(self.resource_name[:35])
- safe_root_cause = html.escape(self.root_cause[:100])
- safe_action = html.escape(self.suggested_action[:80])
+ safe_resource = html.escape(self.resource_name)
+ safe_root_cause = html.escape(self.root_cause)
+ safe_action = html.escape(self.suggested_action)
safe_downtime = html.escape(self.estimated_downtime)
# AI Provider 顯示
@@ -451,7 +451,7 @@ class TelegramMessage:
f"⏱️ 停機: {safe_downtime}"
)
- return message[:1000]
+ return message[:4096] # Telegram 硬限制
# =============================================================================
@@ -561,7 +561,7 @@ class ResourceWarnMessage:
suggestion_block = ""
if self.suggestion:
- suggestion_block = f"💡 建議: {html.escape(self.suggestion[:50])}\n"
+ suggestion_block = f"💡 建議: {html.escape(self.suggestion)}\n"
message = (
f"═══════════════════════════\n"
@@ -1072,17 +1072,17 @@ class InfraAlertMessage:
"""格式化為 Telegram HTML"""
# 有 note 表示「資訊性提示」,不顯示修復區塊
if self.note:
- footer = f"━━━━━━━━━━━━━━━━━━━\n💡 {html.escape(self.note[:150])}\n"
+ footer = f"━━━━━━━━━━━━━━━━━━━\n💡 {html.escape(self.note)}\n"
elif self.auto_fixed:
- footer = f"━━━━━━━━━━━━━━━━━━━\n✅ 已自動修復\n└ {html.escape(self.fix_action[:100])}\n"
+ footer = f"━━━━━━━━━━━━━━━━━━━\n✅ 已自動修復\n└ {html.escape(self.fix_action)}\n"
else:
- footer = f"━━━━━━━━━━━━━━━━━━━\n⚠️ 需要關注\n└ {html.escape(self.fix_action[:100] or '請確認元件狀態')}\n"
+ footer = f"━━━━━━━━━━━━━━━━━━━\n⚠️ 需要關注\n└ {html.escape(self.fix_action or '請確認元件狀態')}\n"
return (
f"🚨 基礎設施異常\n"
f"━━━━━━━━━━━━━━━━━━━\n"
f"⚙️ {html.escape(self.component)}: {html.escape(self.status)}\n"
- f"📛 影響: {html.escape(self.impact[:150])}\n"
+ f"📛 影響: {html.escape(self.impact)}\n"
f"{footer}"
)[:900]
@@ -2627,7 +2627,7 @@ class TelegramGateway:
lines += [
f"",
f"🤖 AI 分析 ({html.escape(dc.model_used)})",
- f"💡 {html.escape(dc.hypothesis[:200])}{'...' if len(dc.hypothesis) > 200 else ''}",
+ f"💡 {html.escape(dc.hypothesis)}",
f"📈 信心: [{confidence_bar}] {dc.confidence:.0%}",
]
if dc.probable_root_causes: