OpenAI 兼容接口
这一页说明怎么接一个 OpenAI 兼容的 Chat Completions 接口:每个函数收到什么、要返回什么,以及这个协议要注意的地方。
结论
- 本适配器消费 Chat Completions 流,不接 OpenAI Responses API;最小配置只给 run。
- 停止、续接、插话、本文的历史和会话结构属于 SDK 接入扩展,要使用时由后端按后端约定另外提供。
- SDK 不把 chunk.id 当作轮次编号;需要远端停止、续接和历史时,后端应保存能力函数收到的 runId。
- 请求内容里没有模型名,由接入方在函数里补。
- 上下文由运行时当前持有的消息编码,不会自动获取尚未加载的历史;systemPrompt 可额外加入系统消息。
最简接入
只给 run,直连模型服务:
直连的写法会把密钥放进浏览器,任何打开页面的人都能拿到。只用于本地开发,上线前换成下面的写法。
走自己的代理
生产环境的请求发给自己的服务:
代理要做的事:
要支持历史、停止、续接时,这一层还要存东西,见后端不符合约定时 · 加自己的服务层。
全部能力
地址和字段名只是一种排法,以和后端团队商定的为准。
每个函数收到什么、要返回什么
表中“事件流”指未配置 subscribe 时的 Response 或异步事件序列。配置 subscribe 后,run / resume / regenerate / edit 只返回受理 Response,输出全部走订阅;其余能力仍返回 Response。
响应的格式和例子见后端约定 · OpenAI 兼容接口。
编号
业务状态与内容扩展
聊天里的业务字段通过 transformOutput 转成内容变更。独立业务状态由应用维护,再交给插槽组件;适配器不提供业务状态通知或累积状态 getter。
输入怎么放进请求
后端认别的字段时用 transformInput,返回完整请求体,覆盖默认编码后的请求内容:
输入里带了图片以外的附件时不发请求,这一轮以 UNSUPPORTED_ATTACHMENT 失败。
注意点
重新生成与编辑后重发
刷新后续接接不上工具循环
工具在浏览器里执行时,一轮里发给模型的上下文只在页面内存里。刷新后续接回来的流如果要求执行工具, 这一轮以 TOOL_LOOP_NOT_RESUMABLE 失败。未刷新且该轮内存状态仍在时可以继续,但后端仍须保证重放无重复、无缺失。
思考过程
流中途断开
连接状态与执行结果分开:断线或缺少终态只表示结果未知。给了 history 时刷新消息与轮次结论;有已收到的游标与 resume 时续流。恢复不重新发起用户问题;续接后进入工具循环时仍可能调用 run 请求下一模型步骤。停止后仍接收输出,远端受理取消不等于已经停止。详见断线恢复与停止确认。
错误
会话业务
会话目录、创建、删除、改名和 fork 由应用调用业务 API,取得真实 sessionId 后传给 useChatSessions。Adapter 不提供 sessions 配置。历史仍由 history 能力函数转换。详见会话契约。
模型选项与工具循环
- systemPrompt 放在每次编码的上下文最前面;tools 按名字提供 description、parameters 和
execute(args, { toolCallId })。工具顺序执行,结果回传模型;工具抛错或不存在时,工具失败信息也会回传,未必立即结束整轮。 - maxSteps 默认 8,限制一轮模型请求次数。transformInput 对每次模型请求都执行;重新生成或编辑后的后续工具步骤以 capability: run 调用。
- finish_reason 表示当前模型步骤有结论,tool_calls 仍会继续工具循环。直接 HTTP 流也识别 [DONE];只收到 finish_reason 时读取器仍等流结束,才能处理剩余用量信息。异步序列使用带 finish_reason 的 chunk 后结束序列,不传字符串 [DONE]。
- reasoning_content / reasoning 是本 SDK 兼容的增量字段,不承诺每个 Chat Completions 服务都返回思考内容。
- 直接流没有按 SSE id 去重,后端 resume 必须排除已交付的增量。多个 choices 的内容会依次写到同一回答,当前不提供多候选分栏,应让后端只返回一个 choice。
- 历史需要 run_id 才能归并思考、工具及同轮多条助手消息;无 run_id 的助手消息仅保留普通正文。run_id 的存在不等于有执行结论,还需 runs。