Модуль 1 · Как устроен агент · урок 3 из 24
Как собирается промпт: инструкции, инструменты, кэш
Каждый ход Codex — это запрос к Responses API, собранный по строгим правилам. Если знать эти правила, многие решения по harness перестают быть вопросом вкуса: становится видно, что попадёт в контекст, с каким приоритетом и во что обойдётся смена настроек посреди сессии. Основа урока — статья Майкла Болина «Unrolling the Codex agent loop» (OpenAI, январь 2026) и справочник конфигурации Codex.
Три поля запроса
Запрос к модели состоит из трёх крупных частей:
instructions— базовые инструкции. Берутся из файла, указанного вmodel_instructions_fileв~/.codex/config.toml, а если ключа нет — из инструкций модели, которые поставляются вместе с CLI.tools— список инструментов: shell,update_plan, инструменты Responses API вроде веб-поиска, инструменты MCP-серверов.input— упорядоченный список сообщений и элементов.
Роли сообщений имеют приоритет: system > developer > user > assistant. По Болину, содержимое system-сообщения и порядок первых элементов input контролирует сервер, а tools и instructions — клиент.
Порядок элементов input
| № | Роль | Что внутри |
|---|---|---|
| 1 | developer | Правила песочницы: права на файлы, сеть, когда спрашивать одобрение, доступные на запись папки |
| 2 | developer | developer_instructions из config.toml (если заданы) |
| 3 | user | Цепочка AGENTS.md: глобальный файл, затем по папкам от корня git до cwd; сюда же метаданные навыков |
| 4 | user | environment_context: рабочая папка, shell |
| 5 | user | Ваше сообщение |
Три наблюдения, которые полезно держать в голове.
AGENTS.md — это пользовательское сообщение, а не системный промпт. Права песочницы приходят раньше и с более высокой ролью. Инструкцией в AGENTS.md нельзя «разрешить» то, что запрещает песочница, — и это хорошо.
У цепочки AGENTS.md есть потолок. Ключ project_doc_max_bytes, по умолчанию 32 KiB. Документация говорит, что после достижения лимита следующие файлы не добавляются. Поскольку склейка идёт от корня к cwd, отрезанными окажутся самые специфичные, вложенные файлы. Подробнее — в уроке об AGENTS.md как оглавлении.
Навыки в начальном промпте представлены только метаданными: именем, описанием и путём. Под этот список, по документации, отводится не больше 2% контекстного окна, а если размер окна неизвестен — 8000 символов. Полный SKILL.md подгружается, когда навык выбран. Это встроенная реализация постепенного раскрытия (progressive disclosure).
Промпт растёт как префикс
Ответ модели приходит потоком. Элементы рассуждений (с зашифрованным содержимым), вызовы инструментов и их результаты дописываются в input следующего запроса. Болин формулирует ключевое свойство так: старый промпт — точный префикс нового. Это сделано намеренно, ради кэширования.
Почему это важно. Codex не просит сервер хранить разговор, и объём отправляемого JSON растёт квадратично (подробно в уроке об агентном цикле). Кэш промптов превращает квадратичную стоимость сэмплирования в линейную, но только при точном совпадении префикса.
Что сбрасывает кэш
По Болину, промах кэша дают:
- смена набора инструментов посреди разговора;
- смена модели;
- смена песочницы, режима одобрений или рабочей папки.
Он приводит реальный баг: ранняя поддержка MCP перечисляла инструменты в нестабильном порядке, и запросы промахивались мимо кэша. Отдельно названо уведомление MCP notifications/tools/list_changed посреди длинного разговора — оно тоже ведёт к дорогому промаху.
Поэтому harness Codex меняет конфигурацию посреди сессии дописыванием, а не правкой: при смене прав появляется новое developer-сообщение, при смене папки — новый environment_context. Старые элементы не трогаются, префикс сохраняется насколько возможно.
Решения для внешнего harness
Наши выводы — что делать с этим знанием в команде:
| Делать | Не делать |
|---|---|
| Выбрать модель, права и набор MCP до начала длинной сессии | Переключать /model и права «на минутку» в середине большой задачи |
| Держать AGENTS.md стабильным и одинаковым для всех | Класть в AGENTS.md изменчивое: даты, номер спринта, «текущую задачу» |
| Подключать MCP-серверы на уровне проекта осознанно, лишние выключать | Держать MCP-сервер, который часто меняет список инструментов |
| Задачу другого типа начинать новым тредом | Тащить в один тред и ревью, и миграцию, и вёрстку |
| Повторяемые процедуры оформлять навыками | Расписывать процедуры в AGENTS.md целиком |
Про изменчивое в AGENTS.md поясним. Цепочка собирается один раз на сессию, поэтому внутри треда кэш она не сломает. Но если корневой AGENTS.md меняется от сессии к сессии, теряется общий стабильный префикс, а заодно и смысл файла: текущая задача живёт в задаче и плане исполнения, а не в постоянных инструкциях.
Для техлида главный вывод: настройки Codex в команде — это не только про качество, но и про экономику. Нестабильный набор инструментов или привычка переключать модель туда-сюда в длинных сессиях — прямые потери на каждом запросе. Управление стоимостью на уровне компании разобрано в курсе для техдиров, урок «Стоимость».
Как заглянуть внутрь
Ничего не нужно угадывать — промпт можно увидеть:
codex debug prompt-input(экспериментальная команда) печатает точный список элементов, видимых модели, в JSON.codex --sandbox read-only --ask-for-approval never "Summarize the current instructions."— быстрый способ проверить, какие инструкции подхватились.- В
codex exec --jsonсобытиеturn.completedсодержитusageс полямиinput_tokensиcached_input_tokens. - В TUI
/statusпоказывает модель, политику, доступные на запись папки и токены.
Попробуйте сами
10–15 мин на рабочем месте- Посмотрите на свой реальный промпт и найдите в нём блок прав, свои AGENTS.md и
environment_context:
codex debug prompt-input "проверка" > prompt.json
less prompt.json- Измерьте долю кэша. Запустите задачу и продолжите её вторым ходом:
codex exec --json "Опиши структуру каталога src" > run1.jsonl
codex exec --json resume --last "Теперь перечисли точки входа HTTP" > run2.jsonl
jq -r 'select(.type=="turn.completed") | .usage | "\(.cached_input_tokens) из \(.input_tokens)"' run1.jsonl run2.jsonlПовторите второй шаг с другой моделью (codex exec -m <модель> --json resume --last ...) и сравните долю кэшированных токенов. Если флаги в этой позиции не принимаются, сверьтесь с codex exec resume --help.
- Проверьте суммарный размер цепочки AGENTS.md в репозитории:
find . -name AGENTS.md -not -path "*/node_modules/*" | xargs wc -c. Сравните с 32 KiB.
Коротко
- Запрос =
instructions+tools+ упорядоченныйinput. - Права песочницы идут developer-сообщением раньше AGENTS.md; AGENTS.md — пользовательское сообщение с лимитом 32 KiB.
- Навыки в начальном промпте — только метаданные.
- Старый промпт — точный префикс нового; кэш работает только при точном совпадении.
- Смена модели, инструментов, прав или папки сбрасывает кэш — решайте это до длинной сессии.