LangChain Reference home pageLangChain ReferenceLangChain Reference
  • GitHub
  • Main Docs
Deep Agents
LangChain
LangGraph
Integrations
LangSmith
  • Overview
  • Getting started
  • useStream
  • Selectors
  • Interrupts & headless tools
  • Subagents & subgraphs
  • Fork & edit from a checkpoint
  • Submission queue
  • Multimodal media
  • Transports
  • Suspense
  • StreamProvider & context
  • Type safety
  • Migrating to v1
LangGraph SDK
  • Client
  • Auth
  • React
  • Logging
  • React Ui
  • Server
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
LangGraph Checkpoint Redis
  • Shallow
  • Store
LangGraph Checkpoint SQLite
LangGraph Checkpoint Validation
  • Cli
LangGraph API
LangGraph CLI
LangGraph CUA
  • Utils
LangGraph Supervisor
LangGraph Swarm
⌘I

LangChain Assistant

Ask a question to get started

Enter to send•Shift+Enter new line

Menu

OverviewGetting starteduseStreamSelectorsInterrupts & headless toolsSubagents & subgraphsFork & edit from a checkpointSubmission queueMultimodal mediaTransportsSuspenseStreamProvider & contextType safetyMigrating to v1
LangGraph SDK
ClientAuthReactLoggingReact UiServer
LangGraph Checkpoint
LangGraph Checkpoint MongoDB
LangGraph Checkpoint Postgres
LangGraph Checkpoint Redis
ShallowStore
LangGraph Checkpoint SQLite
LangGraph Checkpoint Validation
Cli
LangGraph API
LangGraph CLI
LangGraph CUA
Utils
LangGraph Supervisor
LangGraph Swarm
Language
Theme
JavaScript@langchain/reactAgentServerAdapter
Interface●Since v1.0

AgentServerAdapter

Public v1 name for TransportAdapter plus optional high-level capabilities. Renamed to reflect that this interface now denotes the full agent-server protocol contract (not merely wire transport): any object that satisfies it can back a useStream call. See plan-custom-transport.md §4 for the rollout.

The extra optional methods let adapters surface thread state and history without the framework needing to issue a parallel HTTP request — useStream.hydrate() calls getState?() when present and falls back to client.threads.getState otherwise. Adapters that don't know how to produce these values can simply omit them.

The legacy TransportAdapter export is retained for back-compat and resolves to the same structural type; new code should prefer AgentServerAdapter.

Copy
interface AgentServerAdapter

Bases

TransportAdapter

Properties

property
threadId: string

Thread ID this transport currently targets.

Methods

method
close→ Promise<void>

Shuts down the transport and releases any underlying resources.

method
events→ AsyncIterable<Message>

Streams incoming protocol messages from the remote peer. Used by WebSocket transports where all events share one connection.

method
getHistory→ Promise<__type[]>

Fetch a slice of checkpoint history for the bound thread. Used by branching and time-travel UIs. Optional — omitting it turns those UIs into no-ops rather than surfacing an error.

method
getState→ Promise<__type | null>

Fetch the latest checkpointed state for the bound thread via GET /threads/:threadId/state (or an adapter-specific override). When omitted, StreamController.hydrate falls back to client.threads.getState().

method
open→ Promise<void>

Opens the underlying connection (e.g. WebSocket handshake). For HTTP/SSE transports this is a no-op.

method
openEventStream→ EventStreamHandle

Opens an independent filtered SSE event stream. Each call creates a new server connection with the given filter. Returns undefined when the transport does not support per-subscription streams (e.g. WebSocket), in which case the caller should fall back to command-based subscriptions over events.

Replay contract. Implementations MUST buffer events emitted for the thread/run and replay them through every newly-opened stream whose filter matches. The SDK's shared-stream rotation relies on this: when a subscription's filter widens the union, the SDK opens a fresh stream and expects to receive the run's full history from seq=0 (deduplication is handled client-side via event_id). The SDK also defers the open until after run.start has committed the thread server-side to avoid a 404: Thread not found, which means events emitted during that window MUST be delivered to the late opener. The protocol v2 server implements this via a bounded per-run replay buffer; custom adapters should mirror that.

method
send→ Promise<void | CommandResponse | ErrorResponse>

Sends a command and optionally returns an immediate response.

method
setThreadId

Rebind this transport to a different thread.

client.threads.stream(threadId, { transport }) calls this (when implemented) whenever the framework binds or re-binds the active thread — including the lazily-minted id from the first submit() on a threadId: null controller. Implementing it lets an adapter be constructed once (optionally with no threadId) and reused as the active thread becomes known, so the framework doesn't have to tear down and rebuild a custom transport when the thread id appears.

Optional: adapters that bake threadId at construction can omit it, in which case the per-call threadId is ignored (prior behaviour).

View source on GitHub