工具执行引擎

📎 引用文件

本文引用的文件 - agent/src/agent/tools.py - agent/src/agent/loop.py - agent/src/tools/_shell_safety.py - agent/src/tools/background_tools.py - agent/src/core/runner.py - agent/tests/test_tool_timeout.py - agent/tests/test_runner_env.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与监控
  8. 故障排除指南
  9. 结论
  10. 附录

简介

本文件聚焦于“工具执行引擎”的核心能力,围绕 ToolRegistry.execute 的执行流程展开,覆盖工具查找、参数传递、异常处理与结果序列化;并说明异步执行、超时控制与错误重试机制;记录沙箱安全机制(命令执行限制与资源隔离);解释性能监控、日志记录与调试支持;最后给出故障排除指南以及工具执行的生命周期管理与资源清理机制。

项目结构

工具执行引擎由以下关键模块组成: - 工具注册与执行:ToolRegistry 提供工具注册、查询与统一执行入口,保证返回 JSON 字符串。 - Agent 循环:AgentLoop 负责 ReAct 主循环、上下文压缩、心跳、进度事件、工具调用编排与超时控制。 - 沙箱安全:_shell_safety.py 对危险命令进行静态检查,防止误杀 Python 进程。 - 后台任务:background_tools.py 提供后台进程组管理、超时终止、取消与状态查询。 - 子进程执行器:core/runner.py 在受限环境中运行生成的策略脚本,包含环境变量白名单、临时 HOME、资源限制等。

graph TB A["AgentLoop<br/>ReAct 主循环"] --> B["ToolRegistry<br/>工具注册与执行"] B --> C["具体工具实现<br/>如 BashTool / 数据工具"] A --> D["BackgroundManager<br/>后台任务管理"] A --> E["Runner<br/>子进程执行器"] C --> F["_shell_safety<br/>命令安全检查"] E --> G["沙箱环境<br/>HOME/RLIMIT/白名单"]

图表来源 - agent/src/agent/loop.py:502-750 - agent/src/agent/tools.py:54-84 - agent/src/tools/background_tools.py:102-319 - agent/src/core/runner.py:372-620 - agent/src/tools/_shell_safety.py:38-59

章节来源 - agent/src/agent/tools.py:54-84 - agent/src/agent/loop.py:502-750 - agent/src/tools/background_tools.py:102-319 - agent/src/core/runner.py:372-620 - agent/src/tools/_shell_safety.py:38-59

核心组件

章节来源 - agent/src/agent/tools.py:13-84 - agent/src/agent/loop.py:502-750 - agent/src/tools/background_tools.py:102-319 - agent/src/core/runner.py:372-620 - agent/src/tools/_shell_safety.py:38-59

架构总览

工具执行引擎以 AgentLoop 为中枢,将 LLM 的工具调用请求路由到 ToolRegistry,再由 Registry 定位具体工具执行。对于需要外部进程或长时间运行的任务,Engine 会委派给 BackgroundManager 或 Runner,分别处理后台任务与子进程执行。所有执行路径均具备超时、日志、进度事件与结果序列化保障。

sequenceDiagram participant L as "LLM" participant AL as "AgentLoop" participant TR as "ToolRegistry" participant T as "具体工具" participant BG as "BackgroundManager" participant R as "Runner" L->>AL : "生成工具调用" AL->>TR : "execute(name, params)" TR->>T : "tool.execute(**params)" alt "后台任务" T->>BG : "run(command)" BG-->>T : "task_id" T-->>AL : "JSON 结果" else "子进程执行" T->>R : "execute(entry_script, run_dir, ...)" R-->>T : "RunResult(成功/失败, 输出, 产物)" T-->>AL : "JSON 结果" end AL-->>L : "工具结果/进度事件"

图表来源 - agent/src/agent/loop.py:502-750 - agent/src/agent/tools.py:72-84 - agent/src/tools/background_tools.py:110-139 - agent/src/core/runner.py:503-620

详细组件分析

ToolRegistry.execute 执行流程

flowchart TD Start(["进入 execute"]) --> Lookup["按 name 查找工具"] Lookup --> Found{"找到工具?"} Found -- 否 --> ErrNotFound["返回 {status:error, error:'未找到'}"] Found -- 是 --> Call["调用 tool.execute(**params)"] Call --> TryOK{"是否抛出异常?"} TryOK -- 是 --> LogErr["记录异常日志"] LogErr --> ReturnErr["返回 {status:error, tool:name, error:str(exc)}"] TryOK -- 否 --> ReturnOK["返回工具输出的 JSON 字符串"] ErrNotFound --> End(["结束"]) ReturnErr --> End ReturnOK --> End

图表来源 - agent/src/agent/tools.py:72-84

章节来源 - agent/src/agent/tools.py:72-84

异步执行、超时控制与错误重试

sequenceDiagram participant AL as "AgentLoop" participant BG as "BackgroundManager" participant Proc as "子进程" AL->>BG : "run(command)" BG->>Proc : "start_new_session / CREATE_NEW_PROCESS_GROUP" Note over BG,Proc : "后台任务开始" loop "轮询" AL->>BG : "check_background(task_id)" BG-->>AL : "status/elapsed/remaining" end alt "用户取消" AL->>BG : "cancel_background(task_id)" BG->>Proc : "SIGTERM/SIGKILL (进程组)" BG-->>AL : "cancelled" end alt "超时" BG->>Proc : "terminate process tree" BG-->>AL : "timeout" end

图表来源 - agent/src/tools/background_tools.py:24-95 - agent/src/tools/background_tools.py:110-139 - agent/src/tools/background_tools.py:206-305 - agent/tests/test_tool_timeout.py:42-99

章节来源 - agent/src/tools/background_tools.py:24-95 - agent/src/tools/background_tools.py:110-139 - agent/src/tools/background_tools.py:206-305 - agent/tests/test_tool_timeout.py:42-99

沙箱安全机制

flowchart TD S(["命令输入"]) --> Check["broad_python_kill_error 检查"] Check --> Safe{"是否安全?"} Safe -- 否 --> Block["返回错误并拒绝执行"] Safe -- 是 --> Run["执行命令/后台任务"] Run --> Sandbox["Runner 沙箱环境"] Sandbox --> Env["环境变量白名单"] Sandbox --> Home["临时 HOME + 最小化重放目录"] Sandbox --> Limits["RLIMIT_AS / RLIMIT_NOFILE"] Sandbox --> User["可选 UID 降级"]

图表来源 - agent/src/tools/_shell_safety.py:38-59 - agent/src/core/runner.py:175-278 - agent/src/core/runner.py:113-172 - agent/src/core/runner.py:85-110 - agent/src/core/runner.py:480-501

章节来源 - agent/src/tools/_shell_safety.py:38-59 - agent/src/core/runner.py:113-172 - agent/src/core/runner.py:175-278 - agent/src/core/runner.py:85-110 - agent/src/core/runner.py:480-501

工具执行的生命周期管理与资源清理

stateDiagram-v2 [*] --> 已提交 已提交 --> 运行中 : "run(command)" 运行中 --> 已完成 : "正常退出" 运行中 --> 已取消 : "cancel_background" 运行中 --> 已超时 : "超时终止" 已取消 --> [*] 已完成 --> [*] 已超时 --> [*]

图表来源 - agent/src/tools/background_tools.py:110-139 - agent/src/tools/background_tools.py:141-204 - agent/src/core/runner.py:503-620

章节来源 - agent/src/tools/background_tools.py:110-139 - agent/src/tools/background_tools.py:141-204 - agent/src/core/runner.py:503-620

依赖关系分析

graph LR AL["AgentLoop"] --> TR["ToolRegistry"] AL --> BG["BackgroundManager"] AL --> R["Runner"] TR --> T["具体工具"] T --> SS["_shell_safety"] R --> OS["系统资源/环境变量"]

图表来源 - agent/src/agent/loop.py:502-750 - agent/src/agent/tools.py:54-84 - agent/src/tools/background_tools.py:102-319 - agent/src/core/runner.py:372-620 - agent/src/tools/_shell_safety.py:38-59

章节来源 - agent/src/agent/loop.py:502-750 - agent/src/agent/tools.py:54-84 - agent/src/tools/background_tools.py:102-319 - agent/src/core/runner.py:372-620 - agent/src/tools/_shell_safety.py:38-59

性能与监控

章节来源 - agent/src/agent/loop.py:227-320 - agent/src/agent/loop.py:175-205 - agent/src/tools/background_tools.py:141-204 - agent/src/core/runner.py:592-619

故障排除指南

章节来源 - agent/src/agent/tools.py:72-84 - agent/src/tools/background_tools.py:141-204 - agent/src/core/runner.py:592-619 - agent/tests/test_tool_timeout.py:42-99

结论

工具执行引擎通过 ToolRegistry 提供统一的工具执行入口,结合 AgentLoop 的上下文管理与心跳机制,实现了稳定、可观测的工具调用流程。后台任务与子进程执行器提供了异步执行、超时控制与安全隔离能力。沙箱机制通过命令安全检查、环境变量白名单、临时 HOME 与资源限制,有效降低了安全风险。整体架构兼顾性能与可靠性,适合复杂研究场景下的工具执行需求。

附录