fix: only greet on first message in a session

This commit is contained in:
2026-03-11 21:22:10 +08:00
parent 3d1d955256
commit f3e8ea16c6

View File

@@ -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()