@assistant-ui/mcp-docs-server 0.2.3 → 0.3.0
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/README.md +16 -43
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -91
- package/dist/index.js.map +1 -1
- package/dist/proxy.d.ts +9 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +76 -0
- package/dist/proxy.js.map +1 -0
- package/package.json +8 -12
- package/src/index.ts +3 -115
- package/src/proxy.test.ts +250 -0
- package/src/proxy.ts +111 -0
- package/.docs/organized/code-examples/waterfall.md +0 -807
- package/.docs/organized/code-examples/with-a2a.md +0 -675
- package/.docs/organized/code-examples/with-ag-ui.md +0 -553
- package/.docs/organized/code-examples/with-ai-sdk-v7.md +0 -466
- package/.docs/organized/code-examples/with-artifacts.md +0 -815
- package/.docs/organized/code-examples/with-assistant-transport.md +0 -576
- package/.docs/organized/code-examples/with-browser-extension.md +0 -371
- package/.docs/organized/code-examples/with-chain-of-thought.md +0 -962
- package/.docs/organized/code-examples/with-cloud-standalone.md +0 -681
- package/.docs/organized/code-examples/with-cloud.md +0 -439
- package/.docs/organized/code-examples/with-custom-thread-list.md +0 -569
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +0 -527
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +0 -697
- package/.docs/organized/code-examples/with-eve.md +0 -405
- package/.docs/organized/code-examples/with-expo.md +0 -2246
- package/.docs/organized/code-examples/with-external-store.md +0 -421
- package/.docs/organized/code-examples/with-ffmpeg.md +0 -829
- package/.docs/organized/code-examples/with-generative-ui.md +0 -1810
- package/.docs/organized/code-examples/with-google-adk.md +0 -368
- package/.docs/organized/code-examples/with-heat-graph.md +0 -304
- package/.docs/organized/code-examples/with-image-generation.md +0 -463
- package/.docs/organized/code-examples/with-interactables.md +0 -733
- package/.docs/organized/code-examples/with-langchain.md +0 -446
- package/.docs/organized/code-examples/with-langgraph.md +0 -855
- package/.docs/organized/code-examples/with-livekit.md +0 -643
- package/.docs/organized/code-examples/with-mcp.md +0 -782
- package/.docs/organized/code-examples/with-nuxt.md +0 -2428
- package/.docs/organized/code-examples/with-opencode.md +0 -1974
- package/.docs/organized/code-examples/with-openui.md +0 -450
- package/.docs/organized/code-examples/with-pi.md +0 -2084
- package/.docs/organized/code-examples/with-react-hook-form.md +0 -727
- package/.docs/organized/code-examples/with-react-ink-web.md +0 -740
- package/.docs/organized/code-examples/with-react-ink.md +0 -473
- package/.docs/organized/code-examples/with-react-router.md +0 -936
- package/.docs/organized/code-examples/with-resumable-stream.md +0 -668
- package/.docs/organized/code-examples/with-store.md +0 -679
- package/.docs/organized/code-examples/with-svelte.md +0 -415
- package/.docs/organized/code-examples/with-sveltekit.md +0 -1061
- package/.docs/organized/code-examples/with-tanstack.md +0 -812
- package/.docs/organized/code-examples/with-tap-runtime.md +0 -813
- package/.docs/organized/code-examples/with-virtualized-thread.md +0 -681
- package/.docs/organized/code-examples/with-vue.md +0 -408
- package/.docs/raw/docs/(getting-started)/architecture.mdx +0 -146
- package/.docs/raw/docs/(getting-started)/base-ui.mdx +0 -39
- package/.docs/raw/docs/(getting-started)/cli.mdx +0 -542
- package/.docs/raw/docs/(getting-started)/devtools.mdx +0 -79
- package/.docs/raw/docs/(getting-started)/index.mdx +0 -23
- package/.docs/raw/docs/(getting-started)/installation.mdx +0 -483
- package/.docs/raw/docs/(getting-started)/llm.mdx +0 -211
- package/.docs/raw/docs/(getting-started)/rtl.mdx +0 -78
- package/.docs/raw/docs/(reference)/api-reference/adapters/attachments.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/adapters/feedback.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/index.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/adapters/model.mdx +0 -44
- package/.docs/raw/docs/(reference)/api-reference/adapters/persistence.mdx +0 -59
- package/.docs/raw/docs/(reference)/api-reference/adapters/runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/adapters/suggestions.mdx +0 -26
- package/.docs/raw/docs/(reference)/api-reference/context-providers/assistant-runtime-provider.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/context-providers/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/context-providers/scoped-providers.mdx +0 -64
- package/.docs/raw/docs/(reference)/api-reference/external-store/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/external-store/message-conversion.mdx +0 -57
- package/.docs/raw/docs/(reference)/api-reference/external-store/runtime.mdx +0 -49
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/a2ui.mdx +0 -40
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +0 -56
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +0 -86
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +0 -39
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +0 -42
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +0 -84
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/spec.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +0 -93
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/hooks/composer-triggers.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/hooks/index.mdx +0 -31
- package/.docs/raw/docs/(reference)/api-reference/hooks/model-context.mdx +0 -34
- package/.docs/raw/docs/(reference)/api-reference/hooks/primitives.mdx +0 -350
- package/.docs/raw/docs/(reference)/api-reference/hooks/runtimes.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/hooks/state.mdx +0 -97
- package/.docs/raw/docs/(reference)/api-reference/integrations/ai-sdk.mdx +0 -200
- package/.docs/raw/docs/(reference)/api-reference/integrations/cloud-ai-sdk.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/integrations/eve.mdx +0 -118
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +0 -28
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +0 -37
- package/.docs/raw/docs/(reference)/api-reference/model-context/context.mdx +0 -50
- package/.docs/raw/docs/(reference)/api-reference/model-context/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/model-context/registry.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +0 -566
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar-more.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/primitives/action-bar.mdx +0 -239
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +0 -208
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-modal.mdx +0 -108
- package/.docs/raw/docs/(reference)/api-reference/primitives/attachment.mdx +0 -99
- package/.docs/raw/docs/(reference)/api-reference/primitives/branch-picker.mdx +0 -145
- package/.docs/raw/docs/(reference)/api-reference/primitives/chain-of-thought.mdx +0 -82
- package/.docs/raw/docs/(reference)/api-reference/primitives/composer.mdx +0 -637
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/primitives/error.mdx +0 -65
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +0 -73
- package/.docs/raw/docs/(reference)/api-reference/primitives/message-part.mdx +0 -117
- package/.docs/raw/docs/(reference)/api-reference/primitives/message.mdx +0 -339
- package/.docs/raw/docs/(reference)/api-reference/primitives/queue-item.mdx +0 -77
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +0 -88
- package/.docs/raw/docs/(reference)/api-reference/primitives/suggestion.mdx +0 -81
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item-more.mdx +0 -129
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list-item.mdx +0 -138
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread-list.mdx +0 -122
- package/.docs/raw/docs/(reference)/api-reference/primitives/thread.mdx +0 -289
- package/.docs/raw/docs/(reference)/api-reference/runtimes/assistant-runtime.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/attachment-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/composer-runtime.mdx +0 -32
- package/.docs/raw/docs/(reference)/api-reference/runtimes/index.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-part-runtime.mdx +0 -43
- package/.docs/raw/docs/(reference)/api-reference/runtimes/message-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/queue-state.mdx +0 -20
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-item-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-list-runtime.mdx +0 -24
- package/.docs/raw/docs/(reference)/api-reference/runtimes/thread-runtime.mdx +0 -36
- package/.docs/raw/docs/(reference)/api-reference/tools/component-tools.mdx +0 -85
- package/.docs/raw/docs/(reference)/api-reference/tools/index.mdx +0 -45
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables-legacy.mdx +0 -55
- package/.docs/raw/docs/(reference)/api-reference/tools/interactables.mdx +0 -151
- package/.docs/raw/docs/(reference)/api-reference/tools/rendering.mdx +0 -106
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +0 -178
- package/.docs/raw/docs/(reference)/api-reference/transport/assistant-transport.mdx +0 -48
- package/.docs/raw/docs/(reference)/api-reference/transport/frame.mdx +0 -62
- package/.docs/raw/docs/(reference)/api-reference/transport/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/utilities/index.mdx +0 -19
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +0 -152
- package/.docs/raw/docs/(reference)/api-reference/voice/index.mdx +0 -22
- package/.docs/raw/docs/(reference)/api-reference/voice/session.mdx +0 -54
- package/.docs/raw/docs/(reference)/api-reference/voice/speech-dictation.mdx +0 -36
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +0 -527
- package/.docs/raw/docs/cloud/ai-sdk.mdx +0 -604
- package/.docs/raw/docs/cloud/authorization.mdx +0 -252
- package/.docs/raw/docs/cloud/index.mdx +0 -46
- package/.docs/raw/docs/cloud/langgraph.mdx +0 -554
- package/.docs/raw/docs/copilots/assistant-frame.mdx +0 -411
- package/.docs/raw/docs/copilots/make-assistant-visible.mdx +0 -82
- package/.docs/raw/docs/copilots/model-context.mdx +0 -156
- package/.docs/raw/docs/copilots/motivation.mdx +0 -202
- package/.docs/raw/docs/copilots/use-assistant-instructions.mdx +0 -64
- package/.docs/raw/docs/guides/attachments.mdx +0 -619
- package/.docs/raw/docs/guides/branching.mdx +0 -76
- package/.docs/raw/docs/guides/chain-of-thought.mdx +0 -164
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +0 -108
- package/.docs/raw/docs/guides/context-api.mdx +0 -619
- package/.docs/raw/docs/guides/dictation.mdx +0 -298
- package/.docs/raw/docs/guides/editing.mdx +0 -102
- package/.docs/raw/docs/guides/electron.mdx +0 -369
- package/.docs/raw/docs/guides/headless-composer-input.mdx +0 -113
- package/.docs/raw/docs/guides/image-generation.mdx +0 -74
- package/.docs/raw/docs/guides/index.mdx +0 -117
- package/.docs/raw/docs/guides/input-history.mdx +0 -55
- package/.docs/raw/docs/guides/latex.mdx +0 -158
- package/.docs/raw/docs/guides/mentions.mdx +0 -575
- package/.docs/raw/docs/guides/message-timing.mdx +0 -215
- package/.docs/raw/docs/guides/quoting.mdx +0 -169
- package/.docs/raw/docs/guides/resumable-stream-deployment.mdx +0 -212
- package/.docs/raw/docs/guides/resumable-stream-stores.mdx +0 -152
- package/.docs/raw/docs/guides/resumable-streams.mdx +0 -292
- package/.docs/raw/docs/guides/slash-commands.mdx +0 -358
- package/.docs/raw/docs/guides/speech.mdx +0 -172
- package/.docs/raw/docs/guides/suggestions.mdx +0 -384
- package/.docs/raw/docs/guides/virtualization.mdx +0 -133
- package/.docs/raw/docs/guides/voice.mdx +0 -310
- package/.docs/raw/docs/ink/adapters.mdx +0 -99
- package/.docs/raw/docs/ink/custom-backend.mdx +0 -254
- package/.docs/raw/docs/ink/hooks.mdx +0 -469
- package/.docs/raw/docs/ink/index.mdx +0 -237
- package/.docs/raw/docs/ink/migration.mdx +0 -138
- package/.docs/raw/docs/ink/primitives.mdx +0 -1259
- package/.docs/raw/docs/integrations/attachments/custom-adapter.mdx +0 -528
- package/.docs/raw/docs/integrations/auth/better-auth.mdx +0 -188
- package/.docs/raw/docs/integrations/auth/clerk.mdx +0 -166
- package/.docs/raw/docs/integrations/auth/next-auth.mdx +0 -191
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +0 -88
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents.mdx +0 -283
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +0 -188
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +0 -57
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +0 -201
- package/.docs/raw/docs/integrations/gateways/index.mdx +0 -162
- package/.docs/raw/docs/integrations/index.mdx +0 -178
- package/.docs/raw/docs/integrations/observability/helicone.mdx +0 -129
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +0 -161
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +0 -151
- package/.docs/raw/docs/integrations/persistence/custom-adapter.mdx +0 -773
- package/.docs/raw/docs/migrations/deprecation-policy.mdx +0 -42
- package/.docs/raw/docs/migrations/index.mdx +0 -50
- package/.docs/raw/docs/migrations/react-compatibility.mdx +0 -74
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +0 -328
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +0 -236
- package/.docs/raw/docs/migrations/v0-11.mdx +0 -172
- package/.docs/raw/docs/migrations/v0-12.mdx +0 -302
- package/.docs/raw/docs/migrations/v0-14.mdx +0 -297
- package/.docs/raw/docs/migrations/v0-15.mdx +0 -270
- package/.docs/raw/docs/primitives/action-bar.mdx +0 -352
- package/.docs/raw/docs/primitives/assistant-modal.mdx +0 -216
- package/.docs/raw/docs/primitives/attachment.mdx +0 -217
- package/.docs/raw/docs/primitives/branch-picker.mdx +0 -222
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +0 -315
- package/.docs/raw/docs/primitives/composer.mdx +0 -659
- package/.docs/raw/docs/primitives/error.mdx +0 -142
- package/.docs/raw/docs/primitives/index.mdx +0 -99
- package/.docs/raw/docs/primitives/message.mdx +0 -618
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +0 -191
- package/.docs/raw/docs/primitives/suggestion.mdx +0 -254
- package/.docs/raw/docs/primitives/thread-list.mdx +0 -467
- package/.docs/raw/docs/primitives/thread.mdx +0 -509
- package/.docs/raw/docs/react-native/adapters.mdx +0 -94
- package/.docs/raw/docs/react-native/custom-backend.mdx +0 -207
- package/.docs/raw/docs/react-native/hooks.mdx +0 -339
- package/.docs/raw/docs/react-native/index.mdx +0 -289
- package/.docs/raw/docs/react-native/migration.mdx +0 -142
- package/.docs/raw/docs/react-native/primitives.mdx +0 -976
- package/.docs/raw/docs/runtimes/a2a/client-and-hooks.mdx +0 -399
- package/.docs/raw/docs/runtimes/a2a/overview.mdx +0 -60
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +0 -216
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +0 -124
- package/.docs/raw/docs/runtimes/ag-ui/overview.mdx +0 -70
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +0 -243
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +0 -267
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +0 -61
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +0 -122
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +0 -135
- package/.docs/raw/docs/runtimes/ai-sdk/v6-legacy.mdx +0 -636
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +0 -731
- package/.docs/raw/docs/runtimes/claude-managed-agents.mdx +0 -118
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +0 -265
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +0 -167
- package/.docs/raw/docs/runtimes/concepts/stability.mdx +0 -68
- package/.docs/raw/docs/runtimes/concepts/threads.mdx +0 -513
- package/.docs/raw/docs/runtimes/custom/assistant-transport.mdx +0 -763
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +0 -339
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +0 -957
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +0 -902
- package/.docs/raw/docs/runtimes/custom/overview.mdx +0 -71
- package/.docs/raw/docs/runtimes/eve/overview.mdx +0 -151
- package/.docs/raw/docs/runtimes/eve/quickstart.mdx +0 -192
- package/.docs/raw/docs/runtimes/google-adk/api.mdx +0 -256
- package/.docs/raw/docs/runtimes/google-adk/hooks.mdx +0 -784
- package/.docs/raw/docs/runtimes/google-adk/overview.mdx +0 -69
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +0 -229
- package/.docs/raw/docs/runtimes/langchain.mdx +0 -901
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +0 -181
- package/.docs/raw/docs/runtimes/langgraph/generative-ui.mdx +0 -305
- package/.docs/raw/docs/runtimes/langgraph/interrupts.mdx +0 -104
- package/.docs/raw/docs/runtimes/langgraph/overview.mdx +0 -84
- package/.docs/raw/docs/runtimes/langgraph/quickstart.mdx +0 -496
- package/.docs/raw/docs/runtimes/langgraph/streaming.mdx +0 -144
- package/.docs/raw/docs/runtimes/langgraph/threads.mdx +0 -113
- package/.docs/raw/docs/runtimes/langgraph/tutorial/introduction.mdx +0 -29
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-1.mdx +0 -93
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-2.mdx +0 -347
- package/.docs/raw/docs/runtimes/langgraph/tutorial/part-3.mdx +0 -393
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +0 -194
- package/.docs/raw/docs/runtimes/opencode/overview.mdx +0 -58
- package/.docs/raw/docs/runtimes/opencode/quickstart.mdx +0 -119
- package/.docs/raw/docs/runtimes/pick-a-runtime.mdx +0 -133
- package/.docs/raw/docs/tools/a2ui.mdx +0 -107
- package/.docs/raw/docs/tools/backend.mdx +0 -147
- package/.docs/raw/docs/tools/defining-tools.mdx +0 -574
- package/.docs/raw/docs/tools/dynamic-tools.mdx +0 -112
- package/.docs/raw/docs/tools/generative-ui-primitive.mdx +0 -180
- package/.docs/raw/docs/tools/generative-ui-slack.mdx +0 -167
- package/.docs/raw/docs/tools/generative-ui-teams.mdx +0 -160
- package/.docs/raw/docs/tools/generative-ui.mdx +0 -322
- package/.docs/raw/docs/tools/index.mdx +0 -72
- package/.docs/raw/docs/tools/interactables.mdx +0 -1084
- package/.docs/raw/docs/tools/mcp-apps.mdx +0 -363
- package/.docs/raw/docs/tools/mcp.mdx +0 -466
- package/.docs/raw/docs/tools/multi-agent.mdx +0 -237
- package/.docs/raw/docs/tools/openui.mdx +0 -175
- package/.docs/raw/docs/tools/tool-ui.mdx +0 -1020
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +0 -428
- package/.docs/raw/docs/ui/assistant-modal.mdx +0 -166
- package/.docs/raw/docs/ui/assistant-sidebar.mdx +0 -89
- package/.docs/raw/docs/ui/attachment.mdx +0 -279
- package/.docs/raw/docs/ui/composer-trigger-popover.mdx +0 -247
- package/.docs/raw/docs/ui/context-display.mdx +0 -148
- package/.docs/raw/docs/ui/directive-text.mdx +0 -114
- package/.docs/raw/docs/ui/file.mdx +0 -159
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +0 -82
- package/.docs/raw/docs/ui/image.mdx +0 -102
- package/.docs/raw/docs/ui/markdown.mdx +0 -103
- package/.docs/raw/docs/ui/mcp-config.mdx +0 -107
- package/.docs/raw/docs/ui/mermaid.mdx +0 -92
- package/.docs/raw/docs/ui/message-timing.mdx +0 -93
- package/.docs/raw/docs/ui/model-selector.mdx +0 -455
- package/.docs/raw/docs/ui/part-grouping.mdx +0 -614
- package/.docs/raw/docs/ui/quote.mdx +0 -211
- package/.docs/raw/docs/ui/reasoning.mdx +0 -214
- package/.docs/raw/docs/ui/scrollbar.mdx +0 -77
- package/.docs/raw/docs/ui/sources.mdx +0 -186
- package/.docs/raw/docs/ui/streamdown.mdx +0 -392
- package/.docs/raw/docs/ui/syntax-highlighting.mdx +0 -205
- package/.docs/raw/docs/ui/thread-list.mdx +0 -411
- package/.docs/raw/docs/ui/thread.mdx +0 -559
- package/.docs/raw/docs/ui/tool-fallback.mdx +0 -141
- package/.docs/raw/docs/ui/tool-group.mdx +0 -240
- package/.docs/raw/docs/ui/voice.mdx +0 -173
- package/.docs/raw/docs/utilities/heat-graph.mdx +0 -237
- package/.docs/raw/docs/utilities/react-o11y.mdx +0 -362
- package/.docs/raw/docs/utilities/tw-shimmer.mdx +0 -212
- package/dist/constants.d.ts +0 -14
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -19
- package/dist/constants.js.map +0 -1
- package/dist/prepare-docs/code-examples.d.ts +0 -5
- package/dist/prepare-docs/code-examples.d.ts.map +0 -1
- package/dist/prepare-docs/code-examples.js +0 -117
- package/dist/prepare-docs/code-examples.js.map +0 -1
- package/dist/prepare-docs/copy-raw.d.ts +0 -5
- package/dist/prepare-docs/copy-raw.d.ts.map +0 -1
- package/dist/prepare-docs/copy-raw.js +0 -49
- package/dist/prepare-docs/copy-raw.js.map +0 -1
- package/dist/prepare-docs/prepare.d.ts +0 -1
- package/dist/prepare-docs/prepare.js +0 -22
- package/dist/prepare-docs/prepare.js.map +0 -1
- package/dist/prompts/xulux-playground.d.ts +0 -12
- package/dist/prompts/xulux-playground.d.ts.map +0 -1
- package/dist/prompts/xulux-playground.js +0 -33
- package/dist/prompts/xulux-playground.js.map +0 -1
- package/dist/tools/docs.d.ts +0 -22
- package/dist/tools/docs.d.ts.map +0 -1
- package/dist/tools/docs.js +0 -177
- package/dist/tools/docs.js.map +0 -1
- package/dist/tools/examples.d.ts +0 -24
- package/dist/tools/examples.d.ts.map +0 -1
- package/dist/tools/examples.js +0 -87
- package/dist/tools/examples.js.map +0 -1
- package/dist/tools/resources.d.ts +0 -6
- package/dist/tools/resources.d.ts.map +0 -1
- package/dist/tools/resources.js +0 -75
- package/dist/tools/resources.js.map +0 -1
- package/dist/tools/search.d.ts +0 -24
- package/dist/tools/search.d.ts.map +0 -1
- package/dist/tools/search.js +0 -39
- package/dist/tools/search.js.map +0 -1
- package/dist/tools/tests/mcp-test-client.d.ts +0 -15
- package/dist/tools/tests/mcp-test-client.d.ts.map +0 -1
- package/dist/tools/tests/mcp-test-client.js +0 -68
- package/dist/tools/tests/mcp-test-client.js.map +0 -1
- package/dist/tools/tests/test-setup.d.ts +0 -7
- package/dist/tools/tests/test-setup.d.ts.map +0 -1
- package/dist/tools/tests/test-setup.js +0 -36
- package/dist/tools/tests/test-setup.js.map +0 -1
- package/dist/tools/xulux-templates.d.ts +0 -58
- package/dist/tools/xulux-templates.d.ts.map +0 -1
- package/dist/tools/xulux-templates.js +0 -84
- package/dist/tools/xulux-templates.js.map +0 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +0 -1
- package/dist/utils/cache.js +0 -18
- package/dist/utils/cache.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -10
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -20
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/mcp-format.d.ts +0 -11
- package/dist/utils/mcp-format.d.ts.map +0 -1
- package/dist/utils/mcp-format.js +0 -14
- package/dist/utils/mcp-format.js.map +0 -1
- package/dist/utils/mdx.d.ts +0 -12
- package/dist/utils/mdx.d.ts.map +0 -1
- package/dist/utils/mdx.js +0 -45
- package/dist/utils/mdx.js.map +0 -1
- package/dist/utils/paths.d.ts +0 -12
- package/dist/utils/paths.d.ts.map +0 -1
- package/dist/utils/paths.js +0 -93
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/search.d.ts +0 -10
- package/dist/utils/search.d.ts.map +0 -1
- package/dist/utils/search.js +0 -97
- package/dist/utils/search.js.map +0 -1
- package/dist/utils/security.d.ts +0 -5
- package/dist/utils/security.d.ts.map +0 -1
- package/dist/utils/security.js +0 -22
- package/dist/utils/security.js.map +0 -1
- package/dist/xulux/catalog-client.d.ts +0 -14
- package/dist/xulux/catalog-client.d.ts.map +0 -1
- package/dist/xulux/catalog-client.js +0 -112
- package/dist/xulux/catalog-client.js.map +0 -1
- package/dist/xulux/fallback-catalog.d.ts +0 -7
- package/dist/xulux/fallback-catalog.d.ts.map +0 -1
- package/dist/xulux/fallback-catalog.js +0 -47
- package/dist/xulux/fallback-catalog.js.map +0 -1
- package/dist/xulux/fetch-sandbox.d.ts +0 -5
- package/dist/xulux/fetch-sandbox.d.ts.map +0 -1
- package/dist/xulux/fetch-sandbox.js +0 -40
- package/dist/xulux/fetch-sandbox.js.map +0 -1
- package/dist/xulux/template-service.d.ts +0 -84
- package/dist/xulux/template-service.d.ts.map +0 -1
- package/dist/xulux/template-service.js +0 -223
- package/dist/xulux/template-service.js.map +0 -1
- package/dist/xulux/types.d.ts +0 -55
- package/dist/xulux/types.d.ts.map +0 -1
- package/dist/xulux/types.js +0 -6
- package/dist/xulux/types.js.map +0 -1
- package/src/constants.ts +0 -24
- package/src/prepare-docs/code-examples.ts +0 -158
- package/src/prepare-docs/copy-raw.ts +0 -50
- package/src/prepare-docs/prepare.ts +0 -24
- package/src/prompts/xulux-playground.ts +0 -36
- package/src/tools/docs.ts +0 -255
- package/src/tools/examples.ts +0 -114
- package/src/tools/resources.ts +0 -111
- package/src/tools/search.ts +0 -46
- package/src/tools/tests/completions.test.ts +0 -60
- package/src/tools/tests/directory-size-cap.test.ts +0 -50
- package/src/tools/tests/docs.test.ts +0 -147
- package/src/tools/tests/examples.test.ts +0 -94
- package/src/tools/tests/integration.test.ts +0 -45
- package/src/tools/tests/json-parsing.test.ts +0 -23
- package/src/tools/tests/listings-cache.test.ts +0 -19
- package/src/tools/tests/mcp-protocol.test.ts +0 -216
- package/src/tools/tests/mcp-test-client.ts +0 -111
- package/src/tools/tests/path-traversal.test.ts +0 -84
- package/src/tools/tests/resources.test.ts +0 -133
- package/src/tools/tests/search.test.ts +0 -37
- package/src/tools/tests/test-setup.ts +0 -50
- package/src/tools/tests/xulux-templates.test.ts +0 -325
- package/src/tools/xulux-templates.ts +0 -141
- package/src/utils/cache.ts +0 -20
- package/src/utils/logger.ts +0 -20
- package/src/utils/mcp-format.ts +0 -14
- package/src/utils/mdx.ts +0 -59
- package/src/utils/paths.ts +0 -139
- package/src/utils/search.ts +0 -131
- package/src/utils/security.ts +0 -52
- package/src/utils/tests/cache.test.ts +0 -51
- package/src/utils/tests/mcp-format.test.ts +0 -22
- package/src/utils/tests/security.test.ts +0 -119
- package/src/xulux/catalog-client.ts +0 -150
- package/src/xulux/fallback-catalog.ts +0 -63
- package/src/xulux/fetch-sandbox.ts +0 -56
- package/src/xulux/template-service.ts +0 -406
- package/src/xulux/types.ts +0 -64
|
@@ -1,618 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Message
|
|
3
|
-
description: Build custom message rendering with content parts, attachments, and hover state.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
import { MessagePrimitiveSample } from "@/components/pages/docs/samples/message-primitive";
|
|
8
|
-
import { MessagePrimitive as MessagePrimitiveDocs } from "@/generated/primitiveDocs";
|
|
9
|
-
|
|
10
|
-
The Message primitive handles individual message rendering: content parts, attachments, quotes, hover state, and error display. It's the building block inside each message bubble, resolving text, images, tool calls, and more through a parts pipeline.
|
|
11
|
-
|
|
12
|
-
<Tabs items={["Preview", "Code"]}>
|
|
13
|
-
<Tab>
|
|
14
|
-
<MessagePrimitiveSample />
|
|
15
|
-
</Tab>
|
|
16
|
-
<Tab>
|
|
17
|
-
```tsx
|
|
18
|
-
import {
|
|
19
|
-
MessagePrimitive,
|
|
20
|
-
MessagePartPrimitive,
|
|
21
|
-
} from "@assistant-ui/react";
|
|
22
|
-
|
|
23
|
-
function UserMessage() {
|
|
24
|
-
return (
|
|
25
|
-
<MessagePrimitive.Root className="flex justify-end">
|
|
26
|
-
<div className="max-w-[80%] rounded-2xl bg-primary px-4 py-2.5 text-sm text-primary-foreground">
|
|
27
|
-
<MessagePrimitive.Parts>
|
|
28
|
-
{({ part }) => {
|
|
29
|
-
if (part.type === "text") return <UserText />;
|
|
30
|
-
return null;
|
|
31
|
-
}}
|
|
32
|
-
</MessagePrimitive.Parts>
|
|
33
|
-
</div>
|
|
34
|
-
</MessagePrimitive.Root>
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function AssistantMessage() {
|
|
39
|
-
return (
|
|
40
|
-
<MessagePrimitive.Root className="flex justify-start gap-3">
|
|
41
|
-
<div className="flex size-8 items-center justify-center rounded-full bg-primary/10 text-xs font-medium text-primary">
|
|
42
|
-
AI
|
|
43
|
-
</div>
|
|
44
|
-
<div className="max-w-[80%] rounded-2xl bg-muted px-4 py-2.5 text-sm">
|
|
45
|
-
<MessagePrimitive.Parts>
|
|
46
|
-
{({ part }) => {
|
|
47
|
-
if (part.type === "text") return <AssistantText />;
|
|
48
|
-
return part.toolUI ?? null;
|
|
49
|
-
}}
|
|
50
|
-
</MessagePrimitive.Parts>
|
|
51
|
-
</div>
|
|
52
|
-
</MessagePrimitive.Root>
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function UserText() {
|
|
57
|
-
return (
|
|
58
|
-
<p>
|
|
59
|
-
<MessagePartPrimitive.Text />
|
|
60
|
-
</p>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function AssistantText() {
|
|
65
|
-
return (
|
|
66
|
-
<p className="leading-relaxed">
|
|
67
|
-
<MessagePartPrimitive.Text />
|
|
68
|
-
</p>
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
</Tab>
|
|
73
|
-
</Tabs>
|
|
74
|
-
|
|
75
|
-
## Quick Start
|
|
76
|
-
|
|
77
|
-
A minimal message with parts rendering:
|
|
78
|
-
|
|
79
|
-
```tsx
|
|
80
|
-
import { MessagePrimitive } from "@assistant-ui/react";
|
|
81
|
-
|
|
82
|
-
<MessagePrimitive.Root>
|
|
83
|
-
<MessagePrimitive.Parts />
|
|
84
|
-
</MessagePrimitive.Root>
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
`Root` renders a `<div>` that provides message context and tracks hover state. `Parts` iterates over the message's content parts and renders each one. Without custom components, parts render with sensible defaults: `Text` renders a `<p>` with `white-space: pre-line` and a streaming indicator, `Image` renders via `MessagePartPrimitive.Image`, and tool calls render nothing unless a tool UI is registered globally or inline. Reasoning, source, file, and audio parts render nothing by default.
|
|
88
|
-
|
|
89
|
-
<Callout type="info">
|
|
90
|
-
Runtime setup: primitives require runtime context. Wrap your UI in `AssistantRuntimeProvider` with a runtime (for example `useLocalRuntime(...)`). See [Pick a Runtime](/docs/runtimes/pick-a-runtime).
|
|
91
|
-
</Callout>
|
|
92
|
-
|
|
93
|
-
## Core Concepts
|
|
94
|
-
|
|
95
|
-
### Parts Pipeline
|
|
96
|
-
|
|
97
|
-
`MessagePrimitive.Parts` now prefers a children render function. It gives you the current enriched part state directly, so you can branch inline and return exactly the UI you want:
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
<MessagePrimitive.Parts>
|
|
101
|
-
{({ part }) => {
|
|
102
|
-
if (part.type === "text") return <MyTextRenderer />;
|
|
103
|
-
if (part.type === "image") return <MyImageRenderer />;
|
|
104
|
-
if (part.type === "tool-call")
|
|
105
|
-
return part.toolUI ?? <GenericToolUI {...part} />;
|
|
106
|
-
return null;
|
|
107
|
-
}}
|
|
108
|
-
</MessagePrimitive.Parts>
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
<Callout type="info">
|
|
112
|
-
For most new code, prefer `MessagePrimitive.Parts` with a `children` render function. When you need adjacent grouping, use `MessagePrimitive.GroupedParts`.
|
|
113
|
-
</Callout>
|
|
114
|
-
|
|
115
|
-
### Part Types
|
|
116
|
-
|
|
117
|
-
A message part is one of three kinds, and which kind a new capability belongs to is decided by the list below rather than case by case.
|
|
118
|
-
|
|
119
|
-
| Kind | Parts | Grows by |
|
|
120
|
-
|------|-------|----------|
|
|
121
|
-
| Modality | `text`, `image`, `file` | Never. `file` carries every non-image binary modality through its `mimeType`. |
|
|
122
|
-
| Provider channel | `reasoning`, `source`, `tool-call`, `generative-ui` | Never. These mirror channels a model already emits. |
|
|
123
|
-
| Extensibility | `data` | Freely, through `name`. This is the growth path for anything app-level. |
|
|
124
|
-
|
|
125
|
-
`file` is the media carrier. Audio, video, PDFs and everything else are `{ type: "file", mimeType: "audio/mpeg" }` rather than part types of their own, so one renderer and one converter branch handle them all. The payload can be inline base64 or a URL; `sourceType` additionally allows an opaque storage id, which the LangChain-family runtimes honor and other adapters ignore.
|
|
126
|
-
|
|
127
|
-
Anything that is not a modality the model consumes or a channel it emits is a `data` part, routed by `name`:
|
|
128
|
-
|
|
129
|
-
```tsx
|
|
130
|
-
<MessagePrimitive.Parts
|
|
131
|
-
components={{
|
|
132
|
-
data: {
|
|
133
|
-
by_name: { citation: MyCitation },
|
|
134
|
-
Fallback: MyDataFallback,
|
|
135
|
-
},
|
|
136
|
-
}}
|
|
137
|
-
/>
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
<Callout type="warn">
|
|
141
|
-
`Unstable_AudioMessagePart` and the `Unstable_Audio` slot are deprecated. The audio part cannot carry a filename, has no way to declare how its payload goes on the wire (no `sourceType`, so no storage id), and exists only on user messages, so a model that returns audio has no way to express it. Send audio as a `file` part with an `audio/*` mime type instead, and give it a filename.
|
|
142
|
-
|
|
143
|
-
Adapter coverage for the file path is still uneven, so check your adapter's converter before relying on file parts. Known so far: `react-pi` and the assistant-transport runtime have no file part on their user-content surface at all, so one is dropped; `react-data-stream` carries the payload but not the filename. Existing audio parts keep working; they will not gain fields.
|
|
144
|
-
</Callout>
|
|
145
|
-
|
|
146
|
-
### Tool Resolution
|
|
147
|
-
|
|
148
|
-
Tool call parts resolve in this order:
|
|
149
|
-
|
|
150
|
-
1. **`tools.Override`**: if provided inline through the deprecated `components` prop, handles **all** tool calls
|
|
151
|
-
2. **Globally registered tools**: tools registered via `Tools({ toolkit })`
|
|
152
|
-
3. **`tools.by_name[toolName]`**: per-`MessagePrimitive.Parts` inline overrides from the deprecated `components` prop
|
|
153
|
-
4. **`tools.Fallback`**: catch-all for unmatched tool calls from the deprecated `components` prop
|
|
154
|
-
5. **`part.toolUI`**: the resolved tool UI exposed directly in the children render function
|
|
155
|
-
|
|
156
|
-
In the children API, tool and data parts expose resolved UI helpers directly:
|
|
157
|
-
|
|
158
|
-
```tsx
|
|
159
|
-
<MessagePrimitive.Parts>
|
|
160
|
-
{({ part }) => {
|
|
161
|
-
if (part.type === "tool-call")
|
|
162
|
-
return part.toolUI ?? <ToolFallback {...part} />;
|
|
163
|
-
|
|
164
|
-
if (part.type === "data")
|
|
165
|
-
return part.dataRendererUI ?? null;
|
|
166
|
-
|
|
167
|
-
return null;
|
|
168
|
-
}}
|
|
169
|
-
</MessagePrimitive.Parts>
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
Returning `null` still allows registered tool UIs and data renderer UIs to render automatically. Return `<></>` if you want to suppress them entirely.
|
|
173
|
-
|
|
174
|
-
### Components Prop (Deprecated)
|
|
175
|
-
|
|
176
|
-
`components` is deprecated. This section only documents it so older code is still understandable:
|
|
177
|
-
|
|
178
|
-
- `ToolGroup` wraps consecutive tool-call parts
|
|
179
|
-
- `ReasoningGroup` wraps consecutive reasoning parts
|
|
180
|
-
- `components.ChainOfThought` takes over all reasoning and tool-call rendering (mutually exclusive with `ToolGroup`, `ReasoningGroup`, `tools`, and `Reasoning`). This legacy path is deprecated; use `MessagePrimitive.GroupedParts` for grouped Chain of Thought in new code.
|
|
181
|
-
- `data.by_name` and `data.Fallback` let you route custom data part types
|
|
182
|
-
- `Quote` renders quoted message references from metadata
|
|
183
|
-
- `Empty` is available for edge rendering paths
|
|
184
|
-
- `Unstable_Audio` is deprecated; render `audio/*` from the `File` slot instead
|
|
185
|
-
|
|
186
|
-
```tsx
|
|
187
|
-
<MessagePrimitive.Parts
|
|
188
|
-
components={{
|
|
189
|
-
Text: () => (
|
|
190
|
-
<p className="whitespace-pre-wrap">
|
|
191
|
-
<MessagePartPrimitive.Text />
|
|
192
|
-
</p>
|
|
193
|
-
),
|
|
194
|
-
Image: () => <MessagePartPrimitive.Image className="max-w-sm rounded-xl" />,
|
|
195
|
-
File: () => <div className="rounded-md border px-2 py-1 text-xs">File part</div>,
|
|
196
|
-
tools: {
|
|
197
|
-
by_name: {
|
|
198
|
-
get_weather: () => <div>Weather tool</div>,
|
|
199
|
-
},
|
|
200
|
-
Fallback: ({ toolName }) => <div>Unknown tool: {toolName}</div>,
|
|
201
|
-
},
|
|
202
|
-
data: {
|
|
203
|
-
by_name: {
|
|
204
|
-
"my-event": ({ data }) => <pre>{JSON.stringify(data, null, 2)}</pre>,
|
|
205
|
-
},
|
|
206
|
-
Fallback: ({ name }) => <div>Unknown data event: {name}</div>,
|
|
207
|
-
},
|
|
208
|
-
ToolGroup: ({ children }) => (
|
|
209
|
-
<div className="space-y-2 rounded-lg border p-2">{children}</div>
|
|
210
|
-
),
|
|
211
|
-
ReasoningGroup: ({ children }) => (
|
|
212
|
-
<details className="rounded-lg border p-2">
|
|
213
|
-
<summary>Reasoning</summary>
|
|
214
|
-
{children}
|
|
215
|
-
</details>
|
|
216
|
-
),
|
|
217
|
-
Empty: () => <span className="text-muted-foreground">...</span>,
|
|
218
|
-
Unstable_Audio: () => null,
|
|
219
|
-
}}
|
|
220
|
-
/>
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
For new code, use the `children` render function or `GroupedParts` instead.
|
|
224
|
-
|
|
225
|
-
### Hover State
|
|
226
|
-
|
|
227
|
-
`MessagePrimitive.Root` automatically tracks mouse enter/leave events. This hover state is consumed by `ActionBarPrimitive` to implement auto-hide behavior, with no extra wiring needed.
|
|
228
|
-
|
|
229
|
-
### MessagePartPrimitive
|
|
230
|
-
|
|
231
|
-
Inside your custom part components, use these sub-primitives to access the actual content:
|
|
232
|
-
|
|
233
|
-
- **`MessagePartPrimitive.Text`**: renders the text content of a text part
|
|
234
|
-
- **`MessagePartPrimitive.Image`**: renders the image of an image part
|
|
235
|
-
- **`MessagePartPrimitive.InProgress`**: renders only while the part is still streaming
|
|
236
|
-
|
|
237
|
-
```tsx
|
|
238
|
-
function MyText() {
|
|
239
|
-
return (
|
|
240
|
-
<p className="whitespace-pre-wrap">
|
|
241
|
-
<MessagePartPrimitive.Text />
|
|
242
|
-
<MessagePartPrimitive.InProgress>
|
|
243
|
-
<span className="animate-pulse">▊</span>
|
|
244
|
-
</MessagePartPrimitive.InProgress>
|
|
245
|
-
</p>
|
|
246
|
-
);
|
|
247
|
-
}
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## Parts
|
|
251
|
-
|
|
252
|
-
### Root
|
|
253
|
-
|
|
254
|
-
Container for a single message. Renders a `<div>` element unless `asChild` is set.
|
|
255
|
-
|
|
256
|
-
```tsx
|
|
257
|
-
<MessagePrimitive.Root className="flex flex-col gap-2">
|
|
258
|
-
<MessagePrimitive.Quote>
|
|
259
|
-
{({ text }) => <blockquote className="mb-2 border-l pl-3 italic">{text}</blockquote>}
|
|
260
|
-
</MessagePrimitive.Quote>
|
|
261
|
-
<MessagePrimitive.Parts />
|
|
262
|
-
</MessagePrimitive.Root>
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Parts
|
|
266
|
-
|
|
267
|
-
Renders each content part with type-based component resolution.
|
|
268
|
-
|
|
269
|
-
```tsx
|
|
270
|
-
<MessagePrimitive.Parts>
|
|
271
|
-
{({ part }) => {
|
|
272
|
-
if (part.type === "text") return <MyTextRenderer />;
|
|
273
|
-
if (part.type === "image") return <MyImageRenderer />;
|
|
274
|
-
if (part.type === "tool-call")
|
|
275
|
-
return part.toolUI ?? <GenericToolUI {...part} />;
|
|
276
|
-
return null;
|
|
277
|
-
}}
|
|
278
|
-
</MessagePrimitive.Parts>
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
<PrimitivesTypeTable type="MessagePrimitivePartsProps" parameters={MessagePrimitiveDocs.Parts.props} />
|
|
282
|
-
|
|
283
|
-
### GroupedParts
|
|
284
|
-
|
|
285
|
-
Groups adjacent message parts into a nested tree. Use `groupBy` to map each part to a group-key path, then switch on `part.type` in the render function. Group cases render `children`; leaf cases render their own UI. Prefer the `groupPartByType` helper for the common `part.type → path` case.
|
|
286
|
-
|
|
287
|
-
```tsx
|
|
288
|
-
import { MessagePrimitive, groupPartByType } from "@assistant-ui/react";
|
|
289
|
-
|
|
290
|
-
<MessagePrimitive.GroupedParts
|
|
291
|
-
groupBy={groupPartByType({
|
|
292
|
-
reasoning: ["group-chainOfThought", "group-reasoning"],
|
|
293
|
-
"tool-call": ["group-chainOfThought", "group-tool"],
|
|
294
|
-
})}
|
|
295
|
-
>
|
|
296
|
-
{({ part, children }) => {
|
|
297
|
-
switch (part.type) {
|
|
298
|
-
case "group-chainOfThought":
|
|
299
|
-
return <div>{children}</div>;
|
|
300
|
-
case "group-reasoning":
|
|
301
|
-
return <ReasoningRoot>{children}</ReasoningRoot>;
|
|
302
|
-
case "group-tool":
|
|
303
|
-
return <ToolGroupRoot>{children}</ToolGroupRoot>;
|
|
304
|
-
case "text":
|
|
305
|
-
return <MarkdownText />;
|
|
306
|
-
case "reasoning":
|
|
307
|
-
return <Reasoning {...part} />;
|
|
308
|
-
case "tool-call":
|
|
309
|
-
return part.toolUI ?? <ToolFallback {...part} />;
|
|
310
|
-
case "data":
|
|
311
|
-
return part.dataRendererUI;
|
|
312
|
-
default:
|
|
313
|
-
return null;
|
|
314
|
-
}
|
|
315
|
-
}}
|
|
316
|
-
</MessagePrimitive.GroupedParts>
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
<PrimitivesTypeTable type="MessagePrimitiveGroupedPartsProps" parameters={MessagePrimitiveDocs.GroupedParts.props} />
|
|
320
|
-
|
|
321
|
-
### Content
|
|
322
|
-
|
|
323
|
-
Legacy alias for `Parts`.
|
|
324
|
-
|
|
325
|
-
```tsx
|
|
326
|
-
<MessagePrimitive.Content>
|
|
327
|
-
{({ part }) => {
|
|
328
|
-
if (part.type === "text") return <MyTextRenderer />;
|
|
329
|
-
return null;
|
|
330
|
-
}}
|
|
331
|
-
</MessagePrimitive.Content>
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### PartByIndex
|
|
335
|
-
|
|
336
|
-
Renders a single part at a specific index.
|
|
337
|
-
|
|
338
|
-
```tsx
|
|
339
|
-
<MessagePrimitive.PartByIndex
|
|
340
|
-
index={0}
|
|
341
|
-
components={{ Text: MyTextRenderer }}
|
|
342
|
-
/>
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
### Attachments
|
|
346
|
-
|
|
347
|
-
Renders all user message attachments.
|
|
348
|
-
|
|
349
|
-
```tsx
|
|
350
|
-
<MessagePrimitive.Attachments>
|
|
351
|
-
{({ attachment }) => {
|
|
352
|
-
if (attachment.type === "image") {
|
|
353
|
-
const imageSrc = attachment.content?.find((part) => part.type === "image")?.image;
|
|
354
|
-
if (!imageSrc) return null;
|
|
355
|
-
return <img src={imageSrc} alt={attachment.name} className="max-w-xs rounded-lg" />;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (attachment.type === "document") {
|
|
359
|
-
return (
|
|
360
|
-
<div className="rounded-lg border p-2 text-sm">
|
|
361
|
-
{attachment.name}
|
|
362
|
-
</div>
|
|
363
|
-
);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
return null;
|
|
367
|
-
}}
|
|
368
|
-
</MessagePrimitive.Attachments>
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
<PrimitivesTypeTable type="MessagePrimitiveAttachmentsProps" parameters={MessagePrimitiveDocs.Attachments.props} />
|
|
372
|
-
|
|
373
|
-
### AttachmentByIndex
|
|
374
|
-
|
|
375
|
-
Renders a single attachment at the specified index within the current message.
|
|
376
|
-
|
|
377
|
-
```tsx
|
|
378
|
-
<MessagePrimitive.AttachmentByIndex
|
|
379
|
-
index={0}
|
|
380
|
-
components={{ Attachment: MyAttachment }}
|
|
381
|
-
/>
|
|
382
|
-
```
|
|
383
|
-
|
|
384
|
-
<PrimitivesTypeTable type="MessagePrimitiveAttachmentByIndexProps" parameters={MessagePrimitiveDocs.AttachmentByIndex.props} />
|
|
385
|
-
|
|
386
|
-
### Error
|
|
387
|
-
|
|
388
|
-
Renders children only when the message has an error.
|
|
389
|
-
|
|
390
|
-
```tsx
|
|
391
|
-
<MessagePrimitive.Error>
|
|
392
|
-
<ErrorPrimitive.Root className="mt-2 rounded-md border border-destructive/20 bg-destructive/5 p-3">
|
|
393
|
-
<ErrorPrimitive.Message />
|
|
394
|
-
</ErrorPrimitive.Root>
|
|
395
|
-
</MessagePrimitive.Error>
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### Quote
|
|
399
|
-
|
|
400
|
-
Renders quote metadata when the current message includes a quote. Place it above `MessagePrimitive.Parts`.
|
|
401
|
-
|
|
402
|
-
```tsx
|
|
403
|
-
<MessagePrimitive.Quote>
|
|
404
|
-
{({ text, messageId }) => (
|
|
405
|
-
<blockquote className="mb-2 border-l pl-3 italic" data-message-id={messageId}>
|
|
406
|
-
{text}
|
|
407
|
-
</blockquote>
|
|
408
|
-
)}
|
|
409
|
-
</MessagePrimitive.Quote>
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### Unstable_PartsGrouped
|
|
413
|
-
|
|
414
|
-
Groups parts by a custom grouping function *(unstable; use `GroupedParts` for adjacent grouping)*.
|
|
415
|
-
|
|
416
|
-
```tsx
|
|
417
|
-
<MessagePrimitive.Unstable_PartsGrouped
|
|
418
|
-
groupingFunction={myGroupFn}
|
|
419
|
-
components={{ Text: MyText, Group: MyGroupWrapper }}
|
|
420
|
-
/>
|
|
421
|
-
```
|
|
422
|
-
|
|
423
|
-
<PrimitivesTypeTable type="MessagePrimitiveUnstablePartsGroupedProps" parameters={MessagePrimitiveDocs.Unstable_PartsGrouped.props} />
|
|
424
|
-
|
|
425
|
-
### Unstable_PartsGroupedByParentId
|
|
426
|
-
|
|
427
|
-
Groups parts by parent ID *(unstable, deprecated; use `Unstable_PartsGrouped`)*.
|
|
428
|
-
|
|
429
|
-
```tsx
|
|
430
|
-
<MessagePrimitive.Unstable_PartsGroupedByParentId
|
|
431
|
-
components={{ Text: MyText, Group: MyGroupWrapper }}
|
|
432
|
-
/>
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### If (deprecated)
|
|
436
|
-
|
|
437
|
-
<Callout type="warn">
|
|
438
|
-
Deprecated. Use [`AuiIf`](/docs/api-reference/primitives/assistant-if) instead.
|
|
439
|
-
</Callout>
|
|
440
|
-
|
|
441
|
-
```tsx
|
|
442
|
-
// Before (deprecated)
|
|
443
|
-
<MessagePrimitive.If user>...</MessagePrimitive.If>
|
|
444
|
-
<MessagePrimitive.If assistant>...</MessagePrimitive.If>
|
|
445
|
-
|
|
446
|
-
// After
|
|
447
|
-
<AuiIf condition={(s) => s.message.role === "user"}>...</AuiIf>
|
|
448
|
-
<AuiIf condition={(s) => s.message.role === "assistant"}>...</AuiIf>
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
## Patterns
|
|
452
|
-
|
|
453
|
-
### Custom Text Rendering
|
|
454
|
-
|
|
455
|
-
```tsx
|
|
456
|
-
function MarkdownText() {
|
|
457
|
-
return (
|
|
458
|
-
<div className="prose prose-sm">
|
|
459
|
-
<MessagePartPrimitive.Text />
|
|
460
|
-
</div>
|
|
461
|
-
);
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
<MessagePrimitive.Parts>
|
|
465
|
-
{({ part }) => {
|
|
466
|
-
if (part.type === "text") return <MarkdownText />;
|
|
467
|
-
return null;
|
|
468
|
-
}}
|
|
469
|
-
</MessagePrimitive.Parts>
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
### Tool UI with by_name
|
|
473
|
-
|
|
474
|
-
```tsx
|
|
475
|
-
<MessagePrimitive.Parts
|
|
476
|
-
components={{
|
|
477
|
-
Text: MyText,
|
|
478
|
-
tools: {
|
|
479
|
-
by_name: {
|
|
480
|
-
get_weather: ({ result }) => (
|
|
481
|
-
<div className="rounded-lg border p-3">
|
|
482
|
-
<p className="font-medium">Weather</p>
|
|
483
|
-
<p>{result?.temperature}°F, {result?.condition}</p>
|
|
484
|
-
</div>
|
|
485
|
-
),
|
|
486
|
-
},
|
|
487
|
-
Fallback: ({ toolName, status }) => (
|
|
488
|
-
<div className="text-muted-foreground text-sm">
|
|
489
|
-
{status.type === "running" ? `Running ${toolName}...` : `${toolName} completed`}
|
|
490
|
-
</div>
|
|
491
|
-
),
|
|
492
|
-
},
|
|
493
|
-
}}
|
|
494
|
-
/>
|
|
495
|
-
```
|
|
496
|
-
|
|
497
|
-
### Error Display
|
|
498
|
-
|
|
499
|
-
```tsx
|
|
500
|
-
<MessagePrimitive.Root>
|
|
501
|
-
<MessagePrimitive.Parts />
|
|
502
|
-
<MessagePrimitive.Error>
|
|
503
|
-
<div className="mt-2 rounded-md bg-destructive/10 p-2 text-sm text-destructive">
|
|
504
|
-
Something went wrong. Please try again.
|
|
505
|
-
</div>
|
|
506
|
-
</MessagePrimitive.Error>
|
|
507
|
-
</MessagePrimitive.Root>
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
### Error Display with ErrorPrimitive
|
|
511
|
-
|
|
512
|
-
For more control over error rendering, `ErrorPrimitive` provides a dedicated component that auto-reads the error string from the message status:
|
|
513
|
-
|
|
514
|
-
```tsx
|
|
515
|
-
import { ErrorPrimitive, MessagePrimitive } from "@assistant-ui/react";
|
|
516
|
-
|
|
517
|
-
<MessagePrimitive.Root>
|
|
518
|
-
<MessagePrimitive.Parts />
|
|
519
|
-
<ErrorPrimitive.Root className="mt-2 rounded-md bg-destructive/10 p-2 text-sm text-destructive" role="alert">
|
|
520
|
-
<ErrorPrimitive.Message />
|
|
521
|
-
</ErrorPrimitive.Root>
|
|
522
|
-
</MessagePrimitive.Root>
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
`ErrorPrimitive.Root` renders a `<div>` container with `role="alert"` and `ErrorPrimitive.Message` renders a `<span>` that displays the error text. `Root` always renders. Only `Message` conditionally returns `null` when there is no error. Wrap in `<MessagePrimitive.Error>` if you want the entire block to be conditional. See the [ErrorPrimitive API Reference](/docs/api-reference/primitives/error) for full details.
|
|
526
|
-
|
|
527
|
-
### Render After Stream Completes
|
|
528
|
-
|
|
529
|
-
To render content only once the assistant message has finished streaming (a follow-up card, a feedback prompt, a generated component that should not flicker through partial states), gate it with [`AuiIf`](/docs/api-reference/primitives/assistant-if) on `s.message.status`:
|
|
530
|
-
|
|
531
|
-
```tsx
|
|
532
|
-
import { MessagePrimitive, AuiIf } from "@assistant-ui/react";
|
|
533
|
-
|
|
534
|
-
<MessagePrimitive.Root>
|
|
535
|
-
<MessagePrimitive.Parts />
|
|
536
|
-
|
|
537
|
-
<AuiIf
|
|
538
|
-
condition={(s) =>
|
|
539
|
-
s.message.role === "assistant" &&
|
|
540
|
-
s.message.status?.type === "complete"
|
|
541
|
-
}
|
|
542
|
-
>
|
|
543
|
-
<FollowUpCard />
|
|
544
|
-
</AuiIf>
|
|
545
|
-
</MessagePrimitive.Root>;
|
|
546
|
-
```
|
|
547
|
-
|
|
548
|
-
`s.message.status` is a discriminated union of `running | requires-action | complete | incomplete`, defined only on assistant messages. The `role === "assistant"` guard keeps the predicate type-safe. For tool-call-driven generative UI that defers rendering inside the part itself, see [Deferred Rendering](/docs/tools/tool-ui#deferred-rendering) in the Generative UI guide.
|
|
549
|
-
|
|
550
|
-
### Legacy and Unstable APIs
|
|
551
|
-
|
|
552
|
-
- `MessagePrimitive.Unstable_PartsGrouped` and `MessagePrimitive.Unstable_PartsGroupedByParentId` are unstable APIs for non-adjacent custom grouping.
|
|
553
|
-
- `Unstable_PartsGroupedByParentId` is deprecated in favor of `Unstable_PartsGrouped`.
|
|
554
|
-
|
|
555
|
-
### Role-Based Styling
|
|
556
|
-
|
|
557
|
-
`MessagePrimitive.Root` sets `data-message-id` automatically but does not set a `data-role` attribute. Style by role in your message components:
|
|
558
|
-
|
|
559
|
-
```tsx
|
|
560
|
-
// In your ThreadPrimitive.Messages children render function:
|
|
561
|
-
function UserMessage() {
|
|
562
|
-
return (
|
|
563
|
-
<MessagePrimitive.Root data-role="user" className="flex justify-end">
|
|
564
|
-
<MessagePrimitive.Parts />
|
|
565
|
-
</MessagePrimitive.Root>
|
|
566
|
-
);
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
function AssistantMessage() {
|
|
570
|
-
return (
|
|
571
|
-
<MessagePrimitive.Root data-role="assistant" className="flex justify-start">
|
|
572
|
-
<MessagePrimitive.Parts />
|
|
573
|
-
</MessagePrimitive.Root>
|
|
574
|
-
);
|
|
575
|
-
}
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
### Attachments
|
|
579
|
-
|
|
580
|
-
```tsx
|
|
581
|
-
<MessagePrimitive.Root>
|
|
582
|
-
<MessagePrimitive.Attachments>
|
|
583
|
-
{({ attachment }) => {
|
|
584
|
-
if (attachment.type === "image") {
|
|
585
|
-
const imageSrc = attachment.content?.find((part) => part.type === "image")?.image;
|
|
586
|
-
if (!imageSrc) return null;
|
|
587
|
-
return <img src={imageSrc} alt={attachment.name} className="max-w-xs rounded-lg" />;
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
if (attachment.type === "document") {
|
|
591
|
-
return (
|
|
592
|
-
<div className="flex items-center gap-2 rounded-lg border p-2 text-sm">
|
|
593
|
-
📄 {attachment.name}
|
|
594
|
-
</div>
|
|
595
|
-
);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
return null;
|
|
599
|
-
}}
|
|
600
|
-
</MessagePrimitive.Attachments>
|
|
601
|
-
<MessagePrimitive.Parts />
|
|
602
|
-
</MessagePrimitive.Root>
|
|
603
|
-
```
|
|
604
|
-
|
|
605
|
-
## Relationship to Components
|
|
606
|
-
|
|
607
|
-
The shadcn [Thread](/docs/ui/thread) component renders user and assistant messages built from these primitives. The pre-built `AssistantMessage` and `UserMessage` components handle text rendering, tool UIs, error display, and action bars, all using `MessagePrimitive` under the hood.
|
|
608
|
-
|
|
609
|
-
Messages are commonly paired with [ActionBar](/docs/primitives/action-bar) for copy/reload/edit actions and [BranchPicker](/docs/primitives/branch-picker) for navigating between alternative responses.
|
|
610
|
-
|
|
611
|
-
## API Reference
|
|
612
|
-
|
|
613
|
-
For full prop details on every part, see the [MessagePrimitive API Reference](/docs/api-reference/primitives/message).
|
|
614
|
-
|
|
615
|
-
Related:
|
|
616
|
-
- [MessagePartPrimitive API Reference](/docs/api-reference/primitives/message-part)
|
|
617
|
-
- [ActionBarPrimitive API Reference](/docs/api-reference/primitives/action-bar)
|
|
618
|
-
- [BranchPickerPrimitive API Reference](/docs/api-reference/primitives/branch-picker)
|