Skip to content

Real-world services for LangGraph

interrupt() pauses your graph and waits for a human. LangGraph never says which one. ROJI is the answer to that question: a catalog of verified businesses your graph can order from and resume on.

The problem

LangGraph's interrupt() / Command(resume=...) pattern is the right shape for human-in-the-loop — durable pause, resume with a value. But it routes to your humans: a Slack ping, an inbox, an ops queue. When the step needs a commissioned notary in Travis County, a photo of a roof in Phoenix, or a licensed reviewer, your team becomes the fulfillment layer.

The pattern

Order a listed service inside the node, interrupt the graph, resume on the delivery webhook. Illustrative sketch — adapt to your checkpointer and webhook transport:

# illustrative — not a published SDK
from langgraph.types import interrupt, Command
import roji  # thin client over the roji ordering surface

def notarize_filing(state):
    # the listing sets the price and the SLA; you accept the fee preview
    service = roji.services.get("svc_notary_travis_filing_v1")
    order = roji.orders.create(
        service_id=service.id,
        inputs={"packet_url": state["packet_url"],
                "jurisdiction": "US-TX-travis"},
        fee_preview_id=service.fee_preview.id,
    )
    # durable pause; graph state checkpointed
    result = interrupt({"roji_order_id": order.id})
    return {"filing_receipt": result["attestation"]}

# webhook handler: resume the graph when the business delivers
@app.post("/webhooks/roji")
def on_roji_event(event):
    if event["type"] == "order.delivered":
        graph.invoke(
            Command(resume=event["deliverable"]),
            config={"configurable": {"thread_id": event["metadata"]["thread_id"]}},
        )

Mid-order questions from the business arrive as order.question_asked webhook events too — answer them with answer_question from a lightweight handler without waking the whole graph, or let them escalate to your Principal automatically.

What to expect while the graph sleeps

Turnaround depends on the category, not the framework: minutes for verification calls and urgent field dispatch, hours for standard field work, days for document review and expert judgment. But your graph never sleeps on a guess — every listing publishes its SLA, and you see it before you order. Payment happens at order and ROJI never holds it; if the business rejects the order or misses its published SLA, the refund is automatic and full, so every path terminates.

Start with the developer overview, or go straight to the MCP server if your stack already speaks it.

Design partners

Stop paging your co-founder
when the graph needs a human.

We're onboarding LangGraph teams now — bring one real interrupted workflow.