Wu Xianzhi APIРуководство по миграции
Руководство по миграции с API-прокси: переход с OpenAI и OpenRouter на API без цензуры
Если ваш проект использует OpenAI, OpenRouter или API-прокси, а вы хотите перейти на API без цензуры, который не блокирует легитимные запросы, достаточно изменить три параметра: base_url, ключ и имя модели. В этой статье мы сначала разберём разницу между API-прокси и выделенной безцензурной моделью, затем приведём таблицу соответствия параметров, пример параллельного запуска через переменные окружения, чек-лист миграции и самые распространённые ошибки.
Обновлено
Ключевые моменты
- Прокси-провайдеры перепродают модели от оригинальных разработчиков, поэтому политика модерации не меняется; только специализированная модель без цензуры решает проблему отказов
- Для миграции измените три параметра: base_url на https://api.wuxianzhiapi.com/v1,密钥,模型名 uncensored
- Не поддерживаются embeddings, изображения, аудио и дообучение — используйте для них старые сервисы
- Используйте переменные окружения для постепенного переключения; при проблемах достаточно изменить одну переменную для отката
В чём разница между API-прокси и выделенной безцензурной моделью
Сначала разберитесь в концепции, чтобы не ошибиться при миграции. Типичный API-маршрутизатор по сути перепродает или агрегирует квоты на вызов моделей крупных вендоров, предоставляя вам OpenAI-совместимую конечную точку, чтобы вы могли переключаться между моделями с помощью одного SDK. Он решает вопрос «доступа и оплаты», например, предоставляя единый вход и единый счет, но сама модель остается прежней, и политика контента оригинального вендора не меняется: темы, которые нужно блокировать, будут заблокированы, и смена маршрутизатора это не изменит.
Выделенная безцензурная модель — это совсем другое. Это не перенаправление чужих моделей, а отдельная модель, которая не блокирует легитимный контент для взрослых, художественные тексты и спорные темы. Wu Xianzhi API предоставляет только одну модель с именем uncensored. Интерфейс совместим с OpenAI, поэтому миграция обходится дёшево, но у модели есть чёткие границы: она работает только с текстом, не поддерживает изображения, аудио, векторы и дообучение. Сексуальный контент с участием несовершеннолетних блокируется (код 403), даже если он вымышленный.
Поэтому перед миграцией спросите себя: ваша проблема в нестабильности интерфейса или высокой цене, или в том, что модель постоянно отказывает в легитимных запросах? Если второе, смена прокси мало что даст — вам нужен специализированный API без цензуры. Многие команды используют оба варианта: для общих задач оставляют старый API, а запросы, требующие вывода без цензуры, маршрутизируют сюда. Ниже мы расскажем, как это реализовать.
Что нужно изменить при миграции с OpenAI или OpenRouter
Если вы используете OpenAI, OpenRouter или шлюз, а код совместим с OpenAI SDK, измените три вещи: base_url на https://api.wuxianzhiapi.com/v1; api_key на ключ с /get-api-key/; model на uncensored. Других моделей нет, в GET /v1/models только одна.
import os
from openai import OpenAI
messages = [{"role": "user", "content": "你好"}]
# 迁移前(示意):
# client = OpenAI(api_key=os.environ["OLD_API_KEY"], base_url="旧地址")
# resp = client.chat.completions.create(model="旧模型名", messages=messages)
# 迁移后:只动 base_url、api_key、model 这三处
client = OpenAI(
base_url="https://api.wuxianzhiapi.com/v1",
api_key=os.environ["WUXIANZHI_API_KEY"],
)
resp = client.chat.completions.create(model="uncensored", messages=messages, max_tokens=100)
print(resp.choices[0].message.content)В Node.js аналогичным образом замените new OpenAI({...}) на параметры baseURL и apiKey. Если в вашем проекте используются прямые HTTP-запросы, измените адрес запроса на https://api.wuxianzhiapi.com/v1/chat/completions, а заголовок запроса оставьте как Authorization: Bearer <ключ>. Полные примеры на Python, Node.js и cURL см. в разделе код.
curl https://api.wuxianzhiapi.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WUXIANZHI_API_KEY" \
-d '{"model":"uncensored","messages":[{"role":"user","content":"你好"}],"max_tokens":50}'
Сравнение параметров: что работает, а что нет
В таблице ниже мы разобрали поля, с которыми чаще всего сталкиваются при миграции. Правило простое: все поля, связанные с диалогом и форматом OpenAI, работают как обычно. Функции, зависящие от других моделей или мультимодальности, здесь отсутствуют.
| Как использовалось раньше | Как обрабатывать здесь |
|---|---|
model (например, различные модели gpt) | Обязательно замените на uncensored |
messages (system / user / assistant / tool) | Формат совпадает, используйте напрямую |
max_tokens | По умолчанию 2048, максимум 32 000; при превышении вернется ошибка 400 |
stream: true | Поддерживается, в конце автоматически добавляется блок с метриками |
tools / tool_choice | Поддерживается, формат OpenAI |
| Длина контекста | Сумма промпта и ответа — 100 000 токенов |
| Размер тела запроса | Не более 8 МБ |
| Лимит запросов | 300 запросов в минуту на каждый ключ |
| Векторные встраивания (embeddings) | Не поддерживается |
| Генерация изображений, распознавание изображений, аудио, видео | Не поддерживается, обработка только текста |
| Дообучение (fine-tuning) | Не поддерживается |
| Переключение между несколькими моделями | Доступна только одна модель, список для переключения отсутствует |
Не предполагайте, что дополнительные поля, не указанные в таблице, будут работать так же, как у оригинального провайдера. Надёжный подход — протестировать их отдельно в тестовой среде и убедиться, что поведение соответствует ожиданиям, перед запуском в продакшн. Конкретная поддержка зависит от документации по API.
Что делать, если нет нужных возможностей: альтернативы для векторов, изображений и аудио
Если ваш проект одновременно использует диалог и векторный поиск, при миграции не стоит пытаться перенести всё сразу. Здесь доступна только текстовая генерация, поэтому код, связанный с эмбеддингами (например, поиск по базе знаний или семантическое удаление дубликатов), следует продолжать использовать с вашим текущим векторным сервисом или перейти на собственное развёрнутое векторное решение. Перенесите на новую платформу только диалоговую часть, оставив поиск на месте — это самый простой вариант разделения, при котором обе части не влияют друг на друга.
То же самое относится к изображениям и аудио. Если ваше приложение генерирует текст с изображениями, текстовую генерацию можно направить сюда, а для изображений продолжать использовать старый API. Для озвучки текста генерируйте текст, а затем передавайте его в ваш существующий голосовой сервис. Выделите генерацию текста в отдельную функцию — тогда масштабирование и добавление других возможностей потребуют минимальных изменений.
Ещё один сценарий: в вашем коде несколько моделей выполняют разные задачи (например, дешёвая модель классифицирует, а дорогая — генерирует контент). Здесь доступна только одна модель, поэтому классификацию также будет выполнять она. К счастью, цена входа составляет $0,25 за миллион токенов, и для задач с коротким выводом (таких как классификация) стоимость очень низкая. Установите для max_tokens небольшое значение, и затраты будут практически нулевыми. Подробности о ценах см. на странице с ценами.
Параллельный запуск: переключение между двумя API через переменные окружения
Самый большой риск при миграции — «переломить всё сразу». Более надёжный подход — создать в коде тонкую обёртку, которая через переменные окружения определяет, какой API использовать. Это позволит сначала направить небольшой объём трафика или отдельные функции на новый API, а в случае проблем откатиться, изменив всего одну переменную. Поскольку оба API используют формат, совместимый с OpenAI, обёртка реализуется очень просто.
import os
from openai import OpenAI
PROVIDERS = {
"old": {
"base_url": os.environ.get("OLD_BASE_URL", ""),
"api_key": os.environ.get("OLD_API_KEY", ""),
"model": os.environ.get("OLD_MODEL", ""),
},
"wuxianzhi": {
"base_url": "https://api.wuxianzhiapi.com/v1",
"api_key": os.environ.get("WUXIANZHI_API_KEY", ""),
"model": "uncensored",
},
}
def get_client(name=None):
name = name or os.environ.get("LLM_PROVIDER", "old")
cfg = PROVIDERS[name]
return OpenAI(base_url=cfg["base_url"], api_key=cfg["api_key"]), cfg["model"]
def chat(messages, provider=None, **kwargs):
client, model = get_client(provider)
return client.chat.completions.create(model=model, messages=messages, **kwargs)
# 通用任务走旧接口,需要无审查输出的请求显式指定新接口
resp = chat([{"role": "user", "content": "写一个黑色幽默的短故事"}],
provider="wuxianzhi", max_tokens=800)
print(resp.choices[0].message.content)Гранулярность переключения может быть трёх уровней: по среде (сначала переключить тестовую среду), по функциям (перенести только API генерации контента) или по пользователям (перевести на новый API часть аккаунтов). На любом уровне рекомендуется сохранять в логах поле provider, чтобы при возникновении расхождений можно было провести сравнительный анализ. Также рекомендуется хранить историю диалога в виде стандартного массива messages — это позволит бесшовно продолжать тот же диалог на обеих платформах.
Чек-лист миграции
Перед запуском пройдите по следующему списку, чтобы ничего не упустить:
- Зарегистрируйтесь на /get-api-key/, получите ключ и проверьте работу с помощью пробного баланса в $0,50 (действует 7 дней). Предварительное пополнение не требуется.
- Убедитесь, что ключ действителен и сеть доступна, выполнив
curl /v1/models. - Переведите параметры
base_url,api_keyиmodelна управление через переменные окружения, чтобы ключ не хранился в репозитории кода. - Проведите поиск по коду на наличие жёстко заданных имён моделей, значений
max_tokensи вызовов эмбеддингов. - Проверьте код потоковой передачи на совместимость с последним блоком Usage, где
choicesимеет пустой массив. - Добавьте экспоненциальное повторное выполнение запросов для 429 и 503, а также ветвление с явным указанием для 402 и 403.
- Запустите набор регрессионных тестов с вашими реальными промптами, уделив особое внимание тем случаям, которые ранее приводили к отказу в ответе.
- Сначала направьте на новый API малую долю трафика, сравните потребление ресурсов и задержки. Если всё работает корректно, увеличивайте объём.
- Убедитесь, что ваша целевая аудитория — взрослые пользователи, а сфера применения легальна. Это обязательное условие для использования данного API.
Самые частые ошибки при миграции
Забыли сменить имя модели. Если передать в запросе старые имена моделей (например, gpt) или пути к моделям с агрегаторов, вы получите ошибку. Выполните глобальный поиск по имени модели и убедитесь, что в запросах отправляется именно uncensored.
Превышение лимита max_tokens. Некоторые проекты устанавливают для max_tokens значение 32000 или больше, чтобы модель генерировала более длинные тексты. Здесь максимальный лимит на один запрос — 32 000; при превышении возвращается код 400. Кроме того, сумма токенов в промпте и значения max_tokens не должна превышать 100 000 токенов. Для длинных запросов уменьшайте лимит на вывод.
Блок Usage при потоковой передаче. Перед завершением потока сервер автоматически добавляет блок с полем usage, в котором choices — пустой массив. Если ваш код парсинга обращается к chunk.choices[0] напрямую, на последнем шаге возникнет ошибка. В некоторых старых реализациях вручную передавали stream_options для получения Usage; здесь это не требуется.
Путать «без цензуры» с «без ограничений». Легальный контент для взрослых, вымышленные и дискуссионные темы не блокируются, однако контент сексуального характера с участием несовершеннолетних (включая вымышленный и ролевой) всегда блокируется с кодом 403 и content_blocked. Приложение должно самостоятельно обеспечивать проверку возраста пользователей.
Истечение срока действия баланса и пробных средств. Пробные средства действуют 7 дней. После исчерпания баланса вы получите ошибку 402 с кодом no_credit. В приложении переведите эту ошибку в понятное пользователю сообщение, а не пишите общее «Ошибка сервиса». Примеры обработки ошибок см. в статье Сценарии использования.
Часто задаваемые вопросы
Придётся ли переписывать промпты после миграции?
Формат менять не нужно: структура messages полностью совпадает. Можно убрать «джейлбрейк»-подводки, которые использовались для обхода блокировок, и чётко указать роль и задачу. Это экономит токены и повышает стабильность.
Можно ли оставить старый API во время миграции?
Да, это даже рекомендуется. Используйте переменные окружения для управления base_url, ключом и именем модели. Направьте часть функций или пользователей на новый API; в случае проблем откатиться можно, изменив одну переменную.
Что произойдёт, если перенести вызовы эмбеддингов со старого API?
Здесь нет API эмбеддингов, поэтому запрос вернёт 404. Продолжайте использовать старый сервис для векторного поиска, а на новый API направляйте только диалоговые запросы.
Как понять, что после миграции качество улучшилось?
Проведите регрессионное сравнение на наборе реальных промптов, которые ранее приводили к отказам или искажениям. Зафиксируйте процент отказов, длину ответов и количество токенов в поле usage. Образцы должны быть взяты из вашей собственной бизнес-логики, а не из общедоступных тестовых наборов.
Заполните форму, чтобы получить ключ
Создайте аккаунт, скопируйте ключ и измените Base URL. Настройка занимает считанные минуты.
Получить API-ключ