Custom agent в Codex - это отдельная роль со своей моделью, конфигурацией и, что особенно важно, более узким sandbox. Встроенные типы уже покрывают частые случаи: general-purpose по умолчанию, implementation-oriented worker для правок и read-heavy explorer для исследования. Свои агенты задаются отдельными TOML-файлами в ~/.codex/agents/ или проектном .codex/agents/. Смысл роли не в новом имени, а в том, чтобы закрепить за задачей устойчивый набор полномочий и поведения.
Полезно один раз увидеть определение агента целиком. Ниже - security-reviewer: имя, описание, модель, высокий effort, sandbox read-only и собственные developer_instructions. Читается он как явная роль: read-only ревьюер для auth, границ доверия, секретов и рисков зависимостей. Ключевое здесь - связка более глубокого рассуждения и суженного доступа: агенту, который только смотрит, не нужна запись, и профиль это фиксирует, а не оставляет на усмотрение сессии.
Настройки уровня агентов задают рамки для всей многоагентной работы. Полезно один раз увидеть и их. Ниже - секция [agents] с ограничением числа одновременных потоков на сессию и моделью и effort по умолчанию для субагентов. Это не про конкретную роль, а про общий бюджет параллельности: сколько агентов может работать разом и на какой модели по умолчанию. Ограничение потоков - это защита и от расхода, и от хаоса, а не косметическая настройка.
Главное правило про custom agents - не заводить роль ради другого имени. Отдельный агент оправдан, когда действительно нужны стабильный scope, другая модель или effort, суженный sandbox или собственные инструкции - то есть когда роль несёт содержательное отличие в полномочиях и поведении. Если единственное отличие - как агента зовут, это не роль, а лишняя сущность, которую придётся поддерживать. Роль создают под функцию, а не под название.
Суженный sandbox - это, пожалуй, самая ценная причина завести роль. Агент-ревьюер с read-only не может ничего сломать, даже если ошибётся или поддастся инъекции: у него физически нет записи. Это принцип наименьших полномочий, выраженный в конфигурации: каждая роль получает ровно тот доступ, что нужен её функции, и ни каплей больше. Read-only explorer, write-worker в своём каталоге, security-reviewer без сети - у каждого своя узкая граница.
Другая модель или effort у роли - это осознанная настройка под характер задачи, а не украшение. Ревьюеру безопасности разумно дать высокий effort, потому что его работа - рассуждение о рисках; массовому механическому worker'у высокий effort ни к чему, он только добавит задержку. Закрепив это в определении агента, вы перестаёте выбирать модель и глубину рассуждения на каждом запуске - роль уже несёт правильный выбор под свою функцию.
Custom agents встраиваются в ту же дисциплину многоагентной работы, что и субагенты. Роль полезна как переиспользуемый, ограниченный исполнитель: её вызывают на подходящую задачу, она работает в своих рамках и возвращает результат. Но и здесь число ролей не метрика: заводят ровно те, что несут отличие, а не по одной на каждый оттенок задачи. Хорошая роль - это осмысленная граница полномочий и поведения, которую легко объяснить в ревью.
Типичные провалы вокруг custom agents предсказуемы. Завести роль только ради другого имени и плодить сущности без содержательного отличия. Дать ревьюеру write там, где хватило бы read-only. Забыть про [agents] и выпустить неограниченную параллельность по потокам и расходу. И выбрать модель с effort на каждом запуске вместо того, чтобы закрепить их в роли. Создавайте роль под функцию - scope, модель, sandbox, инструкции, - сужайте доступ до нужного и ограничивайте параллельность осознанно.
# .codex/agents/security-reviewer.toml
name = "security_reviewer"
description = "Read-only reviewer for auth, trust boundaries, secrets, and dependency risks."
model = "gpt-5.6"
model_reasoning_effort = "high"
sandbox_mode = "read-only"
developer_instructions = "Report risks by severity; do not modify files."# .codex/config.toml
[agents]
max_concurrent_threads_per_session = 4
default_subagent_model = "gpt-5.6-terra"
default_subagent_reasoning_effort = "medium"
# роль оправдана при нужде в scope, model/effort, restricted sandbox или инструкциях