文本生成(OpenAI Responses 协议)

接口概述

使用 OpenAI Responses 格式进行纯文本对话生成。Responses 是 OpenAI 推出的新一代协议,与 Chat Completions 的主要差异:

特性Chat CompletionsResponses
消息字段messagesinput
系统提示词messagesrole: "system"顶层 instructions 参数
最大 Token 数max_tokens / max_completion_tokensmax_output_tokens
多轮对话拼接完整 messages 历史previous_response_id 引用上一条回复
响应 object 类型chat.completionresponse

接口地址

POST https://test.jw-info.com/v1/responses

请求头

请求头是否必填说明
Content-Typeapplication/json
AuthorizationBearer {API_KEY},也可用 x-api-key

请求参数

请求体(JSON)

参数名类型是否必填默认值说明
modelstring-模型名称,见下方「可用模型」与模型广场
inputstring / array-用户输入:纯文本字符串,或消息数组(见下「input 结构」)
instructionsstringnull系统级指令,用于设定 AI 的行为和角色
temperaturefloat1.0采样温度,范围 [0, 2]。值越高输出越随机
top_pfloat1.0核采样(nucleus sampling),范围 [0, 1]
max_output_tokensinteger模型默认值生成的最大 token 数(等价于 Chat Completions 的 max_tokens
streambooleanfalse是否启用流式输出(SSE)
toolsarraynull可用的工具/函数定义列表
tool_choicestring / objectauto工具选择策略:auto / none / required 或指定具体工具
previous_response_idstringnull上一轮响应的 id,用于多轮对话,无需手动拼接完整历史
truncationstringdisabled截断策略:auto 自动截断超过上下文限制的较早消息;disabled 不截断,超出长度会报错

input 结构

形式一:纯文本字符串

{ "input": "你好,请介绍一下你自己" }

形式二:消息数组

{
  "input": [
    { "role": "user", "content": "你好,请介绍一下你自己" }
  ]
}

消息数组中每条消息的字段:

字段类型说明
rolestring消息角色:user / assistant
contentstring消息文本内容

请求示例

示例 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
}

响应参数

非流式响应参数

参数名类型说明
idstring本次响应的唯一标识,可作为 previous_response_id 回传
objectstring固定值 response
created_atinteger创建时间戳(Unix 秒)
modelstring实际使用的模型名称
outputarray输出内容列表
output[].typestring输出类型,纯文本模式下为 message
output[].rolestring角色,固定值 assistant
output[].contentarray内容片段数组
output[].content[].typestring内容类型:output_text(正常文本)或 refusal(拒绝回答)
output[].content[].textstring文本内容
statusstring响应状态:completedin_progress
usageobjectToken 用量统计
usage.input_tokensinteger输入消耗的 token 数
usage.output_tokensinteger输出消耗的 token 数
usage.total_tokensinteger总 token 消耗
usage.input_tokens_details.cached_tokensinteger命中缓存的输入 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请求格式错误或参数无效
401API Key 无效或缺失
402余额不足,请联系管理员授信
403无权访问该资源或模型
404请求的资源或模型不存在
429请求频率超限或配额不足
500 / 502 / 503服务端错误或模型侧错误,稍后重试

完整状态码与排查速查见「错误码」页。

代码示例

cURL(非流式):

curl https://test.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://test.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://test.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://test.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-maxqwen3.6-27bqwen3.6-35b-a3bqwen3-maxqwen-plusqwen3-coder-plus
DeepSeekdeepseek-v4-prodeepseek-v4-flashdeepseek-v3.2deepseek-r1deepseek-r1-0528
智谱(GLM)glm-5.2glm-5-turboglm-5.1glm-5.0
MiniMaxminimax-m2.7minimax-m2.5
豆包doubao1.5-pro-32k

在模型广场查看支持「文本生成」的模型 →