From 6fb9c4cf22d80014168bc214aa58b60348c59b42 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Tue, 18 Nov 2025 18:20:14 +0800 Subject: [PATCH] fix: align sub agent tool logging order --- core/main_terminal.py | 29 ++++++++++++++++------------- sub_agent/core/main_terminal.py | 1 - sub_agent/web_server.py | 19 ++++++++----------- web_server.py | 18 +++++------------- 4 files changed, 29 insertions(+), 38 deletions(-) diff --git a/core/main_terminal.py b/core/main_terminal.py index ae258fe..fa6d9fa 100644 --- a/core/main_terminal.py +++ b/core/main_terminal.py @@ -535,6 +535,7 @@ class MainTerminal: collected_tool_calls.append(tool_call_info) # 处理工具结果用于保存 + result_data = {} try: result_data = json.loads(result) if tool_name == "read_file" and result_data.get("success"): @@ -549,7 +550,9 @@ class MainTerminal: collected_tool_results.append({ "tool_call_id": tool_call_id, "name": tool_name, - "content": tool_result_content + "content": tool_result_content, + "system_message": result_data.get("system_message") if isinstance(result_data, dict) else None, + "task_id": result_data.get("task_id") if isinstance(result_data, dict) else None }) return result @@ -592,13 +595,16 @@ class MainTerminal: ) # 3. 保存独立的tool消息 - for tool_result in collected_tool_results: - self.context_manager.add_conversation( - "tool", - tool_result["content"], - tool_call_id=tool_result["tool_call_id"], - name=tool_result["name"] - ) + for tool_result in collected_tool_results: + self.context_manager.add_conversation( + "tool", + tool_result["content"], + tool_call_id=tool_result["tool_call_id"], + name=tool_result["name"] + ) + system_message = tool_result.get("system_message") + if system_message: + self._record_sub_agent_message(system_message, tool_result.get("task_id"), inline=False) # 4. 在终端显示执行信息(不保存到历史) if collected_tool_calls: @@ -1000,7 +1006,7 @@ class MainTerminal: "type": "object", "properties": { "path": {"type": "string", "description": "项目内的图片路径"}, - "prompt": {"type": "string", "description": "传递给 OCR 模型的提示词,如“请识别图片中的文字”"} + "prompt": {"type": "string", "description": "传递给 OCR 模型的提示词,如“请识别图片中的文字”,必须使用中文提示词。"} }, "required": ["path", "prompt"] } @@ -1416,7 +1422,7 @@ class MainTerminal: "target_dir": {"type": "string", "description": "项目下用于接收交付的相对目录"}, "reference_files": { "type": "array", - "description": "提供给子智能体的参考文件列表(相对路径)", + "description": "提供给子智能体的参考文件列表(相对路径),禁止在summary和task中直接告知子智能体引用图片的路径,必须使用本参数提供", "items": {"type": "string"}, "maxItems": 10 }, @@ -2028,15 +2034,12 @@ class MainTerminal: agent_id=arguments.get("agent_id"), timeout_seconds=wait_timeout ) - self._record_sub_agent_message(result.get("system_message"), result.get("task_id"), inline=False) elif tool_name == "close_sub_agent": result = self.sub_agent_manager.terminate_sub_agent( task_id=arguments.get("task_id"), agent_id=arguments.get("agent_id") ) - message = result.get("message") or result.get("error") - self._record_sub_agent_message(message, result.get("task_id"), inline=False) else: result = {"success": False, "error": f"未知工具: {tool_name}"} diff --git a/sub_agent/core/main_terminal.py b/sub_agent/core/main_terminal.py index 51230f6..057d49a 100644 --- a/sub_agent/core/main_terminal.py +++ b/sub_agent/core/main_terminal.py @@ -2005,7 +2005,6 @@ class MainTerminal: agent_id=arguments.get("agent_id"), timeout_seconds=arguments.get("timeout_seconds") ) - self._record_sub_agent_message(result.get("system_message"), result.get("task_id"), inline=False) else: result = {"success": False, "error": f"未知工具: {tool_name}"} diff --git a/sub_agent/web_server.py b/sub_agent/web_server.py index 45f89cb..3909f6e 100644 --- a/sub_agent/web_server.py +++ b/sub_agent/web_server.py @@ -85,6 +85,7 @@ sub_agent_rooms: Dict[str, set] = defaultdict(set) sub_agent_connections: Dict[str, str] = {} SUB_AGENT_TERMINAL_STATUSES = {"completed", "failed", "timeout"} STOPPING_GRACE_SECONDS = 30 +TERMINAL_ARCHIVE_GRACE_SECONDS = 20 def format_read_file_result(result_data: Dict) -> str: """格式化 read_file 工具的输出,便于在Web端展示。""" @@ -253,7 +254,9 @@ def cleanup_inactive_sub_agent_tasks(force: bool = False): for task_id, task in list(sub_agent_tasks.items()): status = (task.get("status") or "").lower() if status in SUB_AGENT_TERMINAL_STATUSES: - _purge_sub_agent_task(task_id) + updated_at = task.get("updated_at") or task.get("created_at") or now + if force or (now - updated_at) > TERMINAL_ARCHIVE_GRACE_SECONDS: + _purge_sub_agent_task(task_id) continue if status == "stopping": updated_at = task.get("updated_at") or task.get("created_at") or now @@ -3898,16 +3901,6 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client last_tool_name = tool_name - # ===== 增量保存:保存工具调用信息 ===== - if tool_calls: - # 保存assistant消息(只包含工具调用信息,内容为空) - web_terminal.context_manager.add_conversation( - "assistant", - "", # 空内容,只记录工具调用 - tool_calls - ) - debug_log(f"💾 增量保存:工具调用信息 ({len(tool_calls)} 个工具)") - # 更新统计 total_tool_calls += len(tool_calls) @@ -4012,6 +4005,7 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client await asyncio.sleep(1.5 - execution_time) # 更新工具状态 + result_data = {} try: result_data = json.loads(tool_result) except: @@ -4124,6 +4118,9 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client name=function_name ) debug_log(f"💾 增量保存:工具结果 {function_name}") + system_message = result_data.get("system_message") if isinstance(result_data, dict) else None + if system_message: + web_terminal._record_sub_agent_message(system_message, result_data.get("task_id"), inline=False) # 添加到消息历史(用于API继续对话) messages.append({ diff --git a/web_server.py b/web_server.py index d1c0546..18dcff8 100644 --- a/web_server.py +++ b/web_server.py @@ -3137,8 +3137,7 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client } messages.append(assistant_message) - - if assistant_content or current_thinking: + if assistant_content or current_thinking or tool_calls: web_terminal.context_manager.add_conversation( "assistant", assistant_content, @@ -3209,17 +3208,6 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client consecutive_same_tool[tool_name] = 1 last_tool_name = tool_name - - # ===== 增量保存:保存工具调用信息 ===== - if tool_calls: - # 保存assistant消息(只包含工具调用信息,内容为空) - web_terminal.context_manager.add_conversation( - "assistant", - "", # 空内容,只记录工具调用 - tool_calls - ) - debug_log(f"💾 增量保存:工具调用信息 ({len(tool_calls)} 个工具)") - # 更新统计 total_tool_calls += len(tool_calls) @@ -3322,6 +3310,7 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client await asyncio.sleep(1.5 - execution_time) # 更新工具状态 + result_data = {} try: result_data = json.loads(tool_result) except: @@ -3434,6 +3423,9 @@ async def handle_task_with_sender(terminal: WebTerminal, message, sender, client name=function_name ) debug_log(f"💾 增量保存:工具结果 {function_name}") + system_message = result_data.get("system_message") if isinstance(result_data, dict) else None + if system_message: + web_terminal._record_sub_agent_message(system_message, result_data.get("task_id"), inline=False) # 添加到消息历史(用于API继续对话) messages.append({