feat: add verbose ai-guard console logs and color mapping
This commit is contained in:
@@ -39,6 +39,7 @@ class _AnsiColorFormatter(logging.Formatter):
|
|||||||
("[THINK/RAW_OUTPUT]", "[AI思考-原始输出]"),
|
("[THINK/RAW_OUTPUT]", "[AI思考-原始输出]"),
|
||||||
("[REPLY->CUSTOMER]", "[AI回复客户]"),
|
("[REPLY->CUSTOMER]", "[AI回复客户]"),
|
||||||
("[ACTIVITY]", "[活动日志]"),
|
("[ACTIVITY]", "[活动日志]"),
|
||||||
|
("[AI质检]", "[AI质检]"),
|
||||||
)
|
)
|
||||||
# 业务消息类型颜色(优先于 level)
|
# 业务消息类型颜色(优先于 level)
|
||||||
MESSAGE_COLOR_RULES = (
|
MESSAGE_COLOR_RULES = (
|
||||||
@@ -47,6 +48,7 @@ class _AnsiColorFormatter(logging.Formatter):
|
|||||||
("[REPLY->CUSTOMER]", "\033[92m"), # bright green
|
("[REPLY->CUSTOMER]", "\033[92m"), # bright green
|
||||||
("Agent 回复", "\033[92m"), # bright green
|
("Agent 回复", "\033[92m"), # bright green
|
||||||
("[ACTIVITY]", "\033[95m"), # bright magenta
|
("[ACTIVITY]", "\033[95m"), # bright magenta
|
||||||
|
("[AI质检]", "\033[93m"), # bright yellow
|
||||||
("收到新消息", "\033[36m"), # cyan
|
("收到新消息", "\033[36m"), # cyan
|
||||||
("发送成功", "\033[32m"), # green
|
("发送成功", "\033[32m"), # green
|
||||||
("防抖等待", "\033[93m"), # bright yellow
|
("防抖等待", "\033[93m"), # bright yellow
|
||||||
@@ -174,6 +176,7 @@ class QingjianAPIClient:
|
|||||||
)
|
)
|
||||||
self._tianwang_agent_name = os.getenv("TIANWANG_AGENT_NAME", "终结者").strip() or "终结者"
|
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_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
|
self.task_scheduler = None
|
||||||
@@ -2034,6 +2037,14 @@ class QingjianAPIClient:
|
|||||||
if msg:
|
if msg:
|
||||||
context_lines.append(f"{role}:{msg}")
|
context_lines.append(f"{role}:{msg}")
|
||||||
context_text = "\n".join(context_lines) if context_lines else "无历史"
|
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(
|
deps = AgentDeps(
|
||||||
msg_id=str(original_msg.get("msg_id", "") or "reply_guard"),
|
msg_id=str(original_msg.get("msg_id", "") or "reply_guard"),
|
||||||
@@ -2068,12 +2079,20 @@ class QingjianAPIClient:
|
|||||||
allow = bool(obj.get("allow", True))
|
allow = bool(obj.get("allow", True))
|
||||||
rewrite = str(obj.get("rewrite", "") or "").strip()
|
rewrite = str(obj.get("rewrite", "") or "").strip()
|
||||||
reason = str(obj.get("reason", "") or "").strip() or "guard_decision"
|
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:
|
if allow:
|
||||||
return True, (rewrite or text), reason
|
return True, (rewrite or text), reason
|
||||||
if rewrite:
|
if rewrite:
|
||||||
return True, rewrite, reason
|
return True, rewrite, reason
|
||||||
return False, "", reason
|
return False, "", reason
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
logger.warning("[AI质检] 异常,降级放行: %s", e)
|
||||||
return True, text, f"guard_error:{e}"
|
return True, text, f"guard_error:{e}"
|
||||||
|
|
||||||
async def send_text(self, cy_id, acc_type, content):
|
async def send_text(self, cy_id, acc_type, content):
|
||||||
|
|||||||
Reference in New Issue
Block a user