玄枢API

OpenAI SDK 迁移结论

迁移需要修改 Base URL 与 API Key,并核对模型、流式、错误重试和回滚;这不是 100% 无缝替换。

最后验证日期:

连接与鉴权

统一 OpenAI 兼容 Base URL: https://www.xuanshuapi.com/v1

OpenAI 兼容接口使用 Authorization: Bearer <YOUR_API_KEY>;Claude Messages 也支持 x-api-key: <YOUR_API_KEY>;Gemini v1beta 使用 x-goog-api-key: <YOUR_API_KEY>。

export OPENAI_API_KEY="<YOUR_API_KEY>"
export OPENAI_BASE_URL="https://www.xuanshuapi.com/v1"

OpenAI SDK 迁移结论

玄枢API 提供 OpenAI 兼容接口,但并非 100% 无缝:模型、参数、错误与流式事件可能存在差异,应先灰度验证。

并非每个模型都支持相同参数,请先查询 Models。

1. 保存配置并切换 Base URL 与 API Key

先保留原配置,再使用独立的 XUANSHU_API_KEY 与 XUANSHU_MODEL 做灰度验证。

export ORIGINAL_OPENAI_BASE_URL="${OPENAI_BASE_URL:-https://api.openai.com/v1}"
export ORIGINAL_OPENAI_API_KEY="<YOUR_ORIGINAL_KEY>"
export XUANSHU_API_KEY="<YOUR_API_KEY>"
export XUANSHU_MODEL="<MODEL_FROM_MODELS>"

2. Python 初始化与实际请求

安装 openai 包后运行以下最小 Chat Completions 请求。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["XUANSHU_API_KEY"],
    base_url="https://www.xuanshuapi.com/v1",
)
response = client.chat.completions.create(
    model=os.environ["XUANSHU_MODEL"],
    messages=[{"role": "user", "content": "Reply with OK"}],
)
print(response.choices[0].message.content)

3. JavaScript 初始化与实际请求

安装 openai 包后运行以下 ESM 示例。

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.XUANSHU_API_KEY,
  baseURL: "https://www.xuanshuapi.com/v1",
});
const response = await client.chat.completions.create({
  model: process.env.XUANSHU_MODEL,
  messages: [{ role: "user", content: "Reply with OK" }],
});
console.log(response.choices[0].message.content);

4. 发现并验证模型列表

先查询当前 Key 可见模型,把返回的模型 ID 写入 XUANSHU_MODEL,再运行 SDK 示例。

curl https://www.xuanshuapi.com/v1/models \
  -H "Authorization: Bearer <YOUR_API_KEY>"

5. 验证流式输出

流式调用要逐块消费并处理空增量、超时和中断;先确认非流式请求成功。

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.XUANSHU_API_KEY,
  baseURL: "https://www.xuanshuapi.com/v1",
});
const stream = await client.chat.completions.create({
  model: process.env.XUANSHU_MODEL,
  messages: [{ role: "user", content: "Count to three" }],
  stream: true,
});
for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

6. 错误处理与有限重试

401/403 不应自动重试;仅对 429、超时和可恢复 5xx 使用有上限的指数退避。

import os
import random
import time
from openai import APIConnectionError, APIStatusError, APITimeoutError, OpenAI, RateLimitError

client = OpenAI(
    api_key=os.environ["XUANSHU_API_KEY"],
    base_url="https://www.xuanshuapi.com/v1",
    max_retries=0,
)

for attempt in range(4):
    try:
        response = client.chat.completions.create(
            model=os.environ["XUANSHU_MODEL"],
            messages=[{"role": "user", "content": "Reply with OK"}],
        )
        break
    except RateLimitError:
        if attempt == 3:
            raise
        time.sleep((2 ** attempt) + random.random())
    except (APITimeoutError, APIConnectionError):
        if attempt == 3:
            raise
        time.sleep((2 ** attempt) + random.random())
    except APIStatusError as error:
        if error.status_code < 500 or attempt == 3:
            raise
        time.sleep((2 ** attempt) + random.random())

print(response.choices[0].message.content)

7. 回滚

保留官方端点和原 Key 的独立引用;验证失败时恢复原环境变量并核对迁移期间用量。

export ORIGINAL_OPENAI_BASE_URL="https://api.openai.com/v1"
export ORIGINAL_OPENAI_API_KEY="<YOUR_ORIGINAL_KEY>"

# Roll back
export OPENAI_BASE_URL="$ORIGINAL_OPENAI_BASE_URL"
export OPENAI_API_KEY="$ORIGINAL_OPENAI_API_KEY"
unset XUANSHU_API_KEY XUANSHU_MODEL