@assistant-ui/mcp-docs-server 0.1.29 → 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.
Files changed (214) hide show
  1. package/.docs/organized/code-examples/waterfall.md +15 -7
  2. package/.docs/organized/code-examples/with-a2a.md +9 -21
  3. package/.docs/organized/code-examples/with-ag-ui.md +11 -8
  4. package/.docs/organized/code-examples/with-ai-sdk-v6.md +10 -10
  5. package/.docs/organized/code-examples/with-artifacts.md +12 -10
  6. package/.docs/organized/code-examples/with-assistant-transport.md +11 -12
  7. package/.docs/organized/code-examples/with-chain-of-thought.md +83 -54
  8. package/.docs/organized/code-examples/with-cloud-standalone.md +14 -11
  9. package/.docs/organized/code-examples/with-cloud.md +9 -10
  10. package/.docs/organized/code-examples/with-custom-thread-list.md +61 -16
  11. package/.docs/organized/code-examples/with-elevenlabs-conversational.md +17 -12
  12. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +13 -13
  13. package/.docs/organized/code-examples/with-expo.md +25 -21
  14. package/.docs/organized/code-examples/with-external-store.md +8 -8
  15. package/.docs/organized/code-examples/with-ffmpeg.md +17 -12
  16. package/.docs/organized/code-examples/with-generative-ui.md +9 -9
  17. package/.docs/organized/code-examples/with-google-adk.md +8 -8
  18. package/.docs/organized/code-examples/with-heat-graph.md +5 -5
  19. package/.docs/organized/code-examples/with-interactables.md +10 -25
  20. package/.docs/organized/code-examples/with-langchain.md +437 -0
  21. package/.docs/organized/code-examples/with-langgraph.md +16 -16
  22. package/.docs/organized/code-examples/with-livekit.md +18 -13
  23. package/.docs/organized/code-examples/with-opencode.md +105 -62
  24. package/.docs/organized/code-examples/with-parent-id-grouping.md +10 -10
  25. package/.docs/organized/code-examples/with-react-hook-form.md +220 -148
  26. package/.docs/organized/code-examples/with-react-ink.md +2 -2
  27. package/.docs/organized/code-examples/with-react-router.md +12 -12
  28. package/.docs/organized/code-examples/with-store.md +8 -5
  29. package/.docs/organized/code-examples/with-tanstack.md +10 -10
  30. package/.docs/organized/code-examples/with-tap-runtime.md +10 -6
  31. package/.docs/raw/docs/(docs)/cli.mdx +2 -1
  32. package/.docs/raw/docs/(docs)/copilots/assistant-frame.mdx +1 -0
  33. package/.docs/raw/docs/(docs)/copilots/make-assistant-tool-ui.mdx +10 -3
  34. package/.docs/raw/docs/(docs)/copilots/make-assistant-tool.mdx +8 -3
  35. package/.docs/raw/docs/(docs)/copilots/make-assistant-visible.mdx +1 -0
  36. package/.docs/raw/docs/(docs)/copilots/model-context.mdx +1 -0
  37. package/.docs/raw/docs/(docs)/copilots/motivation.mdx +1 -0
  38. package/.docs/raw/docs/(docs)/copilots/use-assistant-instructions.mdx +1 -0
  39. package/.docs/raw/docs/(docs)/devtools.mdx +1 -0
  40. package/.docs/raw/docs/(docs)/index.mdx +1 -0
  41. package/.docs/raw/docs/(docs)/installation.mdx +1 -0
  42. package/.docs/raw/docs/(docs)/rtl.mdx +80 -0
  43. package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +34 -0
  44. package/.docs/raw/docs/(reference)/api-reference/adapters/feedback-speech.mdx +41 -0
  45. package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +26 -0
  46. package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +34 -0
  47. package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +31 -0
  48. package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +20 -0
  49. package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +26 -0
  50. package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +72 -0
  51. package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +41 -0
  52. package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +48 -0
  53. package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +30 -0
  54. package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +23 -0
  55. package/.docs/raw/docs/(reference)/api-reference/overview.mdx +21 -0
  56. package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +7 -0
  57. package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +149 -40
  58. package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +65 -0
  59. package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +2 -0
  60. package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +50 -6
  61. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +15 -0
  62. package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +36 -1
  63. package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +38 -0
  64. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +9 -0
  65. package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +144 -6
  66. package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +231 -3
  67. package/.docs/raw/docs/cloud/ai-sdk.mdx +221 -3
  68. package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
  69. package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +41 -36
  70. package/.docs/raw/docs/guides/branching.mdx +76 -0
  71. package/.docs/raw/docs/guides/chain-of-thought.mdx +166 -0
  72. package/.docs/raw/docs/{(docs)/guides → guides}/context-api.mdx +50 -22
  73. package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +2 -0
  74. package/.docs/raw/docs/guides/editing.mdx +102 -0
  75. package/.docs/raw/docs/guides/index.mdx +103 -0
  76. package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +49 -0
  77. package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +51 -8
  78. package/.docs/raw/docs/guides/mentions.mdx +520 -0
  79. package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +8 -2
  80. package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +64 -4
  81. package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +10 -17
  82. package/.docs/raw/docs/guides/slash-commands.mdx +361 -0
  83. package/.docs/raw/docs/guides/speech.mdx +156 -0
  84. package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +21 -83
  85. package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +108 -36
  86. package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +131 -35
  87. package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +39 -0
  88. package/.docs/raw/docs/ink/index.mdx +1 -3
  89. package/.docs/raw/docs/ink/migration.mdx +1 -3
  90. package/.docs/raw/docs/ink/primitives.mdx +37 -1
  91. package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +520 -0
  92. package/.docs/raw/docs/integrations/auth/better-auth.mdx +191 -0
  93. package/.docs/raw/docs/integrations/auth/clerk.mdx +172 -0
  94. package/.docs/raw/docs/integrations/auth/next-auth.mdx +196 -0
  95. package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +79 -0
  96. package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +188 -0
  97. package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +57 -0
  98. package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +201 -0
  99. package/.docs/raw/docs/integrations/gateways/index.mdx +157 -0
  100. package/.docs/raw/docs/integrations/index.mdx +173 -0
  101. package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
  102. package/.docs/raw/docs/integrations/observability/langfuse.mdx +156 -0
  103. package/.docs/raw/docs/integrations/observability/langsmith.mdx +146 -0
  104. package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +712 -0
  105. package/.docs/raw/docs/integrations/tools/mcp.mdx +267 -0
  106. package/.docs/raw/docs/primitives/action-bar.mdx +1 -0
  107. package/.docs/raw/docs/primitives/assistant-modal.mdx +1 -0
  108. package/.docs/raw/docs/primitives/attachment.mdx +1 -0
  109. package/.docs/raw/docs/primitives/branch-picker.mdx +1 -0
  110. package/.docs/raw/docs/primitives/chain-of-thought.mdx +90 -85
  111. package/.docs/raw/docs/primitives/composer.mdx +96 -63
  112. package/.docs/raw/docs/primitives/error.mdx +1 -0
  113. package/.docs/raw/docs/primitives/index.mdx +2 -1
  114. package/.docs/raw/docs/primitives/message.mdx +68 -5
  115. package/.docs/raw/docs/primitives/selection-toolbar.mdx +1 -0
  116. package/.docs/raw/docs/primitives/suggestion.mdx +1 -0
  117. package/.docs/raw/docs/primitives/thread-list.mdx +39 -0
  118. package/.docs/raw/docs/primitives/thread.mdx +16 -13
  119. package/.docs/raw/docs/react-native/index.mdx +1 -3
  120. package/.docs/raw/docs/react-native/migration.mdx +1 -3
  121. package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +396 -0
  122. package/.docs/raw/docs/runtimes/a2a/overview.mdx +60 -0
  123. package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +216 -0
  124. package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +70 -0
  125. package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +243 -0
  126. package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +123 -0
  127. package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
  128. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +71 -131
  129. package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +69 -63
  130. package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +365 -101
  131. package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
  132. package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
  133. package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
  134. package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
  135. package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
  136. package/.docs/raw/docs/runtimes/custom/data-stream.mdx +323 -0
  137. package/.docs/raw/docs/runtimes/custom/external-store.mdx +253 -1236
  138. package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +746 -0
  139. package/.docs/raw/docs/runtimes/custom/overview.mdx +71 -0
  140. package/.docs/raw/docs/runtimes/google-adk/api.mdx +256 -0
  141. package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +717 -0
  142. package/.docs/raw/docs/runtimes/google-adk/overview.mdx +69 -0
  143. package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +229 -0
  144. package/.docs/raw/docs/runtimes/langchain.mdx +533 -0
  145. package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +305 -0
  146. package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +104 -0
  147. package/.docs/raw/docs/runtimes/langgraph/overview.mdx +84 -0
  148. package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +496 -0
  149. package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +127 -0
  150. package/.docs/raw/docs/runtimes/langgraph/threads.mdx +113 -0
  151. package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +3 -3
  152. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -23
  153. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
  154. package/.docs/raw/docs/runtimes/opencode/hooks.mdx +191 -0
  155. package/.docs/raw/docs/runtimes/opencode/overview.mdx +48 -0
  156. package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +119 -0
  157. package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +74 -198
  158. package/.docs/raw/docs/ui/accordion.mdx +1 -0
  159. package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
  160. package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
  161. package/.docs/raw/docs/ui/attachment.mdx +1 -0
  162. package/.docs/raw/docs/ui/badge.mdx +1 -0
  163. package/.docs/raw/docs/ui/composer-trigger-popover.mdx +200 -0
  164. package/.docs/raw/docs/ui/context-display.mdx +1 -0
  165. package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
  166. package/.docs/raw/docs/ui/directive-text.mdx +114 -0
  167. package/.docs/raw/docs/ui/file.mdx +1 -0
  168. package/.docs/raw/docs/ui/image.mdx +1 -0
  169. package/.docs/raw/docs/ui/markdown.mdx +2 -14
  170. package/.docs/raw/docs/ui/mermaid.mdx +1 -0
  171. package/.docs/raw/docs/ui/message-timing.mdx +3 -2
  172. package/.docs/raw/docs/ui/model-selector.mdx +1 -0
  173. package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
  174. package/.docs/raw/docs/ui/quote.mdx +1 -0
  175. package/.docs/raw/docs/ui/reasoning.mdx +69 -32
  176. package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
  177. package/.docs/raw/docs/ui/select.mdx +1 -0
  178. package/.docs/raw/docs/ui/sources.mdx +1 -0
  179. package/.docs/raw/docs/ui/streamdown.mdx +1 -0
  180. package/.docs/raw/docs/ui/syntax-highlighting.mdx +1 -0
  181. package/.docs/raw/docs/ui/tabs.mdx +1 -0
  182. package/.docs/raw/docs/ui/thread-list.mdx +17 -0
  183. package/.docs/raw/docs/ui/thread.mdx +56 -1
  184. package/.docs/raw/docs/ui/tool-fallback.mdx +1 -0
  185. package/.docs/raw/docs/ui/tool-group.mdx +39 -11
  186. package/.docs/raw/docs/ui/voice.mdx +1 -0
  187. package/.docs/raw/docs/utilities/heat-graph.mdx +1 -0
  188. package/.docs/raw/docs/utilities/react-o11y.mdx +278 -0
  189. package/.docs/raw/docs/utilities/tw-shimmer.mdx +1 -0
  190. package/dist/utils/logger.js +1 -1
  191. package/dist/utils/logger.js.map +1 -1
  192. package/package.json +4 -4
  193. package/src/tools/tests/path-traversal.test.ts +1 -1
  194. package/src/utils/logger.ts +1 -1
  195. package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
  196. package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
  197. package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
  198. package/.docs/raw/docs/(docs)/guides/mentions.mdx +0 -406
  199. package/.docs/raw/docs/(docs)/guides/slash-commands.mdx +0 -275
  200. package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
  201. package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
  202. package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
  203. package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -268
  204. package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
  205. package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
  206. package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
  207. package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
  208. package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -607
  209. package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
  210. package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
  211. package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
  212. package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
  213. package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
  214. package/.docs/raw/docs/ui/mention.mdx +0 -168
@@ -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>