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упоминается в примечании о миграции, но не изменяется.
Готовый к вставке config.toml
Заголовок раздела «Готовый к вставке config.toml»Замените <YOUR_HOST> и <YOUR_KEY> своими значениями:
model = "cx/gpt-5.5"model_provider = "omniroute"model_reasoning_effort = "xhigh"model_context_window = 400000model_auto_compact_token_limit = 350000tool_output_token_limit = 32768 # лимит хранения истории на один вызов инструмента
[model_providers.omniroute]name = "OmniRoute"base_url = "http://<YOUR_HOST>:20128/v1"env_key = "OMNIROUTE_API_KEY"requires_openai_auth = falsewire_api = "responses"# ~/.bashrc или ~/.zshrc — фактическое значение ключа, никогда не храните его в config.tomlexport OMNIROUTE_API_KEY="<YOUR_KEY>"macOS: Codex, встроенный в приложение ChatGPT
Заголовок раздела «macOS: Codex, встроенный в приложение ChatGPT»Если вы установили Codex через настольное приложение ChatGPT, бинарный файл
codex может находиться только внутри пакета приложения и ещё отсутствовать в
PATH вашей оболочки. Добавьте каталог ресурсов в файл запуска оболочки:
export PATH="/Applications/ChatGPT.app/Contents/Resources:$PATH"Откройте новую оболочку и выполните проверку:
command -v codexcodex --versionЛокальный OmniRoute без аутентификации: достаточно ключа-заглушки
Заголовок раздела «Локальный OmniRoute без аутентификации: достаточно ключа-заглушки»Codex проверяет наличие переменной окружения, указанной в env_key,
до того, как первый запрос покинет CLI. Если ваш локальный экземпляр
OmniRoute не требует аутентификации, подойдёт любое непустое значение-заглушка:
export OMNIROUTE_API_KEY="${OMNIROUTE_API_KEY:-local}"Если ваш сервер OmniRoute защищён или является удалённым, используйте настоящий ключ.
Распространённые варианты адреса
Тип доступа URL Локальная сеть http://192.168.0.1:20128/v1Tailscale 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% — более высокие значения молча игнорируются.
Префикс моделей: cx/
Заголовок раздела «Префикс моделей: cx/»Все модели 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 мог отображать текст размышлений, а не только зашифрованные блоки:
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/<name>.config.toml, настройки которого накладываются поверх базового config.toml.
Правило именования (Codex CLI v0.137+): файл должен называться
~/.codex/<name>.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, глубина=lowcodex -p medium # cx/gpt-5.5, глубина=mediumcodex -p high # cx/gpt-5.5, глубина=highcodex -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 общего назначения |
Простые модели (simples) — без рассуждений
Заголовок раздела «Простые модели (simples) — без рассуждений»| Профиль | Модель | Контекст | Для чего использовать |
|---|---|---|---|
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
# С любого компьютера — укажите адрес вашего VPSomniroute 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 и Kimiomniroute setup-codex --only glm,kimi
# Записать в пользовательский каталогomniroute setup-codex --codex-home /path/to/.codexКоманда получает данные из /v1/models, использует оптимизированные профили для известных моделей, а для остальных совместимых текстовых моделей — метаданные каталога, и записывает для каждой из них файл ~/.codex/<name>.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 launch-codex
Заголовок раздела «Запуск Codex с помощью omniroute launch-codex»Перед запуском Codex проверяет работоспособность вашего экземпляра OmniRoute:
# Запуск с локальным OmniRoute (порт по умолчанию — 20128)omniroute launch-codex
# Запуск с определённым профилемomniroute launch-codex --profile kimi-k27
# Запуск с удалённым VPSomniroute launch-codex --remote http://100.x.x.x:20128/v1 --api-key sk-xxx
# Передача дополнительных аргументов в codexomniroute launch-codex --profile glm52 -- --yolo "fix this bug"Codex также поддерживается двумя универсальными точками входа на основе манифеста
(bin/cli/cli-manifest.mjs):
# Интерактивный выбор модели → записывает ~/.codex/<name>.config.toml (TOML, env_key)omniroute configure codex
# Запуск codex с провайдером omniroute, внедрённым через флаги -c (без записи конфигурации)omniroute run codexНовые возможности Codex CLI (v0.138–v0.141)
Заголовок раздела «Новые возможности Codex CLI (v0.138–v0.141)»| Версия | Возможность |
|---|---|
| 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 |
Новые поля config.toml (после v0.137)
Заголовок раздела «Новые поля config.toml (после v0.137)»# Встроенный веб-поиск (v0.139)web_search = "live" # "disabled" | "cached" | "live"
# Отдельная системная инструкция для разработчика (v0.138)developer_instructions = "Всегда отдавай предпочтение функциональному стилю."
# Пользовательская инструкция для сжатия контекстаcompact_prompt = "Кратко изложи приведённое выше в виде маркированного списка."
# Направлять /review на более дешёвую модельreview_model = "glm/glm-5-turbo"
# Уровень обслуживания OpenAIservice_tier = "fast" # "fast" | "flex"Новые поля [model_providers.<id>]
Заголовок раздела «Новые поля [model_providers.<id>]»[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"Аутентификация Amazon Bedrock (v0.140)
Заголовок раздела «Аутентификация Amazon Bedrock (v0.140)»[model_providers.bedrock]base_url = "https://bedrock-runtime.us-east-1.amazonaws.com"
[model_providers.bedrock.aws]profile = "default" # Профиль ~/.aws/credentialsregion = "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"Claude Code — эквивалентная конфигурация
Заголовок раздела «Claude Code — эквивалентная конфигурация»Codex CLI (config.toml) |
Claude Code (переменная окружения) | Эффект |
|---|---|---|
tool_output_token_limit = 32768 |
(напрямую не предоставляется) | Лимит истории для каждого инструмента |
model_context_window = 400000 |
(определяется моделью) | Контекстное окно |
| — | CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536 |
Максимум токенов на ответ |
# ~/.bashrc — лимит токенов Claude Codeexport CLAUDE_CODE_MAX_OUTPUT_TOKENS=65536Краткий справочник — флаги CLI
Заголовок раздела «Краткий справочник — флаги CLI»| Флаг | Краткий | Эффект |
|---|---|---|
--model <id> |
-m |
Переопределяет model для этого запуска |
--profile <name> |
-p |
Загружает ~/.codex/<name>.config.toml |
--config key=value |
-c |
Переопределяет любое поле config.toml (можно повторять) |
--enable <feature> |
— | Принудительно включает флаг функции |
--disable <feature> |
— | Принудительно отключает флаг функции |
--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=0FETCH_BODY_TIMEOUT_MS=0Либо установите значения выше самого продолжительного ожидаемого периода бездействия (значения указываются в миллисекундах):
# Пример: разрешить до 2 часов бездействия между фрагментами данных от вышестоящего сервисаSTREAM_IDLE_TIMEOUT_MS=7200000FETCH_BODY_TIMEOUT_MS=7200000После изменения этих переменных окружения перезапустите OmniRoute.
Конкретная инструкция — многочасовая задача Codex
Заголовок раздела «Конкретная инструкция — многочасовая задача Codex»- Закрепите учётную запись: Dashboard → Settings → Routing → Session affinity → Affinity TTL =
43200(12 ч) или86400(максимум 24 ч). - Увеличьте / отключите тайм-ауты бездействия в окружении OmniRoute:
STREAM_IDLE_TIMEOUT_MS=0FETCH_BODY_TIMEOUT_MS=0- Оставьте обычный файл
config.tomlCodex (wire_api = "responses", корректныйbase_url,OMNIROUTE_API_KEY) — в Codex нет параметров привязки или бездействия, управляющих этими двумя аспектами поведения. - Перезапустите OmniRoute, затем запустите длительную задачу Codex.
Решение о значениях по умолчанию (#7287)
Заголовок раздела «Решение о значениях по умолчанию (#7287)»| Параметр | Поставляемое значение по умолчанию | Изменять в этом руководстве? |
|---|---|---|
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/<provider>.
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 <name> без уведомления игнорируется)
Убедитесь, что файл существует по пути ~/.codex/<name>.config.toml (без префикса profile-). Выполните ls ~/.codex/*.config.toml.
Длительная задача Codex прерывается в процессе выполнения / между шагами происходит переключение учётных записей
См. раздел Длительные задачи. Включите привязку сеанса (значение TTL должно превышать длительность задачи) и увеличьте или отключите STREAM_IDLE_TIMEOUT_MS / FETCH_BODY_TIMEOUT_MS. Найдите в журналах OmniRoute строки Idle timeout: no data from с помощью grep.
HagiCode
HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.
Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

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