Сбой Codex может закончиться разными строками:
textexceeded retry limit, last status: 429 Too Many Requests stream disconnected before completion exceeded retry limit, last status: 401 Unauthorized
Они не доказывают одну общую причину. 401 означает, что конкретный маршрут отклонил аутентификацию. 429 означает ограничение запросов, баланса, расходов или использования в каком-то сервисе. stream disconnected сообщает лишь о том, что поток ответа не завершился. А exceeded retry limit объясняет, почему клиент прекратил попытки, но не называет виновника.
Поэтому не начинайте с удаления auth-файла, выпуска нового ключа, увеличения timeout или повторного запуска большой задачи. Сначала зафиксируйте маршрут и первую полезную ошибку.
Две команды до любых изменений
Для CLI выполните read-only проверки:
bashcodex --version codex login status
Запишите версию, точное время с часовым поясом, интерфейс Codex, модель, полный текст ошибки и request ID, если он виден. codex login status показывает метод аутентификации, но не доказывает, что все downstream-разрешения действуют. При custom provider зафиксируйте активный provider и base URL без ключей и полного содержимого конфигурации.
Официальная таксономия ошибок Codex App Server разделяет Unauthorized, upstream HTTP failure, ResponseStreamConnectionFailed, ResponseStreamDisconnected и ResponseTooManyFailedAttempts. Если известен upstream HTTP status, он может передаваться отдельно. Даже если интерфейс показывает только итоговую строку, эти классы полезно диагностировать отдельно.
Какой маршрут владеет ошибкой
| Маршрут | Главные доказательства | Что нельзя подменять ими |
|---|---|---|
| Codex с ChatGPT login | активный аккаунт/workspace, Codex usage, результат в новой сессии | баланс и RPM/TPM Platform API |
| OpenAI API key | structured error, организация/проект, billing и limits, response headers | подписка ChatGPT Plus/Pro |
| Внешний provider/gateway | effective endpoint, provider account, gateway/upstream logs, trace ID | любая чужая панель OpenAI |

Сообщение «лимит ещё есть» бесполезно, если открыта панель аккаунта, который не обрабатывал запрос. Сначала свяжите способ входа, provider и проверяемую консоль в одну цепочку.
401: повторять нечего, пока не изменилось auth-состояние
Для OpenAI Platform API официальная таблица ошибок различает invalid authentication, неверный API key, отсутствие членства в организации и несовпадение IP allowlist. Конкретный error.code, организация и проект определяют действие.
При ChatGPT login проверьте, соответствует ли codex login status ожидаемому методу и аккаунту. Повторная аутентификация оправдана, когда сессия действительно недействительна или выбран не тот аккаунт. Но codex logout удаляет сохранённые credentials; это изменение состояния, а не безопасная диагностическая команда. Официальное руководство по auth отдельно отмечает workload identity, которой управляет среда процесса.
При API key убедитесь, что работающий процесс использует ключ того же endpoint, проекта и организации, которые вы проверяете. Не печатайте ключ, весь environment или auth.json. После исправления подтверждённого invalid_api_key, membership или IP policy выполните один короткий запрос. Стабильный 401 без изменения credentials или permissions не лечится backoff.
У внешнего gateway 401 может возникнуть на входе или быть ответом upstream. Сопоставьте request ID с логами. Если gateway принял клиентскую аутентификацию, но не прошёл upstream auth, ротация клиентского ключа исправляет не тот слой.
429: сначала прочитайте конкретный owner
В OpenAI Platform API 429 включает не только request-rate throttling. Документация также перечисляет depleted credits, organization/project spend limit и organization usage limit. Billing, spend и quota не восстанавливаются от повторов.
- Есть валидный
Retry-Afterили явный request-rate code — снизьте concurrency, выждите указанный минимум и сделайте ограниченное число попыток. - Есть
credit_balance_exhausted— не повторяйте до изменения баланса нужной организации. - Указан spend limit — проверьте тот же проект и организацию, которые отправили запрос.
- Ограничение отображается в ChatGPT/Codex account — следуйте условию восстановления именно этого аккаунта, не переносите его на API throughput.
- 429 пришёл от стороннего provider — смотрите его billing, quota, concurrency и logs.
- Видна только последняя строка Codex — сохраняйте время, route и request ID; фиксированное ожидание пока не обосновано.
Если один короткий последовательный запрос проходит, а параллельная работа падает, снизьте нагрузку и запишите порог. Это доказательство о форме workload, но не окончательный root cause. Если после снижения concurrency результат остаётся хаотичным, остановите тесты и откройте реальные логи gateway/provider.
Stream disconnected: проверьте стадию обрыва
Поток может оборваться в клиенте, proxy/TLS inspection, управляемой сети, gateway, upstream-сервисе или при локальном переключении сети. Текст ошибки не доказывает, что виноват VPN или что OpenAI недоступен.
Сделайте один контролируемый сравнительный тест:
- Новая сессия, тот же аккаунт, provider, модель и короткий запрос без секретов.
- Отметьте: нет вывода совсем, есть частичный вывод или вернулся явный HTTP status.
- Если политика разрешает, повторите тот же запрос один раз через другую доверенную сеть.
- Сопоставьте время и request ID с provider/gateway logs.
- Если сбой есть только в одной версии или клиенте, зафиксируйте различие и не меняйте ещё несколько переменных одновременно.
Успех в другой сети сужает область поиска, но не разрешает отключать корпоративные средства защиты. Одинаковый отказ в двух сетях усиливает необходимость проверить account, provider и текущие upstream-сигналы.
Не увеличивайте сразу stream_idle_timeout_ms. Timeout меняет время ожидания клиента, но не исправляет неверный base URL, устойчивый 401, исчерпанный баланс или соединение, которое gateway закрывает намеренно.
Retry settings не меняют upstream
В Codex существуют настройки request retries, stream retries и stream idle timeout. Текущий config reference также указывает, что model_providers и provider/auth keys относятся к user-level configuration и игнорируются в project-local .codex/config.toml.
Эти параметры определяют поведение клиента после ошибки. Они не пополняют баланс, не обновляют permission и не меняют политику gateway. Большее число повторов может продлить детерминированный отказ, умножить запросы через многослойный gateway и скрыть первый полезный error.
Меняйте retries только после подтверждения временного rate/transport condition и с границей по числу попыток и общему времени. После изменения выполните один короткий запрос. Если первая ошибка вернулась, остановитесь.
Что передать в поддержку
При устойчивом минимальном воспроизведении соберите:

- Codex version, CLI/App/IDE и ОС;
- auth method и provider без credentials;
- первое и последнее время отказа с time zone;
- стадия: до первого вывода или после частичного ответа;
- error category, HTTP status,
error.code, request ID; - одна сессия или все, одна модель или несколько;
- результат одного контролируемого сравнения;
- минимальный обезличенный фрагмент лога с первой ошибкой.
Не отправляйте API keys, tokens, authorization headers, полный auth/config, environment dump, приватный prompt или исходный код. Задача отчёта — связать request ID, время и provider, а не выгрузить состояние компьютера.
Критерий восстановления — короткий успешный запрос по исходному маршруту: тот же аккаунт, provider и клиент, поток завершился, первая ошибка больше не возникает. Успех после смены аккаунта, модели или сети — полезный обход, но не доказательство восстановления исходного пути.



