Tool Registry Pattern
hermes-agent 的工具系统使用中心注册表设计模式:所有工具模块在 import 时自注册,而不是在注册中心硬编码。
核心机制
# tools/registry.py
class ToolRegistry:
def register(
self,
name: str,
toolset: str,
schema: dict, # OpenAI tool format
handler: Callable,
check_fn: Callable = None, # 环境门控
requires_env: list = None,
is_async: bool = False,
emoji: str = "",
max_result_size_chars: int | float | None = None,
):
...
# tools/web_tools.py(每个工具文件)
from tools.registry import registry
def _handle(args): ...
registry.register(
name="web_search",
toolset="web_tools",
schema={...},
handler=_handle,
check_fn=lambda: bool(os.getenv("SEARCH_API_KEY")),
)
循环导入安全
工具模块 → registry(单向导入)
model_tools → registry + 所有工具模块(触发注册)
注册中心不导入任何工具文件或 model_tools
check_fn 环境门控
同一工具在不同环境下可用性不同(如 SEARCH_API_KEY 有无)。check_fn 在 get_definitions() 时动态过滤,而不是在注册时过滤:
# 有 API key → 工具可用;无 API key → 工具被过滤
check_fn=lambda: bool(os.getenv("SEARCH_API_KEY"))
工具集(Toolset)
工具按工具集分组(如 web_tools / terminal_tools)。用户可以启用/禁用整个工具集,而不是单个工具。
get_tool_definitions(enabled_toolsets=["web_tools", "terminal_tools"])
MCP 动态发现
外部 MCP 服务器通过 discover_mcp_tools() 动态注册工具,补充内置工具集。