Публичный 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; штатная блокировка небезопасных инструментов продолжает действовать.

перевод и редактура:

обновлено

⌕ ESC