Scope & Evidence
先确认协议,不根据模型名称猜测
本教程面向 OpenAI 官方 SDK。只有模型广场显示对应端点标签时,才应使用相应调用方法。模型名称包含厂商名或“Codex”并不能代替端点标签。
openai 与 openai-response 端点标签;具体模型与标签会动态调整。OpenAI SDK Guide
使用 OpenAI 官方 Python 或 Node.js SDK 调用 MuxLLM 的 OpenAI 兼容端点。先从模型广场确认端点标签,再选择 Chat Completions 或 Responses 请求方式。
Scope & Evidence
本教程面向 OpenAI 官方 SDK。只有模型广场显示对应端点标签时,才应使用相应调用方法。模型名称包含厂商名或“Codex”并不能代替端点标签。
openai 与 openai-response 端点标签;具体模型与标签会动态调整。Endpoint Selection
| 模型端点标签 | SDK 方法 | 核心输入 | 读取文本 |
|---|---|---|---|
| openai | client.chat.completions.create() | messages | choices[0].message.content |
| openai-response | client.responses.create() | input | output_text |
两种方法的请求和响应结构不同。若模型只有 openai,不要把 Chat 示例的路径或字段机械替换为 Responses;反向也同样如此。
Credentials
先在 MuxLLM 控制台创建独立 API Key,并为测试 Key 设置合理额度。示例使用专用变量名,避免与其他站点的 Key 混用。
export MUXLLM_API_KEY="YOUR_API_KEY"
export MUXLLM_MODEL="MODEL_NAME"
export MUXLLM_BASE_URL="https://api.muxllm.com/v1"
$env:MUXLLM_API_KEY = "YOUR_API_KEY"
$env:MUXLLM_MODEL = "MODEL_NAME"
$env:MUXLLM_BASE_URL = "https://api.muxllm.com/v1"
.env、本地配置和调试日志加入忽略规则。前端网页、移动端安装包和公开仓库都不是保存长期 API Key 的安全位置。Python
建议在项目虚拟环境中安装 SDK。升级依赖前先检查项目锁文件和兼容范围。
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade openai
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MUXLLM_API_KEY"],
base_url=os.getenv("MUXLLM_BASE_URL", "https://api.muxllm.com/v1"),
)
response = client.chat.completions.create(
model=os.environ["MUXLLM_MODEL"],
messages=[
{"role": "system", "content": "你是一个严谨的技术助手。"},
{"role": "user", "content": "用三点说明 API 网关的作用。"},
],
)
text = response.choices[0].message.content
print(text)
若代码报缺少环境变量,先确认变量已在启动 Python 的同一终端或进程环境中设置;不要为了绕过错误而把真实 Key 硬编码进文件。
Python Streaming
设置 stream=True 后,返回值是可迭代流。每个块不一定都有文本,客户端必须跳过空增量,并在异常时保留“输出可能不完整”的状态。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MUXLLM_API_KEY"],
base_url=os.getenv("MUXLLM_BASE_URL", "https://api.muxllm.com/v1"),
)
stream = client.chat.completions.create(
model=os.environ["MUXLLM_MODEL"],
messages=[{"role": "user", "content": "分步骤解释指数退避。"}],
stream=True,
)
parts = []
for chunk in stream:
if not chunk.choices:
continue
delta = chunk.choices[0].delta.content
if delta:
parts.append(delta)
print(delta, end="", flush=True)
print()
complete_text = "".join(parts)
Node.js
以下示例使用 ESM。项目需在 package.json 中启用 "type": "module",或把文件扩展名改为 .mjs。
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MUXLLM_API_KEY,
baseURL: process.env.MUXLLM_BASE_URL || "https://api.muxllm.com/v1",
});
const response = await client.chat.completions.create({
model: process.env.MUXLLM_MODEL,
messages: [
{ role: "system", content: "你是一个严谨的技术助手。" },
{ role: "user", content: "用三点说明 API 网关的作用。" },
],
});
console.log(response.choices[0].message.content);
Node.js Streaming
不要假设一次网络块正好对应一个完整字符或句子。把增量按顺序拼接,并在界面层对异常中断、取消和重复渲染进行处理。
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MUXLLM_API_KEY,
baseURL: process.env.MUXLLM_BASE_URL || "https://api.muxllm.com/v1",
});
const stream = await client.chat.completions.create({
model: process.env.MUXLLM_MODEL,
messages: [{ role: "user", content: "分步骤解释指数退避。" }],
stream: true,
});
const parts = [];
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta?.content;
if (!delta) continue;
parts.push(delta);
process.stdout.write(delta);
}
process.stdout.write("\n");
const completeText = parts.join("");
Responses API
当模型广场明确显示 openai-response 时,可使用 SDK 的 Responses 方法。它不是 Chat Completions 的别名。
| 语言 | 最小调用 | 文本结果 |
|---|---|---|
| Python | client.responses.create(model=..., input=...) | response.output_text |
| Node.js | client.responses.create({ model, input }) | response.output_text |
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["MUXLLM_API_KEY"],
base_url="https://api.muxllm.com/v1",
)
response = client.responses.create(
model=os.environ["MUXLLM_MODEL"],
input="列出定位 401 错误的三个检查项。",
)
print(response.output_text)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.MUXLLM_API_KEY,
baseURL: "https://api.muxllm.com/v1",
});
const response = await client.responses.create({
model: process.env.MUXLLM_MODEL,
input: "列出定位 401 错误的三个检查项。",
});
console.log(response.output_text);
Reliability
SDK 的默认行为可能随版本调整。首次 E3 验收应显式禁用自动重试;生产环境只有在确认请求可安全重放、费用可控且有幂等策略时,才单独设定有限重试。
OpenAI(..., timeout=30.0, max_retries=0)new OpenAI({ ..., timeout: 30_000, maxRetries: 0 })Error Handling
from openai import APIConnectionError, APIStatusError, RateLimitError
try:
response = client.chat.completions.create(
model=os.environ["MUXLLM_MODEL"],
messages=[{"role": "user", "content": "健康检查"}],
)
except RateLimitError as exc:
print("请求受限:检查余额、额度与并发", exc.status_code)
except APIConnectionError:
print("连接失败:检查 DNS、代理、TLS 与超时")
except APIStatusError as exc:
print("API 返回错误", exc.status_code, exc.request_id)
raise
try {
const response = await client.chat.completions.create({
model: process.env.MUXLLM_MODEL,
messages: [{ role: "user", content: "健康检查" }],
});
console.log(response.choices[0].message.content);
} catch (error) {
if (error instanceof OpenAI.APIError) {
console.error("API 错误", {
status: error.status,
requestId: error.request_id,
name: error.name,
});
} else {
console.error("本地或网络错误", error);
}
}
| 现象 | 优先检查 | 动作 |
|---|---|---|
| 401 / 403 | Key、认证头、账户和分组权限 | 更换为本站独立 Key;不要无条件重试 |
| 404 | Base URL、模型名、端点标签 | 确认没有重复拼接 /v1,再核对协议 |
| 400 | 请求字段和模型专属参数 | 从最小请求开始逐项恢复可选字段 |
| 429 | 余额、额度、并发和上游限制 | 降低并发并采用有上限的指数退避 |
| 连接中断 | 代理、DNS、TLS、超时 | 保留错误上下文;流式结果标记为不完整 |
Official Sources
Acceptance
从模型广场复制 MODEL_NAME,确认使用 openai 或 openai-response。
创建本站专用低额度 Key,并只通过进程环境变量加载。
先不添加温度、工具或媒体字段,确认能读取非空文本。
确认流能正常结束,并对 401、429 与网络超时给出可观测错误。
逐项增加可选参数、日志脱敏、重试上限和监控。
Next Guide
SDK 最小示例通过后,再学习字段、SSE 事件、多轮上下文和停止原因。