快速开始
这是一份面向研发联调的标准对接文档。当前网关提供 OpenAI Chat Completions 兼容接口,接入时统一使用 POST /v1/chat/completions。
如果你只想先验证链路,可直接复制下方 cURL 示例;如果要在服务中正式对接,优先参考 SDK 的 baseURL 配置说明和联调清单。
接口概览
- 请求方式:
POST /v1/chat/completions - 鉴权方式:
Authorization: Bearer sk-xxxx - 内容类型:
application/json - 响应模式:同步 JSON / 流式 SSE
- 模型参数:传入你已经开通并可用的模型 ID
提示
使用 OpenAI 官方 SDK 时,baseURL 应配置为网关地址加 /v1,不要把完整接口路径重复拼接进去。
接入前准备
- 获取 API Key。请求头格式固定为
Authorization: Bearer sk-xxxx。 - 确认可用模型。请求中的
model必须替换为你实际开通的模型 ID。 - 在服务端保存密钥。不要把生产密钥直接写进前端代码、仓库或公开配置文件。
环境变量示例
API_BASE_URL=https://your-domain.com
API_KEY=sk-your-api-key
MODEL_NAME=your-model-id
标准对接流程
- 准备域名与密钥:确认网关域名、可用模型和 API Key。
- 按 OpenAI 兼容方式发起请求:统一使用
POST /v1/chat/completions。 - 根据业务选择同步或流式:普通请求读取
message.content,流式请求逐块处理delta.content。 - 联调验收并切生产配置:校验鉴权、模型、超时、重试和额度规则后再切正式环境。
请求头
| 名称 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
Authorization | string | 是 | Bearer Token 鉴权,格式为 Bearer sk-xxxx | Bearer sk-your-api-key |
Content-Type | string | 是 | 请求体编码格式,固定为 JSON | application/json |
请求体
| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
model | string | 是 | 要调用的模型名称 | your-model-id |
messages | array | 是 | 对话消息数组,兼容 OpenAI Chat Completions | [{"role":"user","content":"你好"}] |
stream | boolean | 否 | 为 true 时返回 SSE 流式响应 | true |
temperature | number | 否 | 采样温度,一般建议在 0 到 2 之间 | 0.7 |
max_tokens | integer | 否 | 限制本次生成的最大输出 token 数 | 1024 |
相关信息
最小可用请求只需要 model 和 messages 两个字段。建议先用最小请求跑通,再逐步增加 temperature、max_tokens 等控制参数。
cURL 最小联调请求
curl -X POST https://your-domain.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "your-model-id",
"messages": [
{"role": "user", "content": "你好"}
]
}'
SDK 示例
TypeScript
import OpenAI from 'openai'
const client = new OpenAI({
apiKey: process.env.API_KEY,
baseURL: 'https://your-domain.com/v1',
})
async function main() {
const response = await client.chat.completions.create({
model: process.env.MODEL_NAME || 'your-model-id',
messages: [{ role: 'user', content: '你好' }],
})
console.log(response.choices[0]?.message?.content)
}
main().catch(console.error)
Python
from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["API_KEY"],
base_url="https://your-domain.com/v1",
)
response = client.chat.completions.create(
model=os.environ.get("MODEL_NAME", "your-model-id"),
messages=[{"role": "user", "content": "你好"}],
)
print(response.choices[0].message.content)
流式请求
cURL
curl -N -X POST https://your-domain.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "your-model-id",
"stream": true,
"messages": [
{"role": "user", "content": "你好"}
]
}'
TypeScript
import OpenAI from 'openai'
const client = new OpenAI({
apiKey: process.env.API_KEY,
baseURL: 'https://your-domain.com/v1',
})
async function main() {
const stream = await client.chat.completions.create({
model: process.env.MODEL_NAME || 'your-model-id',
stream: true,
messages: [{ role: 'user', content: '你好' }],
})
for await (const chunk of stream) {
const text = chunk.choices[0]?.delta?.content
if (text) process.stdout.write(text)
}
}
main().catch(console.error)
响应格式
同步 JSON 响应
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1712476800,
"model": "your-model-id",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "你好,有什么可以帮你?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 8,
"completion_tokens": 10,
"total_tokens": 18
}
}
流式 SSE 响应
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1712476800,"model":"your-model-id","choices":[{"index":0,"delta":{"content":"你"},"finish_reason":null}]}
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1712476800,"model":"your-model-id","choices":[{"index":0,"delta":{"content":"好"},"finish_reason":null}]}
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1712476800,"model":"your-model-id","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
流式处理说明
- 响应头为
text/event-stream。 - 每个 SSE 事件以
data:开头。 - 文本从
choices[0].delta.content中逐步累积。 - 收到
finish_reason: "stop"或data: [DONE]后结束读取。 - 服务端建议设置读取超时和中断兜底,避免长连接悬挂。
常见错误与排查
| HTTP 状态 | 问题 | 常见原因 | 处理建议 |
|---|---|---|---|
400 | 请求体格式错误 | messages 结构不合法、model 缺失或字段类型错误 | 先用最小可用请求联调,再逐步增加业务字段 |
401 | API Key 无效或缺失 | 未传 Authorization、Bearer 前缀错误或密钥不可用 | 确认格式必须为 Authorization: Bearer sk-xxxx |
429 | 频率或额度受限 | 请求过快、并发过高或账户额度不足 | 增加退避重试,并检查账户额度与调用峰值 |
500 | 上游或网关内部异常 | 上游模型服务波动、请求超时或服务内部错误 | 记录 request id、时间点和请求参数摘要后排查 |
联调验收清单
- 能用 cURL 成功拿到第一条
200响应。 - 服务端已正确保存 API Key,前端未直接暴露密钥。
- SDK
baseURL配置为网关地址加/v1,而不是完整接口路径。 - 流式调用已按 SSE 逐事件解析,不会整段按 JSON 一次性反序列化。
- 生产环境已配置超时、重试、日志脱敏与错误告警。