Pauzowanie i wznowienie agentów LangGraph przy użyciu interrupt() oraz Command
W jaki sposób funkcje interrupt() i Command w LangGraph wykorzystują punkty kontrolne oraz wątki, aby zawiesić agenta w oczekiwaniu na zatwierdzenie, edycje lub dane od człowieka, a następnie bezpiecznie wznowić jego działanie później.
Agent, który może przesuwać pieniądze, usuwa zasoby lub wdrażać rozwiązania do produkcji, nie powinien zawsze mieć możliwości dokończenia tego, co rozpoczął. Czasami graf musi celowo się zatrzymać, czekać godzinami na osobę, a następnie kontynuować dokładnie tam, gdzie przerwał. Ten artykuł wyjaśnia, w jaki sposób LangGraph robi to za pomocą interrupt() i Command, dlaczego zależy od punktów kontrolnych i wątków, oraz jakie decyzje nadal należy podjąć przed uruchomieniem agentów typu HITL w produkcji.
Bazy budulcowe
HITL opiera się na trzech warstwach. Po pierwsze, wykonywanie grafu: stan przechodzi do węzła, a krawędź wybiera następny węzeł.
STATE
↓
NODE
↓
EDGE
↓
NEXT NODE
Po drugie, zarządzanie stanem: węzły zwracają aktualizacje, a reduktory łączą je w nowy stan.
NODE
↓
STATE UPDATE
↓
REDUCER
↓
NEW STATE
Po trzecie, trwałość: punkt kontrolny zapisuje stan jako punkty kontrolne grupowane pod danym wątkiem.
STATE
↓
CHECKPOINT
↓
CHECKPOINTER
↓
THREAD
↓
PERSISTENCE
Wspólnie umożliwiają one agentowi działanie, pamiętanie informacji oraz przetrwanie restartów. Brakuje jednak sposobu na decydowanie, czy w ogóle powinien kontynuować działanie.
Kiedy agent nie powinien po prostu kontynuować
Użytkownik mówi do asystenta płatności: „Przelej ₹50 000 na ten rachunek”. Agent przygotowuje transakcję, a technicznie nic nie stoi na przeszkodzie jej wykonaniu.
User
↓
Agent
↓
Prepare Transfer
↓
Transfer ₹50,000
↓
Execute
W przypadku tak istotnej czynności osoba odpowiedzialna powinna najpierw przejrzeć propozycję, aby proces mógł skręcić w zależności od decyzji człowieka.
User
↓
Agent
↓
Prepare Transfer
↓
┌─────────────────────┐
│ HUMAN APPROVAL │
└──────────┬──────────┘
│
┌───┴───┐
↓ ↓
Approve Reject
│ │
↓ ↓
Execute Cancel
Teraz graf musi zostać celowo zatrzymany: nie z powodu błędu czy awarii, ale dlatego, że w tym miejscu proces wymaga interwencji człowieka.
Co oznacza human-in-the-loop
HITL wprowadza decyzje ludzkie do zautomatyzowanego procesu. Zamiast przechodzić bezpośrednio od decyzji do działania,
Agent
↓
Decision
↓
Action
agent proponuje rozwiązanie, robi pauzę i czeka na jego sprawdzenie.
Agent
↓
Proposed Action
↓
PAUSE
↓
Human Review
↓
Decision
↓
Continue
Przeglądający może zatwierdzić, odrzucić, edytować propozycję, dostarczyć brakujące dane, skorygować agenta lub wybrać jedną z alternatyw. To odpowiada każdemu kroku, który ma rzeczywiste konsekwencje.
Financial transactions
Sending emails
Deleting resources
Production deployments
Database modifications
Legal workflows
Publishing content
Access approvals
Sensitive tool calls
Czego naprawdę wymaga pauzowanie grafu
Weźmy łańcuch z krokiem zatwierdzenia przed ostatnim węzłem.
Node A
↓
Node B
↓
Human Approval
↓
Node C
Jeśli przeglądający odpowie po sześciu godzinach, zablokowanie procesu to niewłaściwa decyzja: marnuje się pracownik i całość przestaje działać przy pierwszym ponownym uruchomieniu.
sleep(21600)
Zamiast tego należy zapisać stan i zatrzymać się,
Node B
↓
SAVE STATE
↓
PAUSE EXECUTION
↓
a następnie przywrócić go później, ewentualnie w innym procesie, i kontynuować od następnego węzła.
Application can stop──────── 6 HOURS LATER ────────Human responds
↓
RESTORE STATE
↓
CONTINUE EXECUTION
↓
Node C
Persystencja już rozwiązuje połowę tego problemu. Punkty kontrolne, mechanizm zarządzania punktami kontrolnymi, wątki oraz thread_id to dokładnie to, czego potrzeba przy długiej pauzie.
Checkpoint
Checkpointer
Thread
thread_id
Persistence
Jak funkcja interrupt() zatrzymuje wykonywanie
interrupt() wstrzymuje działanie grafu i prosi zewnętrzny świat o wartość. Wywołuje się ją wewnątrz węzła z treścią możliwą do serializacji w formacie JSON, która opisuje to, co powinien zobaczyć recenzent. Fragment kodu jest napisany w Pythonie, mimo swojego pierwotnego oznaczenia.
from langgraph.types import interrupt
def approval_node(state):
decision = interrupt({
"question": "Do you approve this transaction?",
"amount": state["amount"]
})
return {
"decision": decision
}
Gdy wykonanie dociera do tego wywołania,
interrupt(...)
węzeł nie dochodzi do instrukcji powrotu. Działanie zostaje wstrzymane, a przekazana treść wraca do wywołującego w celu wyświetlenia.
approval_node
│
↓
interrupt()
│
↓
┌─────────────────┐
│ EXECUTION PAUSED│
└─────────────────┘
Ważne są dwa szczegóły. interrupt() wymaga grafu skompilowanego z checkpointerem, ponieważ stan wstrzymania musi zostać gdzieś zachowany. Po wznowieniu działania LangGraph ponownie uruchamia węzeł przerwany od początku, przy czym interrupt() zwraca teraz wartość podaną przez użytkownika, więc kod przed tym wywołaniem jest uruchamiany dwa razy. Unikaj efektów ubocznych w tej części węzła i sprawdź zachowanie swojej wersji w dokumentacji LangGraph.
Co jest zapisywane podczas przerwy
Rozważmy ten wykres.
START
↓
Prepare Transfer
↓
Human Approval
↓
Execute Transfer
↓
END
Węzeł przygotowawczy aktualizuje stan, zapisywany jest punkt kontrolny, a węzeł zatwierdzający wywołuje interrupt().
START
↓
Prepare Transfer
↓
State Updated
↓
Checkpoint
↓
Approval Node
↓
interrupt()
Bieżący stan jest zapisywany i przechowywany.
Current State
│
↓
Checkpoint
│
↓
Persistent Storage
Wątek posiada teraz szczegóły transferu, status w oczekiwaniu oraz powód zatrzymania.
THREAD: transaction-123
Checkpoint
────────────────────
amount ₹50,000
recipient Account X
status pending
────────────────────
Execution:
PAUSED
Reason:
Human approval required
To wszystko, co jest potrzebne do kontynuacji później. Bez persistencji proces po prostu zniknąłby po przerwie.
Agent
↓
interrupt
↓
process disappears
↓
???
Gdy osoba sprawdzająca napisze „Zatwierdzone” następnego dnia, nikt nie będzie wiedział, co zostało zatwierdzone, gdzie zatrzymał się wykres ani który węzeł następuje dalej. Dzięki punktom kontrolnym stan jest ładowany z wątku i przywracany przed kontynuacją.
INTERRUPT
│
↓
CHECKPOINT
│
↓
THREAD
│
↓
PERSISTENT STORAGE
...time passes...
HUMAN INPUT
│
↓
THREAD
│
↓
LOAD CHECKPOINT
│
↓
RESTORE STATE
│
↓
RESUME
Kontynuacja za pomocą polecenia
Aplikacja wyświetla treść przerwy jako pytanie
Approve transfer of ₹50,000?
z dwoma przyciskami,
[ APPROVE ] [ REJECT ]
a osoba sprawdzająca wybiera jeden z nich.
APPROVE
Odpowiedź wraca przez Command, który informuje graf o dalszych krokach. Aby wznowić działanie, należy wywołać graf za pomocą Command(resume=...) zamiast normalnego wprowadzenia danych.
from langgraph.types import Command
graph.invoke(
Command(resume="approved"),
config=config
)
config musi używać tej samej wątku co zatrzymana eksploatacja,
thread_id = transaction-123
ponieważ identyfikator wątku jest tym, dzięki czemu LangGraph wie, o której zatrzymanej eksploatacji mowa.
Kroki cyklu życia krok po kroku
Eksploatacja rozpoczyna się od zwykłego wywołania,
graph.invoke()
czyta swój wątek z konfiguracji,
thread_id = transaction-123
wchodzi w węzeł przygotowania,
START
↓
Prepare Transfer
i zapisuje informacje o przeniesieniu do stanu.
amount = ₹50,000
recipient = Account X
status = pending
Węzeł zatwierdzenia wywołuje interrupt(),
Approval Node
↓
interrupt()
a wykonywanie jest wstrzymane.
EXECUTION PAUSED
Najnowszy punkt kontrolny pozostaje bezpieczny w ramach wątku.
Thread
↓
Checkpoint
↓
Persistent Storage
Człowiek widzi prośbę
Approve ₹50,000 transfer?
i odpowiada.
YES
Aplikacja wysyła polecenie wznowienia
Command(resume="approved")
do tego samego wątku.
transaction-123
LangGraph przywraca wykonywanie, przekazuje decyzję węzłowi zatwierdzenia i kontynuuje do końca.
Restore Execution
↓
Human Decision = approved
↓
Continue Graph
↓
Execute Transfer
↓
END
Każdy poniższy wzorzec jest wariacją tego cyklu życia.
Decyzje ludzkie poza tak lub nie
Odpowiedź recenzenta nie musi być binarna.
YES / NO
Zatwierdzenie wykonuje propozycję.
Agent Proposal
↓
Human
↓
APPROVE
↓
Execute
Odrzucenie ją anuluje.
Agent Proposal
↓
Human
↓
REJECT
↓
Cancel
Edycja zmienia jej część, np. kwotę, zanim graf może kontynuować.
Agent:
Send ₹50,000
↓
Human:
Change to ₹40,000
↓
Graph continues with
updated information
Dostarczenie brakujących informacji zamienia przerwanie w pytanie.
Agent
↓
Missing Account Number
↓
INTERRUPT
↓
Human provides account
↓
RESUME
Wybór pozwala agencji zaproponować alternatywy i pozostawić decyzję osobie.
Agent generates:
Option A
Option B
Option C
↓
Human chooses B
↓
Graph continues
HITL to ogólny sposób wprowadzania danych od człowieka do działającego grafu, a nie tylko dialog zatwierdzania.
Polecenie jako przepływ danych i przepływ sterowania
Polecenie może również aktualizować stan i wybrać następne miejsce przeznaczenia.
Resume Execution
Update State
Choose Next Destination
Jedno polecenie może ustalić stan i przekazać wykonywanie do konkretnego węzła; w LangGraph ta forma jest zazwyczaj zwracana przez węzeł.
Command(
update={
"status": "approved"
},
goto="execute"
)
To łączy dwie kwestie,
DATA FLOW
+
CONTROL FLOW
ponieważ routowanie wcześniej należało wyłącznie do krawędzi.
Edges control where we go.
Teraz jeden obiekt może zawierać zarówno zmianę stanu, jak i następny krok.
Command can participate in
state updates + control decisions.
Korygowanie stanu przed kontynuacją
Załóżmy, że stan przechowuje tę kwotę,
amount = 50000
a recenzent zatwierdza ją po wprowadzeniu korekty.
Approve, but change amount to 40000.
Przepływ przebiega od wartości początkowej, przez proces recenzji, do zaktualizowanej wartości, a dopiero wtedy jest kontynuowany (drugi fragment pojawia się na jednej linii).
BEFORE
amount = 50000 ↓Human Review ↓UPDATEamount = 40000 ↓RESUME
Pytanie zmienia się z „Czy mogę kontynuować?” na „Sprawdzić, poprawić w razie potrzeby, a potem kontynuować.”
Kontrola wywołań wrażliwych narzędzi
HITL jest najpraktyczniejszy przy wykorzystaniu narzędzi o wysokim ryzyku.
search_web()
read_database()
send_email()
delete_resource()
transfer_money()
Wyszukiwanie w internecie może być uruchamiane automatycznie,
search_web()
↓
Execute Automatically
natomiast usuwanie zasobu powinno czekać na zatwierdzenie.
delete_resource()
↓
INTERRUPT
↓
Human Approval
Każde wywołanie narzędzia przechodzi kontrolę wrażliwości: bezpieczne wywołania są realizowane, natomiast wrażliwe są przerywane w celu uzyskania zatwierdzenia lub anulowania.
Agent
│
↓
Tool Call
│
↓
Sensitive Tool?
/ \
NO YES
│ │
↓ ↓
Execute INTERRUPT
│ │
│ ↓
│ Human
│ / \
│ Approve Reject
│ │ │
└─────────┘ ↓
Cancel
Aby zapoznać się z pełniejszą implementacją opartą na magazynie danych, sprawdź agenty z kontrolą zatwierdzenia w LangGraph.
Przegląd jako celowe ograniczenie kontroli
Ludzki przegląd nie jest naprawą dla agenta, który nie jest wystarczająco inteligentny. To granica umieszczona celowo. Prace o niskim ryzyku są wykonywane automatycznie,
LOW RISK
Search
Read
Summarize
↓
Automatic
a prace o wysokim ryzyku przechodzą przez człowieka.
HIGH RISKSend
Delete
Purchase
Transfer
Deploy
↓
Human Approval
Celem jest określenie, gdzie autonomia jest odpowiednia, a nie jej ograniczanie wszędzie.
Zarządzanie odrzuceniami i milczeniem
Odrzucenie wymaga rzetelnego projektowania.
Agent
↓
Prepare Action
↓
Interrupt
↓
Human
↓
REJECT
Zapisz wynik w stanie,
status = "rejected"
następnie skieruj działanie na podstawie tego wyniku za pomocą warunkowego krawędzi.
Decision
/ \
approved rejected
│ │
↓ ↓
Execute Cancel
│ │
↓ ↓
END END
Wszystkie wcześniejsze koncepcje biorą udział, a dane wprowadzone przez człowieka to po prostu dodatkowe informacje kształtujące wykonywanie zadań.
State
Reducers
Conditional Routing
Checkpoints
Threads
Commands
Recenzenci również mogą nigdy nie odpowiedzieć.
Interrupt
↓
Waiting for approval
↓
1 hour
↓
1 day
↓
7 days
Wątek w stanie pauzy może czekać nieograniczenie, dlatego aplikacja wymaga określonych zasad.
Expiration
Timeout
Cancellation
Reminder
Escalation
Powszechnym rozwiązaniem jest czekanie z ograniczeniem czasowym, zwykle realizowane przez planer, który przywraca wątki o przestarzałych danych po upływie określonego czasu.
Approval Requested
│
↓
Wait up to 24 hours
│
┌───┴────┐
↓ ↓
Response Timeout
│ │
↓ ↓
Resume Cancel
LangGraph dostarcza podstawowe elementy; zasady biznesowe należą do Ciebie.
Wielokrotne bramy i przepływ danych
Agent odpowiedzialny za wdrożenie może prosić o zatwierdzenie swojego planu, a ponownie przed uruchomieniem w produkcji.
START
↓
Analyze Code
↓
Generate Deployment Plan
↓
Human Approval #1
↓
Deploy to Staging
↓
Run Tests
↓
Human Approval #2
↓
Deploy Production
↓
END
Każda brama pauzuje i przywraca ten sam wątek, tworząc historię punktów kontrolnych i przerwań.
Thread
│
├── CP1
│
├── CP2
│
├── INTERRUPT
│
├── RESUME
│
├── CP3
│
├── INTERRUPT
│
├── RESUME
│
└── END
To jest trwały przepływ pracy udostępniany zarówno ludziom, jak i agentowi. Do tej pory każdy przykład wykorzystywał funkcję blokującą,
graph.invoke(...)
która zwraca wynik tylko wtedy, gdy wykonanie się kończy lub zostaje wstrzymane.
START → A → B → C → END
↓
RESULT
Aplikacje interaktywne wymagają informacji o postępach w czasie rzeczywistym, aż do złożenia prośby o zatwierdzenie.
START
↓
Planner Update ─────────→ UI
↓
Tool Call ──────────────→ UI
↓
Tool Result ────────────→ UI
↓
Approval Required ──────→ UI
Strumieniowanie dostarcza te zdarzenia, dzięki czemu interfejs może pokazywać ukończone kroki oraz decyzję w oczekiwaniu.
┌──────────────────────────────────┐
│ Deployment Agent │
├──────────────────────────────────┤
│ │
│ ✓ Analyzed repository │
│ │
│ ✓ Generated deployment plan │
│ │
│ ✓ Staging tests passed │
│ │
│ ⚠ Production deployment ready │
│ │
│ Human approval required │
│ │
│ [ APPROVE ] [ REJECT ] │
│ │
└──────────────────────────────────┘
Za tym ekranem zdarzenia trafiają do frontendu, a decyzja jest zwracana za pomocą Command(resume=...).
LangGraph
│
↓
Streaming
│
↓
Frontend
│
↓
Human Decision
│
↓
Command(resume=...)
│
↓
LangGraph
Pełny model wykonywania
Na jednym diagramie: użytkownik uruchamia graf na wątku, stan przechodzi przez węzły i reduktory, zapisywane są punkty kontrolne, routery wybierają następny krok, a czynności wrażliwe kierowane są do przerwy, którą rozstrzyga człowiek.
USER
│
↓
graph.invoke()
│
↓
THREAD
│
↓
CHECKPOINTER
│
↓
STATE
│
↓
NODE
│
↓
STATE UPDATE
│
↓
REDUCER
│
↓
NEW STATE
│
↓
CHECKPOINT
│
↓
EDGE / ROUTING
│
↓
SENSITIVE ACTION?
/ \
NO YES
│ │
↓ ↓
NEXT NODE interrupt()
│
↓
PAUSED
│
↓
HUMAN
/ | \
/ | \
Approve Edit Reject
│ │ │
└────────┼────────┘
↓
Command(resume)
│
↓
SAME thread_id
│
↓
RESTORE CHECKPOINT
│
↓
CONTINUE GRAPH
│
↓
END
Jako historia: przychodzi prośba
User Input
i rozpoczyna się wykonywanie.
START
Węzły odczytują stan i zwracają aktualizacje, reduktory je łączą, punkty kontrolne zapisują je w ramach określonego wątku, a krawędzie decydują, co ma zostać uruchomione dalej. Graf może się rozgałęziać, tworzyć pętle lub wywoływać narzędzia.
BRANCH
LOOP
CALL TOOLS
Gdy potrzebna jest interwencja człowieka, przerwa wstrzymuje jego działanie.
interrupt()
Człowiek reaguje,
APPROVE
REJECT
EDIT
PROVIDE INPUT
a polecenie kontynuacji działa dalej z wątku, w którym dane zostały zachowane,
Command(resume=...)
a graf kończy swoją pracę.
END
Większość projektów zaczyna się od jednego wywołania modelu,
LLM
↓
Response
a kończy grafem łączącym węzły LLM i narzędzi, reduktory, punkty kontrolne, mechanizmy routingu, przerwy oraz polecenia.
USER
│
↓
START
│
↓
STATE
│
↓
NODE
│
┌──────┴──────┐
│ │
LLM TOOL
│ │
└──────┬──────┘
↓
STATE UPDATE
│
↓
REDUCER
│
↓
NEW STATE
│
↓
CHECKPOINT
│
↓
THREAD
│
↓
ROUTING
/ | \
/ | \
NODE LOOP INTERRUPT
│
↓
HUMAN
/ | \
Approve Edit Reject
\ | /
\ | /
↓
COMMAND
│
↓
RESUME
│
↓
NEXT NODE
│
↓
END
Lista kontrolna produkcji
Zachowaj skupienie węzłów
Mniejsze, jednoznaczne węzły są łatwiejsze do testowania, ponawiania prób oraz bezpiecznego przerywania,
Plan Node
Search Node
Validate Node
Execute Node
w odróżnieniu od węzła, który robi wszystko.
do_everything_agent()
Zamierzony projekt stanu i reduktorów
Zachowaj tylko to, czego potrzebują węzły, ponieważ wszystko jest zapisywane jako punkty kontrolne i może zostać pokazane recenzentom. Starannie dobieraj reduktory dla pól, które gromadzą dane.
messages
events
results
observations
Czynienie efektów ubocznych idempotentnymi
Operacje nieodwracalne wymagają szczególnej ostrożności.
Send Email
Charge Card
Delete Resource
Deploy
Transfer Money
Próby ponownego uruchomienia nigdy nie powinny je powtarzać. Ponieważ przerwany węzeł uruchamia się ponownie po wznowieniu, umieść nieodwracalne wywołania po punkcie zatwierdzenia lub w oddzielnym węźle, a także użyj kluczy idempotencji tam, gdzie API je obsługują.
Używaj trwałej persistencji
Punkty kontrolne w pamięci nadają się do celów edukacyjnych; produkcja wymaga trwałego przechowywania dostosowanego do Twoich wymagań dotyczących niezawodności.
Zapisz granice i limity
Decyduj o nich wyraźnie dla każdego procesu pracy,
What can AI do automatically?
What requires approval?
What can humans modify?
When does approval expire?
i określ warunki zakończenia pętli.
Maximum attempts
Timeouts
Validation
Failure paths
Escalation
Kiedy HITL jest opłacalny
Ludzka weryfikacja przynosi korzyści w określonych sytuacjach.
Cost of wrong action is high
Action is irreversible
Policy requires approval
Agent confidence is insufficient
Sensitive information is involved
Human judgment adds value
Rozproszone wszędzie, uniemożliwiają one automatyzację i zmuszają osoby sprawdzające do klikania bez czytania.
Agent
↓
Ask Human
↓
Agent
↓
Ask Human
↓
Agent
↓
Ask Human
Lepszy projekt zapewnia agentowi autonomiczną strefę do planowania i rozumowania, z jedną granicą przed podjęciem decyzji.
AUTONOMOUS ZONE
┌───────────────────────┐
│ │
│ Plan → Search → Think │
│ │
└───────────┬───────────┘
│
↓
CONTROL BOUNDARY
│
↓
HUMAN
│
↓
APPROVED ACTION
Jak warstwy się łączą
Egzekucja grafu obejmuje węzły, krawędzie i routowanie;
Graph
Nodes
Edges
START
END
Loops
Conditional Routing
Zarządzanie stanem obejmuje aktualizacje i reduktory;
State
State Updates
Reducers
Messages
State Evolution
Trwałość danych obejmuje punkty kontrolne, wątki i przywracanie stanu;
Checkpoints
Checkpointer
Threads
thread_id
State History
Recovery
A HITL dodaje przerwy, polecenia i wzorce weryfikacji.
interrupt()
Command
Pause
Resume
Approve
Reject
Edit
Human Control
Ułożone warstwami, tworzą jedną ścieżkę przetwarzania.
GRAPH
↓
STATE
↓
NODE
↓
UPDATE
↓
REDUCER
↓
CHECKPOINT
↓
THREAD
↓
ROUTING
↓
INTERRUPT
↓
HUMAN
↓
COMMAND
↓
RESUME
↓
END
Główne wnioski
Słownictwo może wydawać się przytłaczające,
StateGraph
MessagesState
Reducers
Checkpointers
Threads
Commands
Interrupts
ale każda z tych części rozwiązuje jeden aspekt jednego celu: agent, który wie, działa, aktualizuje dane, podejmuje decyzje, zapisuje postępy, zatrzymuje się w odpowiednim momencie, pyta człowieka i bezpiecznie kontynuuje pracę.
Remember what it knows
↓
Perform some work
↓
Update what it knows
↓
Decide what to do next
↓
Persist its progress
↓
Pause when necessary
↓
Ask a human
↓
Resume safely
↓
Continue until complete
- Stan to to, co wie agent, węzły to to, co robi, krawędzie to miejsca, do których udaje się agent, a reduktory określają, jak zmienia się stan.
- Punkty kontrolne rejestrują, gdzie agent się znajdował; wątki wskazują, do którego historii należy dana operacja.
interrupt()określa miejsce zatrzymania i moment zadania pytania;Commandwskazuje, jak kontynuować pracę, zawsze na tym samym wątku.- Zatrzymane węzły uruchamiają się ponownie po wznowieniu, dlatego należy zachować nieodwracalne skutki uboczne po punkcie zatwierdzenia.
- Należy umieszczać procedury sprawdzania na rzeczywistych granicach kontroli, z wyraźnymi regułami czasu wygaśnięcia i eskalacji.
Literatura pokrewna
- Bramy zatwierdzenia w LangGraph.js: Pauzowanie agentów za pomocą interrupt() i Command — Stwórz minimalną bramę zatwierdzenia w LangGraph.js, która pauzuje przed wywołaniem efektu ubocznego, zbiera decyzję człowieka w terminalu i bezpiecznie kontynuuje działanie od punktu kontrolnego.
- Agenty specjalistyczne, router słów kluczowych i interrupt(): Trener LangGraph — Zaprojektuj asystenta LangGraph składającego się z dwóch specjalistów, wyposażonego w deterministyczny router, wspólny stan przetrzymujący dane podczas przenoszenia obowiązków oraz punkt kontrolny dla człowieka oparty na funkcjach interrupt i Command.