Refactor message handling and error logging in agent and gateway

- Updated the AIAgent class to extract the first user message for trajectory formatting, improving the accuracy of user queries in the trajectory format.
- Enhanced the GatewayRunner to convert transcript history into the agent format, ensuring proper handling of message roles and content.
- Adjusted the typing indicator refresh rate to every 2 seconds for better responsiveness.
- Improved error handling in the message sending process for the Telegram adapter, implementing a fallback mechanism for Markdown parsing failures, and logging send failures for better debugging.
This commit is contained in:
teknium1 2026-02-03 15:42:54 -08:00
parent 212460289b
commit beeb7896e0
4 changed files with 56 additions and 16 deletions

View file

@ -196,7 +196,7 @@ class BasePlatformAdapter(ABC):
if not self._message_handler: if not self._message_handler:
return return
# Start continuous typing indicator (refreshes every 4 seconds) # Start continuous typing indicator (refreshes every 2 seconds)
typing_task = asyncio.create_task(self._keep_typing(event.source.chat_id)) typing_task = asyncio.create_task(self._keep_typing(event.source.chat_id))
try: try:
@ -205,13 +205,27 @@ class BasePlatformAdapter(ABC):
# Send response if any # Send response if any
if response: if response:
await self.send( result = await self.send(
chat_id=event.source.chat_id, chat_id=event.source.chat_id,
content=response, content=response,
reply_to=event.message_id reply_to=event.message_id
) )
# Log send failures (don't raise - user already saw tool progress)
if not result.success:
print(f"[{self.name}] Failed to send response: {result.error}")
# Try sending without markdown as fallback
fallback_result = await self.send(
chat_id=event.source.chat_id,
content=f"(Response formatting failed, plain text:)\n\n{response[:3500]}",
reply_to=event.message_id
)
if not fallback_result.success:
print(f"[{self.name}] Fallback send also failed: {fallback_result.error}")
except Exception as e: except Exception as e:
print(f"[{self.name}] Error handling message: {e}") print(f"[{self.name}] Error handling message: {e}")
import traceback
traceback.print_exc()
finally: finally:
# Stop typing indicator # Stop typing indicator
typing_task.cancel() typing_task.cancel()

View file

@ -142,13 +142,27 @@ class TelegramAdapter(BasePlatformAdapter):
thread_id = metadata.get("thread_id") if metadata else None thread_id = metadata.get("thread_id") if metadata else None
for i, chunk in enumerate(chunks): for i, chunk in enumerate(chunks):
msg = await self._bot.send_message( # Try Markdown first, fall back to plain text if it fails
chat_id=int(chat_id), try:
text=chunk, msg = await self._bot.send_message(
parse_mode=ParseMode.MARKDOWN, chat_id=int(chat_id),
reply_to_message_id=int(reply_to) if reply_to and i == 0 else None, text=chunk,
message_thread_id=int(thread_id) if thread_id else None, parse_mode=ParseMode.MARKDOWN,
) reply_to_message_id=int(reply_to) if reply_to and i == 0 else None,
message_thread_id=int(thread_id) if thread_id else None,
)
except Exception as md_error:
# Markdown parsing failed, try plain text
if "parse" in str(md_error).lower() or "markdown" in str(md_error).lower():
msg = await self._bot.send_message(
chat_id=int(chat_id),
text=chunk,
parse_mode=None, # Plain text
reply_to_message_id=int(reply_to) if reply_to and i == 0 else None,
message_thread_id=int(thread_id) if thread_id else None,
)
else:
raise # Re-raise if not a parse error
message_ids.append(str(msg.message_id)) message_ids.append(str(msg.message_id))
return SendResult( return SendResult(

View file

@ -446,11 +446,16 @@ class GatewayRunner:
tool_progress_callback=progress_callback if tool_progress_enabled else None, tool_progress_callback=progress_callback if tool_progress_enabled else None,
) )
# If we have history, we need to restore it # Convert transcript history to agent format
# For now, we pass the message directly # Transcript has timestamps; agent expects {"role": ..., "content": ...}
# TODO: Implement proper history restoration agent_history = []
for msg in history:
role = msg.get("role")
content = msg.get("content")
if role and content:
agent_history.append({"role": role, "content": content})
result = agent.run_conversation(message) result = agent.run_conversation(message, conversation_history=agent_history)
# Return final response, or a message if something went wrong # Return final response, or a message if something went wrong
final_response = result.get("final_response") final_response = result.get("final_response")

View file

@ -1272,9 +1272,16 @@ class AIAgent:
return return
try: try:
# Convert to trajectory format (reuse existing method) # Extract the first user message for the trajectory format
# Use empty string as user_query since it's embedded in messages # The first message should be the user's initial query
trajectory = self._convert_to_trajectory_format(messages, "", True) first_user_query = ""
for msg in messages:
if msg.get("role") == "user":
first_user_query = msg.get("content", "")
break
# Convert to trajectory format
trajectory = self._convert_to_trajectory_format(messages, first_user_query, True)
# Build the session log entry # Build the session log entry
entry = { entry = {