@@ -380,21 +380,26 @@ async def _handle_model_request_event(
380
380
yield TextMessageStartEvent (
381
381
message_id = message_id ,
382
382
)
383
- stream_ctx .part_end = TextMessageEndEvent (
384
- message_id = message_id ,
385
- )
386
383
if part .content : # pragma: no branch
387
384
yield TextMessageContentEvent (
388
385
message_id = message_id ,
389
386
delta = part .content ,
390
387
)
388
+ stream_ctx .part_end = TextMessageEndEvent (
389
+ message_id = message_id ,
390
+ )
391
391
elif isinstance (part , ToolCallPart ): # pragma: no branch
392
392
message_id = stream_ctx .message_id or stream_ctx .new_message_id ()
393
393
yield ToolCallStartEvent (
394
394
tool_call_id = part .tool_call_id ,
395
395
tool_call_name = part .tool_name ,
396
396
parent_message_id = message_id ,
397
397
)
398
+ if part .args :
399
+ yield ToolCallArgsEvent (
400
+ tool_call_id = part .tool_call_id ,
401
+ delta = part .args if isinstance (part .args , str ) else json .dumps (part .args ),
402
+ )
398
403
stream_ctx .part_end = ToolCallEndEvent (
399
404
tool_call_id = part .tool_call_id ,
400
405
)
@@ -403,6 +408,8 @@ async def _handle_model_request_event(
403
408
yield ThinkingTextMessageStartEvent (
404
409
type = EventType .THINKING_TEXT_MESSAGE_START ,
405
410
)
411
+ # Always send the content even if it's empty, as it may be
412
+ # used to indicate the start of thinking.
406
413
yield ThinkingTextMessageContentEvent (
407
414
type = EventType .THINKING_TEXT_MESSAGE_CONTENT ,
408
415
delta = part .content ,
0 commit comments