pimenov.ai

База знаний

codex exec — как выполнять конкретные задачи Codex из терминала и скриптов

Как запускать Codex в неинтерактивном режиме codex exec: подписка вместо API-ключа, песочница, JSON-вывод и готовые рабочие сценарии.

Практическое руководство по codex exec — неинтерактивному режиму Codex CLI, который выполняет одну поставленную задачу и возвращает результат в терминал, файл или следующую команду. Данные проверены по официальной документации Codex 27.07.2026.

📌
Главное: codex exec по умолчанию использует сохранённую авторизацию Codex CLI. Если вы вошли через ChatGPT, локальные запуски идут по лимитам подписки, и отдельный API-ключ для них не нужен.

Что такое codex exec

Codex CLI умеет работать в двух режимах. Интерактивный открывает терминальный интерфейс, где вы ведёте диалог с агентом. Неинтерактивный запускается командой codex exec, получает задачу одной строкой и завершается, отдав финальный ответ.

Официальная документация называет три ситуации, когда нужен именно exec: запуск внутри пайплайна (CI, предмердж-проверки, регулярные задания), получение вывода, который можно передать другим инструментам, и запуск с заранее заданными настройками песочницы и подтверждений.

Пока команда работает, прогресс уходит в stderr, а в stdout попадает только финальное сообщение агента. Поэтому результат легко перенаправить в файл или следующую команду.

Вход по подписке без API-ключа

Codex поддерживает два способа входа: через аккаунт ChatGPT и через API-ключ. Codex CLI работает с обоими, а codex exec по умолчанию переиспользует уже сохранённые данные входа.

Практическая последовательность для работы по подписке:

  1. Установите Codex CLI и выполните codex login. Откроется браузер, после входа токен вернётся в CLI.
  2. Если машина без графической оболочки или локальный колбэк заблокирован, используйте вход по коду устройства: codex login --device-auth.
  3. Проверьте остаток лимитов внутри активной сессии CLI командой /status, а полную картину — в дашборде использования Codex.
  4. Запускайте задачи через codex exec. Отдельный ключ подставлять не нужно.

Вход кэшируется локально: в файле ~/.codex/auth.json или в системном хранилище учётных данных. Поведение задаётся параметром cli_auth_credentials_store со значениями file, keyring или auto.

⚠️
Внимание: ~/.codex/auth.json содержит токены доступа. Относитесь к нему как к паролю: не коммитьте в репозиторий, не пересылайте в чатах и не прикладывайте к тикетам.
⚖️
Компромисс: для локальных запусков и личных скриптов подписка закрывает почти все задачи. Для CI/CD OpenAI рекомендует именно API-ключ, потому что его проще выдавать и ротировать. Запуск CI под аккаунтом ChatGPT документация описывает как продвинутый путь для доверенных раннеров и прямо не советует для публичных репозиториев.

Базовое использование

Задача передаётся одним аргументом:

codex exec "опиши структуру репозитория и назови 5 самых рискованных мест"

Результат можно сразу сохранить:

codex exec "собери release notes по последним 10 коммитам" | tee release-notes.md

Если сессионные файлы на диске не нужны, добавьте --ephemeral:

codex exec --ephemeral "проведи триаж репозитория и предложи следующие шаги"

Когда данные приходят из другой команды, промпт остаётся инструкцией, а поток stdin становится дополнительным контекстом:

npm test 2>&1 \
  | codex exec "суммируй упавшие тесты и предложи минимальную правку" \
  | tee test-summary.md

Если промпт целиком генерируется скриптом или лежит в файле, укажите явный признак чтения из stdin:

cat prompt.txt | codex exec -

Права доступа и песочница

По умолчанию codex exec работает в режиме только чтения. Права повышаются явно:

КомандаЧто разрешеноКогда применять
codex exec "<задача>"Чтение файлов, без правокАудит, ревью, отчёты, триаж логов
codex exec --sandbox workspace-write "<задача>"Правки внутри рабочей директорииАвтофиксы, генерация файлов, рефакторинг
codex exec --sandbox danger-full-access "<задача>"Полный доступТолько изолированное окружение: контейнер или отдельный раннер

Флаг --full-auto сохранён как устаревшая совместимость и выводит предупреждение. В новых скриптах используйте явный --sandbox workspace-write.

Дополнительные флаги для управляемых запусков: --ignore-user-config пропускает config.toml из CODEX_HOME, --ignore-rules пропускает пользовательские и проектные файлы .rules. Команда требует запуск внутри Git-репозитория, а --skip-git-repo-check снимает это ограничение, если вы уверены в безопасности окружения.

Машиночитаемый вывод

Для скриптов и дашбордов есть три уровня формализации результата.

Поток событий. Флаг --json превращает stdout в поток JSON Lines: каждая строка — отдельное событие. Типы событий включают thread.started, turn.started, turn.completed, turn.failed, item.* и error. Внутри item.* приходят сообщения агента, рассуждения, запуски команд, изменения файлов, вызовы MCP-инструментов, веб-поиски и обновления плана.

codex exec --json "опиши структуру репозитория" | jq

Только финальное сообщение. Флаг -o <путь> (он же --output-last-message) пишет финальный ответ в файл и одновременно печатает его в stdout.

Строгая схема. Флаг --output-schema требует, чтобы финальный ответ соответствовал JSON Schema. Это нужный вариант, когда результат уходит в следующий шаг пайплайна и поля должны быть стабильными.

{
  "type": "object",
  "properties": {
    "project_name": { "type": "string" },
    "programming_languages": {
      "type": "array",
      "items": { "type": "string" }
    }
  },
  "required": ["project_name", "programming_languages"],
  "additionalProperties": false
}
codex exec "Extract project metadata" \
  --output-schema ./schema.json \
  -o ./project-metadata.json

Продолжение начатой задачи

Двухшаговый сценарий не требует пересказывать контекст заново. Первый запуск исследует проблему, второй продолжает ту же сессию:

codex exec "проверь изменения на состояния гонки"
codex exec resume --last "исправь найденные состояния гонки"

Можно указать конкретную сессию: codex exec resume <SESSION_ID>.

Полезные сценарии

ЗадачаКомандаЧто получаете
Разбор упавших тестовnpm test 2>&1 \| codex exec "суммируй падения и предложи минимальную правку"Короткий отчёт вместо простыни логов
Триаж логов сервераtail -n 200 app.log \| codex exec "назови вероятную причину и три следующих шага" > log-triage.mdФайл с гипотезой и планом проверки
Разбор сетевой ошибкиcurl -vv https://api.example.com/health 2>&1 \| codex exec "объясни сбой TLS или HTTP и предложи вероятную причину"Объяснение без ручного чтения хендшейка
Апдейт для командыgh run view <RUN_ID> --log \| codex exec "напиши короткий апдейт по падению CI"Готовый текст для мессенджера
Комментарий в pull requestgh run view <RUN_ID> --log \| codex exec "суммируй падение в 5 пунктах" \| gh pr comment <PR> --body-file -Комментарий публикуется одной командой
Release notescodex exec "собери release notes по последним 10 коммитам" \| tee release-notes.mdЧерновик заметок к релизу
Метрики проекта в JSONcodex exec "собери метаданные проекта" --output-schema ./schema.json -o ./meta.jsonСтабильные поля для следующего шага автоматизации
Локальный автофиксcodex exec --sandbox workspace-write "исправь падающий тест, не трогая другие файлы"Правка в рабочей копии, которую вы проверяете сами
💡
Совет: формулируйте задачу так, чтобы у неё был наблюдаемый признак завершения: «запусти тест, найди минимальную правку, запусти тест снова». Без такого условия агент чаще возвращает рассуждение вместо результата.

Расписание без CI-сервера

Локальный планировщик закрывает часть задач, для которых обычно поднимают отдельный пайплайн. Пример ежедневного отчёта через cron:

# Ежедневно в 9:00: сводка изменений за сутки в файл с датой
0 9 * * * cd /path/to/repo && /usr/local/bin/codex exec \
  "собери сводку коммитов за последние 24 часа: что изменилось и на что смотреть первым" \
  -o "/path/to/reports/$(date +%F).md" >> /path/to/logs/codex-cron.log 2>&1

Запуск идёт под вашей сохранённой авторизацией, поэтому расходуются лимиты подписки, а не платные API-токены.

Генерация контента: сценарии видео и короткие новости

Отдельный класс задач — материалы, которые собираются по шаблону из внешнего источника: короткая новость по пресс-релизу, подводка к посту, описание к видео, сценарий вертикального ролика. Структура у них предсказуемая, поэтому такие тексты удобно производить неинтерактивным запуском: на входе источник, на выходе файл, который забирает следующий шаг конвейера.

Почему exec подходит для контент-конвейера

  • Задача формулируется один раз и дальше повторяется без человека в терминале.
  • Источник передаётся через stdin, поэтому один промпт обслуживает любое количество материалов.
  • --output-schema фиксирует поля результата, и рендер видео или запись в CMS не ломается из-за того, что модель поменяла формат ответа.
  • -o кладёт готовый результат по нужному пути, а --json даёт разбор события за событием, когда запуск надо диагностировать.

Короткая новость из источника

cat source-article.txt \
  | codex exec "Сделай короткую новость на 900–1200 знаков по этому источнику. Только факты из текста, без оценок и прогнозов. Если даты или цифры в источнике нет, не подставляй её. В конце добавь строку SOURCE_UNCLEAR, если чего-то не хватает для новости." \
  -o "content/news/$(date +%F)-draft.md"

Маркер вроде SOURCE_UNCLEAR даёт скрипту простой признак для ручной проверки: строка есть — материал уходит на доработку, строки нет — черновик идёт дальше.

Сценарий видео по строгой схеме

Схема описывает то, что нужно следующему шагу производства. Файл video-scene.schema.json:

{
  "type": "object",
  "properties": {
    "title": { "type": "string" },
    "total_duration_sec": { "type": "number" },
    "scenes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "index": { "type": "number" },
          "duration_sec": { "type": "number" },
          "voiceover": { "type": "string" },
          "on_screen_text": { "type": "string" },
          "visual_prompt": { "type": "string" }
        },
        "required": ["index", "duration_sec", "voiceover", "on_screen_text", "visual_prompt"],
        "additionalProperties": false
      }
    }
  },
  "required": ["title", "total_duration_sec", "scenes"],
  "additionalProperties": false
}

Запуск:

cat brief.md \
  | codex exec "Собери сценарий вертикального ролика на 45 секунд по этому брифу: 5–7 сцен, разговорная озвучка, короткий текст на экране" \
  --output-schema ./video-scene.schema.json \
  -o ./scenes.json

Полученный scenes.json дальше разбирается по полям: voiceover уходит в синтез речи, visual_prompt — в генерацию кадров, duration_sec задаёт монтажную сетку. Модель при этом не решает, каким будет формат данных: за это отвечает схема.

Ежедневный поток материалов

Папка входящих источников плюс планировщик закрывают регулярный выпуск без CI-сервера:

# Каждое утро в 8:00: превратить все входящие источники в черновики новостей
0 8 * * * cd /srv/content && for f in inbox/*.txt; do \
  cat "$f" | /usr/local/bin/codex exec \
    "Сделай короткую новость по источнику, только факты из текста" \
    -o "drafts/$(basename "$f" .txt).md"; \
done >> logs/news.log 2>&1

Если агент должен сам раскладывать файлы по структуре проекта, переименовывать их и обновлять индексные страницы, добавьте --sandbox workspace-write. Для одного файла результата хватает -o.

⚠️
Внимание: codex exec не проверяет достоверность источника. В контент-конвейере это означает два обязательных правила: промпт запрещает добавлять факты, которых нет во входных данных, а публикация остаётся отдельным шагом с проверкой человеком. Автоматическая генерация экономит время на сборке текста, а не на ответственности за факты.
💡
Совет: пакетный прогон расходует лимиты быстрее одиночных запусков. Перед постановкой в расписание посчитайте количество материалов в сутки и проверьте остаток через /status, чтобы утренний поток не упирался в пятичасовое окно.

Лимиты подписки и когда нужен ключ

Codex включён в планы ChatGPT: Free, Go, Plus, Pro, Business, Edu и Enterprise. Лимиты локальных сообщений и облачных задач считаются в общем пятичасовом окне, дополнительно могут действовать недельные ограничения. Точные значения зависят от плана и модели, поэтому проверяйте их в дашборде использования Codex и через /status.

Что делать при упоре в лимит по официальным правилам:

  • на Plus и Pro докупить кредиты и продолжить без смены плана;
  • на Business, Edu и Enterprise с гибкой тарификацией купить кредиты рабочего пространства;
  • перейти на более компактную модель, чтобы лимитов хватило на дольше;
  • запускать дополнительные локальные задачи с API-ключом, тогда они считаются по тарифам API.

Если для одного запуска нужен другой ключ, он передаётся только этой команде:

CODEX_API_KEY=<api-key> codex exec --json "разбери открытые баг-репорты"

Переменная CODEX_API_KEY поддерживается только в codex exec.

🔴
Критично: не выставляйте OPENAI_API_KEY или CODEX_API_KEY как переменную окружения уровня job в workflow, который выкачивает или запускает код из репозитория. Скрипты сборки, тесты, хуки зависимостей и скомпрометированный сторонний action прочитают эти значения. Для GitHub Actions используйте официальный openai/codex-action, который поднимает прокси к Responses API.

Ограничения и когда не подходит

  • Автоматизация в публичных и открытых репозиториях под аккаунтом ChatGPT не рекомендуется: авторизационный файл слишком чувствителен для такого окружения.
  • Режим danger-full-access за пределами изолированного окружения превращает любую ошибку промпта в реальные изменения системы.
  • Работа вне Git-репозитория требует явного отключения проверки, что снимает защиту от разрушительных правок.
  • Если у включённого MCP-сервера стоит required = true и он не инициализировался, codex exec завершится с ошибкой вместо продолжения без этого сервера. Для пайплайна это ожидаемое поведение, но его нужно учитывать в обработке кодов возврата.
  • Инструкции из файлов проекта вроде AGENTS.md читаются как доверенная конфигурация, поэтому запускать exec в чужом непроверенном репозитории небезопасно.

Проверка результата

Минимальный сценарий, который подтверждает, что всё настроено:

  1. Перейдите в любой Git-репозиторий.
  2. Выполните codex exec "перечисли файлы верхнего уровня и назови стек проекта".
  3. Признак успеха: в терминал печатается финальный ответ агента, а прогресс шёл отдельным потоком и не смешался с результатом.
  4. Выполните codex exec --json "перечисли файлы верхнего уровня" | jq и убедитесь, что приходит валидный поток событий с thread.started и turn.completed.
  5. Проверьте расход: в интерактивной сессии codex наберите /status.

Если первые два шага проходят без ввода API-ключа, значит запуск идёт по вашей подписке.

Чеклист «Что делать, если…»

  • Ответ пришёл, но без правок в файлах — режим по умолчанию только читает, добавьте --sandbox workspace-write.
  • Команда отказывается стартовать вне репозитория — либо перейдите в репозиторий, либо осознанно добавьте --skip-git-repo-check.
  • Скрипт не может распарсить вывод — переходите с текстового ответа на --json или на --output-schema со строгой схемой.
  • Нужен только финальный текст — используйте -o <путь> вместо разбора всего потока.
  • Браузерный вход не открывается на сервере — используйте codex login --device-auth.
  • Лимиты кончились в середине работы — докупите кредиты, смените модель на более компактную или выполните запуск с CODEX_API_KEY для одной команды.
  • Нужно продолжить прошлую задачуcodex exec resume --last "<следующий шаг>".
  • Локальный конфиг мешает воспроизводимости — добавьте --ignore-user-config и при необходимости --ignore-rules.

Ссылки


По теме

Неинтерактивный режим полезен там, где рутинные проверки и отчёты пора снять с человека и оставить ему только решение. Это касается и небольших команд, у которых нет выделенного инженера под автоматизацию.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov