LLM API и интеграция
Codex CLI на своём endpoint: настройка за пять минут
Codex CLI умеет работать не только со штатным доступом: в файле ~/.codex/config.toml описывается произвольный OpenAI-совместимый провайдер — имя, адрес с /v1 на конце и переменная окружения с ключом. Настройка занимает пять минут и три строки конфигурации, после чего тот же привычный интерфейс ходит через ваш ключ и ваш счёт. Спрос на это вырос после объявления об отключении GPT-5.5 в продуктах 14 октября — в API модель при этом остаётся.
Разберём файл по полям, выберем протокол и пройдём по трём ошибкам, на которых обычно спотыкаются. Всё, что ниже, — про настройку клиента, а не про обход чего-либо: механизм штатный и описан в документации самого инструмента.
Зачем это делают
Две причины, и обе практические.
Оплата. Подписка требует карты, которая работает не у всех. Доступ по API оплачивается по факту расхода, и в нашем случае — российской картой в рублях.
Выбор модели. Через свой шлюз доступен весь каталог, а не тот набор, что включён в тариф подписки. Полезно, когда часть задач хочется гонять на дешёвой позиции, а флагман держать на сложном.
Есть и третья, менее очевидная: прозрачность расхода. Подписка показывает лимиты, API показывает токены по каждому запросу.
Как выглядит файл
Минимальная рабочая конфигурация — это две строки сверху и блок провайдера:
model = "sonnet-4-6"
model_provider = "keydealer"
[model_providers.keydealer]
name = "KeyDealer"
base_url = "https://api.keydealer.ru/v1"
env_key = "KEYDEALER_API_KEY"
Разберём построчно.
| Поле | Что означает | На что обратить внимание |
|---|---|---|
model | идентификатор модели | пишется ровно так, как его отдаёт шлюз |
model_provider | какой блок провайдера использовать | должен совпадать с именем блока ниже |
name | человекочитаемое имя | видно в интерфейсе, на работу не влияет |
base_url | адрес шлюза | для OpenAI-совместимого — с /v1 на конце |
env_key | имя переменной окружения с ключом | именно имя переменной, а не сам ключ |
Ключ кладётся в окружение отдельно:
export KEYDEALER_API_KEY="ваш-ключ"
После этого codex запускается как обычно и ходит через ваш шлюз.
Про /v1 в адресе
Самая частая правка после первой неудачной попытки. Для OpenAI-совместимого эндпоинта адрес указывается вместе с /v1 — клиент дописывает к нему /chat/completions и остальные пути сам.
Это место, где легко перепутать, если до этого вы настраивали другой инструмент: у части клиентов /v1 дописывается автоматически и в конфигурации его быть не должно. Здесь — должно.
Проверяется мгновенно: если в ответ приходит 404 на несуществующий путь, адрес собран неправильно.
Какой протокол указывать
У поля wire_api два рабочих значения: протокол чат-дополнений и протокол Responses. По умолчанию используется первый, и для нашего шлюза это правильный выбор.
Причина простая и проверяемая по каталогу: на большинстве позиций протокол chat_completions подтверждён пробой, а Responses и Anthropic Messages стоят в режиме проверки. Ставить wire_api = "responses" до того, как статус позиции сменится, смысла нет — получите ошибку на первом же запросе. Про то, как читать эти статусы, мы писали в материале Responses открылся у первой модели.
Как выбрать имя модели
Не по памяти и не из чужой статьи — из живого каталога. Один запрос:
curl -s https://api.keydealer.ru/v1/models \
-H "Authorization: Bearer $KEYDEALER_API_KEY"
В ответе лежат идентификаторы ровно в том написании, которое понимает шлюз. Важная деталь: в каталоге они пишутся через дефис, а не через точку — например gemini-2-5-flash, а не gemini-2.5-flash. Скопированное из документации вендора имя работать не будет.
Там же видно, какие позиции доступны, а какие в режиме проверки, и по какой ставке считается расход.
Три ошибки, на которых спотыкаются
Ключ прямо в файле настройки. Поле env_key существует именно для того, чтобы ключ лежал в переменной окружения. Файл конфигурации попадает в резервные копии, в синхронизацию настроек, иногда в репозиторий с дотфайлами — и ключ уезжает вместе с ним. Как хранить ключи правильно, разобрано в материале как хранить API-ключи.
Имя провайдера не совпадает с блоком. В model_provider пишется идентификатор блока, а не значение поля name. Если сверху стоит model_provider = "KeyDealer", а блок называется [model_providers.keydealer], клиент провайдера не найдёт.
Ожидание, что заработают все возможности подписки. Через API вы получаете модель и протокол. Всё, что реализовано на стороне продукта, — встроенный веб-поиск, серверные инструменты, интеграции — через сторонний эндпоинт не приезжает само. Что именно доступно у позиции, написано в её статусах.
Кому это стало нужно прямо сейчас
Отдельный повод появился в сентябре. В журнале изменений продукта объявлено отключение GPT-5.5 в ChatGPT, ChatGPT Work и Codex с 14 октября 2026 года — на всех планах. Отдельной строкой там же сказано, что к OpenAI API это отключение не относится.
Разница практическая. Тот, кто работал с этой моделью через подписку, после 14 октября её в продукте не увидит. Тот, кто ходит через API, продолжит работать как раньше. Именно поэтому инструкция выше востребована сейчас, а не вообще: для части команд переключение клиента на API — способ не менять модель под дедлайн вендора.
Разбор самого объявления с дословными формулировками — в материале GPT-5.5 отключают 14 октября, но не в API. Там же сказано, почему пересказы про «отключение на всех платформах» неверны.
Что ещё умеет блок провайдера
Кроме трёх обязательных полей в блоке бывают полезными ещё несколько, и знать про них стоит заранее — чтобы не искать, когда понадобится.
Дополнительные параметры запроса. Некоторые шлюзы требуют версию API в строке запроса — для этого есть отдельное поле, куда параметры пишутся парами.
Дополнительные заголовки. Туда же кладут то, что требует конкретный шлюз помимо авторизации.
Получение токена командой. Вместо статического ключа из переменной окружения провайдера можно настроить на внешнюю команду, которая выдаёт токен и обновляет его по таймеру. Это история для корпоративных контуров с коротко живущими токенами, а не для обычной работы.
Все эти поля — часть штатной конфигурации инструмента, и смотреть их актуальный состав нужно в его документации: набор меняется от версии к версии.
Как проверить, что всё работает
Порядок из трёх шагов, занимает минуту.
Первое: проверьте ключ отдельно от клиента — запросом к каталогу моделей, как выше. Если он отвечает 200, ключ живой и адрес правильный.
Второе: запустите Codex и задайте ему любую мелкую задачу. Если ответ пришёл — конфигурация собрана.
Третье: посмотрите расход в личном кабинете. Первый же запрос должен появиться в журнале с моделью, токенами и суммой. Если запрос прошёл, а в журнале пусто — вы ходите не туда, куда думаете.
Доступ к каталогу из 56 позиций, 43 из которых доступны сейчас, даётся одним ключом с оплатой российской картой в рублях, ставки начинаются от 1 ₽ за миллион токенов. Смена модели в этой схеме — одна строка model в файле настройки, а не новая подписка: именно поэтому имеет смысл держать под рукой и дешёвую позицию, и флагман.
Что делать с несколькими конфигурациями
Держать их раздельно. Практичный приём — отдельные профили под разные задачи: дешёвая позиция для рутины, дорогая для сложного, локальная модель для того, что не должно выходить наружу.
Переключение делается флагом при запуске, а не правкой файла: так вы не забудете вернуть настройку обратно и не обнаружите через неделю, что месяц гоняли классификацию на флагмане. Про сам выбор позиции под задачу — в материале как сравнивать модели, а про экономию на маршруте — в материале маршрутизация между моделями.
Чего мы не утверждаем
Три оговорки.
Мы не обещаем, что все возможности клиента заработают одинаково. Инструмент развивается, поля конфигурации меняются, и актуальный список полей смотрите в его документации, а не в статье с датой.
Мы не утверждаем, что качество будет тем же, что в подписке. Модель та же, обвязка ваша. Разница между обвязками бывает заметной в счёте — мы разбирали это в материале HarnessTax: обвязка агента.
Мы не советуем переезжать всем подряд. Если подписка вас устраивает и оплачивается — переезд не нужен. Это инструкция для тех, кому нужна оплата в рублях или доступ к каталогу шире тарифного.
Что держать в голове
Первое. Настройка занимает три строки, а спотыкаются почти всегда на двух вещах: /v1 в адресе и написание имени модели. Проверьте эти два поля первыми.
Второе. Ключ живёт в переменной окружения. Файл конфигурации — не секрет и утекает легко.
Третье. После переключения посмотрите журнал расхода в первый же день. Это единственный способ убедиться, что запросы идут туда, куда вы настроили, и стоят столько, сколько вы рассчитывали. Что мы за проект — на странице о проекте, ключ заводится на keydealer.ru/login.
Частые вопросы
Зачем переключать Codex CLI на сторонний endpoint?
Чаще всего по двум причинам. Первая — оплата: подписка требует карты, которая работает не у всех, а доступ по API оплачивается в рублях по факту расхода. Вторая — выбор модели: через свой шлюз можно работать не только с тем, что доступно в подписке.
Где лежит файл настройки?
В домашнем каталоге пользователя, путь ~/.codex/config.toml. Формат TOML. Если файла нет, его создают вручную — Codex подхватит его при следующем запуске.
Что обязательно указать в блоке провайдера?
Три вещи - имя, base_url и env_key. В base_url для OpenAI-совместимого шлюза адрес указывается вместе с /v1 на конце. В env_key пишется имя переменной окружения, в которой лежит ключ, а не сам ключ.
Какой протокол выбирать?
Для нашего шлюза на большинстве позиций проверен chat_completions, а Responses и Anthropic Messages стоят в режиме проверки. Поэтому wire_api оставляют в значении по умолчанию либо явно указывают chat. Ставить responses до смены статуса позиции не нужно.
Почему Codex отвечает «модель не найдена»?
Почти всегда потому, что имя модели написано не так, как её отдаёт шлюз. Идентификаторы в каталоге пишутся через дефис, а не через точку. Проверяется одним запросом к /v1/models с вашим ключом — оттуда имя и копируется.
Ключ в config.toml писать можно?
Не нужно. Поле env_key существует ровно для того, чтобы ключ лежал в переменной окружения, а не в файле, который легко утечёт в репозиторий или в резервную копию. Файл настройки не секрет, ключ — секрет.