工具调用

一句话总结
agent 与外部世界交互的手段:定义工具(名字+参数 schema+实现)→ 把工具暴露给模型 → 模型产出调用 → 框架解析并执行 → 结果回灌。是把 LLM 从”会说”变成”会做”的关键组件。MCP 正在成为工具的标准协议。

它解决什么问题

模型本身只能生成文本。工具让它能查数据库、调 API、跑代码、读写文件——把语言能力接到真实动作上。

设计维度 / 实现谱系

  • 工具定义方式:装饰器/函数签名自动生成 schema(ConnectOnionStrands)↔ 显式 schema 类 ↔ OpenAPI 导入
  • 调用机制:原生 function calling ↔ 文本协议解析(ReAct 格式)↔ 写代码调用(CodeAct,smolagents
  • 执行:本地函数 ↔ 远程/沙箱(e2bruntime-execution
  • 标准化:私有工具 ↔ MCP(Model Context Protocol,跨框架复用工具)
  • 错误与校验:参数校验、超时、重试、结果截断

关键要点

  • “函数即工具”是当下主流(最低样板代码)。
  • CodeAct(让模型写代码组合多工具)表达力远超单次 function call,但需安全沙箱。
  • MCP 是重要趋势:工具一次实现、多框架/多 agent 复用。

关联

各框架实现对比

下表汇总 44 个实现了「工具调用」的框架(源码级阅读结论)。网站上以可展开 + 源码节选呈现。

框架实现方式
Aeon工具=Claude Code 内置工具 + 受限 bash,由 runner 的 —allowedTools 白名单授权(Read,Write,Edit,Glob,Grep,WebFetch,WebSearch + Bash(gh:)/Bash(git:)/Bash(curl:)/Bash(./notify:) 等)。gh CLI 处理 GitHub 鉴权;./notify 运行时生成
AG2原生 function/tool calling。@agent.register_for_llm() 把函数转 schema(type hints + Annotated 描述)供 LLM 调用,@executor.register_for_execution() 注册到执行方;Tool 类封装 func+schema,inject_params 支持依赖注入(Depends);执行在 generate_tool_calls_reply
Agency Swarm三条路:①@function_tool(SDK,签名+docstring 自动转 schema);②BaseTool(pydantic BaseModel+run(),openai_schema 生成 JSON Schema);③ToolFactory 从 OpenAPI/MCP/LangChain 批量导入。tools_folder 自动发现
Agent-LLM (AGiXT)extension 类把方法挂进 self.commands 字典即成工具;运行时 Extensions.execute_command 按签名注入参数与 injection_variables(user_id/agent_id/ApiClient/凭据等);支持 client-side 远程工具与 MCP(Use MCP Server 命令、mcp_client.py)
AgentDock工具=扩展 BaseNode 的节点;createTool({name,description,parameters:zod,execute}) 创建(nodes/tool/index.ts:190);全局 DefaultToolRegistry 单例注册,getToolsForAgent(nodeNames) 按 agent 的 nodes 取工具;运行时 streamWithOrchestration 包装 execute 注入 llmContext(CoreLLM 实例)
AgentField两类原语:@app.reasoner(AI)/@app.skill(确定性) 经装饰器自动转 REST 端点;app.ai(tools=…) 支持 raw OpenAI tool schema 或 tools=“discover” 让 LLM 自动发现并调用 mesh 内其他 agent;底层用 LiteLLM function calling + 工具循环执行
Agentic Context Engine (ACE)框架自身的”工具”是给内部 agent 的:SkillManager 的 add/update/remove/tag_skill+search/read_skill(sm_tools.py),RR 的 execute_code/think/read_skill/search_skillbook(rr/tools.py)。被学习对象(用户 agent)的工具调用由其所属框架(LangChain/browser-use)负责,ACE 仅消费其 trace
AgentScopeToolkit 统一管理函数/MCP/技能;FunctionTool 用 inspect+docstring 自动抽 JSON schema(_extract_input_schema);工具按 group 分组、可 agentic 激活/停用(meta tool);执行经 call_tool,支持并发安全标记 is_concurrency_safe 与状态注入 is_state_injected(_agent_state)
AgentVerseToolAgent(simulation)内含 while 循环:LLM→parse 若为 AgentAction 则 _call_tool 执行并把 Observation 回灌,直到 AgentFinish(tool.py:36);工具是 LangChain BaseTool,经 BMTools(load_single_tools/import_all_apis)加载;task-solving 工具用经 XAgent ToolServer 的 executor: tool_using
AiloyTool 枚举三态:Function/MCP/Knowledge(src/tool/base.rs:26)。普通函数转工具:Python 侧用 inspect+type hints+Google docstring 自动生成 JSON schema(bindings/python/ailoy/_patches.py:209 get_json_schema);Rust 侧 ToolFunc = dyn Fn(Value)->Future(src/tool/function.rs:17)。内置工具:Terminal / WebSearch(DuckDuckGo) / WebFetch(src/tool/builtin/mod.rs:14)
Astron Agent工具=BasePlugin(name/description/schema_template/typ/run callable);schema 以文本模板注入 system prompt 的 {tools},非 JSON function schema;执行时按 action 名字符串匹配 plugin 并 await plugin.run(action_input);找不到返回 400 占位
AutoGenTool Protocol + BaseTool(pydantic args schema);FunctionTool 用 inspect 从函数签名+docstring 自动生成 schema(args_base_model_from_signature);原生 function calling,工具经 Workbench 暴露给 LLM;支持 MCP(McpWorkbench)与 AgentTool(把 agent 当工具);并行执行用 asyncio.gather
Botpressnew Tool({name,description,input,output,handler,retry}),input/output 用 Zui schema 做校验+TS 类型生成;工具以真实 async 函数签名注入沙箱,LLM 直接 await tool(args) 调用;内置 retry 逻辑;getTypings() 生成给 prompt 的类型
ConnectOnion普通函数→create_tool_from_function 自动转 schema;class 实例自动抽方法为工具;原生 function calling;声明 agent 形参的工具运行时注入且对 LLM 隐藏(_needs_agent)
Cortex Memory反向——它是”被 agent 当工具调用”的一方:cortex-mem-rig 暴露 11 个 Rig Tool(abstract/overview/read/search/find/ls/explore/store…),MCP server 暴露 search/recall/store/commit/ls/explore/abstract/overview/content 等工具
CrewAIBaseTool(pydantic args_schema) / Tool;@tool 装饰器或子类化;native 模式转 OpenAI schema,ReAct 模式渲染文本;ToolUsage 负责选择/执行/缓存/容错
Dust统一为 MCP:内置工具与第三方集成都实现为 MCP server,原生 function calling;工具规格 buildToolSpecification,执行 mcp_execution.ts;60+ 内置 server 在 index 注册
HaystackTool dataclass(name+description+JSON-schema parameters+function);@tool/create_tool_from_function 用 type hints+docstring 自动生成 schema;ComponentTool/PipelineTool 把任意 component/pipeline 包成 tool;ToolInvoker component 解析 LLM 的 ToolCall 并执行,结果可经 outputs_to_state 写回 State;Toolset/SearchableToolset(语义检索工具,支持 MCP)
hcom不抽象 LLM 工具调用;hcom 本身是 agent 通过 shell 调用的”工具”。bootstrap primer(~700 token)教 agent hcom send/list/events/term/… 用法;安全命令可免审批
Hermes Agent中央 ToolRegistry:每个工具文件 import 时 registry.register(name, toolset, schema, handler, check_fn…) 自注册,AST 扫描自动发现(discover_builtin_tools);原生 function calling;执行支持并发/顺序两路;危险命令经 approval 拦截
Hive原生 function calling;工具主要经 MCP 暴露(ToolRegistry 发现:内建→tools.py→MCP server→手动注册);Tool dataclass 带 concurrency_safe(安全工具同回合并行)、produces_image(对纯文本模型隐藏)
Lagent两条路:①@tool_api 装饰器 + ToolMeta 元类,用 griffe 解析 typehint+docstring 自动生成 schema,BaseAction 可单函数(run)或多 API toolkit;ActionExecutor 按 name.api 路由调用并裹 ActionReturn;②fc_agent 走 LLM 原生 function calling(get_tool_prompt 转 OpenAI tools schema)
LangChain普通函数/BaseTool/dict 均可;BaseTool 即 Runnable(tools/base.py:405);执行器是 langgraph 重导出的 ToolNode(tools/tool_node.py:4),支持并行 Send、InjectedState/ToolRuntime 注入、return_direct;模型经 bind_tools 绑定(factory.py:1249)
Llama Agentic System (llama-stack-apps)三态:built-in(builtin::websearch/builtin::rag/knowledge_search)、client tool(@client_tool 装饰函数 / 继承 ClientTool 实现 get_params_definition+run_impl)、code interpreter。工具以 list 传入 Agent(tools=[…])
LlamaIndex普通函数→FunctionTool.from_defaults 用 inspect.signature+type hints+docstring 自动生成 schema(create_schema_from_function);声明 Context 形参的工具运行时注入且对 LLM 隐藏(requires_context/ctx_param_name);return_direct 工具结果直接返回;并行 tool calls 默认开
llm-agents文本协议而非原生 function-calling:工具实现 ToolInterface.use(input_text)->str;tool_description/tool_names/tool_by_names 把工具列表渲染进 prompt 供 LLM 选;解析后按名查表调用,未知工具抛 ValueError。内置 PythonREPL/SerpAPI/Google/Searx/HackerNews
LoongFlowToolkit 注册/分发 FunctionTool;声明优先 Pydantic args_schema,否则 inspect.signature+docstring 自动生成 OpenAI function schema;tool_context 形参运行时注入且从 schema 隐藏;内置 Read/Write/Ls/Shell/Todo/Agent/ExecuteCode 等工具;ReAct 侧 Actor 可串行/并行执行
MastracreateTool({ id, description, inputSchema, outputSchema, execute }),Zod/Standard-Schema 定义入参出参,运行时自动校验输入输出(validateToolInput/validateToolOutput);工具也可声明 suspendSchema/resumeSchema 支持 HITL;兼容 Vercel AI SDK tool 与 MCP 工具
MetaGPT经典角色无通用工具调用(Action 即”能力”);工具体系服务于 RoleZero/DataInterpreter:@register_tool 装饰器把类/函数注册进 ToolRegistry(AST 自动抽 schema),ToolRecommender(TypeMatch / BM25 / Embedding 三种召回)按任务推荐工具子集
nanobotTool ABC(name/description/parameters JSON Schema + execute);ToolLoader pkgutil 扫描自动注册,@tool_parameters 装饰器注入 schema;ToolRegistry 缓存定义、prepare_call 做类型 cast+校验;runner 支持并发批(concurrency_safe/read_only)执行
Open Multi-AgentdefineTool() + Zod schema → 自研 zodToJsonSchema 转 JSON Schema 喂 LLM;ToolRegistry 注册、三层过滤(preset→allowlist→denylist);6 内置(bash/file_read/file_write/file_edit/grep/glob);工具错误永不抛出,捕获为 ToolResult{isError:true}
OpenClaw原生 function calling;AgentTool 契约带 execute(id,args,signal,onPartial),支持 executionMode: “sequential” 与 prepareArguments;内置编码工具 bash/read/write/edit/process + web_search/web_fetch + browser/canvas/cron/nodes/sessions_ 等;参数经 validateToolArguments 校验,beforeToolCall/afterToolCall 钩子可拦截/改写
PipecatLLM service 上 register_function(name, handler) 注册函数,handler 收 FunctionCallParams;支持 direct function、并行/顺序执行、cancel_on_interruption、超时;外部工具经 MCPClient.register_tools(llm) 把 MCP server 工具批量注册
PraisonAI普通 Python 函数即工具,@tool 装饰器(inspect.signature+docstring 自动生成 schema)或裸函数皆可;BaseTool 类工具;原生 function-calling,循环执行 execute_tool;YAML 模式自动发现 tools.py 内同名函数;内置 100+ 工具(搜索/文件/shell/web crawl 等)
Semantic Kernel三种来源统一为 KernelFunction:① C# 方法+[KernelFunction] 经 KernelFunctionFromMethod 反射生成 schema;② prompt 模板 KernelFunctionFromPrompt;③ OpenAPI/gRPC 导入。FunctionChoiceBehavior.Auto/Required/None 控制模型选择;工具可经 [FromKernelServices] 注入 DI 服务
smolagents两种范式:CodeAgent 把工具当 Python 函数在沙箱内调用;ToolCallingAgent 走原生 JSON function-calling(process_tool_calls/execute_tool_call)。工具定义=@tool 装饰器或 Tool 子类(forward()),自动从 type hints/docstring 生成 schema
Strands Agents@tool 装饰器经 inspect+type hints+docstring_parser+Pydantic 自动生成 JSON schema;原生 function calling;支持目录热加载(load_tools_from_directory)、ToolProvider、agent-as-tool;默认并发执行
Swarm普通 Python 函数 → function_to_json 自动转 OpenAI tool schema;原生 function calling
SwarmClaw工具 = LangChain tool() + zod schema,运行时按 session 策略动态装配(buildSessionTools);含 shell/file/web/email/image/delegate/subagent/memory/schedule/task 等;normalize-tool-args 容错;终端工具(memory_write/durable_wait/context_compaction)强制结束回合
Swarms普通 Python 函数(带 docstring/type hints)→ BaseTool.func_to_dict 自动转 OpenAI function schema;Pydantic 模型经 base_model_to_openai_function;原生 function calling,结果回灌对话
Transformers AgentsTool 抽象 + HF 工具箱(pipeline 封装);支持代码调用与 JSON 调用
Upsonic@tool 装饰器 + ToolConfig(requires_confirmation/requires_user_input/external_execution/sequential/cache_results);支持普通函数、ToolKit 类、agent-as-tool、MCP;统一经 ToolRegistry/ToolManager 归一化 schema
vectara-agentic三类来源:① Vectara RAG/search 工具(tools.py:448 / tools.py:199);② 任意 Python 函数 ToolsFactory.create_tool(tools.py:763);③ LlamaIndex ToolSpecs 桥接 get_llama_index_tools(tools.py:784)。统一经 create_tool_from_dynamic_function(tool_utils.py:386)按签名+Pydantic schema 生成 VectaraTool;get_current_date 工具自动追加(agent.py:133)
VoltAgentcreateTool/tool() 用 Zod schema 定义工具,编译为 AI SDK Tool;支持 lifecycle hooks(onStart/onEnd)、needsApproval(HITL 审批)、Toolkit 分组、tool routing(embedding 检索式选工具)

各框架实现对比 · 源码级

44 个框架实现该组件 · 41 个附源码节选 · 点击任意框架展开看实现要点与代码

Aeon yaml 工具=Claude Code 内置工具 + 受限 bash,由 runner 的 --allowedTools 白名单授权(Read,Write,Edit,Glob,Grep,WebFetch,WebSearch + Bash(gh:)/Bash(git:)/Bash(curl:)/Bash(./notify:) 等)。gh CLI 处理 GitHub 鉴权;./notify 运行时生成

工具=Claude Code 内置工具 + 受限 bash,由 runner 的 --allowedTools 白名单授权(Read,Write,Edit,Glob,Grep,WebFetch,WebSearch + Bash(gh:)/Bash(git:)/Bash(curl:)/Bash(./notify:) 等)。gh CLI 处理 GitHub 鉴权;./notify 运行时生成

github/workflows/aeon.yml:454github/workflows/aeon.yml:322
.github/workflows/aeon.yml:454 yaml
          NOTIFY_SCRIPT
          chmod +x ./notify

          ALLOWED="Read,Write,Edit,Glob,Grep,WebFetch,WebSearch"
          ALLOWED="$ALLOWED,Bash(curl:*),Bash(gh:*),Bash(git:*),Bash(jq:*)"
          ALLOWED="$ALLOWED,Bash(./notify:*),Bash(./notify-jsonrender:*)"
          ALLOWED="$ALLOWED,Bash(mkdir:*),Bash(ls:*),Bash(cat:*),Bash(chmod:*)"
          ALLOWED="$ALLOWED,Bash(date:*),Bash(echo:*),Bash(node:*),Bash(npm:*),Bash(npx:*)"
          ALLOWED="$ALLOWED,Bash(head:*),Bash(tail:*),Bash(wc:*),Bash(sort:*),Bash(grep:*)"

          SKILL_NAME="${{ steps.skill.outputs.name }}"
          VAR="$SKILL_VAR"
查看 Aeon 完整笔记 →
AG2 python 原生 function/tool calling。@agent.register_for_llm() 把函数转 schema(type hints + Annotated 描述)供 LLM 调用,@executor.register_for_execution() 注册到执行方;Tool 类封装 func+schema,inject_params 支持依赖注入(Depends);执行在 generate_tool_calls_reply

原生 function/tool calling。@agent.register_for_llm() 把函数转 schema(type hints + Annotated 描述)供 LLM 调用,@executor.register_for_execution() 注册到执行方;Tool 类封装 func+schema,inject_params 支持依赖注入(Depends);执行在 generate_tool_calls_reply

conversable_agent.py:3968tools/tool.py:20tools/dependency_injection.py:230
autogen/agentchat/conversable_agent.py:3968 python
            raise TypeError(f"'func_or_tool' must be a function or a Tool object, got '{type(func_or_tool)}' instead.")
        return tool

    def register_for_llm(
        self,
        *,
        name: str | None = None,
        description: str | None = None,
        api_style: Literal["function", "tool"] = "tool",
        silent_override: bool = False,
    ) -> Callable[[F | Tool], Tool]:
        """Decorator factory for registering a function to be used by an agent.
查看 AG2 完整笔记 →
Agency Swarm python 三条路:①@function_tool(SDK,签名+docstring 自动转 schema);②BaseTool(pydantic BaseModel+run(),openai_schema 生成 JSON Schema);③ToolFactory 从 OpenAPI/MCP/LangChain 批量导入。tools_folder 自动发现

三条路:①@function_tool(SDK,签名+docstring 自动转 schema);②BaseTool(pydantic BaseModel+run(),openai_schema 生成 JSON Schema);③ToolFactory 从 OpenAPI/MCP/LangChain 批量导入。tools_folder 自动发现

tools/base_tool.py:72tools/base_tool.py:107tools/tool_factory_utils/factory.py:10tools/tool_factory_utils/openapi_importer.py:45
src/agency_swarm/tools/base_tool.py:72 python
            return super().__repr__()


class BaseTool(BaseModel, ABC, metaclass=BaseToolMeta):
    model_config = {"ignored_types": (classproperty,)}

    _caller_agent: Any = None
    _event_handler: Any = None
    _context: RunContextWrapper[MasterContext] | None = None

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
查看 Agency Swarm 完整笔记 →
Agent-LLM (AGiXT) python extension 类把方法挂进 self.commands 字典即成工具;运行时 Extensions.execute_command 按签名注入参数与 injection_variables(user_id/agent_id/ApiClient/凭据等);支持 client-side 远程工具与 MCP(Use MCP Server 命令、mcp_client.py)

extension 类把方法挂进 self.commands 字典即成工具;运行时 Extensions.execute_command 按签名注入参数与 injection_variables(user_id/agent_id/ApiClient/凭据等);支持 client-side 远程工具与 MCP(Use MCP Server 命令、mcp_client.py)

Extensions.py:435Extensions.py:893Extensions.py:1045
agixt/Extensions.py:435 python
    logging.info("Extension cache invalidated - will rediscover extensions")


class Extensions:
    # Class attribute for defining webhook events - extensions can override this
    webhook_events = []

    def __init__(
        self,
        agent_name="",
        agent_id=None,
        agent_config=None,
        conversation_name="",
查看 Agent-LLM (AGiXT) 完整笔记 →
AgentDock typescript 工具=扩展 BaseNode 的节点;createTool({name,description,parameters:zod,execute}) 创建(nodes/tool/index.ts:190);全局 DefaultToolRegistry 单例注册,getToolsForAgent(nodeNames) 按 agent 的 nodes 取工具;运行时 streamWithOrchestration 包装 execute 注入 llmContext(CoreLLM 实例)

工具=扩展 BaseNode 的节点;createTool({name,description,parameters:zod,execute}) 创建(nodes/tool/index.ts:190);全局 DefaultToolRegistry 单例注册,getToolsForAgent(nodeNames) 按 agent 的 nodes 取工具;运行时 streamWithOrchestration 包装 execute 注入 llmContext(CoreLLM 实例)

nodes/tool/index.ts:69nodes/tool-registry.ts:48nodes/agent-node.ts:344
agentdock-core/src/nodes/tool/index.ts:69 typescript
/**
 * Tool interface with JSON Schema parameters
 */
export interface Tool<TParams = unknown, TResult = unknown> extends BaseNode {
  name: string;
  description: string;
  parameters: JSONSchema;
  execute(params: TParams): Promise<ToolResult<TResult>>;
}

/**
 * Base tool implementation with unified registration
 */
查看 AgentDock 完整笔记 →
AgentField go 两类原语:@app.reasoner(AI)/@app.skill(确定性) 经装饰器自动转 REST 端点;app.ai(tools=...) 支持 raw OpenAI tool schema 或 tools="discover" 让 LLM 自动发现并调用 mesh 内其他 agent;底层用 LiteLLM function calling + 工具循环执行

两类原语:@app.reasoner(AI)/@app.skill(确定性) 经装饰器自动转 REST 端点;app.ai(tools=...) 支持 raw OpenAI tool schema 或 tools="discover" 让 LLM 自动发现并调用 mesh 内其他 agent;底层用 LiteLLM function calling + 工具循环执行

decorators.py:49agent.py:1701agent.py:2573tool_calling.py:334
sdk/python/agentfield/decorators.py:49 python
    return None


def reasoner(
    func=None,
    *,
    path: Optional[str] = None,
    tags: Optional[List[str]] = None,
    description: Optional[str] = None,
    track_workflow: bool = True,
    triggers: Optional[List[Trigger]] = None,
    accepts_webhook: Optional[Union[bool, str]] = None,
    **kwargs,
查看 AgentField 完整笔记 →
Agentic Context Engine (ACE) python 框架自身的"工具"是给内部 agent 的:SkillManager 的 add/update/remove/tag_skill+search/read_skill(sm_tools.py),RR 的 execute_code/think/read_skill/search_skillbook(rr/tools.py)。被学习对象(用户 agent)的工具调用由其所属框架(LangChain/browser-use)负责,ACE 仅消费其 trace

框架自身的"工具"是给内部 agent 的:SkillManager 的 add/update/remove/tag_skill+search/read_skill(sm_tools.py),RR 的 execute_code/think/read_skill/search_skillbook(rr/tools.py)。被学习对象(用户 agent)的工具调用由其所属框架(LangChain/browser-use)负责,ACE 仅消费其 trace

查看 Agentic Context Engine (ACE) 完整笔记 →
AgentScope python Toolkit 统一管理函数/MCP/技能;FunctionTool 用 inspect+docstring 自动抽 JSON schema(_extract_input_schema);工具按 group 分组、可 agentic 激活/停用(meta tool);执行经 call_tool,支持并发安全标记 is_concurrency_safe 与状态注入 is_state_injected(_agent_state)

Toolkit 统一管理函数/MCP/技能;FunctionTool 用 inspect+docstring 自动抽 JSON schema(_extract_input_schema);工具按 group 分组、可 agentic 激活/停用(meta tool);执行经 call_tool,支持并发安全标记 is_concurrency_safe 与状态注入 is_state_injected(_agent_state)

tool/_toolkit.py:66tool/_toolkit.py:225tool/_adapters.py:30tool/_base.py:35
src/agentscope/tool/_toolkit.py:66 python
"""  # noqa: E501


class Toolkit:
    """Toolkit is the core module to register, manage and delete tool
    functions, MCP clients, Agent skills in AgentScope.

    About tool functions:

    - Register and parse JSON schemas from their docstrings automatically.
    - Group-wise tools management, and agentic tools activation/deactivation.
    - Extend the tool function JSON schema dynamically with Pydantic BaseModel.
    - Tool function execution with unified streaming interface.
查看 AgentScope 完整笔记 →
AgentVerse python ToolAgent(simulation)内含 while 循环:LLM→parse 若为 AgentAction 则 _call_tool 执行并把 Observation 回灌,直到 AgentFinish(tool.py:36);工具是 LangChain BaseTool,经 BMTools(load_single_tools/import_all_apis)加载;task-solving 工具用经 XAgent ToolServer 的 executor: tool_using

ToolAgent(simulation)内含 while 循环:LLM→parse 若为 AgentAction 则 _call_tool 执行并把 Observation 回灌,直到 AgentFinish(tool.py:36);工具是 LangChain BaseTool,经 BMTools(load_single_tools/import_all_apis)加载;task-solving 工具用经 XAgent ToolServer 的 executor: tool_using

agents/simulation_agent/tool.py:31initialization.py:49
agentverse/agents/simulation_agent/tool.py:31 python


@agent_registry.register("tool")
class ToolAgent(BaseAgent):
    tools: List[BaseTool] = Field(default=[])
    tool_memory: BaseMemory = Field(default_factory=ChatHistoryMemory)
    verbose: bool = Field(default=False)

    def step(self, env_description: str = "") -> Message:
        parsed_response = None
        tool_observation = [self.tool_memory.to_string()]
        while True:
            prompt = self._fill_prompt_template(env_description, tool_observation)
查看 AgentVerse 完整笔记 →
Ailoy rust Tool 枚举三态:Function/MCP/Knowledge(src/tool/base.rs:26)。普通函数转工具:Python 侧用 inspect+type hints+Google docstring 自动生成 JSON schema(bindings/python/ailoy/_patches.py:209 get_json_schema);Rust 侧 ToolFunc = dyn Fn(Value)->Future(src/tool/function.rs:17)。内置工具:Terminal / WebSearch(DuckDuckGo) / WebFetch(src/tool/builtin/mod.rs:14)

Tool 枚举三态:Function/MCP/Knowledge(src/tool/base.rs:26)。普通函数转工具:Python 侧用 inspect+type hints+Google docstring 自动生成 JSON schema(bindings/python/ailoy/_patches.py:209 get_json_schema);Rust 侧 ToolFunc = dyn Fn(Value)->Future(src/tool/function.rs:17)。内置工具:Terminal / WebSearch(DuckDuckGo) / WebFetch(src/tool/builtin/mod.rs:14)

src/tool/base.rs:20bindings/python/ailoy/_patches.py:242
src/tool/base.rs:20 rust

#[maybe_send_sync]
#[multi_platform_async_trait]
pub trait ToolBehavior: Debug + Clone {
    fn get_description(&self) -> ToolDesc;
    async fn run(&self, args: Value) -> anyhow::Result<Value>;
}

#[derive(Debug, Clone)]
pub enum ToolInner {
    Function(FunctionTool),
    MCP(MCPTool),
    Knowledge(KnowledgeTool),
查看 Ailoy 完整笔记 →
Astron Agent python 工具=BasePlugin(name/description/schema_template/typ/run callable);schema 以文本模板注入 system prompt 的 {tools},非 JSON function schema;执行时按 action 名字符串匹配 plugin 并 await plugin.run(action_input);找不到返回 400 占位

工具=BasePlugin(name/description/schema_template/typ/run callable);schema 以文本模板注入 system prompt 的 {tools},非 JSON function schema;执行时按 action 名字符串匹配 plugin 并 await plugin.run(action_input);找不到返回 400 占位

service/plugin/base.py:15cot_runner.py:367cot_runner.py:44
core/agent/service/plugin/base.py:15 python
    log: list = Field(default_factory=list)


class BasePlugin(BaseModel):
    name: str
    description: str
    schema_template: str
    typ: str
    run: Callable
    run_result: Optional[PluginResponse] = Field(default=None)
查看 Astron Agent 完整笔记 →
AutoGen python Tool Protocol + BaseTool(pydantic args schema);FunctionTool 用 inspect 从函数签名+docstring 自动生成 schema(args_base_model_from_signature);原生 function calling,工具经 Workbench 暴露给 LLM;支持 MCP(McpWorkbench)与 AgentTool(把 agent 当工具);并行执行用 asyncio.gather

Tool Protocol + BaseTool(pydantic args schema);FunctionTool 用 inspect 从函数签名+docstring 自动生成 schema(args_base_model_from_signature);原生 function calling,工具经 Workbench 暴露给 LLM;支持 MCP(McpWorkbench)与 AgentTool(把 agent 当工具);并行执行用 asyncio.gather

autogen-core/src/autogen_core/tools/_base.py:96tools/_function_tool.py:30_assistant_agent.py:1196
python/packages/autogen-core/src/autogen_core/tools/_base.py:96 python
StreamT = TypeVar("StreamT", bound=BaseModel, covariant=True)


class BaseTool(ABC, Tool, Generic[ArgsT, ReturnT], ComponentBase[BaseModel]):
    component_type = "tool"

    def __init__(
        self,
        args_type: Type[ArgsT],
        return_type: Type[ReturnT],
        name: str,
        description: str,
        strict: bool = False,
查看 AutoGen 完整笔记 →
Botpress typescript new Tool({name,description,input,output,handler,retry}),input/output 用 Zui schema 做校验+TS 类型生成;工具以真实 async 函数签名注入沙箱,LLM 直接 await tool(args) 调用;内置 retry 逻辑;getTypings() 生成给 prompt 的类型

new Tool({name,description,input,output,handler,retry}),input/output 用 Zui schema 做校验+TS 类型生成;工具以真实 async 函数签名注入沙箱,LLM 直接 await tool(args) 调用;内置 retry 逻辑;getTypings() 生成给 prompt 的类型

packages/llmz/src/tool.ts:216packages/llmz/src/tool.ts:719packages/llmz/src/tool.ts:766
packages/llmz/src/tool.ts:216 typescript
 * - **Type coercion**: Basic type coercion where possible
 *
 */
export class Tool<I extends z.ZodType = z.ZodType, O extends z.ZodType = z.ZodType> implements Serializable<Tool.JSON> {
  private _staticInputValues?: unknown

  public name: string
  public aliases: string[] = []
  public description?: string
  public metadata: Record<string, unknown>
  public input?: JSONSchema7
  public output?: JSONSchema7
  public retry?: ToolRetryFn<TypeOf<I>>
查看 Botpress 完整笔记 →
ConnectOnion python 普通函数→create_tool_from_function 自动转 schema;class 实例自动抽方法为工具;原生 function calling;声明 agent 形参的工具运行时注入且对 LLM 隐藏(_needs_agent)

普通函数→create_tool_from_function 自动转 schema;class 实例自动抽方法为工具;原生 function calling;声明 agent 形参的工具运行时注入且对 LLM 隐藏(_needs_agent)

core/tool_factory.py:61core/tool_executor.py:23
connectonion/core/tool_factory.py:61 python
    # Default to string
    return {"type": "string"}

def create_tool_from_function(func: Callable) -> Callable:
    """
    Converts a Python function into a tool that is compatible with the Agent,
    by inspecting its signature and docstring.
    """
    name = func.__name__
    raw_doc = inspect.getdoc(func)
    # Extract summary only (first paragraph) - Args/Returns sections are not sent to LLM
    description = raw_doc.split('\n\n')[0].strip() if raw_doc else f"Execute the {name} tool."
查看 ConnectOnion 完整笔记 →
Cortex Memory rust 反向——它是"被 agent 当工具调用"的一方:cortex-mem-rig 暴露 11 个 Rig Tool(abstract/overview/read/search/find/ls/explore/store…),MCP server 暴露 search/recall/store/commit/ls/explore/abstract/overview/content 等工具

反向——它是"被 agent 当工具调用"的一方:cortex-mem-rig 暴露 11 个 Rig Tool(abstract/overview/read/search/find/ls/explore/store…),MCP server 暴露 search/recall/store/commit/ls/explore/abstract/overview/content 等工具

cortex-mem-rig/src/lib.rs:26cortex-mem-mcp/src/service.rs:486
cortex-mem-rig/src/lib.rs:26 rust

    // ==================== Tiered Access Tools ====================

    pub fn abstract_tool(&self) -> AbstractTool {
        AbstractTool::new(self.operations.clone())
    }

    pub fn overview_tool(&self) -> OverviewTool {
        OverviewTool::new(self.operations.clone())
    }

    pub fn read_tool(&self) -> ReadTool {
        ReadTool::new(self.operations.clone())
查看 Cortex Memory 完整笔记 →
CrewAI python BaseTool(pydantic args_schema) / Tool;@tool 装饰器或子类化;native 模式转 OpenAI schema,ReAct 模式渲染文本;ToolUsage 负责选择/执行/缓存/容错

BaseTool(pydantic args_schema) / Tool;@tool 装饰器或子类化;native 模式转 OpenAI schema,ReAct 模式渲染文本;ToolUsage 负责选择/执行/缓存/容错

crewai/tools/tool_usage.py:73
lib/crewai/src/crewai/tools/tool_usage.py:73 python
        super().__init__(self.message)


class ToolUsage:
    """
    Class that represents the usage of a tool by an agent.

    Attributes:
      task: Task being executed.
      tools_handler: Tools handler that will manage the tool usage.
      tools: List of tools available for the agent.
      tools_description: Description of the tools available for the agent.
      tools_names: Names of the tools available for the agent.
查看 CrewAI 完整笔记 →
Dust typescript 统一为 MCP:内置工具与第三方集成都实现为 MCP server,原生 function calling;工具规格 buildToolSpecification,执行 mcp_execution.ts;60+ 内置 server 在 index 注册

统一为 MCP:内置工具与第三方集成都实现为 MCP server,原生 function calling;工具规格 buildToolSpecification,执行 mcp_execution.ts;60+ 内置 server 在 index 注册

查看 Dust 完整笔记 →
Haystack python Tool dataclass(name+description+JSON-schema parameters+function);@tool/create_tool_from_function 用 type hints+docstring 自动生成 schema;ComponentTool/PipelineTool 把任意 component/pipeline 包成 tool;ToolInvoker component 解析 LLM 的 ToolCall 并执行,结果可经 outputs_to_state 写回 State;Toolset/SearchableToolset(语义检索工具,支持 MCP)

Tool dataclass(name+description+JSON-schema parameters+function);@tool/create_tool_from_function 用 type hints+docstring 自动生成 schema;ComponentTool/PipelineTool 把任意 component/pipeline 包成 tool;ToolInvoker component 解析 LLM 的 ToolCall 并执行,结果可经 outputs_to_state 写回 State;Toolset/SearchableToolset(语义检索工具,支持 MCP)

tools/tool.py:19tools/from_function.py:18tools/component_tool.py:39tools/pipeline_tool.py:21
haystack/tools/tool.py:19 python


@dataclass
class Tool:
    """
    Data class representing a Tool that Language Models can prepare a call for.

    Accurate definitions of the textual attributes such as `name` and `description`
    are important for the Language Model to correctly prepare the call.

    For resource-intensive operations like establishing connections to remote services or
    loading models, override the `warm_up()` method. This method is called before the Tool
    is used and should be idempotent, as it may be called multiple times during
查看 Haystack 完整笔记 →
hcom rust 不抽象 LLM 工具调用;hcom 本身是 agent 通过 shell 调用的"工具"。bootstrap primer(~700 token)教 agent hcom send/list/events/term/... 用法;安全命令可免审批

不抽象 LLM 工具调用;hcom 本身是 agent 通过 shell 调用的"工具"。bootstrap primer(~700 token)教 agent hcom send/list/events/term/... 用法;安全命令可免审批

bootstrap.rs:34hooks/common.rs:51
src/bootstrap.rs:34 rust
//    lifecycle transitions (launch → stop → resume).  The underlying binding
//    changes; the flags don't.

const UNIVERSAL: &str = r#"[HCOM SESSION]
You have access to the hcom communication tool.
- Your name: {display_name}
- Authority: Prioritize @{SENDER} over others
- Important: Include this marker anywhere in your first response only: [hcom:{instance_name}]

You run hcom commands on behalf of the human user. The human uses natural language with you.

## MESSAGES
查看 hcom 完整笔记 →
Hermes Agent python 中央 ToolRegistry:每个工具文件 import 时 registry.register(name, toolset, schema, handler, check_fn…) 自注册,AST 扫描自动发现(discover_builtin_tools);原生 function calling;执行支持并发/顺序两路;危险命令经 approval 拦截

中央 ToolRegistry:每个工具文件 import 时 registry.register(name, toolset, schema, handler, check_fn…) 自注册,AST 扫描自动发现(discover_builtin_tools);原生 function calling;执行支持并发/顺序两路;危险命令经 approval 拦截

tools/registry.py:234tools/registry.py:57agent/tool_executor.py:180
tools/registry.py:234 python
    # Registration
    # ------------------------------------------------------------------

    def register(
        self,
        name: str,
        toolset: str,
        schema: dict,
        handler: Callable,
        check_fn: Callable = None,
        requires_env: list = None,
        is_async: bool = False,
        description: str = "",
查看 Hermes Agent 完整笔记 →
Hive python 原生 function calling;工具主要经 MCP 暴露(ToolRegistry 发现:内建→tools.py→MCP server→手动注册);Tool dataclass 带 concurrency_safe(安全工具同回合并行)、produces_image(对纯文本模型隐藏)

原生 function calling;工具主要经 MCP 暴露(ToolRegistry 发现:内建→tools.py→MCP server→手动注册);Tool dataclass 带 concurrency_safe(安全工具同回合并行)、produces_image(对纯文本模型隐藏)

loader/tool_registry.py:48llm/provider.py:36
core/framework/loader/tool_registry.py:48 python
    executor: Callable[[dict], Any]


class ToolRegistry:
    """
    Manages tool discovery and registration.

    Tool Discovery Order:
    1. Built-in tools (if any)
    2. tools.py in agent folder
    3. MCP servers
    4. Manually registered tools
    """
查看 Hive 完整笔记 →
Lagent python 两条路:①@tool_api 装饰器 + ToolMeta 元类,用 griffe 解析 typehint+docstring 自动生成 schema,BaseAction 可单函数(run)或多 API toolkit;ActionExecutor 按 name.api 路由调用并裹 ActionReturn;②fc_agent 走 LLM 原生 function calling(get_tool_prompt 转 OpenAI tools schema)

两条路:①@tool_api 装饰器 + ToolMeta 元类,用 griffe 解析 typehint+docstring 自动生成 schema,BaseAction 可单函数(run)或多 API toolkit;ActionExecutor 按 name.api 路由调用并裹 ActionReturn;②fc_agent 走 LLM 原生 function calling(get_tool_prompt 转 OpenAI tools schema)

actions/base_action.py:27actions/base_action.py:236actions/action_executor.py:12agents/fc_agent.py:30
lagent/actions/base_action.py:27 python
logging.getLogger('griffe').setLevel(logging.ERROR)


def tool_api(
    func: Optional[Callable] = None,
    *,
    explode_return: bool = False,
    returns_named_value: bool = False,
    include_arguments: Optional[Iterable[str]] = None,
    exclude_arguments: Optional[Iterable[str]] = None,
    **kwargs,
):
    """Turn functions into tools. It will parse typehints as well as docstrings
查看 Lagent 完整笔记 →
LangChain python 普通函数/BaseTool/dict 均可;BaseTool 即 Runnable(tools/base.py:405);执行器是 langgraph 重导出的 ToolNode(tools/tool_node.py:4),支持并行 Send、InjectedState/ToolRuntime 注入、return_direct;模型经 bind_tools 绑定(factory.py:1249)

普通函数/BaseTool/dict 均可;BaseTool 即 Runnable(tools/base.py:405);执行器是 langgraph 重导出的 ToolNode(tools/tool_node.py:4),支持并行 Send、InjectedState/ToolRuntime 注入、return_direct;模型经 bind_tools 绑定(factory.py:1249)

agents/factory.py:949core/.../tools/base.py:405core/.../chat_models.py:2325
libs/langchain_v1/langchain/agents/factory.py:949 python

    # Create ToolNode if we have client-side tools OR if middleware defines wrap_tool_call
    # (which may handle dynamically registered tools)
    tool_node = (
        ToolNode(
            tools=available_tools,
            wrap_tool_call=wrap_tool_call_wrapper,
            awrap_tool_call=awrap_tool_call_wrapper,
        )
        if available_tools or wrap_tool_call_wrapper or awrap_tool_call_wrapper
        else None
    )
查看 LangChain 完整笔记 →
Llama Agentic System (llama-stack-apps) python 三态:built-in(builtin::websearch/builtin::rag/knowledge_search)、client tool(@client_tool 装饰函数 / 继承 ClientTool 实现 get_params_definition+run_impl)、code interpreter。工具以 list 传入 Agent(tools=[...])

三态:built-in(builtin::websearch/builtin::rag/knowledge_search)、client tool(@client_tool 装饰函数 / 继承 ClientTool 实现 get_params_definition+run_impl)、code interpreter。工具以 list 传入 Agent(tools=[...])

examples/client_tools/calculator.py:9examples/client_tools/web_search.py:155examples/agents/agent_with_tools.py:52
examples/client_tools/calculator.py:9 python
logger = logging.getLogger(__name__)


@client_tool
def calculator(x: float, y: float, operation: str) -> dict:
    """Simple calculator tool that performs basic math operations.

    :param x: First number to perform operation on
    :param y: Second number to perform operation on
    :param operation: Mathematical operation to perform ('add', 'subtract', 'multiply', 'divide')
    :returns: Dictionary containing success status and result or error message
    """
    logger.debug(f"Calculator called with: x={x}, y={y}, operation={operation}")
查看 Llama Agentic System (llama-stack-apps) 完整笔记 →
LlamaIndex python 普通函数→FunctionTool.from_defaults 用 inspect.signature+type hints+docstring 自动生成 schema(create_schema_from_function);声明 Context 形参的工具运行时注入且对 LLM 隐藏(requires_context/ctx_param_name);return_direct 工具结果直接返回;并行 tool calls 默认开

普通函数→FunctionTool.from_defaults 用 inspect.signature+type hints+docstring 自动生成 schema(create_schema_from_function);声明 Context 形参的工具运行时注入且对 LLM 隐藏(requires_context/ctx_param_name);return_direct 工具结果直接返回;并行 tool calls 默认开

tools/function_tool.py:71agent/workflow/base_agent.py:347
llama-index-core/llama_index/core/tools/function_tool.py:71 python
CallbackReturn = Optional[Union[ToolOutput, str]]


class FunctionTool(AsyncBaseTool):
    """
    Function Tool.

    A tool that takes in a function, optionally handles workflow context,
    and allows the use of callbacks. The callback can return a new ToolOutput
    to override the default one or a string that will be used as the final content.
    """

    def __init__(
查看 LlamaIndex 完整笔记 →
llm-agents python 文本协议而非原生 function-calling:工具实现 ToolInterface.use(input_text)->str;tool_description/tool_names/tool_by_names 把工具列表渲染进 prompt 供 LLM 选;解析后按名查表调用,未知工具抛 ValueError。内置 PythonREPL/SerpAPI/Google/Searx/HackerNews

文本协议而非原生 function-calling:工具实现 ToolInterface.use(input_text)->str;tool_description/tool_names/tool_by_names 把工具列表渲染进 prompt 供 LLM 选;解析后按名查表调用,未知工具抛 ValueError。内置 PythonREPL/SerpAPI/Google/Searx/HackerNews

tools/base.py:3agent.py:44tools/python_repl.py:34
llm_agents/tools/base.py:3 python
from pydantic import BaseModel

class ToolInterface(BaseModel):
    name: str
    description: str
    
    def use(self, input_text: str) -> str:
        raise NotImplementedError("use() method not implemented")  # Implement in subclass
查看 llm-agents 完整笔记 →
LoongFlow python Toolkit 注册/分发 FunctionTool;声明优先 Pydantic args_schema,否则 inspect.signature+docstring 自动生成 OpenAI function schema;tool_context 形参运行时注入且从 schema 隐藏;内置 Read/Write/Ls/Shell/Todo/Agent/ExecuteCode 等工具;ReAct 侧 Actor 可串行/并行执行

Toolkit 注册/分发 FunctionTool;声明优先 Pydantic args_schema,否则 inspect.signature+docstring 自动生成 OpenAI function schema;tool_context 形参运行时注入且从 schema 隐藏;内置 Read/Write/Ls/Shell/Todo/Agent/ExecuteCode 等工具;ReAct 侧 Actor 可串行/并行执行

agentsdk/tools/toolkit.py:14agentsdk/tools/function_tool.py:68agentsdk/tools/__init__.py:19agentsdk/tools/execute_code_tool.py:58
src/loongflow/agentsdk/tools/toolkit.py:14 python
from ..message import ContentElement, MimeType


class Toolkit:
    """
    Toolkit: manages registration and retrieval of multiple FunctionTool instances.
    
    - Toolkit provides unified access for agents to query and run tools.
    """

    def __init__(self):
        self._tools: Dict[str, FunctionTool] = {}
        self._contexts: Dict[str, ToolContext] = {}
查看 LoongFlow 完整笔记 →
Mastra typescript createTool({ id, description, inputSchema, outputSchema, execute }),Zod/Standard-Schema 定义入参出参,运行时自动校验输入输出(validateToolInput/validateToolOutput);工具也可声明 suspendSchema/resumeSchema 支持 HITL;兼容 Vercel AI SDK tool 与 MCP 工具

createTool({ id, description, inputSchema, outputSchema, execute }),Zod/Standard-Schema 定义入参出参,运行时自动校验输入输出(validateToolInput/validateToolOutput);工具也可声明 suspendSchema/resumeSchema 支持 HITL;兼容 Vercel AI SDK tool 与 MCP 工具

tools/tool.ts:557
packages/core/src/tools/tool.ts:557 typescript
  suspendSchema?: TSuspendSchema;
  resumeSchema?: TResumeSchema;
};
export function createTool<
  TId extends string = string,
  TInputSchema extends SchemaLike = undefined,
  TOutputSchema extends SchemaLike = undefined,
  TSuspendSchema extends SchemaLike = undefined,
  TResumeSchema extends SchemaLike = undefined,
  TRequestContext extends Record<string, any> | unknown = unknown,
  TContext extends ToolExecutionContext<InferSchema<TSuspendSchema>, InferSchema<TResumeSchema>, TRequestContext> =
    ToolExecutionContext<InferSchema<TSuspendSchema>, InferSchema<TResumeSchema>, TRequestContext>,
>(
查看 Mastra 完整笔记 →
MetaGPT python 经典角色无通用工具调用(Action 即"能力");工具体系服务于 RoleZero/DataInterpreter:@register_tool 装饰器把类/函数注册进 ToolRegistry(AST 自动抽 schema),ToolRecommender(TypeMatch / BM25 / Embedding 三种召回)按任务推荐工具子集

经典角色无通用工具调用(Action 即"能力");工具体系服务于 RoleZero/DataInterpreter:@register_tool 装饰器把类/函数注册进 ToolRegistry(AST 自动抽 schema),ToolRecommender(TypeMatch / BM25 / Embedding 三种召回)按任务推荐工具子集

metagpt/tools/tool_registry.py:94tool_registry.py:31metagpt/tools/tool_recommend.py:195tool_recommend.py:231
metagpt/tools/tool_registry.py:94 python
TOOL_REGISTRY = ToolRegistry()


def register_tool(tags: list[str] = None, schema_path: str = "", **kwargs):
    """register a tool to registry"""

    def decorator(cls):
        # Get the file path where the function / class is defined and the source code
        file_path = inspect.getfile(cls)
        if "metagpt" in file_path:
            # split to handle ../metagpt/metagpt/tools/... where only metapgt/tools/... is needed
            file_path = "metagpt" + file_path.split("metagpt")[-1]
        source_code = ""
查看 MetaGPT 完整笔记 →
nanobot python Tool ABC(name/description/parameters JSON Schema + execute);ToolLoader pkgutil 扫描自动注册,@tool_parameters 装饰器注入 schema;ToolRegistry 缓存定义、prepare_call 做类型 cast+校验;runner 支持并发批(concurrency_safe/read_only)执行

Tool ABC(name/description/parameters JSON Schema + execute);ToolLoader pkgutil 扫描自动注册,@tool_parameters 装饰器注入 schema;ToolRegistry 缓存定义、prepare_call 做类型 cast+校验;runner 支持并发批(concurrency_safe/read_only)执行

agent/tools/base.py:124agent/tools/base.py:264agent/tools/registry.py:8agent/tools/loader.py:86
nanobot/agent/tools/base.py:124 python
        return Schema.validate_json_schema_value(value, self.to_json_schema(), path)


class Tool(ABC):
    """Agent capability: read files, run commands, etc."""

    _TYPE_MAP = _JSON_TYPE_MAP
    _BOOL_TRUE = frozenset(("true", "1", "yes"))
    _BOOL_FALSE = frozenset(("false", "0", "no"))

    @staticmethod
    def _resolve_type(t: Any) -> str | None:
        """Pick first non-null type from JSON Schema unions like ``['string','null']``."""
查看 nanobot 完整笔记 →
Open Multi-Agent typescript defineTool() + Zod schema → 自研 zodToJsonSchema 转 JSON Schema 喂 LLM;ToolRegistry 注册、三层过滤(preset→allowlist→denylist);6 内置(bash/file_read/file_write/file_edit/grep/glob);工具错误永不抛出,捕获为 ToolResult{isError:true}

defineTool() + Zod schema → 自研 zodToJsonSchema 转 JSON Schema 喂 LLM;ToolRegistry 注册、三层过滤(preset→allowlist→denylist);6 内置(bash/file_read/file_write/file_edit/grep/glob);工具错误永不抛出,捕获为 ToolResult{isError:true}

src/tool/framework.ts:71src/tool/framework.ts:273src/agent/runner.ts:591src/agent/runner.ts:958
src/tool/framework.ts:71 typescript
 * })
 * ```
 */
export function defineTool<TInput>(config: {
  name: string
  description: string
  inputSchema: ZodSchema<TInput>
  /**
   * Optional runtime validator for `ToolResult.data`.
   * When omitted, output validation is skipped.
   *
   * `ToolResult.data` is always a `string`, so the schema is fixed to
   * `ZodSchema<string>` — use `z.string().refine(...)` / `z.string().regex(...)`
查看 Open Multi-Agent 完整笔记 →
OpenClaw typescript 原生 function calling;AgentTool 契约带 execute(id,args,signal,onPartial),支持 executionMode: "sequential" 与 prepareArguments;内置编码工具 bash/read/write/edit/process + web_search/web_fetch + browser/canvas/cron/nodes/sessions_ 等;参数经 validateToolArguments 校验,beforeToolCall/afterToolCall 钩子可拦截/改写

原生 function calling;AgentTool 契约带 execute(id,args,signal,onPartial),支持 executionMode: "sequential" 与 prepareArguments;内置编码工具 bash/read/write/edit/process + web_search/web_fetch + browser/canvas/cron/nodes/sessions_ 等;参数经 validateToolArguments 校验,beforeToolCall/afterToolCall 钩子可拦截/改写

agent-loop.ts:665
packages/agent-core/src/agent-loop.ts:665 typescript
  };
}

async function prepareToolCall(
  currentContext: AgentContext,
  assistantMessage: AssistantMessage,
  toolCall: AgentToolCall,
  config: AgentLoopConfig,
  signal: AbortSignal | undefined,
): Promise<PreparedToolCall | ImmediateToolCallOutcome> {
  const tool = currentContext.tools?.find((t) => t.name === toolCall.name);
  if (!tool) {
    return {
查看 OpenClaw 完整笔记 →
Pipecat python LLM service 上 register_function(name, handler) 注册函数,handler 收 FunctionCallParams;支持 direct function、并行/顺序执行、cancel_on_interruption、超时;外部工具经 MCPClient.register_tools(llm) 把 MCP server 工具批量注册

LLM service 上 register_function(name, handler) 注册函数,handler 收 FunctionCallParams;支持 direct function、并行/顺序执行、cancel_on_interruption、超时;外部工具经 MCPClient.register_tools(llm) 把 MCP server 工具批量注册

services/llm_service.py:754services/mcp_service.py:146
src/pipecat/services/llm_service.py:754 python

        return summary_text, result.last_summarized_index

    def register_function(
        self,
        function_name: str | None,
        handler: Any,
        *,
        cancel_on_interruption: bool = True,
        timeout_secs: float | None = None,
    ):
        """Register a function handler for LLM function calls.
查看 Pipecat 完整笔记 →
PraisonAI python 普通 Python 函数即工具,@tool 装饰器(inspect.signature+docstring 自动生成 schema)或裸函数皆可;BaseTool 类工具;原生 function-calling,循环执行 execute_tool;YAML 模式自动发现 tools.py 内同名函数;内置 100+ 工具(搜索/文件/shell/web crawl 等)

普通 Python 函数即工具,@tool 装饰器(inspect.signature+docstring 自动生成 schema)或裸函数皆可;BaseTool 类工具;原生 function-calling,循环执行 execute_tool;YAML 模式自动发现 tools.py 内同名函数;内置 100+ 工具(搜索/文件/shell/web crawl 等)

tools/decorator.py:173
src/praisonai-agents/praisonaiagents/tools/decorator.py:173 python
        return True, ""


def tool(
    func: Optional[Callable] = None,
    *,
    name: Optional[str] = None,
    description: Optional[str] = None,
    version: str = "1.0.0",
    availability: Optional[Callable[[], tuple[bool, str]]] = None
) -> Union[FunctionTool, Callable[[Callable], FunctionTool]]:
    """Decorator to convert a function into a tool.
    
查看 PraisonAI 完整笔记 →
Semantic Kernel csharp 三种来源统一为 KernelFunction:① C# 方法+[KernelFunction] 经 KernelFunctionFromMethod 反射生成 schema;② prompt 模板 KernelFunctionFromPrompt;③ OpenAPI/gRPC 导入。FunctionChoiceBehavior.Auto/Required/None 控制模型选择;工具可经 [FromKernelServices] 注入 DI 服务

三种来源统一为 KernelFunction:① C# 方法+[KernelFunction] 经 KernelFunctionFromMethod 反射生成 schema;② prompt 模板 KernelFunctionFromPrompt;③ OpenAPI/gRPC 导入。FunctionChoiceBehavior.Auto/Required/None 控制模型选择;工具可经 [FromKernelServices] 注入 DI 服务

dotnet/src/SemanticKernel.Core/Functions/KernelFunctionFromMethod.cs:62dotnet/src/SemanticKernel.Abstractions/AI/FunctionChoiceBehaviors/FunctionChoiceBehavior.cs:62dotnet/src/Functions/Functions.OpenApi/Extensions/OpenApiKernelExtensions.cs:30
dotnet/src/SemanticKernel.Core/Functions/KernelFunctionFromMethod.cs:62 csharp
    /// <returns>The created <see cref="KernelFunction"/> wrapper for <paramref name="method"/>.</returns>
    [RequiresUnreferencedCode("Uses reflection to handle various aspects of the function creation and invocation, making it incompatible with AOT scenarios.")]
    [RequiresDynamicCode("Uses reflection to handle various aspects of the function creation and invocation, making it incompatible with AOT scenarios.")]
    public static KernelFunction Create(
        MethodInfo method,
        object? target = null,
        string? functionName = null,
        string? description = null,
        IEnumerable<KernelParameterMetadata>? parameters = null,
        KernelReturnParameterMetadata? returnParameter = null,
        ILoggerFactory? loggerFactory = null)
    {
        return Create(
查看 Semantic Kernel 完整笔记 →
smolagents python 两种范式:CodeAgent 把工具当 Python 函数在沙箱内调用;ToolCallingAgent 走原生 JSON function-calling(process_tool_calls/execute_tool_call)。工具定义=@tool 装饰器或 Tool 子类(forward()),自动从 type hints/docstring 生成 schema

两种范式:CodeAgent 把工具当 Python 函数在沙箱内调用;ToolCallingAgent 走原生 JSON function-calling(process_tool_calls/execute_tool_call)。工具定义=@tool 装饰器或 Tool 子类(forward()),自动从 type hints/docstring 生成 schema

tools.py:106tools.py:228agents.py:1361agents.py:1453
tests/fixtures/tools.py:106 python
        }
        output_type = "string"

        def forward(self, text: str, flag: bool = False) -> str:
            return f"Text: {text}, Flag: {flag}"

    return BooleanDefaultTool()


@pytest.fixture
def boolean_default_tool_function():
    @tool
    def boolean_default_tool(text: str, flag: bool = False) -> str:
查看 smolagents 完整笔记 →
Strands Agents python @tool 装饰器经 inspect+type hints+docstring_parser+Pydantic 自动生成 JSON schema;原生 function calling;支持目录热加载(load_tools_from_directory)、ToolProvider、agent-as-tool;默认并发执行

@tool 装饰器经 inspect+type hints+docstring_parser+Pydantic 自动生成 JSON schema;原生 function calling;支持目录热加载(load_tools_from_directory)、ToolProvider、agent-as-tool;默认并发执行

tools/decorator.py:731tools/registry.py:32tools/executors/concurrent.py:19
strands-py/src/strands/tools/decorator.py:731 python
) -> Callable[[Callable[P, R]], DecoratedFunctionTool[P, R]]: ...
# Suppressing the type error because we want callers to be able to use both `tool` and `tool()` at the
# call site, but the actual implementation handles that and it's not representable via the type-system
def tool(  # type: ignore
    func: Callable[P, R] | None = None,
    description: str | None = None,
    inputSchema: JSONSchema | None = None,
    name: str | None = None,
    context: bool | str = False,
) -> DecoratedFunctionTool[P, R] | Callable[[Callable[P, R]], DecoratedFunctionTool[P, R]]:
    """Decorator that transforms a Python function into a Strands tool.

    This decorator seamlessly enables a function to be called both as a regular Python function and as a Strands tool.
查看 Strands Agents 完整笔记 →
Swarm python 普通 Python 函数 → function_to_json 自动转 OpenAI tool schema;原生 function calling

普通 Python 函数 → function_to_json 自动转 OpenAI tool schema;原生 function calling

core.py:50
swarm/core.py:50 python
        messages = [{"role": "system", "content": instructions}] + history
        debug_print(debug, "Getting chat completion for...:", messages)

        tools = [function_to_json(f) for f in agent.functions]
        # hide context_variables from model
        for tool in tools:
            params = tool["function"]["parameters"]
            params["properties"].pop(__CTX_VARS_NAME__, None)
            if __CTX_VARS_NAME__ in params["required"]:
                params["required"].remove(__CTX_VARS_NAME__)

        create_params = {
            "model": model_override or agent.model,
查看 Swarm 完整笔记 →
SwarmClaw typescript 工具 = LangChain tool() + zod schema,运行时按 session 策略动态装配(buildSessionTools);含 shell/file/web/email/image/delegate/subagent/memory/schedule/task 等;normalize-tool-args 容错;终端工具(memory_write/durable_wait/context_compaction)强制结束回合

工具 = LangChain tool() + zod schema,运行时按 session 策略动态装配(buildSessionTools);含 shell/file/web/email/image/delegate/subagent/memory/schedule/task 等;normalize-tool-args 容错;终端工具(memory_write/durable_wait/context_compaction)强制结束回合

session-tools/skill-runtime.ts:2
src/lib/server/session-tools/skill-runtime.ts:2 typescript
import { z } from 'zod'
import { tool, type StructuredToolInterface } from '@langchain/core/tools'
import type { Agent, Session, SessionSkillRuntimeState } from '@/types'
import { errorMessage } from '@/lib/shared-utils'
import { loadAgent } from '@/lib/server/agents/agent-repository'
import { loadSkills } from '@/lib/server/skills/skill-repository'
import { patchSession } from '@/lib/server/sessions/session-repository'
import {
  findResolvedSkill,
  recommendRuntimeSkillsForTask,
  resolveRuntimeSkills,
查看 SwarmClaw 完整笔记 →
Swarms python 普通 Python 函数(带 docstring/type hints)→ BaseTool.func_to_dict 自动转 OpenAI function schema;Pydantic 模型经 base_model_to_openai_function;原生 function calling,结果回灌对话

普通 Python 函数(带 docstring/type hints)→ BaseTool.func_to_dict 自动转 OpenAI function schema;Pydantic 模型经 base_model_to_openai_function;原生 function calling,结果回灌对话

tools/base_tool.py:69agent.py:6042agent.py:6367
swarms/tools/base_tool.py:69 python
ToolType = Union[BaseModel, Dict[str, Any], Callable[..., Any]]


class BaseTool(BaseModel):
    """
    A comprehensive tool management system for function calling, schema conversion, and execution.

    This class provides a unified interface for:
    - Converting functions to OpenAI function calling schemas
    - Managing Pydantic models and their schemas
    - Executing tools with proper error handling and validation
    - Caching expensive operations for improved performance
查看 Swarms 完整笔记 →
Transformers Agents python Tool 抽象 + HF 工具箱(pipeline 封装);支持代码调用与 JSON 调用

Tool 抽象 + HF 工具箱(pipeline 封装);支持代码调用与 JSON 调用

查看 Transformers Agents 完整笔记 →
Upsonic python @tool 装饰器 + ToolConfig(requires_confirmation/requires_user_input/external_execution/sequential/cache_results);支持普通函数、ToolKit 类、agent-as-tool、MCP;统一经 ToolRegistry/ToolManager 归一化 schema

@tool 装饰器 + ToolConfig(requires_confirmation/requires_user_input/external_execution/sequential/cache_results);支持普通函数、ToolKit 类、agent-as-tool、MCP;统一经 ToolRegistry/ToolManager 归一化 schema

src/upsonic/tools/config.py:141tools/config.py:17tools/base.py:53tools/registry.py:33
src/upsonic/tools/config.py:141 python
        return func


def tool(*args: Any, **kwargs: Any) -> Union[Callable, _ToolDecorator]:
    """Decorator to configure tool behavior. Use @tool or @tool(...) for configuration."""
    if len(args) == 1 and len(kwargs) == 0 and callable(args[0]):
        func = args[0]
        default_config = ToolConfig()
        return _ToolDecorator(default_config)(func)
    
    else:
        config = ToolConfig(**kwargs)
        return _ToolDecorator(config)
查看 Upsonic 完整笔记 →
vectara-agentic python 三类来源:① Vectara RAG/search 工具(tools.py:448 / tools.py:199);② 任意 Python 函数 ToolsFactory.create_tool(tools.py:763);③ LlamaIndex ToolSpecs 桥接 get_llama_index_tools(tools.py:784)。统一经 create_tool_from_dynamic_function(tool_utils.py:386)按签名+Pydantic schema 生成 VectaraTool;get_current_date 工具自动追加(agent.py:133)

三类来源:① Vectara RAG/search 工具(tools.py:448 / tools.py:199);② 任意 Python 函数 ToolsFactory.create_tool(tools.py:763);③ LlamaIndex ToolSpecs 桥接 get_llama_index_tools(tools.py:784)。统一经 create_tool_from_dynamic_function(tool_utils.py:386)按签名+Pydantic schema 生成 VectaraTool;get_current_date 工具自动追加(agent.py:133)

tools.py:179tool_utils.py:386
vectara_agentic/tools.py:179 python
    return vectara_retriever.retrieve(query)


class VectaraToolFactory:
    """
    A factory class for creating Vectara RAG tools.
    """

    def __init__(
        self,
        vectara_corpus_key: str = str(os.environ.get("VECTARA_CORPUS_KEY", "")),
        vectara_api_key: str = str(os.environ.get("VECTARA_API_KEY", "")),
    ) -> None:
查看 vectara-agentic 完整笔记 →
VoltAgent typescript createTool/tool() 用 Zod schema 定义工具,编译为 AI SDK Tool;支持 lifecycle hooks(onStart/onEnd)、needsApproval(HITL 审批)、Toolkit 分组、tool routing(embedding 检索式选工具)

createTool/tool() 用 Zod schema 定义工具,编译为 AI SDK Tool;支持 lifecycle hooks(onStart/onEnd)、needsApproval(HITL 审批)、Toolkit 分组、tool routing(embedding 检索式选工具)

tool/index.ts:311tool/index.ts:198
packages/core/src/tool/index.ts:311 typescript
/**
 * Helper function for creating a new tool
 */
export function createTool<T extends ToolSchema>(
  options: ToolOptions<T, undefined>,
): Tool<T, undefined>;
export function createTool<T extends ToolSchema, O extends ToolSchema>(
  options: ToolOptions<T, O>,
): Tool<T, O>;
export function createTool<T extends ToolSchema, O extends ToolSchema | undefined = undefined>(
  options: ToolOptions<T, O>,
): Tool<T, O> {
  return new Tool<T, O>(options);
查看 VoltAgent 完整笔记 →