fix: align sub agent tool logging order
This commit is contained in:
parent
71f24c2d72
commit
6fb9c4cf22
@ -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}"}
|
||||
|
||||
@ -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}"}
|
||||
|
||||
@ -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({
|
||||
|
||||
@ -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({
|
||||
|
||||
Loading…
Reference in New Issue
Block a user