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
| Integration | Thread list | Stored messages | Titles | Run reports | Engagement, feedback, attachments |
|---|---|---|---|---|---|
AI SDK, useChatRuntime | yes | ai-sdk/v6 | at the first message | yes, with model and usage from the route's metadata | yes |
Local runtime, useLocalRuntime, useDataStreamRuntime and useCloudRuntime | yes | aui/v0 | at the first message | yes, with model and usage from the adapter's metadata | yes |
| LangGraph, LangChain, ADK | yes | aui/v0, a copy of eligible settled messages | at the first message | none; export traces | engagement and feedback; attachments through the runtime's own adapter |
| OpenCode, Pi, assistant transport | yes | aui/v0, a copy of eligible settled messages | at the first message | none; export traces | engagement and feedback; attachments through the runtime's own adapter |
AG-UI and A2A through useCloudThreadListRuntime | yes | aui/v0 | at the first message | yes, read from the stored assistant message | yes |
Eve, useEveAgentRuntime | yes | aui/v0, a copy of eligible settled messages | at the first message | none; export traces | engagement and feedback; attachments through the cloud unless the runtime is given its own adapter |
| A server with an API key | its own calls | whatever it stores | when it stores the user message | whatever it reports | events and scores it sends |
| Traces only, any language | none | none | none | runs, steps and tools from spans | none |
"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
cloudbacks 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 nocloudoption of their own and get the list by being theruntimeHookofuseCloudThreadListRuntime. OpenCode and Pi takecloudonly 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_URLalone 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 storeaui/v0. The messages endpoint convertsaui/v0rows toai-sdk/v6on 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.
useExternalStoreRuntimecopies only when the store does not setunstable_persistsHistoryor 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 asaui/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'sadd-messagecommand 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: falseturns 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.
| React | React Native | React Ink | |
|---|---|---|---|
| The client | On 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 cloud | Constructed explicitly from assistant-cloud and passed as cloud | Constructed explicitly and passed as cloud |
| The chat route | Same origin, /api/chat by default | Another origin, named in the transport's api | Another origin, named in the transport's api |
| Anonymous identity | Kept in localStorage for 30 days and extended on every visit | No storage: an identity per launch | No 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.