feat: add verbose ai-guard console logs and color mapping

This commit is contained in:
2026-03-01 18:04:32 +08:00
parent 57dd967d58
commit ac4e4eca90

View File

@@ -39,6 +39,7 @@ class _AnsiColorFormatter(logging.Formatter):
("[THINK/RAW_OUTPUT]", "[AI思考-原始输出]"),
("[REPLY->CUSTOMER]", "[AI回复客户]"),
("[ACTIVITY]", "[活动日志]"),
("[AI质检]", "[AI质检]"),
)
# 业务消息类型颜色(优先于 level
MESSAGE_COLOR_RULES = (
@@ -47,6 +48,7 @@ class _AnsiColorFormatter(logging.Formatter):
("[REPLY->CUSTOMER]", "\033[92m"), # bright green
("Agent 回复", "\033[92m"), # bright green
("[ACTIVITY]", "\033[95m"), # bright magenta
("[AI质检]", "\033[93m"), # bright yellow
("收到新消息", "\033[36m"), # cyan
("发送成功", "\033[32m"), # green
("防抖等待", "\033[93m"), # bright yellow
@@ -174,6 +176,7 @@ class QingjianAPIClient:
)
self._tianwang_agent_name = os.getenv("TIANWANG_AGENT_NAME", "终结者").strip() or "终结者"
self._reply_guard_enabled = os.getenv("AI_REPLY_GUARD_ENABLED", "true").lower() in ("1", "true", "yes")
self._reply_guard_verbose = os.getenv("AI_REPLY_GUARD_VERBOSE", "false").lower() in ("1", "true", "yes")
# 延迟加载任务模块(避免循环导入)
self.task_scheduler = None
@@ -2034,6 +2037,14 @@ class QingjianAPIClient:
if msg:
context_lines.append(f"{role}:{msg}")
context_text = "\n".join(context_lines) if context_lines else "无历史"
if self._reply_guard_verbose:
logger.info(
"[AI质检] 启动 | customer=%s | acc=%s | context_rows=%s | candidate=%s",
customer_id,
acc_id,
len(shop_rows),
text[:120],
)
deps = AgentDeps(
msg_id=str(original_msg.get("msg_id", "") or "reply_guard"),
@@ -2068,12 +2079,20 @@ class QingjianAPIClient:
allow = bool(obj.get("allow", True))
rewrite = str(obj.get("rewrite", "") or "").strip()
reason = str(obj.get("reason", "") or "").strip() or "guard_decision"
if self._reply_guard_verbose:
logger.info(
"[AI质检] 结果 | allow=%s | reason=%s | rewrite=%s",
allow,
reason,
(rewrite or "")[:160],
)
if allow:
return True, (rewrite or text), reason
if rewrite:
return True, rewrite, reason
return False, "", reason
except Exception as e:
logger.warning("[AI质检] 异常,降级放行: %s", e)
return True, text, f"guard_error:{e}"
async def send_text(self, cy_id, acc_type, content):