Как это работает
Codex общается по протоколу OpenAI Responses API. opencodex принимает POST /v1/responses по
HTTP с Server-Sent Events, а также опционально поддерживает WebSocket upgrade на том же пути. Он
переводит запрос в сетевой формат вашего провайдера, а ответ — обратно в события Responses, поэтому
Codex даже не догадывается, что общается не с OpenAI.
┌──────────────────────────── opencodex ────────────────────────────┐ │ │ Codex ──▶ │ parser ──▶ router ──▶ [vision] ──▶ adapter ──▶ provider │ ──▶ Codex (/v1/ │ │ │ │ │ │ │ (SSE / WS) responses)│ OcxParsed provider describe buildRequest parseStream │ │ Request +adapter images + fetch AdapterEvent[] │ │ │ │ │ │ [web-search loop] bridge ─▶ SSE │ └─────────────────────────────────────────────────────────────────────┘Выбор аккаунта для аутентификации Codex
Заголовок раздела «Выбор аккаунта для аутентификации Codex»Если выбранный провайдер — это passthrough ChatGPT/Codex, opencodex может выбрать аккаунт из сохранённого пула перед тем, как переслать запрос вышестоящему провайдеру. Правило намеренно разделено на части:
- Существующие id тредов сохраняют привязку. Тред привязывается к поколению аккаунта (account generation), с которого он начался, поэтому долгая сессия Codex по SSH, в tmux или с подключённого мобильного устройства продолжает использовать один аккаунт и не перераспределяется посреди разговора.
- Новые сессии могут перераспределяться. Для нового треда opencodex сравнивает известное использование квоты в окнах 5 часов, недели и 30 дней, пропускает аккаунты, требующие повторной аутентификации или находящиеся в кулдауне, и может переключиться на подходящий аккаунт с меньшим использованием, когда активный аккаунт превышает настроенный порог.
- Квоты и сигналы об ошибках влияют на маршрутизацию. Панель управления может принудительно
обновить квоту запросом
GET /api/codex-auth/accounts?refresh=1; успешные ответы вышестоящего провайдера сохраняют заголовки квоты, 429 отправляет аккаунт в кулдаун, а 401/403 помечает его как требующий повторной аутентификации.
Выбор модели для подагентов
Заголовок раздела «Выбор модели для подагентов»После чистой установки subagentModels включает gpt-5.5, тройку GPT-5.6 Sol/Terra/Luna и
gpt-5.4-mini в селекторе подагентов Codex. Через панель управления можно переупорядочить или
заменить до пяти записей нативными или маршрутизируемыми моделями. Для v1-запросов совместной
работы необязательные настройки injectionModel и injectionEffort добавляют developer-инструкцию,
которая сообщает spawn_agent, какую модель и какой уровень рассуждений использовать; v2-запросы
используют нативные мультиагентные инструкции Codex.
Жизненный цикл
Заголовок раздела «Жизненный цикл»-
Parse —
responses/parser.tsпроверяет запрос по Zod-схеме (responses/schema.ts) и преобразует его во внутреннийOcxParsedRequest: системный промпт, нормализованный список сообщений (текст, изображения, вызовы инструментов, результаты инструментов), определения инструментов, параметры генерации и флаги возможностей, такие как_webSearch(запрошен hostedweb_search) и_structuredOutput(заданtext.formatс JSON-схемой или JSON-объектом). Изображения сохраняются как настоящие части контента — они никогда не встраиваются в текст в виде base64. -
Route —
router.tsсопоставляет запрошенный id модели с настроенным провайдером по фиксированному приоритету: явныйprovider/model→defaultModelпровайдера → встроенные префиксные шаблоны (claude-,gpt-,o1-/o3-/o4-,llama-/mixtral-/gemma-) →models[]провайдера → запасной вариантdefaultProvider. См. Маршрутизация моделей. -
Authenticate — для провайдера типа
oauthopencodex подставляет свежий, автоматически обновляемый access-токен в качестве bearer-ключа, поэтому существующие адаптеры аутентифицируются без изменений. Для аккаунтов пула ChatGPT/Codexcodex/auth-context.tsсначала определяет аккаунт, и passthrough-адаптер отказывается продолжать, если нужные учётные данные пула недоступны. -
Vision-сайдкар (опционально) — если маршрутизируемая модель указана в
provider.noVisionModels, а запрос содержит изображение, opencodex описывает каждое изображение с помощью настроенного vision-сайдкара ChatGPT и заменяет его текстом, чтобы модель без поддержки изображений всё равно могла о нём рассуждать. См. Сайдкары. -
Быстрый путь passthrough — если адаптер является passthrough для Responses (
openai-responsesилиazure-openai), opencodex сохраняет тело Responses, применяет точечные правки для маршрутизации и совместимости, а затем ретранслирует ответ провайдера без преобразования черезAdapterEvent. -
Веб-поисковый сайдкар (опционально) — если Codex включил hosted
web_search, но маршрутизируемая модель не от OpenAI, opencodex предоставляет синтетический function-инструментweb_searchи запускает модель в небольшом агентном цикле: реальные поиски по умолчанию выполняются черезgpt-5.6-lunaс использованием вашего входа в ChatGPT, а результаты внедряются обратно как результаты инструментов. -
Compact (по запросу) — Codex v1 вызывает
POST /v1/responses/compact; v2 добавляетcompaction_triggerв ход (turn) Responses. Нативный passthrough передаёт сжатие вышестоящему провайдеру, а маршрутизируемая модель выполняет роль суммаризатора без инструментов и возвращает заменяющую историю в формате, который ожидает Codex. -
Adapt — в остальных случаях
buildRequest()выбранного адаптера формирует HTTP-запрос к вышестоящему провайдеру (URL, заголовки, тело) в нативном формате провайдера, и opencodex выполняет его черезfetch. -
Bridge —
parseStream()адаптера (илиparseResponse()) порождает внутренние событияAdapterEvent(текст, рассуждения, tool-call start/delta/end, done, error).bridge.tsпреобразует этот поток обратно в SSE-события Responses —response.output_text.delta,response.reasoning_summary_text.delta,response.function_call_arguments.delta,response.completedи так далее. Опциональный транспорт WebSocket отправляет те же полезные нагрузки событий текстовыми фреймами.
Почему прокси, а не форк Codex?
Заголовок раздела «Почему прокси, а не форк Codex?»В Codex протокол Responses API жёстко зашит. Выполняя преобразование на границе протокола,
opencodex работает с CLI, App и SDK Codex без изменений, переживает обновления Codex и
позволяет переключать провайдеров для каждого запроса, не трогая сам Codex. Преобразование
двунаправленное и точно сохраняет стриминг: сводки рассуждений, пространства имён MCP-инструментов,
freeform-инструменты (apply_patch) и обнаружение через tool_search — всё корректно проходит в
обе стороны. Соответствие событий описано в
справочнике по архитектуре.

