33Provides detailed monitoring and response handling for different agent types.
44"""
55import asyncio
6+ import json
7+ import logging
68import sys
9+ import time
710
811from semantic_kernel .contents import (ChatMessageContent ,
912 StreamingChatMessageContent )
1013from v3 .config .settings import connection_config , current_user_id
14+ from v3 .models .messages import (AgentMessage , AgentMessageStreaming ,
15+ AgentToolCall , AgentToolMessage )
1116
1217
1318def agent_response_callback (message : ChatMessageContent , user_id : str = None ) -> None :
@@ -16,39 +21,39 @@ def agent_response_callback(message: ChatMessageContent, user_id: str = None) ->
1621
1722 # Get agent name to determine handling
1823 agent_name = message .name or "Unknown Agent"
19-
24+ # Get message type
25+ content_type = getattr (message , 'content_type' , 'text' )
26+
2027 role = getattr (message , 'role' , 'unknown' )
2128
2229 # Send to WebSocket
2330 if user_id :
2431 try :
25- asyncio .create_task (connection_config .send_status_update_async ({
26- "type" : "agent_message" ,
27- "data" : {"agent_name" : agent_name , "content" : message .content , "role" : role }
28- }, user_id ))
32+ if message .items and message .items [0 ].content_type == 'function_call' :
33+ final_message = AgentToolMessage (agent_name = agent_name )
34+ for item in message .items :
35+ if item .content_type == 'function_call' :
36+ tool_call = AgentToolCall (tool_name = item .name or "unknown_tool" , arguments = item .arguments or {})
37+ final_message .tool_calls .append (tool_call )
38+ asyncio .create_task (connection_config .send_status_update_async (final_message , user_id ))
39+ logging .info (f"Function call: { final_message } " )
40+ elif message .items and message .items [0 ].content_type == 'function_result' :
41+ # skip returning these results for now - agent will return in a later message
42+ pass
43+ else :
44+ final_message = AgentMessage (agent_name = agent_name , timestamp = time .time () or "" , content = message .content or "" )
45+ asyncio .create_task (connection_config .send_status_update_async (final_message , user_id ))
46+ logging .info (f"{ role .capitalize ()} message: { final_message } " )
2947 except Exception as e :
30- print (f"Error sending WebSocket message: { e } " )
31-
32- print (f"\n **{ agent_name } ** (role: { role } )" )
33-
34- if message .items [- 1 ].content_type == 'function_call' :
35- print (f"🔧 Function call: { message .items [- 1 ].function_name } , Arguments: { message .items [- 1 ].arguments } " )
36-
48+ logging .error (f"Response_callback: Error sending WebSocket message: { e } " )
3749
38- # Add this function after your agent_response_callback function
3950async def streaming_agent_response_callback (streaming_message : StreamingChatMessageContent , is_final : bool , user_id : str = None ) -> None :
4051 """Simple streaming callback to show real-time agent responses."""
41- if streaming_message .name != "CoderAgent" :
42- # Print streaming content as it arrives
43- if hasattr (streaming_message , 'content' ) and streaming_message .content :
44- print (streaming_message .content , end = '' , flush = False )
45-
46- # Send to WebSocket
47- if user_id :
48- try :
49- await connection_config .send_status_update_async ({
50- "type" : "streaming_message" ,
51- "data" : {"agent_name" : streaming_message .name or "Unknown Agent" , "content" : streaming_message .content , "is_final" : is_final }
52- }, user_id )
53- except Exception as e :
54- print (f"Error sending streaming WebSocket message: { e } " )
52+ # process only content messages
53+ if hasattr (streaming_message , 'content' ) and streaming_message .content :
54+ if user_id :
55+ try :
56+ message = AgentMessageStreaming (agent_name = streaming_message .name or "Unknown Agent" , content = streaming_message .content , is_final = is_final )
57+ await connection_config .send_status_update_async (message , user_id )
58+ except Exception as e :
59+ logging .error (f"Response_callback: Error sending streaming WebSocket message: { e } " )
0 commit comments