From 933b2157314421c95d1f3fb51bac82f4771eabdb Mon Sep 17 00:00:00 2001 From: C1-BA-B1-F3 Date: Thu, 25 Jun 2026 14:02:49 +0800 Subject: [PATCH 1/2] fix: serialize dict/list tool output to JSON (#6267) --- lib/crewai/src/crewai/tools/structured_tool.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/crewai/src/crewai/tools/structured_tool.py b/lib/crewai/src/crewai/tools/structured_tool.py index 8ecba85496..5bbd117f87 100644 --- a/lib/crewai/src/crewai/tools/structured_tool.py +++ b/lib/crewai/src/crewai/tools/structured_tool.py @@ -58,6 +58,8 @@ def _format_tool_output_for_agent(tool: Any, raw_result: Any) -> str: result_schema = getattr(tool, "result_schema", None) if not (isinstance(result_schema, type) and issubclass(result_schema, BaseModel)): + if isinstance(raw_result, (dict, list)): + return json.dumps(raw_result) return str(raw_result) try: @@ -80,6 +82,8 @@ def _format_tool_output_for_agent(tool: Any, raw_result: Any) -> str: RuntimeWarning, stacklevel=2, ) + if isinstance(raw_result, (dict, list)): + return json.dumps(raw_result) return str(raw_result) From 27dd283c3e39b0da22c6667cffe66eee771bb8ff Mon Sep 17 00:00:00 2001 From: C1-BA-B1-F3 Date: Fri, 26 Jun 2026 01:29:44 +0800 Subject: [PATCH 2/2] fix: use json.dumps(default=str) and update fallback warning message - Add default=str to json.dumps calls to handle non-JSON-serializable objects - Update warning message to accurately describe fallback behavior (JSON for dict/list, otherwise str) --- lib/crewai/src/crewai/tools/structured_tool.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/crewai/src/crewai/tools/structured_tool.py b/lib/crewai/src/crewai/tools/structured_tool.py index 5bbd117f87..f9ed0dbd15 100644 --- a/lib/crewai/src/crewai/tools/structured_tool.py +++ b/lib/crewai/src/crewai/tools/structured_tool.py @@ -59,7 +59,7 @@ def _format_tool_output_for_agent(tool: Any, raw_result: Any) -> str: result_schema = getattr(tool, "result_schema", None) if not (isinstance(result_schema, type) and issubclass(result_schema, BaseModel)): if isinstance(raw_result, (dict, list)): - return json.dumps(raw_result) + return json.dumps(raw_result, default=str) return str(raw_result) try: @@ -77,13 +77,13 @@ def _format_tool_output_for_agent(tool: Any, raw_result: Any) -> str: f"Failed to validate or serialize output from tool " f"'{getattr(tool, 'name', '')}' using result_schema " f"'{result_schema.__name__}': {exc.__class__.__name__}. " - "Falling back to str(raw_result)." + "Falling back to JSON for dict/list, otherwise str(raw_result)." ), RuntimeWarning, stacklevel=2, ) if isinstance(raw_result, (dict, list)): - return json.dumps(raw_result) + return json.dumps(raw_result, default=str) return str(raw_result)