From 6ee910f9cc53b4f898e6a42bf8287bc93885757d Mon Sep 17 00:00:00 2001 From: Cursx <33718736+Cursx@users.noreply.github.com> Date: Fri, 31 Oct 2025 18:48:37 +0800 Subject: [PATCH 1/3] Refactor tool response conversion to use lists Refactor tool response handling to use lists for parts and JSON messages. Ensure proper concatenation and avoid duplication of messages. --- api/core/tools/tool_engine.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/api/core/tools/tool_engine.py b/api/core/tools/tool_engine.py index 9fb6062770bd26..83111fb3377415 100644 --- a/api/core/tools/tool_engine.py +++ b/api/core/tools/tool_engine.py @@ -228,29 +228,39 @@ def _convert_tool_response_to_str(tool_response: list[ToolInvokeMessage]) -> str """ Handle tool response """ - result = "" + parts: list[str] = [] + json_parts: list[str] = [] + saw_text = False + for response in tool_response: if response.type == ToolInvokeMessage.MessageType.TEXT: - result += cast(ToolInvokeMessage.TextMessage, response.message).text + parts.append(cast(ToolInvokeMessage.TextMessage, response.message).text) + saw_text = True elif response.type == ToolInvokeMessage.MessageType.LINK: - result += ( + parts.append( f"result link: {cast(ToolInvokeMessage.TextMessage, response.message).text}." + " please tell user to check it." ) elif response.type in {ToolInvokeMessage.MessageType.IMAGE_LINK, ToolInvokeMessage.MessageType.IMAGE}: - result += ( + parts.append( "image has been created and sent to user already, " + "you do not need to create it, just tell the user to check it now." ) elif response.type == ToolInvokeMessage.MessageType.JSON: - result += json.dumps( - safe_json_value(cast(ToolInvokeMessage.JsonMessage, response.message).json_object), - ensure_ascii=False, + json_parts.append( + json.dumps( + safe_json_value(cast(ToolInvokeMessage.JsonMessage, response.message).json_object), + ensure_ascii=False, + ) ) else: - result += str(response.message) + parts.append(str(response.message)) - return result + # If no TEXT message is present, append JSON parts to avoid duplication. + if not saw_text and json_parts: + parts.extend(json_parts) + + return "".join(parts) @staticmethod def _extract_tool_response_binary_and_text( From 4f6de55cde460111337251f8c7a02180e1d779be Mon Sep 17 00:00:00 2001 From: Cursx <33718736+Cursx@users.noreply.github.com> Date: Fri, 31 Oct 2025 19:14:44 +0800 Subject: [PATCH 2/3] Update tool_engine.py --- api/core/tools/tool_engine.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/core/tools/tool_engine.py b/api/core/tools/tool_engine.py index 83111fb3377415..9b3fd0f61a0aea 100644 --- a/api/core/tools/tool_engine.py +++ b/api/core/tools/tool_engine.py @@ -256,9 +256,10 @@ def _convert_tool_response_to_str(tool_response: list[ToolInvokeMessage]) -> str else: parts.append(str(response.message)) - # If no TEXT message is present, append JSON parts to avoid duplication. - if not saw_text and json_parts: - parts.extend(json_parts) + # Add JSON parts, avoiding duplicates from text parts. + if json_parts: + existing_parts = set(parts) + parts.extend(p for p in json_parts if p not in existing_parts) return "".join(parts) From 295d7e7beeb7fdc56bba58f5dc69bc2782d4203b Mon Sep 17 00:00:00 2001 From: Cursx <33718736+Cursx@users.noreply.github.com> Date: Fri, 31 Oct 2025 19:35:52 +0800 Subject: [PATCH 3/3] Update tool_engine.py --- api/core/tools/tool_engine.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/api/core/tools/tool_engine.py b/api/core/tools/tool_engine.py index 9b3fd0f61a0aea..92d441b5acb3a4 100644 --- a/api/core/tools/tool_engine.py +++ b/api/core/tools/tool_engine.py @@ -230,12 +230,10 @@ def _convert_tool_response_to_str(tool_response: list[ToolInvokeMessage]) -> str """ parts: list[str] = [] json_parts: list[str] = [] - saw_text = False for response in tool_response: if response.type == ToolInvokeMessage.MessageType.TEXT: parts.append(cast(ToolInvokeMessage.TextMessage, response.message).text) - saw_text = True elif response.type == ToolInvokeMessage.MessageType.LINK: parts.append( f"result link: {cast(ToolInvokeMessage.TextMessage, response.message).text}." @@ -256,7 +254,7 @@ def _convert_tool_response_to_str(tool_response: list[ToolInvokeMessage]) -> str else: parts.append(str(response.message)) - # Add JSON parts, avoiding duplicates from text parts. + # Add JSON parts, avoiding duplicates from text parts. if json_parts: existing_parts = set(parts) parts.extend(p for p in json_parts if p not in existing_parts)