debug_streaming.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. """
  2. Debug Streaming for FastAPI Integration
  3. This script helps debug the streaming events and shows exactly what fields
  4. are being sent in the SSE stream, particularly focusing on agent/callerAgent fields.
  5. Run this after starting the server to see raw event data.
  6. """
  7. import json
  8. import requests
  9. def debug_streaming() -> None:
  10. """Debug streaming to see exact event structure."""
  11. print("🔍 Debugging FastAPI Streaming Events")
  12. print("=" * 60)
  13. url = "http://localhost:8080/my-agency/get_response_stream"
  14. payload = {"message": "What's up, bro? Call the second agent to call ExampleTool", "chat_history": []}
  15. print(f"📤 Request: {payload['message']}\n")
  16. response = requests.post(url, json=payload, stream=True)
  17. if response.status_code == 200:
  18. event_count = 0
  19. # Track specific field occurrences
  20. agent_count = 0
  21. caller_agent_count = 0
  22. call_id_count = 0
  23. item_id_count = 0
  24. print("Raw events (first 20):\n")
  25. for line in response.iter_lines():
  26. if line:
  27. line_str = line.decode("utf-8")
  28. if line_str.startswith("data: "):
  29. data_str = line_str[6:]
  30. if data_str == "[DONE]":
  31. break
  32. try:
  33. data = json.loads(data_str)
  34. event_count += 1
  35. # For final messages event
  36. if "new_messages" in data:
  37. print("\n=== FINAL MESSAGES EVENT ===")
  38. print(f"Number of messages: {len(data['new_messages'])}")
  39. for i, msg in enumerate(data["new_messages"][:3], 1):
  40. print(f"\nMessage {i}:")
  41. print(f" agent: {msg.get('agent', None)}")
  42. print(f" callerAgent: {msg.get('callerAgent', None)}")
  43. print(f" type: {msg.get('type', msg.get('role', 'unknown'))}")
  44. continue
  45. # Show first 20 events in detail
  46. if event_count <= 20:
  47. print(f"\n--- Event #{event_count} ---")
  48. # Check if data is wrapped
  49. if "data" in data:
  50. print("⚠️ Event is wrapped in 'data' field")
  51. event_content = data["data"]
  52. else:
  53. event_content = data
  54. # Check for our key fields
  55. has_agent = "agent" in event_content
  56. has_caller = "callerAgent" in event_content
  57. has_call_id = "call_id" in event_content
  58. has_item_id = "item_id" in event_content
  59. if has_agent:
  60. agent_count += 1
  61. print(f" agent: {event_content['agent']}")
  62. else:
  63. print(" agent: None")
  64. if has_caller:
  65. caller_agent_count += 1
  66. print(f" callerAgent: {event_content['callerAgent']}")
  67. else:
  68. print(" callerAgent: None")
  69. if has_call_id:
  70. call_id_count += 1
  71. print(f" call_id: {event_content['call_id'][:30]}...")
  72. if has_item_id:
  73. item_id_count += 1
  74. print(f" item_id: {event_content['item_id'][:30]}...")
  75. # Show event type
  76. if "type" in event_content:
  77. print(f" type: {event_content['type']}")
  78. # Show nested structure if complex
  79. if "data" in event_content and isinstance(event_content["data"], dict):
  80. if "type" in event_content["data"]:
  81. print(f" data.type: {event_content['data']['type']}")
  82. else:
  83. # Just count fields for remaining events
  84. if "data" in data:
  85. event_content = data["data"]
  86. else:
  87. event_content = data
  88. if "agent" in event_content:
  89. agent_count += 1
  90. if "callerAgent" in event_content:
  91. caller_agent_count += 1
  92. if "call_id" in event_content:
  93. call_id_count += 1
  94. if "item_id" in event_content:
  95. item_id_count += 1
  96. except json.JSONDecodeError as e:
  97. print(f"⚠️ JSON parse error: {e}")
  98. print("\n" + "=" * 60)
  99. print("📊 Field occurrence summary:")
  100. print(f" Total events: {event_count}")
  101. print(f" Events with 'agent': {agent_count} ({agent_count * 100 // max(event_count, 1)}%)")
  102. print(f" Events with 'callerAgent': {caller_agent_count} ({caller_agent_count * 100 // max(event_count, 1)}%)")
  103. print(f" Events with 'call_id': {call_id_count} ({call_id_count * 100 // max(event_count, 1)}%)")
  104. print(f" Events with 'item_id': {item_id_count} ({item_id_count * 100 // max(event_count, 1)}%)")
  105. if agent_count < event_count * 0.8:
  106. print("\n⚠️ WARNING: Less than 80% of events have 'agent' field!")
  107. print(" This indicates the field is not being properly propagated.")
  108. else:
  109. print("\n✅ Good: Most events have the 'agent' field")
  110. else:
  111. print(f"❌ Error: {response.status_code}")
  112. print(response.text)
  113. if __name__ == "__main__":
  114. try:
  115. debug_streaming()
  116. except requests.exceptions.ConnectionError:
  117. print("❌ Could not connect to server. Make sure it's running:")
  118. print(" python server.py")
  119. except Exception as e:
  120. print(f"❌ Error: {e}")