Если код написан под OpenAI SDK, провайдера обычно можно сменить одной строкой. Ниже: что при этом меняется, что остаётся прежним и где переезд чаще всего спотыкается.
Что меняется
Заменить нужно только базовый адрес и ключ:
from openai import OpenAI
client = OpenAI(
base_url="https://api.codexkey.ru/v1",
api_key="sk_cdx_ваш_ключ",
)
Всё остальное остаётся как было: методы, структура сообщений, обработка стрима, разбор ответа.
Что не меняется
Формат сообщений с ролями, температура и максимум токенов, стриминг через server-sent events, структура ответа с массивом вариантов. Библиотеки, написанные под OpenAI, продолжают работать.
Где обычно ломается
Имя модели. У провайдеров идентификаторы разные. На этом переезд срывается чаще всего, зато ошибка всегда понятная: код 400.
Параметры, которых нет. Часть специфичных полей поддерживается не везде. Если вы использовали что-то экзотическое, проверьте это отдельно.
Домен, зашитый в код. Бывает, что базовый адрес лежит не в конфиге, а прописан прямо в коде, и не в одном месте. Прежде чем радоваться, прогоните по проекту grep на api.openai.com.
Проверка за две минуты
Быстрее всего убедиться, что связь есть, так:
curl https://api.codexkey.ru/v1/chat/completions \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"скажи ok"}]}'
Если пришёл ответ, дальше сломаться могут только имена моделей и специфичные параметры.
Почему это важно при выборе провайдера
Совместимость работает в обе стороны: к провайдеру легко прийти и так же легко от него уйти. Тот, кто заставляет переписывать код под свой формат, держит вас стоимостью смены, а не качеством.
Поэтому мы держим оба формата на одном эндпоинте codexkey: Anthropic Messages и OpenAI Chat Completions. Код, написанный под него, работает и с другими провайдерами.
Коротко
Меняете базовый адрес и ключ, потом проверяете имена моделей. Если код написан под стандартный SDK, переезд занимает минуты, а не спринт.