langchain-copilotkit

March 15, 2026 · View on GitHub

LangChain Agent Adapter for CopilotKit — connect LangChain/LangGraph agents to CopilotKit via the AG-UI protocol without running a separate server.

Features

  • In-process integration — no langgraph dev server required
  • CopilotKit-readyLangChainAgentAdapter extends AbstractAgent from @ag-ui/client
  • Full event mapping — text streaming, tool calls, state snapshots, step tracking
  • HITL support — interrupt/resume with approve, reject, and natural language feedback

Installation

npm install langchain-copilotkit @langchain/core @langchain/langgraph

Quick Start

import { CopilotRuntime } from "@copilotkit/runtime";
import { createDeepAgent } from "deepagents";
import { LangChainAgentAdapter } from "langchain-copilotkit";

const agent = createDeepAgent({ model: "claude-sonnet-4-6" });

const runtime = new CopilotRuntime({
  agents: [new LangChainAgentAdapter({ agent })],
});

Next.js App Router

// app/api/copilotkit/route.ts
import { CopilotRuntime, copilotRuntimeNextJSAppRouterEndpoint } from "@copilotkit/runtime";
import { createDeepAgent } from "deepagents";
import { LangChainAgentAdapter } from "langchain-copilotkit";

const agent = createDeepAgent({ model: "claude-sonnet-4-6" });
const runtime = new CopilotRuntime({
  agents: [new LangChainAgentAdapter({ agent })],
});

export const { handleRequest: POST } = copilotRuntimeNextJSAppRouterEndpoint({
  runtime,
  endpoint: "/api/copilotkit",
});

API

LangChainAgentAdapter

Extends AbstractAgent from @ag-ui/client.

new LangChainAgentAdapter(options)
OptionTypeDefaultDescription
agentRunnableA LangGraph compiled graph or any LangChain Runnable
stateKeysstring[][]State keys to include in STATE_SNAPSHOT events
statefulbooleantrueSend only new messages (set false for stateless runnables)

Stateful Mode (default)

By default, the adapter operates in stateful mode — it sends only new user messages on subsequent turns, preventing message duplication in checkpointer-backed graphs (e.g. MemorySaver, PostgresSaver). CopilotKit sends the full message history on every turn, but the checkpoint already holds the correct history.

Set stateful: false only for stateless runnables without a checkpointer:

new LangChainAgentAdapter({
  agent: compiledGraph,
  stateKeys: ["files"],
})

convertMessages(messages) / convertToAgUiMessages(messages)

Bidirectional conversion between AG-UI Message[] and LangChain BaseMessage[].

EventMapper

Low-level class that maps individual LangChain StreamEvent objects to AG-UI BaseEvent[].

Event Mapping

LangChain EventAG-UI Event(s)
on_chat_model_streamTEXT_MESSAGE_START, TEXT_MESSAGE_CONTENT
on_chat_model_stream (tool)TOOL_CALL_START, TOOL_CALL_ARGS
on_chat_model_endTEXT_MESSAGE_END, TOOL_CALL_END
on_tool_endTOOL_CALL_RESULT
on_chain_start (node)STEP_STARTED
on_chain_end (node)STATE_SNAPSHOT (if stateKeys set), STEP_FINISHED
(run lifecycle)RUN_STARTED, RUN_FINISHED, RUN_ERROR

License

MIT