@@ -338,6 +338,16 @@ def message_to_agentscope_msg(
338338 A single Msg object or a list of Msg objects.
339339 """
340340
341+ def _try_loads (v , default , keep_original = False ):
342+ if isinstance (v , (dict , list )):
343+ return v
344+ if isinstance (v , str ) and v .strip ():
345+ try :
346+ return json .loads (v )
347+ except Exception :
348+ return v if keep_original else default
349+ return default
350+
341351 def _convert_one (message : Message ) -> Msg :
342352 # Normalize role
343353 if message .role == "tool" :
@@ -365,12 +375,23 @@ def _convert_one(message: Message) -> Msg:
365375 MessageType .FUNCTION_CALL ,
366376 ):
367377 # convert PLUGIN_CALL, FUNCTION_CALL to ToolUseBlock
378+ tool_args = None
379+ for cnt in reversed (message .content ):
380+ if hasattr (cnt , "data" ):
381+ v = cnt .data .get ("arguments" )
382+ if isinstance (v , (dict , list )) or (
383+ isinstance (v , str ) and v .strip ()
384+ ):
385+ tool_args = _try_loads (v , {}, keep_original = False )
386+ break
387+ if tool_args is None :
388+ tool_args = {}
368389 result ["content" ] = [
369390 ToolUseBlock (
370391 type = "tool_use" ,
371392 id = message .content [0 ].data ["call_id" ],
372393 name = message .content [0 ].data .get ("name" ),
373- input = json . loads ( message . content [ 0 ]. data [ "arguments" ]) ,
394+ input = tool_args ,
374395 ),
375396 ]
376397 elif message .type in (
@@ -379,7 +400,18 @@ def _convert_one(message: Message) -> Msg:
379400 ):
380401 # convert PLUGIN_CALL_OUTPUT, FUNCTION_CALL_OUTPUT to
381402 # ToolResultBlock
382- blk = json .loads (message .content [0 ].data ["output" ])
403+ out = None
404+ for cnt in reversed (message .content ):
405+ if hasattr (cnt , "data" ):
406+ v = cnt .data .get ("output" )
407+ if isinstance (v , (dict , list )) or (
408+ isinstance (v , str ) and v .strip ()
409+ ):
410+ out = _try_loads (v , "" , keep_original = True )
411+ break
412+ if out is None :
413+ out = ""
414+ blk = out
383415
384416 def is_valid_block (obj ):
385417 return any (
@@ -389,12 +421,12 @@ def is_valid_block(obj):
389421
390422 if isinstance (blk , list ):
391423 if not all (is_valid_block (item ) for item in blk ):
392- blk = message . content [ 0 ]. data [ "output" ]
424+ blk = out
393425 elif isinstance (blk , dict ):
394426 if not is_valid_block (blk ):
395- blk = message . content [ 0 ]. data [ "output" ]
427+ blk = out
396428 else :
397- blk = message . content [ 0 ]. data [ "output" ]
429+ blk = out
398430
399431 result ["content" ] = [
400432 ToolResultBlock (
0 commit comments