fix: align sub agent tool logging order

This commit is contained in:
JOJO 2025-11-18 18:20:14 +08:00
parent 71f24c2d72
commit 6fb9c4cf22
4 changed files with 29 additions and 38 deletions

View File

@ -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}"}

View File

@ -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}"}

View File

@ -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({

View File

@ -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({