@@ -50,8 +50,8 @@ def print_task_message(
5050
5151 # Skip empty reasoning messages
5252 if isinstance (message .content , ReasoningContent ):
53- has_summary = message .content .summary and any (s for s in message .content .summary if s )
54- has_content = message .content .content and any (c for c in message .content .content if c )
53+ has_summary = bool ( message .content .summary ) and any (s for s in message .content .summary if s )
54+ has_content = bool ( message .content .content ) and any (c for c in message .content .content if c ) if message . content . content is not None else False
5555 if not has_summary and not has_content :
5656 return
5757
@@ -136,18 +136,19 @@ def print_task_message(
136136
137137 if rich_print and console :
138138 author_color = "bright_cyan" if message .content .author == "user" else "green"
139- title = f"[bold { author_color } ]{ message .content .author .upper ()} [/bold { author_color } ] [{ timestamp } ]"
140139
141- # Use different border styles for tool messages
140+ # Use different border styles and colors for different content types
142141 if content_type == "tool_request" :
143142 border_style = "yellow"
144143 elif content_type == "tool_response" :
145144 border_style = "bright_green"
146145 elif content_type == "reasoning" :
147146 border_style = "bright_magenta"
147+ author_color = "bright_magenta" # Also make the author text magenta
148148 else :
149149 border_style = author_color
150-
150+
151+ title = f"[bold { author_color } ]{ message .content .author .upper ()} [/bold { author_color } ] [{ timestamp } ]"
151152 panel = Panel (Markdown (content ), title = title , border_style = border_style , width = 80 )
152153 console .print (panel )
153154 else :
@@ -330,6 +331,7 @@ def subscribe_to_async_task_messages(
330331
331332 # Deserialize the discriminated union TaskMessageUpdate based on the "type" field
332333 message_type = task_message_update_data .get ("type" , "unknown" )
334+
333335
334336 # Handle different message types for streaming progress
335337 if message_type == "start" :
@@ -360,11 +362,20 @@ def subscribe_to_async_task_messages(
360362 if index in active_spinners :
361363 active_spinners [index ].stop ()
362364 del active_spinners [index ]
365+ # Ensure clean line after spinner
366+ if print_messages :
367+ print ()
363368
364- if task_message_update .parent_task_message and task_message_update .parent_task_message .id :
365- finished_message = client .messages .retrieve (task_message_update .parent_task_message .id )
366- messages_to_return .append (finished_message )
367- print_task_message (finished_message , print_messages , rich_print )
369+ # Use the content directly from the stream event, not from re-fetching
370+ # The stream has the full content, but re-fetching sometimes returns empty arrays
371+ if task_message_update .parent_task_message :
372+ # Create a temporary message object with the stream content for display
373+ display_message = task_message_update .parent_task_message
374+ # Override the content with the stream's full content
375+ display_message .content = task_message_update .content
376+
377+ messages_to_return .append (display_message )
378+ print_task_message (display_message , print_messages , rich_print )
368379
369380 elif message_type == "done" :
370381 task_message_update = StreamTaskMessageDone .model_validate (task_message_update_data )
@@ -374,12 +385,24 @@ def subscribe_to_async_task_messages(
374385 if index in active_spinners :
375386 active_spinners [index ].stop ()
376387 del active_spinners [index ]
388+ # Ensure clean line after spinner
389+ if print_messages :
390+ print ()
377391
378392 if task_message_update .parent_task_message and task_message_update .parent_task_message .id :
379393 finished_message = client .messages .retrieve (task_message_update .parent_task_message .id )
380394 messages_to_return .append (finished_message )
381395 print_task_message (finished_message , print_messages , rich_print )
382396
397+ # Clean stream termination - break on done event
398+ if print_messages :
399+ console = Console (width = 80 ) if rich_print else None
400+ if console :
401+ console .print ("[dim]Stream ended - received 'done' event[/dim]" )
402+ else :
403+ print ("Stream ended - received 'done' event" )
404+ break
405+
383406 # Ignore "connected" message type
384407 elif message_type == "connected" :
385408 pass
0 commit comments