diff --git a/core/orchestrator.py b/core/orchestrator.py index 952fad3..dcce2ae 100644 --- a/core/orchestrator.py +++ b/core/orchestrator.py @@ -26,6 +26,7 @@ logger = logging.getLogger("cs_agent") MSG_DEDUP_CAPACITY = 200 # 消息 ID 去重缓存容量 TRANSFER_COOLDOWN_SEC = 120 # 转接冷却时间(秒)—— 转接后2分钟内不再调用AI DEBOUNCE_SECONDS = 2.0 # 消息防抖延迟(秒) +FIRST_GREETING_IDLE_SEC = 180 # 超过该空闲时间,视为新一轮对话 PENDING_TRANSFER_POLL_SECONDS = 30 PENDING_TRANSFER_RETRY_SECONDS = 60 TRANSFER_RETRY_WINDOW_SEC = 300 @@ -86,6 +87,7 @@ class SystemOrchestrator: self._debounce_tasks: Dict[str, asyncio.Task] = {} self._pending_messages: Dict[str, List[StandardMessage]] = {} self._user_locks: Dict[str, asyncio.Lock] = {} + self._last_inbound_seen_time: Dict[str, float] = {} self._pending_transfer_task: Optional[asyncio.Task] = None self._last_retry_transfer_time: Dict[str, float] = {} self._auto_pipeline_jobs: Dict[str, float] = {} @@ -415,20 +417,24 @@ class SystemOrchestrator: if std_msg.msg_id in self._processed_msg_ids: return self._processed_msg_ids.append(std_msg.msg_id) - # 每次收到客户新消息:先立即回一条固定承接,不经过 AI - first_greet = StandardResponse( - reply_content="在的 亲", - metadata={"acc_id": std_msg.acc_id, "acc_type": std_msg.acc_type}, - ) - await self.qianniu_adapter.translate_outbound(first_greet, user_id) - await repo.save_chat( - platform, - user_id, - first_greet.reply_content, - "out", - acc_id=std_msg.acc_id, - msg_type=first_greet.msg_type, - ) + # 同一轮对话只在第一句先发固定承接,不经过 AI + now_ts = time.time() + last_inbound_ts = self._last_inbound_seen_time.get(session_key, 0.0) + self._last_inbound_seen_time[session_key] = now_ts + if now_ts - last_inbound_ts >= FIRST_GREETING_IDLE_SEC: + first_greet = StandardResponse( + reply_content="在的 亲", + metadata={"acc_id": std_msg.acc_id, "acc_type": std_msg.acc_type}, + ) + await self.qianniu_adapter.translate_outbound(first_greet, user_id) + await repo.save_chat( + platform, + user_id, + first_greet.reply_content, + "out", + acc_id=std_msg.acc_id, + msg_type=first_greet.msg_type, + ) # 进入防抖(使用 session_key 隔离不同店铺) if session_key in self._debounce_tasks: self._debounce_tasks[session_key].cancel()