Post

五、Tools 运行时

五、Tools 运行时

关键点:ast 自动解析 + 工具集划分作用域 + 并发执行

tools 被发现和注册

  • 1、每个工具文件(.py)都会调用registry.register(), 声明:
    1
    2
    3
    4
    5
    
    name: 工具名
    toolset: 所属工具集
    schema: 参数格式
    is_async: 是的异步
    ...
    
  • 2、AST 扫描工具文件,只有调用了registry.register()的工具文件才会注册到Tools运行时

哪些工具可以暴露给 LLM

内置(built-in) tools,MCP tools,plugin tools将会暴露给 LLM 。

  • 1、每个工具在注册阶段都会被划分到一个/多个工具集
  • 2、LLM 在轮次对话中指定可用使用的工具集列表
  • 3、对工具集中的所有工具 check(是否弃用,是否缺少 api_key),去重等过滤
  • 4、将可用工具转化成 LLM 系统 prompt schema(工具说明书)

agent loop 调用工具

  • 校验。校验工具名称,餐食是否合法 json
  • 无效 tool call 返回错误,LLM 自我修复
  • 追加 tool call 消息
  • 只读/无状态共享类工具批量并发执行,等所有工具执行结束,再按原始 tool call 顺序 append 回 messages
  • 下一次 loop

工具内部执行流程

  • json 参数校验
  • json 结果返回

多种运行环境

  • local:本机执行,默认值
  • docker:Docker/Podman 容器
  • modal:Modal cloud sandbox
  • ssh:远程 SSH 环境
  • 等等

亮点

  • ast 解析:可以自动识别新加入的工具文件,无需手动维护列表。ast 只会检索tools目录,不会影响到其他模块

    ast目的不是为了注册工具,是为了过滤出工具文件,避免全量 import tools/*. 最终注册工具还是registry.register()

  • 工具集:
    1
    2
    3
    
      按平台定制工具: hermes-cli、hermes-discord、hermes-feishu 可以有不同工具
      减少 prompt/tool schema 体积: 模型只看到当前需要的工具
      降低幻觉调用: 不可用或被禁用的工具不会进入最终 schema
    
  • 并发执行:只读/无状态共享类工具批量并发执行

参考

This post is licensed under CC BY 4.0 by the author.