@@ -228,29 +228,38 @@ def _convert_tool_response_to_str(tool_response: list[ToolInvokeMessage]) -> str
228228 """
229229 Handle tool response
230230 """
231- result = ""
231+ parts : list [str ] = []
232+ json_parts : list [str ] = []
233+
232234 for response in tool_response :
233235 if response .type == ToolInvokeMessage .MessageType .TEXT :
234- result += cast (ToolInvokeMessage .TextMessage , response .message ).text
236+ parts . append ( cast (ToolInvokeMessage .TextMessage , response .message ).text )
235237 elif response .type == ToolInvokeMessage .MessageType .LINK :
236- result += (
238+ parts . append (
237239 f"result link: { cast (ToolInvokeMessage .TextMessage , response .message ).text } ."
238240 + " please tell user to check it."
239241 )
240242 elif response .type in {ToolInvokeMessage .MessageType .IMAGE_LINK , ToolInvokeMessage .MessageType .IMAGE }:
241- result += (
243+ parts . append (
242244 "image has been created and sent to user already, "
243245 + "you do not need to create it, just tell the user to check it now."
244246 )
245247 elif response .type == ToolInvokeMessage .MessageType .JSON :
246- result += json .dumps (
247- safe_json_value (cast (ToolInvokeMessage .JsonMessage , response .message ).json_object ),
248- ensure_ascii = False ,
248+ json_parts .append (
249+ json .dumps (
250+ safe_json_value (cast (ToolInvokeMessage .JsonMessage , response .message ).json_object ),
251+ ensure_ascii = False ,
252+ )
249253 )
250254 else :
251- result += str (response .message )
255+ parts . append ( str (response .message ) )
252256
253- return result
257+ # Add JSON parts, avoiding duplicates from text parts.
258+ if json_parts :
259+ existing_parts = set (parts )
260+ parts .extend (p for p in json_parts if p not in existing_parts )
261+
262+ return "" .join (parts )
254263
255264 @staticmethod
256265 def _extract_tool_response_binary_and_text (
0 commit comments