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