mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-07-21 22:27:13 +08:00
feat(feishu): cancel recalled messages
This commit is contained in:
@@ -515,6 +515,42 @@ class ChatChannel(Channel):
|
||||
semaphore.release()
|
||||
time.sleep(0.2)
|
||||
|
||||
def cancel_message(self, session_id: str, message_id: str):
|
||||
"""Cancel one channel message without disturbing later queued work.
|
||||
|
||||
Queued contexts are matched by their original channel message ID. An
|
||||
in-flight agent run is cancelled through the per-request token that the
|
||||
channel placed on the context before dispatch.
|
||||
"""
|
||||
removed = 0
|
||||
with self.lock:
|
||||
session = self.sessions.get(session_id)
|
||||
if session is not None:
|
||||
context_queue = session[0]
|
||||
kept = []
|
||||
for _ in range(context_queue.qsize()):
|
||||
context = context_queue.get_nowait()
|
||||
context_queue.task_done()
|
||||
message = context.get("msg") if context is not None else None
|
||||
if getattr(message, "msg_id", None) == message_id:
|
||||
removed += 1
|
||||
else:
|
||||
kept.append(context)
|
||||
for context in kept:
|
||||
context_queue.put(context)
|
||||
|
||||
from agent.protocol import get_cancel_registry
|
||||
|
||||
active = get_cancel_registry().cancel_request(message_id)
|
||||
logger.info(
|
||||
"[chat_channel] message recall: session=%s, message=%s, queued=%s, active=%s",
|
||||
session_id,
|
||||
message_id,
|
||||
removed,
|
||||
active,
|
||||
)
|
||||
return removed, active
|
||||
|
||||
# 取消session_id对应的所有任务,只能取消排队的消息和已提交线程池但未执行的任务
|
||||
def cancel_session(self, session_id):
|
||||
with self.lock:
|
||||
|
||||
Reference in New Issue
Block a user