@assistant-ui/mcp-docs-server 0.1.30 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.docs/organized/code-examples/waterfall.md +1 -1
- package/.docs/organized/code-examples/with-a2a.md +2 -2
- package/.docs/organized/code-examples/with-ag-ui.md +3 -3
- package/.docs/organized/code-examples/with-ai-sdk-v6.md +5 -5
- package/.docs/organized/code-examples/with-artifacts.md +5 -5
- package/.docs/organized/code-examples/with-assistant-transport.md +3 -3
- package/.docs/organized/code-examples/with-chain-of-thought.md +79 -50
- package/.docs/organized/code-examples/with-cloud-standalone.md +4 -4
- package/.docs/organized/code-examples/with-cloud.md +4 -4
- package/.docs/organized/code-examples/with-custom-thread-list.md +56 -11
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +7 -7
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +7 -7
- package/.docs/organized/code-examples/with-expo.md +16 -16
- package/.docs/organized/code-examples/with-external-store.md +2 -2
- package/.docs/organized/code-examples/with-ffmpeg.md +5 -5
- package/.docs/organized/code-examples/with-generative-ui.md +5 -5
- package/.docs/organized/code-examples/with-google-adk.md +4 -4
- package/.docs/organized/code-examples/with-heat-graph.md +1 -1
- package/.docs/organized/code-examples/with-interactables.md +5 -5
- package/.docs/organized/code-examples/with-langchain.md +3 -3
- package/.docs/organized/code-examples/with-langgraph.md +3 -3
- package/.docs/organized/code-examples/with-livekit.md +8 -8
- package/.docs/organized/code-examples/with-opencode.md +99 -54
- package/.docs/organized/code-examples/with-parent-id-grouping.md +4 -4
- package/.docs/organized/code-examples/with-react-hook-form.md +5 -5
- package/.docs/organized/code-examples/with-react-ink.md +1 -1
- package/.docs/organized/code-examples/with-react-router.md +8 -8
- package/.docs/organized/code-examples/with-store.md +1 -1
- package/.docs/organized/code-examples/with-tanstack.md +5 -5
- package/.docs/organized/code-examples/with-tap-runtime.md +2 -2
- package/.docs/raw/docs/(docs)/cli.mdx +2 -1
- package/.docs/raw/docs/(docs)/copilots/assistant-frame.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/make-assistant-tool-ui.mdx +10 -3
- package/.docs/raw/docs/(docs)/copilots/make-assistant-tool.mdx +8 -3
- package/.docs/raw/docs/(docs)/copilots/make-assistant-visible.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/model-context.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/motivation.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/use-assistant-instructions.mdx +1 -0
- package/.docs/raw/docs/(docs)/devtools.mdx +1 -0
- package/.docs/raw/docs/(docs)/index.mdx +1 -0
- package/.docs/raw/docs/(docs)/installation.mdx +1 -0
- package/.docs/raw/docs/(docs)/rtl.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +34 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback-speech.mdx +41 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +26 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +34 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +31 -0
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +26 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +72 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +41 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +48 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +30 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +23 -0
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +21 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +7 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +65 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +50 -6
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +15 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +36 -1
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +38 -0
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +5 -0
- package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +144 -6
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +230 -2
- package/.docs/raw/docs/cloud/ai-sdk.mdx +221 -3
- package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +41 -36
- package/.docs/raw/docs/guides/branching.mdx +76 -0
- package/.docs/raw/docs/guides/chain-of-thought.mdx +166 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/context-api.mdx +50 -22
- package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +2 -0
- package/.docs/raw/docs/guides/editing.mdx +102 -0
- package/.docs/raw/docs/guides/index.mdx +103 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +49 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +51 -8
- package/.docs/raw/docs/{(docs)/guides → guides}/mentions.mdx +61 -86
- package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +8 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +64 -4
- package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +10 -17
- package/.docs/raw/docs/{(docs)/guides → guides}/slash-commands.mdx +103 -37
- package/.docs/raw/docs/guides/speech.mdx +156 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +21 -83
- package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +108 -36
- package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +131 -35
- package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +39 -0
- package/.docs/raw/docs/ink/index.mdx +1 -3
- package/.docs/raw/docs/ink/migration.mdx +1 -3
- package/.docs/raw/docs/ink/primitives.mdx +37 -1
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +520 -0
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +191 -0
- package/.docs/raw/docs/integrations/auth/clerk.mdx +172 -0
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +196 -0
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +79 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +188 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +57 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +201 -0
- package/.docs/raw/docs/integrations/gateways/index.mdx +157 -0
- package/.docs/raw/docs/integrations/index.mdx +173 -0
- package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +156 -0
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +146 -0
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +712 -0
- package/.docs/raw/docs/integrations/tools/mcp.mdx +267 -0
- package/.docs/raw/docs/primitives/action-bar.mdx +1 -0
- package/.docs/raw/docs/primitives/assistant-modal.mdx +1 -0
- package/.docs/raw/docs/primitives/attachment.mdx +1 -0
- package/.docs/raw/docs/primitives/branch-picker.mdx +1 -0
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +90 -85
- package/.docs/raw/docs/primitives/composer.mdx +2 -1
- package/.docs/raw/docs/primitives/error.mdx +1 -0
- package/.docs/raw/docs/primitives/index.mdx +2 -1
- package/.docs/raw/docs/primitives/message.mdx +68 -5
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +1 -0
- package/.docs/raw/docs/primitives/suggestion.mdx +1 -0
- package/.docs/raw/docs/primitives/thread-list.mdx +39 -0
- package/.docs/raw/docs/primitives/thread.mdx +16 -13
- package/.docs/raw/docs/react-native/index.mdx +1 -3
- package/.docs/raw/docs/react-native/migration.mdx +1 -3
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +396 -0
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +60 -0
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +216 -0
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +70 -0
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +243 -0
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +123 -0
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +71 -131
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +69 -63
- package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +330 -123
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +323 -0
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +253 -1236
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +746 -0
- package/.docs/raw/docs/runtimes/custom/overview.mdx +71 -0
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +256 -0
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +717 -0
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +69 -0
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +229 -0
- package/.docs/raw/docs/runtimes/langchain.mdx +533 -0
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +305 -0
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +104 -0
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +84 -0
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +496 -0
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +127 -0
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +113 -0
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +3 -3
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -23
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +191 -0
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +48 -0
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +119 -0
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +71 -203
- package/.docs/raw/docs/ui/accordion.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
- package/.docs/raw/docs/ui/attachment.mdx +1 -0
- package/.docs/raw/docs/ui/badge.mdx +1 -0
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +1 -0
- package/.docs/raw/docs/ui/context-display.mdx +1 -0
- package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
- package/.docs/raw/docs/ui/directive-text.mdx +1 -0
- package/.docs/raw/docs/ui/file.mdx +1 -0
- package/.docs/raw/docs/ui/image.mdx +1 -0
- package/.docs/raw/docs/ui/markdown.mdx +2 -14
- package/.docs/raw/docs/ui/mermaid.mdx +1 -0
- package/.docs/raw/docs/ui/message-timing.mdx +3 -2
- package/.docs/raw/docs/ui/model-selector.mdx +1 -0
- package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
- package/.docs/raw/docs/ui/quote.mdx +1 -0
- package/.docs/raw/docs/ui/reasoning.mdx +66 -33
- package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
- package/.docs/raw/docs/ui/select.mdx +1 -0
- package/.docs/raw/docs/ui/sources.mdx +1 -0
- package/.docs/raw/docs/ui/streamdown.mdx +1 -0
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +1 -0
- package/.docs/raw/docs/ui/tabs.mdx +1 -0
- package/.docs/raw/docs/ui/thread-list.mdx +17 -0
- package/.docs/raw/docs/ui/thread.mdx +56 -1
- package/.docs/raw/docs/ui/tool-fallback.mdx +1 -0
- package/.docs/raw/docs/ui/tool-group.mdx +39 -11
- package/.docs/raw/docs/ui/voice.mdx +1 -0
- package/.docs/raw/docs/utilities/heat-graph.mdx +1 -0
- package/.docs/raw/docs/utilities/react-o11y.mdx +278 -0
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +1 -0
- package/package.json +3 -3
- package/src/tools/tests/path-traversal.test.ts +1 -1
- package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
- package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
- package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
- package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
- package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
- package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -314
- package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
- package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
- package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
- package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
- package/.docs/raw/docs/runtimes/langchain/comparison.mdx +0 -60
- package/.docs/raw/docs/runtimes/langchain/index.mdx +0 -210
- package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -699
- package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
- package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
- package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
- package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
- package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: LangChain useStream
|
|
3
|
+
description: Lighter-weight LangGraph adapter that wraps @langchain/react's useStream hook.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import { LangGraphIcon } from "@/components/icons/langgraph";
|
|
7
|
+
|
|
8
|
+
`@assistant-ui/react-langchain` wraps [`useStream`](https://docs.langchain.com/oss/javascript/langgraph-sdk/react-stream) from `@langchain/react` and exposes it as an assistant-ui runtime. It targets the same backend as [`@assistant-ui/react-langgraph`](/docs/runtimes/langgraph) (LangGraph Cloud) but at a higher level, delegating stream plumbing to the upstream hook.
|
|
9
|
+
|
|
10
|
+
## When to use it
|
|
11
|
+
|
|
12
|
+
Pick `react-langchain` over `react-langgraph` when:
|
|
13
|
+
|
|
14
|
+
- Your app already depends on `@langchain/react` and uses `useStream` elsewhere.
|
|
15
|
+
- You want to read custom state keys (`todos`, `files`, plans) reactively with `useLangChainState<T>(key)`.
|
|
16
|
+
- You prefer a thin wrapper that stays pinned to upstream behavior.
|
|
17
|
+
|
|
18
|
+
Pick `react-langgraph` instead when:
|
|
19
|
+
|
|
20
|
+
- You are scaffolding via `npx create-assistant-ui -t langgraph` (the template uses it).
|
|
21
|
+
- You need subgraph events, generative UI messages, message metadata, or end-to-end cancellation today.
|
|
22
|
+
|
|
23
|
+
Both adapters are first-class. `react-langchain` is newer and thinner; some features have not been ported yet (the [comparison](#comparison-with-react-langgraph) below has the full table).
|
|
24
|
+
|
|
25
|
+
## Architecture
|
|
26
|
+
|
|
27
|
+
`@assistant-ui/react-langchain` is layered on `ExternalStoreRuntime` (see [architecture](/docs/runtimes/concepts/architecture)). Graph state is the source of truth; the runtime renders messages from `state.values.messages` and submits user input back to the graph.
|
|
28
|
+
|
|
29
|
+
Shared adapters (attachments, speech, feedback) work the same way described in [adapters](/docs/runtimes/concepts/adapters). Cloud thread persistence is built in.
|
|
30
|
+
|
|
31
|
+
## Requirements
|
|
32
|
+
|
|
33
|
+
- A LangGraph Cloud API server (locally via [LangGraph Studio](https://github.com/langchain-ai/langgraph-studio) or hosted via [LangSmith](https://www.langchain.com/langsmith)).
|
|
34
|
+
- The graph state must include a `messages` key with LangChain-alike messages, or pass a custom `messagesKey`.
|
|
35
|
+
|
|
36
|
+
## Quickstart
|
|
37
|
+
|
|
38
|
+
<Steps>
|
|
39
|
+
<Step>
|
|
40
|
+
|
|
41
|
+
### Install dependencies
|
|
42
|
+
|
|
43
|
+
<PlatformTabs>
|
|
44
|
+
<Tab value="React">
|
|
45
|
+
|
|
46
|
+
<InstallCommand npm={["@assistant-ui/react", "@assistant-ui/react-langchain", "@langchain/react", "@langchain/langgraph-sdk"]} />
|
|
47
|
+
|
|
48
|
+
</Tab>
|
|
49
|
+
<Tab value="React Native">
|
|
50
|
+
|
|
51
|
+
<InstallCommand expo={["@assistant-ui/react-native", "@assistant-ui/react-langchain", "@langchain/react", "@langchain/langgraph-sdk"]} />
|
|
52
|
+
|
|
53
|
+
</Tab>
|
|
54
|
+
<Tab value="React Ink">
|
|
55
|
+
|
|
56
|
+
<InstallCommand npm={["@assistant-ui/react-ink", "@assistant-ui/react-langchain", "@langchain/react", "@langchain/langgraph-sdk", "ink", "react"]} />
|
|
57
|
+
|
|
58
|
+
</Tab>
|
|
59
|
+
</PlatformTabs>
|
|
60
|
+
|
|
61
|
+
</Step>
|
|
62
|
+
<Step>
|
|
63
|
+
|
|
64
|
+
### Define the assistant component
|
|
65
|
+
|
|
66
|
+
<PlatformTabs>
|
|
67
|
+
<Tab value="React">
|
|
68
|
+
|
|
69
|
+
```tsx title="@/components/MyAssistant.tsx"
|
|
70
|
+
"use client";
|
|
71
|
+
|
|
72
|
+
import { Thread } from "@/components/assistant-ui/thread";
|
|
73
|
+
import { AssistantRuntimeProvider } from "@assistant-ui/react";
|
|
74
|
+
import { useStreamRuntime } from "@assistant-ui/react-langchain";
|
|
75
|
+
|
|
76
|
+
export function MyAssistant() {
|
|
77
|
+
const runtime = useStreamRuntime({
|
|
78
|
+
assistantId: process.env["NEXT_PUBLIC_LANGGRAPH_ASSISTANT_ID"]!,
|
|
79
|
+
apiUrl: process.env["NEXT_PUBLIC_LANGGRAPH_API_URL"],
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<AssistantRuntimeProvider runtime={runtime}>
|
|
84
|
+
<Thread />
|
|
85
|
+
</AssistantRuntimeProvider>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
</Tab>
|
|
91
|
+
<Tab value="React Native">
|
|
92
|
+
|
|
93
|
+
```tsx title="components/MyAssistant.tsx"
|
|
94
|
+
import { Thread } from "@/components/assistant-ui/thread";
|
|
95
|
+
import { AssistantRuntimeProvider } from "@assistant-ui/react-native";
|
|
96
|
+
import { useStreamRuntime } from "@assistant-ui/react-langchain";
|
|
97
|
+
|
|
98
|
+
export function MyAssistant() {
|
|
99
|
+
const runtime = useStreamRuntime({
|
|
100
|
+
assistantId: process.env.EXPO_PUBLIC_LANGGRAPH_ASSISTANT_ID!,
|
|
101
|
+
apiUrl: process.env.EXPO_PUBLIC_LANGGRAPH_API_URL,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<AssistantRuntimeProvider runtime={runtime}>
|
|
106
|
+
<Thread />
|
|
107
|
+
</AssistantRuntimeProvider>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
</Tab>
|
|
113
|
+
<Tab value="React Ink">
|
|
114
|
+
|
|
115
|
+
```tsx title="components/MyAssistant.tsx"
|
|
116
|
+
import { Thread } from "./thread.js";
|
|
117
|
+
import { AssistantRuntimeProvider } from "@assistant-ui/react-ink";
|
|
118
|
+
import { useStreamRuntime } from "@assistant-ui/react-langchain";
|
|
119
|
+
|
|
120
|
+
export function MyAssistant() {
|
|
121
|
+
const runtime = useStreamRuntime({
|
|
122
|
+
assistantId: process.env.LANGGRAPH_ASSISTANT_ID!,
|
|
123
|
+
apiUrl: process.env.LANGGRAPH_API_URL,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<AssistantRuntimeProvider runtime={runtime}>
|
|
128
|
+
<Thread />
|
|
129
|
+
</AssistantRuntimeProvider>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
</Tab>
|
|
135
|
+
</PlatformTabs>
|
|
136
|
+
|
|
137
|
+
</Step>
|
|
138
|
+
<Step>
|
|
139
|
+
|
|
140
|
+
### Mount the component
|
|
141
|
+
|
|
142
|
+
<PlatformTabs>
|
|
143
|
+
<Tab value="React">
|
|
144
|
+
|
|
145
|
+
```tsx title="@/app/page.tsx"
|
|
146
|
+
import { MyAssistant } from "@/components/MyAssistant";
|
|
147
|
+
|
|
148
|
+
export default function Home() {
|
|
149
|
+
return (
|
|
150
|
+
<main className="h-dvh">
|
|
151
|
+
<MyAssistant />
|
|
152
|
+
</main>
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
</Tab>
|
|
158
|
+
<Tab value="React Native">
|
|
159
|
+
|
|
160
|
+
```tsx title="app/index.tsx"
|
|
161
|
+
import { View } from "react-native";
|
|
162
|
+
import { MyAssistant } from "@/components/MyAssistant";
|
|
163
|
+
|
|
164
|
+
export default function Home() {
|
|
165
|
+
return (
|
|
166
|
+
<View style={{ flex: 1 }}>
|
|
167
|
+
<MyAssistant />
|
|
168
|
+
</View>
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
</Tab>
|
|
174
|
+
<Tab value="React Ink">
|
|
175
|
+
|
|
176
|
+
```tsx title="app.tsx"
|
|
177
|
+
import { Box } from "ink";
|
|
178
|
+
import { MyAssistant } from "./components/MyAssistant.js";
|
|
179
|
+
|
|
180
|
+
export function App() {
|
|
181
|
+
return (
|
|
182
|
+
<Box flexDirection="column">
|
|
183
|
+
<MyAssistant />
|
|
184
|
+
</Box>
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
</Tab>
|
|
190
|
+
</PlatformTabs>
|
|
191
|
+
|
|
192
|
+
</Step>
|
|
193
|
+
<Step>
|
|
194
|
+
|
|
195
|
+
### Set environment variables
|
|
196
|
+
|
|
197
|
+
<PlatformTabs>
|
|
198
|
+
<Tab value="React">
|
|
199
|
+
|
|
200
|
+
```sh title=".env.local"
|
|
201
|
+
NEXT_PUBLIC_LANGGRAPH_API_URL=http://localhost:2024
|
|
202
|
+
NEXT_PUBLIC_LANGGRAPH_ASSISTANT_ID=your_graph_id
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
</Tab>
|
|
206
|
+
<Tab value="React Native">
|
|
207
|
+
|
|
208
|
+
```sh title=".env"
|
|
209
|
+
EXPO_PUBLIC_LANGGRAPH_API_URL=http://localhost:2024
|
|
210
|
+
EXPO_PUBLIC_LANGGRAPH_ASSISTANT_ID=your_graph_id
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
</Tab>
|
|
214
|
+
<Tab value="React Ink">
|
|
215
|
+
|
|
216
|
+
```sh title=".env"
|
|
217
|
+
LANGGRAPH_API_URL=http://localhost:2024
|
|
218
|
+
LANGGRAPH_ASSISTANT_ID=your_graph_id
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
</Tab>
|
|
222
|
+
</PlatformTabs>
|
|
223
|
+
|
|
224
|
+
</Step>
|
|
225
|
+
<Step>
|
|
226
|
+
|
|
227
|
+
### Set up UI components
|
|
228
|
+
|
|
229
|
+
<PlatformTabs>
|
|
230
|
+
<Tab value="React">
|
|
231
|
+
|
|
232
|
+
Follow the [UI Components guide](/docs/ui/thread).
|
|
233
|
+
|
|
234
|
+
</Tab>
|
|
235
|
+
<Tab value="React Native">
|
|
236
|
+
|
|
237
|
+
Follow the [React Native setup](/docs/react-native).
|
|
238
|
+
|
|
239
|
+
</Tab>
|
|
240
|
+
<Tab value="React Ink">
|
|
241
|
+
|
|
242
|
+
Follow the [Ink setup](/docs/ink).
|
|
243
|
+
|
|
244
|
+
</Tab>
|
|
245
|
+
</PlatformTabs>
|
|
246
|
+
|
|
247
|
+
</Step>
|
|
248
|
+
</Steps>
|
|
249
|
+
|
|
250
|
+
## `useStreamRuntime` options
|
|
251
|
+
|
|
252
|
+
`useStreamRuntime` accepts every option upstream `useStream` does, plus three assistant-ui-specific fields:
|
|
253
|
+
|
|
254
|
+
| Option | Type | Description |
|
|
255
|
+
| --- | --- | --- |
|
|
256
|
+
| `cloud` | `AssistantCloud` | Optional. Persists threads via assistant-cloud. |
|
|
257
|
+
| `adapters` | `{ attachments?, speech?, feedback? }` | Optional. Attachment, speech, and feedback adapters. |
|
|
258
|
+
| `messagesKey` | `string` | The state key that holds messages. Defaults to `"messages"`. |
|
|
259
|
+
|
|
260
|
+
## Reading custom state keys
|
|
261
|
+
|
|
262
|
+
LangGraph agents often expose structured state beyond messages (plans, todos, scratch files, generative-UI artifacts). Read them directly with `useLangChainState`. It mirrors `useStream().values[key]` upstream and updates when the stream emits new state.
|
|
263
|
+
|
|
264
|
+
<PlatformTabs>
|
|
265
|
+
<Tab value="React">
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
import { useLangChainState } from "@assistant-ui/react-langchain";
|
|
269
|
+
|
|
270
|
+
type Todo = { id: string; title: string; done: boolean };
|
|
271
|
+
|
|
272
|
+
function TodoList() {
|
|
273
|
+
const todos = useLangChainState<Todo[]>("todos", []);
|
|
274
|
+
return (
|
|
275
|
+
<ul>
|
|
276
|
+
{todos.map((t) => (
|
|
277
|
+
<li key={t.id}>
|
|
278
|
+
{t.done ? "✓" : "○"} {t.title}
|
|
279
|
+
</li>
|
|
280
|
+
))}
|
|
281
|
+
</ul>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
</Tab>
|
|
287
|
+
<Tab value="React Native">
|
|
288
|
+
|
|
289
|
+
```tsx
|
|
290
|
+
import { useLangChainState } from "@assistant-ui/react-langchain";
|
|
291
|
+
import { Text, View } from "react-native";
|
|
292
|
+
|
|
293
|
+
type Todo = { id: string; title: string; done: boolean };
|
|
294
|
+
|
|
295
|
+
function TodoList() {
|
|
296
|
+
const todos = useLangChainState<Todo[]>("todos", []);
|
|
297
|
+
return (
|
|
298
|
+
<View>
|
|
299
|
+
{todos.map((t) => (
|
|
300
|
+
<Text key={t.id}>
|
|
301
|
+
{t.done ? "✓" : "○"} {t.title}
|
|
302
|
+
</Text>
|
|
303
|
+
))}
|
|
304
|
+
</View>
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
</Tab>
|
|
310
|
+
<Tab value="React Ink">
|
|
311
|
+
|
|
312
|
+
```tsx
|
|
313
|
+
import { useLangChainState } from "@assistant-ui/react-langchain";
|
|
314
|
+
import { Box, Text } from "ink";
|
|
315
|
+
|
|
316
|
+
type Todo = { id: string; title: string; done: boolean };
|
|
317
|
+
|
|
318
|
+
function TodoList() {
|
|
319
|
+
const todos = useLangChainState<Todo[]>("todos", []);
|
|
320
|
+
return (
|
|
321
|
+
<Box flexDirection="column">
|
|
322
|
+
{todos.map((t) => (
|
|
323
|
+
<Text key={t.id}>
|
|
324
|
+
{t.done ? "✓" : "○"} {t.title}
|
|
325
|
+
</Text>
|
|
326
|
+
))}
|
|
327
|
+
</Box>
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
</Tab>
|
|
333
|
+
</PlatformTabs>
|
|
334
|
+
|
|
335
|
+
Signatures:
|
|
336
|
+
|
|
337
|
+
```ts
|
|
338
|
+
useLangChainState<T>(key: string): T | undefined;
|
|
339
|
+
useLangChainState<T>(key: string, defaultValue: T): T;
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Useful with the [`deepagents`](https://docs.langchain.com/oss/python/deepagents) middleware, whose `write_todos` step updates `state.todos` alongside the tool-call stream. Reading the state key directly avoids reconstructing the list from partial tool-call args.
|
|
343
|
+
|
|
344
|
+
<Callout type="info">
|
|
345
|
+
Added in v0.0.2 — see issue [#3862](https://github.com/assistant-ui/assistant-ui/issues/3862) for motivation.
|
|
346
|
+
</Callout>
|
|
347
|
+
|
|
348
|
+
## Interrupts
|
|
349
|
+
|
|
350
|
+
LangGraph interrupts pause the graph and wait for client input. `useLangChainInterruptState` exposes the current interrupt; `useLangChainSubmit` resumes the graph with a raw state update.
|
|
351
|
+
|
|
352
|
+
<PlatformTabs>
|
|
353
|
+
<Tab value="React">
|
|
354
|
+
|
|
355
|
+
```tsx
|
|
356
|
+
import {
|
|
357
|
+
useLangChainInterruptState,
|
|
358
|
+
useLangChainSubmit,
|
|
359
|
+
} from "@assistant-ui/react-langchain";
|
|
360
|
+
import { Command } from "@langchain/langgraph-sdk";
|
|
361
|
+
|
|
362
|
+
function InterruptPrompt() {
|
|
363
|
+
const interrupt = useLangChainInterruptState();
|
|
364
|
+
const submit = useLangChainSubmit();
|
|
365
|
+
if (!interrupt) return null;
|
|
366
|
+
return (
|
|
367
|
+
<div>
|
|
368
|
+
<pre>{JSON.stringify(interrupt.value, null, 2)}</pre>
|
|
369
|
+
<button
|
|
370
|
+
onClick={() =>
|
|
371
|
+
submit(null, { command: new Command({ resume: "approved" }) })
|
|
372
|
+
}
|
|
373
|
+
>
|
|
374
|
+
Approve
|
|
375
|
+
</button>
|
|
376
|
+
</div>
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
</Tab>
|
|
382
|
+
<Tab value="React Native">
|
|
383
|
+
|
|
384
|
+
```tsx
|
|
385
|
+
import {
|
|
386
|
+
useLangChainInterruptState,
|
|
387
|
+
useLangChainSubmit,
|
|
388
|
+
} from "@assistant-ui/react-langchain";
|
|
389
|
+
import { Command } from "@langchain/langgraph-sdk";
|
|
390
|
+
import { Pressable, Text, View } from "react-native";
|
|
391
|
+
|
|
392
|
+
function InterruptPrompt() {
|
|
393
|
+
const interrupt = useLangChainInterruptState();
|
|
394
|
+
const submit = useLangChainSubmit();
|
|
395
|
+
if (!interrupt) return null;
|
|
396
|
+
return (
|
|
397
|
+
<View>
|
|
398
|
+
<Text>{JSON.stringify(interrupt.value, null, 2)}</Text>
|
|
399
|
+
<Pressable
|
|
400
|
+
onPress={() =>
|
|
401
|
+
submit(null, { command: new Command({ resume: "approved" }) })
|
|
402
|
+
}
|
|
403
|
+
>
|
|
404
|
+
<Text>Approve</Text>
|
|
405
|
+
</Pressable>
|
|
406
|
+
</View>
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
</Tab>
|
|
412
|
+
<Tab value="React Ink">
|
|
413
|
+
|
|
414
|
+
```tsx
|
|
415
|
+
import {
|
|
416
|
+
useLangChainInterruptState,
|
|
417
|
+
useLangChainSubmit,
|
|
418
|
+
} from "@assistant-ui/react-langchain";
|
|
419
|
+
import { Command } from "@langchain/langgraph-sdk";
|
|
420
|
+
import { Box, Text, useInput } from "ink";
|
|
421
|
+
|
|
422
|
+
function InterruptPrompt() {
|
|
423
|
+
const interrupt = useLangChainInterruptState();
|
|
424
|
+
const submit = useLangChainSubmit();
|
|
425
|
+
|
|
426
|
+
useInput((input) => {
|
|
427
|
+
if (!interrupt || input !== "a") return;
|
|
428
|
+
submit(null, { command: new Command({ resume: "approved" }) });
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
if (!interrupt) return null;
|
|
432
|
+
return (
|
|
433
|
+
<Box flexDirection="column">
|
|
434
|
+
<Text>{JSON.stringify(interrupt.value, null, 2)}</Text>
|
|
435
|
+
<Text>Press a to approve.</Text>
|
|
436
|
+
</Box>
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
</Tab>
|
|
442
|
+
</PlatformTabs>
|
|
443
|
+
|
|
444
|
+
## Message conversion
|
|
445
|
+
|
|
446
|
+
`convertLangChainBaseMessage` transforms a LangChain `BaseMessage` into an assistant-ui message. Use it when building a custom `ExternalStoreAdapter` that consumes LangChain messages outside `useStreamRuntime`.
|
|
447
|
+
|
|
448
|
+
```ts
|
|
449
|
+
import { convertLangChainBaseMessage } from "@assistant-ui/react-langchain";
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
## Cloud persistence
|
|
453
|
+
|
|
454
|
+
Pass an `AssistantCloud` instance to persist threads across sessions. The runtime automatically wires thread list management and resumes state from the cloud.
|
|
455
|
+
|
|
456
|
+
```tsx
|
|
457
|
+
// see "AssistantCloud" in /docs/runtimes/concepts/threads for cloud setup
|
|
458
|
+
const runtime = useStreamRuntime({
|
|
459
|
+
cloud,
|
|
460
|
+
assistantId: "agent",
|
|
461
|
+
apiUrl: "http://localhost:2024",
|
|
462
|
+
});
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## Custom `messagesKey`
|
|
466
|
+
|
|
467
|
+
If your graph stores messages under a non-default key, pass `messagesKey` so the runtime submits tool results and human turns to the correct state slot:
|
|
468
|
+
|
|
469
|
+
```tsx
|
|
470
|
+
const runtime = useStreamRuntime({
|
|
471
|
+
assistantId: "agent",
|
|
472
|
+
apiUrl: "http://localhost:2024",
|
|
473
|
+
messagesKey: "chat_messages",
|
|
474
|
+
});
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
## Comparison with `react-langgraph`
|
|
478
|
+
|
|
479
|
+
Both packages connect assistant-ui to LangGraph backends. They are independent adapters for different upstream libraries; one is not a successor to the other.
|
|
480
|
+
|
|
481
|
+
| Aspect | `react-langgraph` | `react-langchain` |
|
|
482
|
+
| --- | --- | --- |
|
|
483
|
+
| Wraps | `@langchain/langgraph-sdk` (raw SDK) | `@langchain/react` (`useStream` hook) |
|
|
484
|
+
| Age | Sept 2024 onward | April 2026 onward |
|
|
485
|
+
| Version | `0.13.x` | `0.0.x` |
|
|
486
|
+
| Lines of source | ~7,500 | ~600 |
|
|
487
|
+
| Built on | `useExternalStoreRuntime` | `useExternalStoreRuntime` |
|
|
488
|
+
| `create-assistant-ui` template | `-t langgraph` | No template yet |
|
|
489
|
+
|
|
490
|
+
### Feature coverage
|
|
491
|
+
|
|
492
|
+
| Feature | `react-langgraph` | `react-langchain` |
|
|
493
|
+
| --- | --- | --- |
|
|
494
|
+
| Stream messages | Yes (`useLangGraphRuntime`) | Yes (`useStreamRuntime`) |
|
|
495
|
+
| Interrupt state | Yes | Yes |
|
|
496
|
+
| Send raw state update / resume command | Yes | Yes (`useLangChainSubmit`) |
|
|
497
|
+
| Read arbitrary custom state key | No | Yes (`useLangChainState<T>(key)`) |
|
|
498
|
+
| Per-message metadata (`messages-tuple`) | Yes | Not exposed |
|
|
499
|
+
| Generative UI messages (LangSmith) | Yes | Not exposed |
|
|
500
|
+
| Subgraph / namespaced stream events | Yes (via `eventHandlers`) | Not exposed |
|
|
501
|
+
| End-to-end cancellation primitive | Yes (`unstable_createLangGraphStream`) | Not exposed |
|
|
502
|
+
| Message accumulator utility | Yes (`LangGraphMessageAccumulator`) | Not exposed |
|
|
503
|
+
| Cloud thread persistence | Yes | Yes |
|
|
504
|
+
|
|
505
|
+
`react-langchain` is the newer, thinner wrapper. It delegates to upstream `useStream` rather than re-implementing the stream plumbing, which is why its footprint is smaller. Features absent today have not been ported, not deprecated.
|
|
506
|
+
|
|
507
|
+
### Hook name mapping
|
|
508
|
+
|
|
509
|
+
| `react-langgraph` | `react-langchain` | Notes |
|
|
510
|
+
| --- | --- | --- |
|
|
511
|
+
| `useLangGraphRuntime` | `useStreamRuntime` | Options extend upstream `UseStreamOptions`; no `stream` / `create` / `load` to write. |
|
|
512
|
+
| `useLangGraphInterruptState` | `useLangChainInterruptState` | Same return shape. |
|
|
513
|
+
| `useLangGraphSendCommand` | `useLangChainSubmit` | `submit(values, { command })` replaces the dedicated hook. |
|
|
514
|
+
| `useLangGraphSend` | _(use `runtime.thread.append`)_ | No direct equivalent; send turns through the runtime. |
|
|
515
|
+
| `useLangGraphMessageMetadata` | _(not available)_ | Open an issue if you rely on this. |
|
|
516
|
+
| `useLangGraphUIMessages` | _(not available)_ | Open an issue if you rely on this. |
|
|
517
|
+
| _(none)_ | `useLangChainState<T>(key)` | New — reads any custom state key reactively. |
|
|
518
|
+
|
|
519
|
+
## Related
|
|
520
|
+
|
|
521
|
+
<Cards>
|
|
522
|
+
<Card
|
|
523
|
+
icon={<LangGraphIcon width={20} height={20} className="text-[#1C3C3C] dark:text-[#5b9595]" />}
|
|
524
|
+
title="LangGraph"
|
|
525
|
+
description="The full-featured adapter with subgraph events, UI messages, metadata."
|
|
526
|
+
href="/docs/runtimes/langgraph"
|
|
527
|
+
/>
|
|
528
|
+
<Card
|
|
529
|
+
title="ExternalStoreRuntime"
|
|
530
|
+
description="The core runtime react-langchain is built on."
|
|
531
|
+
href="/docs/runtimes/custom/external-store"
|
|
532
|
+
/>
|
|
533
|
+
</Cards>
|