Публичный API жизненного цикла субагентов
Плагины могут запускать дочерние сессии Hermes и следить за ними, не импортируя
tools.delegate_tool, внутренности шлюза, состояние TUI или поля AIAgent.
Родителя служба определяет по текущему ходу агента, поэтому работает в CLI, в
шлюзе, в неинтерактивных сессиях и в воркерах kanban. Запуск вне активного хода
завершается отказом No active Hermes parent session.
from agent.subagent_lifecycle import SubagentLaunchRequest
def launch_review(ctx):
# Call from a plugin tool or hook while an agent turn is active.
service = ctx.subagent_lifecycle
handle = service.launch(SubagentLaunchRequest(
goal="Review this change for regressions.",
context="Only inspect the supplied repository.",
role="leaf",
correlation_id="review-42",
allowed_toolsets=("file",),
))
# Persist handle.to_dict() if desired.
if service.wait(handle, timeout_seconds=2).timed_out:
return handle.to_dict()
return service.result(handle)
SubagentHandle сериализуется и несёт версионированную непрозрачную возможность.
Передавайте его обратно в status, wait, cancel, result или reconnect.
Испорченные и поддельные хендлы получают в ответ UNKNOWN/UNKNOWN_HANDLE и до
дочерней сессии не добираются.
Стабильные состояния: PENDING, STARTING, RUNNING, SUCCEEDED, FAILED,
INTERRUPTED, CANCEL_REQUESTED, CANCELLED и UNKNOWN.
Вызов cancel(handle, reason=...) работает по договорённости: он просит дочернего
агента прерваться на ближайшей безопасной границе и возвращает CANCEL_REQUESTED.
Завершением это не объявляется, пока wait или result не увидят терминальное
состояние. Терминальные результаты неизменяемы, идемпотентны, ограничены 32 тысячами
символов, не содержат транскриптов и скрытых рассуждений и несут стабильный хеш
результата.
Это асинхронное выполнение с управляемым жизненным циклом. Создание и завершение
дочерней сессии идут тем же путём на стороне хоста, что и delegate_task, — с
восстановлением разрешения инструментов у родителя, уведомлением памяти,
последовательными хуками subagent_stop, очисткой ресурсов и сведением стоимости
дочерних сессий. Синхронный инструмент delegate_task, пакетное делегирование и их
отображение в шлюзе и TUI при этом не меняются. Первая реализация держит метаданные
и терминальные результаты в памяти процесса один час.
После перезапуска процесса reconnect отвечает RECONNECT_UNAVAILABLE и никогда не
поднимает дочернюю сессию заново. Работающие Python-потоки выход процесса тоже не
переживают, так что такие хендлы вызывающей стороне следует считать прерванными.
Запросы устроены по принципу «сомневаешься — откажи»: размеры цели, контекста и
метаданных ограничены; неизвестные наборы инструментов и наборы шире родительских
отклоняются; блокировки отдельных инструментов, подмена рабочего каталога и таймауты
на конкретный запуск отвергаются явно — до тех пор, пока Hermes не сможет
поддержать их без потери изоляции. Сужайте права дочерней сессии через
allowed_toolsets; штатная блокировка небезопасных инструментов продолжает
действовать.