Human approval steps for LangGraph agents
An agent that sends reports or changes records should stop and ask first. How I build approval steps, retries and tracing into LangGraph workflows.
An agent that drafts a report is useful. An agent that sends it without anyone reading it is a risk. In the workflows I build, any step with consequences outside the system stops and waits for a person.
Where to put the stop
Not every step needs approval. I ask one question per step: if this goes wrong, can we undo it quietly? Reading documents and drafting text can be redone. Sending an email, filing an incident or changing a record cannot, so those wait for a person.
Building it in LangGraph
LangGraph can pause a graph before a chosen node and resume it later from saved state. The approval step is a node like any other: the run stops there, the reviewer sees the draft and its sources, and approves, edits or rejects it. The decision is stored with the run.
Retries without loops
Tools fail: a timeout, a malformed answer, a missing field. Each tool call gets a small retry budget and a check on its output. When the budget runs out, the run goes to a person instead of trying forever.
Trace everything
Every step, retry and approval lands in Langfuse. When someone asks why the agent wrote what it wrote, the answer is one link away.
Keep reading
All posts
How to evaluate a RAG system without fooling yourself
A high retrieval score can still hide wrong answers. The reference sets, metrics and release gate I use to know whether a RAG change made answers better.
Running open-weight LLMs on your own GPUs
When health data cannot leave the building, the model has to come to the data. What self-hosting open-weight LLMs costs, and what it buys you.
Hybrid search: when BM25 beats embeddings
Embeddings miss exact codes, product names and section numbers that keyword search finds at once. Why my RAG systems combine BM25 and vector search.