@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.
- package/.docs/organized/code-examples/waterfall.md +15 -7
- package/.docs/organized/code-examples/with-a2a.md +9 -21
- package/.docs/organized/code-examples/with-ag-ui.md +11 -8
- package/.docs/organized/code-examples/with-ai-sdk-v6.md +10 -10
- package/.docs/organized/code-examples/with-artifacts.md +12 -10
- package/.docs/organized/code-examples/with-assistant-transport.md +11 -12
- package/.docs/organized/code-examples/with-chain-of-thought.md +83 -54
- package/.docs/organized/code-examples/with-cloud-standalone.md +14 -11
- package/.docs/organized/code-examples/with-cloud.md +9 -10
- package/.docs/organized/code-examples/with-custom-thread-list.md +61 -16
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +17 -12
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +13 -13
- package/.docs/organized/code-examples/with-expo.md +25 -21
- package/.docs/organized/code-examples/with-external-store.md +8 -8
- package/.docs/organized/code-examples/with-ffmpeg.md +17 -12
- package/.docs/organized/code-examples/with-generative-ui.md +9 -9
- package/.docs/organized/code-examples/with-google-adk.md +8 -8
- package/.docs/organized/code-examples/with-heat-graph.md +5 -5
- package/.docs/organized/code-examples/with-interactables.md +10 -25
- package/.docs/organized/code-examples/with-langchain.md +437 -0
- package/.docs/organized/code-examples/with-langgraph.md +16 -16
- package/.docs/organized/code-examples/with-livekit.md +18 -13
- package/.docs/organized/code-examples/with-opencode.md +105 -62
- package/.docs/organized/code-examples/with-parent-id-grouping.md +10 -10
- package/.docs/organized/code-examples/with-react-hook-form.md +220 -148
- package/.docs/organized/code-examples/with-react-ink.md +2 -2
- package/.docs/organized/code-examples/with-react-router.md +12 -12
- package/.docs/organized/code-examples/with-store.md +8 -5
- package/.docs/organized/code-examples/with-tanstack.md +10 -10
- package/.docs/organized/code-examples/with-tap-runtime.md +10 -6
- package/.docs/raw/docs/(docs)/cli.mdx +2 -1
- package/.docs/raw/docs/(docs)/copilots/assistant-frame.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/make-assistant-tool-ui.mdx +10 -3
- package/.docs/raw/docs/(docs)/copilots/make-assistant-tool.mdx +8 -3
- package/.docs/raw/docs/(docs)/copilots/make-assistant-visible.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/model-context.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/motivation.mdx +1 -0
- package/.docs/raw/docs/(docs)/copilots/use-assistant-instructions.mdx +1 -0
- package/.docs/raw/docs/(docs)/devtools.mdx +1 -0
- package/.docs/raw/docs/(docs)/index.mdx +1 -0
- package/.docs/raw/docs/(docs)/installation.mdx +1 -0
- package/.docs/raw/docs/(docs)/rtl.mdx +80 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +34 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback-speech.mdx +41 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +26 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +34 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +31 -0
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +26 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +72 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +41 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +48 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +30 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +23 -0
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +21 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +7 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +149 -40
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +65 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +2 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +50 -6
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +15 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +36 -1
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +38 -0
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +9 -0
- package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +144 -6
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +231 -3
- package/.docs/raw/docs/cloud/ai-sdk.mdx +221 -3
- package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +41 -36
- package/.docs/raw/docs/guides/branching.mdx +76 -0
- package/.docs/raw/docs/guides/chain-of-thought.mdx +166 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/context-api.mdx +50 -22
- package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +2 -0
- package/.docs/raw/docs/guides/editing.mdx +102 -0
- package/.docs/raw/docs/guides/index.mdx +103 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +49 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +51 -8
- package/.docs/raw/docs/guides/mentions.mdx +520 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +8 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +64 -4
- package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +10 -17
- package/.docs/raw/docs/guides/slash-commands.mdx +361 -0
- package/.docs/raw/docs/guides/speech.mdx +156 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +21 -83
- package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +108 -36
- package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +131 -35
- package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +39 -0
- package/.docs/raw/docs/ink/index.mdx +1 -3
- package/.docs/raw/docs/ink/migration.mdx +1 -3
- package/.docs/raw/docs/ink/primitives.mdx +37 -1
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +520 -0
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +191 -0
- package/.docs/raw/docs/integrations/auth/clerk.mdx +172 -0
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +196 -0
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +79 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +188 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +57 -0
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +201 -0
- package/.docs/raw/docs/integrations/gateways/index.mdx +157 -0
- package/.docs/raw/docs/integrations/index.mdx +173 -0
- package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +156 -0
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +146 -0
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +712 -0
- package/.docs/raw/docs/integrations/tools/mcp.mdx +267 -0
- package/.docs/raw/docs/primitives/action-bar.mdx +1 -0
- package/.docs/raw/docs/primitives/assistant-modal.mdx +1 -0
- package/.docs/raw/docs/primitives/attachment.mdx +1 -0
- package/.docs/raw/docs/primitives/branch-picker.mdx +1 -0
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +90 -85
- package/.docs/raw/docs/primitives/composer.mdx +96 -63
- package/.docs/raw/docs/primitives/error.mdx +1 -0
- package/.docs/raw/docs/primitives/index.mdx +2 -1
- package/.docs/raw/docs/primitives/message.mdx +68 -5
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +1 -0
- package/.docs/raw/docs/primitives/suggestion.mdx +1 -0
- package/.docs/raw/docs/primitives/thread-list.mdx +39 -0
- package/.docs/raw/docs/primitives/thread.mdx +16 -13
- package/.docs/raw/docs/react-native/index.mdx +1 -3
- package/.docs/raw/docs/react-native/migration.mdx +1 -3
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +396 -0
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +60 -0
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +216 -0
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +70 -0
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +243 -0
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +123 -0
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +71 -131
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +69 -63
- package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +365 -101
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +323 -0
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +253 -1236
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +746 -0
- package/.docs/raw/docs/runtimes/custom/overview.mdx +71 -0
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +256 -0
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +717 -0
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +69 -0
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +229 -0
- package/.docs/raw/docs/runtimes/langchain.mdx +533 -0
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +305 -0
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +104 -0
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +84 -0
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +496 -0
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +127 -0
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +113 -0
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +3 -3
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -23
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +1 -1
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +191 -0
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +48 -0
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +119 -0
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +74 -198
- package/.docs/raw/docs/ui/accordion.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
- package/.docs/raw/docs/ui/attachment.mdx +1 -0
- package/.docs/raw/docs/ui/badge.mdx +1 -0
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +200 -0
- package/.docs/raw/docs/ui/context-display.mdx +1 -0
- package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
- package/.docs/raw/docs/ui/directive-text.mdx +114 -0
- package/.docs/raw/docs/ui/file.mdx +1 -0
- package/.docs/raw/docs/ui/image.mdx +1 -0
- package/.docs/raw/docs/ui/markdown.mdx +2 -14
- package/.docs/raw/docs/ui/mermaid.mdx +1 -0
- package/.docs/raw/docs/ui/message-timing.mdx +3 -2
- package/.docs/raw/docs/ui/model-selector.mdx +1 -0
- package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
- package/.docs/raw/docs/ui/quote.mdx +1 -0
- package/.docs/raw/docs/ui/reasoning.mdx +69 -32
- package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
- package/.docs/raw/docs/ui/select.mdx +1 -0
- package/.docs/raw/docs/ui/sources.mdx +1 -0
- package/.docs/raw/docs/ui/streamdown.mdx +1 -0
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +1 -0
- package/.docs/raw/docs/ui/tabs.mdx +1 -0
- package/.docs/raw/docs/ui/thread-list.mdx +17 -0
- package/.docs/raw/docs/ui/thread.mdx +56 -1
- package/.docs/raw/docs/ui/tool-fallback.mdx +1 -0
- package/.docs/raw/docs/ui/tool-group.mdx +39 -11
- package/.docs/raw/docs/ui/voice.mdx +1 -0
- package/.docs/raw/docs/utilities/heat-graph.mdx +1 -0
- package/.docs/raw/docs/utilities/react-o11y.mdx +278 -0
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +1 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/package.json +4 -4
- package/src/tools/tests/path-traversal.test.ts +1 -1
- package/src/utils/logger.ts +1 -1
- package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
- package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
- package/.docs/raw/docs/(docs)/guides/mentions.mdx +0 -406
- package/.docs/raw/docs/(docs)/guides/slash-commands.mdx +0 -275
- package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
- package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
- package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
- package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -268
- package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
- package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
- package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
- package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
- package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -607
- package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
- package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
- package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
- package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
- package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
- 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-
|
|
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-
|
|
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
|
|
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
|
|
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
|