Агенты OpenCode: файлы, frontmatter и четыре готовых примера
Введение
Это сторона OpenCode материала «Создание ИИ-агентов»: точные файлы, поля и команды. Если вам нужна только ролевая модель triage, builder и reviewer, сначала прочитайте ту страницу. Здесь мы связываем их в .opencode/agents/, закрепляем бесплатную модель OpenCode, GPT 6 Luna или Claude Opus 5.5 за каждой ролью и доказываем, что роли действительно работают.
Куда класть агентов
Та же тройка моделей, что и у навыков, но здесь за каждой ролью закрепляется своя модель. Личные агенты идут в глобальный каталог, командные — в репозиторий и коммитятся.
- Проект, рекомендуется: .opencode/agents/<name>.md — вложенный путь становится id со слэшем, team/reviewer.md становится team/reviewer.
- Глобально, личное: ~/.config/opencode/agents/<name>.md — во всех проектах пользователя.
- Встроенно в конфиг: карта agents в opencode.jsonc — те же поля, тело уходит в system. Удобно для однострочных переопределений встроенных агентов.
Встроенные агенты, которые можно переопределить, переиспользовав id: build (основной программист, по умолчанию), plan (основной, без правок проекта), general (субагент для исследования), explore (субагент только для чтения). Скрытые title, summary, compaction занимаются обслуживанием и не могут быть выбраны. Полное дерево со ссылками — в разделе «Реальный скелет проекта».
Как собрать агента
Markdown-агент — это frontmatter плюс тело. Frontmatter принимает те же поля, что и JSON-карта. Тело становится системным промптом. Пример файла .opencode/agents/reviewer.md:
mkdir -p .opencode/agents
vi .opencode/agents/reviewer.md
--- description: Reviews changes for correctness and regressions mode: subagent model: opencode/claude-opus-5-5 steps: 8 color: "#ff6b6b" permissions: - action: edit resource: "*" effect: deny --- Review the current changes. List findings in severity order.
Поля, которые важны на практике:
- description: одна строка, которую видит модель, выбирающая субагентов. Всегда задавайте её для субагентов.
- mode: primary работает как основная сессия, subagent — только как дочерний через инструмент subagent, all — и так и так. Новые пользовательские агенты по умолчанию становятся основными.
- model: provider/model плюс необязательный #variant, например opencode/gpt-6-luna или opencode/claude-opus-5-5. Пустое значение — унаследовать модель родительской сессии.
- steps: максимум шагов модели, после которого инструменты убираются и принудительно выдаётся сводка. Для ревьюеров берите 6–10, для builder оставляйте пустым.
- permissions: упорядоченные правила allow, ask, deny. Побеждает последнее совпадение. Частые действия: shell, edit, read, glob, grep, webfetch, websearch, skill, subagent.
- color, hidden, disabled: цвет интерфейса в hex, скрытие из списков выбора, удаление встроенного агента на этом слое конфигурации.
JSON-форма для быстрых переопределений без файла агента, в opencode.jsonc в корне проекта:
vi opencode.jsonc
{ "$schema": "https://opencode.ai/config.json", "default_agent": "build", "agents": { "build": { "permissions": [ { "action": "shell", "resource": "git push *", "effect": "deny" } ] } } }
Следующие конфиги сливаются: скаляры заменяются, правила разрешений добавляются, поэтому глобальный allow плюс deny агента дают deny. Субагент использует свои разрешения, а не подмножество родителя. Управлять тем, каких детей может запускать родитель, можно в том же opencode.jsonc:
{ "agents": { "orchestrator": { "permissions": [ { "action": "subagent", "resource": "*", "effect": "deny" }, { "action": "subagent", "resource": "reviewer", "effect": "allow" } ] } } }
Реальный скелет проекта
Сторона агентов того же демо-проекта из раздела «Скелет проекта». Вывод tree, каждый элемент ссылается на главу, где он объяснён:
my-app/ ├── opencode.jsonc ├── .opencode/agents/ │ ├── reviewer.md │ ├── builder.md │ ├── triage.md │ └── team/orchestrator.md ├── .opencode/skills/ │ ├── api-review/ │ │ └── SKILL.md │ └── test-writer/ │ └── SKILL.md ├── .opencode/commands/ │ ├── review.md │ └── build-feature.md └── AGENTS.md
Читайте это как роли: reviewer — судья только для чтения на Opus, builder — ежедневный водитель на Luna, triage — сортировщик входящих на бесплатной модели, orchestrator раздаёт работу детям. Команды выбирают агента и модель одним нажатием. Навыки рядом дают чек-листы, которые загружает каждая роль.
Четыре готовых агента
Четыре файла, которые можно положить в .opencode/agents/ уже сегодня. Они повторяют разделение моделей из раздела «Модели, которые важны»: дешёвый triage, стандартная сборка, топовое ревью и один оркестратор, который связывает их вместе. Как они делят один проект с ограниченными навыками, показано в разделе «Три модели, один проект».
Пример 1 — ревьюер на Opus, только чтение. Файл .opencode/agents/reviewer.md, id reviewer. Финальный проход по staged-диффам, никогда не правит:
mkdir -p .opencode/agents
vi .opencode/agents/reviewer.md
--- description: Final correctness and security pass over staged diffs mode: subagent model: opencode/claude-opus-5-5 steps: 8 permissions: - action: edit resource: "*" effect: deny - action: shell resource: "*" effect: deny - action: skill resource: "*" effect: deny - action: skill resource: api-review effect: allow --- Review the staged diff. Load api-review first. Report bugs first in severity order with file and line. Verdict: ship, fix first, or block. Do not edit files.
Запуск: Use the reviewer subagent to review my staged changes. Он загружает только api-review, поэтому вывод остаётся в форме рубрики даже на больших диффах.
Пример 2 — builder на Luna, ежедневный водитель. Файл .opencode/agents/builder.md, id builder. Дешёвый, ровный, может править и тестировать, но никогда не пушит:
vi .opencode/agents/builder.md
--- description: Implements small features with tests on GPT 6 Luna mode: primary model: opencode/gpt-6-luna permissions: - action: shell resource: "*" effect: ask - action: shell resource: "git status *" effect: allow - action: shell resource: "git diff *" effect: allow - action: shell resource: "npm test *" effect: allow - action: shell resource: "git push *" effect: deny --- Implement the requested change in small steps. After each edit run the narrowest test command and show the diff. Stop after two failing attempts and report what is missing.
В паре с @test-writer для покрытия: With builder, add pagination to orders and cover it with test-writer.
Пример 3 — triage на бесплатной модели, сортировщик входящих. Файл .opencode/agents/triage.md, id triage. Бесплатный, быстрый, с ограничением шагов, объясняет код, не меняя его:
vi .opencode/agents/triage.md
--- description: Explains code and sorts small tasks without editing mode: primary model: opencode/deepseek-v4.1-flash-free steps: 6 permissions: - action: edit resource: "*" effect: deny - action: shell resource: "*" effect: deny --- Explain the relevant code with short examples. Sort the request into docs, small fix, or needs-build. Propose the next agent: builder for fixes, plan for features. Do not edit files. Never handle secrets.
Начинайте каждое утро с triage, повышайте только то, чему нужны инструменты: With triage, explain src/auth.ts login flow and route the refresh bug. Приватность бесплатного тарифа остаётся в безопасности, потому что он никогда не трогает файлы .env.
Пример 4 — оркестратор, который раздаёт работу. Файл .opencode/agents/team/orchestrator.md, id team/orchestrator. Планирует на Luna, отдаёт ревью Opus, исследование — general:
mkdir -p .opencode/agents/team
vi .opencode/agents/team/orchestrator.md
--- description: Plans a feature then fans out to builder and reviewer mode: primary model: opencode/gpt-6-luna permissions: - action: subagent resource: "*" effect: deny - action: subagent resource: "builder" effect: allow - action: subagent resource: "reviewer" effect: allow - action: subagent resource: "explore" effect: allow --- Plan the feature in three bullets: files, schema, tests. Then ask explore to map unknowns and builder to implement step one. Finish by asking reviewer for a verdict. Report the three results.
Запуск: With team/orchestrator, plan cursor pagination for orders. Родитель остаётся доступным, пока фоновые дети работают, а результаты возвращаются в родительскую сессию.
Команды, которые выбирают агентов
Файл .opencode/commands/review.md закрепляет ревью на Opus в фоне, файл .opencode/commands/build-feature.md закрепляет сборку на Luna в текущей сессии:
--- description: Review staged changes on Opus agent: reviewer model: opencode/claude-opus-5-5 subagent: true --- Review this diff for bugs, security and missing tests: !`git diff --cached`
--- description: Build one feature step on Luna agent: builder model: opencode/gpt-6-luna subagent: false --- Build $ARGUMENTS in one small step with tests. Show the diff and stop for review.
Запуск: /review и /build-feature cursor pagination for orders. Модель команды главнее модели агента, а модель агента главнее модели сессии, поэтому явные закрепления всегда выигрывают.
Заставить агентов работать
Правильный файл агента сам по себе ничего не делает. Должны произойти ещё две вещи: ассистент должен загрузить конфиг проекта, а человек или команда должен выбрать роль. Большинство заявок «агентов создали, агенты не используются» — это одно из двух, либо id модели, который перестал разрешаться.
- 1. Запускайте там, где лежит конфиг. opencode.jsonc, .opencode/agents/ и вложенные файлы AGENTS.md находятся по каталогу проекта. Сессия, начатая в домашнем каталоге, на уровень выше репозитория или в соседнем checkout, не видит их и тихо работает со встроенными агентами. Запускайте ассистента из корня проекта или перенесите туда сессию, прежде чем ждать, что роли появятся.
- 2. Добейтесь, чтобы каждый id модели разрешался. model принимает provider/model и необязательный #variant. Id должен существовать в каталоге провайдера: opencode/muse-spark-1.3 поставляется с вариантами от minimal до xhigh, а снятый id вроде opencode/muse-spark-1.3-contributor-free не разрешается нигде — тогда агент откатывается к модели сессии или отказывается запускаться. Проверьте каждый выбор один раз, затем закрепите проверенный вариант; бесплатные id меняются чаще всего, поэтому проверяйте их так, как описано в материале «Бесплатная модель OpenCode».
- 3. Выбирайте основного агента под задачу. В списке выбирайте triage для маршрутизации только на чтение, builder для правок, orchestrator, когда задача расходится на детей. Определение агента никогда не делает его по умолчанию, если это не сказано в default_agent, а субагент запускается только когда его вызвал родитель или команда закрепила agent:.
- 4. Дайте каждой роли канареечную задачу. Triage объясняет один поток и называет следующего агента; builder делает одну небольшую правку и показывает дифф; reviewer находит один подложенный баг в staged-диффе; orchestrator возвращает два результата детей. Одна строка pass/fail на роль говорит больше, чем страница конфига.
- 5. Читайте историю, а не каталог. История сессий записывает агента и модель, которые действительно работали. Если triage не появляется там после недели работы, роль — украшение: задача в нём не нуждалась или конфиг ни разу не загрузился.
- 6. Батчите только независимую работу. Параллельные дети — настоящий выигрыш: пять проверок только для чтения или пять черновиков уроков сразу. Правка в одну строку — нет: запуск стоит дороже задачи. Держите дешёвую модель для чтения, а дорогую — для ревью.
Разрешения — ловушка, которая выглядит как сломанная модель: правила упорядочены, побеждает последнее совпадение. Агент, которому запретили единственный нужный инструмент, отвечает извинением вместо ошибки, а винят модель. Перечитайте правила перед первым замером.
Цикл агента
Держите цикл явным и скучным: планируйте один шаг, выполните ровно один
вызов инструмента, запишите наблюдение в краткосрочную память, повторите.
Ограничьте число итераций (двадцати хватает для большинства задач) и
задайте условия остановки заранее: готово, заблокировано или закончился
бюджет. Поле steps обеспечивает это ограничение —
на последнем шаге инструменты убираются и принудительно выдаётся текстовая
сводка.
Логируйте каждую итерацию. Когда агент ведёт себя странно, трасса за
секунды говорит, что сломалось: планировщик, инструмент или инструкции.
Пример промпта-трассы, который работает на всех трёх моделях:
Find where request timeouts are configured, change the default to 30 seconds, run the relevant tests
— обычно это grep, read, edit, shell именно в таком порядке.
Инструменты делают агента
Модель с пятью острыми инструментами бьёт более умную модель с одним
тупым. Проектируйте инструменты как API для младшего коллеги: одна цель на
инструмент, строгая проверка входа и сообщения об ошибках, которые
говорят, что попробовать дальше. В OpenCode фиксированное ядро —
read, glob, grep, edit, write, shell, webfetch,
websearch, question, skill, subagent, execute плюс инструменты
MCP с именем server_tool.
Ограничивайте их по ролям. Пример тройки: triage запрещает
edit и shell; builder
разрешает git status, git diff
и тестовую команду, спрашивает про остальное, запрещает
git push; reviewer запрещает
edit и shell и загружает
один навык ревью. Полный каталог и подключение MCP — в материале
«MCP: настоящие инструменты для ИИ-ассистентов».
Решение проблем
- Агент не появляется в списке выбора. Проверьте путь к файлу: агенты проекта живут в .opencode/agents/, а id берётся из пути, а не из заголовка. Файл в неверном каталоге — просто текстовый файл.
- Ошибка модели при старте. Строка model должна точно совпадать с каталогом, включая вариант. Уберите вариант для проверки, затем закрепите его обратно.
- Субагент никогда не выбирается. Родитель выбирает субагентов по description; расплывчатая строка вроде Helps with code проигрывает встроенному агенту. Называйте триггер: Call after every staged diff.
- Роль отказывается от разрешённого действия. Правила разрешений упорядочены, побеждает последнее совпадение. Поставьте правило allow после широкого deny или сузьте deny.
- Конфиг игнорируется целиком. Сессия началась вне проекта. Начинайте в корне репозитория; вложенные файлы AGENTS.md загружаются только пока работа идёт внутри их каталога.
Автор статьи: Клавдия Кондакова