Podagenci
Podagenci to uruchomienia agenta w tle, wywoływane z istniejącej sesji agenta. Działają we własnej sesji (agent:<agentId>:subagent:<uuid>) i po zakończeniu ogłaszają swój wynik z powrotem do kanału czatu żądającego.
Komenda ukośnika
Użyj/subagents, aby sprawdzić lub kontrolować uruchomienia podagentów w bieżącej sesji:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info pokazuje metadane uruchomienia (status, znaczniki czasu, identyfikator sesji, ścieżkę transkryptu, cleanup).
Główne cele:
- Równoległe wykonywanie zadań typu „research / długie zadanie / wolne narzędzie” bez blokowania głównej sesji.
- Izolacja podagentów domyślnie (separacja sesji + opcjonalny sandbox).
- Ograniczenie powierzchni narzędzi trudnych do nadużycia: podagenci nie otrzymują narzędzi sesyjnych domyślnie.
- Wsparcie konfigurowalnej głębokości zagnieżdżenia dla wzorca orkiestratora.
agents.defaults.subagents.model lub nadpisania per-agent.
Narzędzie
Użyjsessions_spawn:
- Uruchamia podagenta (
deliver: false, globalna kolejka:subagent) - Następnie wykonuje krok announce i publikuje odpowiedź ogłoszenia do kanału czatu żądającego
- Domyślny model: dziedziczy po wywołującym, chyba że ustawisz
agents.defaults.subagents.model(lubagents.list[].subagents.model); jawnesessions_spawn.modelma pierwszeństwo. - Domyślne thinking: dziedziczy po wywołującym, chyba że ustawisz
agents.defaults.subagents.thinking(lubagents.list[].subagents.thinking); jawnesessions_spawn.thinkingma pierwszeństwo.
task(wymagane)label?(opcjonalne)agentId?(opcjonalne; uruchom pod innym identyfikatorem agenta, jeśli dozwolone)model?(opcjonalne; nadpisuje model podagenta; nieprawidłowe wartości są pomijane, a podagent uruchamia się na domyślnym modelu z ostrzeżeniem w wyniku narzędzia)thinking?(opcjonalne; nadpisuje poziom thinking dla uruchomienia podagenta)runTimeoutSeconds?(domyślnie0; gdy ustawione, uruchomienie podagenta jest przerywane po N sekundach)cleanup?(delete|keep, domyślniekeep)
agents.list[].subagents.allowAgents: lista identyfikatorów agentów, które można wskazać przezagentId(["*"], aby zezwolić na dowolny). Domyślnie: tylko agent żądający.
- Użyj
agents_list, aby zobaczyć, które identyfikatory agentów są obecnie dozwolone dlasessions_spawn.
- Sesje podagentów są automatycznie archiwizowane po
agents.defaults.subagents.archiveAfterMinutes(domyślnie: 60). - Archiwizacja używa
sessions.deletei zmienia nazwę transkryptu na*.deleted.<timestamp>(ten sam folder). cleanup: "delete"archiwizuje natychmiast po announce (transkrypt nadal jest zachowany przez zmianę nazwy).- Auto-archive działa w trybie best-effort; oczekujące timery są tracone, jeśli gateway zostanie zrestartowany.
runTimeoutSecondsnie powoduje auto-archiwizacji; jedynie zatrzymuje uruchomienie. Sesja pozostaje do momentu auto-archiwizacji.- Auto-archive dotyczy zarówno sesji głębokości 1, jak i 2.
Zagnieżdżeni podagenci
Domyślnie podagenci nie mogą uruchamiać własnych podagentów (maxSpawnDepth: 1). Możesz włączyć jeden poziom zagnieżdżenia, ustawiając maxSpawnDepth: 2, co umożliwia wzorzec orkiestratora: main → orchestrator sub-agent → worker sub-sub-agents.
Jak włączyć
Poziomy głębokości
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 0 | agent:<id>:main | Główny agent | Zawsze |
| 1 | agent:<id>:subagent:<uuid> | Podagent (orkiestrator, gdy dozwolona głębokość 2) | Tylko jeśli maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Pod-podagent (worker) | Nigdy |
Łańcuch announce
Wyniki wracają w górę łańcucha:- Worker głębokości 2 kończy → ogłasza do swojego rodzica (orkiestratora głębokości 1)
- Orkiestrator głębokości 1 otrzymuje announce, syntetyzuje wyniki, kończy → ogłasza do main
- Główny agent otrzymuje announce i dostarcza wynik użytkownikowi
Polityka narzędzi według głębokości
- Głębokość 1 (orkiestrator, gdy
maxSpawnDepth >= 2): Otrzymujesessions_spawn,subagents,sessions_list,sessions_history, aby zarządzać swoimi dziećmi. Inne narzędzia sesyjne/systemowe pozostają zabronione. - Głębokość 1 (worker, gdy
maxSpawnDepth == 1): Brak narzędzi sesyjnych (domyślne zachowanie). - Głębokość 2 (worker): Brak narzędzi sesyjnych —
sessions_spawnjest zawsze zabronione na głębokości 2. Nie może uruchamiać dalszych dzieci.
Limit uruchomień per agent
Każda sesja agenta (na dowolnej głębokości) może mieć maksymalniemaxChildrenPerAgent (domyślnie: 5) aktywnych dzieci jednocześnie. Zapobiega to niekontrolowanemu rozrostowi z jednego orkiestratora.
Cascade stop
Zatrzymanie orkiestratora głębokości 1 automatycznie zatrzymuje wszystkie jego dzieci głębokości 2:/stopw głównym czacie zatrzymuje wszystkich agentów głębokości 1 i kaskadowo ich dzieci głębokości 2./subagents kill <id>zatrzymuje konkretnego podagenta i kaskadowo jego dzieci./subagents kill allzatrzymuje wszystkich podagentów dla żądającego i wykonuje kaskadę.
Uwierzytelnianie
Uwierzytelnianie podagenta jest rozstrzygane według identyfikatora agenta, a nie typu sesji:- Klucz sesji podagenta to
agent:<agentId>:subagent:<uuid>. - Magazyn uwierzytelniania jest ładowany z
agentDirtego agenta. - Profile uwierzytelniania głównego agenta są scalane jako zapasowe; profile agenta mają pierwszeństwo w przypadku konfliktów.
Announce
Podagenci raportują wyniki przez krok announce:- Krok announce działa wewnątrz sesji podagenta (nie w sesji żądającej).
- Jeśli podagent odpowie dokładnie
ANNOUNCE_SKIP, nic nie zostanie opublikowane. - W przeciwnym razie odpowiedź announce jest publikowana do kanału czatu żądającego przez kolejne wywołanie
agent(deliver=true). - Odpowiedzi announce zachowują trasowanie wątków/tematów, gdy jest dostępne (wątki Slack, tematy Telegram, wątki Matrix).
- Wiadomości announce są normalizowane do stabilnego szablonu:
Status:wyprowadzony z wyniku wykonania (success,error,timeoutlubunknown).Result:treść podsumowania z kroku announce (lub(not available)jeśli brak).Notes:szczegóły błędu i inne przydatne informacje.
Statusnie jest wnioskowany z wyjścia modelu; pochodzi z sygnałów runtime.
- Czas wykonania (np.
runtime 5m12s) - Zużycie tokenów (input/output/total)
- Szacowany koszt, gdy ceny modeli są skonfigurowane (
models.providers.*.models[].cost) sessionKey,sessionIdoraz ścieżkę do transkryptu (aby główny agent mógł pobrać historię przezsessions_historylub sprawdzić plik na dysku)
Tool Policy (narzędzia podagenta)
Domyślnie podagenci otrzymują wszystkie narzędzia z wyjątkiem narzędzi sesyjnych i narzędzi systemowych:sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2, podagenci głębokości 1 (orkiestratorzy) dodatkowo otrzymują sessions_spawn, subagents, sessions_list i sessions_history, aby mogli zarządzać swoimi dziećmi.
Nadpisanie przez konfigurację:
Współbieżność
Podagenci używają dedykowanej kolejki w tym samym procesie:- Nazwa kolejki:
subagent - Współbieżność:
agents.defaults.subagents.maxConcurrent(domyślnie8)
Zatrzymywanie
- Wysłanie
/stopw czacie żądającym przerywa sesję żądającą i zatrzymuje wszystkie aktywne uruchomienia podagentów z niej wywołane, kaskadowo do zagnieżdżonych dzieci. /subagents kill <id>zatrzymuje konkretnego podagenta i kaskadowo jego dzieci.
Ograniczenia
- Announce podagenta działa w trybie best-effort. Jeśli gateway zostanie zrestartowany, oczekujące „announce back” zostaną utracone.
- Podagenci współdzielą zasoby procesu gateway; traktuj
maxConcurrentjako zawór bezpieczeństwa. sessions_spawnjest zawsze nieblokujące: zwraca{ status: "accepted", runId, childSessionKey }natychmiast.- Kontekst podagenta wstrzykuje tylko
AGENTS.md+TOOLS.md(bezSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdaniBOOTSTRAP.md). - Maksymalna głębokość zagnieżdżenia to 5 (
maxSpawnDepthzakres: 1–5). Głębokość 2 jest rekomendowana w większości przypadków. maxChildrenPerAgentogranicza liczbę aktywnych dzieci na sesję (domyślnie: 5, zakres: 1–20).