fix: Update LangGraph event handling to process events as dictionaries instead of tuples

This commit is contained in:
Primakov Alexandr Alexandrovich 2025-10-13 16:14:07 +03:00
parent 6d375fd76d
commit a762d09b3b

View File

@ -552,69 +552,36 @@ class ReviewerAgent:
try: try:
async for event in self.graph.astream( async for event in self.graph.astream(
initial_state, initial_state,
stream_mode=["updates", "messages"] stream_mode=["updates"]
): ):
event_count += 1 event_count += 1
print(f"📨 Event #{event_count} received from graph") print(f"📨 Event #{event_count} received from graph")
print(f" Type: {type(event)}") print(f" Type: {type(event)}")
print(f" Event content: {event}")
# LangGraph returns events as tuples: (event_type, data) # LangGraph returns events as dict: {node_name: node_output}
if isinstance(event, tuple) and len(event) >= 2: if isinstance(event, dict):
event_type, event_data = event[0], event[1] for node_name, node_data in event.items():
print(f" Event type: {event_type}")
print(f" Event data type: {type(event_data)}")
# Handle 'updates' events (node updates)
if event_type == 'updates' and isinstance(event_data, dict):
for node_name, node_data in event_data.items():
print(f" 🔔 Node update: {node_name}") print(f" 🔔 Node update: {node_name}")
print(f" 🔔 Node data type: {type(node_data)}")
if on_event: if on_event:
print(f" 📤 Sending event to callback for node: {node_name}") print(f" 📤 Sending event to callback for node: {node_name}")
await on_event({ await on_event({
"type": "agent_step", "type": "agent_step",
"step": node_name, "step": node_name,
"message": f"Шаг: {node_name}" "message": f"Шаг: {node_name}",
"data": {
"status": node_data.get("status") if isinstance(node_data, dict) else None
}
}) })
# Store final state # Store final state
if isinstance(node_data, dict): if isinstance(node_data, dict):
final_state = node_data final_state = node_data
# Handle 'messages' events (LLM streaming)
elif event_type == 'messages':
print(f" 💬 LLM messages received")
# event_data is a list of messages
if isinstance(event_data, (list, tuple)):
for msg in event_data:
# Check if it's an AIMessage or similar
msg_content = None
if hasattr(msg, 'content'):
msg_content = msg.content
elif isinstance(msg, dict) and 'content' in msg:
msg_content = msg['content']
else: else:
msg_content = str(msg) print(f" ⚠️ Unexpected event format (not dict): {type(event)}")
if msg_content and on_event:
print(f" 💬 Sending LLM message: {msg_content[:100]}...")
await on_event({
"type": "llm_message",
"message": msg_content
})
# Handle 'values' events (state snapshots)
elif event_type == 'values':
print(f" 📊 State snapshot received")
if isinstance(event_data, dict):
final_state = event_data
# Handle 'debug' events
elif event_type == 'debug':
print(f" 🐛 Debug event: {event_data.get('type') if isinstance(event_data, dict) else 'unknown'}")
else:
print(f" ⚠️ Unexpected event format: {event}")
except Exception as e: except Exception as e:
print(f"❌ Error in graph streaming: {e}") print(f"❌ Error in graph streaming: {e}")