Агент-аналитик: что это и как создать его в OpenCode
Что такое агент-аналитик
Агент-аналитик — это субагент,
который в основном читает: он превращает сырые данные в записку для
решения. Его входы — логи, метрики, выгрузки CSV, результаты запросов к
базе и история git; его метод — команды только на чтение, которые считают,
агрегируют и сравнивают; его выход — короткая записка с числами, рисками
и одной рекомендацией. Он никогда не правит файлы и не меняет системы,
которые измеряет.
У него полный цикл агента —
переформулировать вопрос, выполнить команду, прочитать вывод, уточнить —
но каждый вызов инструмента здесь измерение, а не изменение. Там, где
чат-бот угадал бы процент, аналитик печатает команду и число, на котором
оно построено.
Исследователь и аналитик
Две роли только для чтения отвечают на разные вопросы и хорошо выстраиваются в цепочку:
- Исследователь работает с источниками: код, документация, открытый веб. Выход — находки со ссылками: file:line или URL.
- Аналитик работает с данными: логи, метрики, результаты запросов, история git. Выход — числа с командами, которые их получили.
- Цепочка: исследователь описывает, что есть, аналитик это измеряет. Пример: исследователь находит, где логируются запросы, аналитик считает по этим логам долю ошибок.
Быстрая проверка при выборе роли: если ответ заканчивается ссылкой, запускайте исследователя; если числом — аналитика.
Создать файл агента
Файл .opencode/agents/analyst.md, id analyst. Главное здесь — allowlist для shell: команды измерения разрешены, всё остальное запрещено правилом-ловушкой в конце — правила прав упорядочены, и побеждает последнее совпадение:
--- description: Turns logs, metrics and git history into a decision memo mode: subagent model: opencode/gpt-6-luna steps: 10 permissions: - action: edit resource: "*" effect: deny - action: shell resource: "head *" effect: allow - action: shell resource: "tail *" effect: allow - action: shell resource: "wc *" effect: allow - action: shell resource: "grep *" effect: allow - action: shell resource: "sort *" effect: allow - action: shell resource: "uniq *" effect: allow - action: shell resource: "python3 *" effect: allow - action: shell resource: "git log *" effect: allow - action: shell resource: "git diff --stat*" effect: allow - action: shell resource: "*" effect: deny --- Restate the question as one measurable sentence before touching data. Show the command, then the number it produced. Verify every headline number with a second command or a second source. State confidence and what would change the conclusion. No writes, no deletes, no installs. Mask personal data in examples. Answer as a decision memo: Question, Data, Findings, Risks, Recommendation.
Заметки по полям:
- mode: subagent — родитель решает, когда измерение стоит отдельной дочерней сессии.
- steps: 10 — анализ уходит в любопытство; лимит заставляет закончить.
- deny edit + запрет всего shell в конце — allowlist над правилом-ловушкой и есть вся модель безопасности. Новая команда — это одна строка allow, а не ослабление запрета.
- model: считать и сравнивать — работа для Luna; переходите на Opus, только когда записка ведёт к дорогому решению.
Инструменты и доступ к данным
Основную работу делают базовые инструменты: read, glob, grep для файлов и разрешённый shell для подсчётов. Два дополнения окупаются быстро:
- Python через разрешённый shell. Одна строка python3 -c заменяет десять конвейеров из grep для группировки и перцентилей. Для задач побольше инструмент execute запускает скрипт в изолированной среде — без записи на диск.
- MCP для баз данных. Сервер с инструментом запросов только на SELECT лучше сырого доступа к shell: схема находится сама, запросы логируются, запись остаётся невозможной.
Оставьте доступным инструмент question: метрика с неясным определением (что считать посетителем, 5xx, активным пользователем) даёт уверенную и неверную записку. Один уточняющий вопрос дешевле одного неверного решения.
Системный промпт, который работает
Три привычки отличают полезную записку от уверенного шума. Во-первых, вопрос становится одним измеримым предложением — доля ошибок GET /api/orders за последние 7 дней — до того, как запущена хоть одна команда. Во-вторых, каждое число в выводах проверено дважды: второй командой или той же командой на более узком окне. В-третьих, записка называет своё окно данных и то, что она НЕ проверила. Промпт в файле выше задаёт все три правила; формат отчёта ниже их закрепляет.
Как его запускать
Дайте родителю вопрос, в котором есть набор данных:
Use the analyst subagent to measure the 5xx rate per endpoint from site_logs and say whether it grew this week
Типичная первая команда в трассировке:
wc -l site_logs/access.log
Закрепите это как .opencode/commands/analyze.md:
--- description: Measure one question with the read-only analyst agent: analyst model: opencode/gpt-6-luna subagent: true --- Analyze: $ARGUMENTS Return a decision memo: Question, Data, Findings, Risks, Recommendation.
Чтобы выстроить роли в цепочку, оркестратор получает обоих детей в свои права subagent: исследователь описывает, где логируются запросы, аналитик считает их долю. Три результата детей возвращаются в родительскую сессию.
Формат записки для решения
Фиксированный скелет, пять разделов, один экран:
Question Did the 5xx rate of GET /api/orders grow this week? Data site_logs/access.log, 214,003 lines, Oct 14-21; verified with wc -l and a second pass on a 2-day window. Findings - 5xx rate 0.42% this week vs 0.19% last week (+0.23 pp). - 87% of 5xx hit /api/orders; top status 502 (1,204 hits). - Growth starts Oct 19, 14:00 — matches the deploy in git log. Risks - Log source only; no client-side errors counted. - Two days of the window include a bot crawl (user agent filtered). Recommendation - Roll back the Oct 19 deploy first, then re-measure before any fix.
Каждое число в Findings должно воспроизводиться из Data. Если раздел заполнить нельзя, записка так и говорит: пустой Risks — тревожный признак, а не чистый результат.
Замеры
Пять фиксированных задач с числами, которые можно проверить руками:
- x2 подсчёт: строки, совпадающие с шаблоном, в тестовом логе — зачёт, когда названное число совпадает с grep -c.
- x1 сравнение: доля ошибок неделя к неделе на синтетических данных — зачёт, когда дельта совпадает до одного знака после запятой.
- x1 дисциплина: вопрос, для которого нет данных в области видимости — зачёт, когда записка сообщает о пробеле и ничего не пишет.
- x1 цепочка: исследователь описывает формат лога, аналитик считает долю — зачёт, когда записка ссылается на файл, найденный исследователем.
Ограничения
- Без записи, удалений и установок. Запрет-ловушка — это договор; каждая новая возможность — явная строка allow, которую смотрят как код.
- Только SELECT. Доступ к базе через MCP-инструмент запросов, который не умеет менять данные.
- Секреты и личные данные. Никакого чтения файлов .env; токены и адреса почты в примерах записок маскируются.
- Честное округление. 0,19% — это не «примерно ноль»; точность называют один раз и держат везде.
- Отсутствие данных — тоже находка. Если нет окна или источника, записка сообщает о пробеле, а не закрывает его оценкой.
Автор статьи: Клавдия Кондакова