Chat Completions

对话接口完整教程

从最小请求开始,逐步理解消息数组、生成参数、普通响应、SSE 流、多轮上下文和安全重试。该接口只适用于模型广场标记为 openai 的模型。

Scope & Evidence

仅用于 OpenAI 兼容 Chat 端点

模型必须在实时模型广场显示 openai。若模型只显示 openai-responseanthropicgemini,应改用对应协议。

E1 运行态证据MuxLLM 公开模型信息通过端点标签区分 Chat Completions 与其他协议;模型列表和标签属于动态数据。
E2 官方证据请求和响应结构依据 OpenAI 兼容 Chat Completions 协议编写,并保留对不同模型参数支持度的限制说明。
E3 接入实测本页没有执行真实请求。响应与 SSE 均为结构示例,不能作为某个具体模型当前已通过测试的证据。
最后核验

Authentication

请求头与地址必须同时正确

请求方法POST
完整地址https://api.muxllm.com/v1/chat/completions
鉴权Authorization: Bearer YOUR_API_KEY
内容类型Content-Type: application/json
避免重复版本路径直接使用完整 URL 时路径包含一次 /v1。SDK 的 Base URL 已填写到 /v1 后,SDK 方法会继续拼接 /chat/completions,不要再手动增加第二个 /v1

First Request

先发送没有可选参数的最小请求

从模型广场复制精确模型 ID 替换 MODEL_NAME。首次验证不要同时添加工具、媒体、结构化输出或采样参数,这样更容易定位协议问题。

cURL · 非流式
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数组声明可用工具;需要模型能力支持,详见函数调用教程
最小化参数出现 400 时,先只保留 modelmessages。最小请求成功后,再一次增加一个可选字段并记录结果。

Messages

按时间顺序构造消息数组

角色用途注意事项
system设置会话级行为、格式和边界不同模型对系统消息的支持方式可能不同
user用户输入和后续追问不要把不可信内容拼进高权限指令
assistant保留模型先前回答或工具调用请求多轮会话需保持原顺序,不要伪造敏感决策
tool回传业务代码执行的工具结果必须携带匹配的 tool_call_id
三轮消息结构
messages
[
  {
    "role": "system",
    "content": "回答时先给结论,再列出依据。"
  },
  {
    "role": "user",
    "content": "什么是指数退避?"
  },
  {
    "role": "assistant",
    "content": "指数退避是逐步延长重试间隔的策略。"
  },
  {
    "role": "user",
    "content": "给出一个适用于 429 的例子。"
  }
]

文本消息的 content 可以是字符串。视觉等多模态输入通常使用内容块数组,不能假设所有带 openai 标签的模型都支持图片。

Response

读取 choices、停止原因和用量

普通请求通常返回一个 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 一起记录
示例不是计费承诺上面的 Token 数量只是帮助理解结构的虚构值,不能用于估算具体请求价格。

Server-Sent Events

逐行解析 SSE,而不是按网络块解析 JSON

加入 "stream": true 后,服务端通常以 text/event-stream 返回多个 data: 事件。一次 TCP 读取可能包含半行或多行,客户端应使用成熟的 SSE/SDK 解析能力。

cURL · 流式请求
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
  }'
SSE 事件结构示意
text/event-stream
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]
  1. 01检查响应类型

    确认成功响应是事件流;错误响应可能仍然是普通 JSON。

  2. 02按事件解析

    去除 data: 前缀后解析 JSON,跳过空行和注释事件。

  3. 03拼接增量

    index 累积 delta.content,空增量不应渲染为文本。

  4. 04识别结束

    处理停止原因与结束标记;网络中断时将结果明确标记为不完整。

Conversation State

Chat 接口不会替你保存全部会话

典型 Chat Completions 请求是无状态的。每次追问时,应用需要按顺序重新提交仍然必要的系统消息、用户消息和助手回复。

保存原始角色不要把助手回复改写成用户消息,否则指令优先级和语义会发生变化。
控制上下文长度长会话应按模型上下文限制进行裁剪或摘要;模型名相同也不代表所有渠道限制相同。
摘要需可追溯摘要可能遗漏约束。重要订单号、授权状态或安全条件应存为结构化业务状态,而不是只依赖模型摘要。
隔离用户会话为每个用户和会话使用独立存储键,避免上下文串线和隐私泄露。
不可信输入网页、文件和工具结果都可能包含提示注入内容。不要因为它出现在历史消息里,就授予其访问密钥、执行命令或修改业务数据的权限。

Compatibility

逐模型确认可选参数

OpenAI 兼容描述的是请求外形,不表示上游完整实现所有 OpenAI 参数。推理模型、传统聊天模型和不同供应渠道可能接受不同的输出限制、采样或结构化输出字段。

  1. 01建立最小基线

    只发送 modelmessages

  2. 02一次增加一项

    分别验证流式、采样、输出上限、工具或响应格式。

  3. 03记录模型与日期

    把验证结果与精确模型 ID、渠道和日期绑定,不泛化到全部模型。

  4. 04保留降级路径

    可选参数被拒绝时,应用应能回退到最小请求或切换已验证模型。

Errors & Retry

先修正确定性错误,再处理短暂故障

状态或现象常见原因处理
400字段不兼容、JSON 错误、上下文超限回到最小请求,检查响应错误体后逐项恢复字段
401 / 403Key、认证头、账户或分组权限错误修正凭证与权限;不要直接循环重试
404路径、模型名或协议标签不匹配核对完整 URL、精确模型 ID 与 openai 标签
429额度、余额、并发或上游限流先检查账户状态,再有限指数退避并降低并发
5xx平台或上游短暂异常记录脱敏请求标识,对可安全重放的文本请求有限重试
流中断网络、代理、超时或上游中断保留已接收文本并标记不完整,不把半截回答当成成功

日志可以记录模型名、端点、状态码、耗时、重试次数和脱敏请求 ID,但不得记录 Authorization 头、完整用户隐私内容或第三方签名 URL。

Acceptance

从最小请求到生产接入

  1. 01确认模型与标签

    复制 MODEL_NAME,确认端点标签为 openai

  2. 02执行受控最小请求

    使用专用低额度 Key,验证状态码、JSON 类型和非空文本。

  3. 03验证 SSE

    确认增量顺序、结束标记、取消和中断状态都被正确处理。

  4. 04验证上下文

    连续追问时保留角色顺序,并在接近上限前裁剪或摘要。

  5. 05上线保护

    增加超时、有限重试、并发控制、日志脱敏和成本监控。

证据要求只有完成实际请求并保留脱敏结果后,才能把某个具体模型标记为“接入实测通过”。本页当前仍为 E1 + E2 指南。

Next Guide

为对话加入图片输入

视觉请求需要额外确认模型能力、消息结构、MIME 类型和隐私边界。