Модуль supervisor — надзор за дочерними агентами
🟢 Модуль даёт родительскому агенту запускать дочерних агентов,
подписываться на выбранные события своих детей и получать инъекцию в
собственный контекст, когда событие совпало — по желанию приостанавливая
ребёнка. Хуки в ребёнке не нужны: это внешний control-plane поверх шины событий
(events.subscribers) и публичного порта agent_os.Agents.
Инструмент supervisor
Один инструмент kind: supervisor с полем action:
action |
Поля | Что делает |
|---|---|---|
spawn |
template, task?, session_key? |
неблокирующий запуск ребёнка; возвращает pid |
subscribe |
event?, inject, child?, role?, pause_child?, resume_after?, run_turn?, once? |
подписка родителя на события ребёнка; возвращает id |
unsubscribe |
id |
снять подписку |
subscriptions |
— | список активных подписок |
send |
pid, content, role? |
впрыснуть сообщение ребёнку |
pause / resume |
pid |
приостановить/возобновить ребёнка |
stop |
pid, signal? |
pause | interrupt | terminate (по умолчанию interrupt) |
status |
pid |
снимок процесса ребёнка |
session |
pid, limit? |
живая сессия бегущего ребёнка: последние сообщения его контекста (role, content, tool_call_id, tool_calls); limit по умолчанию 50 |
Подписка и доставка
- Селектор
event(все поля опциональны):{ kind?, tool?, success?, contains? }—kindизProcessEvent::event_type(tool_call,tool_result,error, …). inject— MiniJinja (в контекстеevent), вставляется в контекст родителя.pause_child— приостановить ребёнка перед инъекцией;resume_after— сразу возобновить после;run_turn— неблокирующе запустить ход родителя (иначе родитель увидит инъекцию на следующем ходе);once— снять после первого срабатывания.- Таргетинг:
child: <pid>— конкретный ребёнок; безchild— любой ребёнок родителя (разрешается черезAgents.process(pid).parent). - Операции над конкретным ребёнком (
send/pause/resume/stop/status/session) разрешены только для прямого ребёнка вызывающего.
Поставляемый агент observer
Модуль поставляет config-бандлом готового агента-наблюдателя observer
(agents/observer/): он объявляет tool_files: [tools/supervisor.yaml] и владеет
всеми действиями supervise — spawn, subscribe, session, send,
pause/resume/stop. Загружается рядом с config/agents/ при включённом
модуле (одноимённый агент из config/agents побеждает). Типовой сценарий:
observer запускает coder и следит за его падениями.
Пример
Инструмент можно объявить и в своём агенте:
# config/agents/supervisor-agent/tools/supervisor.yaml
kind: supervisor
name: supervise
description: Запускай код-агента и следи за его падениями.
{ "action": "spawn", "template": "coder", "task": "Почини сборку" }→pid.{ "action": "subscribe", "child": "<pid>", "event": { "kind": "tool_result", "success": false }, "inject": "Упало: {{ event.content }}. Помоги исправить.", "pause_child": true, "resume_after": true, "run_turn": true }.- Родитель работает независимо; при падении ребёнка получает инъекцию в свой контекст (ребёнок опционально на паузе).
{ "action": "session", "pid": "<pid>", "limit": 50 }— посмотреть, что ребёнок делает прямо сейчас.
Глобальные правила (альтернатива)
Для декларативных правил без привязки к конкретному родителю есть модуль
reactions: действия inject (в т.ч. target: parent) и
signal позволяют уведомлять/останавливать процесс из правила.