Utilities

Miscellaneous @assistant-ui/react utilities for custom rendering, composition, and advanced assistant UI behavior.

API Reference

AssistantCloud

AssistantCloud
constructor?(config: AssistantCloudConfig) => AssistantCloud

threads?AssistantCloudThreads

projects?AssistantCloudProjects

auth?{ tokens: AssistantCloudAuthTokens; }

runs?AssistantCloudRuns

files?AssistantCloudFiles

events?AssistantCloudEvents

scores?AssistantCloudScores

telemetry?AssistantCloudTelemetryConfig

registerSdk?(sdk: SdkIdentity) => void

AuiConfig

Builds a config for AuiProvider; the config prop only accepts configs built with this helper.

A config is plain data: it can be hoisted to module scope, created inline per render, or memoized — the provider never relies on config identity.

const aui = useAui();
const config = AuiConfig({
  message: Derived({
    source: "thread",
    query: { index: 0 },
    get: (aui) => aui.thread.message({ index: 0 }),
  }),
});

<AuiProvider extends={aui} config={config}>{children}</AuiProvider>;
AuiConfig props
thread?ClientElement<"thread"> | DerivedElement<"thread">

AuiConfig props["thread"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

message?ClientElement<"message"> | DerivedElement<"message">

AuiConfig props["message"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

threads?ClientElement<"threads"> | DerivedElement<"threads">

AuiConfig props["threads"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

threadListItem?ClientElement<"threadListItem"> | DerivedElement<"threadListItem">

AuiConfig props["threadListItem"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

part?ClientElement<"part"> | DerivedElement<"part">

AuiConfig props["part"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

composer?ClientElement<"composer"> | DerivedElement<"composer">

AuiConfig props["composer"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

attachment?ClientElement<"attachment"> | DerivedElement<"attachment">

AuiConfig props["attachment"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

modelContext?ClientElement<"modelContext"> | DerivedElement<"modelContext">

AuiConfig props["modelContext"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

suggestions?ClientElement<"suggestions"> | DerivedElement<"suggestions">

AuiConfig props["suggestions"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

suggestion?ClientElement<"suggestion"> | DerivedElement<"suggestion">

AuiConfig props["suggestion"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

chainOfThought?ClientElement<"chainOfThought"> | DerivedElement<"chainOfThought">

AuiConfig props["chainOfThought"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

queueItem?ClientElement<"queueItem"> | DerivedElement<"queueItem">

AuiConfig props["queueItem"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

task?ClientElement<"task"> | DerivedElement<"task">

AuiConfig props["task"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

tools?ClientElement<"tools"> | DerivedElement<"tools">

AuiConfig props["tools"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

dataRenderers?ClientElement<"dataRenderers"> | DerivedElement<"dataRenderers">

AuiConfig props["dataRenderers"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

interactables?ClientElement<"interactables"> | DerivedElement<"interactables">

AuiConfig props["interactables"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

unstable_interactables?ClientElement<"unstable_interactables"> | DerivedElement<"unstable_interactables">unstable

AuiConfig props["unstable_interactables"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

ChainOfThoughtClient

ChainOfThoughtClient props
0ChainOfThoughtClient props["0"]

ChainOfThoughtClient props["0"]
partsreadonly ChainOfThoughtPart[]

getMessagePart(selector: { index: number }) => PartMethods

length1

toString() => string

toLocaleString{ (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }

pop() => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }

push(...items: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => number

concat{ (...items: ConcatArray<{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }>[]): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; (...items: ({ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; } | ConcatArray<{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }>)[]): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; }

join(separator?: string) => string

reverse() => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]

shift() => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }

slice(start?: number, end?: number) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]

sort(compareFn?: ((a: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, b: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }) => number) | undefined) => [{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }]

splice{ (start: number, deleteCount?: number): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; (start: number, deleteCount: number, ...items: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; }

unshift(...items: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => number

indexOf(searchElement: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, fromIndex?: number) => number

lastIndexOf(searchElement: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, fromIndex?: number) => number

every{ <S>(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any): boolean; }

some(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any) => boolean

forEach(callbackfn: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => void, thisArg?: any) => void

map<U>(callbackfn: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => U, thisArg?: any) => U[]

filter{ <S>(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => value is S, thisArg?: any): S[]; (predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; }

reduce{ (callbackfn: (previousValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }; (callbackfn: (previousValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, initialValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }; <U>(callbackfn: (previousValue: U, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => U, initialValue: U): U; }

reduceRight{ (callbackfn: (previousValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }; (callbackfn: (previousValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, initialValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }; <U>(callbackfn: (previousValue: U, currentValue: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, currentIndex: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => U, initialValue: U): U; }

find{ <S>(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, obj: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, obj: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; } | undefined; }

findIndex(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, obj: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any) => number

fill(value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, start?: number, end?: number) => [{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }]

copyWithin(target: number, start: number, end?: number) => [{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }]

entries() => ArrayIterator<[number, { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }]>

keys() => ArrayIterator<number>

values() => ArrayIterator<{ parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }>

includes(searchElement: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, fromIndex?: number) => boolean

flatMap<U, This>(callback: (this: This, value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => U | readonly U[], thisArg?: This | undefined) => U[]

flat<A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]

at(index: number) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }

findLast{ <S>(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; } | undefined; }

findLastIndex(predicate: (value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, index: number, array: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]) => unknown, thisArg?: any) => number

toReversed() => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]

toSorted(compareFn?: ((a: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }, b: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }) => number) | undefined) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]

toSpliced{ (start: number, deleteCount: number, ...items: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; (start: number, deleteCount?: number): { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]; }

with(index: number, value: { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }) => { parts: readonly ChainOfThoughtPart[]; getMessagePart: (selector: { index: number; }) => PartMethods; }[]

CloudRendererHost

CloudRendererHost
propsCloudRendererHostProps

CloudRendererHostProps
children?ReactNode

The app's thread UI, usually its own `<Thread />`.

allowedOrigins?readonly string[] | undefined

Dashboard origins allowed to send a conversation. Defaults to Assistant Cloud's dashboard.

aui?AssistantRuntimeProvider.Props["aui"]

The same client or config the app passes to AssistantRuntimeProvider, so tool UIs, data UIs and generative UI render as they do in the app.

CloudRendererHostProps["aui"]
threadAssistantClientAccessor<"thread">

messageAssistantClientAccessor<"message">

threadsAssistantClientAccessor<"threads">

threadListItemAssistantClientAccessor<"threadListItem">

partAssistantClientAccessor<"part">

composerAssistantClientAccessor<"composer">

attachmentAssistantClientAccessor<"attachment">

modelContextAssistantClientAccessor<"modelContext">

suggestionsAssistantClientAccessor<"suggestions">

suggestionAssistantClientAccessor<"suggestion">

chainOfThoughtAssistantClientAccessor<"chainOfThought">

queueItemAssistantClientAccessor<"queueItem">

taskAssistantClientAccessor<"task">

toolsAssistantClientAccessor<"tools">

dataRenderersAssistantClientAccessor<"dataRenderers">

interactablesAssistantClientAccessor<"interactables">

unstable_interactablesAssistantClientAccessor<"unstable_interactables">unstable

optionalCloudRendererHostProps["aui"]["optional"]

CloudRendererHostProps["aui"]["optional"]
thread?AssistantClientAccessor<"thread">

message?AssistantClientAccessor<"message">

threads?AssistantClientAccessor<"threads">

threadListItem?AssistantClientAccessor<"threadListItem">

part?AssistantClientAccessor<"part">

composer?AssistantClientAccessor<"composer">

attachment?AssistantClientAccessor<"attachment">

modelContext?AssistantClientAccessor<"modelContext">

suggestions?AssistantClientAccessor<"suggestions">

suggestion?AssistantClientAccessor<"suggestion">

chainOfThought?AssistantClientAccessor<"chainOfThought">

queueItem?AssistantClientAccessor<"queueItem">

task?AssistantClientAccessor<"task">

tools?AssistantClientAccessor<"tools">

dataRenderers?AssistantClientAccessor<"dataRenderers">

interactables?AssistantClientAccessor<"interactables">

unstable_interactables?AssistantClientAccessor<"unstable_interactables">unstable

subscribe(listener: () => void) => Unsubscribe

on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => Unsubscribe

config?AssistantRuntimeProvider.Props["config"]

CloudRendererHostProps["config"]
thread?ClientElement<"thread"> | DerivedElement<"thread">

CloudRendererHostProps["config"]["thread"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

message?ClientElement<"message"> | DerivedElement<"message">

CloudRendererHostProps["config"]["message"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

threads?ClientElement<"threads"> | DerivedElement<"threads">

CloudRendererHostProps["config"]["threads"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

threadListItem?ClientElement<"threadListItem"> | DerivedElement<"threadListItem">

CloudRendererHostProps["config"]["threadListItem"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

part?ClientElement<"part"> | DerivedElement<"part">

CloudRendererHostProps["config"]["part"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

composer?ClientElement<"composer"> | DerivedElement<"composer">

CloudRendererHostProps["config"]["composer"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

attachment?ClientElement<"attachment"> | DerivedElement<"attachment">

CloudRendererHostProps["config"]["attachment"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

modelContext?ClientElement<"modelContext"> | DerivedElement<"modelContext">

CloudRendererHostProps["config"]["modelContext"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

suggestions?ClientElement<"suggestions"> | DerivedElement<"suggestions">

CloudRendererHostProps["config"]["suggestions"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

suggestion?ClientElement<"suggestion"> | DerivedElement<"suggestion">

CloudRendererHostProps["config"]["suggestion"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

chainOfThought?ClientElement<"chainOfThought"> | DerivedElement<"chainOfThought">

CloudRendererHostProps["config"]["chainOfThought"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

queueItem?ClientElement<"queueItem"> | DerivedElement<"queueItem">

CloudRendererHostProps["config"]["queueItem"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

task?ClientElement<"task"> | DerivedElement<"task">

CloudRendererHostProps["config"]["task"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

tools?ClientElement<"tools"> | DerivedElement<"tools">

CloudRendererHostProps["config"]["tools"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

dataRenderers?ClientElement<"dataRenderers"> | DerivedElement<"dataRenderers">

CloudRendererHostProps["config"]["dataRenderers"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

interactables?ClientElement<"interactables"> | DerivedElement<"interactables">

CloudRendererHostProps["config"]["interactables"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

unstable_interactables?ClientElement<"unstable_interactables"> | DerivedElement<"unstable_interactables">unstable

CloudRendererHostProps["config"]["unstable_interactables"]
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

createMessageQueue

const createMessageQueue: (driver: MessageQueueDriver) => MessageQueueController;

createSimpleTitleAdapter

const createSimpleTitleAdapter: () => TitleGenerationAdapter;

DevToolsHooks

DevToolsHooks
static subscribe?(listener: () => void) => Unsubscribe

static clearEventLogs?(apiId: number) => void

static getApis?() => Map<number, DevToolsApiEntry>

InMemoryThreadList

InMemoryThreadList props
0InMemoryThreadListProps

InMemoryThreadListProps
thread(threadId: string) => ResourceElement<ClientOutput<"thread">>

onSwitchToThread?(threadId: string) => void

onSwitchToNewThread?() => void

onDelete?(threadId: string) => void

length1

toString() => string

toLocaleString{ (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }

pop() => InMemoryThreadListProps

push(...items: InMemoryThreadListProps[]) => number

concat{ (...items: ConcatArray<InMemoryThreadListProps>[]): InMemoryThreadListProps[]; (...items: (InMemoryThreadListProps | ConcatArray<InMemoryThreadListProps>)[]): InMemoryThreadListProps[]; }

join(separator?: string) => string

reverse() => InMemoryThreadListProps[]

shift() => InMemoryThreadListProps

slice(start?: number, end?: number) => InMemoryThreadListProps[]

sort(compareFn?: ((a: InMemoryThreadListProps, b: InMemoryThreadListProps) => number) | undefined) => [props: InMemoryThreadListProps]

splice{ (start: number, deleteCount?: number): InMemoryThreadListProps[]; (start: number, deleteCount: number, ...items: InMemoryThreadListProps[]): InMemoryThreadListProps[]; }

unshift(...items: InMemoryThreadListProps[]) => number

indexOf(searchElement: InMemoryThreadListProps, fromIndex?: number) => number

lastIndexOf(searchElement: InMemoryThreadListProps, fromIndex?: number) => number

every{ <S>(predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => unknown, thisArg?: any): boolean; }

some(predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => unknown, thisArg?: any) => boolean

forEach(callbackfn: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => void, thisArg?: any) => void

map<U>(callbackfn: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => U, thisArg?: any) => U[]

filter{ <S>(predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => value is S, thisArg?: any): S[]; (predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => unknown, thisArg?: any): InMemoryThreadListProps[]; }

reduce{ (callbackfn: (previousValue: InMemoryThreadListProps, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => InMemoryThreadListProps): InMemoryThreadListProps; (callbackfn: (previousValue: InMemoryThreadListProps, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => InMemoryThreadListProps, initialValue: InMemoryThreadListProps): InMemoryThreadListProps; <U>(callbackfn: (previousValue: U, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => U, initialValue: U): U; }

reduceRight{ (callbackfn: (previousValue: InMemoryThreadListProps, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => InMemoryThreadListProps): InMemoryThreadListProps; (callbackfn: (previousValue: InMemoryThreadListProps, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => InMemoryThreadListProps, initialValue: InMemoryThreadListProps): InMemoryThreadListProps; <U>(callbackfn: (previousValue: U, currentValue: InMemoryThreadListProps, currentIndex: number, array: InMemoryThreadListProps[]) => U, initialValue: U): U; }

find{ <S>(predicate: (value: InMemoryThreadListProps, index: number, obj: InMemoryThreadListProps[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: InMemoryThreadListProps, index: number, obj: InMemoryThreadListProps[]) => unknown, thisArg?: any): InMemoryThreadListProps | undefined; }

findIndex(predicate: (value: InMemoryThreadListProps, index: number, obj: InMemoryThreadListProps[]) => unknown, thisArg?: any) => number

fill(value: InMemoryThreadListProps, start?: number, end?: number) => [props: InMemoryThreadListProps]

copyWithin(target: number, start: number, end?: number) => [props: InMemoryThreadListProps]

entries() => ArrayIterator<[number, InMemoryThreadListProps]>

keys() => ArrayIterator<number>

values() => ArrayIterator<InMemoryThreadListProps>

includes(searchElement: InMemoryThreadListProps, fromIndex?: number) => boolean

flatMap<U, This>(callback: (this: This, value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => U | readonly U[], thisArg?: This | undefined) => U[]

flat<A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]

at(index: number) => InMemoryThreadListProps

findLast{ <S>(predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => unknown, thisArg?: any): InMemoryThreadListProps | undefined; }

findLastIndex(predicate: (value: InMemoryThreadListProps, index: number, array: InMemoryThreadListProps[]) => unknown, thisArg?: any) => number

toReversed() => InMemoryThreadListProps[]

toSorted(compareFn?: ((a: InMemoryThreadListProps, b: InMemoryThreadListProps) => number) | undefined) => InMemoryThreadListProps[]

toSpliced{ (start: number, deleteCount: number, ...items: InMemoryThreadListProps[]): InMemoryThreadListProps[]; (start: number, deleteCount?: number): InMemoryThreadListProps[]; }

with(index: number, value: InMemoryThreadListProps) => InMemoryThreadListProps[]

isMessageNotSentError

const isMessageNotSentError: (error: unknown) => error is MessageNotSentError;

MessageNotSentError

Rejection reason for a send that never reached the backend, so nothing ran and nothing is recoverable from the thread. A runtime adapter throws it from onNew to hand the message back to the thread composer, which restores the draft it cleared at dispatch time when nothing has claimed the composer since. An edit composer closes at dispatch, so a rejected edit is not restored.

MessageNotSentError
constructor?(message: string = "The message was not sent.") => MessageNotSentError

[MESSAGE_NOT_SENT]?true

readAnonymousRefreshToken

The refresh token of the anonymous identity this browser holds for baseUrl, or null when it has none.

const readAnonymousRefreshToken: (baseUrl: string) => string | null;

RemoteThreadList

AuiConfig threads entry backed by a RemoteThreadListAdapter. Thread bodies are born from the thread factory inside the client tree, so any AssistantClient host can run a remote or cloud list. Per-thread history and attachments come from unstable_useAdapters. useRemoteThreadListRuntime uses the same hook when unstable_Provider is omitted. Key the factory with withKey so history reloads when the visible thread changes. With backgroundThreads, every visited thread stays mounted: runs continue across switches, per-item isRunning is live, and freshly initialized threads title themselves.

RemoteThreadList props
0RemoteThreadListProps

RemoteThreadListProps
adapterRemoteThreadListAdapter

Swapping this to a different backing store does not reload the list. Call `reload()` after a genuine swap. A recreated object for the same store is a no-op. `reload()` after a different adapter instance resets selection and cached records before loading.

RemoteThreadListAdapter
list(params?: RemoteThreadListPageOptions) => Promise<RemoteThreadListResponse>

rename(remoteId: string, newTitle: string) => Promise<void>

updateCustom?(remoteId: string, custom: Record<string, unknown> | undefined) => Promise<void>

archive(remoteId: string) => Promise<void>

unarchive(remoteId: string) => Promise<void>

delete(remoteId: string) => Promise<void>

initialize(threadId: string) => Promise<RemoteThreadInitializeResponse>

generateTitle(remoteId: string, unstable_messages: readonly ThreadMessage[]) => Promise<AssistantStream>

Generates a title for the thread and streams it back. When the generation persists the title itself, the returned stream must not complete before that write has landed. Concurrent generations are ordered by stream completion, and a run whose write outlives its stream can overwrite a newer title.

fetch(threadId: string) => Promise<RemoteThreadMetadata>

unstable_Provider?RemoteThreadListProviderComponent | undefinedunstable

Optional React component wrapped around each active thread. Use it to inject per-thread context such as a history or attachments adapter (see `useCloudThreadListAdapter` for the canonical shape). `useRemoteThreadListRuntime` renders this component when present. If it is omitted, that host synthesizes a `RuntimeAdapterProvider` from `unstable_useAdapters`. The `RemoteThreadList` store entry ignores it; expose `unstable_useAdapters` for that host. The Provider must render `children` on its first commit; deferring them behind a loading state, a Suspense boundary, or a `useEffect`-gated render is unsupported and leaves thread context unavailable to downstream consumers. Load data inside an always-mounted child instead.

unstable_useAdapters?(() => RuntimeAdapters | null | undefined) | undefinedunstable

Hook the `RemoteThreadList` store entry calls once per mounted thread body (the main-thread slot by default; every started thread with `backgroundThreads`), then provides to the `thread` factory. This is not mounted per listed thread. `useRemoteThreadListRuntime` also calls it when `unstable_Provider` is omitted. Resolve `threadListItem` lazily on each adapter call; do not capture it at hook mount. The hook must keep a stable hook count across adapter swaps; a different count throws. Memoize the returned object. Per-thread history also requires the `thread` factory to be keyed by thread id (`withKey(id, thread(...))`). History loaders such as `useExternalHistory` run once per mount; an unkeyed factory keeps one instance across switches and the next thread's messages never load.

threadInMemoryThreadListProps["thread"]

Factory for the visible thread. Per-thread history reload requires a resource keyed by thread id (`withKey(id, thread(...))`). An unkeyed factory keeps one instance across switches, so a mount-once history loader will not fetch the next thread.

threadId?string | undefined

onThreadIdChange?((threadId: string | undefined) => void) | undefined

onSwitchToThread?((threadId: string) => void) | undefined

onSwitchToNewThread?(() => void) | undefined

onDelete?((threadId: string) => void) | undefined

Called after the backing adapter successfully deletes the thread.

backgroundThreads?boolean | undefined

Keeps every thread the session switched to mounted, so a run continues after the user switches away, per-item `isRunning` reflects background runs, and a freshly initialized thread generates its title automatically. A body unmounts on delete, detach, or an adapter replacement (`reload()` after swapping the adapter); visited threads otherwise stay mounted for the client's lifetime. Each body reads its own thread through the ambient `threadListItem` scope, and `unstable_useAdapters` runs once per mounted body. Off (the default), only the visible thread is mounted and a switch unmounts it. The mode is fixed at mount.

length1

toString() => string

toLocaleString{ (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }

pop() => RemoteThreadListProps

push(...items: RemoteThreadListProps[]) => number

concat{ (...items: ConcatArray<RemoteThreadListProps>[]): RemoteThreadListProps[]; (...items: (RemoteThreadListProps | ConcatArray<RemoteThreadListProps>)[]): RemoteThreadListProps[]; }

join(separator?: string) => string

reverse() => RemoteThreadListProps[]

shift() => RemoteThreadListProps

slice(start?: number, end?: number) => RemoteThreadListProps[]

sort(compareFn?: ((a: RemoteThreadListProps, b: RemoteThreadListProps) => number) | undefined) => [props: RemoteThreadListProps]

splice{ (start: number, deleteCount?: number): RemoteThreadListProps[]; (start: number, deleteCount: number, ...items: RemoteThreadListProps[]): RemoteThreadListProps[]; }

unshift(...items: RemoteThreadListProps[]) => number

indexOf(searchElement: RemoteThreadListProps, fromIndex?: number) => number

lastIndexOf(searchElement: RemoteThreadListProps, fromIndex?: number) => number

every{ <S>(predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => unknown, thisArg?: any): boolean; }

some(predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => unknown, thisArg?: any) => boolean

forEach(callbackfn: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => void, thisArg?: any) => void

map<U>(callbackfn: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => U, thisArg?: any) => U[]

filter{ <S>(predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => value is S, thisArg?: any): S[]; (predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => unknown, thisArg?: any): RemoteThreadListProps[]; }

reduce{ (callbackfn: (previousValue: RemoteThreadListProps, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => RemoteThreadListProps): RemoteThreadListProps; (callbackfn: (previousValue: RemoteThreadListProps, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => RemoteThreadListProps, initialValue: RemoteThreadListProps): RemoteThreadListProps; <U>(callbackfn: (previousValue: U, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => U, initialValue: U): U; }

reduceRight{ (callbackfn: (previousValue: RemoteThreadListProps, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => RemoteThreadListProps): RemoteThreadListProps; (callbackfn: (previousValue: RemoteThreadListProps, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => RemoteThreadListProps, initialValue: RemoteThreadListProps): RemoteThreadListProps; <U>(callbackfn: (previousValue: U, currentValue: RemoteThreadListProps, currentIndex: number, array: RemoteThreadListProps[]) => U, initialValue: U): U; }

find{ <S>(predicate: (value: RemoteThreadListProps, index: number, obj: RemoteThreadListProps[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: RemoteThreadListProps, index: number, obj: RemoteThreadListProps[]) => unknown, thisArg?: any): RemoteThreadListProps | undefined; }

findIndex(predicate: (value: RemoteThreadListProps, index: number, obj: RemoteThreadListProps[]) => unknown, thisArg?: any) => number

fill(value: RemoteThreadListProps, start?: number, end?: number) => [props: RemoteThreadListProps]

copyWithin(target: number, start: number, end?: number) => [props: RemoteThreadListProps]

entries() => ArrayIterator<[number, RemoteThreadListProps]>

keys() => ArrayIterator<number>

values() => ArrayIterator<RemoteThreadListProps>

includes(searchElement: RemoteThreadListProps, fromIndex?: number) => boolean

flatMap<U, This>(callback: (this: This, value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => U | readonly U[], thisArg?: This | undefined) => U[]

flat<A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]

at(index: number) => RemoteThreadListProps

findLast{ <S>(predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => unknown, thisArg?: any): RemoteThreadListProps | undefined; }

findLastIndex(predicate: (value: RemoteThreadListProps, index: number, array: RemoteThreadListProps[]) => unknown, thisArg?: any) => number

toReversed() => RemoteThreadListProps[]

toSorted(compareFn?: ((a: RemoteThreadListProps, b: RemoteThreadListProps) => number) | undefined) => RemoteThreadListProps[]

toSpliced{ (start: number, deleteCount: number, ...items: RemoteThreadListProps[]): RemoteThreadListProps[]; (start: number, deleteCount?: number): RemoteThreadListProps[]; }

with(index: number, value: RemoteThreadListProps) => RemoteThreadListProps[]

SingleThreadList

SingleThreadList props
0SingleThreadListProps

SingleThreadListProps
threadClientElement<"thread">

ClientElement
hook(...args: any[]) => V

argsreadonly unknown[]

key?string | number

deps?readonly unknown[]

length1

toString() => string

toLocaleString{ (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }

pop() => { thread: ClientElement<"thread">; }

push(...items: { thread: ClientElement<"thread">; }[]) => number

concat{ (...items: ConcatArray<{ thread: ClientElement<"thread">; }>[]): { thread: ClientElement<"thread">; }[]; (...items: ({ thread: ClientElement<"thread">; } | ConcatArray<{ thread: ClientElement<"thread">; }>)[]): { thread: ClientElement<"thread">; }[]; }

join(separator?: string) => string

reverse() => { thread: ClientElement<"thread">; }[]

shift() => { thread: ClientElement<"thread">; }

slice(start?: number, end?: number) => { thread: ClientElement<"thread">; }[]

sort(compareFn?: ((a: { thread: ClientElement<"thread">; }, b: { thread: ClientElement<"thread">; }) => number) | undefined) => [{ thread: ClientElement<"thread">; }]

splice{ (start: number, deleteCount?: number): { thread: ClientElement<"thread">; }[]; (start: number, deleteCount: number, ...items: { thread: ClientElement<"thread">; }[]): { thread: ClientElement<"thread">; }[]; }

unshift(...items: { thread: ClientElement<"thread">; }[]) => number

indexOf(searchElement: { thread: ClientElement<"thread">; }, fromIndex?: number) => number

lastIndexOf(searchElement: { thread: ClientElement<"thread">; }, fromIndex?: number) => number

every{ <S>(predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any): boolean; }

some(predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any) => boolean

forEach(callbackfn: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => void, thisArg?: any) => void

map<U>(callbackfn: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => U, thisArg?: any) => U[]

filter{ <S>(predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => value is S, thisArg?: any): S[]; (predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any): { thread: ClientElement<"thread">; }[]; }

reduce{ (callbackfn: (previousValue: { thread: ClientElement<"thread">; }, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => { thread: ClientElement<"thread">; }): { thread: ClientElement<"thread">; }; (callbackfn: (previousValue: { thread: ClientElement<"thread">; }, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => { thread: ClientElement<"thread">; }, initialValue: { thread: ClientElement<"thread">; }): { thread: ClientElement<"thread">; }; <U>(callbackfn: (previousValue: U, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => U, initialValue: U): U; }

reduceRight{ (callbackfn: (previousValue: { thread: ClientElement<"thread">; }, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => { thread: ClientElement<"thread">; }): { thread: ClientElement<"thread">; }; (callbackfn: (previousValue: { thread: ClientElement<"thread">; }, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => { thread: ClientElement<"thread">; }, initialValue: { thread: ClientElement<"thread">; }): { thread: ClientElement<"thread">; }; <U>(callbackfn: (previousValue: U, currentValue: { thread: ClientElement<"thread">; }, currentIndex: number, array: { thread: ClientElement<"thread">; }[]) => U, initialValue: U): U; }

find{ <S>(predicate: (value: { thread: ClientElement<"thread">; }, index: number, obj: { thread: ClientElement<"thread">; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { thread: ClientElement<"thread">; }, index: number, obj: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any): { thread: ClientElement<"thread">; } | undefined; }

findIndex(predicate: (value: { thread: ClientElement<"thread">; }, index: number, obj: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any) => number

fill(value: { thread: ClientElement<"thread">; }, start?: number, end?: number) => [{ thread: ClientElement<"thread">; }]

copyWithin(target: number, start: number, end?: number) => [{ thread: ClientElement<"thread">; }]

entries() => ArrayIterator<[number, { thread: ClientElement<"thread">; }]>

keys() => ArrayIterator<number>

values() => ArrayIterator<{ thread: ClientElement<"thread">; }>

includes(searchElement: { thread: ClientElement<"thread">; }, fromIndex?: number) => boolean

flatMap<U, This>(callback: (this: This, value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => U | readonly U[], thisArg?: This | undefined) => U[]

flat<A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]

at(index: number) => { thread: ClientElement<"thread">; }

findLast{ <S>(predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any): { thread: ClientElement<"thread">; } | undefined; }

findLastIndex(predicate: (value: { thread: ClientElement<"thread">; }, index: number, array: { thread: ClientElement<"thread">; }[]) => unknown, thisArg?: any) => number

toReversed() => { thread: ClientElement<"thread">; }[]

toSorted(compareFn?: ((a: { thread: ClientElement<"thread">; }, b: { thread: ClientElement<"thread">; }) => number) | undefined) => { thread: ClientElement<"thread">; }[]

toSpliced{ (start: number, deleteCount: number, ...items: { thread: ClientElement<"thread">; }[]): { thread: ClientElement<"thread">; }[]; (start: number, deleteCount?: number): { thread: ClientElement<"thread">; }[]; }

with(index: number, value: { thread: ClientElement<"thread">; }) => { thread: ClientElement<"thread">; }[]

Suggestions

Suggestions props
0?SuggestionConfig[]

length0 | 1

toString() => string

toLocaleString{ (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }

pop() => SuggestionConfig[]

push(...items: (SuggestionConfig[] | undefined)[]) => number

concat{ (...items: ConcatArray<SuggestionConfig[] | undefined>[]): (SuggestionConfig[] | undefined)[]; (...items: (SuggestionConfig[] | ConcatArray<SuggestionConfig[] | undefined> | undefined)[]): (SuggestionConfig[] | undefined)[]; }

join(separator?: string) => string

reverse() => (SuggestionConfig[] | undefined)[]

shift() => SuggestionConfig[]

slice(start?: number, end?: number) => (SuggestionConfig[] | undefined)[]

sort(compareFn?: ((a: SuggestionConfig[] | undefined, b: SuggestionConfig[] | undefined) => number) | undefined) => [suggestions?: SuggestionConfig[] | undefined]

splice{ (start: number, deleteCount?: number): (SuggestionConfig[] | undefined)[]; (start: number, deleteCount: number, ...items: (SuggestionConfig[] | undefined)[]): (SuggestionConfig[] | undefined)[]; }

unshift(...items: (SuggestionConfig[] | undefined)[]) => number

indexOf(searchElement: SuggestionConfig[] | undefined, fromIndex?: number) => number

lastIndexOf(searchElement: SuggestionConfig[] | undefined, fromIndex?: number) => number

every{ <S>(predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any): boolean; }

some(predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any) => boolean

forEach(callbackfn: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => void, thisArg?: any) => void

map<U>(callbackfn: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => U, thisArg?: any) => U[]

filter{ <S>(predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => value is S, thisArg?: any): S[]; (predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any): (SuggestionConfig[] | undefined)[]; }

reduce{ (callbackfn: (previousValue: SuggestionConfig[] | undefined, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => SuggestionConfig[] | undefined): SuggestionConfig[] | undefined; (callbackfn: (previousValue: SuggestionConfig[] | undefined, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => SuggestionConfig[] | undefined, initialValue: SuggestionConfig[] | undefined): SuggestionConfig[] | undefined; <U>(callbackfn: (previousValue: U, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => U, initialValue: U): U; }

reduceRight{ (callbackfn: (previousValue: SuggestionConfig[] | undefined, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => SuggestionConfig[] | undefined): SuggestionConfig[] | undefined; (callbackfn: (previousValue: SuggestionConfig[] | undefined, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => SuggestionConfig[] | undefined, initialValue: SuggestionConfig[] | undefined): SuggestionConfig[] | undefined; <U>(callbackfn: (previousValue: U, currentValue: SuggestionConfig[] | undefined, currentIndex: number, array: (SuggestionConfig[] | undefined)[]) => U, initialValue: U): U; }

find{ <S>(predicate: (value: SuggestionConfig[] | undefined, index: number, obj: (SuggestionConfig[] | undefined)[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: SuggestionConfig[] | undefined, index: number, obj: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any): SuggestionConfig[] | undefined; }

findIndex(predicate: (value: SuggestionConfig[] | undefined, index: number, obj: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any) => number

fill(value: SuggestionConfig[] | undefined, start?: number, end?: number) => [suggestions?: SuggestionConfig[] | undefined]

copyWithin(target: number, start: number, end?: number) => [suggestions?: SuggestionConfig[] | undefined]

entries() => ArrayIterator<[number, SuggestionConfig[] | undefined]>

keys() => ArrayIterator<number>

values() => ArrayIterator<SuggestionConfig[] | undefined>

includes(searchElement: SuggestionConfig[] | undefined, fromIndex?: number) => boolean

flatMap<U, This>(callback: (this: This, value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => U | readonly U[], thisArg?: This | undefined) => U[]

flat<A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]

at(index: number) => SuggestionConfig[]

findLast{ <S>(predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any): SuggestionConfig[] | undefined; }

findLastIndex(predicate: (value: SuggestionConfig[] | undefined, index: number, array: (SuggestionConfig[] | undefined)[]) => unknown, thisArg?: any) => number

toReversed() => (SuggestionConfig[] | undefined)[]

toSorted(compareFn?: ((a: SuggestionConfig[] | undefined, b: SuggestionConfig[] | undefined) => number) | undefined) => (SuggestionConfig[] | undefined)[]

toSpliced{ (start: number, deleteCount: number, ...items: (SuggestionConfig[] | undefined)[]): (SuggestionConfig[] | undefined)[]; (start: number, deleteCount?: number): (SuggestionConfig[] | undefined)[]; }

with(index: number, value: SuggestionConfig[] | undefined) => (SuggestionConfig[] | undefined)[]

unstable_defaultDirectiveFormatter

Default directive formatter using the :type[label]{name=id} syntax.

When id equals label, the {name=…} attribute is omitted for brevity.

const unstable_defaultDirectiveFormatter: Unstable_DirectiveFormatter;

unstable_defaultWebMcpFilter

The predicate the WebMCP provider uses when no filter is passed: an enabled frontend tool with a client-side execute. A tool authored without a type is included, because execute is what distinguishes the deprecated type-less form from a backend or human tool. A filter replaces this, so pass it through to narrow the default set rather than widen it.

const unstable_defaultWebMcpFilter: (_name: string, tool: Tool<any, any>) => boolean;

unstable_useWebMcpProvider

Publishes the frontend tools in the model context to a WebMCP-capable browser, so the user's own browser agent can call them.

Returns status: "unsupported" when the page exposes no document.modelContext (or navigator.modelContext), and the sorted names of the tools currently registered with the host.

unstable_useWebMcpProvider props
filter?(name: string, tool: Tool<any, any>) => boolean

useSmooth

Animates streamed message part text with a typewriter-style reveal.

Takes the current part state and a smooth argument: false disables, true uses the default rate, and a SmoothOptions object tunes the reveal. Returns the part state with text replaced by the revealed prefix and status reporting running until the reveal catches up. If the source settles before any character has been revealed, the text is committed immediately so a missed animation frame cannot leave an empty bubble.

The reveal auto-disables under prefers-reduced-motion: reduce, committing the full text immediately; this takes precedence over an explicit smooth={true}.

const { text, status } = useSmooth(useMessagePartText(), {
  drainMs: 500,
  maxCharsPerFrame: 30,
});
useSmooth
state(TextMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; }) | (ReasoningMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; })

(TextMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; }) | (ReasoningMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; })
type"text"

textstring

statusMessagePartStreamStatus

(TextMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; }) | (ReasoningMessagePart & { readonly status: MessagePartStatus | ToolCallMessagePartStatus; })["status"]
type"running"

providerMetadata?PartProviderMetadata

parentId?string

smooth?boolean | SmoothOptions

fromThreadMessageLike

Tip

Experimental. This API is experimental and may change without notice.

const fromThreadMessageLike: (like: ThreadMessageLike, fallbackId: string, fallbackStatus: MessageStatus) => ThreadMessage;

generateId

Tip

Experimental. This API is experimental and may change without notice.

const generateId: (size?: number) => string;