@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,763 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Assistant Transport
|
|
3
|
-
description: Stream agent state to the frontend and handle user commands for custom agents.
|
|
4
|
-
platforms: ["react"]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
`AssistantTransport` is a state-streaming protocol layered on `ExternalStoreRuntime` (see [architecture](/docs/runtimes/concepts/architecture)). Instead of streaming message parts, your backend streams snapshots of its full agent state and the runtime converts them into UI messages.
|
|
8
|
-
|
|
9
|
-
Three things make this useful:
|
|
10
|
-
|
|
11
|
-
- **State streaming** — efficient updates to your agent state (any JSON object).
|
|
12
|
-
- **UI integration** — your agent's native state becomes assistant-ui messages.
|
|
13
|
-
- **Command handling** — user actions (messages, tool results, custom commands) flow back to the agent.
|
|
14
|
-
|
|
15
|
-
## When to use it
|
|
16
|
-
|
|
17
|
-
Pick `AssistantTransport` when:
|
|
18
|
-
|
|
19
|
-
- Your backend does not have a streaming protocol yet and you want one.
|
|
20
|
-
- Your agent has internal state worth surfacing in the UI directly.
|
|
21
|
-
- You are building a custom agent framework or one without a streaming protocol (e.g. open-source LangGraph).
|
|
22
|
-
- You need bidirectional commands beyond simple message turns.
|
|
23
|
-
|
|
24
|
-
If you only need message streaming, [DataStream](/docs/runtimes/custom/data-stream) is simpler.
|
|
25
|
-
|
|
26
|
-
## Mental model
|
|
27
|
-
|
|
28
|
-
<Flow.Root
|
|
29
|
-
llm={`graph LR
|
|
30
|
-
Frontend -->|Commands| Agent[Agent server]
|
|
31
|
-
Agent -->|State snapshots| Frontend`}
|
|
32
|
-
>
|
|
33
|
-
<Flow.Row>
|
|
34
|
-
<Flow.Node>Frontend</Flow.Node>
|
|
35
|
-
<Flow.Arrow label="Commands" reverseLabel="State snapshots" length={150} />
|
|
36
|
-
<Flow.Node>Agent server</Flow.Node>
|
|
37
|
-
</Flow.Row>
|
|
38
|
-
</Flow.Root>
|
|
39
|
-
|
|
40
|
-
The frontend receives state snapshots and converts them to React components. The UI is a stateless view on top of the agent state.
|
|
41
|
-
|
|
42
|
-
The agent server receives commands from the frontend. When a user interacts with the UI (sends a message, clicks a button), the frontend queues a command and sends it. `AssistantTransport` defines `add-message` and `add-tool-result`; you can define more.
|
|
43
|
-
|
|
44
|
-
### Command lifecycle
|
|
45
|
-
|
|
46
|
-
<Flow.Root
|
|
47
|
-
llm={`graph LR
|
|
48
|
-
queued -->|sent to backend| in_transit
|
|
49
|
-
in_transit -->|backend processes| applied`}
|
|
50
|
-
>
|
|
51
|
-
<Flow.Row>
|
|
52
|
-
<Flow.Node>queued</Flow.Node>
|
|
53
|
-
<Flow.Arrow label="sent to backend" length={120} />
|
|
54
|
-
<Flow.Node>in_transit</Flow.Node>
|
|
55
|
-
<Flow.Arrow label="backend processes" length={132} />
|
|
56
|
-
<Flow.Node>applied</Flow.Node>
|
|
57
|
-
</Flow.Row>
|
|
58
|
-
</Flow.Root>
|
|
59
|
-
|
|
60
|
-
The runtime alternates between **idle** (no active backend request) and **sending** (request in flight). When a new command is created while idle, it is sent immediately; otherwise it is queued until the current request completes.
|
|
61
|
-
|
|
62
|
-
<Flow.Root
|
|
63
|
-
llm={`graph LR
|
|
64
|
-
idle -->|new command| sending
|
|
65
|
-
sending -->|request completes| check{check queue}
|
|
66
|
-
check -->|queue has commands| sending
|
|
67
|
-
check -->|queue empty| idle`}
|
|
68
|
-
>
|
|
69
|
-
<Flow.Canvas
|
|
70
|
-
edges={[
|
|
71
|
-
{
|
|
72
|
-
from: "check",
|
|
73
|
-
to: "sending",
|
|
74
|
-
route: "loop-bottom",
|
|
75
|
-
label: "queue has commands",
|
|
76
|
-
laneOffset: 28,
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
from: "check",
|
|
80
|
-
to: "idle",
|
|
81
|
-
route: "loop-bottom",
|
|
82
|
-
label: "queue empty",
|
|
83
|
-
laneOffset: 60,
|
|
84
|
-
},
|
|
85
|
-
]}
|
|
86
|
-
>
|
|
87
|
-
<Flow.Row>
|
|
88
|
-
<Flow.Node flowId="idle">idle</Flow.Node>
|
|
89
|
-
<Flow.Arrow label="new command" length={108} />
|
|
90
|
-
<Flow.Node flowId="sending">sending</Flow.Node>
|
|
91
|
-
<Flow.Arrow label="request completes" length={132} />
|
|
92
|
-
<Flow.Node flowId="check" variant="decision">check queue</Flow.Node>
|
|
93
|
-
</Flow.Row>
|
|
94
|
-
<div className="h-20" aria-hidden />
|
|
95
|
-
</Flow.Canvas>
|
|
96
|
-
</Flow.Root>
|
|
97
|
-
|
|
98
|
-
To implement this you build two pieces:
|
|
99
|
-
|
|
100
|
-
1. **Backend endpoint** that accepts commands and returns a stream of state snapshots.
|
|
101
|
-
2. **Frontend state converter** that maps state snapshots to assistant-ui's data format.
|
|
102
|
-
|
|
103
|
-
## Building a backend endpoint
|
|
104
|
-
|
|
105
|
-
The endpoint receives POST requests with this payload:
|
|
106
|
-
|
|
107
|
-
```ts
|
|
108
|
-
{
|
|
109
|
-
state: T, // previous state the frontend has
|
|
110
|
-
commands: AssistantTransportCommand[],
|
|
111
|
-
system?: string,
|
|
112
|
-
tools?: Record<string, ToolJSONSchema>, // tool definitions keyed by name
|
|
113
|
-
threadId: string | null, // null for new threads
|
|
114
|
-
parentId?: string | null, // present when editing or branching
|
|
115
|
-
callSettings?: { maxTokens, temperature, topP, presencePenalty, frequencyPenalty, seed },
|
|
116
|
-
config?: { apiKey, baseUrl, modelName },
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
<Callout type="warn">
|
|
121
|
-
The previous wire shape spread `callSettings` and `config` fields at the top level (e.g. `body.modelName`). Both formats are sent for compatibility, but the top-level fields are deprecated. Read from the nested objects.
|
|
122
|
-
</Callout>
|
|
123
|
-
|
|
124
|
-
The endpoint returns a stream of state snapshots using the [`assistant-stream`](https://www.npmjs.com/package/assistant-stream) library ([PyPI](https://pypi.org/project/assistant-stream/)).
|
|
125
|
-
|
|
126
|
-
### Handling commands
|
|
127
|
-
|
|
128
|
-
```python
|
|
129
|
-
for command in request.commands:
|
|
130
|
-
if command.type == "add-message":
|
|
131
|
-
# Handle adding a user message
|
|
132
|
-
elif command.type == "add-tool-result":
|
|
133
|
-
# Handle tool execution result
|
|
134
|
-
elif command.type == "my-custom-command":
|
|
135
|
-
# Handle your custom command
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Streaming updates
|
|
139
|
-
|
|
140
|
-
Mutate `controller.state` inside your run callback:
|
|
141
|
-
|
|
142
|
-
```python
|
|
143
|
-
from assistant_stream import RunController, create_run
|
|
144
|
-
from assistant_stream.serialization import DataStreamResponse
|
|
145
|
-
|
|
146
|
-
@app.post("/assistant")
|
|
147
|
-
async def chat_endpoint(request: ChatRequest):
|
|
148
|
-
async def run_callback(controller: RunController):
|
|
149
|
-
controller.state["message"] = "Hello" # emits "set" at ["message"]
|
|
150
|
-
controller.state["message"] += " World" # emits "append-text"
|
|
151
|
-
|
|
152
|
-
stream = create_run(run_callback, state=request.state)
|
|
153
|
-
return DataStreamResponse(stream)
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
State changes are automatically streamed using the operations described in [streaming protocol](#streaming-protocol).
|
|
157
|
-
|
|
158
|
-
### Cancellation
|
|
159
|
-
|
|
160
|
-
`create_run` exposes `controller.is_cancelled` and `controller.cancelled_event`. If the response stream closes early (user cancel, client disconnect), these are set so your loop can exit cleanly. `create_run` gives callbacks a ~50ms cooperative shutdown window before forced cancellation. Put critical cleanup in `finally` blocks.
|
|
161
|
-
|
|
162
|
-
```python
|
|
163
|
-
async def run_callback(controller: RunController):
|
|
164
|
-
while not controller.is_cancelled:
|
|
165
|
-
await asyncio.sleep(0.05)
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
```python
|
|
169
|
-
async def run_callback(controller: RunController):
|
|
170
|
-
await controller.cancelled_event.wait()
|
|
171
|
-
# cancellation-aware shutdown
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### Backend reference implementation
|
|
175
|
-
|
|
176
|
-
<Tabs items={["Custom agent", "LangGraph"]}>
|
|
177
|
-
<Tab value="Custom agent">
|
|
178
|
-
|
|
179
|
-
```python
|
|
180
|
-
from assistant_stream.serialization import DataStreamResponse
|
|
181
|
-
from assistant_stream import RunController, create_run
|
|
182
|
-
|
|
183
|
-
@app.post("/assistant")
|
|
184
|
-
async def chat_endpoint(request: ChatRequest):
|
|
185
|
-
async def run_callback(controller: RunController):
|
|
186
|
-
if controller.state is None:
|
|
187
|
-
controller.state = {"messages": []}
|
|
188
|
-
|
|
189
|
-
for command in request.commands:
|
|
190
|
-
if command.type == "add-message":
|
|
191
|
-
controller.state["messages"].append(command.message)
|
|
192
|
-
|
|
193
|
-
async for message in your_agent.stream():
|
|
194
|
-
controller.state["messages"].append(message)
|
|
195
|
-
|
|
196
|
-
stream = create_run(run_callback, state=request.state)
|
|
197
|
-
return DataStreamResponse(stream)
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
</Tab>
|
|
201
|
-
<Tab value="LangGraph">
|
|
202
|
-
|
|
203
|
-
```python
|
|
204
|
-
from assistant_stream.serialization import DataStreamResponse
|
|
205
|
-
from assistant_stream import RunController, create_run
|
|
206
|
-
from assistant_stream.modules.langgraph import append_langgraph_event
|
|
207
|
-
|
|
208
|
-
@app.post("/assistant")
|
|
209
|
-
async def chat_endpoint(request: ChatRequest):
|
|
210
|
-
async def run_callback(controller: RunController):
|
|
211
|
-
if controller.state is None:
|
|
212
|
-
controller.state = {"messages": []}
|
|
213
|
-
|
|
214
|
-
input_messages = []
|
|
215
|
-
for command in request.commands:
|
|
216
|
-
if command.type == "add-message":
|
|
217
|
-
text_parts = [
|
|
218
|
-
p.text for p in command.message.parts
|
|
219
|
-
if p.type == "text" and p.text
|
|
220
|
-
]
|
|
221
|
-
if text_parts:
|
|
222
|
-
input_messages.append(HumanMessage(content=" ".join(text_parts)))
|
|
223
|
-
|
|
224
|
-
async for namespace, event_type, chunk in graph.astream(
|
|
225
|
-
{"messages": input_messages},
|
|
226
|
-
stream_mode=["messages", "updates"],
|
|
227
|
-
subgraphs=True,
|
|
228
|
-
):
|
|
229
|
-
append_langgraph_event(controller.state, namespace, event_type, chunk)
|
|
230
|
-
|
|
231
|
-
stream = create_run(run_callback, state=request.state)
|
|
232
|
-
return DataStreamResponse(stream)
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
</Tab>
|
|
236
|
-
</Tabs>
|
|
237
|
-
|
|
238
|
-
Full LangGraph example: [`python/assistant-transport-backend-langgraph`](https://github.com/assistant-ui/assistant-ui/tree/main/python/assistant-transport-backend-langgraph).
|
|
239
|
-
|
|
240
|
-
## Streaming protocol
|
|
241
|
-
|
|
242
|
-
assistant-stream replicates an arbitrary JSON object via two operations.
|
|
243
|
-
|
|
244
|
-
### Operations
|
|
245
|
-
|
|
246
|
-
These two operations cover all complex state mutations: `set` for value updates and structure, `append-text` for efficient streaming of text content.
|
|
247
|
-
|
|
248
|
-
#### `set`
|
|
249
|
-
|
|
250
|
-
```json
|
|
251
|
-
// Operation
|
|
252
|
-
{ "type": "set", "path": ["status"], "value": "completed" }
|
|
253
|
-
|
|
254
|
-
// Before
|
|
255
|
-
{ "status": "pending" }
|
|
256
|
-
|
|
257
|
-
// After
|
|
258
|
-
{ "status": "completed" }
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
#### `append-text`
|
|
262
|
-
|
|
263
|
-
```json
|
|
264
|
-
// Operation
|
|
265
|
-
{ "type": "append-text", "path": ["message"], "value": " World" }
|
|
266
|
-
|
|
267
|
-
// Before
|
|
268
|
-
{ "message": "Hello" }
|
|
269
|
-
|
|
270
|
-
// After
|
|
271
|
-
{ "message": "Hello World" }
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### Wire format
|
|
275
|
-
|
|
276
|
-
<Callout type="warn">
|
|
277
|
-
The wire format will migrate to Server-Sent Events (SSE) in a future release.
|
|
278
|
-
</Callout>
|
|
279
|
-
|
|
280
|
-
Inspired by [AI SDK's data stream protocol](https://sdk.vercel.ai/docs/ai-sdk-ui/stream-protocol).
|
|
281
|
-
|
|
282
|
-
**state update:**
|
|
283
|
-
|
|
284
|
-
```
|
|
285
|
-
aui-state:[{"type":"set","path":["status"],"value":"completed"}]
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
**error:**
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
3:"error message"
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
## Building a frontend
|
|
295
|
-
|
|
296
|
-
`useAssistantTransportRuntime` accepts:
|
|
297
|
-
|
|
298
|
-
```ts
|
|
299
|
-
{
|
|
300
|
-
initialState: T,
|
|
301
|
-
api: string,
|
|
302
|
-
resumeApi?: string,
|
|
303
|
-
resumeStateApi?: string,
|
|
304
|
-
protocol?: "data-stream" | "assistant-transport",
|
|
305
|
-
converter: (state: T, connectionMetadata: ConnectionMetadata) => AssistantTransportState,
|
|
306
|
-
headers?: Record<string, string> | Headers | (() => Promise<Record<string, string> | Headers>),
|
|
307
|
-
body?: object | (() => Promise<object | undefined>),
|
|
308
|
-
prepareSendCommandsRequest?: (body: SendCommandsRequestBody) => Record<string, unknown> | Promise<Record<string, unknown>>,
|
|
309
|
-
capabilities?: { edit?: boolean },
|
|
310
|
-
adapters?: { attachments?: AttachmentAdapter; history?: ThreadHistoryAdapter },
|
|
311
|
-
onResponse?: (response: Response) => void | Promise<void>,
|
|
312
|
-
onFinish?: () => void,
|
|
313
|
-
onError?: (error: Error, params: { commands: AssistantTransportCommand[]; updateState: (updater: (state: T) => T) => void }) => void | Promise<void>,
|
|
314
|
-
onCancel?: (params: { commands: AssistantTransportCommand[]; updateState: (updater: (state: T) => T) => void; error?: Error }) => void
|
|
315
|
-
}
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### State converter
|
|
319
|
-
|
|
320
|
-
The state converter transforms your agent state into assistant-ui's message format:
|
|
321
|
-
|
|
322
|
-
```ts
|
|
323
|
-
(
|
|
324
|
-
state: T,
|
|
325
|
-
connectionMetadata: {
|
|
326
|
-
pendingCommands: Command[], // commands not yet sent
|
|
327
|
-
isSending: boolean, // a request is in flight
|
|
328
|
-
toolStatuses: Record<string, ToolExecutionStatus>,
|
|
329
|
-
},
|
|
330
|
-
) => {
|
|
331
|
-
messages: ThreadMessage[],
|
|
332
|
-
isRunning: boolean,
|
|
333
|
-
state?: ReadonlyJSONValue,
|
|
334
|
-
};
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Converting messages
|
|
338
|
-
|
|
339
|
-
`unstable_createMessageConverter` transforms agent messages to assistant-ui's format:
|
|
340
|
-
|
|
341
|
-
<Tabs items={["Example", "LangChain"]}>
|
|
342
|
-
<Tab value="Example">
|
|
343
|
-
|
|
344
|
-
```ts
|
|
345
|
-
import { unstable_createMessageConverter as createMessageConverter } from "@assistant-ui/react";
|
|
346
|
-
|
|
347
|
-
type YourMessage = {
|
|
348
|
-
id: string;
|
|
349
|
-
role: "user" | "assistant";
|
|
350
|
-
content: string;
|
|
351
|
-
timestamp: number;
|
|
352
|
-
};
|
|
353
|
-
|
|
354
|
-
const messageConverter = createMessageConverter((message: YourMessage) => ({
|
|
355
|
-
role: message.role,
|
|
356
|
-
content: [{ type: "text", text: message.content }],
|
|
357
|
-
}));
|
|
358
|
-
|
|
359
|
-
const converter = (state: YourAgentState) => ({
|
|
360
|
-
messages: messageConverter.toThreadMessages(state.messages),
|
|
361
|
-
isRunning: false,
|
|
362
|
-
});
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
</Tab>
|
|
366
|
-
<Tab value="LangChain">
|
|
367
|
-
|
|
368
|
-
```ts
|
|
369
|
-
import { unstable_createMessageConverter as createMessageConverter } from "@assistant-ui/react";
|
|
370
|
-
import { convertLangChainMessages } from "@assistant-ui/react-langgraph";
|
|
371
|
-
|
|
372
|
-
const messageConverter = createMessageConverter(convertLangChainMessages);
|
|
373
|
-
|
|
374
|
-
const converter = (state: YourAgentState) => ({
|
|
375
|
-
messages: messageConverter.toThreadMessages(state.messages),
|
|
376
|
-
isRunning: false,
|
|
377
|
-
});
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
</Tab>
|
|
381
|
-
</Tabs>
|
|
382
|
-
|
|
383
|
-
Retrieve the original message format anywhere via `messageConverter.toOriginalMessage(threadMessage)` or `toOriginalMessages(threadMessage)`.
|
|
384
|
-
|
|
385
|
-
### Optimistic updates from commands
|
|
386
|
-
|
|
387
|
-
The converter also receives `connectionMetadata.pendingCommands`. Use it to show optimistic UI before the backend responds:
|
|
388
|
-
|
|
389
|
-
```ts
|
|
390
|
-
const converter = (state: State, connectionMetadata: ConnectionMetadata) => {
|
|
391
|
-
const optimisticMessages = connectionMetadata.pendingCommands
|
|
392
|
-
.filter((c) => c.type === "add-message")
|
|
393
|
-
.map((c) => c.message);
|
|
394
|
-
|
|
395
|
-
return {
|
|
396
|
-
messages: [...state.messages, ...optimisticMessages],
|
|
397
|
-
isRunning: connectionMetadata.isSending || false,
|
|
398
|
-
};
|
|
399
|
-
};
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
## Errors and cancellations
|
|
403
|
-
|
|
404
|
-
`onError` and `onCancel` receive `updateState` so you can mutate state on the client without making a server request:
|
|
405
|
-
|
|
406
|
-
```ts
|
|
407
|
-
const runtime = useAssistantTransportRuntime({
|
|
408
|
-
// ... other options
|
|
409
|
-
onError: (error, { commands, updateState }) => {
|
|
410
|
-
updateState((s) => ({ ...s, lastError: error.message }));
|
|
411
|
-
},
|
|
412
|
-
onCancel: ({ commands, updateState }) => {
|
|
413
|
-
updateState((s) => ({ ...s, status: "cancelled" }));
|
|
414
|
-
},
|
|
415
|
-
});
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
`onError` receives commands that were in transit. `onCancel` receives both in-transit and queued commands when the user cancels directly; when called after an error, it only receives queued commands (in-transit commands are passed to `onError`).
|
|
419
|
-
|
|
420
|
-
## Custom headers and body
|
|
421
|
-
|
|
422
|
-
```ts
|
|
423
|
-
const runtime = useAssistantTransportRuntime({
|
|
424
|
-
// ...
|
|
425
|
-
headers: { Authorization: "Bearer token", "X-Custom-Header": "value" },
|
|
426
|
-
body: { customField: "value" },
|
|
427
|
-
});
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
Evaluate per-request:
|
|
431
|
-
|
|
432
|
-
```ts
|
|
433
|
-
const runtime = useAssistantTransportRuntime({
|
|
434
|
-
// ...
|
|
435
|
-
headers: async () => ({
|
|
436
|
-
Authorization: `Bearer ${await getAccessToken()}`,
|
|
437
|
-
"X-Request-ID": crypto.randomUUID(),
|
|
438
|
-
}),
|
|
439
|
-
body: async () => ({
|
|
440
|
-
customField: "value",
|
|
441
|
-
requestId: crypto.randomUUID(),
|
|
442
|
-
timestamp: Date.now(),
|
|
443
|
-
}),
|
|
444
|
-
});
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
### Transforming the request body
|
|
448
|
-
|
|
449
|
-
`prepareSendCommandsRequest` lets you transform the entire body before send:
|
|
450
|
-
|
|
451
|
-
```ts
|
|
452
|
-
const runtime = useAssistantTransportRuntime({
|
|
453
|
-
// ...
|
|
454
|
-
prepareSendCommandsRequest: (body) => ({
|
|
455
|
-
...body,
|
|
456
|
-
trackingId: crypto.randomUUID(),
|
|
457
|
-
commands: body.commands.map((cmd) =>
|
|
458
|
-
cmd.type === "add-message"
|
|
459
|
-
? { ...cmd, trackingId: crypto.randomUUID() }
|
|
460
|
-
: cmd,
|
|
461
|
-
),
|
|
462
|
-
}),
|
|
463
|
-
});
|
|
464
|
-
```
|
|
465
|
-
|
|
466
|
-
## Editing messages
|
|
467
|
-
|
|
468
|
-
Editing is disabled by default. Enable it:
|
|
469
|
-
|
|
470
|
-
```ts
|
|
471
|
-
const runtime = useAssistantTransportRuntime({
|
|
472
|
-
// ...
|
|
473
|
-
capabilities: { edit: true },
|
|
474
|
-
});
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
`add-message` commands always include `parentId` and `sourceId`:
|
|
478
|
-
|
|
479
|
-
```ts
|
|
480
|
-
{
|
|
481
|
-
type: "add-message",
|
|
482
|
-
message: { role: "user", parts: [...] },
|
|
483
|
-
parentId: "msg-3", // insert after this message
|
|
484
|
-
sourceId: "msg-4", // ID of the message being replaced (null for new)
|
|
485
|
-
}
|
|
486
|
-
```
|
|
487
|
-
|
|
488
|
-
### Backend handling
|
|
489
|
-
|
|
490
|
-
When the backend receives `add-message` with a `parentId`:
|
|
491
|
-
|
|
492
|
-
1. Truncate all messages after the parent.
|
|
493
|
-
2. Append the new message.
|
|
494
|
-
3. Stream the updated state back.
|
|
495
|
-
|
|
496
|
-
```python
|
|
497
|
-
for command in request.commands:
|
|
498
|
-
if command.type == "add-message":
|
|
499
|
-
if hasattr(command, "parentId") and command.parentId is not None:
|
|
500
|
-
parent_idx = next(
|
|
501
|
-
i for i, m in enumerate(messages) if m.id == command.parentId
|
|
502
|
-
)
|
|
503
|
-
messages = messages[:parent_idx + 1]
|
|
504
|
-
messages.append(command.message)
|
|
505
|
-
```
|
|
506
|
-
|
|
507
|
-
## Resuming from a sync server
|
|
508
|
-
|
|
509
|
-
<Callout type="info">
|
|
510
|
-
The sync server is currently part of the enterprise plan; contact us for details.
|
|
511
|
-
</Callout>
|
|
512
|
-
|
|
513
|
-
When a user refreshes the page or reconnects, the backend may still be generating. `resumeRun` reconnects to an active stream.
|
|
514
|
-
|
|
515
|
-
```ts
|
|
516
|
-
const runtime = useAssistantTransportRuntime({
|
|
517
|
-
// ...
|
|
518
|
-
api: "http://localhost:8010/assistant",
|
|
519
|
-
resumeApi: "http://localhost:8010/resume",
|
|
520
|
-
});
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
Setting `resumeStateApi` additionally hydrates resumed runs from the server-retained starting state. It requires a sync server that serves the initial-state route; do not configure it against a server without one, since a failing preflight fails the resume closed:
|
|
524
|
-
|
|
525
|
-
```tsx
|
|
526
|
-
const runtime = useAssistantTransportRuntime({
|
|
527
|
-
// ...
|
|
528
|
-
resumeStateApi: "http://localhost:8010/initial-state",
|
|
529
|
-
});
|
|
530
|
-
```
|
|
531
|
-
|
|
532
|
-
Before resuming, the runtime posts `{ threadId }` to `resumeStateApi`. The endpoint must return the state that started the active run together with its identity:
|
|
533
|
-
|
|
534
|
-
```json
|
|
535
|
-
{ "runId": "8b3a...", "state": { "messages": [] } }
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
The runtime replaces its local base with this snapshot and includes `runId` in the resume request; the request carries no `state`, since the server replays from the snapshot it retained. A sync server should reject the resume when that ID no longer identifies the same run, preventing replay operations from being applied to a drifted or replaced base state. When no run is active, the endpoint responds `204 No Content` and the runtime skips the resume without raising an error. On a resume, `runId` takes precedence over fields supplied through `body` and survives `prepareSendCommandsRequest`; any `state` either of them supplies is stripped.
|
|
539
|
-
|
|
540
|
-
```tsx
|
|
541
|
-
import { useAui } from "@assistant-ui/react";
|
|
542
|
-
import { useEffect, useRef } from "react";
|
|
543
|
-
|
|
544
|
-
function useResumeOnMount(threadId: string) {
|
|
545
|
-
const aui = useAui();
|
|
546
|
-
const checkedRef = useRef(false);
|
|
547
|
-
|
|
548
|
-
useEffect(() => {
|
|
549
|
-
if (checkedRef.current) return;
|
|
550
|
-
checkedRef.current = true;
|
|
551
|
-
|
|
552
|
-
(async () => {
|
|
553
|
-
const status = await fetch(`/api/sync-server/status/${threadId}`).then((r) =>
|
|
554
|
-
r.json(),
|
|
555
|
-
);
|
|
556
|
-
if (status.isRunning) {
|
|
557
|
-
const parentId = aui.thread.getState().messages.at(-1)?.id ?? null;
|
|
558
|
-
aui.thread.resumeRun({ parentId });
|
|
559
|
-
}
|
|
560
|
-
})();
|
|
561
|
-
}, [aui, threadId]);
|
|
562
|
-
}
|
|
563
|
-
```
|
|
564
|
-
|
|
565
|
-
For `AssistantTransport`, do not pass a `stream` parameter; the runtime uses the configured `resumeApi`.
|
|
566
|
-
|
|
567
|
-
## Accessing runtime state
|
|
568
|
-
|
|
569
|
-
`useAssistantTransportState` reads the current agent state from any component:
|
|
570
|
-
|
|
571
|
-
```ts
|
|
572
|
-
import { useAssistantTransportState } from "@assistant-ui/react";
|
|
573
|
-
|
|
574
|
-
function MyComponent() {
|
|
575
|
-
const state = useAssistantTransportState();
|
|
576
|
-
return <div>{JSON.stringify(state)}</div>;
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
function MessageCount() {
|
|
580
|
-
const messages = useAssistantTransportState((state) => state.messages);
|
|
581
|
-
return <div>Message count: {messages.length}</div>;
|
|
582
|
-
}
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
### Type safety
|
|
586
|
-
|
|
587
|
-
Augment the module to type your agent state:
|
|
588
|
-
|
|
589
|
-
```ts title="assistant.config.ts"
|
|
590
|
-
import "@assistant-ui/react";
|
|
591
|
-
|
|
592
|
-
declare module "@assistant-ui/react" {
|
|
593
|
-
namespace Assistant {
|
|
594
|
-
interface ExternalState {
|
|
595
|
-
myState: {
|
|
596
|
-
messages: Message[];
|
|
597
|
-
customField: string;
|
|
598
|
-
};
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
```
|
|
603
|
-
|
|
604
|
-
Place this file anywhere in your project; TypeScript picks it up via module resolution. `useAssistantTransportState` becomes fully typed.
|
|
605
|
-
|
|
606
|
-
### Accessing the original message
|
|
607
|
-
|
|
608
|
-
If you used `createMessageConverter`, retrieve the original message from any assistant-ui state:
|
|
609
|
-
|
|
610
|
-
```ts
|
|
611
|
-
import { useAuiState } from "@assistant-ui/react";
|
|
612
|
-
|
|
613
|
-
function MyMessageComponent() {
|
|
614
|
-
const message = useAuiState((s) => s.message);
|
|
615
|
-
const original = messageConverter.toOriginalMessage(message);
|
|
616
|
-
return <div>{original.yourCustomField}</div>;
|
|
617
|
-
}
|
|
618
|
-
```
|
|
619
|
-
|
|
620
|
-
`toOriginalMessages` returns all source messages when a `ThreadMessage` was created from multiple sources.
|
|
621
|
-
|
|
622
|
-
## Frontend reference implementation
|
|
623
|
-
|
|
624
|
-
```tsx
|
|
625
|
-
"use client";
|
|
626
|
-
|
|
627
|
-
import {
|
|
628
|
-
AssistantRuntimeProvider,
|
|
629
|
-
AssistantTransportConnectionMetadata,
|
|
630
|
-
useAssistantTransportRuntime,
|
|
631
|
-
} from "@assistant-ui/react";
|
|
632
|
-
|
|
633
|
-
type State = { messages: Message[] };
|
|
634
|
-
|
|
635
|
-
const converter = (
|
|
636
|
-
state: State,
|
|
637
|
-
connectionMetadata: AssistantTransportConnectionMetadata,
|
|
638
|
-
) => {
|
|
639
|
-
const optimistic = connectionMetadata.pendingCommands
|
|
640
|
-
.filter((c) => c.type === "add-message")
|
|
641
|
-
.map((c) => c.message);
|
|
642
|
-
|
|
643
|
-
return {
|
|
644
|
-
messages: [...state.messages, ...optimistic],
|
|
645
|
-
isRunning: connectionMetadata.isSending || false,
|
|
646
|
-
};
|
|
647
|
-
};
|
|
648
|
-
|
|
649
|
-
export function MyRuntimeProvider({ children }) {
|
|
650
|
-
const runtime = useAssistantTransportRuntime({
|
|
651
|
-
initialState: { messages: [] },
|
|
652
|
-
api: "http://localhost:8010/assistant",
|
|
653
|
-
converter,
|
|
654
|
-
headers: async () => ({ Authorization: "Bearer token" }),
|
|
655
|
-
body: { "custom-field": "custom-value" },
|
|
656
|
-
onError: (error, { commands, updateState }) => {
|
|
657
|
-
updateState((s) => ({ ...s, lastError: error.message }));
|
|
658
|
-
},
|
|
659
|
-
onCancel: ({ commands, updateState }) => {
|
|
660
|
-
updateState((s) => ({ ...s, status: "cancelled" }));
|
|
661
|
-
},
|
|
662
|
-
});
|
|
663
|
-
|
|
664
|
-
return (
|
|
665
|
-
<AssistantRuntimeProvider runtime={runtime}>
|
|
666
|
-
{children}
|
|
667
|
-
</AssistantRuntimeProvider>
|
|
668
|
-
);
|
|
669
|
-
}
|
|
670
|
-
```
|
|
671
|
-
|
|
672
|
-
Full example: [`examples/with-assistant-transport`](https://github.com/assistant-ui/assistant-ui/tree/main/examples/with-assistant-transport). A LangChain variant lives in the same examples directory.
|
|
673
|
-
|
|
674
|
-
## Custom commands
|
|
675
|
-
|
|
676
|
-
### Define
|
|
677
|
-
|
|
678
|
-
```ts title="assistant.config.ts"
|
|
679
|
-
import "@assistant-ui/react";
|
|
680
|
-
|
|
681
|
-
declare module "@assistant-ui/react" {
|
|
682
|
-
namespace Assistant {
|
|
683
|
-
interface Commands {
|
|
684
|
-
myCustomCommand: {
|
|
685
|
-
type: "my-custom-command";
|
|
686
|
-
data: string;
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
```
|
|
692
|
-
|
|
693
|
-
### Issue
|
|
694
|
-
|
|
695
|
-
```ts
|
|
696
|
-
import { useAssistantTransportSendCommand } from "@assistant-ui/react";
|
|
697
|
-
|
|
698
|
-
function MyComponent() {
|
|
699
|
-
const sendCommand = useAssistantTransportSendCommand();
|
|
700
|
-
return (
|
|
701
|
-
<button
|
|
702
|
-
onClick={() => sendCommand({ type: "my-custom-command", data: "hello" })}
|
|
703
|
-
>
|
|
704
|
-
Send
|
|
705
|
-
</button>
|
|
706
|
-
);
|
|
707
|
-
}
|
|
708
|
-
```
|
|
709
|
-
|
|
710
|
-
### Handle on the backend
|
|
711
|
-
|
|
712
|
-
```python
|
|
713
|
-
for command in request.commands:
|
|
714
|
-
if command.type == "my-custom-command":
|
|
715
|
-
data = command.data
|
|
716
|
-
```
|
|
717
|
-
|
|
718
|
-
### Optimistic updates
|
|
719
|
-
|
|
720
|
-
```ts
|
|
721
|
-
const converter = (state: State, connectionMetadata: ConnectionMetadata) => {
|
|
722
|
-
const customCommands = connectionMetadata.pendingCommands.filter(
|
|
723
|
-
(c) => c.type === "my-custom-command",
|
|
724
|
-
);
|
|
725
|
-
return {
|
|
726
|
-
messages: state.messages,
|
|
727
|
-
state: { ...state, customData: customCommands.map((c) => c.data) },
|
|
728
|
-
isRunning: connectionMetadata.isSending || false,
|
|
729
|
-
};
|
|
730
|
-
};
|
|
731
|
-
```
|
|
732
|
-
|
|
733
|
-
Custom commands follow the same lifecycle as built-in ones; check for them in `onError` and `onCancel` if needed.
|
|
734
|
-
|
|
735
|
-
## Adapter support
|
|
736
|
-
|
|
737
|
-
| Adapter | Supported via |
|
|
738
|
-
| --- | --- |
|
|
739
|
-
| Attachments | `adapters.attachments` |
|
|
740
|
-
| History | `adapters.history` |
|
|
741
|
-
| threadList | Via [thread list adapter](/docs/runtimes/concepts/threads) |
|
|
742
|
-
|
|
743
|
-
Speech, dictation, feedback, and suggestions are not currently exposed by `AssistantTransport`. Drop down to `ExternalStoreRuntime` if you need them.
|
|
744
|
-
|
|
745
|
-
## Related
|
|
746
|
-
|
|
747
|
-
<Cards>
|
|
748
|
-
<Card
|
|
749
|
-
title="ExternalStoreRuntime"
|
|
750
|
-
description="The core runtime AssistantTransport is built on."
|
|
751
|
-
href="/docs/runtimes/custom/external-store"
|
|
752
|
-
/>
|
|
753
|
-
<Card
|
|
754
|
-
title="Data Stream"
|
|
755
|
-
description="Message-streaming protocol on top of LocalRuntime."
|
|
756
|
-
href="/docs/runtimes/custom/data-stream"
|
|
757
|
-
/>
|
|
758
|
-
<Card
|
|
759
|
-
title="Adapters"
|
|
760
|
-
description="Attachments, history, and the rest of the shared adapter contracts."
|
|
761
|
-
href="/docs/runtimes/concepts/adapters"
|
|
762
|
-
/>
|
|
763
|
-
</Cards>
|