Documents
adapters
adapters
Type
External
Status
Published
Created
Mar 17, 2026
Updated
May 24, 2026
Updated by
Dosu Bot
Source
View

Adapters customize runtime behavior. They can be passed as options to useLocalRuntime or useRemoteThreadListRuntime.

createFileStorageAdapter#

A RemoteThreadListAdapter that persists threads and messages to a local directory. See Custom Backend → Option 2 for usage.

import { createFileStorageAdapter } from "@assistant-ui/react-ink";

const adapter = createFileStorageAdapter({
  dir: "/path/to/threads",
});

TitleGenerationAdapter#

Produces a thread title from a thread's messages. Pass one as the titleGenerator option to createFileStorageAdapter, or call it from a custom RemoteThreadListAdapter.

type TitleGenerationAdapter = {
  generateTitle(messages: readonly ThreadMessage[]): Promise<string>;
};

createSimpleTitleAdapter is the built-in implementation; it derives the title from the first user message, truncated to 50 characters.

import {
  createFileStorageAdapter,
  createSimpleTitleAdapter,
} from "@assistant-ui/react-ink";

const adapter = createFileStorageAdapter({
  dir: "/path/to/threads",
  titleGenerator: createSimpleTitleAdapter(),
});

RemoteThreadListAdapter#

Title generation is configured via the generateTitle method on RemoteThreadListAdapter. See the Custom Backend page for a full example.

import type { RemoteThreadListAdapter } from "@assistant-ui/react-ink";
import { createAssistantStream } from "assistant-stream";

const myAdapter: RemoteThreadListAdapter = {
  // ... other methods ...

  async generateTitle(remoteId, unstable_messages) {
    return createAssistantStream(async (controller) => {
      const res = await fetch(`/api/threads/${remoteId}/title`, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ messages: unstable_messages }),
      });
      const { title } = await res.json();
      controller.appendText(title);
    });
  },
};

Which option to choose?#

ChatModelAdapter + useLocalRuntimeRemoteThreadListAdapter + useRemoteThreadListRuntime
Thread storageIn-memoryYour backend
Message storageIn-memoryIn-memory (can add history adapter for server-side)
Cross-session persistenceNoYes
Setup complexityMinimalModerate
Best forCLI tools, demos, prototypesProduction apps with persistence