词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
tools/registry.pymodel_tools.pytoolsets.pytools/terminal_tool.pytools/environments/*registry.register(...)。model_tools.py 负责导入/发现工具模块,并构建供模型使用的 schema 列表。registry.register() 的工作原理tools/ 中的每个工具文件在模块级别调用 registry.register() 来声明自身。函数签名如下:ToolEntry,以工具名称为键存储在单例 ToolRegistry._tools 字典中。若不同 toolset 之间出现名称冲突,会记录警告,后注册的条目覆盖前者。discover_builtin_tools()model_tools.py 被导入时,会调用 tools/registry.py 中的 discover_builtin_tools()。该函数使用 AST 解析扫描所有 tools/*.py 文件,找出包含顶层 registry.register() 调用的模块,然后导入它们:registry.register() 调用(不匹配函数内部的调用),因此 tools/ 中的辅助模块不会被导入。registry.register() 调用。可选 工具中的错误(例如图像生成工具缺少 fal_client)会被捕获并记录——不会阻止其他工具加载。tools.mcp_tool.discover_mcp_tools() 读取 MCP 服务器配置,并注册来自外部服务器的工具。hermes_cli.plugins.discover_plugins() 加载用户/项目/pip 插件,这些插件可能注册额外的工具。check_fn)check_fn—— 一个可调用对象,在工具可用时返回 True,否则返回 False。典型的检查包括:lambda: bool(os.environ.get("SERP_API_KEY")) 用于网络搜索playwright 是否可用registry.get_definitions() 为模型构建 schema 列表时,会运行每个工具的 check_fn():check_fn,只运行一次。check_fn() 中的异常被视为"不可用"(故障安全)。is_toolset_available() 方法检查某个 toolset 的 check_fn 是否通过,用于 UI 显示和 toolset 解析。hermes-cli、hermes-telegram 等)hermes-acpget_tool_definitions() 如何过滤工具model_tools.get_tool_definitions(enabled_toolsets, disabled_toolsets, quiet_mode):enabled_toolsets — 仅包含这些 toolset 中的工具。每个 toolset 名称通过 resolve_toolset() 解析,将复合 toolset 展开为单个工具名称。disabled_toolsets — 从所有 toolset 开始,减去已禁用的。registry.get_definitions(),后者应用 check_fn 过滤并返回 OpenAI 格式的 schema。execute_code 和 browser_navigate 的 schema 会被动态调整,仅引用实际通过过滤的工具(防止模型幻觉出不可用的工具)。_tools 后缀的旧版 toolset 名称(例如 web_tools、terminal_tools)通过 _LEGACY_TOOLSET_MAP 映射到其现代工具名称,以保持向后兼容性。tool_call 时,流程如下:模型响应包含 tool_call
↓
run_agent.py agent 循环
↓
model_tools.handle_function_call(name, args, task_id, user_task)
↓
[Agent 循环工具?] → 由 agent 循环直接处理(todo、memory、session_search、delegate_task)
↓
[插件 pre-hook] → invoke_hook("pre_tool_call", ...)
↓
registry.dispatch(name, args, **kwargs)
↓
按名称查找 ToolEntry
↓
[异步 handler?] → 通过 _run_async() 桥接
[同步 handler?] → 直接调用
↓
返回结果字符串(或 JSON 错误)
↓
[插件 post-hook] → invoke_hook("post_tool_call", ...)registry.dispatch() — 捕获 handler 抛出的任何异常,并以 JSON 形式返回 {"error": "Tool execution failed: ExceptionType: message"}。handle_function_call() — 将 整个调度包裹在次级 try/except 中,返回 {"error": "Error executing tool_name: message"}。todo — 规划/任务跟踪memory — 持久化 memory 写入session_search — 跨会话召回delegate_task — 生成子 agent 会话get_tool_definitions 使用),但若调度以某种方式直接到达它们,其 handler 会返回一个存根错误。_run_async() 将其桥接到同步调度路径:asyncio.run() 启动一个一次性线程tools/approval.py 中的危险命令审批系统:DANGEROUS_PATTERNS 是一 个 (regex, description) 元组列表,涵盖破坏性操作:rm -rf)mkfs、dd)DROP TABLE、不带 WHERE 的 DELETE FROM)> /etc/)systemctl stop)curl | sh)detect_dangerous_command(command) 会对所有模式进行检查。rm -rf node_modules/ 是安全的,但匹配"递归删除"模式)rm -rf 命令不会再次提示。config.yaml 的 command_allowlist,跨会话持久化。