Skip to content

源码与协议对比 ​

本章从工程师视角对比主流平台与框架的 Tool Use 实现。虽然各家 API 形态不同,但底层都遵循“定义工具 → 绑定工具 → 模型生成调用 → 执行 → 反馈结果”的循环。

OpenAI Function Calling ​

OpenAI 的 Function Calling 分为 Chat Completions API 与 Responses API 两条线,字段命名略有差异。

Chat Completions API ​

python
from openai import OpenAI
client = OpenAI()

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名,如北京"},
                    "unit": {"type": "string", "enum": ["c", "f"]},
                },
                "required": ["city"],
                "additionalProperties": False,
            },
            "strict": True,
        },
    }
]

response = client.chat.completions.create(
    model="gpt-6.1-sol",
    messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
    tools=tools,
    tool_choice="auto",
)

if response.choices[0].message.tool_calls:
    for tc in response.choices[0].message.tool_calls:
        args = json.loads(tc.function.arguments)
        result = get_weather(**args)
        # 把结果作为 role=tool 消息回传

Responses API ​

python
response = client.responses.create(
    model="gpt-6.1-sol",
    input="北京今天天气怎么样?",
    tools=[
        {
            "type": "function",
            "name": "get_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {...},
            "strict": True,
        }
    ],
    tool="auto",
)

特点:

  • strict: True 可显著提升参数格式遵循率。
  • tool_choice 支持 auto / none / required / {"type": "function", "function": {"name": "..."}}。
  • parallel_tool_calls: False 可禁用并行调用。
  • 2026 年的主线是 DevDay 2026(2026-09-29)发布的 Agents API 公测:基于 Codex harness 的托管 Agent 运行时,内置 OpenAI 云端 computer use、tool search、context compaction 与多 Agent 协调,并集成进 Codex 与 ChatGPT Work;配套发布 GPT-6.1 Sol(Ultrafast 推理档可使 Codex 生成提速约 8 倍)与 Decisions API(Luna 模型驱动的确定性结构化判定,面向合规场景)。官方口径工具调用与工作流整体提速 30%+;Agent Builder 已弃用,Agents SDK 成为官方主推编排层。结构化输出与 strict mode 底层均由受约束解码保证,生产上建议默认开启。

Anthropic Tool Use ​

Anthropic 把工具调用与结果都表达为消息内容块(content block)。

python
from anthropic import Anthropic
client = Anthropic()

tools = [
    {
        "name": "get_weather",
        "description": "获取指定城市的当前天气",
        "input_schema": {
            "type": "object",
            "properties": {
                "city": {"type": "string"},
                "unit": {"type": "string", "enum": ["c", "f"]},
            },
            "required": ["city"],
        },
    }
]

response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
    tools=tools,
    tool_choice={"type": "auto"},
)

for block in response.content:
    if block.type == "tool_use":
        result = get_weather(**block.input)
        # 回传 tool_result 块
        tool_result = {
            "type": "tool_result",
            "tool_use_id": block.id,
            "content": str(result),
        }

特点:

  • 工具参数 schema 字段名为 input_schema。
  • 工具结果通过 tool_result 块回传,需匹配 tool_use_id。
  • 支持 disable_parallel_tool_use 与 tool_choice: {type: "any"} / {type: "tool", name: "..."}。
  • 2026 下半年起 Anthropic 的当前主力是 5.5 家族:Opus 5.5(2026-09-22,多数任务达 Fable 5.1 水平、成本低 40%)、Sonnet 5.5(2026-09-28,提速 30%)、Haiku 5.5(2026-10-07,首个可调 effort 的 Haiku),均支持 tool use。服务端工具持续加码:代码执行工具(见下文)、浏览器工具集(browser_toolset,2026-08 GA)、web 搜索/抓取工具、MCP 连接器;客户端侧支持 tool search 与 Skills(渐进披露),大规模工具集不必全量注入。

代码执行作为内置工具(Anthropic / OpenAI) ​

2025–2026 年,头部厂商把“沙箱代码执行”做成了托管工具:模型生成代码,由厂商在隔离容器中运行,结果以 tool_result 回传。

Anthropic 的代码执行工具(2026-01 版 code_execution_20260120 为推荐版本)的关键设计:

python
response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=4096,
    tools=[
        {"type": "code_execution_20260120", "name": "code_execution"}
    ],
    messages=[{"role": "user", "content": "分析这份 CSV 并画图"}],
)

特点:

  • REPL 状态持久化:后续代码调用可以复用之前定义的变量与导入,多轮“写代码 → 看结果 → 改代码”不需要重复上下文。
  • programmatic tool calling:模型可以在同轮中既输出普通工具调用、又输出代码,框架按依赖调度。
  • 强隔离:无公网访问(或严格白名单)、资源限额、临时文件系统,按会话计费。
  • OpenAI 侧的对应物是 ChatGPT Agent / Codex 的沙箱代码执行,经 Responses API 暴露;Cloudflare 等则提供自托管的 “Code Mode”(每次调用全新容器、无状态)。

这一形态本质上是 CodeAct 思想的托管化:动作空间从“几十个 JSON 工具”收敛为“一个代码执行工具 + 一批 Python 可调用的 SDK”,用代码的表达力换取轮次与 token 的节省(参见《The Bitter Lesson of Tool Calling》,第 1 章)。

浏览器与计算机使用工具 ​

“操作真实界面”是 Tool Use 在 2025–2026 年的另一主战场,形成两条技术路线:

路线代表原理适用场景
视觉/GUI 级 Computer UseClaude Computer Use、OpenAI CUA、Gemini Computer Use、OpenCUA(开源权重)模型看屏幕截图,输出鼠标/键盘动作跨应用桌面操作、无 API 的老系统
DOM/CDP 级浏览器工具Anthropic browser_toolset、开源 browser-use、Stagehand、Playwright MCP模型获得结构化的页面元素引用,做点击/填表/导航网页自动化、表单、数据抓取

工程要点:

  • Anthropic 2026-08 将 browser_toolset(视口级浏览器工具集,含元素引用、表单输入、标签页管理、可选文件上传)推向 GA,与完整的 Computer Use 形成“网页任务用浏览器工具、桌面任务用 Computer Use”的分工;开源 browser-use 项目也实现了兼容该工具集的动作集合。
  • OpenAI 侧:CUA 的独立产品 Operator 已于 2025-08 并入 ChatGPT Agent;2026-09 DevDay 起,computer use 作为 Agents API 的托管能力进入公测(OpenAI 云端浏览器/桌面环境),第三方基础设施(Browserbase、Hyperbrowser 等)继续提供配套隐身浏览器与代理网络。
  • 第三方评测(2026)大致显示:浏览器专用任务上 DOM 类工具领先(WebVoyager 约 89%);旧版 OSWorld(Verified)头部已越过人类基线(Intelligence-Indeed Agent 约 90.2%、Claude Fable 5 约 86.0%、GPT-5.5 约 78.7%,100 步限制),但新版 OSWorld 2.0(108 个长程任务)大幅拉开差距:Claude Fable 5.1 约 77.9% partial / 41.7% binary、Claude Opus 5(max effort)约 68.3% partial、GPT-6 Astra 厂商自报约 72.6% partial——注意 partial 与 binary 口径差异巨大,且不少数字为厂商自报、不可直接横比。GUI 级长程操作的可靠性仍是明显短板,生产上应优先用 API/结构化工具,把界面操作作为兜底。
  • 安全:浏览器/桌面工具是提示注入的高危入口(恶意网页内容可劫持工具调用),必须配合域名白名单、敏感操作 HITL 与输出审查(见第 8、9 章)。

Google Gemini Function Calling ​

Gemini 使用 function_declarations 定义工具,通过 tool_config 控制调用模式。

python
from google import genai
from google.genai import types

client = genai.Client()

weather_tool = types.Tool(
    function_declarations=[
        types.FunctionDeclaration(
            name="get_weather",
            description="获取指定城市的当前天气",
            parameters=types.Schema(
                type=types.Type.OBJECT,
                properties={
                    "city": types.Schema(type=types.Type.STRING),
                    "unit": types.Schema(
                        type=types.Type.STRING,
                        enum=["c", "f"],
                    ),
                },
                required=["city"],
            ),
        )
    ]
)

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="北京今天天气怎么样?",
    config=types.GenerateContentConfig(
        tools=[weather_tool],
        tool_config=types.ToolConfig(
            function_calling_config=types.FunctionCallingConfig(mode="AUTO")
        ),
    ),
)
for part in response.candidates[0].content.parts:
    if part.function_call:
        fc = part.function_call
        result = get_weather(**dict(fc.args))
        # 通过 function_response part 回传

特点:

  • Schema 使用 protobuf 风格封装(新 SDK 为 types.Schema),参数类型为枚举常量;旧的 google.generativeai SDK 已被 google-genai 取代,新代码应使用后者。
  • 工具选择模式为 AUTO / ANY / NONE(FunctionCallingConfig.mode)。
  • 结果通过 function_response part 回传。
  • 2026 年的重要变化在结构化输出:Google 官方扩大 structured outputs 的 JSON Schema 关键字支持(anyOf、$ref、minimum/maximum、additionalProperties、prefixItems),可直接配合 Pydantic / Zod 使用;Gemini 3 起支持 structured outputs 与 function calling 在同一调用中组合。同时 API 形态在迁移:Interactions API 以多态 response_format 取代 response_mime_type(2026-06 旧接口下线),Schema Manager 需要跟踪这类厂商侧 schema 表达变更。

LangGraph ​

LangGraph 把工具抽象为 Python 函数,通过装饰器注册,并用预构建节点处理工具调用。

python
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode, tools_condition
from langgraph.graph import StateGraph, MessagesState

@tool
def get_weather(city: str, unit: str = "c") -> str:
    """获取指定城市的当前天气。"""
    return f"{city} 今天晴天,25{unit}。"

graph = StateGraph(MessagesState)
graph.add_node("agent", call_model)
graph.add_node("tools", ToolNode([get_weather]))
graph.add_edge("__start__", "agent")
graph.add_conditional_edges("agent", tools_condition)
graph.add_edge("tools", "agent")
app = graph.compile()

特点:

  • @tool 自动从函数签名与 docstring 生成 schema。
  • bind_tools 把工具绑定到模型。
  • ToolNode 自动执行工具调用,tools_condition 自动判断是否需要进入工具节点。
  • 适合快速原型,复杂权限与沙箱需要自己扩展。

OpenAI Agents SDK ​

OpenAI Agents SDK 是一个高阶框架,内置工具循环、跟踪与交接(handoff)。

python
from agents import Agent, function_tool, Runner

@function_tool
def get_weather(city: str) -> str:
    """获取指定城市的当前天气。"""
    return f"{city} 今天晴天。"

agent = Agent(
    name="weather_assistant",
    instructions="你是一个天气助手。",
    tools=[get_weather],
    model="gpt-6.1-sol",
)

result = Runner.run_sync(agent, "北京今天天气怎么样?")
print(result.final_output)

特点:

  • @function_tool 自动 schema 生成。
  • Runner 内部负责工具循环、结果反馈、跟踪(trace)。
  • 支持 handoff 把任务转交给其他 Agent。
  • DevDay 2026 后 Agents SDK 是 OpenAI 官方主推的编排层(Agent Builder 已弃用);需要托管运行时可叠加 Agents API(computer use、tool search、context compaction,2026-09 公测)。
  • 对需要深度定制的生产系统,仍需自行封装 Registry、权限、熔断等。

AutoGen ​

AutoGen 把函数包装为 FunctionTool,再绑定到 AssistantAgent。

python
from autogen_core.tools import FunctionTool
from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient

async def get_weather(city: str) -> str:
    return f"{city} 今天晴天。"

weather_tool = FunctionTool(
    get_weather,
    description="获取指定城市的当前天气",
)

agent = AssistantAgent(
    name="weather_assistant",
    model_client=OpenAIChatCompletionClient(model="gpt-6.1-sol"),
    tools=[weather_tool],
    system_message="你是一个天气助手。",
)

特点:

  • 工具与 Agent 解耦,便于复用。
  • AssistantAgent 自动处理工具循环。
  • v0.4+ 基于 autogen-core 重新设计,强调异步与模块化。

MCP(Model Context Protocol) ​

MCP 不是某一厂商的 SDK,而是一套开放协议,用于标准化模型与外部能力之间的发现与调用。

json
// tools/list 响应示例
{
  "tools": [
    {
      "name": "get_weather",
      "description": "获取指定城市的当前天气",
      "inputSchema": {
        "type": "object",
        "properties": {
          "city": {"type": "string"},
          "unit": {"type": "string", "enum": ["c", "f"]}
        },
        "required": ["city"]
      },
      "annotations": {
        "title": "Get Weather",
        "readOnlyHint": true
      }
    }
  ]
}

// tools/call 请求示例
{
  "name": "get_weather",
  "arguments": {"city": "北京", "unit": "c"}
}

特点:

  • 通过 tools/list 动态发现,通过 tools/call 调用。
  • JSON-RPC 2.0 传输,支持 stdio 与 Streamable HTTP(2025-03 起取代 HTTP+SSE)。
  • inputSchema 字段与 JSON Schema 对齐,便于跨厂商复用。
  • annotations 提供可读提示、破坏性提示、只读提示、幂等提示等元信息(2025-03 引入),客户端可据此做默认审批策略。
  • 2025-06 规范新增 elicitation(服务端在任务中途经客户端向用户请求结构化输入,原生支撑 HITL)与 structuredContent(结构化工具输出)。
  • 鉴权从“各写各的”演进为 OAuth 2.1 资源服务器语义 + RFC 8707 受众绑定(防止 token 跨服务重放);2026-07 的规范 RC 进一步走向无状态化(server/discover、请求级元数据、ttlMs/cacheScope 缓存提示)。
  • 安全现实:MCP 生态 2025–2026 年曝出多起 CVE(工具投毒、STDIO 命令注入等),客户端必须做工具描述校验、变更检测与最小权限(见第 8 章),详见 MCP 与 安全 主题。

综合对比表 ​

项目Schema 字段Tool Choice并行调用结果格式循环责任适合场景
OpenAI Chat Completionsfunction.parameterstool_choice + parallel_tool_calls支持role: tool + tool_call_id应用代码通用生产
OpenAI Responses APIparameterstool支持输出项中 type: function_call应用代码新 API 路线,内置托管工具多
OpenAI Agents API(公测)平台托管 tools平台托管支持平台托管 trace平台托管运行时托管 Agent:computer use / tool search / context compaction
Anthropic Messagesinput_schematool_choice + disable_parallel_tool_use支持tool_use / tool_result 块应用代码Claude 生态,服务端工具丰富
Anthropic Code Execution无需 schema模型自主决定同轮混合编排tool_result(代码输出)托管沙箱执行数据处理、代码类动作(CodeAct)
Google Geminifunction_declarations[].parameterstool_config.function_calling_config.mode支持function_call / function_response part应用代码Gemini 生态
LangGraph@tool 自动生成bind_tools + tools_condition支持内部消息对象框架内置快速编排
OpenAI Agents SDK@function_tool 自动生成默认自动,可强制支持内部封装Runner 内置快速 Agent 原型
AutoGenFunctionTool 包装Agent 配置支持内部消息对象Agent 内置多 Agent 系统
MCPinputSchema由客户端/模型层决定取决于客户端JSON-RPC result / structuredContent客户端实现开放生态 / 插件 / 跨服务

工程选型建议 ​

  • 直接与 LLM 厂商集成:如果团队只需要支持一家模型,直接使用厂商 SDK 最简单,严格模式与原生跟踪都可用。
  • 需要切换多家模型:在内部建立统一的 ToolDefinition 与 SchemaManager,再适配到各厂商格式。
  • 快速原型与编排:LangGraph 或 OpenAI Agents SDK 能显著降低样板代码。
  • 不想自研 Agent 运行时:可考虑托管运行时路线(OpenAI Agents API 公测),把 computer use、tool search、context compaction 交给平台;但 Registry、权限、审计等治理层仍需自己掌握。
  • 开放插件生态 / 多租户:采用 MCP 作为外部能力接入标准,Tool Use 层负责语义映射与权限治理。
  • 代码密集型任务:优先考虑代码执行工具 / CodeAct 形态(托管沙箱或自建沙箱),把数据加工类动作从“多轮 JSON 调用”折叠成“单轮代码”;但要求模型具备足够的代码能力,且沙箱隔离必须到位。
  • 网页/桌面自动化任务:优先 DOM/CDP 级浏览器工具,视觉级 Computer Use 作为无 API 系统的兜底;两者都要叠加防注入与人机确认。

无论选择哪种方案,生产系统都需要在框架之上补充 Registry、Validator、Permission、Executor、Observer 等模块,不能把所有治理逻辑都交给模型或框架默认实现。

Released under CC-BY-SA-4.0 License.