GPT-5.6 程序化工具调用:路由与 Agent 工作流迁移指南
GPT-5.6 引入了程序化工具调用(Programmatic Tool Calling)——模型在 V8 沙箱内编写 JavaScript 来编排你的工具,token 用量减少 24–63%,消除了轮次间的往返开销。但前提是:必须使用 Responses API。我们详解从传统函数调用迁移的全过程,逐一说明每个破坏性变更,并展示如何在过渡期通过 OpenAI 兼容网关安全路由 GPT-5.6 流量。
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,则无法使用此特性。本指南将带你完成迁移——哪些改变了,哪些会中断,以及如何在过渡期间安全路由流量。
- 替换三个值,不是三个 SDK。在现有 OpenAI 客户端里改
api_key、base_url、model。请求与响应代码保持不变。 - 显式映射 model ID。目标供应商的 model id 几乎不会和 OpenAI 完全一致。 在业务代码之外维护一份
{ openai_id: target_id }映射。 - 验证流式格式。SSE 分片必须遵循 OpenAI 的
data: {...}+data: [DONE]契约。切生产前先跑一次流式调用。 - 检查限流响应头。部分供应商不返回
x-ratelimit-*。 在包装层 做缺省兜底,缺头不要崩。 - 留回滚路径。用 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 次。
对于需要审批的写操作,使用直接工具调用。
回滚路径
如果程序化工具调用产生意外结果:
- 从 tools 中移除
{"type": "programmatic_tool_calling"}— 模型在同一 Responses API 端点上回退到直接工具调用 - 将模型切换为
gpt-5.5— 仍可在 Responses API 上使用直接工具调用 - 完全回退到 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 格式时,请求会透明传递。
对于迁移中的团队,常见模式是:
- 将
gpt-5.6-terra流量通过网关路由,用于新的程序化工具调用工作流 - 保持
gpt-5.5在回退路由上,用于现有 Chat Completions 代码 - 逐步迁移调用点;按路由监控 token 用量
这样可以避免一次性大规模切换,并允许你并排比较成本。
时间线与建议
| 时间框架 | 行动 |
|---|---|
| 现在 | 审计工具调用模式;分类为程序化候选或仅直接调用 |
| 第 1–2 周 | 迁移到 Responses API 的直接工具调用(暂不启用程序化工具调用) |
| 第 2–3 周 | 为有限的工具密集型工作流启用程序化工具调用 |
| 第 3–4 周 | 基准测试 token 节省;根据质量需求调整模型层级(Sol → Terra → Luna) |
| 2027 Q1 | response_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 官方文档。