Langchain Middleware

Implement human-in-the-loop approval flows, custom middleware, and Command resume patterns with LangChain. Use when building agent workflows that require user confirmation, interrupts, or approval gates.

LangChain Middleware

When to use

When building agent workflows that pause for human approval, implement custom processing steps, or need to resume from interruption points. Relevant for any Bayes venture product with approval flows (e.g., payment confirmations, document review gates).

Human-in-the-loop pattern

from langgraph.graph import StateGraph
from langgraph.types import interrupt, Command

def approval_node(state):
    """Pause execution and ask the human for approval."""
    decision = interrupt(
        {"question": "Approve this action?", "context": state["pending_action"]}
    )
    if decision == "approved":
        return {"status": "approved"}
    return {"status": "rejected"}

Custom middleware

from langchain_core.runnables import RunnableConfig

def logging_middleware(func):
    async def wrapper(state, config: RunnableConfig):
        print(f"Entering {func.__name__} with state keys: {list(state.keys())}")
        result = await func(state, config)
        print(f"Exiting {func.__name__}")
        return result
    return wrapper

Command resume

from langgraph.types import Command

def handle_resume(state):
    """Resume from where the agent was interrupted."""
    return Command(goto="next_step", update={"resumed": True})

When NOT to use

  • Simple sequential LLM calls without approval gates
  • Stateless API endpoints (use standard request/response instead)