Skip to content

Commit 9106495

Browse files
authored
fix(agentscope): fix illegal tool argument message transfer (#266)
1 parent 2e3a6f7 commit 9106495

File tree

1 file changed

+37
-5
lines changed
  • src/agentscope_runtime/adapters/agentscope

1 file changed

+37
-5
lines changed

src/agentscope_runtime/adapters/agentscope/message.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)