DEV Community

Cover image for Yes, We Support LangGraph — Here's Why That Was Never a Separate Integration
Babar Hayat for OpsVeritas

Posted on

Yes, We Support LangGraph — Here's Why That Was Never a Separate Integration

We never built LangGraph support. It's worked from day one anyway — and until now, we'd never actually said so anywhere.

That's not a typo. Here's the reasoning, and why it matters if you're one of the teams running LangGraph in production (Klarna, Uber, LinkedIn, BlackRock, Cisco, Elastic, and JPMorgan all reportedly do).

LangGraph doesn't have its own way of calling a model

LangGraph models agents as explicit state graphs — nodes, edges, persistent state, checkpoints, human-in-the-loop gates. It's a genuinely good abstraction for production agent orchestration. But when a LangGraph node actually needs to call an LLM, it doesn't invent a new calling convention to do it — it reaches for a standard LangChain chat model and calls .invoke() or .ainvoke() on it, exactly the same interface any other LangChain code uses.

That single fact is the whole story.

What we actually built

Our LangChain integration works at the model-object layer, not the orchestration layer:

  • opsveritas.langchain("Agent Name") — a callback handler for telemetry (tokens, cost, latency, status).
  • wrapLangChain() / wrap_langchain() — patches .invoke()/.ainvoke() directly on the model object, for kill-switch enforcement (see our kill switch article for what that actually does).

Neither of those cares what's calling the model. A LangGraph node, a plain LangChain chain, a custom orchestration loop — if it's invoking a wrapped model object, we see it. We didn't write a single line of LangGraph-specific code, because the integration point was never LangGraph. It was always the model.

model = ChatOpenAI(callbacks=[opsveritas.langchain("My Agent")])  # telemetry
opsveritas.wrap_langchain(model, agent_name="My Agent")           # kill-switch enforcement
graph_builder.add_node("call_model", make_node(model))            # LangGraph uses the wrapped model, unmodified
Enter fullscreen mode Exit fullscreen mode

That's the entire integration. The graph never knows the model underneath it is instrumented.

Why we're only saying this now

Because until recently, we hadn't said it anywhere — not the docs, not onboarding, not the dashboard. A prospect evaluating us against a LangGraph-based stack would have had no way to know it already worked. That's a real gap between what the product does and what it visibly claims to do, and it's now closed across our docs, onboarding, and settings pages.

If you're running LangGraph and monitoring silent failures, cost, or kill-switch enforcement, wrap the model before you pass it to the graph. That's it.

Top comments (0)