Skip to main content
当前 Chat ↔ Responses 函数工具转换没有复制 strict 字段;不要将原生声明、协议转换与上游默认值视为相同保证。工具参数仍需应用验证。详见 工具选择与并行控制。 工具调用由应用完成执行。模型返回函数名和参数,网关负责转发或协议转换;声明一个工具不会让网关替你执行本地函数。

完成一次调用循环

  1. 请求携带 tools,选择明确支持函数工具和所用参数的模型。
  2. 检查 assistant 返回的 tool_calls;没有工具调用时,按普通回复处理。
  3. 校验工具名称和参数,在应用中执行允许的函数。
  4. 将原 assistant 消息和每个调用对应的 role: tool 结果追加到历史,再请求模型。
  5. 模型可能继续请求工具,因此限制轮数、执行时间和总工作量。

可运行示例:本地乘法

按 TypeScript SDK准备环境,保存为 tool-calling.mts,运行 node tool-calling.mts。示例只开放纯计算函数 multiply,最多请求模型三次;使用 strict: true,需要模型和渠道支持严格工具参数。
本例允许一次回复中出现多个调用,并逐一回传 tool_call_id。模型也可能直接回答,结果文本由实际模型决定。未知函数、非法参数、非完成输出或达到轮数上限时,示例以失败退出。 function.arguments 是 JSON 字符串,不是可信代码。即使使用严格模式,执行前也要做业务校验。真实系统中的查数据、写数据等工具,还必须根据当前用户权限限制可操作范围;不能把模型生成的参数当作授权。不要用 eval、任意 shell 或动态函数名分发来实现此示例。

Chat Completions 与 Responses 的区别

Responses 的 call_id 不等同于输出项自身的 id。不要把上面的 Chat 消息原样发送到 Responses;还需保留该模型要求的其他输出项和上下文。 先验证非流式循环,再接入流式工具调用。流式 arguments 可能被拆分成多个片段,应按调用索引/ID 汇总,等参数完整后再解析和执行,不能每收到一段就调用一次函数。 Chat Completions 参考 · 流式输出

Python:Responses 函数调用循环

保存为 responses-tools.py,按 Python SDK配置后运行 python responses-tools.py。选择支持 Responses、严格函数参数及无状态历史重放的模型和渠道。请求还使用 store: false 与 include: ["reasoning.encrypted_content"],兼容前提见多轮对话。
示例最多发起三次模型请求,每轮最多接受四个函数调用;最后一轮仍要求工具时直接失败,不再执行。它保留完整输出项,通过 call_id 关联结果,拒绝重复调用 ID、未知工具、布尔值冒充数字、非有限数值和溢出结果。函数只做本地乘法,没有外部副作用;业务工具需额外设计授权、幂等和执行超时。每次模型请求的 60 秒超时不是整个流程的总时限。 参考:OpenAI 函数调用说明。

原生协议与流式工具

Claude Messages与 Gemini generateContent提供独立的原生协议接入示例。需要组装工具参数分片并执行函数时,见 Chat / Responses 流式工具调用。 原生协议的可运行 SSE 与工具闭环见 Claude和 Gemini,包含完成校验与签名保留。 Read in English