工具调用
一句话总结agent 与外部世界交互的手段:定义工具(名字+参数 schema+实现)→ 把工具暴露给模型 → 模型产出调用 → 框架解析并执行 → 结果回灌。是把 LLM 从”会说”变成”会做”的关键组件。MCP 正在成为工具的标准协议。
它解决什么问题
模型本身只能生成文本。工具让它能查数据库、调 API、跑代码、读写文件——把语言能力接到真实动作上。
设计维度 / 实现谱系
- 工具定义方式:装饰器/函数签名自动生成 schema(ConnectOnion、Strands)↔ 显式 schema 类 ↔ OpenAPI 导入
- 调用机制:原生 function calling ↔ 文本协议解析(ReAct 格式)↔ 写代码调用(CodeAct,smolagents)
- 执行:本地函数 ↔ 远程/沙箱(e2b、runtime-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 |
| AgentScope | Toolkit 统一管理函数/MCP/技能;FunctionTool 用 inspect+docstring 自动抽 JSON schema(_extract_input_schema);工具按 group 分组、可 agentic 激活/停用(meta tool);执行经 call_tool,支持并发安全标记 is_concurrency_safe 与状态注入 is_state_injected(_agent_state) |
| AgentVerse | 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 |
| Ailoy | 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) |
| 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 占位 |
| AutoGen | 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 |
| Botpress | new 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 等工具 |
| CrewAI | BaseTool(pydantic args_schema) / Tool;@tool 装饰器或子类化;native 模式转 OpenAI schema,ReAct 模式渲染文本;ToolUsage 负责选择/执行/缓存/容错 |
| Dust | 统一为 MCP:内置工具与第三方集成都实现为 MCP server,原生 function calling;工具规格 buildToolSpecification,执行 mcp_execution.ts;60+ 内置 server 在 index 注册 |
| Haystack | 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) |
| 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 |
| LoongFlow | Toolkit 注册/分发 FunctionTool;声明优先 Pydantic args_schema,否则 inspect.signature+docstring 自动生成 OpenAI function schema;tool_context 形参运行时注入且从 schema 隐藏;内置 Read/Write/Ls/Shell/Todo/Agent/ExecuteCode 等工具;ReAct 侧 Actor 可串行/并行执行 |
| Mastra | createTool({ 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 三种召回)按任务推荐工具子集 |
| nanobot | Tool ABC(name/description/parameters JSON Schema + execute);ToolLoader pkgutil 扫描自动注册,@tool_parameters 装饰器注入 schema;ToolRegistry 缓存定义、prepare_call 做类型 cast+校验;runner 支持并发批(concurrency_safe/read_only)执行 |
| Open Multi-Agent | defineTool() + 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 钩子可拦截/改写 |
| Pipecat | LLM 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 Agents | Tool 抽象 + 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) |
| VoltAgent | createTool/tool() 用 Zod schema 定义工具,编译为 AI SDK Tool;支持 lifecycle hooks(onStart/onEnd)、needsApproval(HITL 审批)、Toolkit 分组、tool routing(embedding 检索式选工具) |
各框架实现对比 · 源码级
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 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" 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 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. 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 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) 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 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="", 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/**
* 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
*/ 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 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, 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""" # 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. 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
@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) 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
#[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), 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 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) 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:1196StreamT = 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, 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 * - **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>> 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 # 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." 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
// ==================== 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()) 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 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. 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
@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 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// 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 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 # 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 = "", 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 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
""" 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:30logging.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 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
# 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
) 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:52logger = 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}") 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:347CallbackReturn = 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__( 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:34from 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 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:58from ..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] = {} 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 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>,
>( 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:231TOOL_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 = "" 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 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']``.""" 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 * })
* ```
*/
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(...)` 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 };
}
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 { 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
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. 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 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.
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 /// <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( 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 }
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: 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) -> 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. Swarm python 普通 Python 函数 → function_to_json 自动转 OpenAI tool schema;原生 function calling
普通 Python 函数 → function_to_json 自动转 OpenAI tool schema;原生 function calling
core.py:50 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, 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:2import { 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, 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:6367ToolType = 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 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 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) 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 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: 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/**
* 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);