feat: add close_sub_agent tool
This commit is contained in:
parent
1f105e7497
commit
3100643534
@ -1369,6 +1369,20 @@ class MainTerminal:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"function": {
|
||||||
|
"name": "close_sub_agent",
|
||||||
|
"description": "强制关闭指定子智能体,适用于长时间无响应、超时或卡死的任务。使用前请确认必要的日志/文件已保留,操作会立即终止该任务。",
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"task_id": {"type": "string", "description": "子智能体任务ID"},
|
||||||
|
"agent_id": {"type": "integer", "description": "子智能体编号(1~5),若缺少 task_id 可用"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": {
|
"function": {
|
||||||
@ -1990,6 +2004,12 @@ class MainTerminal:
|
|||||||
timeout_seconds=wait_timeout
|
timeout_seconds=wait_timeout
|
||||||
)
|
)
|
||||||
self._record_sub_agent_message(result.get("system_message"), result.get("task_id"), inline=False)
|
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")
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
result = {"success": False, "error": f"未知工具: {tool_name}"}
|
result = {"success": False, "error": f"未知工具: {tool_name}"}
|
||||||
|
|||||||
@ -206,6 +206,31 @@ class SubAgentManager:
|
|||||||
self._save_state()
|
self._save_state()
|
||||||
return finalize_result
|
return finalize_result
|
||||||
|
|
||||||
|
def terminate_sub_agent(
|
||||||
|
self,
|
||||||
|
*,
|
||||||
|
task_id: Optional[str] = None,
|
||||||
|
agent_id: Optional[int] = None,
|
||||||
|
) -> Dict:
|
||||||
|
"""强制关闭指定子智能体。"""
|
||||||
|
task = self._select_task(task_id, agent_id)
|
||||||
|
if not task:
|
||||||
|
return {"success": False, "error": "未找到对应的子智能体任务"}
|
||||||
|
|
||||||
|
task_id = task["task_id"]
|
||||||
|
response = self._call_service("POST", f"/tasks/{task_id}/terminate", timeout=10)
|
||||||
|
if response.get("success"):
|
||||||
|
task["status"] = "terminated"
|
||||||
|
task["final_result"] = {
|
||||||
|
"success": False,
|
||||||
|
"status": "terminated",
|
||||||
|
"task_id": task_id,
|
||||||
|
"agent_id": task.get("agent_id"),
|
||||||
|
"message": response.get("message") or "子智能体已被强制关闭。",
|
||||||
|
}
|
||||||
|
self._save_state()
|
||||||
|
return response
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# 内部工具方法
|
# 内部工具方法
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
|
|||||||
@ -2132,6 +2132,32 @@ def stop_sub_agent_task(task_id: str) -> Dict[str, Any]:
|
|||||||
return {"success": True, "message": "已发送停止指令"}
|
return {"success": True, "message": "已发送停止指令"}
|
||||||
|
|
||||||
|
|
||||||
|
def force_terminate_sub_agent(task_id: str) -> Dict[str, Any]:
|
||||||
|
cleanup_inactive_sub_agent_tasks()
|
||||||
|
task = sub_agent_tasks.get(task_id)
|
||||||
|
if not task:
|
||||||
|
return {"success": False, "error": "任务不存在"}
|
||||||
|
|
||||||
|
client_sid = task.get("last_client_sid")
|
||||||
|
if client_sid and client_sid in stop_flags:
|
||||||
|
stop_flags[client_sid]["stop"] = True
|
||||||
|
|
||||||
|
terminal = sub_agent_terminals.get(task_id)
|
||||||
|
if terminal:
|
||||||
|
try:
|
||||||
|
reset_system_state(terminal)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
update_sub_agent_task(task_id, status="terminated")
|
||||||
|
broadcast_sub_agent_event(task_id, "sub_agent_status", {
|
||||||
|
"status": "terminated",
|
||||||
|
"message": "子智能体已强制关闭"
|
||||||
|
})
|
||||||
|
_purge_sub_agent_task(task_id)
|
||||||
|
return {"success": True, "message": "子智能体已强制关闭"}
|
||||||
|
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# 子智能体任务API(主智能体调用,免登录)
|
# 子智能体任务API(主智能体调用,免登录)
|
||||||
# ==========================================
|
# ==========================================
|
||||||
@ -2189,6 +2215,13 @@ def api_stop_sub_agent(task_id: str):
|
|||||||
return jsonify(result), status_code
|
return jsonify(result), status_code
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/tasks/<task_id>/terminate', methods=['POST'])
|
||||||
|
def api_terminate_sub_agent(task_id: str):
|
||||||
|
result = force_terminate_sub_agent(task_id)
|
||||||
|
status_code = 200 if result.get("success") else 400
|
||||||
|
return jsonify(result), status_code
|
||||||
|
|
||||||
|
|
||||||
@app.route('/tasks/<task_id>/conversation', methods=['GET'])
|
@app.route('/tasks/<task_id>/conversation', methods=['GET'])
|
||||||
def api_get_sub_agent_conversation(task_id: str):
|
def api_get_sub_agent_conversation(task_id: str):
|
||||||
info = get_task_record(task_id)
|
info = get_task_record(task_id)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user