@threadplane/langgraph · LangGraph adapter

LangGraph agent UI for Angular.

Ship LangGraph agents inside your Angular app. Agent state arrives as signals; threads survive reloads; humans stay in the loop.

Not sure if LangGraph is right for your backend? See Choosing an adapter.

MITAngular 20–22LangGraph + AG-UI

Architecture

Native LangGraph, behind the Agent contract

The adapter speaks LangGraph Platform directly — threads, runs, checkpoints — and hands your components the same signal-shaped contract every Threadplane surface consumes.

CHAT UI@threadplane/chat<chat> · <chat-message-list> · <chat-input>Agent contract · signals + events$ADAPTER@threadplane/langgraphADAPTER@threadplane/ag-uiLangGraph PlatformCrewAI · Mastra · Agent Fwk · Strands · …

Providers

Drop it into app.config.ts. Done.

provideAgent wires LangGraph into Angular's DI container. From any component, injectAgent() returns a signal-based handle for messages, status, errors, and interrupts.

Wire it once in app.config.tsprovideAgent
A typed, signal-based handle, no argsinjectAgent()
Deterministic tests without a backendMockAgentTransport
API reference →
demo.threadplane.ai

Signals

Reactive without RxJS gymnastics.

Every agent surface is exposed as a signal — message stream, tool progress, interrupts, errors, status. Compose with the rest of your Angular reactivity story. No subscriptions to leak.

messages(), status(), error() — live signalssignal-native handle
Human-in-the-loop gatesinterrupt()
Branch, history, time-travel built incheckpoints
Read the streaming guide →

Developer Experience

Production streaming in a few lines

Minimal Setup
// app.config.ts
import { provideAgent } from '@threadplane/langgraph';

providers: [
  provideAgent({
    assistantId: 'my-agent',
    apiUrl: 'https://my-langgraph.cloud',
  }),
];

// component
import { injectAgent } from '@threadplane/langgraph';
const chat = injectAgent();

// Reactive signals — OnPush compatible
chat.messages();    // Signal<Message[]>
chat.isLoading();   // Signal<boolean>
chat.interrupt();   // Signal<AgentInterrupt | undefined>
Full Configuration
// app.config.ts
import { provideAgent, MockAgentTransport, FetchStreamTransport } from '@threadplane/langgraph';

providers: [
  provideAgent({
    apiUrl: environment.langgraphUrl,
    assistantId: 'my-agent',
    threadId: savedThreadId,
    onThreadId: (id) => localStorage.setItem('threadId', id),
    transport: isTest
      ? new MockAgentTransport(fixtures)
      : new FetchStreamTransport(),
  }),
];

// component
import { injectAgent } from '@threadplane/langgraph';
const chat = injectAgent();

Field report

The last-mile gap in Angular AI.

Six production-readiness dimensions

17 pages

Streaming, persistence, tool calls, approvals, generative UI, testing

the six chapters

No vendor pitch — what we learned shipping it

free

We will never spam you or share your email address.

Stop stalling on agentic Angular.

Install the framework, read the docs, and have a streaming chat in your app this afternoon.