对话补全 Chat Completions
Chat Completions 是最核心的 API 端点,用于与大语言模型进行对话交互。
OpenAI 兼容:本端点 100% 兼容 OpenAI Chat Completions API 格式。如果你已有 OpenAI 代码,只需替换
base_url 和 api_key 即可无缝迁移。端点
POST https://api2everything.xyz/v1/chat/completions
请求时需在 Header 中携带 API Key 进行认证:
Authorization: Bearer sk-your-api-key
Content-Type: application/json
请求参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
model | string | 是 | - | 模型 ID,如 gpt-4o、claude-sonnet-4-20250514、deepseek-chat。查看 模型列表 |
messages | array | 是 | - | 对话消息数组,详见下方 Messages 格式 |
temperature | number | 否 | 1.0 | 采样温度,范围 0-2。值越低回复越确定,越高越随机 |
top_p | number | 否 | 1.0 | 核采样概率,范围 0-1。与 temperature 二选一调整即可 |
max_tokens | integer | 否 | 模型默认 | 生成的最大 token 数量 |
stream | boolean | 否 | false | 是否启用流式输出(SSE)。详见 流式输出 |
tools | array | 否 | - | 可用工具/函数列表。详见 函数调用 |
tool_choice | string/object | 否 | auto | 工具选择策略:auto、none、required 或指定函数 |
response_format | object | 否 | - | 指定输出格式,如 {"type": "json_object"} 强制 JSON 输出 |
n | integer | 否 | 1 | 为每条消息生成多少个回复 |
stop | string/array | 否 | null | 停止序列,遇到指定字符串时停止生成 |
presence_penalty | number | 否 | 0 | 话题存在惩罚,范围 -2.0 到 2.0。正值鼓励模型讨论新话题 |
frequency_penalty | number | 否 | 0 | 频率惩罚,范围 -2.0 到 2.0。正值降低模型重复相同内容的可能性 |
Messages 格式
messages 是一个消息对象数组,每个对象包含 role 和 content 字段:
角色类型
| role | 说明 |
|---|---|
system | 系统提示词,用于设定模型的行为和角色。放在消息数组的最前面 |
user | 用户消息,代表人类的输入 |
assistant | 助手消息,代表模型的回复。在多轮对话中用于提供历史上下文 |
content 字段
content 支持两种格式:
- 字符串 — 最常见的纯文本格式:
"content": "你好" - 数组 — 用于多模态输入(如图片识别),数组中可包含文本和图片 URL:
{
"role": "user",
"content": [
{"type": "text", "text": "这张图片里有什么?"},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
]
}
多轮对话
要实现多轮对话,需要将之前的对话历史按顺序放入 messages 数组中。模型会根据完整的上下文生成回复:
{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": "法国的首都是哪里?"},
{"role": "assistant", "content": "法国的首都是巴黎。"},
{"role": "user", "content": "那里有什么著名景点?"}
]
}
注意:每次请求都需要发送完整的对话历史。API 本身不保存对话状态,上下文管理需在客户端完成。消息数量越多,消耗的 token 越多。
响应格式
成功调用后返回如下 JSON 结构:
{
"id": "chatcmpl-abc123def456",
"object": "chat.completion",
"created": 1713345600,
"model": "gpt-4o-2024-08-06",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "你好!有什么可以帮助你的吗?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 15,
"total_tokens": 27
}
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 本次请求的唯一标识符 |
object | string | 对象类型,固定为 chat.completion |
created | integer | 创建时间的 Unix 时间戳 |
model | string | 实际使用的模型 ID(可能包含版本后缀) |
choices | array | 模型生成的回复列表。通常只有一个元素(除非 n > 1) |
choices[].message | object | 回复消息,包含 role 和 content |
choices[].finish_reason | string | 停止原因:stop(正常结束)、length(达到 max_tokens)、tool_calls(调用工具) |
usage | object | token 用量统计,包含 prompt_tokens、completion_tokens、total_tokens |
示例
基本请求 — Python
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api2everything.xyz/v1"
)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "用一句话解释量子计算"}
],
temperature=0.7,
max_tokens=200
)
print(response.choices[0].message.content)
基本请求 — cURL
curl https://api2everything.xyz/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{"role": "user", "content": "用一句话解释量子计算"}
],
"temperature": 0.7,
"max_tokens": 200
}'
多轮对话 — Python
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api2everything.xyz/v1"
)
# 维护对话历史
history = [
{"role": "system", "content": "你是一个专业的烹饪助手。"}
]
def chat(user_message):
history.append({"role": "user", "content": user_message})
response = client.chat.completions.create(
model="gpt-4o",
messages=history
)
reply = response.choices[0].message.content
history.append({"role": "assistant", "content": reply})
return reply
print(chat("我想做一道简单的意大利面"))
print(chat("家里没有培根,可以用什么替代?"))
使用 System Prompt — cURL
curl https://api2everything.xyz/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"messages": [
{"role": "system", "content": "你是一个资深的 Python 开发者,回答简洁且附带代码示例。"},
{"role": "user", "content": "如何用 Python 读取 CSV 文件?"}
],
"temperature": 0.3
}'
错误处理
当请求失败时,API 返回包含 error 对象的 JSON 响应:
{
"error": {
"message": "Invalid API key provided.",
"type": "authentication_error",
"code": "invalid_api_key"
}
}
常见错误码
| HTTP 状态码 | 含义 | 常见原因 | 处理建议 |
|---|---|---|---|
401 | 认证失败 | API Key 无效、过期或未提供 | 检查 Key 是否正确,前往 控制台 确认 Key 状态 |
429 | 请求频率超限 | 短时间内发送了过多请求 | 实现指数退避重试;降低并发数;联系客服提升限额 |
400 | 请求参数错误 | 缺少必填参数、参数类型错误、模型不存在 | 检查请求体格式;确认 model 名称是否正确 |
402 | 余额不足 | 账户额度已用完 | 前往 控制台 充值 |
500 | 服务器内部错误 | 上游模型服务异常 | 稍后重试;如持续出现请联系客服或更换模型 |
重试建议
最佳实践:对于
429 和 500 错误,建议使用指数退避策略进行重试。初始等待 1 秒,每次重试等待时间翻倍,最多重试 3 次。import time
from openai import OpenAI, APIError, RateLimitError
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api2everything.xyz/v1"
)
def chat_with_retry(messages, max_retries=3):
for attempt in range(max_retries):
try:
return client.chat.completions.create(
model="gpt-4o",
messages=messages
)
except RateLimitError:
wait = 2 ** attempt # 1s, 2s, 4s
print(f"频率限制,{wait}秒后重试...")
time.sleep(wait)
except APIError as e:
if e.status_code == 500 and attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raise
raise Exception("重试次数已用尽")