File size: 4,821 Bytes
741c3da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""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())