@assistant-ui/mcp-docs-server 0.1.30 → 0.1.32
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 +8 -8
- package/.docs/organized/code-examples/with-a2a.md +10 -10
- package/.docs/organized/code-examples/with-ag-ui.md +12 -12
- package/.docs/organized/code-examples/with-ai-sdk-v6.md +14 -14
- package/.docs/organized/code-examples/with-artifacts.md +14 -14
- package/.docs/organized/code-examples/with-assistant-transport.md +11 -11
- package/.docs/organized/code-examples/with-browser-extension.md +345 -0
- package/.docs/organized/code-examples/with-chain-of-thought.md +129 -63
- package/.docs/organized/code-examples/with-cloud-standalone.md +13 -13
- package/.docs/organized/code-examples/with-cloud.md +13 -13
- package/.docs/organized/code-examples/with-custom-thread-list.md +65 -20
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +18 -17
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +18 -17
- package/.docs/organized/code-examples/with-expo.md +25 -25
- package/.docs/organized/code-examples/with-external-store.md +10 -10
- package/.docs/organized/code-examples/with-ffmpeg.md +14 -14
- package/.docs/organized/code-examples/with-generative-ui.md +211 -14
- package/.docs/organized/code-examples/with-google-adk.md +12 -12
- package/.docs/organized/code-examples/with-heat-graph.md +8 -8
- package/.docs/organized/code-examples/with-image-generation.md +454 -0
- package/.docs/organized/code-examples/with-interactables.md +14 -14
- package/.docs/organized/code-examples/with-langchain.md +12 -12
- package/.docs/organized/code-examples/with-langgraph.md +15 -12
- package/.docs/organized/code-examples/with-livekit.md +19 -18
- package/.docs/organized/code-examples/with-mcp.md +748 -0
- package/.docs/organized/code-examples/with-opencode.md +107 -62
- package/.docs/organized/code-examples/with-parent-id-grouping.md +12 -12
- package/.docs/organized/code-examples/with-react-hook-form.md +14 -14
- package/.docs/organized/code-examples/with-react-ink.md +4 -4
- package/.docs/organized/code-examples/with-react-router.md +16 -16
- package/.docs/organized/code-examples/with-resumable-stream.md +660 -0
- package/.docs/organized/code-examples/with-store.md +8 -8
- package/.docs/organized/code-examples/with-tanstack.md +14 -14
- package/.docs/organized/code-examples/with-tap-runtime.md +11 -10
- package/.docs/raw/docs/(docs)/cli.mdx +3 -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 +3 -2
- package/.docs/raw/docs/(docs)/installation.mdx +2 -1
- package/.docs/raw/docs/(docs)/rtl.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +36 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +34 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +44 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +55 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +37 -8
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +64 -0
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +52 -0
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +36 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +98 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +31 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +33 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +640 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +28 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +94 -0
- package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +464 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +24 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +79 -0
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +52 -0
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +125 -125
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +78 -221
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +127 -242
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +46 -20
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +66 -87
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +50 -58
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +80 -48
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +67 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +323 -461
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +36 -43
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +70 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +63 -245
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +182 -554
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +65 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +35 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +57 -140
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +70 -161
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +84 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +82 -86
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +173 -314
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +9 -21
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +10 -21
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +15 -70
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +43 -0
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +25 -28
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +11 -63
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +20 -0
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +11 -48
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +10 -42
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +18 -30
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +68 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +39 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +79 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +42 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +92 -0
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +48 -0
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +62 -0
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +19 -0
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +131 -0
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +22 -0
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +54 -0
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +36 -0
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +230 -2
- package/.docs/raw/docs/cloud/ai-sdk.mdx +222 -4
- package/.docs/raw/docs/cloud/index.mdx +2 -2
- package/.docs/raw/docs/cloud/langgraph.mdx +274 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/attachments.mdx +45 -40
- 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 +54 -26
- package/.docs/raw/docs/{(docs)/guides → guides}/dictation.mdx +3 -1
- package/.docs/raw/docs/guides/editing.mdx +102 -0
- package/.docs/raw/docs/guides/generative-ui.mdx +142 -0
- package/.docs/raw/docs/guides/image-generation.mdx +74 -0
- package/.docs/raw/docs/guides/index.mdx +103 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/interactables.mdx +51 -2
- package/.docs/raw/docs/{(docs)/guides → guides}/latex.mdx +53 -10
- package/.docs/raw/docs/guides/mcp-apps.mdx +231 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/mentions.mdx +63 -88
- package/.docs/raw/docs/{(docs)/guides → guides}/message-timing.mdx +45 -6
- package/.docs/raw/docs/{(docs)/guides → guides}/multi-agent.mdx +66 -6
- package/.docs/raw/docs/{(docs)/guides → guides}/quoting.mdx +11 -18
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +212 -0
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +152 -0
- package/.docs/raw/docs/guides/resumable-streams.mdx +210 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/slash-commands.mdx +104 -38
- package/.docs/raw/docs/guides/speech.mdx +156 -0
- package/.docs/raw/docs/{(docs)/guides → guides}/suggestions.mdx +91 -69
- package/.docs/raw/docs/{(docs)/guides → guides}/tool-ui.mdx +110 -38
- package/.docs/raw/docs/{(docs)/guides → guides}/tools.mdx +197 -40
- package/.docs/raw/docs/{(docs)/guides → guides}/voice.mdx +41 -2
- package/.docs/raw/docs/ink/adapters.mdx +37 -1
- package/.docs/raw/docs/ink/custom-backend.mdx +59 -8
- package/.docs/raw/docs/ink/index.mdx +11 -14
- package/.docs/raw/docs/ink/migration.mdx +1 -3
- package/.docs/raw/docs/ink/primitives.mdx +386 -9
- 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/cloudflare-agents/overview.mdx +282 -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 +162 -0
- package/.docs/raw/docs/integrations/index.mdx +185 -0
- package/.docs/raw/docs/integrations/observability/helicone.mdx +130 -0
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +163 -0
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +150 -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/integrations/tools/react-mcp.mdx +337 -0
- package/.docs/raw/docs/migrations/v0-14.mdx +297 -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 +55 -1
- package/.docs/raw/docs/primitives/error.mdx +1 -0
- package/.docs/raw/docs/primitives/index.mdx +4 -3
- 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 +10 -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/hooks.mdx +2 -2
- package/.docs/raw/docs/react-native/index.mdx +5 -7
- 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 +154 -0
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +52 -0
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +73 -128
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +70 -64
- package/.docs/raw/docs/runtimes/ai-sdk/v6.mdx +337 -123
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +265 -0
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +125 -0
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +67 -0
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +428 -0
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +703 -0
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +348 -0
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +261 -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 +78 -203
- package/.docs/raw/docs/ui/accordion.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-modal.mdx +1 -0
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +1 -0
- package/.docs/raw/docs/ui/attachment.mdx +1 -0
- package/.docs/raw/docs/ui/badge.mdx +1 -0
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +12 -1
- package/.docs/raw/docs/ui/context-display.mdx +1 -0
- package/.docs/raw/docs/ui/diff-viewer.mdx +1 -0
- package/.docs/raw/docs/ui/directive-text.mdx +1 -0
- package/.docs/raw/docs/ui/file.mdx +1 -0
- package/.docs/raw/docs/ui/image.mdx +1 -0
- package/.docs/raw/docs/ui/markdown.mdx +2 -14
- package/.docs/raw/docs/ui/mcp-config.mdx +102 -0
- 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 +9 -8
- package/.docs/raw/docs/ui/part-grouping.mdx +325 -313
- package/.docs/raw/docs/ui/quote.mdx +1 -0
- package/.docs/raw/docs/ui/reasoning.mdx +66 -33
- package/.docs/raw/docs/ui/scrollbar.mdx +1 -0
- package/.docs/raw/docs/ui/select.mdx +1 -0
- package/.docs/raw/docs/ui/sources.mdx +18 -0
- package/.docs/raw/docs/ui/streamdown.mdx +35 -2
- 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 +19 -2
- package/.docs/raw/docs/ui/thread.mdx +58 -3
- 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/README.md +14 -72
- package/dist/constants.d.ts +12 -9
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +13 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -24
- package/dist/index.js.map +1 -1
- package/dist/prepare-docs/code-examples.d.ts +4 -1
- package/dist/prepare-docs/code-examples.d.ts.map +1 -1
- package/dist/prepare-docs/code-examples.js +109 -121
- package/dist/prepare-docs/code-examples.js.map +1 -1
- package/dist/prepare-docs/copy-raw.d.ts +4 -1
- package/dist/prepare-docs/copy-raw.d.ts.map +1 -1
- package/dist/prepare-docs/copy-raw.js +45 -42
- package/dist/prepare-docs/copy-raw.js.map +1 -1
- package/dist/prepare-docs/prepare.d.ts +1 -2
- package/dist/prepare-docs/prepare.js +17 -17
- package/dist/prepare-docs/prepare.js.map +1 -1
- package/dist/stdio.d.ts +1 -3
- package/dist/stdio.js +6 -3
- package/dist/stdio.js.map +1 -1
- package/dist/tools/docs.d.ts +20 -15
- package/dist/tools/docs.d.ts.map +1 -1
- package/dist/tools/docs.js +140 -161
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/examples.d.ts +20 -15
- package/dist/tools/examples.d.ts.map +1 -1
- package/dist/tools/examples.js +74 -86
- package/dist/tools/examples.js.map +1 -1
- package/dist/tools/tests/test-setup.d.ts +5 -2
- package/dist/tools/tests/test-setup.d.ts.map +1 -1
- package/dist/tools/tests/test-setup.js +21 -28
- package/dist/tools/tests/test-setup.js.map +1 -1
- package/dist/utils/logger.d.ts +8 -5
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +17 -17
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/mcp-format.d.ts +8 -5
- package/dist/utils/mcp-format.d.ts.map +1 -1
- package/dist/utils/mcp-format.js +9 -9
- package/dist/utils/mcp-format.js.map +1 -1
- package/dist/utils/mdx.d.ts +8 -6
- package/dist/utils/mdx.d.ts.map +1 -1
- package/dist/utils/mdx.js +22 -22
- package/dist/utils/mdx.js.map +1 -1
- package/dist/utils/paths.d.ts +9 -6
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +66 -76
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/security.d.ts +4 -1
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/utils/security.js +19 -40
- package/dist/utils/security.js.map +1 -1
- package/package.json +6 -6
- package/src/tools/tests/path-traversal.test.ts +1 -1
- package/.docs/raw/docs/(docs)/guides/branching.mdx +0 -65
- package/.docs/raw/docs/(docs)/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/(docs)/guides/editing.mdx +0 -66
- package/.docs/raw/docs/(docs)/guides/speech.mdx +0 -38
- package/.docs/raw/docs/(reference)/api-reference/context-providers/text-message-part-provider.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -260
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-hook-form.mdx +0 -103
- package/.docs/raw/docs/(reference)/api-reference/integrations/vercel-ai-sdk.mdx +0 -254
- package/.docs/raw/docs/(reference)/migrations/v0-14.mdx +0 -159
- package/.docs/raw/docs/runtimes/a2a/index.mdx +0 -298
- package/.docs/raw/docs/runtimes/assistant-transport.mdx +0 -1033
- package/.docs/raw/docs/runtimes/custom/custom-thread-list.mdx +0 -314
- package/.docs/raw/docs/runtimes/custom/local.mdx +0 -1464
- package/.docs/raw/docs/runtimes/data-stream.mdx +0 -422
- package/.docs/raw/docs/runtimes/google-adk/index.mdx +0 -686
- package/.docs/raw/docs/runtimes/helicone.mdx +0 -61
- package/.docs/raw/docs/runtimes/langchain/comparison.mdx +0 -60
- package/.docs/raw/docs/runtimes/langchain/index.mdx +0 -210
- package/.docs/raw/docs/runtimes/langgraph/index.mdx +0 -699
- package/.docs/raw/docs/runtimes/langgraph/tutorial/index.mdx +0 -12
- package/.docs/raw/docs/runtimes/langserve.mdx +0 -116
- package/.docs/raw/docs/runtimes/mastra/full-stack-integration.mdx +0 -218
- package/.docs/raw/docs/runtimes/mastra/overview.mdx +0 -18
- package/.docs/raw/docs/runtimes/mastra/separate-server-integration.mdx +0 -217
- package/dist/prepare-docs/prepare.d.ts.map +0 -1
- package/dist/stdio.d.ts.map +0 -1
- /package/.docs/raw/docs/{(reference)/migrations → migrations}/deprecation-policy.mdx +0 -0
- /package/.docs/raw/docs/{(reference) → migrations}/react-compatibility.mdx +0 -0
- /package/.docs/raw/docs/{(reference)/migrations → migrations}/react-langgraph-v0-7.mdx +0 -0
- /package/.docs/raw/docs/{(reference)/migrations → migrations}/v0-11.mdx +0 -0
- /package/.docs/raw/docs/{(reference)/migrations → migrations}/v0-12.mdx +0 -0
|
@@ -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
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Attachments
|
|
3
|
-
description: Let users attach
|
|
2
|
+
title: File Attachments
|
|
3
|
+
description: Let users attach images, PDFs, and other files to AI chat messages in React. Drag-drop, paste, and vision-model support, built into assistant-ui.
|
|
4
|
+
platforms: ["react"]
|
|
4
5
|
---
|
|
5
6
|
|
|
6
7
|
import { AttachmentSample } from "@/components/docs/samples/attachment";
|
|
@@ -57,37 +58,7 @@ const runtime = useChatRuntime();
|
|
|
57
58
|
|
|
58
59
|
### Add UI Components
|
|
59
60
|
|
|
60
|
-
Integrate attachment components into your chat interface
|
|
61
|
-
|
|
62
|
-
```tsx title="/components/assistant-ui/thread.tsx"
|
|
63
|
-
// In your Composer component
|
|
64
|
-
import {
|
|
65
|
-
ComposerAttachments,
|
|
66
|
-
ComposerAddAttachment,
|
|
67
|
-
} from "@/components/assistant-ui/attachment";
|
|
68
|
-
|
|
69
|
-
const Composer = () => {
|
|
70
|
-
return (
|
|
71
|
-
<ComposerPrimitive.Root>
|
|
72
|
-
<ComposerAttachments />
|
|
73
|
-
<ComposerAddAttachment />
|
|
74
|
-
<ComposerPrimitive.Input placeholder="Type a message..." />
|
|
75
|
-
</ComposerPrimitive.Root>
|
|
76
|
-
);
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
// In your UserMessage component
|
|
80
|
-
import { UserMessageAttachments } from "@/components/assistant-ui/attachment";
|
|
81
|
-
|
|
82
|
-
const UserMessage = () => {
|
|
83
|
-
return (
|
|
84
|
-
<MessagePrimitive.Root>
|
|
85
|
-
<UserMessageAttachments />
|
|
86
|
-
<MessagePrimitive.Parts />
|
|
87
|
-
</MessagePrimitive.Root>
|
|
88
|
-
);
|
|
89
|
-
};
|
|
90
|
-
```
|
|
61
|
+
Integrate the attachment components into your chat interface. See [Attachment UI components](/docs/ui/attachment) for the full install and usage guide.
|
|
91
62
|
|
|
92
63
|
</Step>
|
|
93
64
|
</Steps>
|
|
@@ -143,11 +114,11 @@ const compositeAdapter = new CompositeAttachmentAdapter([
|
|
|
143
114
|
|
|
144
115
|
## Creating Custom Attachment Adapters
|
|
145
116
|
|
|
146
|
-
Build your own adapters for specialized file handling. Below are complete examples for common use cases.
|
|
117
|
+
Build your own adapters for specialized file handling. Below are complete examples for common use cases. For `PendingAttachment` and `CompleteAttachment` type definitions, see [Attachment types](/docs/ui/attachment#attachment-types).
|
|
147
118
|
|
|
148
119
|
### Vision-Capable Image Adapter
|
|
149
120
|
|
|
150
|
-
Send images to vision-capable LLMs like GPT-
|
|
121
|
+
Send images to vision-capable LLMs like GPT-5.4, Claude Sonnet 4.6, or Gemini Pro Vision:
|
|
151
122
|
|
|
152
123
|
```tsx
|
|
153
124
|
import {
|
|
@@ -305,7 +276,7 @@ const MyModelAdapter: ChatModelAdapter = {
|
|
|
305
276
|
msg.role === "user" &&
|
|
306
277
|
msg.content.some((part) => part.type === "image")
|
|
307
278
|
) {
|
|
308
|
-
// Format for GPT-
|
|
279
|
+
// Format for GPT-5.4 or similar vision models
|
|
309
280
|
return {
|
|
310
281
|
role: "user",
|
|
311
282
|
content: msg.content.map((part) => {
|
|
@@ -364,7 +335,7 @@ Provide real-time upload progress using async generators:
|
|
|
364
335
|
|
|
365
336
|
```tsx
|
|
366
337
|
class UploadAttachmentAdapter implements AttachmentAdapter {
|
|
367
|
-
accept = "
|
|
338
|
+
accept = "*";
|
|
368
339
|
|
|
369
340
|
async *add({ file }: { file: File }) {
|
|
370
341
|
const id = generateId();
|
|
@@ -391,8 +362,8 @@ class UploadAttachmentAdapter implements AttachmentAdapter {
|
|
|
391
362
|
} as PendingAttachment;
|
|
392
363
|
}
|
|
393
364
|
|
|
394
|
-
//
|
|
395
|
-
|
|
365
|
+
// Yield final progress so the 100% state reaches the composer
|
|
366
|
+
yield {
|
|
396
367
|
id,
|
|
397
368
|
type: "file",
|
|
398
369
|
name: file.name,
|
|
@@ -490,6 +461,40 @@ class ValidatedImageAdapter implements AttachmentAdapter {
|
|
|
490
461
|
}
|
|
491
462
|
```
|
|
492
463
|
|
|
464
|
+
To surface failures in the UI, subscribe to `composer.attachmentAddError`. It fires whenever an add operation produces a failure, in either of two ways:
|
|
465
|
+
|
|
466
|
+
1. `addAttachment()` rejects: no adapter is configured, the file type does not match `accept`, or the adapter's `add()` throws.
|
|
467
|
+
2. `addAttachment()` resolves but the adapter returned (or, for async-iterator adapters, yielded) an attachment whose `status.reason === "error"`. The promise resolves successfully, yet the event still fires so the UI can react.
|
|
468
|
+
|
|
469
|
+
The event payload carries a `reason` discriminator and a human-readable `message`, so you can branch UI on the failure mode:
|
|
470
|
+
|
|
471
|
+
| `reason` | When It Fires |
|
|
472
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------ |
|
|
473
|
+
| `no-adapter` | `addAttachment(File)` was called but no `AttachmentAdapter` is configured. |
|
|
474
|
+
| `not-accepted` | The file's content type (or filename extension) did not match `adapter.accept`. External `CreateAttachment` descriptors also trigger this when their `contentType` does not match `adapter.accept`. |
|
|
475
|
+
| `adapter-error` | The adapter's `add()` threw, or returned/yielded an attachment with `status.reason === "error"`. If the adapter produced any attachment before failing, the errored attachment is also visible in `composer.attachments`; if it threw before producing one, the event is the only signal. |
|
|
476
|
+
|
|
477
|
+
```tsx
|
|
478
|
+
import { toast } from "sonner"; // or your toast library of choice
|
|
479
|
+
import { useAuiEvent } from "@assistant-ui/react";
|
|
480
|
+
|
|
481
|
+
function AttachmentErrorToast() {
|
|
482
|
+
useAuiEvent("composer.attachmentAddError", ({ reason, message, error }) => {
|
|
483
|
+
if (reason === "not-accepted") {
|
|
484
|
+
toast.error("This file type is not supported.");
|
|
485
|
+
} else if (reason === "no-adapter") {
|
|
486
|
+
toast.error("Attachments are not configured for this composer.");
|
|
487
|
+
} else {
|
|
488
|
+
if (error) console.error(error); // underlying Error, useful for logging
|
|
489
|
+
toast.error(message || "Attachment failed to upload.");
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
return null;
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
`attachmentId` is included when the failure is associated with an attachment that was registered (typically `adapter-error` cases). It is `undefined` for `no-adapter` and `not-accepted` failures because those reject before any attachment is registered.
|
|
497
|
+
|
|
493
498
|
### External Source Attachments
|
|
494
499
|
|
|
495
500
|
Add attachments from external sources (URLs, API data, CMS references) without needing a `File` object or an `AttachmentAdapter`:
|
|
@@ -513,7 +518,7 @@ await aui.composer().addAttachment({
|
|
|
513
518
|
});
|
|
514
519
|
```
|
|
515
520
|
|
|
516
|
-
External attachments are added as complete attachments directly
|
|
521
|
+
External attachments are added as complete attachments directly. They bypass the `AttachmentAdapter`'s `add()` step (no upload), but `adapter.accept` is still enforced when an `AttachmentAdapter` is configured: a `CreateAttachment` whose `contentType` does not match `adapter.accept` is rejected and emits `composer.attachmentAddError`. If `contentType` is omitted, the descriptor's filename extension is matched against `adapter.accept` only when `accept` itself contains explicit extension entries (e.g. `.png,.pdf`); MIME-wildcard `accept` strings such as `image/*` always require a matching `contentType`. When no `AttachmentAdapter` is configured, external attachments are added without any content-type check, and they can be removed without an adapter.
|
|
517
522
|
|
|
518
523
|
### Multiple File Selection
|
|
519
524
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Message Branching
|
|
3
|
+
description: Edit messages or regenerate AI responses, then switch between alternative replies. Branching navigation built into assistant-ui's React chat UI.
|
|
4
|
+
platforms: ["react"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
import { BranchingSample } from "@/components/docs/samples/branching";
|
|
8
|
+
|
|
9
|
+
Branching lets users navigate between alternative versions of a message. A new branch is created when:
|
|
10
|
+
|
|
11
|
+
- A user message is edited
|
|
12
|
+
- An assistant message is reloaded (reload creates a new branch on the same message)
|
|
13
|
+
|
|
14
|
+
Branches are automatically tracked by assistant-ui by observing changes to the `messages` array.
|
|
15
|
+
|
|
16
|
+
## Shortest Working Pattern
|
|
17
|
+
|
|
18
|
+
<BranchingSample />
|
|
19
|
+
|
|
20
|
+
Place a branch picker inside your message component:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import { BranchPickerPrimitive } from "@assistant-ui/react";
|
|
24
|
+
|
|
25
|
+
const BranchPicker = () => (
|
|
26
|
+
<BranchPickerPrimitive.Root hideWhenSingleBranch>
|
|
27
|
+
<BranchPickerPrimitive.Previous />
|
|
28
|
+
<BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />
|
|
29
|
+
<BranchPickerPrimitive.Next />
|
|
30
|
+
</BranchPickerPrimitive.Root>
|
|
31
|
+
);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`BranchPickerPrimitive.Previous` and `.Next` automatically disable at branch boundaries and while a run is in flight (unless the runtime supports `switchBranchDuringRun`). For the full primitive API, see [BranchPickerPrimitive](/docs/primitives/branch-picker).
|
|
35
|
+
|
|
36
|
+
## Triggering Reload
|
|
37
|
+
|
|
38
|
+
`ActionBarPrimitive.Reload` creates a new branch on an assistant message and re-runs from there:
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { ActionBarPrimitive, MessagePrimitive } from "@assistant-ui/react";
|
|
42
|
+
|
|
43
|
+
const AssistantMessage = () => (
|
|
44
|
+
<MessagePrimitive.Root>
|
|
45
|
+
<MessagePrimitive.Parts />
|
|
46
|
+
<ActionBarPrimitive.Root>
|
|
47
|
+
<ActionBarPrimitive.Reload />
|
|
48
|
+
</ActionBarPrimitive.Root>
|
|
49
|
+
</MessagePrimitive.Root>
|
|
50
|
+
);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`Reload` is disabled while `thread.isRunning` or `thread.isDisabled` is true. See [ActionBarPrimitive](/docs/primitives/action-bar) for the full reference.
|
|
54
|
+
|
|
55
|
+
## Programmatic Branch Navigation
|
|
56
|
+
|
|
57
|
+
For headless or keyboard-shortcut flows, navigate directly to a branch by id via `aui.message().switchToBranch`:
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import { useAui } from "@assistant-ui/react";
|
|
61
|
+
|
|
62
|
+
const SwitchToBranch = ({ branchId }: { branchId: string }) => {
|
|
63
|
+
const aui = useAui();
|
|
64
|
+
return (
|
|
65
|
+
<button onClick={() => aui.message().switchToBranch({ branchId })}>
|
|
66
|
+
Go to branch
|
|
67
|
+
</button>
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
This must be called inside a message context (e.g. nested within `MessagePrimitive.Root`).
|
|
73
|
+
|
|
74
|
+
## Grouped Parts After Branching
|
|
75
|
+
|
|
76
|
+
Each branch is a distinct message version with its own content parts. `MessagePrimitive.GroupedParts` provides hierarchical adjacent grouping of those parts, useful when a message mixes tool calls and text across branches. See the [MessagePrimitive](/docs/primitives/message) reference for `GroupedParts` usage.
|