RU ▾
Начать сейчас
за 1M входных токенов
$0,15
Выходные токены / 1M
$0,50
контекстное окно
100 000
пробный баланс
$0,50
запросов в минуту
300

Замена API OpenAI: чек-лист миграции

Замена API OpenAI работает гладко, только если сначала проверить три вещи: какие эндпоинты использует ваш код, какие функции он применяет и как новая модель ведет себя на ваших промптах. Этот чек-лист охватывает все три пункта с командами, которые можно запустить уже сегодня.

Последнее обновление

Стеклянная труба, перенаправленная между двумя клапанами на фоне панели с горящими и погасшими индикаторами

Итоги

  • Чат-завершения, ответы, потоковая передача, инструменты и JSON-режим работают со стандартным SDK OpenAI после изменения базового URL.
  • Эндпоинты эмбеддингов, изображений, аудио и дообучения недоступны. Оставьте их у текущего провайдера.
  • Модель другая, поэтому протестируйте промпты перед полным переключением. Оставьте флаг для возврата.
  • Биллинг — предоплата за каждый токен: $0,15 за 1 млн входных токенов и $0,50 за 1 млн выходных токенов.

Шаг 1: инвентаризация вызовов вашего кода

Прежде чем что-то менять, перечислите функции OpenAI, которые вы действительно используете. Большинство проектов используют меньше, чем думают, и этот список определяет, будет ли замена задачей на пять минут или частичной. Запустите эти команды из корня проекта:

# New values you will point the project at:
export OPENAI_BASE_URL="https://api.alternativeapiopenai.com/v1"
export OPENAI_API_KEY="YOUR_API_KEY"
export MODEL="uncensored"

# What does the code call today?
grep -rnE "embeddings|images\.|audio\.|fine_tuning|moderations|assistants|batches" --include="*.py" --include="*.js" --include="*.ts" .
grep -rnE "model *[=:] *['\"]" --include="*.py" --include="*.js" --include="*.ts" .

Первый grep находит эндпоинты, которые не предлагает этот API. Второй выводит все жестко заданные имена моделей, которые вам нужно изменить. Поместите результаты в короткую таблицу с одной строкой на каждую функцию: используется, не используется и что с этим делать.

Шаг 2: сравнение с поддерживаемыми функциями

Функция OpenAIЗдесьПримечания
Завершение диалогаДаPOST /v1/chat/completions
API ответовДаPOST /v1/responses
Список моделейДаGET /v1/models возвращает uncensored
Потоковая передачаДаSSE, с данными об использовании в конце
Вызов функцийДаtools, tool_choice, потоковые tool_calls, role: "tool" результаты
JSON-режимДаresponse_format: {"type":"json_object"}
Параметры сэмплированияДаtemperature, top_p, stop, seed, штрафы
Векторные представленияНетНе предлагается
Генерация изображений, аудио, видеоНетТолько текст
ДообучениеНетНе предлагается

Всё, что не указано в поддерживаемых функциях этой таблицы, следует считать недоступным, пока вы не подтвердите это в документации. Это включает вывод с ограниченной схемой: JSON-режим заставляет модель возвращать корректный JSON, но не гарантирует вашу схему, поэтому оставьте код валидации. Ввод изображений в сообщение чата также не указан, поэтому рассчитывайте только на текстовые промпты.

Модель — это единственная модель с открытыми весами от независимого провайдера. Это не модель OpenAI и не официальный API какого-либо вендора, она не маршрутизирует запросы между вендорами. Ожидайте другой стиль, другие сильные стороны и другие режимы сбоев.

Шаг 3: внесение изменений

С официальным Python SDK меняются три значения:

from openai import OpenAI

client = OpenAI(
    base_url="https://api.alternativeapiopenai.com/v1",  # was the default OpenAI URL
    api_key="YOUR_API_KEY",                               # was your old key
)

resp = client.chat.completions.create(
    model="uncensored",                                   # was your old model name
    messages=[{"role": "user", "content": "Give me three names for a coffee shop."}],
)
print(resp.choices[0].message.content)

Лучше всего сохранить базовый URL, ключ и имя модели в конфигурации, чтобы одна сборка могла указывать на любого из этих провайдеров. Простой паттерн — три переменные окружения: LLM_BASE_URL, LLM_API_KEY и LLM_MODEL. Тогда откат означает изменение трех значений и перезапуск, а не выпуск нового релиза.

Если ваш код использует API ответов, применяются те же три значения. Для фреймворков вроде LangChain или LlamaIndex найдите OpenAI-совместимый коннектор и передайте тот же базовый URL и имя модели.

Шаг 4: тестирование перед продакшеном

Риск при любой замене модели — поведение, а не подключение. Протестируйте их в следующем порядке:

  1. Подключение. Один запрос через curl. Если он возвращает ответ, ключ и URL верны.
  2. Ваши реальные промпты. Повторите минимум двадцать производственных промптов и оцените вывод. Проверьте тон, длину и следование инструкциям.
  3. Вызовы инструментов. Запустите каждый из ваших инструментов и проверьте аргументы, которые генерирует модель. Убедитесь, что ваш цикл обрабатывает tool_calls в потоковом ответе.
  4. Вывод в формате JSON. Выполните сто вызовов в JSON-режиме и посчитайте, сколько из них не прошли парсер или схему.
  5. Длинные входы. Контекстное окно составляет 100 000 токенов для промпта плюс ответ. Протестируйте большой промпт один раз, чтобы узнать, сколько времени это занимает.
  6. Лимиты. Полный ключ позволяет 8 параллельных запросов и 300 в минуту. Проведите нагрузочное тестирование при вашей реальной пиковой нагрузке.

Количество токенов будет отличаться

Если ваш код оценивает количество токенов с помощью библиотеки токенизатора, созданной для другой модели, считайте результат приблизительным. Используйте объект usage в каждом ответе для выставления счетов и планирования бюджета, а при сокращении истории для размещения в 100 000-токенном контекстном окне оставляйте запас. Установка max_tokens здесь необязательна, но разумный лимит предотвратит неконтролируемый ответ, который потратит больше, чем вы планировали.

Как выглядят ошибки

При превышении лимита API возвращает HTTP 429 с кодом rate_limited (запросов в минуту) или concurrency (слишком много одновременно). Временная перегрузка также возвращает 429 с заголовком Retry-After: 5. Потоковый запрос удерживает слот параллельности до завершения потока, поэтому медленные клиенты потребляют ваш лимит. Отказанные или отклонённые запросы не тарифицируются.

Шаг 5: проверка стоимости

Цена составляет $0,15 за 1M входных токенов и $0,50 за 1M выходных токенов, оплачивается из предоплаченного баланса. Чтобы сравнить со счетом, используйте свое количество токенов из поля usage и примените формулу: cost = input_tokens x 0,15 / 1 000 000 + output_tokens x 0,50 / 1 000 000. Для других провайдеров проверьте их текущие тарифы и подставьте те же количества.

Пример расчёта: инструмент поддержки обрабатывает 30 000 запросов в месяц, каждый из которых содержит 1 200 входных и 250 выходных токенов. Входные данные составляют 36 млн токенов, что стоит $5,40. Выходные данные — 7,5 млн токенов, что стоит $3,75. Итоговая месячная стоимость — $9,15. Если та же нагрузка заполняет контекстное окно, то при 100 000 входных токенов каждый запрос стоит $0,015 только за входные данные, поэтому размер промпта — это то, на что нужно обратить внимание.

Страница тарифов перечисляет суммы пополнения. Они варьируются от $20 до $500, с +5% от $50, +10% от $100 и +15% от $200, оплата только криптовалютой (USDT на TRC20 или USDC на Base). Баланс не сгорает, подписки нет. Руководство по тарифам API для моделей без цензуры объясняет структуру затрат более подробно.

Шаг 6: разверните и сохраните возможность отката

Сначала направьте небольшую долю трафика на новый эндпоинт. Записывайте ID запроса из заголовка X-Request-Id, чтобы можно было отследить ошибочный ответ, и фиксируйте значение X-Balance-USD после вызовов, чтобы кредит не закончился незаметно. Уведомляйте, когда баланс упадёт ниже уровня расходов за несколько дней.

Когда тестовый трафик показывает хорошие результаты, увеличивайте его долю поэтапно и сохраняйте ключ старого провайдера действительным в течение недели. Для любого контента, связанного с взрослой тематикой, модель предназначена для законного использования взрослыми, а контент сексуального характера с участием несовершеннолетних всегда блокируется. Промпты не используются для обучения.

Новые аккаунты могут активировать $0,50 пробного баланса одним нажатием на странице API-ключ, срок действия — 7 дней, чего достаточно, чтобы пройти весь чек-лист на выборке вашего трафика.

Часто задаваемые вопросы

Будет ли работать мой существующий код на OpenAI SDK?

Для chat completions и ответов — да. Измените базовый URL, ключ и имя модели. Вызовы для эмбеддингов, изображений, аудио или дообучения не будут работать.

Качество ответов такое же, как у моделей OpenAI?

Нет, это другая модель с открытыми весами. Протестируйте свои собственные промпты, вместо того чтобы предполагать паритет в любом направлении.

Как откатиться, если что-то сломается?

Сохраните базовый URL, ключ и модель в конфигурации и оставьте ключ старого провайдера активным. Возврат к старому провайдеру тогда будет просто изменением конфигурации.

Поддерживает ли он вызов функций?

Да. Используйте инструменты и tool_choice, и возвращайте результаты в виде сообщений с ролью tool. Поддерживается потоковая передача tool_calls.

Генерация ключа требует только формы

Зарегистрируйтесь, скопируйте свой ключ и обновите базовый URL. Это вся необходимая конфигурация.