npx skills add ...
npx skills add assistant-ui/skills --skill update
Upgrades an existing assistant-ui application and applies the migrations needed to reach the current AI SDK v7 and assistant-ui 0.15.x lines. Use when updating, bumping, or migrating @assistant-ui/react, @assistant-ui/ai-sdk, the older @assistant-ui/react-ai-sdk alias, ai, or @ai-sdk/react, or when an upgrade exposes removed hooks, scope accessor calls, provider configuration, registry paths, event names, legacy interactables, or tool registrations. Start here for an existing project, post-update type failures, package compatibility, CLI codemods, and version-specific migration order. For a first install or a new project use setup; for authoring a runtime without an upgrade use runtime.
npx skills add assistant-ui/skills --skill update
Always consult assistant-ui.com/llms.txt for the latest API.
Upgrade in two passes. First make the AI SDK and its assistant-ui adapter compatible, then update assistant-ui and apply its API migration. Read the relevant references before editing because a direct jump can cross several deprecation windows.
Run these commands from the application root. npm ls reports the installed dependency graph and npm view reports the published latest version.
Current published lines as of September 2026:
| Package | Current line |
|---|---|
| assistant-ui | 0.0.x |
| @assistant-ui/react | 0.15.x |
| @assistant-ui/ai-sdk | 0.0.x |
| @assistant-ui/react-ai-sdk | 1.4.x |
| @assistant-ui/core | 0.3.x |
| @assistant-ui/store | 0.3.x |
| assistant-stream | 0.3.x |
| assistant-cloud | 0.1.x |
| ai | 7.x |
@assistant-ui/react-ai-sdk re-exports the same API for older installs. New code imports from @assistant-ui/ai-sdk.
Compare the installed @assistant-ui/react version against every threshold below. Apply every applicable guide in ascending version order.
| Installed before | Check for |
|---|---|
| 0.8.x | The historical UI package split. The current upgrade bundle intentionally excludes v0-8/ui-package-split because its destination is incompatible with current runtimes. Move to the Elements registry manually. |
| 0.9.x | The v0-9/edge-package-split codemod. |
| 0.10.x | The bundled migration has no dedicated 0.10 codemod. Run the later codemods and resolve remaining package or build errors from the project’s current toolchain. |
| 0.11.x | ContentPart names and MessagePrimitive.Content become MessagePart and MessagePrimitive.Parts. |
| 0.12.x | Unified state API, hook aliases, and camelCase event names. |
| 0.13.x | Review the 0.14 guide before proceeding because it removes the v0.11 and v0.12 deprecations. |
| 0.14.x | Removed aliases and runtime APIs, plus primitive children render functions. |
| 0.15.x | Scope properties, removed legacy hooks, toolUIs, standalone-tool-call, AuiConfig, and threads.selectionChanged. |
The bundled upgrade command runs these codemods in this exact order:
Use the dry and print form first. After reviewing the diff, run upgrade without -d and -p. Do not add the historical v0-8/ui-package-split codemod to a current upgrade.
These changes shipped after 0.15.0 without another major. Sweep for them even if the project already declares 0.15.x.
useAui takes no configuration. Build a configuration with AuiConfig and give it to the provider. A nested AuiProvider must declare whether it extends the parent client or is isolated.
At a runtime boundary, replace AssistantRuntimeProvider aui with config. For an isolated root, use AuiProvider extends={null} config={config}.
Runtime-connected registry components live at components/assistant-ui/elements/.aui.tsx and import as @/components/assistant-ui/elements/.aui. Renderers and standalone Elements use components/assistant-ui/elements/.tsx and omit .aui from their import. Replace retired @/components/assistant-ui/ imports during the same sweep.
The new event is shared by the threads scope. A listener that previously lived inside a thread-list item can filter by its item id.
useAssistantInteractable, Interactables(), and useInteractableState are deprecated since 2026-06-14 and scheduled for removal on or after 2026-09-14. Migrate to unstable_useInteractable, unstable_Interactables(), and unstable_interactableTool.
makeAssistantTool, useAssistantTool, makeAssistantToolUI, and useAssistantToolUI are deprecated. Put the model contract, executor, and renderer in a defineToolkit entry and register it with AuiConfig({ tools: Tools({ toolkit }) }). Read the toolkits section in assistant-ui.md before converting stateful or UI-only tools.
Also open a real chat route and verify an ordinary message, a tool call, an approval gate if present, a thread switch, and the project’s persisted-history path. Run npx assistant-ui@latest doctor and npx assistant-ui@latest info when a dependency or environment mismatch remains.
The upgrade command changed imports but the app still uses the old adapter
AuiProvider or AssistantRuntimeProvider no longer accepts the old props
A scope lookup no longer behaves like a null check
The typecheck still finds removed hooks or tool maps
# Update every installed @assistant-ui/* package.
npx assistant-ui@latest update
# Preview package changes without installing them.
npx assistant-ui@latest update --dry
# Preview the complete bundled migration and print each transformed file.
npx assistant-ui@latest upgrade -d -p
# Apply one codemod to a source directory.
npx assistant-ui@latest codemod v0-11/content-part-to-message-part ./src
# Report environment and dependency details.
npx assistant-ui@latest doctor
npx assistant-ui@latest info// Before
import { useChatRuntime } from "@assistant-ui/react-ai-sdk";// After
import { useChatRuntime } from "@assistant-ui/ai-sdk";// Before
const aui = useAui({ tools: Tools({ toolkit }) });
return <AuiProvider value={aui}>{children}</AuiProvider>;// After
const aui = useAui();
const config = AuiConfig({ tools: Tools({ toolkit }) });
return <AuiProvider extends={aui} config={config}>{children}</AuiProvider>;// Before
return <AssistantRuntimeProvider runtime={runtime} aui={aui}>{children}</AssistantRuntimeProvider>;// After
const config = AuiConfig({ tools: Tools({ toolkit }) });
return <AssistantRuntimeProvider runtime={runtime} config={config}>{children}</AssistantRuntimeProvider>;// Before
useAuiEvent("threadListItem.switchedTo", ({ threadId }) => select(threadId));
useAuiEvent("threadListItem.switchedAway", ({ threadId }) => clear(threadId));// After
useAuiEvent("threads.selectionChanged", ({ threadId, previousThreadId }) => {
select(threadId);
if (previousThreadId) clear(previousThreadId);
});npx tsc --noEmit
npm run build
npm test