Which runtime

What every assistant-ui runtime stores in the cloud and reports to it, what each cannot, and how the three platforms differ.

Every assistant-ui runtime takes the same cloud client and gets what its shape allows. A runtime that hands its messages to the cloud gets everything; a runtime whose backend keeps the transcript gets the thread list, a copy of its messages and the engagement side, and fills Runs from server traces instead.

The matrix

IntegrationThread listStored messagesTitlesRun reportsEngagement, feedback, attachments
AI SDK, useChatRuntimeyesai-sdk/v6at the first messageyes, with model and usage from the route's metadatayes
Local runtime, useLocalRuntime, useDataStreamRuntime and useCloudRuntimeyesaui/v0at the first messageyes, with model and usage from the adapter's metadatayes
LangGraph, LangChain, ADKyesaui/v0, a copy of eligible settled messagesat the first messagenone; export tracesengagement and feedback; attachments through the runtime's own adapter
OpenCode, Pi, assistant transportyesaui/v0, a copy of eligible settled messagesat the first messagenone; export tracesengagement and feedback; attachments through the runtime's own adapter
AG-UI and A2A through useCloudThreadListRuntimeyesaui/v0at the first messageyes, read from the stored assistant messageyes
Eve, useEveAgentRuntimeyesaui/v0, a copy of eligible settled messagesat the first messagenone; export tracesengagement and feedback; attachments through the cloud unless the runtime is given its own adapter
A server with an API keyits own callswhatever it storeswhen it stores the user messagewhatever it reportsevents and scores it sends
Traces only, any languagenonenonenoneruns, steps and tools from spansnone

"At the first message" means the cloud titles the thread from the first user message, as Thread titles describes; the assistant-ui runtimes receive the title in the answer to their own request, and a server reads it on the thread afterwards.

What decides the column

  • Thread list. Any runtime given a cloud backs its thread list with the project: listed per workspace, created on the first send, renamed, archived and deleted through the cloud. AG-UI and A2A have no cloud option of their own and get the list by being the runtimeHook of useCloudThreadListRuntime. OpenCode and Pi take cloud only when it is passed, since their list otherwise comes from their own server, and so does Eve, which otherwise runs a single session; NEXT_PUBLIC_ASSISTANT_BASE_URL alone does not switch them. Eve saves a new thread once its first turn creates the Eve session that becomes the thread's external id.
  • Stored messages. A runtime stores messages when it hands them to the cloud history adapter. The AI SDK runtime stores ai-sdk/v6, the local runtime and the composed runtimes store aui/v0. The messages endpoint converts aui/v0 rows to ai-sdk/v6 on read, so a thread written by the local runtime opens in the AI SDK runtime; the reverse is not converted.
  • Copied messages. LangGraph, LangChain, ADK, OpenCode, Pi, Eve and assistant transport keep the transcript on their backend. useExternalStoreRuntime copies only when the store does not set unstable_persistsHistory or install a thread-list adapter, so the AI SDK, AG-UI and A2A do not use this path. When a run settles, the runtime copies new or changed eligible messages as aui/v0, keyed by backend message ids. It skips optimistic messages, fallback ids beginning __external_store_fallback_, error ids and running assistant messages; the Cloud adapter also rejects empty ids and ids longer than 255 characters. A message the backend returns without an id is not copied. Assistant transport's add-message command carries the user message id so the backend can return it. An interaction recorded on a message that is not copied is accepted but not stored. The dashboard shows copied threads like any other and feedback can rate their copied messages; the runtime never reads the copy back. telemetry: { messages: false } on the cloud client keeps the copy out, and tool interactions are then rejected; telemetry: false turns it off together with run reports and events.
  • Run reports. A report is sent when a stored assistant message settles. It carries what the runtime measured (first token, steps, tool calls, status and outcome, plus duration and step timing from the AI SDK runtime) and what the route or adapter put in the message metadata (model, provider, usage, trace id). Without that metadata the run is stored and listed under No model reported, and cannot be priced. Run reports lists every field and what each runtime fills.
  • Engagement, feedback and attachments. The runtimes read every event from their store, so any action taken through the components or the primitives is counted. The cloud supplies feedback to an external-store runtime when it has no feedback adapter. It supplies attachments to the AI SDK, local runtime, and AG-UI or A2A through the Cloud thread-list runtime, and to Eve when it is given no attachment adapter; LangGraph, LangChain, ADK, OpenCode, Pi and assistant transport keep their own attachment adapter. A runtime that supplies its own adapter keeps it, and feedback needs a stored cloud message to rate.

The three platforms

The packages are the same on React, React Native and Ink; the environment differs.

ReactReact NativeReact Ink
The clientOn Next.js, created for you from NEXT_PUBLIC_ASSISTANT_BASE_URL when you pass no cloud, anonymous; on Vite, React Router and TanStack Start, constructed from import.meta.env.VITE_ASSISTANT_BASE_URL and passed as cloudConstructed explicitly from assistant-cloud and passed as cloudConstructed explicitly and passed as cloud
The chat routeSame origin, /api/chat by defaultAnother origin, named in the transport's apiAnother origin, named in the transport's api
Anonymous identityKept in localStorage for 30 days and extended on every visitNo storage: an identity per launchNo storage: an identity per process
Components@assistant-ui/react and the registry elements@assistant-ui/react-native and its elements@assistant-ui/react-ink

On React Native and Ink, give users an identity of their own with an auth provider token before shipping, or every launch starts a fresh visitor with an empty thread list.

Choosing

Start from the AI SDK runtime when your backend answers an AI SDK stream, including Mastra agents and any server that returns toUIMessageStreamResponse. Use the local runtime for any other protocol you stream yourself. Keep LangGraph, LangChain and ADK on their own runtimes and add traces from the server to fill Runs and Models. A bot, a batch job or a support tool uses the client from a server; a backend in another language calls the REST API or exports traces alone.