跳转到主要内容
当前 Chat ↔ Responses 函数工具转换没有复制 strict 字段;不要将原生声明、协议转换与上游默认值视为相同保证。工具参数仍需应用验证。详见 工具选择与并行控制。 本页在非流式工具调用基础上完成“接收参数分片 → 校验完整调用 → 执行本地乘法 → 回传工具结果 → 获取最终回答”。先确认模型和渠道支持对应协议的流式函数调用及严格参数 Schema。

两种组装方式

同一轮不同工具的分片可能交错,不能用一个全局参数字符串。逐片累加参数,不对半截 JSON 解析或执行。Chat 本例要求 ID/名称首次出现时完整,后续只能省略或重复同值,不拼接名称。SDK 负责 SSE / UTF-8 解码;本例不直接验证 SDK 已消费的 [DONE] 字符串。

运行准备

按 TypeScript或 Python安装已有 OpenAI SDK;无需新增依赖。预先设置网关令牌 API_KEY,然后设置含 /v1 的 Base URL:
在文档目录分别运行 node examples/stream-tools.mts 或 .venv/bin/python examples/stream-responses-tools.py。单独保存下方代码时可运行 node stream-tools.mts 或 python stream-responses-tools.py。例子请求计算 7 × 8;最终措辞由模型决定,不强制输出某个固定句子。

TypeScript:Chat Completions

stream-tools.mts

Python:Responses

stream-responses-tools.py

执行与失败策略

  • 两个脚本都先等完整一轮结束,再验证工具白名单、关联 ID 和全部参数;仅实现无外部副作用的 multiply。严格 Schema 不能替代本地校验。
  • 每轮最多 4 个调用、512 个事件;最多 3 次模型请求,第三次必须产生最终文本。参数长度上限为 16,384(TypeScript 按 UTF-16 code unit,Python 按字符);Chat 文本缓冲最多 100,000 code unit。这些是示例限制,不是服务端限额,也不限制 SDK 解码前单个事件的字节大小。
  • Responses 示例核对增量参数、done 参数和最终 output,重放完整输出项(含 reasoning / encrypted_content / phase)及结果。store: false 不依赖响应 ID 续接;目标渠道仍需支持对应字段保留。
  • 两个脚本缓冲最终文本,流结束并通过完成校验后才打印。HTTP 401/429、事件级错误、拒答、截断、缺少完成标记、未知工具、重复 ID、非法参数或上限触发时退出非零,不发送下一轮,也不自动重试。
这个执行屏障不等于业务事务。若换成支付、发送消息或数据库写入,需在应用侧设计授权、幂等键、执行日志和结果恢复;网络失败不能成为重新执行已完成工具的依据。当前示例只执行纯计算,无需外部凭据或服务。

本地验证与协议范围

npm run check:examples 用本地 HTTP fixture 执行这些文件,检查交错调用、UTF-8 跨网络块、完整历史与工具结果关联、第二轮请求,以及异常时没有后续请求。模拟响应不能证明真实模型一定选择工具或目标渠道保留所有事件;上线前须用获授权的测试模型验证。 Claude 原生与 Gemini 原生使用不同内容块、事件及结果结构;本页脚本不适用于这两种原生协议。 参考:OpenAI 函数调用、Responses 流式事件。 原生协议的可运行 SSE 与工具闭环见 Claude和 Gemini,包含完成校验与签名保留。 Read in English