Перейти к содержимому
OmniRoute source

Codex CLI — Configuration with OmniRoute (Русский)

TOML — единственный рабочий формат. Современный Codex читает исключительно ~/.codex/config.toml (проверено с codex-cli 0.147.0: в справке codex --help указано, что переопределения -c/--config «загружаются из ~/.codex/config.toml»). Старый файл ~/.codex/config.yaml относился к устаревшему npm CLI и без каких-либо уведомлений игнорируется. Генератор на панели управления (/api/cli-tools/apply, инструмент codex) записывает TOML с консервативным объединением — существующие ключи и блоки других провайдеров сохраняются, API-ключ остаётся в OMNIROUTE_API_KEY (и никогда не записывается в файл), а оставшийся устаревший config.yaml упоминается в примечании о миграции, но не изменяется.

Замените <YOUR_HOST> и <YOUR_KEY> своими значениями:

~/.codex/config.toml
model = "cx/gpt-5.5"
model_provider = "omniroute"
model_reasoning_effort = "xhigh"
model_context_window = 400000
model_auto_compact_token_limit = 350000
tool_output_token_limit = 32768 # лимит хранения истории на один вызов инструмента
[model_providers.omniroute]
name = "OmniRoute"
base_url = "http://<YOUR_HOST>:20128/v1"
env_key = "OMNIROUTE_API_KEY"
requires_openai_auth = false
wire_api = "responses"
Окно терминала
# ~/.bashrc или ~/.zshrc — фактическое значение ключа, никогда не храните его в config.toml
export OMNIROUTE_API_KEY="<YOUR_KEY>"

Если вы установили Codex через настольное приложение ChatGPT, бинарный файл codex может находиться только внутри пакета приложения и ещё отсутствовать в PATH вашей оболочки. Добавьте каталог ресурсов в файл запуска оболочки:

Окно терминала
export PATH="/Applications/ChatGPT.app/Contents/Resources:$PATH"

Откройте новую оболочку и выполните проверку:

Окно терминала
command -v codex
codex --version

Локальный OmniRoute без аутентификации: достаточно ключа-заглушки

Заголовок раздела «Локальный OmniRoute без аутентификации: достаточно ключа-заглушки»

Codex проверяет наличие переменной окружения, указанной в env_key, до того, как первый запрос покинет CLI. Если ваш локальный экземпляр OmniRoute не требует аутентификации, подойдёт любое непустое значение-заглушка:

Окно терминала
export OMNIROUTE_API_KEY="${OMNIROUTE_API_KEY:-local}"

Если ваш сервер OmniRoute защищён или является удалённым, используйте настоящий ключ.

Распространённые варианты адреса

Тип доступа URL
Локальная сеть http://192.168.0.1:20128/v1
Tailscale http://100.x.x.x:20128/v1
Обратная петля http://localhost:20128/v1

wire_api = "responses" — почему это работает для всех моделей

Заголовок раздела «wire_api = "responses" — почему это работает для всех моделей»

В феврале 2026 года Codex CLI объявил wire_api = "chat" (Chat Completions) устаревшим и теперь требует wire_api = "responses" (OpenAI Responses API). Начиная с v0.138, настройка wire_api = "chat" приводит к немедленному аварийному завершению при запуске.

Многие провайдеры, включая GLM и Kimi, по-прежнему предоставляют только конечную точку Chat Completions. DeepSeek V4 теперь также предоставляет нативный Responses API и Anthropic-совместимую конечную точку; OmniRoute по умолчанию использует Responses и позволяет для каждого подключения DeepSeek выбирать совместимость с Anthropic.

OmniRoute решает эту задачу прозрачно:

Codex CLI
→ wire_api = "responses"
→ POST /v1/responses (OmniRoute)
→ OmniRoute выбирает нативный протокол провайдера и при необходимости выполняет преобразование
→ POST /responses (DeepSeek V4) или /chat/completions (Mistral / GLM / Kimi / другие)

При использовании OmniRoute отдельный прокси для преобразования не требуется. Все модели используют wire_api = "responses" — обо всём остальном позаботится OmniRoute.

wire_api используется по умолчанию — по умолчанию это поле имеет значение "responses", поэтому его можно полностью исключить из config.toml. Указывайте его явно только в том случае, если хотите задокументировать намерение.


Поле Описание
model_context_window Общий бюджет токенов для активной модели. Установите значение, соответствующее заявленному лимиту модели.
model_auto_compact_token_limit Порог, запускающий автоматическое сжатие истории. Максимум: 90% от model_context_window — значения выше 90% молча игнорируются.
tool_output_token_limit Ограничение количества токенов, сохраняемых в истории для результата каждого вызова инструмента. Не позволяет одному большому ответу инструмента заполнить окно. Это не максимальный размер ответа — это лимит хранения в истории.
compact_prompt Встроенное переопределение системного промпта, используемого при сжатии (v0.138+).

Примечание о model_max_output_tokens: это поле не входит в схему конфигурации Codex CLI (оно отсутствует в кодовой базе Codex на Rust). Если его задать, оно будет молча проигнорировано. Не полагайтесь на него — используйте tool_output_token_limit, чтобы контролировать объём результатов инструментов, сохраняемых в истории.

Модель ID OmniRoute Контекстное окно auto_compact tool_output_limit
GPT-5.5 cx/gpt-5.5 400k надёжно (максимум 1M) 350,000 32,768
Kimi K2.7 (с рассуждением) kmc/kimi-k2.7 131,072 112,000 32,768
Kimi K2.6 kmc/kimi-k2.6 131,072 112,000 32,768
GLM-5.2 / 5.2-max (с рассуждением) glm/glm-5.2 131,072 112,000 32,768
MiMo V2.5 Pro (с рассуждением) opencode-go/mimo-v2.5-pro 131,072 112,000 32,768
Qwen 3.7 Plus (с рассуждением) opencode-go/qwen3.7-plus 32,768 28,000 16,384
DeepSeek V4 Pro (OllamaCloud) ollamacloud/deepseek-v4-pro 131,072 112,000 32,768
DeepSeek V4 Pro ds/deepseek-v4-pro 1,000,000 900,000 65,536
MiMo V2.5 opencode-go/mimo-v2.5 131,072 112,000 32,768
Gemma 4 31B (OllamaCloud) ollamacloud/gemma4:31b 32,768 28,000 16,384
Nemotron 3 Super (OllamaCloud) ollamacloud/nemotron-3-super 32,768 28,000 16,384
GPT-OSS 20B (OllamaCloud) ollamacloud/gpt-oss:20b 32,768 28,000 16,384
DeepSeek V4 Flash (OllamaCloud) ollamacloud/deepseek-v4-flash 65,536 56,000 16,384
Gemini 3 Flash Preview (OllamaCloud) ollamacloud/gemini-3-flash-preview 1,000,000 850,000 32,768
GLM-5 Turbo glm/glm-5-turbo 131,072 112,000 16,384
GLM-4.7 Flash glm/glm-4.7-flash 131,072 112,000 16,384
Mistral Large Latest mistral/mistral-large-latest 262,144 220,000 16,384

Формула сжатия: effective_window = model_context_window - min(tool_output_token_limit, 20000). Значения выше 20k не изменяют порог запуска сжатия.

Практическое правило: задавайте model_auto_compact_token_limit равным 85–88% от model_context_window. Никогда не превышайте 90% — более высокие значения молча игнорируются.


Все модели Codex в OmniRoute используют префикс cx/:

Название в Codex CLI Модель OmniRoute
cx/gpt-5.5 GPT-5.5 стандартная
cx/gpt-5.4 GPT-5.4 стандартная
cx/gpt-5.4-mini GPT-5.4 mini
cx/gpt-5.1-codex-mini GPT-5.1 Codex mini

Другие провайдеры используют собственные префиксы (kmc/, glm/, ds/, ollamacloud/, opencode-go/, mistral/) — префикс соответствует псевдониму провайдера в OmniRoute.


Определяет, насколько глубоко модель «размышляет» перед ответом.

Значение Для чего использовать
none Без рассуждений — прямой ответ
low Тривиальные задачи (переименование, форматирование)
medium Значение сервера по умолчанию, если не указано
high Задачи средней сложности (рефакторинг, отладка)
xhigh Архитектура, глубокий анализ, сложные задачи
Окно терминала
# Переопределение для отдельного вызова
codex -c model_reasoning_effort=low "переименуй переменную x в count"
codex -c model_reasoning_effort=xhigh "спроектируй модуль аутентификации"

Также задайте сводку рассуждений, чтобы Desktop мог отображать текст размышлений, а не только зашифрованные блоки:

~/.codex/config.toml
model_reasoning_effort = "xhigh" # или ultra, если поддерживается
model_reasoning_summary = "detailed" # auto | concise | detailed | none

Бюджет размышлений OmniRoute (настройка сервера)

Заголовок раздела «Бюджет размышлений OmniRoute (настройка сервера)»

На хосте OmniRoute для параметра Settings → AI → Thinking Budget необходимо установить значение passthrough, чтобы настройки глубины и сводки рассуждений Codex передавались вышестоящему сервису. Режим auto удаляет все клиентские поля reasoning / reasoning_effort, поэтому панели размышлений будут пустыми, даже если Codex настроен правильно.

Полное руководство: THINKING_BUDGET.md.

Сжатие и кэширование промптов работают независимо и продолжают работать в режиме passthrough.


Профили — именованные конфигурации для каждой модели или рабочего процесса

Заголовок раздела «Профили — именованные конфигурации для каждой модели или рабочего процесса»

Профили позволяют переключать модель и размер контекстного окна с помощью одного флага. Каждый профиль представляет собой отдельный файл ~/.codex/&lt;name&gt;.config.toml, настройки которого накладываются поверх базового config.toml.

Правило именования (Codex CLI v0.137+): файл должен называться ~/.codex/&lt;name&gt;.config.toml — без префикса profile-. CLI преобразует -p kimi-k27 в ~/.codex/kimi-k27.config.toml. Если файл не найден, без предупреждения применяется конфигурация по умолчанию.

Окно терминала
codex --profile kimi-k27 "проанализируй 10 тысяч строк этой кодовой базы"
codex -p glm52 "проведи обзор архитектуры"
codex --profile deepseek-flash "переименуй переменную" # быстро и дёшево

Профили глубины рассуждений (одна модель, разная глубина)

Заголовок раздела «Профили глубины рассуждений (одна модель, разная глубина)»
Окно терминала
codex -p low # cx/gpt-5.5, глубина=low
codex -p medium # cx/gpt-5.5, глубина=medium
codex -p high # cx/gpt-5.5, глубина=high
codex -p xhigh # cx/gpt-5.5, глубина=xhigh (по умолчанию)
codex -p chat # cx/gpt-5.5, глубина не задана (значение сервера по умолчанию)

Модели с рассуждениями (alto pensamento) — xhigh + подробная сводка

Заголовок раздела «Модели с рассуждениями (alto pensamento) — xhigh + подробная сводка»
Профиль Модель Контекст Для чего использовать
kimi-k27 kmc/kimi-k2.7 128k Лучшее качество рассуждений (Kimi)
glm52 glm/glm-5.2 128k Рассуждения GLM
glm52max glm/glm-5.2-max 128k Максимальные рассуждения GLM
mimo-pro opencode-go/mimo-v2.5-pro 128k Рассуждения MiMo
qwen37plus opencode-go/qwen3.7-plus 32k Рассуждения Qwen

Хорошие модели (bons) — высокая глубина рассуждений

Заголовок раздела «Хорошие модели (bons) — высокая глубина рассуждений»
Профиль Модель Контекст Для чего использовать
kimi-k26 kmc/kimi-k2.6 128k Универсальное применение (Kimi)
deepseek-pro ollamacloud/deepseek-v4-pro 128k DeepSeek Pro через OllamaCloud
deepseek ds/deepseek-v4-pro 1M Прямой доступ к DeepSeek Pro, огромный контекст
mimo opencode-go/mimo-v2.5 128k MiMo общего назначения
Профиль Модель Контекст Для чего использовать
gemma4 ollamacloud/gemma4:31b 32k Экономичная и функциональная
nemotron ollamacloud/nemotron-3-super 32k NVIDIA Nemotron
gptoss ollamacloud/gpt-oss:20b 32k GPT с открытым исходным кодом

Быстрые модели — низкая глубина рассуждений

Заголовок раздела «Быстрые модели — низкая глубина рассуждений»
Профиль Модель Контекст Для чего использовать
deepseek-flash ollamacloud/deepseek-v4-flash 64k Быстрые задачи
gemini-flash ollamacloud/gemini-3-flash-preview 1M Очень быстрая, с огромным контекстом
glm5turbo glm/glm-5-turbo 128k GLM Turbo
glm47flash glm/glm-4.7-flash 128k GLM Flash
mistral mistral/mistral-large-latest 256k Mistral Large
Задача Рекомендуемый профиль
Переименование, форматирование, шаблоны --profile deepseek-flash или -p low
Объяснение, поверхностное ревью -p chat или -p gemini-flash
Отладка, умеренный рефакторинг -p medium или -p kimi-k26
Новая функция, сложные тесты -p high или -p mimo
Архитектура, глубокий анализ -p kimi-k27 или -p glm52 или -p xhigh
Анализ кодовой базы (требуется 1M ctx) --profile deepseek или --profile gemini-flash
Максимальное качество рассуждений -p glm52max или -p mimo-pro
Экономичный вариант -p gemma4 или -p gptoss

Автоматическое создание профилей с помощью omniroute setup-codex

Заголовок раздела «Автоматическое создание профилей с помощью omniroute setup-codex»

Если вы запускаете OmniRoute на VPS, можно автоматически создавать файлы профилей на основе актуального каталога моделей:

Окно терминала
# С VPS (используется локальный OmniRoute на порту 20128)
omniroute setup-codex
# С любого компьютера — укажите адрес вашего VPS
omniroute setup-codex --remote http://100.x.x.x:20128 --api-key sk-xxx
# Предварительный просмотр без записи файлов
omniroute setup-codex --remote http://100.x.x.x:20128 --dry-run
# Создать профили только для GLM и Kimi
omniroute setup-codex --only glm,kimi
# Записать в пользовательский каталог
omniroute setup-codex --codex-home /path/to/.codex

Команда получает данные из /v1/models, использует оптимизированные профили для известных моделей, а для остальных совместимых текстовых моделей — метаданные каталога, и записывает для каждой из них файл ~/.codex/&lt;name&gt;.config.toml. Операция идемпотентна — команду можно безопасно запускать повторно.

OmniRoute также может автоматически синхронизировать эти же файлы профилей после успешного обнаружения или импорта моделей провайдера, изменяющего актуальный каталог. Эта возможность активируется явно и по умолчанию отключена: включите её на панели CLI Code («CLI profile auto-sync» → Codex) или задайте OMNIROUTE_AUTO_SYNC_CODEX_PROFILES=true (также учитывается CLI_ALLOW_CONFIG_WRITES, включённая по умолчанию). Если эта возможность включена, записываются только отдельные файлы профилей ~/.codex/*.config.toml; активный файл или файл по умолчанию ~/.codex/config.toml, настройки Codex-lb, параметры аутентификации и выбор провайдера никогда не изменяются.


Перед запуском Codex проверяет работоспособность вашего экземпляра OmniRoute:

Окно терминала
# Запуск с локальным OmniRoute (порт по умолчанию — 20128)
omniroute launch-codex
# Запуск с определённым профилем
omniroute launch-codex --profile kimi-k27
# Запуск с удалённым VPS
omniroute launch-codex --remote http://100.x.x.x:20128/v1 --api-key sk-xxx
# Передача дополнительных аргументов в codex
omniroute launch-codex --profile glm52 -- --yolo "fix this bug"

Codex также поддерживается двумя универсальными точками входа на основе манифеста (bin/cli/cli-manifest.mjs):

Окно терминала
# Интерактивный выбор модели → записывает ~/.codex/&lt;name&gt;.config.toml (TOML, env_key)
omniroute configure codex
# Запуск codex с провайдером omniroute, внедрённым через флаги -c (без записи конфигурации)
omniroute run codex

Версия Возможность
v0.138 Передача управления настольному приложению (/app), персональные токены доступа v2, --profile как единственный селектор профиля (устаревшие встроенные таблицы [profiles] вызывают сбой при запуске)
v0.139 web_search = "live" — встроенный веб-поиск из режима кода; oneOf/allOf в схемах инструментов MCP; диагностика окружения с помощью codex doctor
v0.140 Просмотр токенов /usage в рамках сеанса; /import из сеансов Claude Code; подкоманда codex delete <SESSION_ID>; аутентификация Amazon Bedrock через объект aws в конфигурации провайдера
v0.141 Ретранслятор Noise со сквозным шифрованием для удалённых исполнителей; исправление SQLite WAL; поддержка TLS P-521
# Встроенный веб-поиск (v0.139)
web_search = "live" # "disabled" | "cached" | "live"
# Отдельная системная инструкция для разработчика (v0.138)
developer_instructions = "Всегда отдавай предпочтение функциональному стилю."
# Пользовательская инструкция для сжатия контекста
compact_prompt = "Кратко изложи приведённое выше в виде маркированного списка."
# Направлять /review на более дешёвую модель
review_model = "glm/glm-5-turbo"
# Уровень обслуживания OpenAI
service_tier = "fast" # "fast" | "flex"
[model_providers.omniroute]
base_url = "http://100.x.x.x:20128/v1"
env_key = "OMNIROUTE_API_KEY"
requires_openai_auth = false
# Статические дополнительные заголовки для каждого запроса
[model_providers.omniroute.http_headers]
"X-Custom-Header" = "value"
# Заголовки, считываемые из переменных окружения
[model_providers.omniroute.env_http_headers]
"X-Trace-Id" = "TRACE_ID"
# Дополнительные параметры запроса URL (полезно для api-version Azure)
[model_providers.omniroute.query_params]
"api-version" = "2024-12-01-preview"
[model_providers.bedrock]
base_url = "https://bedrock-runtime.us-east-1.amazonaws.com"
[model_providers.bedrock.aws]
profile = "default" # Профиль ~/.aws/credentials
region = "us-east-1"

[model_providers.omniroute-main]
base_url = "http://192.168.0.1:20128/v1"
env_key = "OMNIROUTE_API_KEY"
[model_providers.omniroute-tailscale]
base_url = "http://100.x.x.x:20128/v1"
env_key = "OMNIROUTE_API_KEY"

Codex CLI (config.toml) Claude Code (переменная окружения) Эффект
tool_output_token_limit = 32768 (напрямую не предоставляется) Лимит истории для каждого инструмента
model_context_window = 400000 (определяется моделью) Контекстное окно
— CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536 Максимум токенов на ответ
Окно терминала
# ~/.bashrc — лимит токенов Claude Code
export CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536

Флаг Краткий Эффект
--model &lt;id&gt; -m Переопределяет model для этого запуска
--profile &lt;name&gt; -p Загружает ~/.codex/&lt;name&gt;.config.toml
--config key=value -c Переопределяет любое поле config.toml (можно повторять)
--enable &lt;feature&gt; — Принудительно включает флаг функции
--disable &lt;feature&gt; — Принудительно отключает флаг функции
--search — Включает веб-поиск в реальном времени для этого запуска

Новое в v0.140:

Окно терминала
codex delete <SESSION_ID> # удалить сеанс
codex delete <SESSION_ID> --force # пропустить подтверждение
codex debug models --bundled # вывести каталог встроенных моделей в формате JSON

В интерактивном сеансе:

Команда Эффект
/model Открывает средство выбора модели
/usage Показывает использование токенов в этом сеансе (v0.140)
/app Передаёт управление настольному приложению (v0.138)
/import Импортирует сеанс Claude Code (v0.140)
/help Выводит список всех slash-команд

Две настройки OmniRoute по умолчанию могут незаметно сорвать многочасовые сеансы Codex CLI. Ни одна из них не является настройкой Codex CLI — обе находятся на стороне OmniRoute. Пользователи, переносящие конфигурацию с вышестоящих прокси, которые закрепляют учётные записи и отключают тайм-ауты простоя, часто сталкиваются с обеими проблемами и приходят к выводу, что OmniRoute «не способен поддерживать длительный сеанс».

Симптом Вероятная причина Настройка
Сеанс постоянно переключает учётные записи / непрерывность кэша промптов теряется между ходами TTL привязки сеанса равен 0 (отключено) sessionAffinityTtlMs
Соединение обрывается в процессе рассуждения без видимого клиенту уведомления Сторожевой таймер простоя потока сработал после 10 минут без фрагментов от вышестоящего сервера STREAM_IDLE_TIMEOUT_MS

Связанные обсуждения: #7126 (обрывы длительных задач), #5718 (почему привязка по умолчанию отключена). Отслеживание: #7287.

1. Привязка сеанса — закрепление одного диалога за одной учётной записью

Заголовок раздела «1. Привязка сеанса — закрепление одного диалога за одной учётной записью»

По умолчанию: sessionAffinityTtlMs = 0 (отключено).

Где это настроить

  • Панель управления → Настройки → Маршрутизация → Привязка сеанса → TTL привязки (секунды) (ComboDefaultsTab)
  • Или отправьте PATCH-запрос настроек с sessionAffinityTtlMs в миллисекундах (диапазон Zod: 0–86_400_000, то есть до 24 часов)

Переименовано в #7274 из предназначенного только для Codex параметра codexSessionAffinityTtlMs. Устаревший ключ по-прежнему принимается как псевдоним только для чтения; в новых конфигурациях следует использовать sessionAffinityTtlMs. Теперь привязка применяется к любому провайдеру, как только TTL становится больше 0, а не только к Codex — см. docs/architecture/RESILIENCE_GUIDE.md → Привязка сеанса.

Что нарушается, если значение остаётся равным 0

Каждый ход многоходового диалога Codex маршрутизируется независимо в соответствии с активной стратегией комбинации и может попадать на разные учётные записи на каждом ходу. Это нарушает непрерывность вышестоящего сеанса / кэша промптов. OmniRoute учитывает заголовки сеанса Codex (x-codex-session-id / x-session-id / x-omniroute-session) и поля тела, такие как prompt_cache_key / session_id, только когда TTL больше 0 (extractSessionAffinityKey в src/sse/services/auth.ts).

Рекомендация для одной многочасовой задачи

Установите TTL выше ожидаемой продолжительности задачи по фактическому времени (максимум в интерфейсе — 86400 секунд = 24 часа):

Ожидаемая длительность задачи TTL привязки (интерфейс, секунды) sessionAffinityTtlMs
Несколько часов 14400 (4 ч) 14400000
На ночь / около 12 ч 43200 (12 ч) 43200000
Полный день 86400 (24 ч, максимум) 86400000

Явное включение предусмотрено намеренно: отключение привязки способствует балансировке нагрузки между учётными записями, а её включение обеспечивает непрерывность одного длительного агентного сеанса. Это руководство не изменяет значение по умолчанию — операторы, выполняющие длительные задачи Codex, должны включить эту функцию самостоятельно.

2. Тайм-аут простоя потока — не прерывайте ходы с длительным рассуждением без вывода

Заголовок раздела «2. Тайм-аут простоя потока — не прерывайте ходы с длительным рассуждением без вывода»

По умолчанию: STREAM_IDLE_TIMEOUT_MS = 600000 (10 минут). Если значение не задано, оно наследуется от REQUEST_TIMEOUT_MS; общее базовое значение также равно 600000. См. docs/guides/SETUP_GUIDE.md → Тайм-ауты.

Что нарушается при значении по умолчанию

Ход рассуждения / обращения к инструменту Codex, который остаётся безмолвным более 10 минут и при этом не получает ни одного реального фрагмента данных от вышестоящего сервиса, принудительно завершается сторожевым таймером бездействия SSE (open-sse/utils/stream.ts). Клиент часто видит простое разъединение — что соответствует описанию «автоматически остановилось без каких-либо уведомлений».

Важная деталь: синтетический SSE-heartbeat OmniRoute не сбрасывает таймер бездействия. Только реальный фрагмент тела ответа от вышестоящего сервиса обновляет lastChunkTime. С точки зрения сторожевого таймера тихая модель, которая всё ещё «думает», выглядит так же, как зависший вышестоящий сервис.

Связанный тайм-аут бездействия тела ответа Undici: FETCH_BODY_TIMEOUT_MS (по умолчанию также соответствует базовым 10 минутам; значение 0 отключает его). При потоковой передаче FETCH_TIMEOUT_MS охватывает только установление соединения / получение первых заголовков — после активации потока зависания контролируются параметрами STREAM_IDLE_TIMEOUT_MS и FETCH_BODY_TIMEOUT_MS.

Рекомендации для одной задачи, выполняющейся несколько часов

В окружении процесса OmniRoute (.env / compose / systemd):

Окно терминала
# Отключить тайм-ауты бездействия потока и тела ответа для длительных этапов рассуждения
STREAM_IDLE_TIMEOUT_MS=0
FETCH_BODY_TIMEOUT_MS=0

Либо установите значения выше самого продолжительного ожидаемого периода бездействия (значения указываются в миллисекундах):

Окно терминала
# Пример: разрешить до 2 часов бездействия между фрагментами данных от вышестоящего сервиса
STREAM_IDLE_TIMEOUT_MS=7200000
FETCH_BODY_TIMEOUT_MS=7200000

После изменения этих переменных окружения перезапустите OmniRoute.

Конкретная инструкция — многочасовая задача Codex

Заголовок раздела «Конкретная инструкция — многочасовая задача Codex»
  1. Закрепите учётную запись: Dashboard → Settings → Routing → Session affinity → Affinity TTL = 43200 (12 ч) или 86400 (максимум 24 ч).
  2. Увеличьте / отключите тайм-ауты бездействия в окружении OmniRoute:
Окно терминала
STREAM_IDLE_TIMEOUT_MS=0
FETCH_BODY_TIMEOUT_MS=0
  1. Оставьте обычный файл config.toml Codex (wire_api = "responses", корректный base_url, OMNIROUTE_API_KEY) — в Codex нет параметров привязки или бездействия, управляющих этими двумя аспектами поведения.
  2. Перезапустите OmniRoute, затем запустите длительную задачу Codex.
Параметр Поставляемое значение по умолчанию Изменять в этом руководстве?
sessionAffinityTtlMs 0 (отключено) Нет — остаётся включаемым по желанию (балансировка нагрузки или непрерывность; см. Discussion #5718)
STREAM_IDLE_TIMEOUT_MS 600000 (10 мин) Нет — для общего трафика остаётся 10 минут; операторы длительных задач Codex увеличивают или отключают его

Глобальное изменение любого из этих значений по умолчанию повлияет на поведение всех клиентов экземпляра, а не только Codex. Задокументируйте параметры; оставьте значения по умолчанию без изменений, пока оператор явно не примет иное решение.

Диагностика завершений из-за бездействия

Заголовок раздела «Диагностика завершений из-за бездействия»

Когда срабатывает сторожевой таймер бездействия, OmniRoute записывает строку журнала примерно следующего вида:

[STREAM] Idle timeout: no data from codex for 600000ms (model: cx/gpt-5.5)

Выполните поиск по Idle timeout: no data from (либо по коду stream_idle_timeout / имени ошибки StreamIdleTimeoutError). Сегмент провайдера соответствует тому значению, которое OmniRoute использовал для данного запроса (codex, идентификатор другого провайдера или provider, если провайдер неизвестен), — это не всегда буквальная строка codex.


Error: wire_api = "chat" is no longer supported Удалите wire_api = "chat" из конфигурации. Установите wire_api = "responses" или не указывайте это поле (начиная с v0.138 по умолчанию используется "responses").

Error: model not found Убедитесь, что модель существует в OmniRoute и имеет правильный префикс. Выполните omniroute models list или откройте /dashboard/providers/&lt;provider&gt;.

Authentication error Убедитесь, что переменная OMNIROUTE_API_KEY экспортирована: echo $OMNIROUTE_API_KEY.

ERROR: Missing environment variable: OMNIROUTE_API_KEY Codex проверяет наличие переменной окружения перед отправкой первого запроса. Экспортируйте реальный ключ для защищённых серверов или непустое значение-заполнитель, например OMNIROUTE_API_KEY=local, если ваш локальный экземпляр OmniRoute не требует аутентификации. Перезапустите оболочку, если вы добавили переменную в ~/.bashrc или ~/.zshrc.

Connection refused Убедитесь, что OmniRoute запущен, а хост и порт в base_url указаны правильно для вашей сети (локальная сеть, Tailscale или VPS).

Сеанс аварийно завершается при приближении к пределу контекста Явно задайте model_context_window и model_auto_compact_token_limit. См. таблицу размера контекстного окна выше.

Сжатие запускается слишком поздно Уменьшите model_auto_compact_token_limit до 80–85% размера окна. Никогда не устанавливайте значение выше 90%.

Профиль не загружается (-p &lt;name&gt; без уведомления игнорируется) Убедитесь, что файл существует по пути ~/.codex/&lt;name&gt;.config.toml (без префикса profile-). Выполните ls ~/.codex/*.config.toml.

Длительная задача Codex прерывается в процессе выполнения / между шагами происходит переключение учётных записей См. раздел Длительные задачи. Включите привязку сеанса (значение TTL должно превышать длительность задачи) и увеличьте или отключите STREAM_IDLE_TIMEOUT_MS / FETCH_BODY_TIMEOUT_MS. Найдите в журналах OmniRoute строки Idle timeout: no data from с помощью grep.


Исходный код OmniRoute (a58000c7685f)

HagiCode

HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.

Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

Главный экран HagiCode в светлой теме
  • SmartСтруктурированные процессы превращают намерение в исполнимый путь от идеи до готового изменения.
  • EfficientМультиагентные процессы параллельно продвигают исследование, реализацию и проверку.
  • FunHero Dungeon делает длительную совместную разработку наглядной и увлекательной.
Перейти на HagiCode