LangWatch integrates with LangGraph to provide detailed observability into your state graphs, node executions, and workflow patterns.
Installation
npm i langwatch @langchain/openai @langchain/core @langchain/langgraph zod
Usage
The LangWatch API key is configured by default via the LANGWATCH_API_KEY environment variable.
Use LangWatchCallbackHandler with your LangGraph state graph to capture node executions and workflow patterns.
import { setupObservability } from "langwatch/observability/node";
import { LangWatchCallbackHandler } from "langwatch/observability/instrumentation/langchain";
import { ChatOpenAI } from "@langchain/openai";
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
import { StateGraph, START, END } from "@langchain/langgraph";
import { MemorySaver } from "@langchain/langgraph";
import { z } from "zod";
setupObservability({ serviceName: "<project_name>" });
const GraphState = z.object({
question: z.string(),
final_answer: z.string().default(""),
});
type GraphStateType = z.infer<typeof GraphState>;
async function main(message: string): Promise<string> {
const llm = new ChatOpenAI({ model: "gpt-5" });
const generate = async (state: GraphStateType) => {
const result = await llm.invoke([
new SystemMessage("You are a helpful assistant."),
new HumanMessage(state.question),
]);
return { final_answer: result.content as string };
};
const app = new StateGraph(GraphState)
.addNode("generate", generate)
.addEdge(START, "generate")
.addEdge("generate", END)
.compile({ checkpointer: new MemorySaver() })
.withConfig({ callbacks: [new LangWatchCallbackHandler()] });
const out = await app.invoke(
{ question: message },
{ configurable: { thread_id: crypto.randomUUID() } },
);
return out.final_answer;
}
console.log(await main("Hey, tell me a joke"));
The LangWatchCallbackHandler captures LangGraph node executions and workflow patterns. Pass the callback handler to your compiled graph via withConfig().