Наличие API-ключа ещё не означает, что сторонний сервис сможет обслуживать Codex. Клиенту нужен endpoint, который реализует Responses API, принимает реальный идентификатор модели этого поставщика и возвращает совместимый поток. Сервис может поддерживать /v1/chat/completions и честно называться OpenAI-compatible, но всё равно не подходить Codex.
Поэтому сначала найдите в документации поставщика прямое подтверждение Responses API. Если описаны только Chat Completions, не добавляйте /responses к URL наугад: новый путь не создаёт отсутствующий протокол. Уточните у поставщика подходящий endpoint и поддерживаемые модели.
Речь идёт о замене поставщика модели для локального Codex. MCP подключает внешние инструменты и данные, а proxy или gateway может быть посредником между клиентом и моделью. Эти механизмы могут работать вместе, но не доказывают совместимость друг друга.

Что проверить до изменения файла
У рабочего маршрута есть четыре независимых владельца:
- Поставщик подтверждает Responses endpoint и точный model ID.
- Учётная запись поставщика разрешает эту модель и имеет собственный баланс или лимит.
- Codex получает секрет тем способом, который ожидает endpoint.
- Поток доходит до завершения, а не только устанавливает HTTP-соединение.
Подписка ChatGPT не закрывает пункты 2 и 3. В официальной документации по аутентификации Codex даже вход через ChatGPT и OpenAI API key описаны как разные контракты. У стороннего provider будут свои счета, ограничения, журналы и правила обработки данных.
Региональная доступность также принадлежит поставщику и сети. Использование proxy само по себе не подтверждает законность, стабильность или доступность конкретной модели в вашем регионе. Проверяйте это в первичных правилах выбранного сервиса, а не по чужому конфигу.
Изолируйте эксперимент отдельным profile
Настройки provider являются локальными для машины. Codex игнорирует model_provider и model_providers в проектном .codex/config.toml; официальный Configuration Reference требует размещать их в пользовательской конфигурации. Чтобы не менять основной маршрут, создайте ~/.codex/third-party.config.toml:
tomlmodel = "provider-model-id" model_provider = "acme" [model_providers.acme] name = "Acme Model API" base_url = "https://api.example.com/v1" env_key = "ACME_API_KEY" wire_api = "responses"
Значения provider-model-id и base_url здесь вымышленные. Возьмите их из документации поставщика без переименования. Локальный ID acme должен совпадать в двух местах. Нельзя переопределять зарезервированные openai, ollama и lmstudio.
OpenAI сейчас указывает responses как единственное допустимое значение wire_api. Полный список полей и ограничения авторизации приведены в Advanced Configuration.
Передайте секрет через переменную окружения в том же процессе, из которого запускаете CLI:
bashexport ACME_API_KEY="настоящий-ключ" codex --profile third-party
В PowerShell для текущей сессии:
powershell$env:ACME_API_KEY = "настоящий-ключ" codex --profile third-party
env_key содержит имя переменной, а не сам ключ. Не записывайте секрет в TOML, репозиторий dotfiles, скриншот или лог поддержки. Поле experimental_bearer_token существует, но официальный справочник рекомендует env_key. Если сервис требует особый header или query parameter, используйте только документированные им env_http_headers, http_headers или query_params.
Переменная из терминала может быть невидима приложению, запущенному через Dock, меню Windows или IDE. Если CLI работает, а desktop сообщает об отсутствии ключа, сначала проверьте окружение процесса запуска. Изменение URL в такой ситуации маскирует настоящий источник ошибки.
Докажите маршрут по обе стороны соединения

Название модели в интерфейсе доказывает чтение конфигурации, но не адрес назначения. Для первой проверки откройте пустой каталог, запустите codex --profile third-party и попросите вернуть короткую фиксированную строку без чтения файлов и вызова инструментов.
Успех состоит из трёх совпавших наблюдений: Codex показывает нужную модель; ответ завершается без ошибки потока; в панели provider или gateway в то же время появляется запрос с нужной моделью, статусом и расходом. Сохраните request ID и время, если они доступны, но не ключ и не лишнее содержимое prompt.
Например, DeepSeek на своей официальной странице подключения Codex прямо заявляет поддержку Responses и описывает собственные модели. Это первичный источник для DeepSeek, но не доказательство совместимости другого gateway.
Ошибка подсказывает владельца
| Наблюдение | Где искать причину | Следующий шаг |
|---|---|---|
| Неизвестный ключ конфигурации | Версия Codex или TOML | Сверить codex --version, таблицы и актуальный reference |
| Переменная не найдена | Окружение запуска | Установить её в том же shell или настроить окружение desktop/IDE |
| 401 / 403 | Ключ, header, проект или права provider | Проверить состояние ключа и доступ к модели в панели provider |
| 404 / model not found | Base URL или model ID | Сравнить точный Responses путь и список моделей |
| Немедленная ошибка разбора | Несовместимый формат ответа | Прекратить использование Chat Completions-only endpoint |
| Вывод обрывается, идут reconnect | SSE, тайм-аут посредника или upstream | Сопоставить время обрыва и request ID в логах |
| 429 | Сторонний аккаунт, gateway или модельный лимит | Проверить систему, реально вернувшую статус |
Для подтверждённого 429 используйте отдельную диагностику лимитов Codex, для зависшего потока — руководство по тайм-аутам, а для конфликтующих слоёв — границы config.toml.
После обычного текстового ответа проверяйте только нужные функции. Web search для custom provider по умолчанию не заявлен; один флаг не создаст endpoint, поддержку модели или разрешение политики. Аналогично отдельно проверяются изображения, tool calls, reasoning summaries, WebSocket, plugins и cloud-функции.
Для возврата к официальному маршруту завершите custom-сессию и запустите Codex без --profile third-party. Если provider был добавлен в основной файл, удалите только добавленные model, model_provider и соответствующую таблицу. Удаление всего ~/.codex затронет авторизацию, MCP, правила, profiles и историю, но не исправит несовместимый API.



