Scope & Evidence
仅用于 OpenAI 兼容 Chat 端点
模型必须在实时模型广场显示 openai。若模型只显示 openai-response、anthropic 或 gemini,应改用对应协议。
Scope & Evidence
模型必须在实时模型广场显示 openai。若模型只显示 openai-response、anthropic 或 gemini,应改用对应协议。
Authentication
POSThttps://api.muxllm.com/v1/chat/completionsAuthorization: Bearer YOUR_API_KEYContent-Type: application/json/v1。SDK 的 Base URL 已填写到 /v1 后,SDK 方法会继续拼接 /chat/completions,不要再手动增加第二个 /v1。First Request
从模型广场复制精确模型 ID 替换 MODEL_NAME。首次验证不要同时添加工具、媒体、结构化输出或采样参数,这样更容易定位协议问题。
curl https://api.muxllm.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_NAME",
"messages": [
{
"role": "user",
"content": "只回复:连接成功"
}
]
}'
验收时应同时检查 HTTP 状态码、响应的 Content-Type、是否存在 choices,以及首个消息文本是否非空。
Request Fields
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
model | 是 | 字符串 | 模型广场中的精确模型 ID,不能使用展示名称或自行缩写 |
messages | 是 | 数组 | 按时间顺序排列的会话消息;至少包含一条有效用户输入 |
stream | 否 | 布尔值 | true 请求 SSE 增量;默认按普通 JSON 响应处理 |
temperature | 否 | 数值 | 影响采样随机性;支持范围和效果由具体模型决定 |
top_p | 否 | 数值 | 另一种采样控制;通常不建议与温度同时大幅调整 |
max_tokens | 否 | 整数 | 传统 Chat 输出上限字段;部分新模型可能改用其他字段或拒绝该参数 |
stop | 否 | 字符串或数组 | 自定义停止序列;并非所有模型都支持 |
tools | 否 | 数组 | 声明可用工具;需要模型能力支持,详见函数调用教程 |
model 和 messages。最小请求成功后,再一次增加一个可选字段并记录结果。Messages
| 角色 | 用途 | 注意事项 |
|---|---|---|
system | 设置会话级行为、格式和边界 | 不同模型对系统消息的支持方式可能不同 |
user | 用户输入和后续追问 | 不要把不可信内容拼进高权限指令 |
assistant | 保留模型先前回答或工具调用请求 | 多轮会话需保持原顺序,不要伪造敏感决策 |
tool | 回传业务代码执行的工具结果 | 必须携带匹配的 tool_call_id |
[
{
"role": "system",
"content": "回答时先给结论,再列出依据。"
},
{
"role": "user",
"content": "什么是指数退避?"
},
{
"role": "assistant",
"content": "指数退避是逐步延长重试间隔的策略。"
},
{
"role": "user",
"content": "给出一个适用于 429 的例子。"
}
]
文本消息的 content 可以是字符串。视觉等多模态输入通常使用内容块数组,不能假设所有带 openai 标签的模型都支持图片。
Response
普通请求通常返回一个 JSON 对象。下面只展示常用结构;具体字段、空值和用量明细可能因模型或上游实现而变化。
{
"id": "chatcmpl-example",
"object": "chat.completion",
"model": "MODEL_NAME",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "连接成功"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 2,
"total_tokens": 14
}
}
| 读取位置 | 含义 | 处理方式 |
|---|---|---|
choices[0].message.content | 首个候选的文本内容 | 使用前检查 choices 与内容是否存在 |
finish_reason | 本次候选结束原因 | stop 通常表示自然结束;其他值需要按业务处理 |
usage | 输入、输出和总 Token 用量 | 字段可能缺失或延迟,计费以平台账单为准 |
id | 响应标识 | 可用于脱敏后的故障关联,不要与 API Key 一起记录 |
Server-Sent Events
加入 "stream": true 后,服务端通常以 text/event-stream 返回多个 data: 事件。一次 TCP 读取可能包含半行或多行,客户端应使用成熟的 SSE/SDK 解析能力。
curl -N https://api.muxllm.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MODEL_NAME",
"messages": [
{ "role": "user", "content": "逐步解释缓存击穿。" }
],
"stream": true
}'
data: {"choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{"content":"缓存"},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{"content":"击穿"},"finish_reason":null}]}
data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
确认成功响应是事件流;错误响应可能仍然是普通 JSON。
去除 data: 前缀后解析 JSON,跳过空行和注释事件。
按 index 累积 delta.content,空增量不应渲染为文本。
处理停止原因与结束标记;网络中断时将结果明确标记为不完整。
Conversation State
典型 Chat Completions 请求是无状态的。每次追问时,应用需要按顺序重新提交仍然必要的系统消息、用户消息和助手回复。
Compatibility
OpenAI 兼容描述的是请求外形,不表示上游完整实现所有 OpenAI 参数。推理模型、传统聊天模型和不同供应渠道可能接受不同的输出限制、采样或结构化输出字段。
只发送 model 与 messages。
分别验证流式、采样、输出上限、工具或响应格式。
把验证结果与精确模型 ID、渠道和日期绑定,不泛化到全部模型。
可选参数被拒绝时,应用应能回退到最小请求或切换已验证模型。
Errors & Retry
| 状态或现象 | 常见原因 | 处理 |
|---|---|---|
| 400 | 字段不兼容、JSON 错误、上下文超限 | 回到最小请求,检查响应错误体后逐项恢复字段 |
| 401 / 403 | Key、认证头、账户或分组权限错误 | 修正凭证与权限;不要直接循环重试 |
| 404 | 路径、模型名或协议标签不匹配 | 核对完整 URL、精确模型 ID 与 openai 标签 |
| 429 | 额度、余额、并发或上游限流 | 先检查账户状态,再有限指数退避并降低并发 |
| 5xx | 平台或上游短暂异常 | 记录脱敏请求标识,对可安全重放的文本请求有限重试 |
| 流中断 | 网络、代理、超时或上游中断 | 保留已接收文本并标记不完整,不把半截回答当成成功 |
日志可以记录模型名、端点、状态码、耗时、重试次数和脱敏请求 ID,但不得记录 Authorization 头、完整用户隐私内容或第三方签名 URL。
Official Sources
Acceptance
复制 MODEL_NAME,确认端点标签为 openai。
使用专用低额度 Key,验证状态码、JSON 类型和非空文本。
确认增量顺序、结束标记、取消和中断状态都被正确处理。
连续追问时保留角色顺序,并在接近上限前裁剪或摘要。
增加超时、有限重试、并发控制、日志脱敏和成本监控。
Next Guide
视觉请求需要额外确认模型能力、消息结构、MIME 类型和隐私边界。