mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-02-09 07:48:52 +08:00
116 lines
4.0 KiB
Python
116 lines
4.0 KiB
Python
"""
|
|
Agent Event Handler - Handles agent events and thinking process output
|
|
"""
|
|
|
|
from common.log import logger
|
|
|
|
|
|
class AgentEventHandler:
|
|
"""
|
|
Handles agent events and optionally sends intermediate messages to channel
|
|
"""
|
|
|
|
def __init__(self, context=None, original_callback=None):
|
|
"""
|
|
Initialize event handler
|
|
|
|
Args:
|
|
context: COW context (for accessing channel)
|
|
original_callback: Original event callback to chain
|
|
"""
|
|
self.context = context
|
|
self.original_callback = original_callback
|
|
|
|
# Get channel for sending intermediate messages
|
|
self.channel = None
|
|
if context:
|
|
self.channel = context.kwargs.get("channel") if hasattr(context, "kwargs") else None
|
|
|
|
# Track current thinking for channel output
|
|
self.current_thinking = ""
|
|
self.turn_number = 0
|
|
|
|
def handle_event(self, event):
|
|
"""
|
|
Main event handler
|
|
|
|
Args:
|
|
event: Event dict with type and data
|
|
"""
|
|
event_type = event.get("type")
|
|
data = event.get("data", {})
|
|
|
|
# Dispatch to specific handlers
|
|
if event_type == "turn_start":
|
|
self._handle_turn_start(data)
|
|
elif event_type == "message_update":
|
|
self._handle_message_update(data)
|
|
elif event_type == "message_end":
|
|
self._handle_message_end(data)
|
|
elif event_type == "tool_execution_start":
|
|
self._handle_tool_execution_start(data)
|
|
elif event_type == "tool_execution_end":
|
|
self._handle_tool_execution_end(data)
|
|
|
|
# Call original callback if provided
|
|
if self.original_callback:
|
|
self.original_callback(event)
|
|
|
|
def _handle_turn_start(self, data):
|
|
"""Handle turn start event"""
|
|
self.turn_number = data.get("turn", 0)
|
|
self.has_tool_calls_in_turn = False
|
|
self.current_thinking = ""
|
|
|
|
def _handle_message_update(self, data):
|
|
"""Handle message update event (streaming text)"""
|
|
delta = data.get("delta", "")
|
|
self.current_thinking += delta
|
|
|
|
def _handle_message_end(self, data):
|
|
"""Handle message end event"""
|
|
tool_calls = data.get("tool_calls", [])
|
|
|
|
# Only send thinking process if followed by tool calls
|
|
if tool_calls:
|
|
if self.current_thinking.strip():
|
|
logger.debug(f"💭 {self.current_thinking.strip()[:200]}{'...' if len(self.current_thinking) > 200 else ''}")
|
|
# Send thinking process to channel
|
|
self._send_to_channel(f"{self.current_thinking.strip()}")
|
|
else:
|
|
# No tool calls = final response (logged at agent_stream level)
|
|
if self.current_thinking.strip():
|
|
logger.debug(f"💬 {self.current_thinking.strip()[:200]}{'...' if len(self.current_thinking) > 200 else ''}")
|
|
|
|
self.current_thinking = ""
|
|
|
|
def _handle_tool_execution_start(self, data):
|
|
"""Handle tool execution start event - logged by agent_stream.py"""
|
|
pass
|
|
|
|
def _handle_tool_execution_end(self, data):
|
|
"""Handle tool execution end event - logged by agent_stream.py"""
|
|
pass
|
|
|
|
def _send_to_channel(self, message):
|
|
"""
|
|
Try to send message to channel
|
|
|
|
Args:
|
|
message: Message to send
|
|
"""
|
|
if self.channel:
|
|
try:
|
|
from bridge.reply import Reply, ReplyType
|
|
# Create a Reply object for the message
|
|
reply = Reply(ReplyType.TEXT, message)
|
|
self.channel._send(reply, self.context)
|
|
except Exception as e:
|
|
logger.debug(f"[AgentEventHandler] Failed to send to channel: {e}")
|
|
|
|
def log_summary(self):
|
|
"""Log execution summary - simplified"""
|
|
# Summary removed as per user request
|
|
# Real-time logging during execution is sufficient
|
|
pass
|