工具执行框架¶
📎 引用文件
本文引用的文件
- agent/src/agent/tools.py
- agent/src/core/runner.py
- agent/src/config/loader.py
- agent/src/api/security.py
- agent/src/agent/context.py
- agent/src/agent/loop.py
- agent/src/tools/background_tools.py
- agent/src/config/limits.py
目录¶
简介¶
本文件系统化说明“工具执行框架”的完整流程,覆盖参数解析、输入验证、执行调度与结果处理;解释异步执行模型、并发控制与任务队列管理;详述错误处理机制(异常捕获、重试策略、降级处理);介绍工具调用的安全控制(权限验证、资源限制、执行环境隔离);提供性能优化策略(缓存机制、连接池管理、内存优化);并给出完整的执行示例与调试方法。
项目结构¶
围绕工具执行的关键模块分布如下: - 工具注册与执行:BaseTool、ToolRegistry - Agent 循环与上下文:AgentLoop、ContextBuilder - 子进程执行器:Runner(沙箱化执行回测脚本) - 配置加载与安全:配置合并、会话覆盖清洗、API 鉴权与安全头 - 后台任务:BackgroundManager(线程+进程组管理) - 运行时限制:工具结果截断等
图表来源
- agent/src/agent/loop.py:502-750
- agent/src/agent/context.py:210-336
- agent/src/agent/tools.py:13-95
- agent/src/core/runner.py:372-620
- agent/src/tools/background_tools.py:102-319
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:463-622
- agent/src/config/limits.py:12-49
章节来源
- agent/src/agent/loop.py:502-750
- agent/src/agent/context.py:210-336
- agent/src/agent/tools.py:13-95
- agent/src/core/runner.py:372-620
- agent/src/tools/background_tools.py:102-319
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:463-622
- agent/src/config/limits.py:12-49
核心组件¶
- BaseTool/ToolRegistry:定义工具抽象、注册表与统一执行入口,保证返回 JSON 字符串并捕获异常。
- AgentLoop:ReAct 主循环,负责消息压缩、工具调用批处理、流式输出、取消与追踪。
- Runner:在受限环境中执行生成的回测脚本,包含环境变量白名单、沙箱 HOME、资源限制与超时。
- BackgroundManager:后台任务管理器,基于线程启动子进程,支持超时终止、进程组信号与通知队列。
- 配置与安全:加载与合并配置、清洗会话级注入、API 鉴权、CORS/CSP/DNS 重绑定防护。
- 限制与裁剪:统一工具结果长度限制,避免超限影响 LLM 上下文。
章节来源
- agent/src/agent/tools.py:13-95
- agent/src/agent/loop.py:502-750
- agent/src/core/runner.py:372-620
- agent/src/tools/background_tools.py:102-319
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:463-622
- agent/src/config/limits.py:12-49
架构总览¶
下图展示了从 API 请求到工具执行、再到结果处理的端到端流程,包括鉴权、配置加载、Agent 循环、工具执行、后台任务与结果归档。
图表来源
- agent/src/api/security.py:463-622
- agent/src/agent/loop.py:624-750
- agent/src/agent/context.py:235-336
- agent/src/agent/tools.py:54-95
- agent/src/core/runner.py:503-620
- agent/src/tools/background_tools.py:110-139
详细组件分析¶
工具注册与执行(BaseTool / ToolRegistry)¶
- 职责:统一工具接口、注册表管理、OpenAI function-calling 描述生成、执行与异常兜底。
- 关键点:
- 所有工具必须返回 JSON 字符串;Registry.execute 捕获异常并返回结构化错误。
- 支持只读标记 repeatable/is_readonly,便于上层做并行与幂等策略。
- 可查询工具名列表与定义,供 LLM 选择。
图表来源
- agent/src/agent/tools.py:13-95
章节来源
- agent/src/agent/tools.py:13-95
Agent 循环与上下文(AgentLoop / ContextBuilder)¶
- 职责:组织 ReAct 循环、消息压缩(多层)、工具调用批处理(只读并行)、流式输出、取消与追踪。
- 关键点:
- 四层上下文压缩:微清理、折叠长文本、LLM 摘要、迭代更新。
- 工具调用批处理:连续只读工具并行执行,提升吞吐。
- 取消机制:线程安全的取消事件,在迭代边界、流式 chunk 间检查。
- 使用 ContextBuilder 组装系统提示与用户消息,注入技能与工具描述。
图表来源
- agent/src/agent/loop.py:227-320
- agent/src/agent/loop.py:502-750
- agent/src/agent/context.py:235-336
- agent/src/config/limits.py:22-49
章节来源
- agent/src/agent/loop.py:227-320
- agent/src/agent/loop.py:502-750
- agent/src/agent/context.py:235-336
- agent/src/config/limits.py:22-49
子进程执行器(Runner)¶
- 职责:以受限环境执行生成的回测脚本,收集日志与产物。
- 关键点:
- 环境变量白名单:仅允许必要的环境变量进入子进程,防止凭证泄露。
- 沙箱 HOME:临时 HOME 目录,仅暴露必要的只读路径,避免读取真实家目录敏感数据。
- 资源限制:POSIX 下设置虚拟内存与文件句柄上限;Windows 无 resource 模块则跳过。
- 超时与退出码:统一超时保护,记录 stdout/stderr 与 artifacts。
- Python 解释器选择:优先使用项目虚拟环境或当前解释器。
图表来源
- agent/src/core/runner.py:431-479
- agent/src/core/runner.py:503-620
- agent/src/core/runner.py:113-172
- agent/src/core/runner.py:73-110
章节来源
- agent/src/core/runner.py:431-479
- agent/src/core/runner.py:503-620
- agent/src/core/runner.py:113-172
- agent/src/core/runner.py:73-110
后台任务与队列(BackgroundManager)¶
- 职责:后台运行 shell 命令,管理进程组生命周期,提供状态查询与取消。
- 关键点:
- 线程启动子进程,支持跨平台进程组终止(POSIX killpg,Windows taskkill)。
- 超时自动终止,输出截断,状态机(running/cancelling/completed/error/timeout/cancelled)。
- 通知队列:主循环定期拉取通知,将结果注入对话上下文。
图表来源
- agent/src/tools/background_tools.py:110-139
- agent/src/tools/background_tools.py:141-204
- agent/src/tools/background_tools.py:258-311
- agent/src/agent/loop.py:720-726
章节来源
- agent/src/tools/background_tools.py:110-139
- agent/src/tools/background_tools.py:141-204
- agent/src/tools/background_tools.py:258-311
- agent/src/agent/loop.py:720-726
配置加载与安全控制¶
- 配置加载:支持 JSON/YAML,失败时降级为默认配置;支持运行时覆盖合并,并对 MCP 服务器配置进行传输切换兼容。
- 会话覆盖清洗:禁止非受信任来源注入 mcpServers/mcp_servers,除非显式开启环境变量开关。
- API 鉴权与安全头:
- 支持 Bearer Token 与 SSE ticket 两种认证方式。
- CORS 严格校验,禁止 credentialed wildcard。
- CSP/Permissions-Policy/Referrer-Policy 等响应头强制。
- DNS 重绑定防护:本地回环 Host 白名单校验。
- 访问日志脱敏:对 api_key/ticket 等查询参数值进行脱敏。
章节来源
- agent/src/config/loader.py:28-151
- agent/src/config/loader.py:107-134
- agent/src/api/security.py:69-158
- agent/src/api/security.py:166-253
- agent/src/api/security.py:260-297
- agent/src/api/security.py:463-622
依赖关系分析¶
- AgentLoop 依赖 ContextBuilder、ToolRegistry、BackgroundManager、配置与安全模块。
- ToolRegistry 聚合具体工具,工具内部可能调用 Runner(如回测工具)或外部网络服务。
- Runner 依赖操作系统能力(POSIX resource/pwd),在不可用时降级。
- BackgroundManager 依赖 subprocess 与信号机制,跨平台差异封装。
- 配置与安全模块被 API 层与 Agent 层共同消费,确保一致的策略。
图表来源
- agent/src/agent/loop.py:502-750
- agent/src/agent/tools.py:54-95
- agent/src/core/runner.py:372-620
- agent/src/tools/background_tools.py:102-319
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:463-622
- agent/src/config/limits.py:12-49
章节来源
- agent/src/agent/loop.py:502-750
- agent/src/agent/tools.py:54-95
- agent/src/core/runner.py:372-620
- agent/src/tools/background_tools.py:102-319
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:463-622
- agent/src/config/limits.py:12-49
性能考量¶
- 工具结果截断:统一限制单条工具结果长度,避免上下文膨胀。
- 上下文压缩:多层压缩减少 token 消耗,降低 LLM 调用成本。
- 只读工具并行:连续只读工具批量并行执行,提高吞吐。
- 后台任务超时:后台命令最大 300 秒,避免长期占用资源。
- 子进程资源限制:虚拟内存与文件句柄上限,防止 DoS。
- 环境变量最小化:仅传递必要环境变量,减少不必要开销与风险。
- 缓存与连接池:各数据源/连接器通常自带连接复用与缓存(例如 OKX/yfinance 等),框架侧通过 Runner 的 XDG_CACHE_HOME 保留缓存目录以提升重复运行效率。
[本节为通用指导,不直接分析具体文件]
故障排查指南¶
- 工具执行失败:
- 检查 ToolRegistry.execute 返回的错误 JSON,定位工具名称与异常信息。
- 查看 Runner 的 logs/runner_stdout.txt 与 logs/runner_stderr.txt,确认子进程输出。
- 后台任务卡死:
- 使用 check_background 查看状态与剩余时间;必要时 cancel_background 安全终止。
- 注意跨平台进程组终止行为差异(POSIX killpg vs Windows taskkill)。
- 鉴权失败:
- 确认 API_AUTH_KEY 或本地回环信任策略;检查 CORS 与 CSP 配置。
- 浏览器 EventSource 需先获取 ticket,再传入 ?ticket=。
- 配置问题:
- 配置文件格式错误或缺失会降级为默认配置;检查合并后的配置与覆盖项。
- 会话级注入 mcpServers 被清洗时,检查环境变量开关。
章节来源
- agent/src/agent/tools.py:72-84
- agent/src/core/runner.py:595-619
- agent/src/tools/background_tools.py:206-311
- agent/src/api/security.py:463-622
- agent/src/config/loader.py:28-151
结论¶
该工具执行框架通过清晰的层次划分实现了高内聚、低耦合的执行管线:AgentLoop 负责任务编排与上下文管理,ToolRegistry 统一工具接入与执行,Runner 保障子进程执行的安全与可控,BackgroundManager 提供可靠的后台任务能力,配置与安全模块贯穿始终,确保权限、资源与环境隔离。结合多层上下文压缩、结果截断与资源限制,整体具备较好的可扩展性与鲁棒性。
[本节为总结,不直接分析具体文件]
附录:执行示例与调试方法¶
典型执行流程示例¶
- 用户发起请求,API 层完成鉴权与安全头设置。
- AgentLoop 构建消息,调用 LLM 得到工具调用计划。
- 对于只读工具,批量并行执行;对于写操作或耗时任务,使用后台任务。
- 如需执行回测脚本,通过 Runner 在受限环境中运行,收集日志与产物。
- 后台任务完成后,通知被注入到对话上下文,继续后续推理。
图表来源
- agent/src/api/security.py:463-622
- agent/src/agent/loop.py:624-750
- agent/src/tools/background_tools.py:110-139
- agent/src/core/runner.py:503-620
调试方法¶
- 查看工具执行结果:检查 ToolRegistry 返回的 JSON 中的 status 与 error 字段。
- 查看子进程输出:打开 runner_stdout.txt 与 runner_stderr.txt。
- 监控后台任务:使用 check_background 列出任务,cancel_background 安全停止。
- 检查配置合并:确认 load_agent_config 与 merge_agent_config_overrides 的结果是否符合预期。
- 安全相关:确认 CORS、CSP、Host 白名单与 API 密钥配置正确。
章节来源
- agent/src/agent/tools.py:72-84
- agent/src/core/runner.py:595-619
- agent/src/tools/background_tools.py:258-311
- agent/src/config/loader.py:28-151
- agent/src/api/security.py:69-158