"""Simple test to manually check tool execution during workflow streaming.""" import asyncio import os from dotenv import load_dotenv from agent import TeacherStudentAgentWorkflow from tools.simple_tools import get_workflow_state, reset_workflow_state load_dotenv(os.path.join(os.path.dirname(__file__), 'env.local')) async def test_workflow_tool_execution(): """Monitor tool execution during workflow execution.""" print("Testing workflow tool execution...") # Reset state reset_workflow_state() print(f"Initial state: {get_workflow_state()}") workflow = TeacherStudentAgentWorkflow() # Start workflow print("\nStarting workflow...") handler = workflow.agent_workflow.run(user_msg="Write a short report about renewable energy") tool_calls_seen = [] tool_results_seen = [] print("\nMonitoring events...") async for event in handler.stream_events(): event_type = type(event).__name__ print(f"šŸ“… Event: {event_type}") # Check for agent outputs and their content if hasattr(event, 'response') and hasattr(event.response, 'content'): if event.response.content: print(f" šŸ’¬ Agent Response: {event.response.content}") # Check if this looks like a handoff message content = event.response.content.lower() if 'handoff' in content or 'handing off' in content: print(f" šŸ”„ HANDOFF DETECTED: {event.response.content}") # Monitor for tool-related events if hasattr(event, 'tool_name') and hasattr(event, 'tool_kwargs'): tool_call_info = { 'tool_name': event.tool_name, 'tool_kwargs': event.tool_kwargs, 'event_type': event_type } tool_calls_seen.append(tool_call_info) print(f" šŸ”Ø Tool Call: {event.tool_name}") print(f" Args: {event.tool_kwargs}") # Check state after this tool call event current_state = get_workflow_state() if event.tool_name == 'write_report': print(f" State after write_report call:") print(f" - report_content: {current_state.get('report_content', 'Not written')[:50]}...") print(f" - structured_report: {current_state.get('structured_report') is not None}") # Check for agent name changes (handoffs) if hasattr(event, 'current_agent_name'): print(f" šŸ¤– Current Agent: {event.current_agent_name}") if hasattr(event, 'tool_output'): tool_result_info = { 'tool_name': getattr(event, 'tool_name', 'unknown'), 'tool_output': event.tool_output, 'event_type': event_type } tool_results_seen.append(tool_result_info) print(f" šŸ”§ Tool Result: {getattr(event, 'tool_name', 'unknown')}") print(f" Output: {str(event.tool_output)[:100]}...") print(f"\nšŸ“Š Summary:") print(f"Tool calls seen: {len(tool_calls_seen)}") print(f"Tool results seen: {len(tool_results_seen)}") for i, call in enumerate(tool_calls_seen): print(f" Call {i+1}: {call['tool_name']} ({call['event_type']})") for i, result in enumerate(tool_results_seen): print(f" Result {i+1}: {result['tool_name']} ({result['event_type']})") # Final state check final_state = get_workflow_state() print(f"\nFinal state:") print(f"- Research notes: {len(final_state.get('research_notes', {}))}") print(f"- Report content: {final_state.get('report_content', 'Not written')[:100]}...") print(f"- Has structured report: {final_state.get('structured_report') is not None}") # Try to identify the issue write_report_calls = [c for c in tool_calls_seen if c['tool_name'] == 'write_report'] write_report_results = [r for r in tool_results_seen if r['tool_name'] == 'write_report'] print(f"\nDiagnosis:") print(f"- write_report calls: {len(write_report_calls)}") print(f"- write_report results: {len(write_report_results)}") if write_report_calls and not write_report_results: print("āŒ ISSUE: write_report tool was called but no results were seen!") print("This suggests the tool function is never actually executed.") elif len(write_report_calls) != len(write_report_results): print(f"āŒ ISSUE: Mismatch between calls ({len(write_report_calls)}) and results ({len(write_report_results)})") else: print("āœ… Tool call/result count matches") if __name__ == "__main__": asyncio.run(test_workflow_tool_execution())