Data Stream protocol integration for assistant-ui.
API Reference#
useDataStreamRuntime#
Create a runtime that connects to a data stream protocol endpoint.
import { useDataStreamRuntime } from "@assistant-ui/react-data-stream";
const MyRuntimeProvider = ({ children }: { children: React.ReactNode }) => {
const runtime = useDataStreamRuntime({
api: "/api/chat",
});
return (
<AssistantRuntimeProvider runtime={runtime}>
{children}
</AssistantRuntimeProvider>
);
};
<ParametersTable
parameters={[
{
name: "api",
type: "string",
description: "The API endpoint URL for the data stream protocol.",
},
{
name: "protocol",
type: '"ui-message-stream" | "data-stream"',
description: 'The streaming protocol to use. Defaults to "ui-message-stream". Use "data-stream" for legacy AI SDK compatibility.',
},
{
name: "onData",
type: "(data: { type: string; name: string; data: unknown; transient?: boolean }) => void",
description: "Optional callback for data-* parts. Only applies when using the ui-message-stream protocol.",
},
{
name: "onResponse",
type: "(response: Response) => void | Promise",
description: "Optional callback called when a response is received.",
},
{
name: "onFinish",
type: "(message: ThreadMessage) => void",
description: "Optional callback called when a message is finished.",
},
{
name: "onError",
type: "(error: Error) => void",
description: "Optional callback called when an error occurs.",
},
{
name: "onCancel",
type: "() => void",
description: "Optional callback called when a request is cancelled.",
},
{
name: "credentials",
type: "RequestCredentials",
description: "Optional credentials mode for the fetch request.",
},
{
name: "headers",
type: "Record<string, string> | Headers | (() => Promise<Record<string, string> | Headers>)",
description: "Optional headers to include in the request.",
},
{
name: "body",
type: "object | (() => Promise<object | undefined>)",
description: "Optional additional body parameters to include in the request. Can be an object or an async function that returns one.",
},
{
name: "sendExtraMessageFields",
type: "boolean",
description: "Whether to include extra message fields like IDs in the request.",
},
]}
/>
useCloudRuntime#
Create a runtime that connects to Assistant Cloud using the data stream protocol.
import { useCloudRuntime } from "@assistant-ui/react-data-stream";
const MyRuntimeProvider = ({ children }: { children: React.ReactNode }) => {
const runtime = useCloudRuntime({
cloud: assistantCloud,
assistantId: "my-assistant-id",
});
return (
<AssistantRuntimeProvider runtime={runtime}>
{children}
</AssistantRuntimeProvider>
);
};
<ParametersTable
parameters={[
{
name: "cloud",
type: "AssistantCloud",
description: "The Assistant Cloud instance.",
},
{
name: "assistantId",
type: "string",
description: "The ID of the assistant to connect to.",
},
{
name: "protocol",
type: '"ui-message-stream" | "data-stream"',
description: 'The streaming protocol to use. Defaults to "ui-message-stream". Use "data-stream" for legacy AI SDK compatibility.',
},
{
name: "onData",
type: "(data: { type: string; name: string; data: unknown; transient?: boolean }) => void",
description: "Optional callback for data-* parts. Only applies when using the ui-message-stream protocol.",
},
{
name: "onResponse",
type: "(response: Response) => void | Promise",
description: "Optional callback called when a response is received.",
},
{
name: "onFinish",
type: "(message: ThreadMessage) => void",
description: "Optional callback called when a message is finished.",
},
{
name: "onError",
type: "(error: Error) => void",
description: "Optional callback called when an error occurs.",
},
{
name: "onCancel",
type: "() => void",
description: "Optional callback called when a request is cancelled.",
},
{
name: "credentials",
type: "RequestCredentials",
description: "Optional credentials mode for the fetch request.",
},
{
name: "headers",
type: "Record<string, string> | Headers | (() => Promise<Record<string, string> | Headers>)",
description: "Optional headers to include in the request.",
},
{
name: "body",
type: "object | (() => Promise<object | undefined>)",
description: "Optional additional body parameters to include in the request. Can be an object or an async function that returns one.",
},
{
name: "sendExtraMessageFields",
type: "boolean",
description: "Whether to include extra message fields like IDs in the request.",
},
]}
/>
toLanguageModelMessages#
Convert assistant-ui messages to AI SDK's LanguageModelV2Message format.
import { toLanguageModelMessages } from "@assistant-ui/react-data-stream";
const languageModelMessages = toLanguageModelMessages(messages, {
unstable_includeId: true,
});
<ParametersTable
parameters={[
{
name: "messages",
type: "readonly ThreadMessage[]",
description: "The messages to convert.",
},
{
name: "options",
type: "{ unstable_includeId?: boolean }",
description: "Optional conversion options.",
children: [
{
type: "{ unstable_includeId?: boolean }",
parameters: [
{
name: "unstable_includeId",
type: "boolean",
description: "Whether to include message IDs in the converted messages.",
},
],
},
],
},
]}
/>
Framework-Agnostic Utilities#
For custom integrations that don't use the AI SDK, use these utilities from assistant-stream:
toGenericMessages#
Convert thread messages to a framework-agnostic format.
import { toGenericMessages } from "assistant-stream";
const genericMessages = toGenericMessages(messages);
Returns an array of GenericMessage which can be one of:
{ role: "system"; content: string }{ role: "user"; content: (GenericTextPart | GenericFilePart)[] }{ role: "assistant"; content: (GenericTextPart | GenericToolCallPart)[] }{ role: "tool"; content: GenericToolResultPart[] }
toToolsJSONSchema#
Convert tool definitions to JSON Schema format.
import { toToolsJSONSchema } from "assistant-stream";
const toolSchemas = toToolsJSONSchema(tools);
// Returns: Record<string, { description?: string; parameters: JSONSchema7 }>
By default, filters out disabled tools and backend-only tools. Use the filter option to customize:
const allTools = toToolsJSONSchema(tools, {
filter: () => true, // Include all tools
});