MessageRuntime state and actions for editing, reloading, copying, rating, speaking, and branching assistant-ui messages.
API Reference
MessageRuntime
MessageRuntimepath: MessageRuntimePathref: stringthreadSelector: MessageRuntimePath["threadSelector"]type: "main"
messageSelector: MessageRuntimePath["messageSelector"]type: "messageId"
composer: EditComposerRuntimepath: ComposerRuntimePathref: stringthreadSelector: EditComposerRuntime["path"]["threadSelector"]type: "main"
messageSelector: EditComposerRuntime["path"]["messageSelector"]type: "messageId"
composerSource: "edit"
type: "edit" | "thread"addAttachment: (fileOrAttachment: File | CreateAttachment) => Promise<void>Add an attachment to the composer. Accepts either a standard File object (processed through the AttachmentAdapter) or a CreateAttachment descriptor for external-source attachments (URLs, API data, CMS references). External descriptors bypass the adapter's `add()` step but still respect `adapter.accept` when an adapter is configured; without an adapter they are added as-is.
setText: (text: string) => voidSet the text of the composer.
setRole: (role: MessageRole) => voidSet the role of the composer. For instance, if you'd like a specific message to have the 'assistant' role, you can do so here.
setRunConfig: (runConfig: RunConfig) => voidSet the run config of the composer. This is used to send custom configuration data to the model. Within your backend, you can use the `runConfig` object. Example: ```ts composerRuntime.setRunConfig({ custom: { customField: "customValue" } }); ```
reset: () => Promise<void>Reset the composer. This will clear the entire state of the composer, including all text and attachments.
clearAttachments: () => Promise<void>Clear all attachments from the composer.
send: (options?: SendOptions) => voidSend a message. This will send whatever text or attachments are in the composer.
cancel: () => voidCancel the current run. In edit mode, this will exit edit mode.
subscribe: (callback: () => void) => UnsubscribeListens for changes to the composer state.
startDictation: () => voidStart dictation to convert voice to text input. Requires a DictationAdapter to be configured.
stopDictation: () => voidStop the current dictation session.
setQuote: (quote: QuoteInfo | undefined) => voidSet a quote for the next message. Pass undefined to clear.
unstable_ondeprecatedunstable: <E extends ComposerRuntimeEventType>(event: E, callback: ComposerRuntimeEventCallback<E>) => UnsubscribeDeprecated: This API is still under active development and might change without notice.
getState: () => EditComposerStatebeginEdit: () => voidgetAttachmentByIndex: (idx: number) => AttachmentRuntime & { source: "edit-composer"; }
getState: () => MessageStatereload: (config?: ReloadConfig) => voidspeakdeprecated: () => voidDeprecated: This API is still under active development and might change without notice.
stopSpeakingdeprecated: () => voidDeprecated: This API is still under active development and might change without notice.
submitFeedback: ({ type }: { type: "positive" | "negative"; }) => voidswitchToBranch: ({ position, branchId, }: { position?: "previous" | "next" | undefined; branchId?: string | undefined; }) => voidunstable_getCopyTextunstable: () => stringsubscribe: (callback: () => void) => UnsubscribegetMessagePartByIndex: (idx: number) => MessagePartRuntimegetMessagePartByToolCallId: (toolCallId: string) => MessagePartRuntimegetAttachmentByIndex: (idx: number) => AttachmentRuntime & { source: "message"; }
MessageState
MessageStatestatus?: ThreadAssistantMessage["status"]type: "running"
metadata: MessageState["metadata"]unstable_stateunstable?: ReadonlyJSONValueunstable_annotationsunstable?: readonly ReadonlyJSONValue[]unstable_dataunstable?: readonly ReadonlyJSONValue[]steps?: readonly ThreadStep[]submittedFeedback?: MessageState["metadata"]["submittedFeedback"]type: "positive" | "negative"
timing?: MessageTimingstreamStartTime: numberfirstTokenTime?: numbertotalStreamTime?: numbertokenCount?: numbertokensPerSecond?: numbertotalChunks: numbertoolCallCount: number
isOptimistic?: booleanMarks a client-side optimistic placeholder. Such messages are evicted once off the head branch and are never persisted.
custom: Record<string, unknown>
attachments?: ThreadUserMessage["attachments"]id: stringcreatedAt: Daterole: "system"content: readonly [TextMessagePart]parentId: string | nullindex: numberThe position of this message in the thread (0 for first message)
isLast: booleanbranchNumber: numberbranchCount: numberspeechdeprecated?: SpeechStateDeprecated: This API is still under active development and might change without notice.
messageId: stringstatus: SpeechSynthesisAdapter.Statustype: "starting" | "running"