@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
@@ -39,24 +39,63 @@ Create a new project in the [assistant-cloud dashboard](https://cloud.assistant-
39
39
 
40
40
  ### Configure Environment Variables
41
41
 
42
+ <PlatformTabs>
43
+ <Tab value="React">
44
+
42
45
  ```bash title=".env.local"
43
46
  NEXT_PUBLIC_ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
44
47
  ```
45
48
 
49
+ </Tab>
50
+ <Tab value="React Native">
51
+
52
+ ```bash title=".env"
53
+ EXPO_PUBLIC_ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
54
+ ```
55
+
56
+ </Tab>
57
+ <Tab value="React Ink">
58
+
59
+ ```bash title=".env"
60
+ ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
61
+ ```
62
+
63
+ </Tab>
64
+ </PlatformTabs>
65
+
46
66
  </Step>
47
67
 
48
68
  <Step>
49
69
 
50
70
  ### Install Dependencies
51
71
 
72
+ <PlatformTabs>
73
+ <Tab value="React">
74
+
52
75
  <InstallCommand npm={["@assistant-ui/cloud-ai-sdk", "@ai-sdk/react", "ai"]} />
53
76
 
77
+ </Tab>
78
+ <Tab value="React Native">
79
+
80
+ <InstallCommand expo={["@assistant-ui/cloud-ai-sdk", "@ai-sdk/react", "ai", "assistant-cloud"]} />
81
+
82
+ </Tab>
83
+ <Tab value="React Ink">
84
+
85
+ <InstallCommand npm={["@assistant-ui/cloud-ai-sdk", "@ai-sdk/react", "ai", "assistant-cloud", "ink", "react"]} />
86
+
87
+ </Tab>
88
+ </PlatformTabs>
89
+
54
90
  </Step>
55
91
 
56
92
  <Step>
57
93
 
58
94
  ### Integrate
59
95
 
96
+ <PlatformTabs>
97
+ <Tab value="React">
98
+
60
99
  ```tsx title="app/page.tsx"
61
100
  "use client";
62
101
 
@@ -106,6 +145,131 @@ export default function Chat() {
106
145
  }
107
146
  ```
108
147
 
148
+ </Tab>
149
+ <Tab value="React Native">
150
+
151
+ ```tsx title="app/index.tsx"
152
+ import { useMemo, useState } from "react";
153
+ import { Pressable, Text, TextInput, View } from "react-native";
154
+ import { AssistantCloud } from "assistant-cloud";
155
+ import { useCloudChat } from "@assistant-ui/cloud-ai-sdk";
156
+
157
+ async function getAssistantToken() {
158
+ // Return a user token from your auth provider.
159
+ return "...";
160
+ }
161
+
162
+ export default function Chat() {
163
+ const cloud = useMemo(
164
+ () =>
165
+ new AssistantCloud({
166
+ baseUrl: process.env.EXPO_PUBLIC_ASSISTANT_BASE_URL!,
167
+ authToken: getAssistantToken,
168
+ }),
169
+ [],
170
+ );
171
+ const { messages, sendMessage, threads } = useCloudChat({ cloud });
172
+
173
+ const [input, setInput] = useState("");
174
+ const handleSubmit = () => {
175
+ if (!input.trim()) return;
176
+ sendMessage({ text: input });
177
+ setInput("");
178
+ };
179
+
180
+ return (
181
+ <View>
182
+ <View>
183
+ {threads.threads.map((t) => (
184
+ <Pressable key={t.id} onPress={() => threads.selectThread(t.id)}>
185
+ <Text>{t.title || "New conversation"}</Text>
186
+ </Pressable>
187
+ ))}
188
+ <Pressable onPress={() => threads.selectThread(null)}>
189
+ <Text>New chat</Text>
190
+ </Pressable>
191
+ </View>
192
+
193
+ <View>
194
+ {messages.map((m) => (
195
+ <Text key={m.id}>
196
+ {m.parts.map((p) => p.type === "text" && p.text)}
197
+ </Text>
198
+ ))}
199
+ </View>
200
+
201
+ <TextInput value={input} onChangeText={setInput} />
202
+ <Pressable onPress={handleSubmit}>
203
+ <Text>Send</Text>
204
+ </Pressable>
205
+ </View>
206
+ );
207
+ }
208
+ ```
209
+
210
+ </Tab>
211
+ <Tab value="React Ink">
212
+
213
+ ```tsx title="app.tsx"
214
+ import { useMemo, useState } from "react";
215
+ import { Box, Text, useInput } from "ink";
216
+ import { AssistantCloud } from "assistant-cloud";
217
+ import { useCloudChat } from "@assistant-ui/cloud-ai-sdk";
218
+
219
+ async function getAssistantToken() {
220
+ // Return a user token from your auth provider.
221
+ return "...";
222
+ }
223
+
224
+ export function Chat() {
225
+ const cloud = useMemo(
226
+ () =>
227
+ new AssistantCloud({
228
+ baseUrl: process.env.ASSISTANT_BASE_URL!,
229
+ authToken: getAssistantToken,
230
+ }),
231
+ [],
232
+ );
233
+ const { messages, sendMessage, threads } = useCloudChat({ cloud });
234
+
235
+ const [input, setInput] = useState("");
236
+ const handleSubmit = () => {
237
+ if (!input.trim()) return;
238
+ sendMessage({ text: input });
239
+ setInput("");
240
+ };
241
+
242
+ useInput((value, key) => {
243
+ if (key.return) handleSubmit();
244
+ else if (key.tab) threads.selectThread(null);
245
+ else if (key.backspace || key.delete) setInput((text) => text.slice(0, -1));
246
+ else if (value) setInput((text) => text + value);
247
+ });
248
+
249
+ return (
250
+ <Box flexDirection="column">
251
+ <Text bold>Threads</Text>
252
+ {threads.threads.map((t) => (
253
+ <Text key={t.id}>{t.title || "New conversation"}</Text>
254
+ ))}
255
+ <Text dimColor>Press tab for a new chat.</Text>
256
+
257
+ {messages.map((m) => (
258
+ <Text key={m.id}>
259
+ {m.parts.map((p) => p.type === "text" && p.text)}
260
+ </Text>
261
+ ))}
262
+
263
+ <Text>{"> "}{input}</Text>
264
+ <Text dimColor>Press enter to send.</Text>
265
+ </Box>
266
+ );
267
+ }
268
+ ```
269
+
270
+ </Tab>
271
+ </PlatformTabs>
272
+
109
273
  </Step>
110
274
 
111
275
  </Steps>
@@ -229,7 +393,7 @@ export async function POST(req: Request) {
229
393
  const { messages } = await req.json();
230
394
 
231
395
  const result = streamText({
232
- model: openai("gpt-4o-mini"),
396
+ model: openai("gpt-5.4-mini"),
233
397
  messages,
234
398
  });
235
399
 
@@ -297,7 +461,7 @@ export async function POST(req: Request) {
297
461
  const samplingCalls: Record<string, SamplingCallData[]> = {};
298
462
 
299
463
  const result = streamText({
300
- model: openai("gpt-4o"),
464
+ model: openai("gpt-5.4-mini"),
301
465
  messages,
302
466
  tools: {
303
467
  delegate_to_gemini: tool({
@@ -356,7 +520,10 @@ export async function POST(req: Request) {
356
520
 
357
521
  ## Authentication
358
522
 
359
- The example above uses anonymous mode (browser session-based user ID) via the env var. For production apps with user accounts, pass an explicit cloud instance:
523
+ The React example above uses anonymous mode for quick demos. For production apps with user accounts, pass an explicit cloud instance with a token from your auth provider:
524
+
525
+ <PlatformTabs>
526
+ <Tab value="React">
360
527
 
361
528
  ```tsx
362
529
  import { useMemo } from "react";
@@ -377,6 +544,57 @@ function Chat() {
377
544
  }
378
545
  ```
379
546
 
547
+ </Tab>
548
+ <Tab value="React Native">
549
+
550
+ ```tsx
551
+ import { useMemo } from "react";
552
+ import { AssistantCloud } from "assistant-cloud";
553
+ import { useCloudChat } from "@assistant-ui/cloud-ai-sdk";
554
+
555
+ async function getAssistantToken() {
556
+ // Return a user token from your native auth provider.
557
+ return "...";
558
+ }
559
+
560
+ function Chat() {
561
+ const cloud = useMemo(() => new AssistantCloud({
562
+ baseUrl: process.env.EXPO_PUBLIC_ASSISTANT_BASE_URL!,
563
+ authToken: getAssistantToken,
564
+ }), []);
565
+
566
+ const { messages, sendMessage, threads } = useCloudChat({ cloud });
567
+ // ...
568
+ }
569
+ ```
570
+
571
+ </Tab>
572
+ <Tab value="React Ink">
573
+
574
+ ```tsx
575
+ import { useMemo } from "react";
576
+ import { AssistantCloud } from "assistant-cloud";
577
+ import { useCloudChat } from "@assistant-ui/cloud-ai-sdk";
578
+
579
+ async function getAssistantToken() {
580
+ // Return a user token from your CLI auth flow.
581
+ return "...";
582
+ }
583
+
584
+ function Chat() {
585
+ const cloud = useMemo(() => new AssistantCloud({
586
+ baseUrl: process.env.ASSISTANT_BASE_URL!,
587
+ authToken: getAssistantToken,
588
+ }), []);
589
+
590
+ const { messages, sendMessage, threads } = useCloudChat({ cloud });
591
+ // ...
592
+ }
593
+ ```
594
+
595
+ </Tab>
596
+ </PlatformTabs>
597
+
380
598
  See the [Cloud Authorization](/docs/cloud/authorization) guide for other auth providers.
381
599
 
382
600
  ## Next Steps
@@ -36,6 +36,9 @@ Create a new project in the [assistant-cloud dashboard](https://cloud.assistant-
36
36
 
37
37
  Add the following environment variables to your project:
38
38
 
39
+ <PlatformTabs>
40
+ <Tab value="React">
41
+
39
42
  ```bash title=".env.local"
40
43
  # Frontend API URL from your cloud project settings
41
44
  NEXT_PUBLIC_ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
@@ -44,6 +47,31 @@ NEXT_PUBLIC_ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
44
47
  ASSISTANT_API_KEY=your-api-key-here
45
48
  ```
46
49
 
50
+ </Tab>
51
+ <Tab value="React Native">
52
+
53
+ ```bash title=".env"
54
+ # Client API URL from your cloud project settings
55
+ EXPO_PUBLIC_ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
56
+
57
+ # API key for server-side operations; do not ship this in your app bundle
58
+ ASSISTANT_API_KEY=your-api-key-here
59
+ ```
60
+
61
+ </Tab>
62
+ <Tab value="React Ink">
63
+
64
+ ```bash title=".env"
65
+ # Client API URL from your cloud project settings
66
+ ASSISTANT_BASE_URL=https://proj-[YOUR-ID].assistant-api.com
67
+
68
+ # API key for server-side operations; do not ship this in your CLI bundle
69
+ ASSISTANT_API_KEY=your-api-key-here
70
+ ```
71
+
72
+ </Tab>
73
+ </PlatformTabs>
74
+
47
75
  </Step>
48
76
 
49
77
  <Step>
@@ -52,8 +80,24 @@ ASSISTANT_API_KEY=your-api-key-here
52
80
 
53
81
  Install the required packages:
54
82
 
83
+ <PlatformTabs>
84
+ <Tab value="React">
85
+
55
86
  <InstallCommand npm={["@assistant-ui/react", "@assistant-ui/react-langgraph"]} />
56
87
 
88
+ </Tab>
89
+ <Tab value="React Native">
90
+
91
+ <InstallCommand expo={["@assistant-ui/react-native", "@assistant-ui/react-langgraph", "assistant-cloud"]} />
92
+
93
+ </Tab>
94
+ <Tab value="React Ink">
95
+
96
+ <InstallCommand npm={["@assistant-ui/react-ink", "@assistant-ui/react-langgraph", "assistant-cloud", "ink", "react"]} />
97
+
98
+ </Tab>
99
+ </PlatformTabs>
100
+
57
101
  </Step>
58
102
 
59
103
  <Step>
@@ -62,6 +106,9 @@ Install the required packages:
62
106
 
63
107
  Create a runtime provider that integrates LangGraph with assistant-cloud. Choose between anonymous mode for demos/prototypes or authenticated mode for production:
64
108
 
109
+ <PlatformTabs>
110
+ <Tab value="React">
111
+
65
112
  <Tabs items={["Anonymous", "Authenticated (Clerk)"]}>
66
113
 
67
114
  <Tab value="Anonymous">
@@ -204,6 +251,135 @@ export function MyRuntimeProvider({
204
251
 
205
252
  </Tabs>
206
253
 
254
+ </Tab>
255
+ <Tab value="React Native">
256
+
257
+ ```tsx title="components/runtime-provider.tsx"
258
+ import { useMemo, type ReactNode } from "react";
259
+ import { AssistantRuntimeProvider } from "@assistant-ui/react-native";
260
+ import { AssistantCloud } from "assistant-cloud";
261
+ import {
262
+ type LangChainMessage,
263
+ useLangGraphRuntime,
264
+ } from "@assistant-ui/react-langgraph";
265
+ import { createThread, deleteThread, getThreadState, sendMessage } from "@/lib/chatApi";
266
+
267
+ async function getAssistantToken() {
268
+ // Return a user token from your auth provider.
269
+ return "...";
270
+ }
271
+
272
+ export function MyRuntimeProvider({ children }: { children: ReactNode }) {
273
+ const cloud = useMemo(
274
+ () =>
275
+ new AssistantCloud({
276
+ baseUrl: process.env.EXPO_PUBLIC_ASSISTANT_BASE_URL!,
277
+ authToken: getAssistantToken,
278
+ }),
279
+ [],
280
+ );
281
+
282
+ const runtime = useLangGraphRuntime({
283
+ cloud,
284
+ stream: async function* (messages, { initialize }) {
285
+ const { externalId } = await initialize();
286
+ if (!externalId) throw new Error("Thread not found");
287
+
288
+ return sendMessage({
289
+ threadId: externalId,
290
+ messages,
291
+ });
292
+ },
293
+ create: async () => {
294
+ const { thread_id } = await createThread();
295
+ return { externalId: thread_id };
296
+ },
297
+ load: async (externalId) => {
298
+ const state = await getThreadState(externalId);
299
+ return {
300
+ messages:
301
+ (state.values as { messages?: LangChainMessage[] }).messages ?? [],
302
+ };
303
+ },
304
+ delete: async (externalId) => {
305
+ await deleteThread(externalId);
306
+ },
307
+ });
308
+
309
+ return (
310
+ <AssistantRuntimeProvider runtime={runtime}>
311
+ {children}
312
+ </AssistantRuntimeProvider>
313
+ );
314
+ }
315
+ ```
316
+
317
+ </Tab>
318
+ <Tab value="React Ink">
319
+
320
+ ```tsx title="runtime-provider.tsx"
321
+ import { useMemo, type ReactNode } from "react";
322
+ import { AssistantRuntimeProvider } from "@assistant-ui/react-ink";
323
+ import { AssistantCloud } from "assistant-cloud";
324
+ import {
325
+ type LangChainMessage,
326
+ useLangGraphRuntime,
327
+ } from "@assistant-ui/react-langgraph";
328
+ import { createThread, deleteThread, getThreadState, sendMessage } from "./chat-api.js";
329
+
330
+ async function getAssistantToken() {
331
+ // Return a user token from your auth provider.
332
+ return "...";
333
+ }
334
+
335
+ export function MyRuntimeProvider({ children }: { children: ReactNode }) {
336
+ const cloud = useMemo(
337
+ () =>
338
+ new AssistantCloud({
339
+ baseUrl: process.env.ASSISTANT_BASE_URL!,
340
+ authToken: getAssistantToken,
341
+ }),
342
+ [],
343
+ );
344
+
345
+ const runtime = useLangGraphRuntime({
346
+ cloud,
347
+ stream: async function* (messages, { initialize }) {
348
+ const { externalId } = await initialize();
349
+ if (!externalId) throw new Error("Thread not found");
350
+
351
+ return sendMessage({
352
+ threadId: externalId,
353
+ messages,
354
+ });
355
+ },
356
+ create: async () => {
357
+ const { thread_id } = await createThread();
358
+ return { externalId: thread_id };
359
+ },
360
+ load: async (externalId) => {
361
+ const state = await getThreadState(externalId);
362
+ return {
363
+ messages:
364
+ (state.values as { messages?: LangChainMessage[] }).messages ?? [],
365
+ };
366
+ },
367
+ delete: async (externalId) => {
368
+ await deleteThread(externalId);
369
+ },
370
+ });
371
+
372
+ return (
373
+ <AssistantRuntimeProvider runtime={runtime}>
374
+ {children}
375
+ </AssistantRuntimeProvider>
376
+ );
377
+ }
378
+ ```
379
+
380
+ </Tab>
381
+ </PlatformTabs>
382
+
207
383
  <Callout type="info">
208
384
  The `useLangGraphRuntime` hook accepts `cloud`, `create`, `load`, and `delete` parameters for simplified thread management. The runtime handles the thread lifecycle internally.
209
385
 
@@ -220,6 +396,9 @@ export function MyRuntimeProvider({
220
396
 
221
397
  Install the thread list component:
222
398
 
399
+ <PlatformTabs>
400
+ <Tab value="React">
401
+
223
402
  <Tabs items={["assistant-ui", "shadcn (namespace)", "shadcn"]}>
224
403
  <Tab>
225
404
 
@@ -260,17 +439,110 @@ export default function ChatPage() {
260
439
  }
261
440
  ```
262
441
 
442
+ </Tab>
443
+ <Tab value="React Native">
444
+
445
+ Follow the [React Native setup](/docs/react-native) for `Thread`, then compose it with the native thread-list primitives:
446
+
447
+ ```tsx title="app/chat.tsx"
448
+ import { Text, View } from "react-native";
449
+ import {
450
+ ThreadListItemPrimitive,
451
+ ThreadListPrimitive,
452
+ } from "@assistant-ui/react-native";
453
+ import { Thread } from "@/components/assistant-ui/thread";
454
+
455
+ function ThreadList() {
456
+ return (
457
+ <ThreadListPrimitive.Root>
458
+ <ThreadListPrimitive.New>
459
+ <Text>New chat</Text>
460
+ </ThreadListPrimitive.New>
461
+ <ThreadListPrimitive.Items
462
+ renderItem={({ threadId }) => (
463
+ <ThreadListItemPrimitive.Root key={threadId}>
464
+ <ThreadListItemPrimitive.Trigger>
465
+ <ThreadListItemPrimitive.Title fallback="New conversation" />
466
+ </ThreadListItemPrimitive.Trigger>
467
+ </ThreadListItemPrimitive.Root>
468
+ )}
469
+ />
470
+ </ThreadListPrimitive.Root>
471
+ );
472
+ }
473
+
474
+ export default function ChatPage() {
475
+ return (
476
+ <MyRuntimeProvider>
477
+ <View style={{ flex: 1 }}>
478
+ <ThreadList />
479
+ <Thread />
480
+ </View>
481
+ </MyRuntimeProvider>
482
+ );
483
+ }
484
+ ```
485
+
486
+ </Tab>
487
+ <Tab value="React Ink">
488
+
489
+ Follow the [Ink setup](/docs/ink) for `Thread`, then compose it with the terminal thread-list primitives:
490
+
491
+ ```tsx title="chat.tsx"
492
+ import { Box, Text } from "ink";
493
+ import {
494
+ ThreadListItemPrimitive,
495
+ ThreadListPrimitive,
496
+ } from "@assistant-ui/react-ink";
497
+ import { Thread } from "./components/thread.js";
498
+
499
+ function ThreadList() {
500
+ return (
501
+ <ThreadListPrimitive.Root>
502
+ <ThreadListPrimitive.New>
503
+ <Text color="green">[New chat]</Text>
504
+ </ThreadListPrimitive.New>
505
+ <ThreadListPrimitive.Items
506
+ renderItem={({ threadId }) => (
507
+ <ThreadListItemPrimitive.Root key={threadId}>
508
+ <ThreadListItemPrimitive.Trigger>
509
+ <ThreadListItemPrimitive.Title fallback="New conversation" />
510
+ </ThreadListItemPrimitive.Trigger>
511
+ </ThreadListItemPrimitive.Root>
512
+ )}
513
+ />
514
+ </ThreadListPrimitive.Root>
515
+ );
516
+ }
517
+
518
+ export function ChatPage() {
519
+ return (
520
+ <MyRuntimeProvider>
521
+ <Box flexDirection="column">
522
+ <ThreadList />
523
+ <Thread />
524
+ </Box>
525
+ </MyRuntimeProvider>
526
+ );
527
+ }
528
+ ```
529
+
530
+ </Tab>
531
+ </PlatformTabs>
532
+
263
533
  </Step>
264
534
 
265
535
  </Steps>
266
536
 
267
537
  ## Authentication
268
538
 
269
- The examples above show two authentication modes:
539
+ The React runtime-provider tab shows two authentication modes:
270
540
 
271
- - **Anonymous**: Suitable for demos and prototypes. Creates a browser session-based user ID.
541
+ - **Anonymous**: Suitable for React demos and prototypes. Creates a browser session-based user ID.
272
542
  - **Authenticated**: For production use with user accounts. The authenticated example uses [Clerk](https://clerk.com/), but you can integrate any auth provider.
273
543
 
544
+ The React Native and React Ink tabs use explicit `authToken` callbacks, which is the recommended shape outside browser-session-based demos.
545
+
274
546
  For other authentication providers or custom implementations, see the [Cloud Authorization](/docs/cloud/authorization) guide.
275
547
 
276
548
  ## Next Steps