Create a Chat Completion
错误排查
调用过程中遇到错误?请参阅 API 错误码参考 获取完整的错误类型说明与排查方案。
POST https://openqiao.com/api/v1/chat/completionsCreate a Chat Completion 接口兼容 OpenAI 的 Create a Chat Completion 接口,用于对话型大语言模型推理调用。
下面列出了所有模型可能支持的参数,不同模型的支持参数有所不同,每个模型具体支持的参数请参见各模型详情页。
Request headers
Authorization string *
Bearer Token 鉴权
Content-Type string *
请求内容类型,默认值为 application/json
Request
messages array *
以对话的消息列表形式输入给大模型的提示词。根据模型的能力不同,支持的消息类型也会有所不同,比如 文本、图片、音频、视频。具体支持的参数,请查看各模型生产商的文档。
messages 里的每个元素表示一条对话消息,每条消息由 role 和 content 组成,详情如下:
Developer message object
开发者提供的指令,无论用户发送什么消息,模型都应遵循。在 o1 及更新模型中,developer 消息取代了之前的 system 消息。
content
string or array*Developer message 的内容。
Text content
stringDeveloper message 的内容。
Array of content parts
array具有定义类型的内容部分数组。对于 Developer message,只支持类型
text。text
string*文本内容。
type
string*内容部分的类型。
role
string*消息作者的角色,在此情况下为 developer。
name
string可选参与者可选名称。为模型提供区分相同角色参与者的信息。
System message object
开发者提供的指令,无论用户发送什么消息,模型都应遵循。在 o1 及更新模型中,应使用 developer 消息来实现此目的。
content
string or array*System message 的内容。
Text content
stringSystem message 的内容。
Array of content parts
array具有定义类型的内容部分数组。对于 System message,只支持类型
text。text
string*文本内容。
type
string*内容部分的类型。
role
string*消息作者的角色,在此情况下为 system
name
string可选参与者可选名称。为模型提供区分相同角色参与者的信息。
User message object
终端用户发送给模型的消息,大多数对话场景中你只需要使用此角色。
content
string or array*User message 的内容。
Text content
string*纯文本内容,最常见的用法。
Array of content parts
array*多模态内容片段数组。根据模型能力,可以包含文本、图片、音频等类型的内容。常见类型包括:
文本片段
- type
string*,固定为text - text
string*,文本内容
- type
图片片段(仅多模态模型支持)
- type
string*,为image_url - image_url
object*- url
string*,图片 URL 或 base64 Data URL - detail
string可选,典型取值:low/high/auto,用于控制图像解析精度
- url
- type
音频片段(仅音频输入模型支持)
- type
string*,为input_audio - input_audio
object*- data
string*,音频文件 base64 内容 - format
string*,如wav、mp3
- data
- type
文件片段(File content part,仅支持文件输入的模型)
用于将整份文件作为上下文输入给模型(例如 PDF、Office 文档等)。- type
string*,固定为file - file
object*- file_id
string可选- 通过文件上传接口获取的文件 ID,推荐优先使用此方式引用文件
- file_data
string可选- base64 编码的文件数据,用于直接在请求体中传文件内容
- filename
string可选- 文件名,用于提示模型文件类型或在控制台中展示
- file_id
- type
role
string*消息作者角色,在此情况下为
user。name
string可选参与者可选名称。为模型提供区分相同角色参与者的信息。
Assistant message object
模型在对话中发送给用户的回复消息。你可以在新的请求中把这些历史助手消息一并传回,以便模型继续基于完整上下文进行推理。
content
string or array可选Assistant message 的内容。当未设置
tool_calls或(已废弃的)function_call时为必填。Text content
string助手消息的纯文本内容。
Array of content parts
array具有定义类型的内容部分数组。可以包含一个或多个类型为
text的内容部分,或者恰好一个类型为refusal的内容部分。Text content part
object(文本内容片段)type
string*
内容片段的类型。text
string*
文本内容。
Refusal content part
object(拒答内容片段)type
string*
内容片段的类型。refusal
string*
模型生成的拒答信息。
refusal
string or null可选助手的拒答消息内容。
role
string*消息作者角色,在此情况下为
assistant。name
string可选参与者可选名称。为模型提供区分相同角色参与者的信息。
audio
object or null可选关于之前某次模型音频回复的数据,可在后续对话中引用该音频回复。
id
string*之前音频回复的唯一标识符。
tool_calls
array可选- 函数工具调用
objectid
string*工具调用 ID,用于与后续的 Tool message 中的
tool_call_id对应。type
string*工具类型,目前仅支持
function。function
object*name
string*要调用的函数名。
arguments
string*以 JSON 字符串形式表示的函数调用参数(由模型生成)。
注意:模型不保证一定生成完全合法的 JSON,可能会出现未在函数 Schema 中定义的参数,调用前应在业务侧进行校验。
自定义工具调用
objectid
string*工具调用 ID,用于与后续的 Tool message 中的
tool_call_id对应。type
string*工具类型,始终为
custom。custom
object*name
string*要调用的函数名。
input
string*由模型生成的自定义工具调用的输入。
- 函数工具调用
function_call
object or null(已废弃) 可选已被
tool_calls替代,仅为兼容旧版格式保留。表示模型建议调用的函数名称和参数。name
string*
要调用的函数名。arguments
string*
以 JSON 字符串形式表示的函数调用参数(由模型生成),同样需要在业务侧校验后再实际
reasoning
string可选助手消息的推理过程文本内容。当开启 reasoning 功能时,模型返回的推理过程会包含在此字段中。在多轮对话场景下,可以将此字段传回以保持上下文连贯性。
reasoning_details
array可选(多轮工具调用场景必需)推理过程的详细信息数组。在开启 reasoning 的多轮工具调用场景中,必须将此字段完整传回,特别是其中包含的
signature字段,否则后续对话将无法正常进行。每个元素包含以下字段:
type
string*推理内容类型,如
reasoning.text。text
string*推理过程的文本内容。
signature
string*推理过程的签名凭证。这是多轮对话中保持推理上下文的关键字段,必须原样传回。 该签名由模型生成,用于验证推理内容的完整性和连续性。
format
string可选签名格式标识,如
anthropic-claude-v1。index
number可选推理片段的索引位置。
Tool message object
用于把外部工具(函数)调用的执行结果传回给模型的消息。
content
string or array*工具执行结果的内容,一般为文本或结构化数据(序列化为字符串)。
Text content
stringTool message 的内容。
Array of content parts
array具有定义类型的内容部分数组。对于 Tool message,只支持类型
text。text
string*文本内容。
type
string*内容部分的类型。
role
string*消息作者角色,在此情况下为
tool。tool_call_id
string*对应 assistant 消息中某个
tool_calls[i].id,用于将本次工具结果与那次调用对应起来。name
string可选工具名称(通常与声明在
tools中的 function 名称一致)。
Function message object 官方已弃用不支持
model string *
此次推理调用的模型 ID,格式为 <供应商>/<模型名称>,如 openai/gpt-5,可以从各模型的详情页获得。
max_completion_tokens integer or null 可选
限制模型生成内容的长度,包括思考过程。如果不传,会采用模型的默认限制。各模型的最大生成内容长度可以详情页获得。
temperature number 可选
- 默认:
1 - openqiao 没有限制范围,建议在
[0, 2]范围内取值。
采样温度,控制随机性:值越高越随机,值越低越稳定。一般与 top_p 二选一调节。
top_p number 可选
- 默认:
1
Nucleus sampling(核采样)参数:只从累积概率质量前 top_p 的 token 中采样,如 top_p = 0.1 表示只考虑概率质量前 10% 的 token。
n integer or null 可选
返回候选回答数量,目前仅支持 n=1
frequency_penalty number or null 可选
- 默认值:
0 - 取值范围:
-2.0~2.0
对已出现频率较高的 token 施加惩罚。值越大,模型越不愿重复相同内容,可用于减少机械复读。
presence_penalty number or null 可选
- 默认:
0 - 取值范围:
-2.0~2.0
对是否已出现过的 token 施加惩罚。值越大,模型越倾向于引入新话题、减少重复讨论相同内容。
stop string | array | null 可选
- 默认:
null - 最多可提供 4 个 stop 序列
当生成内容命中任一 stop 序列时,模型会停止继续生成,返回结果中不包含该 stop 序列。最新部分推理模型(如 o3、o4-mini)不支持该参数。
logit_bias object 可选
- 默认:
null
用于对指定 token 的采样概率进行微调。键为 tokenizer 中的 token ID(整数),值为 -100 ~ 100 之间的偏置
- 正值:提升该 token 被选中的概率
- 负值:降低该 token 被选中的概率
- 极值(如 ±100):接近于强制禁止或强制选用该 token
logprobs boolean or null 可选
- 默认:
false
是否在返回结果中包含输出 token 的对数概率信息。
top_logprobs integer 可选
指定每个位置返回的最高概率 token 个数(0~20),每个 token 带对应的 logprob。
tools array 可选
用于声明本次对话中模型可以调用的工具列表。每个元素可以是自定义工具或 function 工具(JSON Schema 定义的函数)。
tool_choice string or object 可选
控制模型对工具的使用策略:(platform.openai.com)
"none":不调用任何工具"auto":由模型自行决定是否以及调用哪些工具"required":本轮必须调用至少一个工具- 指定单个工具:
{"type": "function", "function": {"name": "my_function"}}
parallel_tool_calls boolean 可选
- 默认:
true
是否允许模型在一次回复中并行调用多个工具(函数)。
reasoning_effort string 可选(推理模型)
控制推理模型在思考上的投入程度:none、minimal、low、medium、high、xhigh 等。不同模型的默认值与支持范围有所不同。
verbosity string 可选
- 默认:
"medium"
约束模型输出的详略程度:low(简洁)、medium(适中)、high(更详细)。
web_search_options object 可选
配置网页搜索工具的行为,用于让模型在生成回答前主动检索互联网最新信息。
metadata object 可选
允许附带最多 16 个键值对,作为结构化业务元信息保存,便于在日志、检索或管理界面中查询。
stream boolean or null 可选
- 默认:
false
是否启用流式输出(Server-Sent Events)。为 true 时,结果以事件流形式分片返回。
stream_options object 可选
仅当 stream: true 时有效,用于配置流式行为,例如是否在流结束时附带 usage 信息等。
provider object 可选
用于配置本次请求在多个模型提供商(如 OpenAI、Anthropic、Google 等)之间的路由与故障转移策略。 如果不配置,则使用项目或模型的默认路由策略。
routing object *
路由策略配置,决定请求在多个提供商之间如何选择与分发。
type string *
路由类型,支持以下取值:
priority按优先级顺序选择提供商:优先尝试第一个,失败后再尝试下一个(可配合 fallback 使用)。round_robin轮询分发:在多个提供商之间平均分配请求流量。least_latency最低延迟优先:根据历史/实时统计选择当前响应最快的提供商。
primary_factor string 可选
当存在多个可用提供商时的主要考量因素。例如:
cost优先选择成本更低的提供商speed优先选择响应更快的提供商quality优先选择质量更高(例如更强模型/更稳定)的提供商
实际行为会与 type 联合作用:例如 type = "priority" 时,primary_factor 主要影响优先级排序逻辑
providers array *
可参与路由的模型提供商列表。例如:["openai", "anthropic", "google"]
fallback string 可选
故障转移(Failover)策略。当当前选中的提供商出现错误(如超时、额度不足、服务不可用)时,如何进行自动切换:
"true":启用自动故障转移:当当前提供商不可用时,根据路由策略自动尝试列表中其他可用提供商。
"false":禁用故障转移:如果当前提供商调用失败,则直接返回错误,不再尝试其它提供商。
"<provider_name>":显式指定固定的备用提供商,例如 "anthropic":
优先使用主路由选出的提供商 若失败,则转而使用指定的备用提供商 若主 + 备用都失败,则返回错误
model_routing_config object 可选
用于配置当前请求在同一提供商内部不同模型之间的选择与路由策略(如在 gpt-4o、gpt-4-turbo、claude-3-5-sonnet 之间如何选用)。
如果不配置,则使用项目或 SDK 的默认模型选择策略(例如默认模型、默认任务类型映射等)。
available_models array *
可参与路由或备选的模型名称列表。
preference string 可选
首选模型名称。
task_info object 可选
任务元信息,用于根据任务类型和复杂度决定具体模型或参数。
内部字段如下:
task_type string *
任务类型,用于表达当前请求的用途,以便于路由或自动选择参数。
- 支持值示例:
"chat"—— 对话类任务(多轮对话、助手问答)"completion"—— 通用文本生成/补全"embedding"—— 向量化/语义嵌入
- 用途:
- 可据此为不同任务类型设置不同的默认模型或限额策略
- 也可与
complexity联动,决定是否启用更强模型
complexity string 可选
任务复杂度,用于刻画请求的难度或重要程度。
- 支持值:
"low"—— 简单任务(短回答、简单改写等)"medium"—— 中等复杂度(一般问答、基础代码、常规分析)"high"—— 高复杂度(长文档分析、复杂编程、大规模推理)
- 用途:
- 可以根据复杂度选择不同档位的模型(如低复杂度选便宜模型,高复杂度选能力更强的模型)
- 也可用于控制超时时间、重试策略等
additional_properties object 可选
任务相关的扩展字段,键值对形式,自由扩展。
additional_properties object 可选
模型路由配置本身的扩展字段,用于在标准结构之外,附加额外的控制信息。
reasoning object 可选
用于配置推理过程(chain-of-thought / reasoning trace)相关行为,包括是否启用、推理深度与长度控制,以及是否对外暴露推理内容。
如果不配置,则由系统或模型使用默认的推理策略。
enabled boolean *
是否启用显式推理过程。
true:模型在内部使用并(在允许的情况下)输出更详细的推理步骤false:模型仅给出结论性回答,不显式展开推理(或尽量少展开)
effort string 可选
推理投入程度,用于控制模型在思考深度 / 推理精细程度与成本 / 时延之间的平衡。
- 支持值:
"low"—— 轻量推理:快速给出答案,较少细节"medium"—— 中等推理:在多数任务下的折中选择"high"—— 深度推理:更详细的分析过程,更高的 token 消耗与时延
- 典型用法:
- 对时延敏感的在线服务:倾向
"low"或"medium" - 对正确性要求极高的任务:倾向
"high"
- 对时延敏感的在线服务:倾向
max_tokens number 可选
推理过程(而非最终回答)的最大 token 数上限。
exclude boolean 可选
是否从对用户返回的内容中排除推理过程。
false:- 推理内容可以与最终答案一并返回(例如在调试或工具开发阶段)
true:- 推理过程仅在系统内部使用,不向用户暴露(典型的生产环境设置)
- 用途:
- 满足安全与合规需求(不暴露 chain-of-thought)
- 在开发 / 调试阶段通过设置为
false观察模型思考过程,便于迭代提示词与策略配置
usage object 可选
使用统计信息
include boolean *
是否在响应中包含使用统计信息
response_format object 可选
一个指定模型必须输出格式的对象。
设置为 { "type": "json_schema", "json_schema": {...} } 启用结构化输出,确保模型将匹配您提供的 JSON 架构。
设置为 { "type": "json_object" } 启用旧版 JSON 模式,确保模型生成的消息是有效的 JSON。使用 json_schema 对于支持它的模型更为优选。
Text object
- type
string* 正在定义的响应格式的类型。始终为 text
JSON schema object
- json_schema
object* 定义响应格式的 JSON schema。- name
string* 响应格式的名称。必须是 a-z、A-Z、0-9,或包含下划线和破折号,最大长度为 64。 - schema
object可选 响应格式的模式,描述为一个 JSON Schema 对象。 - strict
boolean可选 是否严格遵循 JSON schema。 - description
string可选 对响应格式用途的描述,模型根据该描述来确定如何以该格式进行响应。
- name
- type
string* 正在定义的响应格式的类型。始终为 json_schema
JSON object object
- type
string* 正在定义的响应格式的类型。始终为 json_object
不支持字段
| 字段名 | 类型 | 是否支持 | 说明 |
|---|---|---|---|
| audio | object/null | ❌ 不支持 | 音频输出参数 |
| modalities | array | ❌ 不支持 | 输出模态类型 |
| functions | array | ❌ 不支持 | 已废弃,不接收此参数 |
| function_call | string/object | ❌ 不支持 | 已废弃,不接收此参数 |
| prompt_cache_key | string | ❌ 不支持 | 提示词缓存 key |
| prompt_cache_retention | string | ❌ 不支持 | 缓存保留策略 |
| safety_identifier | string | ❌ 不支持 | 安全标识 |
| store | bool/null | ❌ 不支持 | 存储本次对话 |
| service_tier | string | ❌ 不支持 | 服务等级 |
| prediction | object | ❌ 不支持 | 预测输出配置 |
| seed | int/null | ❌ 不支持 | 为采样过程设置随机种子,已标记为废弃。 |
| user | string | ❌ 不支持 | 旧版的用户标识字段,现已由 safety_identifier 和 prompt_cache_key 接替其主要作用。 |
| max_tokens | int/null | ❌ 不支持 | 已废弃,用 max_completion_tokens 替代 |
Response
非流式:返回「完整的 chat completion object」
当 stream: false(或未传)时,接口返回一个完整的 chat.completion 对象。字段说明按上文表格顺序展开。
顶层字段:choices
choices array
聊天补全选项的列表。与请求中的 n 一一对应;当前仅支持 n = 1,因此通常只包含一个元素。
choices[i] 对象
finish_reason string
模型停止生成 token 的原因。常见取值包括:
stop:达到自然停止点或命中 stop 序列length:达到请求中指定的最大 token 数content_filter:内容被内容过滤器拦截而省略tool_calls:模型调用了工具(tool_calls)function_call:模型调用了函数(旧版,已弃用)
index integer
该选项在 choices 列表中的索引,从 0 开始。
logprobs object
该选项的对数概率信息,用于解析每个输出 token 的概率分布。仅在请求中设置了 logprobs 相关参数时存在。
choices[i].logprobs.content
content array
包含带有对数概率信息的「消息内容 token」列表。每个元素描述一个 token 及其候选 token:
bytes
array
一个整数列表,表示该 token 的 UTF‑8 字节表示。在某些语言或表情符号中,一个字符可能由多个 token 组成,通过合并这些字节可以还原正确文本;如果该 token 没有字节表示,则为null。logprob
number
该 token 的对数概率。如果该 token 不在前 20 个最可能的 token 中,则通常使用-9999.0表示「极不可能」。token
string
当前输出 token 的文本表示。top_logprobs
array
在该位置最可能的一组候选 token 及其对数概率列表。极少数情况下,实际返回数量可能少于请求的数量。- bytes
array
候选 token 的 UTF‑8 字节表示列表;若无字节表示则为null。 - logprob
number
候选 token 的对数概率。 - token
string
某个候选 token 的文本。
- bytes
choices[i].logprobs.refusal
refusal array
包含带有对数概率信息的「拒绝内容 token」列表。当模型输出拒绝信息时,用于解析拒绝文本对应的 token 概率。
- bytes
array
该拒绝 token 的 UTF‑8 字节表示;如果没有则为null。 - logprob
number
该拒绝 token 的对数概率。不在前 20 名时通常为-9999.0。 - token
string
拒绝内容中某个 token 的文本。 - top_logprobs
array
在该位置最可能的拒绝 token 候选列表。- bytes
array
候选拒绝 token 的 UTF‑8 字节表示。 - logprob
number
候选拒绝 token 的对数概率。 - token
string
拒绝内容中某个候选 token 的文本。
- bytes
choices[i].message
message object
由模型生成的完整聊天补全消息。
choices[i].message 字段
reasoning string (OpenQiao 拓展字段)
推理过程的文本内容,用于展示模型对答案的思考过程或中间分析。实际是否返回取决于模型和请求中的推理配置。
reasoning_details string(OpenQiao 拓展字段)
推理内容的文本主体,通常比 reasoning 更完整或更详细,可作为推理链(chain‑of‑thought)的主要承载字段。
content string
消息的正文内容,一般为模型给用户的自然语言回复文本。某些多模态模型也可能返回结构化内容,但整体遵循 OpenAI chat 格式。
refusal string or null
如果本轮模型拒绝执行用户请求,这里包含模型生成的拒绝消息文本;否则为 null。
role string
消息作者角色。对于模型回复消息,为 "assistant"。
annotations array
消息的注释列表。在使用 Web 搜索等工具时,用于携带 URL 引用等信息。
- type
string
URL 引用的类型,当前固定为url_citation。 - url_citation
object
使用网页搜索时的 URL 引用详情。- end_index
integer
在当前消息content中,该 URL 引用最后一个字符的索引。 - start_index
integer
在当前消息content中,该 URL 引用第一个字符的索引。 - title
string
网页资源标题。 - url
string
网页资源的 URL。
- end_index
audio object
当请求了音频输出模态时,该对象包含模型音频响应的数据。
- data
string
由模型生成的 Base64 编码音频字节,音频格式由请求中指定。 - expires_at
integer
该音频响应在服务器端不再可用于后续多轮对话的 Unix 时间戳(秒)。 - id
string
此音频响应的唯一标识符。 - transcript
string
对应音频内容的文字记录(转写文本)。
function_call object
已弃用的函数调用字段,已由 tool_calls 取代,仅为兼容旧版调用格式而保留。表示模型建议调用的函数名称与参数。
- arguments
string
以 JSON 字符串形式表示的函数参数。需要注意模型不保证严格生成合法 JSON,也可能包含模式中未定义的字段;业务方需要在调用前进行解析与校验。 - name
string
要调用的函数名称。
tool_calls array
新版工具调用列表。每个元素描述一次工具调用,可以是「函数工具调用」或「自定义工具调用」。支持模型在一次回复中并行调用多个工具。
- id
string
工具调用的唯一 ID,用于与后续tool消息中的tool_call_id对应。 - type
string
工具类型。目前标准为function,OpenQiao 可能在扩展中支持custom等其他类型。 - function
object
当type = "function"时,表示模型调用的函数。- arguments
string
JSON 字符串格式的函数调用参数。模型可能不会始终生成合法 JSON,也可能产生模式中未定义的字段;业务方应在实际调用前进行校验。 - name
string
要调用的函数名称。
- arguments
顶层字段:元数据与用量统计
created integer
聊天补全创建时的 Unix 时间戳(秒)。
id string
本次聊天补全的唯一标识符。
model string
用于完成此次聊天补全的模型标识,例如 openai/gpt-5。
object string
对象类型,非流式响应固定为 chat.completion。
service_tier string
指定用于处理请求的服务类型或服务等级。OpenQiao 自身不限定取值,如果上游模型返回该字段则会透传。
system_fingerprint string
表示本次请求使用的后端配置指纹信息,用于标识底层服务版本或集群。若上游返回则透传。
usage object
本次请求的使用统计信息,包括 prompt 和 completion 的 token 数。
completion_tokens
integer
生成的补全部分中使用的 token 数量。prompt_tokens
integer
输入提示(messages 等)中使用的 token 数量。total_tokens
integer
本次请求中总共使用的 token 数量(prompt_tokens + completion_tokens)。completion_tokens_details
object
对补全 token 的进一步细分。- accepted_prediction_tokens
integer
在使用 Predicted Outputs 时,预测中实际出现在 completion 中的 token 数量。与预测输出能力相关,当前模型一般不会使用该字段。 - audio_tokens
integer
模型生成的音频输出所占用的 token 数。 - reasoning_tokens
integer
模型为推理过程生成的 token 数(即使不全部展示给用户,也计入消耗)。 - rejected_prediction_tokens
integer
使用 Predicted Outputs 时,预测中未出现在 completion 中的 token 数量;这些 token 仍会计入计费和上下文窗口限制。目前与预测输出能力相关,一般不会使用。
- accepted_prediction_tokens
prompt_tokens_details
object
对提示部分 token 的细分说明。- audio_tokens
integer
提示中音频输入所占用的 token 数。 - cached_tokens
integer
提示中通过缓存(Prompt Caching)命中的 token 数。
- audio_tokens
流式:返回「多次 chat completion chunk object」
当 stream: true 时,接口以 SSE(Server‑Sent Events)形式多次返回 chat.completion.chunk 对象,客户端需按顺序消费与拼接。这部分字段说明同样按表格顺序展开。
顶层字段:choices(流式分块)
choices array
聊天完成选项的列表。如果 n > 1,可以包含多个元素。当设置了 stream_options: {"include_usage": true} 时,最后一个数据块中 choices 可能为空数组,此时只携带 usage 信息。
choices[i](Chunk)对象
delta object
由流式模型响应生成的增量对话内容,即相较于之前分块「新增」的部分。
reasoning
string(OpenQiao 拓展字段)
推理过程内容的增量文本,用于逐块输出推理信息。reasoning_content
string(OpenQiao 拓展字段)
推理内容主体的增量片段,通常与reasoning搭配,用于拼接完整推理文本。content
string
本分块的消息正文内容增量。客户端应将各分块的content依次拼接成完整回复。function_call
object(已弃用)
旧版函数调用增量信息,已被tool_calls取代,仍支持解析。- arguments
string
本分块新增的函数参数 JSON 片段,需与前后分块的arguments拼接后再解析。 - name
string
要调用的函数名称,一般在该调用的首块中出现。
- arguments
refusal
string
本分块新增的拒绝消息片段。role
string
本条消息作者的角色,通常在第一块中为"assistant"。tool_calls
array
工具调用的增量信息列表。对于每个增量工具调用元素:
index
integer
该工具调用在tool_calls数组中的序号。function
object
函数工具调用的增量信息。- arguments
string
函数调用参数 JSON 字符串的增量片段,需跨分块拼接再解析。 - name
string
要调用的函数名,通常在工具调用开始时给出。
- arguments
id
string
工具调用的 ID,通常在首次出现时给出,用于后续tool消息关联。type
string
工具的类型,当前仅支持function。
finish_reason string or null
模型在当前分块停止生成的原因:
stop:自然结束或命中 stop 序列length:达到最大生成 token 上限content_filter:内容被过滤tool_calls:触发工具调用function_call:触发旧版函数调用null:尚未结束生成,后续仍会有分块
index integer
该选项在 choices 数组中的序号。
logprobs object
该选项在当前分块的对数概率信息结构,与非流式 logprobs 相同,但仅针对「新增」 token。
choices[i].logprobs.content(流式)
content array
包含当前分块中新生成的「消息内容 token」列表。
- bytes
array
当前 token 的 UTF‑8 字节表示。 - logprob
number
当前 token 的对数概率;若不在前 20 个最可能 token 内,则为-9999.0。 - token
string
当前输出 token 的文本表示。 - top_logprobs
array
本位置最可能的候选 token 列表。- bytes
array
候选 token 的 UTF‑8 字节表示。 - logprob
number
候选 token 的对数概率。 - token
string
某个候选 token 的文本。
- bytes
choices[i].logprobs.refusal(流式)
refusal array
包含当前分块中新生成的「拒绝内容 token」列表。
- bytes
array
拒绝 token 的 UTF‑8 字节表示。 - logprob
number
拒绝 token 的对数概率,低概率时为-9999.0。 - token
string
拒绝内容中某个 token 的文本。 - top_logprobs
array
该位置上最可能的拒绝 token 候选列表。- bytes
array
候选拒绝 token 的 UTF‑8 字节表示。 - logprob
number
候选拒绝 token 的对数概率。 - token
string
候选拒绝 token 的文本。
- bytes
流式顶层其他字段
created integer
聊天补全创建时的 Unix 时间戳(秒)。同一流中的所有分块该值相同。
id string
聊天补全的唯一标识符。同一流中的每个分块都共享同一个 id。
model string
用于本次聊天补全的模型名称。
object string
对象类型,流式响应固定为 chat.completion.chunk。
service_tier string
指定处理请求时所使用的服务类型或服务等级。若上游模型返回该字段,则透传。
system_fingerprint string
此指纹表示本次请求使用的后端配置。虽然在部分上游已标记为 Deprecated,但 OpenQiao 仍会保留并透传该字段。
usage object(仅最后一块包含)
当在请求中设置 stream_options: {"include_usage": true} 时,最后一个分块会包含 usage 对象;其结构与非流式响应一致。
completion_tokens
integer
生成的补全部分 token 数量。prompt_tokens
integer
提示部分 token 数量。total_tokens
integer
本次请求中总共使用的 token 数量。completion_tokens_details
object
补全 token 细分统计。- accepted_prediction_tokens
integer
预测输出中被采纳的 token 数。 - audio_tokens
integer
模型生成音频相关的 token 数。 - reasoning_tokens
integer
模型用于推理过程的 token 数。 - rejected_prediction_tokens
integer
预测输出中未被实际采用但仍计入消耗的 token 数。
- accepted_prediction_tokens
prompt_tokens_details
object
提示 token 细分统计。- audio_tokens
integer
提示中音频输入 token 数。 - cached_tokens
integer
提示中通过缓存命中的 token 数。
- audio_tokens
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "openai/gpt-5",
messages: [{ role: "user", content: "What is the meaning of life?" }],
});
console.log(completion.choices[0].message.content);from openai import OpenAI
client = OpenAI(
base_url="https://openqiao.com/api/v1",
api_key="<your_OPENQIAO_API_KEY>",
)
completion = client.chat.completions.create(
model="openai/gpt-5",
messages=[
{"role": "user", "content": "What is the meaning of life?"}
],
)
print(completion.choices[0].message.content)curl https://openqiao.com/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENQIAO_API_KEY" \
-d '{
"model": "openai/gpt-5",
"messages": [
{
"role": "user",
"content": "What is the meaning of life?"
}
]
}'import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "openai/gpt-5",
messages: [
{
role: "user",
content: [
{ type: "text", text: "Describe this image." },
{
type: "image_url",
image_url: { url: "https://storage.googleapis.com/generativeai-downloads/images/scones.jpg" },
},
],
},
],
});
console.log(completion.choices[0].message.content);import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "openai/gpt-5",
web_search_options: {},
messages: [
{ role: "user", content: "What was a positive news story from today?" },
],
});
console.log(completion.choices[0].message.content);import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const stream = await client.chat.completions.create({
model: "openai/gpt-5",
stream: true,
messages: [{ role: "user", content: "Write a short product tagline." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "openai/gpt-5",
tools: [
{
type: "function",
function: {
name: "get_weather",
description: "Get the current weather for a city.",
parameters: {
type: "object",
properties: {
location: { type: "string" },
},
required: ["location"],
additionalProperties: false,
},
},
},
],
messages: [{ role: "user", content: "What is the weather in Shanghai?" }],
});
console.log(completion.choices[0].message.tool_calls);import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://openqiao.com/api/v1",
apiKey: process.env.OPENQIAO_API_KEY,
});
const completion = await client.chat.completions.create({
model: "openai/gpt-5",
reasoning_effort: "medium",
messages: [
{
role: "user",
content: "Compare two database indexing strategies for a write-heavy app.",
},
],
});
console.log(completion.choices[0].message.content);{
"id": "dc41ec9a378d43a497ca2daff171ceb0",
"model": "openai/gpt-5",
"choices": [
{
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": "There isn’t a single, objective answer. Different traditions offer different meanings, and most people end up constructing their own.\n\n- Religious: To know or serve God, live virtuously, and love others.\n- Existential/humanist: Life has no built‑in meaning; you create it through choices, authenticity, and responsibility.\n- Scientific-naturalist: There’s no cosmic purpose; meaning comes from conscious experience—relationships, curiosity, creativity, and contribution.\n- Eudaimonic (Aristotle): Flourish by developing virtues, using your strengths, and living in accord with reason and values.\n- Eastern philosophies: Reduce suffering, cultivate compassion, and see through the illusion of a separate self.\n\nA practical way to find meaning:\n- Clarify your values (what you’d stand for even if it’s hard).\n- Invest in relationships and service.\n- Learn and create; pursue mastery in something that matters to you.\n- Contribute beyond yourself—help, build, protect, or heal.\n- Savor and be present; cultivate gratitude and awe.\n\nA simple summary many find helpful: Love well, learn continuously, and leave the world a little better than you found it.",
"refusal": null,
"annotations": [],
"reasoning": "**Considering the meaning of life**\n\nI need to answer concisely but thoughtfully. The question is philosophical, so I should present various perspectives: religious, existential, scientific, and personal. It might be useful to suggest a practical framework for finding meaning, focusing on relationships, personal growth, and contributions. While a general response is appropriate, I should clarify that there’s no single objective answer. I can mention common themes like connection, creativity, and love, and propose questions for reflection. A nice one-liner could be about creating meaning through conscious engagement.",
"reasoning_details": [
{
"index": "0",
"format": "openai-responses-v1",
"type": "reasoning.summary",
"summary": "**Considering the meaning of life**\n\nI need to answer concisely but thoughtfully. The question is philosophical, so I should present various perspectives: religious, existential, scientific, and personal. It might be useful to suggest a practical framework for finding meaning, focusing on relationships, personal growth, and contributions. While a general response is appropriate, I should clarify that there’s no single objective answer. I can mention common themes like connection, creativity, and love, and propose questions for reflection. A nice one-liner could be about creating meaning through conscious engagement."
},
{
"id": "rs_0639a0762f01111400696766d7af48819388646c9544e1107c",
"index": "0",
"format": "openai-responses-v1",
"type": "reasoning.encrypted",
"data": "gAAAAABpZ2br9iURFxvdEjmaRGKcjutfnC2dVpSTQxh8Vjel9pkdkU6b6sX_JjARvh4aU-hI9c4ZfGjWAze2FfWqfvNyGN55ljlnX9wHRTK6OR9VWyezo7PoXDS4uJPV62OjA5DvDrj6KZeMcxUnEo54XORRqgGbqCR6R0Pv1q2YoFfJZh0gVBdakKDTlm4JEb6o5hIEg9b1jh1mNxu-SyCxuIecmE_ZsDYphWyLu3S1jPM-ieNTJ97GLfiefbqk-SostjrIKpiVtrGMU0cHS7FYk01X260lXAAf54jqdMzF8Haw08m0zs0vTABPfP3WK5RCOlHd_EuEsabuZoZXwqyWkAA9G3l0i-0xlXnPNZlXwcUlfqZto6aszy-XPPUDXfpIZqEEpcF2ikXSdTSTOMxAtSb2Q1lUnI4rN45-dOonjJ_VltIHXJCf9c-wbF3d-9ymPDwhib4VnlNTbH03I6SK-_PebVkTF1efcaL5MonE0_lypsNn4ZF-T3wpp1jGTke5mMv8qjChJYUaO5C7eGugmM6pvxnAFBr375Wic-rh1wlBrPEtmXPLVO-TqCGNddB-Vrg0HVblXOphr1gPXcuE8VpGw40PtiT9YqYDaAlZRLZpxJfB9hAxtKDfgqh5f5TqfrXjuUJSeT6sQPgCv4vHulpwSWKNOh5PpCvW5FS1HHvPXW1d5WERDl_dngxRWU4NuIi0MlSLV5kd_oTOOM4AVRSYK0TA4o8YpAZVlVYGVp9b5Vs1rhVl56ga_iOBfiRw16Tb7nO7V-vcwrBQLOYiFixuE0Em5UAEaLp_wxP12QqoRSRezFTHkNT9ietR03Z38H8SzwbPoPB2XiI9pe5KxJGQ2cccdS9s5o4_Btj8kp9q9n2rqFg0Cuv-WChnzhgX8u5zrk1cAqCNhr5uul-RdJLWCz9IH35oOe14umu8ymaN4D1x1VTY5uPef7OrjYyYXqTQa-CMUFqw3qShwBftlZDfF6rLMgKUiEBP93ERFNBIMoBIn-BVEdi5yjImIUkH_q1iVyhtQTEHUh7TMF7_i2vWZUB-NXIPs9Zqt76pH-tKukLWvDrHqeajwvtt9d6X4xks9oGzepnWmL2nyFggLD24R8-59Sc5dco-Ssr91TfUpm8VrJXqUTtcMcWuCoY0i93MT8ty5Bc0hYQ23-vzZdyS0Rm6dO26HDXrvZ9TGL4uW_QXNBX6q51qlQ_xr4m51JU8Wul_You9-M03dO99LkdljtF5nKsnZNdiWGRnF9oFmokdHFAqfBM6KjLZUUkDsVG6hLElejg89t0kymwUJfao21MMCb56E2G6QtUOx4vf8F3myDFhOX3zrAAhoJ-Bw7rK3s2esbnDBn96ZzKoyGOLHm54kQM2_Rs9qQdjflxZ4WKhXoEJwz9H1uHILBMVbrl1aTu_ReYb8xJPVR5oB7Ky_1GPoeG82QntVExCJDZpb4fAqpzFzuV6B7GsVF6Z0cyeyPi3TGEjxSLxYqGWVMBSEsokx8USEET0T7ytiHpVQ4cOr2eimLzDp-hJbZKGEufU6Tnh9RZA2-0Q87X57RaoAydY6brj9S3tTAy2Iz8m_-qEGLXjUr6ffDg3lNMGQhFvN-YAWbdmidbZfCVQR1Oc6A6-ayowaHpyUeff7PxQFXaQ7k3P0W7p1N3VLTjC3lNk2gSPyq_6MvLmxXOlGLj_50Q1OLAFn0bK7knhFf8t7gS7MjOXMQl9PiSbtQL9URHrPeMYKjpQGa84rOnZzC8G9RXvzKatVHB0NpKO02DeTY4hzsMw-Wj73-ZpBSSiyOlTpuVVNxma83krKqMqU_9kX09mNWB6UKrm9v7RxFuOjyVd5x35iodmPUbaXbzqETubPRzVKedLAhaYVTZp1J_qWvLVPoSImyFrM0IPB2Jy5ksqqAbbDjTy3l6Jp3pNu-IhiACVA1JlxRQ67Esb7JaK3ZakR3ExWSPDgxonqX8YvS6dr0UM2tjpOnurQc5NUSYBwo9vHzQxbWVuBATJaSUqe0IrJKPyvErRoEtFGjKZ8CvZagw1-MfD0KTLAmzR3hYAXKADsMRibEXf8-SPUrnuvm4OsRj1Gg7jl4k_ITYjOiRLzBMvVVxxRFfAhR7BFYBC1H0dClGTy4yxPKDNUR9HctiuQFO2-Q4Sw4dEqnTYSwCJS4Zaw5DHvqbDh9JK3AKdatRHHImqOxxtUxiJ8IaQcd2n_CaNbIekuuqUclwnjW8IJquTAPDJX0MhsyBY3nXJMVfeyCFO0D0g8OcvCH_9pFrsGgpTb7DFloDeTfCFUfY0GGGtfuhSL3qDggFAurf9H3cN73dOW5wujFOTGAbWG8aHf2Rok_H06fcg4zJSu5TnHkoJjdyc5n_NIo1RATiKwNkSFHwc_2-RnrnmOVl4125ufyqqrvuENapGWm8xGySQW1Zb39AKdUpBr4zEgU_M3PR6D0ujubsJLncgO8X6DwQ47QlGjPYmnjG_-q3O3plr-ShFJQOZqBvSgtdcqQBu0LK8I3vLXjHkQweUsVRzxlbwOYFMjmYOFWzxq2gP86-4TldrnOsUw0afewm0s_d6N8t2F_mvEgmJ5fPA3KXIQ7Fjaqxt_KUgqZqA4j3wGaAqI89QUc2HwU7bVFrLvLa019bJMj4az7WYmw1ajorD0C8dB2tLMjGdVHul_oEod0vyoCt-7I7qxZhkoW24ULSsmtPpSu0zV_gK0runwxjx1csxkHQP-MeoJry_F_D2jhgEmeJjamddbyT2TcQ7S3FS3uNDQyl6agzXq3rRdX9VlUatq9LpUCqL6U7WrA8JlEyFSJVm9W0pYaqjPiHiP47twkjl3txuKraV-Wkg4TrjlcMM3IqkMcAvySekuZGbIhjRscByTmDL-sESsMVG5dV8NU33HwnL9wLyZZ416JF927SfRTkF7DRrl-PRVX-lLNtmoXXSFCBdMfiUhvfWLR7r44ZxMRJCLacN1dw49XDyzANSfRmQySGmWhYUjUej6bLy9bdL5HP21O1u_9XUFWc_boI0a7tphBlMiUBGV7jAKlN9QrMAJVUBamHM3GmabbmVpFrvnuYd5bD_iJN0BY6cZb9lWDs6P6yHip8SoMO9VM8ykcdTfLOqp_IhlUkD3eZ0cSObuPHPs4HfiFHlG6qLLBtT_ytUeIDc5VMjA_6i0mKm85HhqWdB_MWoqE-aSPpAEtmQTLPUyyxpYrMYtWJ_OUqBxiU3CiV9G1QS8oU2gMq60w0OCDoy1F-oxnOLpJIrDhnDTAXlYnbFlYkEAIb9QDn7UDfitHrPqaUwShDHX7XXVbuYYJMIJs2XXnOViviNn5SbVkSDPyt4xi-UfPKpcTJCmmOSvZn-fs3BdO7oGdZC8UmBM6sVmgxOPL361DcEs6fsLKhqKwVLqDS-CYmT811dqja2CcnTmHIQrO6Wg_hEi5C1YW0iA1stpw461VDh86rHRslJSIn6kDJ9W_X-3vsTUpk62jUs6Bv1KkoyhcojCvgXtDr7ff5mTqTbzX9d76yVwW97xqA86SgntP-N6cNE2GcBKaXea32gjGskvFDV5w7-DGoxeZrNM1Ur5-S3ADFDE-A2mrQCxbm66xcB8KNK181k3QWLrlrKWKNMCZLgkFxuXbD2plxgPDWaqaJxFoDibjHHS94JXhBMu3KB6_CziqK7irU3OHsqEGc7ZDHS4araDurJUlr_UhH4UTsS9pOsxF5XniWdyNBdr6CKSrSC0SIw9YUi39X9CLp5mzWspRssOwUhd1ECVkLgOF8yv5g="
}
]
},
"index": 0,
"logprobs": {
"content": [],
"refusal": null
}
}
],
"usage": {
"completion_tokens": 629,
"prompt_tokens": 13,
"total_tokens": 642,
"completion_tokens_details": {
"reasoning_tokens": 384
},
"prompt_tokens_details": {
"cached_tokens": 0
}
},
"created": 1768384213,
"object": "chat.completion",
"service_tier": "default"
}多轮工具调用场景:传入 reasoning_details 和 signature
当使用 Claude Opus 4.5 等 Anthropic 模型并开启 reasoning 功能时,在多轮工具调用场景中,必须将上一轮模型返回的 reasoning_details(包含 signature 字段)完整传回,否则后续对话将无法正常进行。
重要说明
- 背景:Claude Opus 4.5 原生使用 Anthropic Messages 协议,OpenQiao 将 Chat Completion 协议转换为 Messages 协议。
- 问题:开启 reasoning 时,工具调用场景的第二轮对话需要传入 reasoning 的
signature,用于验证推理内容的完整性和连续性。 - 解决方案:将上一轮 assistant 消息中的
reasoning、reasoning_details字段完整传回即可。
请求示例
{
"model": "anthropic/claude-sonnet-4.5",
"messages": [
{
"content": "今天是2025年8月15日,上海今天天气怎么样",
"role": "user"
},
{
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "search_city_weather",
"arguments": "{\"city\":\"上海\"}"
},
"id": "toolu_bdrk_01S7xyqV3GYLJYrvBC5SwtPP",
"type": "function"
}
],
"content": "",
"reasoning": "用户想知道2025年8月15日上海的天气情况。我需要使用search_city_weather函数来查询。\n\n参数:\n- city: \"上海\"\n- date: \"2025-08-15\"",
"reasoning_details": [
{
"type": "reasoning.text",
"text": "用户想知道2025年8月15日上海的天气情况。我需要使用search_city_weather函数来查询。\n\n参数:\n- city: \"上海\"\n- date: \"2025-08-15\"",
"signature": "EscCCkgICxABGAIqQF3ngnbIR+15nndalNEqnr7vq0v0Hyvle+twPh2SCMpMmNKf1oXiRPsjZG6Z46M69x06wks+4jm4N4FO3RH2mkgSDLChkfyKfk3ZndjatxoMi+H4ghd4hlGd+MRVIjBLKGRIcRwXS09pK50C2/ygvhnTlVMPkcARYG3nXV2ZWr2IPRHzY9XAK6QBJeVrmcsqrAGoL7TTMBUsMqMkfXlcRYABi+OPDht/9BOPKnV1k0RIWnnqzLfx4MQ/WSvTALBchQkYbXtO2v1nn5EhG/b9FZ+ZjUK0pAObWxv8aAIK47N1cTK+OB+iByPvlFb2vi0gX7xVOQXrmR5FLH03/JzmtqLpjgX/uYCYHddOvZzTx65STtajQ94FVKS35XkmHlbOIXqi4j1FIAioP4oqvDXqlZOMh8IKMJypT2I3vF2eGAE=",
"format": "anthropic-claude-v1",
"index": 0
}
]
},
{
"role": "tool",
"tool_call_id": "toolu_bdrk_01S7xyqV3GYLJYrvBC5SwtPP",
"content": "{\"city\":\"上海市\",\"date\":\"2025-08-15\",\"week\":\"1\",\"dayweather\":\"多云\",\"nightweather\":\"多云\",\"daywind\":\"东南\",\"nightwind\":\"东南\",\"daypower\":\"1-3\",\"nightpower\":\"1-3\",\"daytemp_float\":\"35.0\",\"nighttemp_float\":\"28.0\"}"
}
],
"stream": false,
"tools": [
{
"function": {
"name": "search_city_weather",
"description": "搜索城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
},
"date": {
"type": "string",
"description": "yyyy-mm-dd格式的日期"
}
},
"required": ["city", "date"],
"additionalProperties": false
}
},
"type": "function"
}
],
"reasoning": {
"enabled": true
}
}关键字段说明
| 字段 | 说明 |
|---|---|
reasoning | assistant 消息中的推理过程文本,可选传回 |
reasoning_details | 必须完整传回,包含推理过程的详细信息数组 |
reasoning_details[].signature | 最关键字段,推理过程的签名凭证,必须原样传回 |
reasoning_details[].format | 签名格式标识,如 anthropic-claude-v1 |
reasoning_details[].type | 推理内容类型,如 reasoning.text |
工作流程
- 第一轮请求:用户发送问题,模型返回包含
tool_calls的 assistant 消息,同时返回reasoning和reasoning_details(包含signature) - 执行工具:应用程序执行工具调用,获取结果
- 第二轮请求:将上一轮的 assistant 消息(包含
reasoning和reasoning_details)和工具执行结果(tool message)一起传回 - 模型响应:模型基于完整上下文生成最终回答