← 全部文章

GPT-5.6 程序化工具调用:路由与 Agent 工作流迁移指南

GPT-5.6 引入了程序化工具调用(Programmatic Tool Calling)——模型在 V8 沙箱内编写 JavaScript 来编排你的工具,token 用量减少 24–63%,消除了轮次间的往返开销。但前提是:必须使用 Responses API。我们详解从传统函数调用迁移的全过程,逐一说明每个破坏性变更,并展示如何在过渡期通过 OpenAI 兼容网关安全路由 GPT-5.6 流量。

· TheRouter

GPT-5.6 于 2026 年 7 月 9 日正式发布。它面向开发者最重要的新特性不是又一个基准测试分数——而是程序化工具调用(Programmatic Tool Calling),一种让模型在沙箱化的 V8 运行时中编写并执行 JavaScript 来协调你的工具的机制。GPT-5.6 不再将每次工具结果都回传给模型进行重新推理,而是可以循环、分支、过滤中间数据,仅返回最终结果。OpenAI 报告平均减少 24% 的输出 token,部分早期客户在工具密集型工作流中实现了高达 63.5% 的缩减。

关键前提:程序化工具调用仅支持 Responses API。 如果你的 Agent 仍在调用 /v1/chat/completions,则无法使用此特性。本指南将带你完成迁移——哪些改变了,哪些会中断,以及如何在过渡期间安全路由流量。

  1. 替换三个值,不是三个 SDK。在现有 OpenAI 客户端里改 api_key、base_url、model。请求与响应代码保持不变。
  2. 显式映射 model ID。目标供应商的 model id 几乎不会和 OpenAI 完全一致。 在业务代码之外维护一份 { openai_id: target_id } 映射。
  3. 验证流式格式。SSE 分片必须遵循 OpenAI 的 data: {...} + data: [DONE] 契约。切生产前先跑一次流式调用。
  4. 检查限流响应头。部分供应商不返回 x-ratelimit-*。 在包装层 做缺省兜底,缺头不要崩。
  5. 留回滚路径。用 feature flag 切流;新旧 endpoint 影子并行 24 小时,再正式切换。

数据来源:OpenAI GPT-5.6 公告,检索于 2026-07-19;程序化工具调用文档,检索于 2026-07-19;ByteIota 迁移分析,检索于 2026-07-19;OpenAI API 定价,检索于 2026-07-19。

TL;DR — 迁移前后对比

维度传统函数调用 (/v1/chat/completions)程序化工具调用 (Responses API)
编排方式开发者脚本化每一步,或模型每轮发出一个工具调用模型编写 JavaScript 协调工具
往返次数每个工具一次 API 调用 → 模型 → 下一个工具一个程序处理 N 个工具 → 单一结果
Token 成本每个中间结果进入上下文仅 program_output 进入上下文
并行调用开发者管理或 tool_choice: "auto"V8 沙箱内原生 Promise.all()
支持模型所有 GPT-4/5.x 模型仅 GPT-5.6 Sol、Terra、Luna
API 端点/v1/chat/completions/v1/responses

什么是程序化工具调用?

启用程序化工具调用后,GPT-5.6 可以输出一个 program 类型的项,其中包含 JavaScript 代码。OpenAI 在一个全新的隔离 V8 运行时中执行该代码。程序可以:

  • 通过 await tools.your_function_name({ ... }) 调用你的工具
  • 使用 Promise.all() 并行执行调用
  • 使用循环、条件判断和中间变量
  • 在返回前过滤或聚合工具结果

你的应用仍然执行实际的工具函数——V8 沙箱没有网络访问、没有 Node.js API、没有持久状态。它负责编排;你负责执行。

结果:模型看到的是单个 program_output 项,而不是 10 个独立的 function_call_output 项。对于一个 10 步工具工作流,上下文累积大约减少 10 倍。

破坏性变更

从 /v1/chat/completions 迁移到 Responses API 引入了几个结构性变化。以下是需要审计的内容:

1. 响应结构完全改变

之前(Chat Completions):

{
  "choices": [{
    "message": {
      "role": "assistant",
      "tool_calls": [{
        "id": "call_abc123",
        "function": { "name": "get_weather", "arguments": "{\"city\":\"Shanghai\"}" }
      }]
    }
  }]
}

之后(Responses API):

{
  "output": [
    {
      "type": "program",
      "call_id": "prog_abc123",
      "code": "const weather = await tools.get_weather({city: 'Shanghai'});\ntext(JSON.stringify(weather));",
      "fingerprint": "fp_xyz..."
    },
    {
      "type": "function_call",
      "call_id": "fc_001",
      "name": "get_weather",
      "arguments": "{\"city\":\"Shanghai\"}",
      "caller": { "caller_id": "prog_abc123" }
    }
  ]
}

choices[0].message 的包装层消失了。你获得的是一个类型化的 output 数组,包含不同的项类型(program、function_call、function_call_output、program_output、message)。

2. 工具声明新增 allowed_callers

之前:

tools = [
    {"type": "function", "function": {"name": "query_db", "parameters": {...}}}
]

之后:

tools = [
    {"type": "programmatic_tool_calling"},  # 启用该特性
    {
        "type": "function",
        "name": "query_db",
        "parameters": {...},
        "output_schema": {...},  # 帮助 JS 使用类型化结果
        "allowed_callers": ["programmatic"]  # 或 ["direct", "programmatic"]
    }
]

三个关键新增:

  • 在 tools 列表中添加 {"type": "programmatic_tool_calling"}
  • 在每个函数上设置 allowed_callers("direct"、"programmatic" 或两者)
  • 添加 output_schema 以便生成的 JavaScript 能可靠地访问返回字段

3. 并行调度成为默认行为

在 Responses API 中,GPT-5.6 默认会发出并行工具调用。如果你的工具处理器假设串行执行(例如工具 B 依赖工具 A 的副作用),它们将静默中断。审计你的工具依赖图。

4. 响应默认存储在服务端

与 Chat Completions(无状态)不同,Responses API 默认在服务端存储响应。对于隐私敏感的工作流,需显式设置 store: false。注意:store: false 启用无状态续接但不等于零数据保留(ZDR)——ZDR 必须在组织或项目级别启用。

5. code_interpreter → tools.runtime 命名空间

旧的 code_interpreter 工具类型被 tools.runtime 命名空间取代,改为按调用计费。如果你依赖代码执行功能,需要相应调整预算。

分步迁移清单

第 1 步:审计当前工具调用模式

# 在代码库中查找所有带工具的 chat/completions 调用
grep -rn "chat.completions\|/v1/chat/completions" --include="*.py" --include="*.ts" .
grep -rn "tool_calls\|function_call" --include="*.py" --include="*.ts" .

对每个调用点进行分类:

  • 单次工具调用 → 单一结果:在 Responses API 上保持直接工具调用
  • 多步工具链:程序化工具调用的候选
  • 步骤间需要语义判断:保持直接工具调用(模型需要在每个结果之间进行推理)

第 2 步:先迁移到 Responses API(不启用程序化工具调用)

切换端点和响应解析:

# 之前
response = client.chat.completions.create(
    model="gpt-5.5",
    messages=[{"role": "user", "content": "..."}],
    tools=[{"type": "function", "function": {"name": "get_weather", ...}}]
)
tool_call = response.choices[0].message.tool_calls[0]

# 之后——Responses API,经典直接调用
response = client.responses.create(
    model="gpt-5.6-terra",
    input=[{"role": "user", "content": "..."}],
    tools=[{"type": "function", "name": "get_weather", "parameters": {...}}]
)
for item in response.output:
    if item.type == "function_call":
        result = execute_tool(item.name, item.arguments)

第 3 步:为符合条件的工作流启用程序化工具调用

对于工具密集型的有限工作流:

response = client.responses.create(
    model="gpt-5.6-terra",
    input=[{"role": "user", "content": "对比所有 5 个仓库的库存"}],
    tools=[
        {"type": "programmatic_tool_calling"},
        {
            "type": "function",
            "name": "get_inventory",
            "parameters": {"type": "object", "properties": {"warehouse_id": {"type": "string"}}},
            "output_schema": {
                "type": "object",
                "properties": {"warehouse_id": {"type": "string"}, "units": {"type": "number"}},
                "required": ["warehouse_id", "units"]
            },
            "allowed_callers": ["programmatic"]
        }
    ]
)

# 处理程序发出的工具调用
for item in response.output:
    if item.type == "function_call":
        result = execute_tool(item.name, item.arguments)
        # 通过 caller.caller_id 将结果链接回程序

第 4 步:添加系统提示指导

GPT-5.6 对显式的编排指令响应良好:

使用程序化工具调用来完成数据收集阶段,仅使用 get_inventory 和 get_metrics。
对独立的调用并发执行。

处理中间结果并返回单个 JSON 摘要。
瞬时失败最多重试 2 次。

对于需要审批的写操作,使用直接工具调用。

回滚路径

如果程序化工具调用产生意外结果:

  1. 从 tools 中移除 {"type": "programmatic_tool_calling"} — 模型在同一 Responses API 端点上回退到直接工具调用
  2. 将模型切换为 gpt-5.5 — 仍可在 Responses API 上使用直接工具调用
  3. 完全回退到 Chat Completions — 将端点改回 /v1/chat/completions 并使用任何 GPT-5.x 模型

Responses API 同时支持两种模式。你可以对部分工具启用程序化调用(allowed_callers: ["programmatic"]),而其他工具保持仅直接调用(allowed_callers: ["direct"])。

成本影响

模型输入 / 1M tokens输出 / 1M tokens备注
gpt-5.5$5.00$25.00当前基线
gpt-5.6-sol$5.00$30.00前沿级;输出比 5.5 贵 20%
gpt-5.6-terra$2.50$15.00推荐;输入降 50%,输出降 40%
gpt-5.6-luna$1.00$6.00大批量;输入降 80%,输出降 76%

价格来自 OpenAI,检索于 2026 年 7 月 19 日。

在 Terra 上结合程序化工具调用,效果十分显著:

  • 模型成本:输入降 50% / 输出降 40%(Terra 对比 GPT-5.5)
  • Token 缩减:–24% 至 –63.5%(更少往返,更少上下文累积)
  • 综合节省:相比 GPT-5.5 传统工具调用,每完成一个工作流通常节省 60–80%

何时不应使用程序化工具调用

以下场景应保持直接工具调用:

  • 每个结果都改变计划 — 步骤间的语义判断需要模型推理
  • 写操作需要审批 — 保持清晰的授权边界
  • 工具有顺序依赖的副作用 — V8 沙箱可能并行化调用
  • 需要完整的引用溯源 — program_output 会折叠中间步骤
  • 工作流只有单步 — 对一次调用来说生成程序的开销不值得

V8 沙箱约束

V8 运行时有硬性限制:

  • 无网络访问(工具是唯一的外部接口)
  • 无 Node.js API,无 require(),无包导入
  • 执行间无持久状态
  • 无 console.log(使用 text() 或 image() 输出)
  • 无子进程执行或文件系统访问
  • 只能调用设置了 allowed_callers: ["programmatic"] 的工具

这些是安全特性。程序只能通过你显式选入的工具与外部系统交互。

通过 OpenAI 兼容网关路由

如果你通过 TheRouter 或其他 OpenAI 兼容网关路由 API 流量,迁移路径是一样的——只需将 base_url 指向你的网关并使用 gpt-5.6-terra 作为模型 ID。当你的网关支持 Responses API 格式时,请求会透明传递。

对于迁移中的团队,常见模式是:

  1. 将 gpt-5.6-terra 流量通过网关路由,用于新的程序化工具调用工作流
  2. 保持 gpt-5.5 在回退路由上,用于现有 Chat Completions 代码
  3. 逐步迁移调用点;按路由监控 token 用量

这样可以避免一次性大规模切换,并允许你并排比较成本。

时间线与建议

时间框架行动
现在审计工具调用模式;分类为程序化候选或仅直接调用
第 1–2 周迁移到 Responses API 的直接工具调用(暂不启用程序化工具调用)
第 2–3 周为有限的工具密集型工作流启用程序化工具调用
第 3–4 周基准测试 token 节省;根据质量需求调整模型层级(Sol → Terra → Luna)
2027 Q1response_format: {"type": "json_object"} 将失去保证形状行为——迁移到 JSON Schema 2025-12

常见问题

Q:使用 GPT-5.6 必须启用程序化工具调用吗? 不需要。GPT-5.6 在 Responses API 上支持标准的直接工具调用。程序化工具调用通过 programmatic_tool_calling 工具类型选择性启用。

Q:能在 Chat Completions API 上使用程序化工具调用吗? 不能。它需要 Responses API(/v1/responses)。

Q:streaming 支持如何? Responses API 支持 streaming。程序执行事件会随着发生而流式传输——你会看到 program、function_call 和 program_output 项逐步出现。

Q:GPT-5.6 在 TheRouter 的 models-data.ts 中吗? 撰写时尚未包含。GPT-5.6 模型 ID(gpt-5.6-sol、gpt-5.6-terra、gpt-5.6-luna)已通过 OpenAI 的 API 确认,但可能尚未反映在所有路由配置中。请查看你的网关的实时 /models/ 端点了解当前可用性。


GPT-5.6 于 2026 年 7 月 9 日发布。程序化工具调用文档在撰写时(2026 年 7 月 19 日)为最新。定价、模型可用性和沙箱约束可能变化——生产部署前请核实 OpenAI 官方文档。

内部链接

本文涉及的模型

帮助与联系