工具系統 ToolRegistry
源码版本v2026.7.20
職責
Tool 是 agent 能呼叫的原子函式(終端、瀏覽器、檔案、MCP、技能呼叫……)。ToolRegistry 在模組匯入時透過 AST 掃描自動發現 tools/*.py 裡的工具並註冊,提供一個 name → ToolEntry 的查詢表給主迴圈做工具分發。工具是靜態的——與技能的「可演化」相對。
關鍵檔案
discover_builtin_tools:67-86— AST 掃描tools/*.py找出註冊了工具的模組_is_registry_register_call / _module_registers_tools:30-43— 判斷某模組是否呼叫registry.registerclass ToolEntry:87-153— 單個工具的元資料(handler、schema、toolset、快取標記)class ToolRegistry:217-365— 註冊表本體def register:365-436— 註冊一個工具,內部建構ToolEntryget_entry / register_toolset_alias:274-290— 查詢與 toolset 別名register_plugin_override_policy:316-365— 外掛工具的命名空間准入策略registry 單例:765—registry = ToolRegistry()(模組級單例)tool_error / tool_result:784-810— 工具回傳值標準封裝tools/ 目錄— 約 80 個工具檔案(terminal/browser/web/file/mcp/skills/delegate…)
資料流
- 啟動期
init_agent:276觸發 toolsets 設定。 discover_builtin_tools:67遍歷tools/目錄,用 AST 判斷每個模組是否呼叫registry.register(tools/registry.py:30)。- 命中的模組被匯入,其模組級
registry.register(...)呼叫執行,把ToolEntry寫入registry 單例:765。 - 主迴圈每輪把啟用的 toolsets 對應的
ToolEntry.schema收集進發給 provider 的tools欄位。 - provider 回傳 tool_call → 主迴圈用
get_entry(name)(tools/registry.py:274)查到 handler 執行 → 結果用tool_result:798封裝回填。
小結
工具系統的關鍵在「匯入即註冊」——靠 AST 掃描避免手動維護清單,新增工具只需往 tools/ 丟一個呼叫 register 的檔案。registry 單例是全域唯一真相,主迴圈只讀它。和技能的區別:工具是死的函式,技能是可被學習迴圈改寫的流程。