API 参考
Chat Completions 对话补全
POST /v1/chat/completions 的请求头、参数、请求与响应示例、流式输出格式。OpenAI 兼容,GPT、Claude、Gemini、DeepSeek 等模型都能用同一套代码调用,已实测含流式。
POST /v1/chat/completions 是最常用的接口:传入一组对话消息,返回模型的回复。格式与 OpenAI Chat Completions 一致,目录里标注支持该接口的模型(包括 GPT、Claude、Gemini、DeepSeek、通义千问等)都可以用同一套代码调用。本接口已在本站实测,包括流式输出。
https://open.tutujin.com/v1/chat/completions请求头
| 请求头 | 必填 | 说明 |
|---|---|---|
Authorization | 是 | Bearer sk-...,控制台创建的 API Key |
Content-Type | 是 | application/json |
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名,例如 gpt-5.4-mini |
messages | array | 是 | 对话消息列表,按时间顺序排列,结构见下文 |
stream | boolean | 否 | 设为 true 时以 SSE 流式返回,默认 false |
stream_options | object | 否 | 流式时传 {"include_usage": true},最后一个数据块会带上本次用量 |
max_tokens | integer | 否 | 本次最多生成多少 tokens。部分新模型改用 max_completion_tokens |
max_completion_tokens | integer | 否 | 生成上限,包含推理模型的思考 tokens |
temperature | number | 否 | 采样温度,常见范围 0 到 2,越高越发散。推理模型通常不支持 |
top_p | number | 否 | 核采样,和 temperature 一般只调一个 |
n | integer | 否 | 返回几个候选回答,每个候选都按实际生成的 tokens 计费 |
stop | string 或 array | 否 | 遇到这些字符串时停止生成 |
presence_penalty | number | 否 | -2 到 2,正值鼓励模型谈新话题 |
frequency_penalty | number | 否 | -2 到 2,正值减少重复用词 |
response_format | object | 否 | {"type": "json_object"} 要求输出 JSON;部分模型支持 json_schema 严格结构化输出 |
tools | array | 否 | 可供模型调用的函数定义(function calling) |
tool_choice | string 或 object | 否 | auto、none、required,或指定某个函数 |
reasoning_effort | string | 否 | 推理模型的思考强度,如 low、medium、high,仅部分模型支持 |
seed | integer | 否 | 尽量让相同输入得到相同输出,不保证完全一致 |
user | string | 否 | 你这边的终端用户标识,便于排查滥用 |
不同厂商的模型对可选参数的支持程度不同。模型不支持的参数可能被忽略,也可能返回 400,接入新模型时先用小流量验证。
messages 结构
每条消息是一个对象,role 取以下值之一:
| role | 用途 |
|---|---|
system | 系统提示词,设定角色、规则和输出格式,一般放在第一条 |
user | 用户输入 |
assistant | 模型之前的回复,多轮对话时原样带回 |
tool | 函数调用的执行结果,需带上对应的 tool_call_id |
content 可以是字符串,也可以是数组。数组形式用于图文混合输入,适用于支持识图的模型:
{
"role": "user",
"content": [
{ "type": "text", "text": "这张发票的金额是多少?" },
{ "type": "image_url", "image_url": { "url": "https://example.com/invoice.png" } }
]
}图片也可以用 data:image/png;base64,... 的形式直接放进 url。
请求示例
curl https://open.tutujin.com/v1/chat/completions \
-H "Authorization: Bearer $TUTUJIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.4-mini",
"messages": [
{"role": "system", "content": "你是电商客服,回答简短、礼貌。"},
{"role": "user", "content": "下单后多久发货?"}
],
"temperature": 0.3
}'import os
from openai import OpenAI
client = OpenAI(base_url="https://open.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"])
resp = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[
{"role": "system", "content": "你是电商客服,回答简短、礼貌。"},
{"role": "user", "content": "下单后多久发货?"},
],
temperature=0.3,
)
print(resp.choices[0].message.content)
print(resp.usage)import OpenAI from 'openai'
const client = new OpenAI({ baseURL: 'https://open.tutujin.com/v1', apiKey: process.env.TUTUJIN_API_KEY })
const resp = await client.chat.completions.create({
model: 'gpt-5.4-mini',
messages: [
{ role: 'system', content: '你是电商客服,回答简短、礼貌。' },
{ role: 'user', content: '下单后多久发货?' },
],
temperature: 0.3,
})
console.log(resp.choices[0].message.content)
console.log(resp.usage)响应示例
{
"id": "chatcmpl-...",
"object": "chat.completion",
"created": 1794000000,
"model": "gpt-5.4-mini",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "您好,现货订单一般在付款后 48 小时内发货。"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 31,
"completion_tokens": 22,
"total_tokens": 53
}
}| 字段 | 说明 |
|---|---|
choices[].message.content | 模型的回答 |
choices[].message.tool_calls | 模型决定调用函数时出现,包含函数名和 JSON 参数 |
choices[].finish_reason | stop 正常结束;length 达到生成上限被截断;tool_calls 需要你执行函数;content_filter 被内容安全策略拦截 |
usage.prompt_tokens | 输入 tokens,按输入单价计费 |
usage.completion_tokens | 输出 tokens(推理模型含思考部分),按输出单价计费 |
usage.prompt_tokens_details.cached_tokens | 命中上下文缓存的输入 tokens,模型支持缓存时出现,按缓存读取价计费 |
流式输出
设置 "stream": true 后,服务端用 Server-Sent Events 逐块返回。每块是一行 data: {...},增量文本在 choices[0].delta.content,最后以 data: [DONE] 结束:
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""}}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"您好"}}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]用 SDK 时直接遍历返回的流即可:
stream = client.chat.completions.create(
model="gpt-5.4-mini",
messages=[{"role": "user", "content": "写一段 100 字的产品介绍"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if chunk.usage:
print("\n", chunk.usage)const stream = await client.chat.completions.create({
model: 'gpt-5.4-mini',
messages: [{ role: 'user', content: '写一段 100 字的产品介绍' }],
stream: true,
stream_options: { include_usage: true },
})
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content
if (text) process.stdout.write(text)
if (chunk.usage) console.log('\n', chunk.usage)
}生成较长的内容时建议开启流式:用户更早看到结果,也不容易因为单次请求等待太久被网关或客户端超时断开。
注意事项
- 模型名要和模型广场里的写法完全一致,大小写敏感。
- 同一把 Key 只会走它所在分组的线路。某个模型返回 503 并提示没有可用渠道时,通常是这个分组不提供该模型,换一把其他分组的 Key 再试,见选择分组。
- 推理模型的思考过程也算输出 tokens,费用可能明显高于普通模型。可以用
max_completion_tokens控制上限。 - 多轮对话需要你把历史消息一并发送,服务端不保存会话。历史越长,输入 tokens 越多,可以按需裁剪。
- 每次请求的 tokens 与费用都能在控制台「用量明细」中查到。
支持此接口的模型
| 模型 | 厂商 | 最低价分组 | 输入 ¥/百万 | 输出 ¥/百万 | 按次 ¥/次 |
|---|---|---|---|---|---|
| gpt-image-2 | OpenAI | 标准 | — | — | ¥0.12 |
| Claude Haiku 5.5 | Anthropic | Claude 优质 | ¥0.4 | ¥2 | — |
| qwen3.5-plus | 通义千问 | 国产模型 | ¥1.12 | ¥6.72 | — |
| gemini-3.8-flash | 标准 | ¥1.5 | ¥7.5 | — | |
| gpt-5.4-mini | OpenAI | 标准 | ¥1.5 | ¥9 | — |
| deepseek-v4.1-flash | DeepSeek | 国产模型 | ¥2.8 | ¥11.2 | — |
| Claude Sonnet 5.5 | Anthropic | Claude 经济 | ¥3.2 | ¥16 | — |
| GPT-6.1 Sol | OpenAI | 标准 | ¥4 | ¥20 | — |
| gemini-3.1-pro-preview | 标准 | ¥4 | ¥24 | — | |
| Claude Opus 5.5 | Anthropic | Claude 经济 | ¥8 | ¥40 | — |
价格为人民币,取各模型最低价分组;价格更新于 2026年11月12日 20:17。
共 681 个模型支持此接口,上表列出其中一部分。 在模型广场查看全部
没找到答案?加客服微信 JsnonoChat,发送报错信息里的 request id,我们帮你排查。