newtw66
This commit is contained in:
@@ -37,6 +37,18 @@ _OUTBOUND_BLOCK_MARKERS = (
|
||||
'[{"name":',
|
||||
)
|
||||
|
||||
# 历史记录格式检测模式(AI 转述历史时容易泄露)
|
||||
_HISTORY_LEAK_PATTERNS = [
|
||||
r'\[\d{4}-\d{2}-\d{2}[^\]]*\]\s*(客户|客服)[::]', # [2026-03-07 12:00:00] 客户:
|
||||
r'\[\d{2}:\d{2}:\d{2}\]\s*(客户|客服|我)[::]', # [12:00:00] 客户:
|
||||
r'(根据|查看|查询|翻看)(历史|聊天|对话)(记录|内容)', # 根据历史记录
|
||||
r'历史(记录|对话|消息)(显示|表明|中)', # 历史记录显示
|
||||
r'之前的(聊天|对话|记录)(中|里|显示)', # 之前的聊天中
|
||||
r'共\d+条(历史|对话)?消息', # 共30条历史消息
|
||||
r'订单号[::]\s*\d{10,}', # 订单号:xxxxxxxxxx
|
||||
r'(状态|金额|数量)[::].*(状态|金额|数量)[::]', # 状态:xxx 金额:xxx 连续出现
|
||||
]
|
||||
|
||||
class SystemOrchestrator:
|
||||
"""
|
||||
全系统总编排:具备转接冷却、防抖合并、多消息去重、以及精准日志。
|
||||
@@ -84,6 +96,11 @@ class SystemOrchestrator:
|
||||
if any(marker in cleaned for marker in _OUTBOUND_BLOCK_MARKERS):
|
||||
logger.warning("[Orchestrator] 拦截到内部内容外发,替换为安全兜底回复")
|
||||
return "我在帮你看记录,稍等哈"
|
||||
# 检查历史记录泄露模式
|
||||
for pattern in _HISTORY_LEAK_PATTERNS:
|
||||
if re.search(pattern, cleaned):
|
||||
logger.warning(f"[Orchestrator] 检测到历史记录泄露模式: {pattern[:30]}...")
|
||||
return "我在帮你看记录,稍等哈"
|
||||
return cleaned
|
||||
|
||||
async def on_raw_message_received(self, platform: str, raw_data: dict):
|
||||
@@ -243,11 +260,17 @@ class SystemOrchestrator:
|
||||
|
||||
async def _debounced_process(self, session_key: str, user_id: str, platform: str):
|
||||
try:
|
||||
# 记录开始时间(防抖前)
|
||||
process_start = time.time()
|
||||
|
||||
await asyncio.sleep(self._debounce_seconds)
|
||||
async with self._get_user_lock(session_key):
|
||||
messages = self._pending_messages.pop(session_key, [])
|
||||
if not messages: return
|
||||
|
||||
debounce_elapsed = time.time() - process_start
|
||||
logger.info(f"[计时] user={user_id} 防抖等待完成: {debounce_elapsed:.1f}s")
|
||||
|
||||
# A. 合并与元数据修复(去重:同一防抖窗口内完全相同的内容只保留一条)
|
||||
seen_contents = set()
|
||||
unique_parts = []
|
||||
@@ -278,9 +301,12 @@ class SystemOrchestrator:
|
||||
)
|
||||
|
||||
# B. 持久化
|
||||
db_start = time.time()
|
||||
db_content = combined_content
|
||||
if all_image_urls: db_content = f"【系统:已收到{len(all_image_urls)}张图】\n{combined_content}"
|
||||
await repo.save_chat(platform, user_id, db_content, "in", acc_id=acc_id, image_urls=all_image_urls)
|
||||
db_elapsed = time.time() - db_start
|
||||
logger.info(f"[计时] user={user_id} 消息入库: {db_elapsed:.2f}s")
|
||||
|
||||
# B2. 后台图片分析(不阻塞主流程,用于数据标定)
|
||||
if all_image_urls:
|
||||
@@ -302,9 +328,17 @@ class SystemOrchestrator:
|
||||
)
|
||||
else:
|
||||
# D. 正常流程:调用AI思考
|
||||
history_start = time.time()
|
||||
history = await repo.get_chat_history(user_id, limit=10, acc_id=acc_id)
|
||||
if history and history[-1].get('content') == db_content: history = history[:-1]
|
||||
history_elapsed = time.time() - history_start
|
||||
logger.info(f"[计时] user={user_id} 查询历史: {history_elapsed:.2f}s (共{len(history)}条)")
|
||||
|
||||
ai_start = time.time()
|
||||
std_res = await self.brain.think_and_reply(final_msg, history=history)
|
||||
ai_elapsed = time.time() - ai_start
|
||||
total_elapsed = time.time() - process_start
|
||||
logger.info(f"[计时] user={user_id} AI思考: {ai_elapsed:.1f}s | 总耗时: {total_elapsed:.1f}s")
|
||||
|
||||
# E. 发送并记录时间
|
||||
if std_res.should_reply:
|
||||
|
||||
Reference in New Issue
Block a user