文本生成(OpenAI Responses 协议)
接口概述
使用 OpenAI Responses 格式进行纯文本对话生成。Responses 是 OpenAI 推出的新一代协议,与 Chat Completions 的主要差异:
| 特性 | Chat Completions | Responses |
|---|---|---|
| 消息字段 | messages | input |
| 系统提示词 | messages 中 role: "system" | 顶层 instructions 参数 |
| 最大 Token 数 | max_tokens / max_completion_tokens | max_output_tokens |
| 多轮对话 | 拼接完整 messages 历史 | 用 previous_response_id 引用上一条回复 |
响应 object 类型 | chat.completion | response |
接口地址
POST https://ai.jw-info.com/v1/responses
请求头
| 请求头 | 是否必填 | 说明 |
|---|---|---|
| Content-Type | 是 | application/json |
| Authorization | 是 | Bearer {API_KEY},也可用 x-api-key |
请求参数
请求体(JSON)
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| model | string | 是 | - | 模型名称,见下方「可用模型」与模型广场 |
| input | string / array | 是 | - | 用户输入:纯文本字符串,或消息数组(见下「input 结构」) |
| instructions | string | 否 | null | 系统级指令,用于设定 AI 的行为和角色 |
| temperature | float | 否 | 1.0 | 采样温度,范围 [0, 2]。值越高输出越随机 |
| top_p | float | 否 | 1.0 | 核采样(nucleus sampling),范围 [0, 1] |
| max_output_tokens | integer | 否 | 模型默认值 | 生成的最大 token 数(等价于 Chat Completions 的 max_tokens) |
| stream | boolean | 否 | false | 是否启用流式输出(SSE) |
| tools | array | 否 | null | 可用的工具/函数定义列表 |
| tool_choice | string / object | 否 | auto | 工具选择策略:auto / none / required 或指定具体工具 |
| previous_response_id | string | 否 | null | 上一轮响应的 id,用于多轮对话,无需手动拼接完整历史 |
| truncation | string | 否 | disabled | 截断策略:auto 自动截断超过上下文限制的较早消息;disabled 不截断,超出长度会报错 |
input 结构
形式一:纯文本字符串
{ "input": "你好,请介绍一下你自己" }
形式二:消息数组
{
"input": [
{ "role": "user", "content": "你好,请介绍一下你自己" }
]
}
消息数组中每条消息的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| role | string | 消息角色:user / assistant |
| content | string | 消息文本内容 |
请求示例
示例 1:简单对话
{
"model": "deepseek-v3.2",
"input": "你好,请用一句话介绍你自己",
"temperature": 0.7,
"max_output_tokens": 1024
}
示例 2:带 instructions(系统指令)
{
"model": "qwen3.7-max",
"instructions": "你是一个专业的 Python 编程助手,回答问题时请提供代码示例。",
"input": "如何在 Python 中读取 JSON 文件?",
"temperature": 0.5,
"max_output_tokens": 2048
}
示例 3:多轮对话(previous_response_id)
第一轮请求:
{
"model": "deepseek-v3.2",
"instructions": "你是一个友好的助手",
"input": "你好,我叫小明",
"max_output_tokens": 1024
}
第一轮响应会返回 id(形如 resp_abc123def456)。第二轮只传该 id,不必重发历史:
{
"model": "deepseek-v3.2",
"previous_response_id": "resp_abc123def456",
"input": "我叫什么名字?",
"max_output_tokens": 1024
}
示例 4:流式输出
{
"model": "deepseek-v3.2",
"input": "写一首关于秋天的五言诗",
"stream": true,
"max_output_tokens": 512
}
响应参数
非流式响应参数
| 参数名 | 类型 | 说明 |
|---|---|---|
| id | string | 本次响应的唯一标识,可作为 previous_response_id 回传 |
| object | string | 固定值 response |
| created_at | integer | 创建时间戳(Unix 秒) |
| model | string | 实际使用的模型名称 |
| output | array | 输出内容列表 |
| output[].type | string | 输出类型,纯文本模式下为 message |
| output[].role | string | 角色,固定值 assistant |
| output[].content | array | 内容片段数组 |
| output[].content[].type | string | 内容类型:output_text(正常文本)或 refusal(拒绝回答) |
| output[].content[].text | string | 文本内容 |
| status | string | 响应状态:completed、in_progress |
| usage | object | Token 用量统计 |
| usage.input_tokens | integer | 输入消耗的 token 数 |
| usage.output_tokens | integer | 输出消耗的 token 数 |
| usage.total_tokens | integer | 总 token 消耗 |
| usage.input_tokens_details.cached_tokens | integer | 命中缓存的输入 token 数(计费按缓存价,见「计费与用量」) |
响应有两种形状:多数模型返回上表的普通对象;部分模型返回单个
response.completed事件体(与流式帧同形),此时字段在response.*下(response.output[]、response.usage)。两种都要按需取,见「响应示例」的兼容写法。
流式响应事件(SSE)
| 事件类型 | 说明 |
|---|---|
| response.created | 响应已创建,包含初始元数据 |
| response.in_progress | 生成中 |
| response.output_item.added / response.content_part.added | 输出项与内容片段开始 |
| response.output_text.delta | 文本增量内容(delta 字段) |
| response.output_text.done / response.output_item.done | 文本与输出项结束 |
| response.completed | 响应完成,包含完整 response 对象与 usage 统计 |
帧以 data: {…} 给出(部分模型同时带 event: 事件名 行),以 data: [DONE] 结束。
响应示例
非流式响应:
{
"id": "resp_abc123def456",
"object": "response",
"created_at": 1720000000,
"model": "deepseek-v3.2",
"output": [
{
"type": "message",
"role": "assistant",
"content": [
{
"type": "output_text",
"text": "你好!我是 DeepSeek,很高兴为你服务。"
}
]
}
],
"status": "completed",
"usage": { "input_tokens": 15, "output_tokens": 22, "total_tokens": 37 }
}
事件体形状(部分模型):
{
"type": "response.completed",
"response": {
"id": "resp_abc123def456",
"object": "response",
"status": "completed",
"output": [
{
"type": "message",
"role": "assistant",
"content": [{ "type": "output_text", "text": "你好!我是 DeepSeek。" }]
}
],
"usage": { "input_tokens": 15, "output_tokens": 5, "total_tokens": 20 }
}
}
两种形状的兼容取法:
resp = requests.post(f"{BASE}/v1/responses", headers=H, json=payload).json()
data = resp.get("response") or resp # 事件体时取内层
text = data["output"][0]["content"][0]["text"]
usage = data["usage"]
流式响应(节选):
event: response.created
data: {"type":"response.created","response":{"id":"resp_abc123","object":"response","status":"in_progress","output":[]}}
event: response.output_text.delta
data: {"type":"response.output_text.delta","item_id":"msg_001","output_index":0,"content_index":0,"delta":"你好"}
event: response.output_text.delta
data: {"type":"response.output_text.delta","item_id":"msg_001","output_index":0,"content_index":0,"delta":"!"}
event: response.completed
data: {"type":"response.completed","response":{"id":"resp_abc123","status":"completed","output":[{"type":"message","role":"assistant","content":[{"type":"output_text","text":"你好!"}]}],"usage":{"input_tokens":15,"output_tokens":5,"total_tokens":20}}}
data: [DONE]
模型支持范围
- 本协议由模型侧支持,并非所有模型都支持(约六成文本模型可用,较早的第三方开源型号居多)。不支持时会返回 400 / 404 / 500 并给出原因(如「Agent capabilities are not enabled」「Unsupported model」「模型不存在」)——改用
/v1/chat/completions调同一个模型即可,模型名与计费不变。 - 流式(
stream: true)另需模型支持,部分模型会返回response.failed(错误信息会说明能力不支持)。这类失败不收费,但会在控制台留一条失败记录。 - 文档里的参数与示例可在模型广场任一支文本模型上使用;不确定某支模型是否支持时,先用一条最小请求探一次。
计费
按用量(输入 / 输出 token,命中缓存的输入按缓存价)结算,每次费用都会记入控制台「费用中心」;响应本身不返回费用信息。
错误响应
出错时返回 {"detail": "说明文字"};如果是模型侧报错,状态码为 502,detail 里带上其原始错误正文,其形状为 {"error": {"message": "...", "type": "invalid_request_error", "param": "...", "code": "..."}}(param 指出出错字段),便于定位原因。
| HTTP | 说明 |
|---|---|
| 400 | 请求格式错误或参数无效 |
| 401 | API Key 无效或缺失 |
| 402 | 余额不足,请联系管理员授信 |
| 403 | 无权访问该资源或模型 |
| 404 | 请求的资源或模型不存在 |
| 429 | 请求频率超限或配额不足 |
| 500 / 502 / 503 | 服务端错误或模型侧错误,稍后重试 |
完整状态码与排查速查见「错误码」页。
代码示例
cURL(非流式):
curl https://ai.jw-info.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{
"model": "deepseek-v3.2",
"instructions": "你是一个友好的助手",
"input": "你好,请介绍一下你自己",
"temperature": 0.7,
"max_output_tokens": 1024
}'
cURL(流式):
curl -N https://ai.jw-info.com/v1/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的密钥" \
-d '{ "model": "deepseek-v3.2", "input": "讲一个笑话", "stream": true, "max_output_tokens": 512 }'
Python(非流式):
import requests
BASE = "https://ai.jw-info.com"
H = {"Authorization": "Bearer sk-你的密钥", "Content-Type": "application/json"}
resp = requests.post(f"{BASE}/v1/responses", headers=H, json={
"model": "deepseek-v3.2",
"instructions": "你是一个友好的助手",
"input": "你好,请介绍一下你自己",
"temperature": 0.7,
"max_output_tokens": 1024,
})
data = resp.json()
if resp.status_code == 200:
inner = data.get("response") or data # 兼容两种响应形状
for item in inner["output"]:
if item["type"] == "message":
for c in item["content"]:
if c["type"] == "output_text":
print(c["text"])
print("Token 用量:", inner["usage"]["total_tokens"])
else:
print("错误:", data["error"]["message"])
Python(流式):
import json
import requests
BASE = "https://ai.jw-info.com"
H = {"Authorization": "Bearer sk-你的密钥", "Content-Type": "application/json"}
with requests.post(f"{BASE}/v1/responses", headers=H, stream=True, json={
"model": "deepseek-v3.2", "input": "写一首关于春天的诗",
"stream": True, "max_output_tokens": 512}) as r:
current = None
for raw in r.iter_lines():
if not raw:
continue
line = raw.decode("utf-8")
if line.startswith("event: "):
current = line[7:].strip()
elif line.startswith("data: ") and line[6:].strip() != "[DONE]":
data = json.loads(line[6:])
if data.get("type") == "response.output_text.delta" or \
current == "response.output_text.delta":
print(data.get("delta", ""), end="", flush=True)
elif data.get("type") == "response.completed" or \
current == "response.completed":
usage = (data.get("response") or data).get("usage") or {}
print(f"\n--- Token 用量: {usage.get('total_tokens')} ---")
可用模型
以下模型已实测支持本协议;更多模型见模型广场(不确定支持时先发一条最小请求探活)。
| 厂商 | 模型 |
|---|---|
| 通义千问 | qwen3.7-max、qwen3.6-27b、qwen3.6-35b-a3b、qwen3-max、qwen-plus、qwen3-coder-plus |
| DeepSeek | deepseek-v4-pro、deepseek-v4-flash、deepseek-v3.2、deepseek-r1、deepseek-r1-0528 |
| 智谱(GLM) | glm-5.2、glm-5-turbo、glm-5.1、glm-5.0 |
| MiniMax | minimax-m2.7、minimax-m2.5 |
| 豆包 | doubao1.5-pro-32k |