@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.
Files changed (208) hide show
  1. package/.docs/organized/code-examples/waterfall.md +1 -1
  2. package/.docs/organized/code-examples/with-a2a.md +2 -2
  3. package/.docs/organized/code-examples/with-ag-ui.md +3 -3
  4. package/.docs/organized/code-examples/with-ai-sdk-v6.md +5 -5
  5. package/.docs/organized/code-examples/with-artifacts.md +5 -5
  6. package/.docs/organized/code-examples/with-assistant-transport.md +3 -3
  7. package/.docs/organized/code-examples/with-chain-of-thought.md +79 -50
  8. package/.docs/organized/code-examples/with-cloud-standalone.md +4 -4
  9. package/.docs/organized/code-examples/with-cloud.md +4 -4
  10. package/.docs/organized/code-examples/with-custom-thread-list.md +56 -11
  11. package/.docs/organized/code-examples/with-elevenlabs-conversational.md +7 -7
  12. package/.docs/organized/code-examples/with-elevenlabs-scribe.md +7 -7
  13. package/.docs/organized/code-examples/with-expo.md +16 -16
  14. package/.docs/organized/code-examples/with-external-store.md +2 -2
  15. package/.docs/organized/code-examples/with-ffmpeg.md +5 -5
  16. package/.docs/organized/code-examples/with-generative-ui.md +5 -5
  17. package/.docs/organized/code-examples/with-google-adk.md +4 -4
  18. package/.docs/organized/code-examples/with-heat-graph.md +1 -1
  19. package/.docs/organized/code-examples/with-interactables.md +5 -5
  20. package/.docs/organized/code-examples/with-langchain.md +3 -3
  21. package/.docs/organized/code-examples/with-langgraph.md +3 -3
  22. package/.docs/organized/code-examples/with-livekit.md +8 -8
  23. package/.docs/organized/code-examples/with-opencode.md +99 -54
  24. package/.docs/organized/code-examples/with-parent-id-grouping.md +4 -4
  25. package/.docs/organized/code-examples/with-react-hook-form.md +5 -5
  26. package/.docs/organized/code-examples/with-react-ink.md +1 -1
  27. package/.docs/organized/code-examples/with-react-router.md +8 -8
  28. package/.docs/organized/code-examples/with-store.md +1 -1
  29. package/.docs/organized/code-examples/with-tanstack.md +5 -5
  30. package/.docs/organized/code-examples/with-tap-runtime.md +2 -2
  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 +1 -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/index.mdx +65 -0
  58. package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +50 -6
  59. package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +15 -0
  60. package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +36 -1
  61. package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +38 -0
  62. package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +5 -0
  63. package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +144 -6
  64. package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +230 -2
  65. package/.docs/raw/docs/cloud/ai-sdk.mdx +221 -3
  66. package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
  67. package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +41 -36
  68. package/.docs/raw/docs/guides/branching.mdx +76 -0
  69. package/.docs/raw/docs/guides/chain-of-thought.mdx +166 -0
  70. package/.docs/raw/docs/{(docs)/guides → guides}/context-api.mdx +50 -22
  71. package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +2 -0
  72. package/.docs/raw/docs/guides/editing.mdx +102 -0
  73. package/.docs/raw/docs/guides/index.mdx +103 -0
  74. package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +49 -0
  75. package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +51 -8
  76. package/.docs/raw/docs/{(docs)/guides → guides}/mentions.mdx +61 -86
  77. package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +8 -2
  78. package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +64 -4
  79. package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +10 -17
  80. package/.docs/raw/docs/{(docs)/guides → guides}/slash-commands.mdx +103 -37
  81. package/.docs/raw/docs/guides/speech.mdx +156 -0
  82. package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +21 -83
  83. package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +108 -36
  84. package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +131 -35
  85. package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +39 -0
  86. package/.docs/raw/docs/ink/index.mdx +1 -3
  87. package/.docs/raw/docs/ink/migration.mdx +1 -3
  88. package/.docs/raw/docs/ink/primitives.mdx +37 -1
  89. package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +520 -0
  90. package/.docs/raw/docs/integrations/auth/better-auth.mdx +191 -0
  91. package/.docs/raw/docs/integrations/auth/clerk.mdx +172 -0
  92. package/.docs/raw/docs/integrations/auth/next-auth.mdx +196 -0
  93. package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +79 -0
  94. package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +188 -0
  95. package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +57 -0
  96. package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +201 -0
  97. package/.docs/raw/docs/integrations/gateways/index.mdx +157 -0
  98. package/.docs/raw/docs/integrations/index.mdx +173 -0
  99. package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
  100. package/.docs/raw/docs/integrations/observability/langfuse.mdx +156 -0
  101. package/.docs/raw/docs/integrations/observability/langsmith.mdx +146 -0
  102. package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +712 -0
  103. package/.docs/raw/docs/integrations/tools/mcp.mdx +267 -0
  104. package/.docs/raw/docs/primitives/action-bar.mdx +1 -0
  105. package/.docs/raw/docs/primitives/assistant-modal.mdx +1 -0
  106. package/.docs/raw/docs/primitives/attachment.mdx +1 -0
  107. package/.docs/raw/docs/primitives/branch-picker.mdx +1 -0
  108. package/.docs/raw/docs/primitives/chain-of-thought.mdx +90 -85
  109. package/.docs/raw/docs/primitives/composer.mdx +2 -1
  110. package/.docs/raw/docs/primitives/error.mdx +1 -0
  111. package/.docs/raw/docs/primitives/index.mdx +2 -1
  112. package/.docs/raw/docs/primitives/message.mdx +68 -5
  113. package/.docs/raw/docs/primitives/selection-toolbar.mdx +1 -0
  114. package/.docs/raw/docs/primitives/suggestion.mdx +1 -0
  115. package/.docs/raw/docs/primitives/thread-list.mdx +39 -0
  116. package/.docs/raw/docs/primitives/thread.mdx +16 -13
  117. package/.docs/raw/docs/react-native/index.mdx +1 -3
  118. package/.docs/raw/docs/react-native/migration.mdx +1 -3
  119. package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +396 -0
  120. package/.docs/raw/docs/runtimes/a2a/overview.mdx +60 -0
  121. package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +216 -0
  122. package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +70 -0
  123. package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +243 -0
  124. package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +123 -0
  125. package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
  126. package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +71 -131
  127. package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +69 -63
  128. package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +330 -123
  129. package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
  130. package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
  131. package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
  132. package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
  133. package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
  134. package/.docs/raw/docs/runtimes/custom/data-stream.mdx +323 -0
  135. package/.docs/raw/docs/runtimes/custom/external-store.mdx +253 -1236
  136. package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +746 -0
  137. package/.docs/raw/docs/runtimes/custom/overview.mdx +71 -0
  138. package/.docs/raw/docs/runtimes/google-adk/api.mdx +256 -0
  139. package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +717 -0
  140. package/.docs/raw/docs/runtimes/google-adk/overview.mdx +69 -0
  141. package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +229 -0
  142. package/.docs/raw/docs/runtimes/langchain.mdx +533 -0
  143. package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +305 -0
  144. package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +104 -0
  145. package/.docs/raw/docs/runtimes/langgraph/overview.mdx +84 -0
  146. package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +496 -0
  147. package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +127 -0
  148. package/.docs/raw/docs/runtimes/langgraph/threads.mdx +113 -0
  149. package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +3 -3
  150. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -23
  151. package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
  152. package/.docs/raw/docs/runtimes/opencode/hooks.mdx +191 -0
  153. package/.docs/raw/docs/runtimes/opencode/overview.mdx +48 -0
  154. package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +119 -0
  155. package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +71 -203
  156. package/.docs/raw/docs/ui/accordion.mdx +1 -0
  157. package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
  158. package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
  159. package/.docs/raw/docs/ui/attachment.mdx +1 -0
  160. package/.docs/raw/docs/ui/badge.mdx +1 -0
  161. package/.docs/raw/docs/ui/composer-trigger-popover.mdx +1 -0
  162. package/.docs/raw/docs/ui/context-display.mdx +1 -0
  163. package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
  164. package/.docs/raw/docs/ui/directive-text.mdx +1 -0
  165. package/.docs/raw/docs/ui/file.mdx +1 -0
  166. package/.docs/raw/docs/ui/image.mdx +1 -0
  167. package/.docs/raw/docs/ui/markdown.mdx +2 -14
  168. package/.docs/raw/docs/ui/mermaid.mdx +1 -0
  169. package/.docs/raw/docs/ui/message-timing.mdx +3 -2
  170. package/.docs/raw/docs/ui/model-selector.mdx +1 -0
  171. package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
  172. package/.docs/raw/docs/ui/quote.mdx +1 -0
  173. package/.docs/raw/docs/ui/reasoning.mdx +66 -33
  174. package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
  175. package/.docs/raw/docs/ui/select.mdx +1 -0
  176. package/.docs/raw/docs/ui/sources.mdx +1 -0
  177. package/.docs/raw/docs/ui/streamdown.mdx +1 -0
  178. package/.docs/raw/docs/ui/syntax-highlighting.mdx +1 -0
  179. package/.docs/raw/docs/ui/tabs.mdx +1 -0
  180. package/.docs/raw/docs/ui/thread-list.mdx +17 -0
  181. package/.docs/raw/docs/ui/thread.mdx +56 -1
  182. package/.docs/raw/docs/ui/tool-fallback.mdx +1 -0
  183. package/.docs/raw/docs/ui/tool-group.mdx +39 -11
  184. package/.docs/raw/docs/ui/voice.mdx +1 -0
  185. package/.docs/raw/docs/utilities/heat-graph.mdx +1 -0
  186. package/.docs/raw/docs/utilities/react-o11y.mdx +278 -0
  187. package/.docs/raw/docs/utilities/tw-shimmer.mdx +1 -0
  188. package/package.json +3 -3
  189. package/src/tools/tests/path-traversal.test.ts +1 -1
  190. package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
  191. package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
  192. package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
  193. package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
  194. package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
  195. package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
  196. package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -314
  197. package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
  198. package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
  199. package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
  200. package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
  201. package/.docs/raw/docs/runtimes/langchain/comparison.mdx +0 -60
  202. package/.docs/raw/docs/runtimes/langchain/index.mdx +0 -210
  203. package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -699
  204. package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
  205. package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
  206. package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
  207. package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
  208. package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
@@ -0,0 +1,496 @@
1
+ ---
2
+ title: Quickstart
3
+ description: From-template and manual setup paths to a working LangGraph chat.
4
+ ---
5
+
6
+ Two paths to a running chat against a LangGraph Cloud server. The template is fastest; the manual path is what you adapt when integrating into an existing project.
7
+
8
+ ## From the template
9
+
10
+ <PlatformTabs>
11
+ <Tab value="React">
12
+
13
+ ```sh
14
+ npx create-assistant-ui@latest -t langgraph my-app
15
+ cd my-app
16
+ ```
17
+
18
+ Set environment variables:
19
+
20
+ ```sh title=".env.local"
21
+ # LANGCHAIN_API_KEY=your_api_key # production
22
+ # LANGGRAPH_API_URL=your_api_url # production
23
+ NEXT_PUBLIC_LANGGRAPH_API_URL=your_api_url # development (no API key required)
24
+ NEXT_PUBLIC_LANGGRAPH_ASSISTANT_ID=your_graph_id
25
+ ```
26
+
27
+ ```sh
28
+ npm run dev
29
+ ```
30
+
31
+ Skip ahead to [streaming](/docs/runtimes/langgraph/streaming) to start adding features.
32
+
33
+ </Tab>
34
+ <Tab value="React Native">
35
+
36
+ There is not a React Native LangGraph template yet. Use the manual setup below in an Expo app.
37
+
38
+ </Tab>
39
+ <Tab value="React Ink">
40
+
41
+ There is not an Ink LangGraph template yet. Use the manual setup below in a Node/Ink app.
42
+
43
+ </Tab>
44
+ </PlatformTabs>
45
+
46
+ ## Manual setup in an existing project
47
+
48
+ <Steps>
49
+ <Step>
50
+
51
+ ### Install dependencies
52
+
53
+ <PlatformTabs>
54
+ <Tab value="React">
55
+
56
+ <InstallCommand npm={["@assistant-ui/react", "@assistant-ui/react-langgraph", "@langchain/langgraph-sdk"]} />
57
+
58
+ </Tab>
59
+ <Tab value="React Native">
60
+
61
+ <InstallCommand expo={["@assistant-ui/react-native", "@assistant-ui/react-langgraph", "@langchain/langgraph-sdk"]} />
62
+
63
+ </Tab>
64
+ <Tab value="React Ink">
65
+
66
+ <InstallCommand npm={["@assistant-ui/react-ink", "@assistant-ui/react-langgraph", "@langchain/langgraph-sdk", "ink", "react"]} />
67
+
68
+ </Tab>
69
+ </PlatformTabs>
70
+
71
+ </Step>
72
+ <Step>
73
+
74
+ ### Create the LangGraph client helper
75
+
76
+ <PlatformTabs>
77
+ <Tab value="React">
78
+
79
+ ```ts title="@/lib/chatApi.ts"
80
+ import { Client } from "@langchain/langgraph-sdk";
81
+
82
+ export const createClient = () => {
83
+ const apiUrl =
84
+ process.env["NEXT_PUBLIC_LANGGRAPH_API_URL"] ||
85
+ (typeof window !== "undefined"
86
+ ? new URL("/api", window.location.href).href
87
+ : "/api");
88
+ return new Client({ apiUrl });
89
+ };
90
+ ```
91
+
92
+ </Tab>
93
+ <Tab value="React Native">
94
+
95
+ ```ts title="lib/chatApi.ts"
96
+ import { Client } from "@langchain/langgraph-sdk";
97
+
98
+ export const createClient = () => {
99
+ const apiUrl =
100
+ process.env.EXPO_PUBLIC_LANGGRAPH_API_URL ?? "http://localhost:2024";
101
+ return new Client({ apiUrl });
102
+ };
103
+ ```
104
+
105
+ </Tab>
106
+ <Tab value="React Ink">
107
+
108
+ ```ts title="lib/chatApi.ts"
109
+ import { Client } from "@langchain/langgraph-sdk";
110
+
111
+ export const createClient = () => {
112
+ const apiUrl = process.env.LANGGRAPH_API_URL ?? "http://localhost:2024";
113
+ return new Client({ apiUrl });
114
+ };
115
+ ```
116
+
117
+ </Tab>
118
+ </PlatformTabs>
119
+
120
+ </Step>
121
+ <Step>
122
+
123
+ ### Build the assistant component
124
+
125
+ <PlatformTabs>
126
+ <Tab value="React">
127
+
128
+ ```tsx title="@/components/MyAssistant.tsx"
129
+ "use client";
130
+
131
+ import { useMemo } from "react";
132
+ import { Thread } from "@/components/assistant-ui/thread";
133
+ import { AssistantRuntimeProvider } from "@assistant-ui/react";
134
+ import {
135
+ unstable_createLangGraphStream,
136
+ useLangGraphRuntime,
137
+ type LangChainMessage,
138
+ } from "@assistant-ui/react-langgraph";
139
+
140
+ import { createClient } from "@/lib/chatApi";
141
+
142
+ const ASSISTANT_ID = process.env["NEXT_PUBLIC_LANGGRAPH_ASSISTANT_ID"]!;
143
+
144
+ export function MyAssistant() {
145
+ const client = useMemo(() => createClient(), []);
146
+ const stream = useMemo(
147
+ () =>
148
+ unstable_createLangGraphStream({
149
+ client,
150
+ assistantId: ASSISTANT_ID,
151
+ }),
152
+ [client],
153
+ );
154
+
155
+ const runtime = useLangGraphRuntime({
156
+ unstable_allowCancellation: true,
157
+ stream,
158
+ create: async () => {
159
+ const { thread_id } = await client.threads.create();
160
+ return { externalId: thread_id };
161
+ },
162
+ load: async (externalId) => {
163
+ const state = await client.threads.getState<{
164
+ messages: LangChainMessage[];
165
+ }>(externalId);
166
+ return {
167
+ messages: state.values.messages,
168
+ interrupts: state.tasks[0]?.interrupts,
169
+ };
170
+ },
171
+ });
172
+
173
+ return (
174
+ <AssistantRuntimeProvider runtime={runtime}>
175
+ <Thread />
176
+ </AssistantRuntimeProvider>
177
+ );
178
+ }
179
+ ```
180
+
181
+ </Tab>
182
+ <Tab value="React Native">
183
+
184
+ ```tsx title="components/MyAssistant.tsx"
185
+ import { useMemo } from "react";
186
+ import { AssistantRuntimeProvider } from "@assistant-ui/react-native";
187
+ import {
188
+ unstable_createLangGraphStream,
189
+ useLangGraphRuntime,
190
+ type LangChainMessage,
191
+ } from "@assistant-ui/react-langgraph";
192
+ import { Thread } from "@/components/assistant-ui/thread";
193
+
194
+ import { createClient } from "@/lib/chatApi";
195
+
196
+ const ASSISTANT_ID = process.env.EXPO_PUBLIC_LANGGRAPH_ASSISTANT_ID!;
197
+
198
+ export function MyAssistant() {
199
+ const client = useMemo(() => createClient(), []);
200
+ const stream = useMemo(
201
+ () =>
202
+ unstable_createLangGraphStream({
203
+ client,
204
+ assistantId: ASSISTANT_ID,
205
+ }),
206
+ [client],
207
+ );
208
+
209
+ const runtime = useLangGraphRuntime({
210
+ unstable_allowCancellation: true,
211
+ stream,
212
+ create: async () => {
213
+ const { thread_id } = await client.threads.create();
214
+ return { externalId: thread_id };
215
+ },
216
+ load: async (externalId) => {
217
+ const state = await client.threads.getState<{
218
+ messages: LangChainMessage[];
219
+ }>(externalId);
220
+ return {
221
+ messages: state.values.messages,
222
+ interrupts: state.tasks[0]?.interrupts,
223
+ };
224
+ },
225
+ });
226
+
227
+ return (
228
+ <AssistantRuntimeProvider runtime={runtime}>
229
+ <Thread />
230
+ </AssistantRuntimeProvider>
231
+ );
232
+ }
233
+ ```
234
+
235
+ </Tab>
236
+ <Tab value="React Ink">
237
+
238
+ ```tsx title="components/MyAssistant.tsx"
239
+ import { useMemo } from "react";
240
+ import { AssistantRuntimeProvider } from "@assistant-ui/react-ink";
241
+ import {
242
+ unstable_createLangGraphStream,
243
+ useLangGraphRuntime,
244
+ type LangChainMessage,
245
+ } from "@assistant-ui/react-langgraph";
246
+ import { Thread } from "./thread.js";
247
+
248
+ import { createClient } from "../lib/chatApi.js";
249
+
250
+ const ASSISTANT_ID = process.env.LANGGRAPH_ASSISTANT_ID!;
251
+
252
+ export function MyAssistant() {
253
+ const client = useMemo(() => createClient(), []);
254
+ const stream = useMemo(
255
+ () =>
256
+ unstable_createLangGraphStream({
257
+ client,
258
+ assistantId: ASSISTANT_ID,
259
+ }),
260
+ [client],
261
+ );
262
+
263
+ const runtime = useLangGraphRuntime({
264
+ unstable_allowCancellation: true,
265
+ stream,
266
+ create: async () => {
267
+ const { thread_id } = await client.threads.create();
268
+ return { externalId: thread_id };
269
+ },
270
+ load: async (externalId) => {
271
+ const state = await client.threads.getState<{
272
+ messages: LangChainMessage[];
273
+ }>(externalId);
274
+ return {
275
+ messages: state.values.messages,
276
+ interrupts: state.tasks[0]?.interrupts,
277
+ };
278
+ },
279
+ });
280
+
281
+ return (
282
+ <AssistantRuntimeProvider runtime={runtime}>
283
+ <Thread />
284
+ </AssistantRuntimeProvider>
285
+ );
286
+ }
287
+ ```
288
+
289
+ </Tab>
290
+ </PlatformTabs>
291
+
292
+ </Step>
293
+ <Step>
294
+
295
+ ### Mount the component
296
+
297
+ <PlatformTabs>
298
+ <Tab value="React">
299
+
300
+ ```tsx title="@/app/page.tsx"
301
+ import { MyAssistant } from "@/components/MyAssistant";
302
+
303
+ export default function Home() {
304
+ return (
305
+ <main className="h-dvh">
306
+ <MyAssistant />
307
+ </main>
308
+ );
309
+ }
310
+ ```
311
+
312
+ </Tab>
313
+ <Tab value="React Native">
314
+
315
+ ```tsx title="app/index.tsx"
316
+ import { View } from "react-native";
317
+ import { MyAssistant } from "@/components/MyAssistant";
318
+
319
+ export default function Home() {
320
+ return (
321
+ <View style={{ flex: 1 }}>
322
+ <MyAssistant />
323
+ </View>
324
+ );
325
+ }
326
+ ```
327
+
328
+ </Tab>
329
+ <Tab value="React Ink">
330
+
331
+ ```tsx title="app.tsx"
332
+ import { Box } from "ink";
333
+ import { MyAssistant } from "./components/MyAssistant.js";
334
+
335
+ export function App() {
336
+ return (
337
+ <Box flexDirection="column">
338
+ <MyAssistant />
339
+ </Box>
340
+ );
341
+ }
342
+ ```
343
+
344
+ </Tab>
345
+ </PlatformTabs>
346
+
347
+ </Step>
348
+ <Step>
349
+
350
+ ### Set environment variables
351
+
352
+ <PlatformTabs>
353
+ <Tab value="React">
354
+
355
+ Use the same `.env.local` shape as the template path [above](#from-the-template).
356
+
357
+ </Tab>
358
+ <Tab value="React Native">
359
+
360
+ ```sh title=".env"
361
+ EXPO_PUBLIC_LANGGRAPH_API_URL=http://localhost:2024
362
+ EXPO_PUBLIC_LANGGRAPH_ASSISTANT_ID=your_graph_id
363
+ ```
364
+
365
+ </Tab>
366
+ <Tab value="React Ink">
367
+
368
+ ```sh title=".env"
369
+ LANGGRAPH_API_URL=http://localhost:2024
370
+ LANGGRAPH_ASSISTANT_ID=your_graph_id
371
+ ```
372
+
373
+ </Tab>
374
+ </PlatformTabs>
375
+
376
+ </Step>
377
+ <Step>
378
+
379
+ ### Set up UI components
380
+
381
+ <PlatformTabs>
382
+ <Tab value="React">
383
+
384
+ Follow the [UI Components guide](/docs/ui/thread) to wire up the Thread, composer, and supporting primitives.
385
+
386
+ </Tab>
387
+ <Tab value="React Native">
388
+
389
+ Follow the [React Native setup](/docs/react-native) to add a native Thread, composer, and supporting primitives.
390
+
391
+ </Tab>
392
+ <Tab value="React Ink">
393
+
394
+ Follow the [Ink setup](/docs/ink) to add a terminal Thread, composer, and supporting primitives.
395
+
396
+ </Tab>
397
+ </PlatformTabs>
398
+
399
+ </Step>
400
+ </Steps>
401
+
402
+ ## Production proxy backend
403
+
404
+ For development, the client above hits LangGraph Cloud directly using `NEXT_PUBLIC_LANGGRAPH_API_URL`. For production, proxy through your own backend so your API key never reaches the client. Limit the proxy to the endpoints you actually need.
405
+
406
+ ```ts title="@/app/api/[...path]/route.ts"
407
+ import { NextRequest, NextResponse } from "next/server";
408
+
409
+ export const runtime = "edge";
410
+
411
+ function getCorsHeaders() {
412
+ return {
413
+ "Access-Control-Allow-Origin": "*",
414
+ "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
415
+ "Access-Control-Allow-Headers": "*",
416
+ };
417
+ }
418
+
419
+ async function handleRequest(req: NextRequest, method: string) {
420
+ try {
421
+ const path = req.nextUrl.pathname.replace(/^\/?api\//, "");
422
+ const url = new URL(req.url);
423
+ const searchParams = new URLSearchParams(url.search);
424
+ searchParams.delete("_path");
425
+ searchParams.delete("nxtP_path");
426
+ const queryString = searchParams.toString()
427
+ ? `?${searchParams.toString()}`
428
+ : "";
429
+
430
+ const options: RequestInit = {
431
+ method,
432
+ headers: { "x-api-key": process.env["LANGCHAIN_API_KEY"] ?? "" },
433
+ signal: req.signal,
434
+ };
435
+ if (["POST", "PUT", "PATCH"].includes(method)) {
436
+ options.body = await req.text();
437
+ }
438
+
439
+ const res = await fetch(
440
+ `${process.env["LANGGRAPH_API_URL"]}/${path}${queryString}`,
441
+ options,
442
+ );
443
+ const headers = new Headers(res.headers);
444
+ headers.delete("content-encoding");
445
+ headers.delete("content-length");
446
+ headers.delete("transfer-encoding");
447
+ for (const [key, value] of Object.entries(getCorsHeaders())) {
448
+ headers.set(key, value);
449
+ }
450
+ return new NextResponse(res.body, {
451
+ status: res.status,
452
+ statusText: res.statusText,
453
+ headers,
454
+ });
455
+ } catch (e: unknown) {
456
+ if (e instanceof Error) {
457
+ const typedError = e as Error & { status?: number };
458
+ return NextResponse.json(
459
+ { error: typedError.message },
460
+ { status: typedError.status ?? 500 },
461
+ );
462
+ }
463
+ return NextResponse.json({ error: "Unknown error" }, { status: 500 });
464
+ }
465
+ }
466
+
467
+ export const GET = (req: NextRequest) => handleRequest(req, "GET");
468
+ export const POST = (req: NextRequest) => handleRequest(req, "POST");
469
+ export const PUT = (req: NextRequest) => handleRequest(req, "PUT");
470
+ export const PATCH = (req: NextRequest) => handleRequest(req, "PATCH");
471
+ export const DELETE = (req: NextRequest) => handleRequest(req, "DELETE");
472
+ export const OPTIONS = () =>
473
+ new NextResponse(null, { status: 204, headers: getCorsHeaders() });
474
+ ```
475
+
476
+ With this route in place, drop `NEXT_PUBLIC_LANGGRAPH_API_URL` from production env vars; the client helper falls back to the same-origin `/api` path. Set `LANGCHAIN_API_KEY` and `LANGGRAPH_API_URL` server-side instead.
477
+
478
+ ## Next
479
+
480
+ <Cards>
481
+ <Card
482
+ title="Streaming"
483
+ description="Event handlers, message metadata, message conversion."
484
+ href="/docs/runtimes/langgraph/streaming"
485
+ />
486
+ <Card
487
+ title="Generative UI"
488
+ description="Structured UI components emitted by your graph."
489
+ href="/docs/runtimes/langgraph/generative-ui"
490
+ />
491
+ <Card
492
+ title="Interrupts"
493
+ description="Interrupt persistence and checkpoint-based message editing."
494
+ href="/docs/runtimes/langgraph/interrupts"
495
+ />
496
+ </Cards>
@@ -0,0 +1,127 @@
1
+ ---
2
+ title: Streaming
3
+ description: Event handlers, message accumulator, conversion, metadata, and generative UI.
4
+ ---
5
+
6
+ LangGraph emits a rich stream of events: top-level message chunks, subgraph events, custom UI messages, errors, and metadata. This page documents how to observe and react to each.
7
+
8
+ ## Message accumulator
9
+
10
+ `LangGraphMessageAccumulator` lets you append messages incoming from the server to replicate the messages state client-side.
11
+
12
+ ```ts
13
+ import {
14
+ LangGraphMessageAccumulator,
15
+ appendLangChainChunk,
16
+ } from "@assistant-ui/react-langgraph";
17
+
18
+ const accumulator = new LangGraphMessageAccumulator({
19
+ appendMessage: appendLangChainChunk,
20
+ });
21
+
22
+ if (event.event === "messages/partial") {
23
+ accumulator.addMessages(event.data);
24
+ }
25
+ ```
26
+
27
+ ## Message conversion
28
+
29
+ `convertLangChainMessages` transforms LangChain messages to assistant-ui's format. Use it when bridging into a custom adapter or rendering messages outside the runtime.
30
+
31
+ ```ts
32
+ import { convertLangChainMessages } from "@assistant-ui/react-langgraph";
33
+
34
+ const threadMessage = convertLangChainMessages(langChainMessage);
35
+ ```
36
+
37
+ ## Event handlers
38
+
39
+ Listen to streaming events by passing `eventHandlers` to `useLangGraphRuntime`:
40
+
41
+ ```ts
42
+ const runtime = useLangGraphRuntime({
43
+ stream: async (messages, { initialize, ...config }) => {
44
+ /* ... */
45
+ },
46
+ eventHandlers: {
47
+ onMessageChunk: (chunk, metadata) => {
48
+ // Fired for each chunk in messages-tuple mode.
49
+ // metadata contains langgraph_step, langgraph_node, ls_model_name, etc.
50
+ // For pipe-namespaced events emitted by subgraphs (e.g. messages|tools:call_abc),
51
+ // metadata.namespace holds the suffix ("tools:call_abc"). Use it to attribute
52
+ // a chunk to a specific subgraph.
53
+ },
54
+ onValues: (values) => {
55
+ // Fired when a top-level values event is received.
56
+ // Subgraph values events are routed to onSubgraphValues instead.
57
+ },
58
+ onUpdates: (updates) => {
59
+ // Fired when a top-level updates event is received.
60
+ // Subgraph updates events are routed to onSubgraphUpdates instead.
61
+ },
62
+ onSubgraphValues: (namespace, values) => {
63
+ // Fired when a subgraph values|<namespace> event is received
64
+ // (e.g. namespace === "tools:call_abc").
65
+ },
66
+ onSubgraphUpdates: (namespace, updates) => {
67
+ // Fired when a subgraph updates|<namespace> event is received.
68
+ },
69
+ onMetadata: (metadata) => {
70
+ /* thread metadata */
71
+ },
72
+ onInfo: (info) => {
73
+ /* informational messages */
74
+ },
75
+ onError: (error) => {
76
+ // Fired for both top-level and subgraph errors.
77
+ },
78
+ onSubgraphError: (namespace, error) => {
79
+ // Additionally fired for subgraph errors with the namespace.
80
+ // Use this to attribute a subgraph failure to its source without marking
81
+ // the parent message as incomplete (that only happens for top-level errors).
82
+ },
83
+ onCustomEvent: (type, data) => {
84
+ /* custom events */
85
+ },
86
+ },
87
+ });
88
+ ```
89
+
90
+ ## Message metadata
91
+
92
+ When using `streamMode: "messages-tuple"`, each chunk includes metadata from the LangGraph server. Access accumulated metadata per message with `useLangGraphMessageMetadata`:
93
+
94
+ ```ts
95
+ import { useLangGraphMessageMetadata } from "@assistant-ui/react-langgraph";
96
+
97
+ function MyComponent() {
98
+ const metadata = useLangGraphMessageMetadata();
99
+ // Map<string, LangGraphTupleMetadata> keyed by message ID
100
+ }
101
+ ```
102
+
103
+ ## Generative UI
104
+
105
+ LangGraph can emit structured UI components alongside assistant messages via `push_ui_message` (Python) or `typedUi().push()` (TypeScript). The assistant-ui adapter translates these into [`DataMessagePart`s](/docs/guides/tool-ui) on the associated assistant message, which you render with the existing `makeAssistantDataUI` API.
106
+
107
+ See [Generative UI](/docs/runtimes/langgraph/generative-ui) for full setup: enabling the `custom` stream channel, emitting UI messages, registering renderers, dynamic loading, and persisting UI state across thread switches.
108
+
109
+ ## Next
110
+
111
+ <Cards>
112
+ <Card
113
+ title="Generative UI"
114
+ description="Structured UI components emitted by your graph."
115
+ href="/docs/runtimes/langgraph/generative-ui"
116
+ />
117
+ <Card
118
+ title="Interrupts"
119
+ description="Interrupt persistence and checkpoint-based message editing."
120
+ href="/docs/runtimes/langgraph/interrupts"
121
+ />
122
+ <Card
123
+ title="Threads"
124
+ description="Basic thread support, AssistantCloud, custom thread list adapter."
125
+ href="/docs/runtimes/langgraph/threads"
126
+ />
127
+ </Cards>