@assistant-ui/mcp-docs-server 0.1.36 → 0.1.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.docs/organized/code-examples/waterfall.md +8 -9
- package/.docs/organized/code-examples/with-a2a.md +16 -11
- package/.docs/organized/code-examples/with-ag-ui.md +16 -11
- package/.docs/organized/code-examples/{with-ai-sdk-v6.md → with-ai-sdk-v7.md} +32 -21
- package/.docs/organized/code-examples/with-artifacts.md +17 -10
- package/.docs/organized/code-examples/with-assistant-transport.md +15 -8
- package/.docs/organized/code-examples/with-browser-extension.md +15 -8
- package/.docs/organized/code-examples/with-chain-of-thought.md +17 -10
- package/.docs/organized/code-examples/with-cloud-standalone.md +10 -9
- package/.docs/organized/code-examples/with-cloud.md +18 -13
- package/.docs/organized/code-examples/with-custom-thread-list.md +17 -10
- package/.docs/organized/code-examples/with-elevenlabs-conversational.md +20 -13
- package/.docs/organized/code-examples/with-elevenlabs-scribe.md +20 -13
- package/.docs/organized/code-examples/with-eve.md +16 -9
- package/.docs/organized/code-examples/with-expo.md +26 -23
- package/.docs/organized/code-examples/with-external-store.md +16 -11
- package/.docs/organized/code-examples/with-ffmpeg.md +18 -13
- package/.docs/organized/code-examples/with-generative-ui.md +20 -15
- package/.docs/organized/code-examples/with-google-adk.md +16 -9
- package/.docs/organized/code-examples/with-heat-graph.md +8 -9
- package/.docs/organized/code-examples/with-image-generation.md +17 -10
- package/.docs/organized/code-examples/with-interactables.md +19 -15
- package/.docs/organized/code-examples/with-langchain.md +17 -10
- package/.docs/organized/code-examples/with-langgraph.md +17 -10
- package/.docs/organized/code-examples/with-livekit.md +21 -14
- package/.docs/organized/code-examples/with-mcp.md +40 -18
- package/.docs/organized/code-examples/with-opencode.md +22 -17
- package/.docs/organized/code-examples/with-pi.md +47 -12
- package/.docs/organized/code-examples/with-react-hook-form.md +19 -14
- package/.docs/organized/code-examples/with-react-ink-web.md +6 -6
- package/.docs/organized/code-examples/with-react-ink.md +2 -2
- package/.docs/organized/code-examples/with-react-router.md +20 -15
- package/.docs/organized/code-examples/with-resumable-stream.md +19 -12
- package/.docs/organized/code-examples/with-store.md +8 -9
- package/.docs/organized/code-examples/with-tanstack.md +17 -11
- package/.docs/organized/code-examples/with-tap-runtime.md +16 -11
- package/.docs/organized/code-examples/with-virtualized-thread.md +17 -12
- package/.docs/raw/docs/(docs)/base-ui.mdx +39 -0
- package/.docs/raw/docs/(docs)/cli.mdx +18 -2
- package/.docs/raw/docs/(docs)/installation.mdx +15 -1
- package/.docs/raw/docs/(docs)/rtl.mdx +2 -4
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/actions.mdx +56 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/components.mdx +86 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/index.mdx +19 -1
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/json-generative-ui.mdx +42 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/rendering.mdx +53 -2
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/slack.mdx +81 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/teams.mdx +86 -0
- package/.docs/raw/docs/(reference)/api-reference/generative-ui/tokens.mdx +62 -0
- package/.docs/raw/docs/(reference)/api-reference/integrations/index.mdx +4 -1
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-ai-sdk.mdx +4 -2
- package/.docs/raw/docs/(reference)/api-reference/integrations/react-data-stream.mdx +37 -0
- package/.docs/raw/docs/(reference)/api-reference/overview.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/assistant-if.mdx +29 -29
- package/.docs/raw/docs/(reference)/api-reference/primitives/composition.mdx +1 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/index.mdx +3 -0
- package/.docs/raw/docs/(reference)/api-reference/primitives/selection-toolbar.mdx +2 -0
- package/.docs/raw/docs/(reference)/api-reference/tools/status.mdx +0 -2
- package/.docs/raw/docs/(reference)/api-reference/tools/toolkits.mdx +12 -9
- package/.docs/raw/docs/(reference)/api-reference/utilities/miscellaneous.mdx +4 -0
- package/.docs/raw/docs/cloud/ai-sdk-assistant-ui.mdx +7 -1
- package/.docs/raw/docs/cloud/langgraph.mdx +4 -2
- package/.docs/raw/docs/guides/chatgpt-subscription.mdx +108 -0
- package/.docs/raw/docs/guides/dictation.mdx +185 -257
- package/.docs/raw/docs/guides/index.mdx +10 -0
- package/.docs/raw/docs/guides/mentions.mdx +31 -3
- package/.docs/raw/docs/guides/resumable-streams.mdx +12 -1
- package/.docs/raw/docs/guides/speech.mdx +47 -29
- package/.docs/raw/docs/guides/suggestions.mdx +70 -1
- package/.docs/raw/docs/guides/voice.mdx +197 -267
- package/.docs/raw/docs/ink/primitives.mdx +35 -1
- package/.docs/raw/docs/integrations/frameworks/ai-sdk.mdx +13 -7
- package/.docs/raw/docs/integrations/frameworks/cloudflare-agents/overview.mdx +3 -3
- package/.docs/raw/docs/integrations/frameworks/mastra/full-stack.mdx +1 -1
- package/.docs/raw/docs/integrations/frameworks/mastra/overview.mdx +3 -3
- package/.docs/raw/docs/integrations/frameworks/mastra/separate-server.mdx +1 -1
- package/.docs/raw/docs/integrations/gateways/index.mdx +2 -2
- package/.docs/raw/docs/integrations/index.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/helicone.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/langfuse.mdx +1 -1
- package/.docs/raw/docs/integrations/observability/langsmith.mdx +3 -3
- package/.docs/raw/docs/migrations/index.mdx +50 -0
- package/.docs/raw/docs/migrations/react-langgraph-v0-7.mdx +2 -2
- package/.docs/raw/docs/migrations/toolkit-tools.mdx +4 -2
- package/.docs/raw/docs/primitives/chain-of-thought.mdx +6 -1
- package/.docs/raw/docs/primitives/composer.mdx +16 -0
- package/.docs/raw/docs/primitives/selection-toolbar.mdx +25 -0
- package/.docs/raw/docs/primitives/thread-list.mdx +30 -6
- package/.docs/raw/docs/react-native/primitives.mdx +23 -0
- package/.docs/raw/docs/runtimes/a2a/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/ag-ui/agent-state.mdx +124 -0
- package/.docs/raw/docs/runtimes/ag-ui/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/ag-ui/runtime-options.mdx +13 -2
- package/.docs/raw/docs/runtimes/ai-sdk/overview.mdx +13 -4
- package/.docs/raw/docs/runtimes/ai-sdk/v4-legacy.mdx +11 -11
- package/.docs/raw/docs/runtimes/ai-sdk/v5-legacy.mdx +5 -5
- package/.docs/raw/docs/runtimes/ai-sdk/{v6.mdx → v6-legacy.mdx} +8 -6
- package/.docs/raw/docs/runtimes/ai-sdk/v7.mdx +717 -0
- package/.docs/raw/docs/runtimes/concepts/adapters.mdx +1 -1
- package/.docs/raw/docs/runtimes/concepts/architecture.mdx +1 -1
- package/.docs/raw/docs/runtimes/custom/data-stream.mdx +10 -19
- package/.docs/raw/docs/runtimes/custom/external-store.mdx +1 -1
- package/.docs/raw/docs/runtimes/custom/local-runtime.mdx +2 -0
- package/.docs/raw/docs/runtimes/eve/overview.mdx +1 -1
- package/.docs/raw/docs/runtimes/google-adk/quickstart.mdx +1 -1
- package/.docs/raw/docs/runtimes/langchain.mdx +2 -2
- package/.docs/raw/docs/runtimes/langgraph/agent-state.mdx +181 -0
- package/.docs/raw/docs/runtimes/opencode/hooks.mdx +1 -1
- package/.docs/raw/docs/tools/backend.mdx +6 -3
- package/.docs/raw/docs/tools/defining-tools.mdx +12 -1
- package/.docs/raw/docs/tools/generative-ui.mdx +95 -0
- package/.docs/raw/docs/tools/mcp-apps.mdx +37 -10
- package/.docs/raw/docs/tools/mcp.mdx +105 -3
- package/.docs/raw/docs/tools/tool-ui.mdx +6 -4
- package/.docs/raw/docs/tools/user-managed-mcp.mdx +41 -4
- package/.docs/raw/docs/ui/accordion.mdx +16 -10
- package/.docs/raw/docs/ui/assistant-modal.mdx +8 -4
- package/.docs/raw/docs/ui/attachment.mdx +5 -1
- package/.docs/raw/docs/ui/badge.mdx +23 -12
- package/.docs/raw/docs/ui/follow-up-suggestions.mdx +80 -0
- package/.docs/raw/docs/ui/model-selector.mdx +69 -6
- package/.docs/raw/docs/ui/select.mdx +22 -14
- package/.docs/raw/docs/ui/sources.mdx +1 -1
- package/.docs/raw/docs/ui/tabs.mdx +25 -14
- package/.docs/raw/docs/utilities/heat-graph.mdx +2 -2
- package/README.md +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -1
- package/dist/prepare-docs/code-examples.d.ts.map +1 -1
- package/dist/prepare-docs/copy-raw.d.ts.map +1 -1
- package/dist/prepare-docs/copy-raw.js +0 -4
- package/dist/prepare-docs/copy-raw.js.map +1 -1
- package/dist/prompts/xulux-playground.d.ts +12 -0
- package/dist/prompts/xulux-playground.d.ts.map +1 -0
- package/dist/prompts/xulux-playground.js +33 -0
- package/dist/prompts/xulux-playground.js.map +1 -0
- package/dist/tools/docs.d.ts +2 -4
- package/dist/tools/docs.d.ts.map +1 -1
- package/dist/tools/docs.js +38 -10
- package/dist/tools/docs.js.map +1 -1
- package/dist/tools/examples.d.ts +5 -5
- package/dist/tools/examples.d.ts.map +1 -1
- package/dist/tools/examples.js +10 -7
- package/dist/tools/examples.js.map +1 -1
- package/dist/tools/resources.d.ts +6 -0
- package/dist/tools/resources.d.ts.map +1 -0
- package/dist/tools/resources.js +74 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/search.d.ts +30 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +39 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tests/test-setup.d.ts.map +1 -1
- package/dist/tools/tests/test-setup.js +7 -1
- package/dist/tools/tests/test-setup.js.map +1 -1
- package/dist/tools/xulux-templates.d.ts +72 -0
- package/dist/tools/xulux-templates.d.ts.map +1 -0
- package/dist/tools/xulux-templates.js +82 -0
- package/dist/tools/xulux-templates.js.map +1 -0
- package/dist/utils/cache.d.ts +5 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +18 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/mcp-format.d.ts +1 -0
- package/dist/utils/mcp-format.d.ts.map +1 -1
- package/dist/utils/mcp-format.js +7 -4
- package/dist/utils/mcp-format.js.map +1 -1
- package/dist/utils/mdx.d.ts +2 -1
- package/dist/utils/mdx.d.ts.map +1 -1
- package/dist/utils/mdx.js +19 -2
- package/dist/utils/mdx.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +20 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/search.d.ts +10 -0
- package/dist/utils/search.d.ts.map +1 -0
- package/dist/utils/search.js +97 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/security.d.ts.map +1 -1
- package/dist/xulux/catalog-client.d.ts +14 -0
- package/dist/xulux/catalog-client.d.ts.map +1 -0
- package/dist/xulux/catalog-client.js +67 -0
- package/dist/xulux/catalog-client.js.map +1 -0
- package/dist/xulux/fallback-catalog.d.ts +7 -0
- package/dist/xulux/fallback-catalog.d.ts.map +1 -0
- package/dist/xulux/fallback-catalog.js +47 -0
- package/dist/xulux/fallback-catalog.js.map +1 -0
- package/dist/xulux/fetch-sandbox.d.ts +5 -0
- package/dist/xulux/fetch-sandbox.d.ts.map +1 -0
- package/dist/xulux/fetch-sandbox.js +40 -0
- package/dist/xulux/fetch-sandbox.js.map +1 -0
- package/dist/xulux/template-service.d.ts +84 -0
- package/dist/xulux/template-service.d.ts.map +1 -0
- package/dist/xulux/template-service.js +223 -0
- package/dist/xulux/template-service.js.map +1 -0
- package/dist/xulux/types.d.ts +55 -0
- package/dist/xulux/types.d.ts.map +1 -0
- package/dist/xulux/types.js +6 -0
- package/dist/xulux/types.js.map +1 -0
- package/package.json +5 -5
- package/src/constants.ts +2 -0
- package/src/index.ts +67 -0
- package/src/prepare-docs/copy-raw.ts +0 -5
- package/src/prompts/xulux-playground.ts +36 -0
- package/src/tools/docs.ts +52 -4
- package/src/tools/examples.ts +18 -11
- package/src/tools/resources.ts +114 -0
- package/src/tools/search.ts +46 -0
- package/src/tools/tests/completions.test.ts +46 -0
- package/src/tools/tests/directory-size-cap.test.ts +50 -0
- package/src/tools/tests/docs.test.ts +20 -0
- package/src/tools/tests/examples.test.ts +5 -5
- package/src/tools/tests/listings-cache.test.ts +19 -0
- package/src/tools/tests/mcp-protocol.test.ts +92 -1
- package/src/tools/tests/resources.test.ts +102 -0
- package/src/tools/tests/search.test.ts +37 -0
- package/src/tools/tests/test-setup.ts +10 -0
- package/src/tools/tests/xulux-templates.test.ts +262 -0
- package/src/tools/xulux-templates.ts +141 -0
- package/src/utils/cache.ts +20 -0
- package/src/utils/mcp-format.ts +8 -6
- package/src/utils/mdx.ts +21 -1
- package/src/utils/paths.ts +25 -0
- package/src/utils/search.ts +131 -0
- package/src/utils/tests/cache.test.ts +51 -0
- package/src/utils/tests/mcp-format.test.ts +22 -0
- package/src/utils/tests/security.test.ts +1 -1
- package/src/xulux/catalog-client.ts +105 -0
- package/src/xulux/fallback-catalog.ts +63 -0
- package/src/xulux/fetch-sandbox.ts +56 -0
- package/src/xulux/template-service.ts +406 -0
- package/src/xulux/types.ts +60 -0
- package/.docs/raw/blog/2024-07-29-hello/index.mdx +0 -64
- package/.docs/raw/blog/2024-09-11/index.mdx +0 -10
- package/.docs/raw/blog/2024-12-15/index.mdx +0 -10
- package/.docs/raw/blog/2025-01-31-changelog/index.mdx +0 -127
- package/.docs/raw/blog/2026-03-launch-week/index.mdx +0 -258
- package/.docs/raw/docs/(reference)/api-reference/hooks/utilities.mdx +0 -464
|
@@ -9,14 +9,14 @@ import { VercelIcon } from "@/components/icons/vercel";
|
|
|
9
9
|
[Cloudflare Agents](https://developers.cloudflare.com/agents/) is Cloudflare's framework for stateful AI agents that run on Durable Objects at the edge. Each agent owns its own SQLite-backed message history, exposes a WebSocket channel for low-latency streaming, and can call tools (server-side or client-side).
|
|
10
10
|
|
|
11
11
|
<Callout type="info">
|
|
12
|
-
This is an integration guide, not a runtime adapter. assistant-ui does not ship a `@assistant-ui/react-cloudflare-agents` package. `@cloudflare/ai-chat`'s `useAgentChat` returns a structural extension of the AI SDK's `useChat`, so the existing [AI SDK runtime](/docs/runtimes/ai-sdk/
|
|
12
|
+
This is an integration guide, not a runtime adapter. assistant-ui does not ship a `@assistant-ui/react-cloudflare-agents` package. `@cloudflare/ai-chat`'s `useAgentChat` returns a structural extension of the AI SDK's `useChat`, so the existing [AI SDK runtime](/docs/runtimes/ai-sdk/v7) consumes it directly.
|
|
13
13
|
</Callout>
|
|
14
14
|
|
|
15
15
|
## Architecture
|
|
16
16
|
|
|
17
17
|
Cloudflare Agents handles the server half: a Durable Object subclasses `AIChatAgent` from `@cloudflare/ai-chat`, owns the message history, and streams responses back over a WebSocket. `@cloudflare/ai-chat/react`'s `useAgentChat` hook wraps that WebSocket and exposes the same `messages`, `sendMessage`, `regenerate`, `status`, `stop`, `setMessages`, `addToolOutput` surface that the AI SDK's `useChat` does, plus a few Cloudflare-specific extras (`clearHistory`, `isServerStreaming`, `isToolContinuation`).
|
|
18
18
|
|
|
19
|
-
assistant-ui handles the client half. `useAISDKRuntime` from [`@assistant-ui/react-ai-sdk`](/docs/runtimes/ai-sdk/
|
|
19
|
+
assistant-ui handles the client half. `useAISDKRuntime` from [`@assistant-ui/react-ai-sdk`](/docs/runtimes/ai-sdk/v7) reads exactly those AI SDK methods off whatever you pass in, so feeding it `useAgentChat`'s return value yields a fully-featured runtime: streaming, tool calling, edit, reload, history import and export, attachments, suggestions.
|
|
20
20
|
|
|
21
21
|
Shared adapters (attachments, speech, feedback, history) work the same way as described in [adapters](/docs/runtimes/concepts/adapters). Multi-thread support needs a [custom thread list](/docs/runtimes/concepts/threads) wired around `useAISDKRuntime`; [AssistantCloud](/docs/cloud) integrates via `useChatRuntime` (which constructs its own `useChat` internally) and is not compatible with the `useAgentChat` wiring shown here.
|
|
22
22
|
|
|
@@ -277,6 +277,6 @@ Destructure these alongside `chat` and pass them into your UI directly; they don
|
|
|
277
277
|
icon={<VercelIcon width={20} height={20} />}
|
|
278
278
|
title="AI SDK runtime"
|
|
279
279
|
description="The runtime that handles the client side of this integration."
|
|
280
|
-
href="/docs/runtimes/ai-sdk/
|
|
280
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
281
281
|
/>
|
|
282
282
|
</Cards>
|
|
@@ -183,6 +183,6 @@ Open `http://localhost:3000`, send a message like *"What can I make with eggs an
|
|
|
183
183
|
icon={<VercelIcon width={20} height={20} />}
|
|
184
184
|
title="AI SDK runtime"
|
|
185
185
|
description="The runtime that handles the client side of this integration."
|
|
186
|
-
href="/docs/runtimes/ai-sdk/
|
|
186
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
187
187
|
/>
|
|
188
188
|
</Cards>
|
|
@@ -9,7 +9,7 @@ import { VercelIcon } from "@/components/icons/vercel";
|
|
|
9
9
|
[Mastra](https://mastra.ai/) is an open-source TypeScript agent framework. It provides primitives for AI applications: agents with memory and tool calling, deterministic LLM workflows, RAG, model routing, workflow graphs, and automated evals.
|
|
10
10
|
|
|
11
11
|
<Callout type="info">
|
|
12
|
-
This is an integration guide, not a runtime adapter. assistant-ui does not ship a `@assistant-ui/react-mastra` package. You wire up Mastra through the standard [AI SDK runtime](/docs/runtimes/ai-sdk/
|
|
12
|
+
This is an integration guide, not a runtime adapter. assistant-ui does not ship a `@assistant-ui/react-mastra` package. You wire up Mastra through the standard [AI SDK runtime](/docs/runtimes/ai-sdk/v7) by routing your API endpoint through Mastra's agent stream.
|
|
13
13
|
</Callout>
|
|
14
14
|
|
|
15
15
|
## Pick a pattern
|
|
@@ -19,7 +19,7 @@ This is an integration guide, not a runtime adapter. assistant-ui does not ship
|
|
|
19
19
|
| [Full-stack](/docs/integrations/frameworks/mastra/full-stack) | One Next.js app: API routes call Mastra in-process. Simpler deployment, single repo. |
|
|
20
20
|
| [Separate server](/docs/integrations/frameworks/mastra/separate-server) | Mastra runs as its own service; the Next.js frontend hits its API. Independent scaling, clearer separation of concerns. |
|
|
21
21
|
|
|
22
|
-
Both use the same client-side `useChatRuntime` from [`@assistant-ui/react-ai-sdk`](/docs/runtimes/ai-sdk/
|
|
22
|
+
Both use the same client-side `useChatRuntime` from [`@assistant-ui/react-ai-sdk`](/docs/runtimes/ai-sdk/v7). The only difference is where the Mastra agent lives.
|
|
23
23
|
|
|
24
24
|
## Architecture
|
|
25
25
|
|
|
@@ -52,6 +52,6 @@ Shared adapters (attachments, speech, feedback, history) work the same way descr
|
|
|
52
52
|
icon={<VercelIcon width={20} height={20} />}
|
|
53
53
|
title="AI SDK runtime"
|
|
54
54
|
description="The runtime that handles the client side of this integration."
|
|
55
|
-
href="/docs/runtimes/ai-sdk/
|
|
55
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
56
56
|
/>
|
|
57
57
|
</Cards>
|
|
@@ -196,6 +196,6 @@ Open `http://localhost:3000`, send a message, and confirm:
|
|
|
196
196
|
icon={<VercelIcon width={20} height={20} />}
|
|
197
197
|
title="AI SDK runtime"
|
|
198
198
|
description="The runtime that handles the client side of this integration."
|
|
199
|
-
href="/docs/runtimes/ai-sdk/
|
|
199
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
200
200
|
/>
|
|
201
201
|
</Cards>
|
|
@@ -8,7 +8,7 @@ import { VercelIcon } from "@/components/icons/vercel";
|
|
|
8
8
|
|
|
9
9
|
LLM gateways sit between your route handler and the upstream provider. They give you a single endpoint that fronts many providers, plus features like multi-provider fallback, prompt caching, and BYOK (bring-your-own-key) flows. Most are OpenAI API-compatible, so the integration is a `baseURL` swap on `createOpenAI` from `@ai-sdk/openai`.
|
|
10
10
|
|
|
11
|
-
For pure observability (proxy that logs every call) see [Helicone](/docs/integrations/observability/helicone). The gateways here overlap in spirit but are positioned around routing rather than logging.
|
|
11
|
+
For pure observability (proxy that logs every call) see [Helicone](/docs/integrations/observability/helicone). The gateways here overlap in spirit but are positioned around routing rather than logging. For local personal projects there is also a keyless option in the same `baseURL`-swap shape: a local OAuth proxy billed to your ChatGPT subscription; see [ChatGPT Subscription](/docs/guides/chatgpt-subscription).
|
|
12
12
|
|
|
13
13
|
## Compare
|
|
14
14
|
|
|
@@ -157,6 +157,6 @@ When to pick: self-host requirement, BYOK metering for end-users, or unified bil
|
|
|
157
157
|
icon={<VercelIcon width={20} height={20} />}
|
|
158
158
|
title="AI SDK runtime"
|
|
159
159
|
description="The runtime that ferries gateway responses to the chat UI."
|
|
160
|
-
href="/docs/runtimes/ai-sdk/
|
|
160
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
161
161
|
/>
|
|
162
162
|
</Cards>
|
|
@@ -158,7 +158,7 @@ Upload chat attachments to object storage instead of inlining as data URLs.
|
|
|
158
158
|
assistant-ui doesn't ship a guide for every tool, but most fit one of two patterns:
|
|
159
159
|
|
|
160
160
|
- **Routes through your AI SDK handler** (agent frameworks, observability proxies, gateways): adapt the [Mastra full-stack](/docs/integrations/frameworks/mastra/full-stack) or [Helicone proxy](/docs/integrations/observability/helicone) pattern using the service's own SDK.
|
|
161
|
-
- **Replaces the runtime entirely** (custom backends): see [custom backend](/docs/runtimes/custom).
|
|
161
|
+
- **Replaces the runtime entirely** (custom backends): see [custom backend](/docs/runtimes/custom/overview).
|
|
162
162
|
|
|
163
163
|
If you build something useful, [open an issue](https://github.com/assistant-ui/assistant-ui/issues) or post in [Discord](https://discord.gg/S9dwgCNEFs); the docs are open to contributions.
|
|
164
164
|
|
|
@@ -124,6 +124,6 @@ If nothing appears, check the request in your network tab. The host should be `o
|
|
|
124
124
|
icon={<VercelIcon width={20} height={20} />}
|
|
125
125
|
title="AI SDK runtime"
|
|
126
126
|
description="The most common pairing: AI SDK route handler proxied through Helicone."
|
|
127
|
-
href="/docs/runtimes/ai-sdk/
|
|
127
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
128
128
|
/>
|
|
129
129
|
</Cards>
|
|
@@ -156,6 +156,6 @@ If nothing appears, check the server logs for OTel errors and confirm `LANGFUSE_
|
|
|
156
156
|
icon={<VercelIcon width={20} height={20} />}
|
|
157
157
|
title="AI SDK runtime"
|
|
158
158
|
description="The runtime that emits the telemetry Langfuse consumes."
|
|
159
|
-
href="/docs/runtimes/ai-sdk/
|
|
159
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
160
160
|
/>
|
|
161
161
|
</Cards>
|
|
@@ -9,7 +9,7 @@ import { VercelIcon } from "@/components/icons/vercel";
|
|
|
9
9
|
|
|
10
10
|
[LangSmith](https://www.langchain.com/langsmith) is LangChain's observability and eval platform. If you are already in the LangChain or LangGraph ecosystem, LangSmith is the natural pairing: traces, datasets, prompt versioning, and LLM-as-judge evals share state with the rest of the LangChain stack.
|
|
11
11
|
|
|
12
|
-
This page covers the **AI SDK** path. If you use [`@assistant-ui/react-langgraph`](/docs/runtimes/langgraph), tracing flows through LangGraph Cloud automatically; you only need this guide when your route handler talks to AI SDK directly.
|
|
12
|
+
This page covers the **AI SDK** path. If you use [`@assistant-ui/react-langgraph`](/docs/runtimes/langgraph/overview), tracing flows through LangGraph Cloud automatically; you only need this guide when your route handler talks to AI SDK directly.
|
|
13
13
|
|
|
14
14
|
## How it works
|
|
15
15
|
|
|
@@ -134,7 +134,7 @@ Send a message. The trace should appear in your LangSmith project within seconds
|
|
|
134
134
|
icon={<LangGraphIcon width={20} height={20} className="text-[#1C3C3C] dark:text-[#5b9595]" />}
|
|
135
135
|
title="LangGraph runtime"
|
|
136
136
|
description="If your backend is LangGraph, tracing flows through LangGraph Cloud automatically."
|
|
137
|
-
href="/docs/runtimes/langgraph"
|
|
137
|
+
href="/docs/runtimes/langgraph/overview"
|
|
138
138
|
/>
|
|
139
139
|
<Card
|
|
140
140
|
icon={<LangfuseIcon width={20} height={20} />}
|
|
@@ -146,6 +146,6 @@ Send a message. The trace should appear in your LangSmith project within seconds
|
|
|
146
146
|
icon={<VercelIcon width={20} height={20} />}
|
|
147
147
|
title="AI SDK runtime"
|
|
148
148
|
description="The runtime that ferries traces from the route to the chat UI."
|
|
149
|
-
href="/docs/runtimes/ai-sdk/
|
|
149
|
+
href="/docs/runtimes/ai-sdk/v7"
|
|
150
150
|
/>
|
|
151
151
|
</Cards>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Migration Guides
|
|
3
|
+
description: Upgrade assistant-ui versions and migrate deprecated APIs and integrations.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use these guides when upgrading assistant-ui or moving from APIs that have been deprecated or replaced.
|
|
7
|
+
|
|
8
|
+
## Version upgrades
|
|
9
|
+
|
|
10
|
+
<Cards>
|
|
11
|
+
<Card title="Migration to v0.14" href="/docs/migrations/v0-14">
|
|
12
|
+
Replace APIs removed after v0.11 and v0.12, and migrate primitive
|
|
13
|
+
`components` props to children render functions.
|
|
14
|
+
</Card>
|
|
15
|
+
<Card title="Migration to v0.12" href="/docs/migrations/v0-12">
|
|
16
|
+
Move from individual context hooks to the unified state API.
|
|
17
|
+
</Card>
|
|
18
|
+
<Card title="Migration to v0.11" href="/docs/migrations/v0-11">
|
|
19
|
+
Update code affected by the `ContentPart` to `MessagePart` rename.
|
|
20
|
+
</Card>
|
|
21
|
+
</Cards>
|
|
22
|
+
|
|
23
|
+
## APIs and integrations
|
|
24
|
+
|
|
25
|
+
<Cards>
|
|
26
|
+
<Card title="Migrating Tools to Toolkits" href="/docs/migrations/toolkit-tools">
|
|
27
|
+
Move legacy tool and tool UI registrations to the toolkit API.
|
|
28
|
+
</Card>
|
|
29
|
+
<Card
|
|
30
|
+
title="Migrating to react-langgraph v0.7"
|
|
31
|
+
href="/docs/migrations/react-langgraph-v0-7"
|
|
32
|
+
>
|
|
33
|
+
Upgrade to the simplified LangGraph integration API.
|
|
34
|
+
</Card>
|
|
35
|
+
<Card
|
|
36
|
+
title="Using old React versions"
|
|
37
|
+
href="/docs/migrations/react-compatibility"
|
|
38
|
+
>
|
|
39
|
+
Review compatibility notes for React 18 and React 19.
|
|
40
|
+
</Card>
|
|
41
|
+
</Cards>
|
|
42
|
+
|
|
43
|
+
## Stability
|
|
44
|
+
|
|
45
|
+
<Cards>
|
|
46
|
+
<Card title="Deprecation Policy" href="/docs/migrations/deprecation-policy">
|
|
47
|
+
Review stability guarantees and deprecation timelines for assistant-ui
|
|
48
|
+
features.
|
|
49
|
+
</Card>
|
|
50
|
+
</Cards>
|
|
@@ -323,6 +323,6 @@ export function Provider({ children }) {
|
|
|
323
323
|
## Need Help?
|
|
324
324
|
|
|
325
325
|
If you encounter issues during migration:
|
|
326
|
-
1. Check the updated [LangGraph documentation](/docs/runtimes/langgraph)
|
|
326
|
+
1. Check the updated [LangGraph documentation](/docs/runtimes/langgraph/overview)
|
|
327
327
|
2. Review the [example implementation](https://github.com/assistant-ui/assistant-ui/tree/main/examples/with-langgraph)
|
|
328
|
-
3. Report issues on [GitHub](https://github.com/assistant-ui/assistant-ui/issues)
|
|
328
|
+
3. Report issues on [GitHub](https://github.com/assistant-ui/assistant-ui/issues)
|
|
@@ -32,7 +32,7 @@ const WeatherTool = makeAssistantTool({
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
export function App() {
|
|
35
|
-
const runtime = useChatRuntime(
|
|
35
|
+
const runtime = useChatRuntime();
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
38
|
<AssistantRuntimeProvider runtime={runtime}>
|
|
@@ -80,7 +80,7 @@ import { useChatRuntime } from "@assistant-ui/react-ai-sdk";
|
|
|
80
80
|
import toolkit from "./toolkit";
|
|
81
81
|
|
|
82
82
|
export function App() {
|
|
83
|
-
const runtime = useChatRuntime(
|
|
83
|
+
const runtime = useChatRuntime();
|
|
84
84
|
const aui = useAui({
|
|
85
85
|
tools: Tools({ toolkit }),
|
|
86
86
|
});
|
|
@@ -93,6 +93,8 @@ export function App() {
|
|
|
93
93
|
}
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
`useChatRuntime()` targets `/api/chat` by default. To point at a different endpoint or customize requests, see [Custom transport](/docs/runtimes/ai-sdk/v7#custom-transport).
|
|
97
|
+
|
|
96
98
|
## Mechanical Steps
|
|
97
99
|
|
|
98
100
|
1. Create a `Toolkit` object.
|
|
@@ -5,6 +5,8 @@ platforms: ["react"]
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
import { ChainOfThoughtPrimitiveSample } from "@/components/docs/samples/chain-of-thought-primitive";
|
|
8
|
+
import { ChainOfThoughtPrimitiveSample as ChainOfThoughtPrimitiveSampleRadix } from "@/components/docs/samples/chain-of-thought-primitive.radix";
|
|
9
|
+
import { Flavored } from "@/components/docs/contexts/flavor.server";
|
|
8
10
|
import {
|
|
9
11
|
ChainOfThoughtPrimitive as ChainOfThoughtPrimitiveDocs,
|
|
10
12
|
MessagePrimitive as MessagePrimitiveDocs,
|
|
@@ -18,7 +20,10 @@ For new grouped reasoning/tool-call UI, use `MessagePrimitive.GroupedParts`. `Ch
|
|
|
18
20
|
|
|
19
21
|
<Tabs items={["Preview", "Code"]}>
|
|
20
22
|
<Tab>
|
|
21
|
-
<
|
|
23
|
+
<Flavored
|
|
24
|
+
base={<ChainOfThoughtPrimitiveSample />}
|
|
25
|
+
radix={<ChainOfThoughtPrimitiveSampleRadix />}
|
|
26
|
+
/>
|
|
22
27
|
</Tab>
|
|
23
28
|
<Tab>
|
|
24
29
|
```tsx
|
|
@@ -165,6 +165,22 @@ Form container for message composition. Renders a `<form>` element unless `asChi
|
|
|
165
165
|
</ComposerPrimitive.Root>
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
+
#### Compact Mode
|
|
169
|
+
|
|
170
|
+
Pass `compact` to opt into compact detection. While the input holds at most a single line of text and the composer has no attachments, quote, queued messages, or active dictation, the root renders a `data-compact` attribute. The prop only exposes this attribute for styling — it does not change the layout by itself. Target it with CSS to collapse the composer into a single row:
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
<ComposerPrimitive.Root
|
|
174
|
+
compact
|
|
175
|
+
className="group/composer flex flex-col data-[compact]:flex-row data-[compact]:items-center"
|
|
176
|
+
>
|
|
177
|
+
<ComposerPrimitive.Input placeholder="Ask anything..." />
|
|
178
|
+
<ComposerPrimitive.Send>Send</ComposerPrimitive.Send>
|
|
179
|
+
</ComposerPrimitive.Root>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Once the text wraps onto a second line, the composer expands and stays expanded until the input is cleared, so the layout doesn't oscillate at the wrap boundary.
|
|
183
|
+
|
|
168
184
|
### Input
|
|
169
185
|
|
|
170
186
|
Text input with keyboard shortcuts. Renders a `<textarea>` element unless `asChild` is set.
|
|
@@ -63,6 +63,31 @@ The toolbar only appears when the selection is entirely within a single message.
|
|
|
63
63
|
|
|
64
64
|
`Root` returns `null` when there is no valid selection (collapsed selection, empty text, or no single-message match).
|
|
65
65
|
|
|
66
|
+
### Quote Regions
|
|
67
|
+
|
|
68
|
+
By default, any selected text inside a message can be quoted. For rich messages with tool cards, attachments, or custom controls, add `data-aui-quote-selectable` to the element that contains the message text. Once a message has a quote-selectable region, selections must stay inside the same marked region for the toolbar to appear.
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
<MessagePrimitive.Root>
|
|
72
|
+
<div data-aui-quote-selectable="">
|
|
73
|
+
<MessagePrimitive.Parts />
|
|
74
|
+
</div>
|
|
75
|
+
<ToolCard />
|
|
76
|
+
</MessagePrimitive.Root>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Set `data-aui-quote-selectable="false"` to exclude an element instead: on the message root it disables quoting for the entire message, and inside a quotable region it carves that subtree out. The nearest marker wins, and any value other than `"false"` (including empty) marks a quotable region.
|
|
80
|
+
|
|
81
|
+
Apps know the message role at render time, so a role gate is a conditional attribute:
|
|
82
|
+
|
|
83
|
+
```tsx
|
|
84
|
+
const UserMessage = () => (
|
|
85
|
+
<MessagePrimitive.Root data-aui-quote-selectable="false">
|
|
86
|
+
<MessagePrimitive.Parts />
|
|
87
|
+
</MessagePrimitive.Root>
|
|
88
|
+
);
|
|
89
|
+
```
|
|
90
|
+
|
|
66
91
|
### Quote Action
|
|
67
92
|
|
|
68
93
|
The `Quote` button does two things on click:
|
|
@@ -38,12 +38,12 @@ function MyThreadList() {
|
|
|
38
38
|
|
|
39
39
|
function ThreadListItem() {
|
|
40
40
|
return (
|
|
41
|
-
<ThreadListItemPrimitive.Root className="group flex h-9 items-center rounded-lg hover:bg-muted data-active:bg-muted">
|
|
42
|
-
<ThreadListItemPrimitive.Trigger className="flex-1 truncate px-3 text-sm">
|
|
41
|
+
<ThreadListItemPrimitive.Root className="group relative flex h-9 items-center rounded-lg hover:bg-muted data-active:bg-muted has-focus-visible:bg-muted">
|
|
42
|
+
<ThreadListItemPrimitive.Trigger className="min-w-0 flex-1 truncate px-3 text-sm outline-none">
|
|
43
43
|
<ThreadListItemPrimitive.Title fallback="New Chat" />
|
|
44
44
|
</ThreadListItemPrimitive.Trigger>
|
|
45
|
-
<ThreadListItemMorePrimitive.Root>
|
|
46
|
-
<ThreadListItemMorePrimitive.Trigger className="
|
|
45
|
+
<ThreadListItemMorePrimitive.Root sharedFocusGroup>
|
|
46
|
+
<ThreadListItemMorePrimitive.Trigger className="absolute end-1.5 top-1/2 size-7 -translate-y-1/2 rounded-md opacity-0 group-hover:opacity-100 group-has-focus-visible:opacity-100 data-[state=open]:opacity-100">
|
|
47
47
|
<MoreHorizontalIcon className="size-4" />
|
|
48
48
|
</ThreadListItemMorePrimitive.Trigger>
|
|
49
49
|
<ThreadListItemMorePrimitive.Content className="rounded-md border bg-popover p-1 shadow-md">
|
|
@@ -118,6 +118,21 @@ Both `ThreadListPrimitive.New` and `ThreadListItemPrimitive.Root` get a `data-ac
|
|
|
118
118
|
|
|
119
119
|
The `New` button gets `data-active` when the user is on a fresh, unsaved thread.
|
|
120
120
|
|
|
121
|
+
### Keyboard Navigation
|
|
122
|
+
|
|
123
|
+
Every item stays a native Tab stop, and arrow keys are layered on top. Up/Down move between items and Right focuses an item's `More` button (Left/Right are mirrored in RTL). This is built into the primitives — no prop is required.
|
|
124
|
+
|
|
125
|
+
To fold the `More` menu into the same navigation, opt it in with `sharedFocusGroup`:
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
<ThreadListItemMorePrimitive.Root sharedFocusGroup>
|
|
129
|
+
{/* Right opens the menu from the trigger; Left/Escape close it and
|
|
130
|
+
return focus to the trigger, keeping the highlight continuous. */}
|
|
131
|
+
</ThreadListItemMorePrimitive.Root>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
`sharedFocusGroup` joins the menu to the list's focus group, so its trigger and the open menu act as one keyboard-navigable unit: Right opens it and Left/Escape close it, synchronously restoring focus to the trigger so a `group-has-focus-visible` highlight never flickers. Enabling it forces the menu non-modal, because a focus trap and a shared focus group are mutually exclusive — the trap keeps focus inside the menu, the shared group lets it move out across the boundary. Without `sharedFocusGroup` the menu keeps its standard Radix `DropdownMenu` keyboard behavior (modal by default), so menus you already render are unchanged. Our assistant-ui [thread-list](/docs/ui/thread-list) registry component sets `sharedFocusGroup` for you.
|
|
135
|
+
|
|
121
136
|
### Items Iterator
|
|
122
137
|
|
|
123
138
|
`ThreadListPrimitive.Items` now prefers a children render function, similar to `ThreadPrimitive.Messages`:
|
|
@@ -168,6 +183,15 @@ The canonical pattern composes `ThreadListItemPrimitive.Archive asChild` with `T
|
|
|
168
183
|
|
|
169
184
|
`Archive` provides the click handler and disabled logic. `Item` provides the menu item behavior and styling. `asChild` merges them into a single element.
|
|
170
185
|
|
|
186
|
+
## Accessibility
|
|
187
|
+
|
|
188
|
+
The thread list leans on native button semantics and Radix's `DropdownMenu`; the arrow-key navigation is layered on top as a convenience, not a requirement.
|
|
189
|
+
|
|
190
|
+
- Each `ThreadListItemPrimitive.Trigger` is a native `<button>` and its own Tab stop, so the whole list is reachable with <Kbd>Tab</Kbd> alone. The arrow keys (see [Keyboard Navigation](#keyboard-navigation)) speed traversal up, but nothing depends on them.
|
|
191
|
+
- The item representing the current thread sets `aria-current="true"` (alongside `data-active`) on `ThreadListItemPrimitive.Root`, so assistive tech announces which conversation is open.
|
|
192
|
+
- The `More` trigger exposes `aria-haspopup="menu"`, and its panel is a Radix `role="menu"` with `role="menuitem"` children, so screen readers announce it as a menu and the arrow keys cycle its items.
|
|
193
|
+
- With `sharedFocusGroup`, the `More` menu is non-modal and joins the list's focus group: opening and closing it move focus synchronously between the trigger and the menu, so keyboard focus is never dropped and the `group-has-focus-visible` highlight never flickers. Without it, the menu keeps Radix's default modal focus trap.
|
|
194
|
+
|
|
171
195
|
## Parts
|
|
172
196
|
|
|
173
197
|
### ThreadListPrimitive
|
|
@@ -319,10 +343,10 @@ Button that deletes the current thread item. Renders a `<button>` element unless
|
|
|
319
343
|
|
|
320
344
|
#### Root
|
|
321
345
|
|
|
322
|
-
Root container for the overflow menu primitives.
|
|
346
|
+
Root container for the overflow menu primitives. Pass `sharedFocusGroup` to fold the menu into the list's arrow-key navigation (see [Keyboard Navigation](#keyboard-navigation)); doing so forces it non-modal. Without it the menu honors the `modal` prop, defaulting to modal like Radix's `DropdownMenu`.
|
|
323
347
|
|
|
324
348
|
```tsx
|
|
325
|
-
<ThreadListItemMorePrimitive.Root>
|
|
349
|
+
<ThreadListItemMorePrimitive.Root sharedFocusGroup>
|
|
326
350
|
<ThreadListItemMorePrimitive.Trigger>More</ThreadListItemMorePrimitive.Trigger>
|
|
327
351
|
</ThreadListItemMorePrimitive.Root>
|
|
328
352
|
```
|
|
@@ -362,6 +362,29 @@ Renders message content parts using render-prop functions instead of the compone
|
|
|
362
362
|
| `renderFile` | `(props: { part, index }) => ReactElement` | Renderer for file parts |
|
|
363
363
|
| `renderData` | `(props: { part, index }) => ReactElement` | Fallback renderer for data parts not handled by registered data UIs |
|
|
364
364
|
|
|
365
|
+
#### Rendering Markdown
|
|
366
|
+
|
|
367
|
+
`MessagePrimitive.Content` renders text parts with React Native's `<Text>` by default, so markdown syntax is displayed as plain text. To render markdown, install a React Native markdown renderer and pass it through `renderText`:
|
|
368
|
+
|
|
369
|
+
<InstallCommand npm={["react-native-markdown-display"]} />
|
|
370
|
+
|
|
371
|
+
```tsx
|
|
372
|
+
import Markdown from "react-native-markdown-display";
|
|
373
|
+
import { MessagePrimitive } from "@assistant-ui/react-native";
|
|
374
|
+
|
|
375
|
+
const AssistantMessage = () => {
|
|
376
|
+
return (
|
|
377
|
+
<MessagePrimitive.Root>
|
|
378
|
+
<MessagePrimitive.Content
|
|
379
|
+
renderText={({ part }) => (
|
|
380
|
+
<Markdown>{part.text}</Markdown>
|
|
381
|
+
)}
|
|
382
|
+
/>
|
|
383
|
+
</MessagePrimitive.Root>
|
|
384
|
+
);
|
|
385
|
+
};
|
|
386
|
+
```
|
|
387
|
+
|
|
365
388
|
### MessagePrimitive.Parts
|
|
366
389
|
|
|
367
390
|
Renders message content parts via a `components` prop. Tool call and data parts automatically render registered toolkit renderers and data UIs (via `useAssistantDataUI`), falling back to components provided here. A default `Text` component using React Native's `<Text>` is provided out of the box.
|
|
@@ -3,7 +3,7 @@ title: Quickstart
|
|
|
3
3
|
description: Minimal runtime and Thread setup against an A2A server.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Three steps to a working chat against an A2A server. Assumes you have already installed the package and have an A2A v1.0 server reachable; if not, start at [overview](/docs/runtimes/a2a).
|
|
6
|
+
Three steps to a working chat against an A2A server. Assumes you have already installed the package and have an A2A v1.0 server reachable; if not, start at [overview](/docs/runtimes/a2a/overview).
|
|
7
7
|
|
|
8
8
|
<Steps>
|
|
9
9
|
<Step>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Agent state
|
|
3
|
+
description: Read and optimistically update agent-owned state with useAgUiState and useAgUiSetState over AG-UI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`useAgUiState` mirrors the state your AG-UI agent owns. It updates live while the agent runs. `useAgUiSetState` lets you apply optimistic local updates that are sent with the next run.
|
|
7
|
+
|
|
8
|
+
## Basic usage
|
|
9
|
+
|
|
10
|
+
```tsx
|
|
11
|
+
import { useAgUiState, useAgUiSetState } from "@assistant-ui/react-ag-ui";
|
|
12
|
+
import { useAuiState } from "@assistant-ui/react";
|
|
13
|
+
|
|
14
|
+
type ResearchState = {
|
|
15
|
+
topic: string;
|
|
16
|
+
sources: string[];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const state = useAgUiState<ResearchState>();
|
|
20
|
+
// state: ResearchState | undefined (latest agent state; updates live while the agent runs)
|
|
21
|
+
|
|
22
|
+
const setState = useAgUiSetState<ResearchState>();
|
|
23
|
+
// setState(next | (prev) => next) (optimistic local update; sent with the NEXT run)
|
|
24
|
+
|
|
25
|
+
const isRunning = useAuiState((s) => s.thread.isRunning);
|
|
26
|
+
// isRunning: boolean (whether the thread is currently running)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
Render agent state beside the chat and push an optimistic update from a control in your UI:
|
|
32
|
+
|
|
33
|
+
```tsx
|
|
34
|
+
"use client";
|
|
35
|
+
|
|
36
|
+
import { useAgUiState, useAgUiSetState } from "@assistant-ui/react-ag-ui";
|
|
37
|
+
import { useAuiState } from "@assistant-ui/react";
|
|
38
|
+
import { Thread } from "@/components/assistant-ui/thread";
|
|
39
|
+
|
|
40
|
+
type ResearchState = {
|
|
41
|
+
topic: string;
|
|
42
|
+
sources: string[];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export function ResearchAssistant() {
|
|
46
|
+
const state = useAgUiState<ResearchState>();
|
|
47
|
+
const setState = useAgUiSetState<ResearchState>();
|
|
48
|
+
const isRunning = useAuiState((s) => s.thread.isRunning);
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<div className="flex h-full">
|
|
52
|
+
<aside className="w-72 border-r p-4">
|
|
53
|
+
<h2>Research state</h2>
|
|
54
|
+
{state ? (
|
|
55
|
+
<ul>
|
|
56
|
+
<li>Topic: {state.topic}</li>
|
|
57
|
+
<li>Sources: {state.sources.join(", ") || "none"}</li>
|
|
58
|
+
</ul>
|
|
59
|
+
) : (
|
|
60
|
+
<p>No agent state yet.</p>
|
|
61
|
+
)}
|
|
62
|
+
<button
|
|
63
|
+
type="button"
|
|
64
|
+
disabled={isRunning}
|
|
65
|
+
onClick={() =>
|
|
66
|
+
setState((prev) => ({
|
|
67
|
+
topic: prev?.topic ?? "market analysis",
|
|
68
|
+
sources: [...(prev?.sources ?? []), "sec-filings"],
|
|
69
|
+
}))
|
|
70
|
+
}
|
|
71
|
+
>
|
|
72
|
+
Prefer SEC filings
|
|
73
|
+
</button>
|
|
74
|
+
{isRunning && <p>Agent is running…</p>}
|
|
75
|
+
</aside>
|
|
76
|
+
<main className="flex-1">
|
|
77
|
+
<Thread />
|
|
78
|
+
</main>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The panel re-renders as `STATE_SNAPSHOT` and `STATE_DELTA` events arrive. The button updates the local snapshot immediately; that value is included as the `state` field of the next run input.
|
|
85
|
+
|
|
86
|
+
## How state is synced
|
|
87
|
+
|
|
88
|
+
The AG-UI protocol delivers agent state on the wire:
|
|
89
|
+
|
|
90
|
+
- `STATE_SNAPSHOT` replaces the full client-side snapshot.
|
|
91
|
+
- `STATE_DELTA` applies a JSON Patch to the current snapshot.
|
|
92
|
+
|
|
93
|
+
The runtime applies both client-side, so `useAgUiState` always reflects the latest merged snapshot. Calling the setter from `useAgUiSetState` updates that same local snapshot. On the next run, the runtime automatically includes it as the `state` field of the run input.
|
|
94
|
+
|
|
95
|
+
This works with any AG-UI agent (Mastra, Pydantic AI, CrewAI, LangGraph via AG-UI adapters, and other AG-UI-compliant servers).
|
|
96
|
+
|
|
97
|
+
## Write-back timing
|
|
98
|
+
|
|
99
|
+
`useAgUiSetState` is optimistic and local first. The value reaches the agent only when the next run starts. It is not a live channel into a run that is already in progress. Use it to stage preferences, filters, or other agent-owned fields that the next turn should see.
|
|
100
|
+
|
|
101
|
+
## Relationship to other state
|
|
102
|
+
|
|
103
|
+
Keep the three state layers distinct:
|
|
104
|
+
|
|
105
|
+
- **Your app state** stays yours (React state, URL, a store). assistant-ui does not own it.
|
|
106
|
+
- **`useAuiState`** reads assistant-ui's client state (messages, composer, thread status).
|
|
107
|
+
- **`useAgUiState` / `useAgUiSetState`** mirror state the **agent** owns, synced over the AG-UI wire via snapshots and deltas.
|
|
108
|
+
|
|
109
|
+
Use `useAgUiState` and `useAgUiSetState` for fields your agent maintains as shared state on the protocol. Use `useAuiState` for UI that depends on the chat thread itself. Use your own state for everything else.
|
|
110
|
+
|
|
111
|
+
## Next
|
|
112
|
+
|
|
113
|
+
<Cards>
|
|
114
|
+
<Card
|
|
115
|
+
title="Runtime options"
|
|
116
|
+
description="useAgUiRuntime options, adapters, supported events."
|
|
117
|
+
href="/docs/runtimes/ag-ui/runtime-options"
|
|
118
|
+
/>
|
|
119
|
+
<Card
|
|
120
|
+
title="Quickstart"
|
|
121
|
+
description="Minimal HttpAgent + useAgUiRuntime setup."
|
|
122
|
+
href="/docs/runtimes/ag-ui/quickstart"
|
|
123
|
+
/>
|
|
124
|
+
</Cards>
|
|
@@ -3,7 +3,7 @@ title: Quickstart
|
|
|
3
3
|
description: Minimal HttpAgent + useAgUiRuntime setup against an AG-UI server.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Three steps to a working chat against an AG-UI agent. Assumes you have already installed the package and have an AG-UI server reachable; if not, start at [overview](/docs/runtimes/ag-ui).
|
|
6
|
+
Three steps to a working chat against an AG-UI agent. Assumes you have already installed the package and have an AG-UI server reachable; if not, start at [overview](/docs/runtimes/ag-ui/overview).
|
|
7
7
|
|
|
8
8
|
<Steps>
|
|
9
9
|
<Step>
|
|
@@ -14,6 +14,7 @@ Reference for the runtime's API surface. Start with [quickstart](/docs/runtimes/
|
|
|
14
14
|
| `agent` | `HttpAgent` | An AG-UI client agent (from `@ag-ui/client`). Required. |
|
|
15
15
|
| `logger` | `Partial<Logger>` | Optional logger overrides. The runtime logs event-parser warnings and run lifecycle events. |
|
|
16
16
|
| `showThinking` | `boolean` | Whether to render `THINKING_*` and `REASONING_*` events as visible reasoning. Defaults to `true`. |
|
|
17
|
+
| `autoCancelPendingToolCalls` | `boolean` | Cancel unresolved client-side tool calls automatically when the user sends, edits, or reloads a message. Defaults to `true`. See [below](#auto-cancelling-pending-tool-calls). |
|
|
17
18
|
| `onError` | `(e: Error) => void` | Error callback fired on `RUN_ERROR` events and protocol errors. |
|
|
18
19
|
| `onCancel` | `() => void` | Cancellation callback fired when the user cancels a run. |
|
|
19
20
|
| `adapters` | `UseAgUiRuntimeAdapters` | Standard adapter slots (see below). |
|
|
@@ -70,6 +71,8 @@ time, the same way a live run never stores them.
|
|
|
70
71
|
|
|
71
72
|
An assistant message whose tool call has no matching tool result is reconstructed with `requires-action` status, the same status the runtime derives for a pending tool call, so a reloaded human-in-the-loop call (for example an `ask_user` tool) is actionable rather than stuck. This matches how every other external-store runtime surfaces a pending tool call on reload. The AG-UI wire snapshot carries no run outcome, so a tool call that a successful run intentionally left without a result is also surfaced as actionable.
|
|
72
73
|
|
|
74
|
+
Interrupts are restored when your backend persists them on the assistant message. The AG-UI message body has no interrupt field, so persist the runtime's own `metadata.custom.agui.interrupts` array alongside the message; `fromAgUiMessages` reads it back, reconstructs `requires-action` / `interrupt` status, and re-attaches the metadata, so `getPendingInterrupts`, `useAgUiInterrupts`, and `submitInterruptResponses` work on reload. When both a pending tool call and an interrupt are present on the same message, interrupt status wins. Without the persisted array, interrupt state cannot be reconstructed.
|
|
75
|
+
|
|
73
76
|
## Thread list (experimental)
|
|
74
77
|
|
|
75
78
|
<Callout type="warn">
|
|
@@ -135,7 +138,9 @@ await runtime.unstable_submitInterruptResponses(
|
|
|
135
138
|
|
|
136
139
|
### Steering away from an interrupt
|
|
137
140
|
|
|
138
|
-
When the user ignores the interrupt UI and just sends a new message, use the `useAgUiSteerAway` hook. Every open interrupt defaults to `status: "cancelled"`, the new message is appended, and the run resumes with `resume: ResumeEntry[]` on the wire.
|
|
141
|
+
When the user ignores the interrupt UI and just sends a new message, use the `useAgUiSteerAway` hook. Every open interrupt defaults to `status: "cancelled"`, the new message is appended, and the run resumes with `resume: ResumeEntry[]` on the wire.
|
|
142
|
+
|
|
143
|
+
The same hook also steers away from pending client-side tool calls. When the head assistant message is in `requires-action` with `reason: "tool-calls"` (frontend tools awaiting a result) and the user sends a new message, every unresolved tool call is cancelled with an error result, the message is completed, and a single fresh run starts with those cancellations in its history. Passing `responses` in this case throws, since responses only address interrupts. With nothing pending, `steerAway` behaves like a normal append.
|
|
139
144
|
|
|
140
145
|
```tsx
|
|
141
146
|
const steerAway = useAgUiSteerAway();
|
|
@@ -152,6 +157,12 @@ await steerAway("continue without the file", [
|
|
|
152
157
|
]);
|
|
153
158
|
```
|
|
154
159
|
|
|
160
|
+
### Auto-cancelling pending tool calls
|
|
161
|
+
|
|
162
|
+
By default the runtime does the tool-call half of this automatically: when client-side tool calls are still unresolved and the user sends a new message, edits an earlier one, or reloads, every unresolved tool call receives the same cancellation error result, the assistant message is completed, and the run proceeds with those cancellations in its history. Set `autoCancelPendingToolCalls: false` to opt out, in which case pending tool calls stay unresolved on a plain send and [steering away](#steering-away-from-an-interrupt) remains the explicit way to cancel them.
|
|
163
|
+
|
|
164
|
+
Pending interrupts are never auto-cancelled: sending while an interrupt is open still throws, and the interrupt must be answered with `useAgUiSubmitInterruptResponses` or discarded with `useAgUiSteerAway`.
|
|
165
|
+
|
|
155
166
|
## Supported events
|
|
156
167
|
|
|
157
168
|
The runtime parses the AG-UI event stream and maps each event type to assistant-ui state.
|
|
@@ -199,7 +210,7 @@ The runtime parses the AG-UI event stream and maps each event type to assistant-
|
|
|
199
210
|
icon={<AguiIcon width={20} height={20} />}
|
|
200
211
|
title="AG-UI overview"
|
|
201
212
|
description="What AG-UI is and when to pick it."
|
|
202
|
-
href="/docs/runtimes/ag-ui"
|
|
213
|
+
href="/docs/runtimes/ag-ui/overview"
|
|
203
214
|
/>
|
|
204
215
|
<Card
|
|
205
216
|
title="Quickstart"
|