XuanShu API

Вывод по миграции OpenAI SDK

Для миграции измените Base URL и API Key, затем проверьте список моделей, streaming, ошибки, повторы и откат; это не 100% бесшовная замена.

Последняя проверка:

Подключение и аутентификация

Единый OpenAI-совместимый Base URL: https://www.xuanshuapi.com/v1

OpenAI-совместимые API используют 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

XuanShu API предоставляет OpenAI-совместимые endpoints, но это не 100% бесшовная замена: модели, параметры, ошибки и streaming-события могут различаться, поэтому проверяйте постепенно.

Не все модели поддерживают одинаковые параметры; сначала запросите 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. Найдите и проверьте список моделей

Запросите модели текущего ключа, запишите полученный model ID в XUANSHU_MODEL и запустите SDK-примеры.

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

5. Проверьте streaming

Обрабатывайте каждый chunk, пустые deltas, таймауты и разрывы; сначала проверьте обычный запрос.

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. Ограниченный exponential backoff применяйте только для 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. Откат

Сохраните отдельные ссылки на официальный endpoint и исходный ключ; восстановите их после неудачной проверки и сверьте расход миграции.

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