常见误区

新用户最常踩的 10 个坑。看一眼能省几小时排障。

1. base_url 末尾漏了 /v1

OpenAI SDK 会自动拼 /chat/completions。如果 base_url 是http://router.swarmixtoken.com(漏了 v1),SDK 会去请求 http://router.swarmixtoken.com/chat/completions → 404。
正确http://router.swarmixtoken.com/v1

2. 把 OpenAI 和 Swarmix 的 Key 搞混

我们的 Key 以 sk-swx- 开头,不是 sk-。如果你不小心把 OpenAI 的sk-xxx 填进来,会 401 Invalid API Key。

3. 在浏览器里直接调用 API

永远不要sk-swx-* 放进前端 JS 代码。任何访问你网页的人都能 F12 看到它,然后全球薅你余额。
正确做法:前端 → 你的后端服务器 → Swarmix。后端代理转发时校验用户身份。

4. 一把 Key 走天下

生产 / 测试 / 本地开发各用一把独立 Key:

  • 泄露时可以精准吊销受影响的
  • 用量统计能按 Key 拆分(看清是哪个业务在花钱)
  • 可以给不同 Key 设不同的模型权限 / RPM 上限

5. 不处理 429 直接重试

RPM 触发时无脑循环重试只会让所有请求一起等。必须:

python
# 错误
while True:
    try:
        resp = client.chat.completions.create(...)
        break
    except RateLimitError:
        continue  # ❌ 马上再试,还是 429

# 正确
import time, random
for attempt in range(4):
    try:
        resp = client.chat.completions.create(...)
        break
    except RateLimitError as e:
        retry = int(e.response.headers.get("retry-after", 1))
        time.sleep(retry + random.uniform(0, 0.5))  # ✓ 退避

6. max_tokens 设得太大 → 预扣"冻"掉所有余额

Swarmix 按 max_tokens 做最坏情况预扣。如果你 max_tokens=100000, 就算实际只用 500 token,也会在请求进行中把高额冻结掉,并行的其他请求可能余额"不够"被拒。

建议max_tokens 按业务实际上限设(比如"一段摘要"设 500 够了)。

7. 以为 stream=true 就一定实时

流式只是渐进式返回,**不是**秒级响应。TTFT(首 token 时间)取决于上游:

  • aliyun/qwen-turbo / aliyun/deepseek-r1:200-500ms
  • aliyun/qwen-max:500ms - 2s
  • deepseek-reasoner:5-15s(先思考后输出)

8. tools / function_call 用老版本语法

Qwen / DeepSeek / Hunyuan 都走 OpenAI 的**新版** tools 格式,不是老版的functions。如果你用了老版代码:

python
# ❌ 老版(OpenAI 2023 前)
response = client.chat.completions.create(
    functions=[...],
    function_call="auto",
)

# ✓ 新版
response = client.chat.completions.create(
    tools=[{"type": "function", "function": {...}}],
    tool_choice="auto",
)

9. stream 响应不读 usage chunk

默认流式响应不包含 usage。需要显式开启:

python
stream = client.chat.completions.create(
    ...
    stream=True,
    stream_options={"include_usage": True},  # ← 加这行
)
# 循环到最后一个 chunk,choices 为空,usage 字段有值

10. 以为 OpenAI / Claude 模型名一定可用

Swarmix 的公开调用以 GET /v1/models 返回的模型 ID 为准。gpt-4oclaude-3-5-sonnet 这类名称只有在当前部署显式配置了 public alias 时才可用,不应假设一定会自动映射到某个国产模型。

如果你需要确定性路由:直接传模型列表里展示的原生模型名 (例如 aliyun/qwen-max / aliyun/deepseek-r1 等)。