Define model-facing tools and compose them into named toolkits registered with an assistant-ui runtime scope.
A Toolkit is a named map of model-facing tool definitions. The Tools resource installs a toolkit into an assistant subtree, registering each tool with the model context and each render component with the tool-call renderer scope.
Use these APIs when you want a tool's availability to follow your runtime or provider tree. The older component-scoped registration APIs are deprecated; see Migrating Tools to Toolkits.
API Reference
tool
Defines a model tool with its argument schema, execution behavior, and optional model-output conversion.
This helper keeps reusable tool definitions type-checked and convenient to export for a Toolkit registered with Tools. Inference from parameter schemas is currently limited, so provide generic arguments when you need precise args or result types.
const getWeather = tool<{ city: string }, string>({
type: "frontend",
description: "Get the weather for a city.",
parameters: {
type: "object",
properties: { city: { type: "string" } },
required: ["city"],
},
execute: async ({ city }) => `Sunny in ${city}`,
});tooltool: Tool<TArgs, TResult>streamCalldeprecated?: ToolStreamCallFunction<TArgs, TResult>Deprecated: Experimental, API may change.
display?: ToolDisplayHow this tool's UI is presented relative to the chain-of-thought trace. Defaults to `"inline"` (folded into the chain-of-thought grouping). Set `"standalone"` to surface the tool call on its own. `human` tools are always `"standalone"` and cannot opt out.
unstable_backendDefaultunstable?: Tool["unstable_backendDefault"]parameters?: boolean
type?: "mcp"Tools loaded from an MCP server by a server adapter.
description?: undefinedNatural-language description shown to the model when selecting tools.
parameters?: undefinedSchema for the arguments the model must provide when calling the tool.
disabled?: booleanPrevents the tool from being exposed to the model while true.
execute?: undefinedExecutes the tool after the model provides valid arguments.
toModelOutput?: undefinedConverts the execution result into model-visible output.
experimental_onSchemaValidationError?: undefinedHandles invalid tool arguments when schema validation fails.
providerOptions?: undefined
ToolDefinition
Tool definition accepted by the React tool registry.
Extends the core tool contract with tool-call display options. Human tools
rely on render to collect input from the user. Frontend tools execute in
the browser and require either render or renderText for their progress
and result. Backend tools execute server-side and may omit a renderer.
ToolDefinitionstreamCalldeprecated?: ToolStreamCallFunction<TArgs, TResult>Deprecated: Experimental, API may change.
display?: ToolDisplayHow this tool's UI is presented relative to the chain-of-thought trace. Defaults to `"inline"` (folded into the chain-of-thought grouping). Set `"standalone"` to surface the tool call on its own. `human` tools are always `"standalone"` and cannot opt out.
unstable_backendDefaultunstable?: ToolDefinition["unstable_backendDefault"]parameters?: boolean
type?: "mcp"Tools loaded from an MCP server by a server adapter.
description?: undefinedNatural-language description shown to the model when selecting tools.
parameters?: undefinedSchema for the arguments the model must provide when calling the tool.
disabled?: booleanPrevents the tool from being exposed to the model while true.
execute?: undefinedExecutes the tool after the model provides valid arguments.
toModelOutput?: undefinedConverts the execution result into model-visible output.
experimental_onSchemaValidationError?: undefinedHandles invalid tool arguments when schema validation fails.
providerOptions?: undefinedrender?: ToolCallMessagePartComponent<TArgs, TResult>
Toolkit
Named collection of tools exposed to the assistant model.
Keys are the tool names the model receives and uses in tool calls.
const toolkit = defineToolkit({
get_weather: {
type: "frontend",
description: "Get the weather for a city.",
parameters: weatherSchema,
execute: async ({ city }: { city: string }) => fetchWeather(city),
render: WeatherToolUI,
},
});type Toolkit = Record<string, ToolDefinition<any, any>>;Tools
Tools props0: Tools props["0"]toolkit?: ToolkitTools to expose to the model and optional renderers to install.
mcpApp?: ResourceElement<McpAppResourceOutput>Optional MCP app resource whose tools should be merged into context.
hook: (...args: A) => Rargs: Readonly<A>key?: string | number
length: 1toString: () => stringtoLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string; }pop: () => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }push: (...items: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => numberconcat: { (...items: ConcatArray<{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }>[]): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; (...items: ({ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; } | ConcatArray<{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }>)[]): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; }join: (separator?: string) => stringreverse: () => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]shift: () => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }slice: (start?: number, end?: number) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]sort: (compareFn?: ((a: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, b: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }) => number) | undefined) => [{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }]splice: { (start: number, deleteCount?: number): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; (start: number, deleteCount: number, ...items: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; }unshift: (...items: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => numberindexOf: (searchElement: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, fromIndex?: number) => numberlastIndexOf: (searchElement: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, fromIndex?: number) => numberevery: { <S>(predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => value is S, thisArg?: any): this is S[]; (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any): boolean; }some: (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any) => booleanforEach: (callbackfn: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => void, thisArg?: any) => voidmap: <U>(callbackfn: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => U, thisArg?: any) => U[]filter: { <S>(predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => value is S, thisArg?: any): S[]; (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; }reduce: { (callbackfn: (previousValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }; (callbackfn: (previousValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, initialValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }; <U>(callbackfn: (previousValue: U, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => U, initialValue: U): U; }reduceRight: { (callbackfn: (previousValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }; (callbackfn: (previousValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, initialValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }; <U>(callbackfn: (previousValue: U, currentValue: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, currentIndex: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => U, initialValue: U): U; }find: { <S>(predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, obj: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, obj: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; } | undefined; }findIndex: (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, obj: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any) => numberfill: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, start?: number, end?: number) => [{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }]copyWithin: (target: number, start: number, end?: number) => [{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }]entries: () => ArrayIterator<[number, { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }]>keys: () => ArrayIterator<number>values: () => ArrayIterator<{ toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }>includes: (searchElement: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, fromIndex?: number) => booleanflatMap: <U, This>(callback: (this: This, value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => U | readonly U[], thisArg?: This | undefined) => U[]flat: <A, D>(this: A, depth?: D | undefined) => FlatArray<A, D>[]at: (index: number) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }findLast: { <S>(predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => value is S, thisArg?: any): S | undefined; (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; } | undefined; }findLastIndex: (predicate: (value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, index: number, array: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]) => unknown, thisArg?: any) => numbertoReversed: () => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]toSorted: (compareFn?: ((a: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }, b: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }) => number) | undefined) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]toSpliced: { (start: number, deleteCount: number, ...items: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; (start: number, deleteCount?: number): { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]; }with: (index: number, value: { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }) => { toolkit?: Toolkit; mcpApp?: ResourceElement<McpAppResourceOutput> | undefined; }[]
defineMcpToolkit
Defines MCP server tools as a spreadable toolkit fragment.
defineMcpToolkitdefinition: McpToolkitDefinition
defineToolkit
Toolkit authoring helper. Accepts the permissive ToolkitDefinition
(a generative backend tool may carry its server execute) and types the
result as the canonical Toolkit.
In a "use generative" file, the compiler strips the wrapper per build so it
can split schemas, renderers, and executors across the client/server boundary.
Outside generative compilation, it returns the toolkit unchanged and can be
used for plain frontend/backend/human toolkit objects.
defineToolkit_definition: { [K in keyof TArgsByName]: (Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "frontend"; description?: string | undefined; parameters: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]>; disabled?: boolean; execute?: ToolExecuteFunction<TArgsByName[K], TResultByName[K]>; toModelOutput?: ToolModelOutputFunction<TArgsByName[K], TResultByName[K]>; experimental_onSchemaValidationError?: (args: unknown, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>; providerOptions?: ProviderOptions; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: ((args: NoInfer<TArgsByName[K]>, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>) | undefined; } & { toModelOutput?: ToolModelOutputFunction<NoInfer<TArgsByName[K]>, NoInfer<TResultByName[K]>> | undefined; } & { experimental_onSchemaValidationError?: ((args: unknown, context: ToolExecutionContext) => NoInfer<TResultByName[K]> | Promise<NoInfer<TResultByName[K]>>) | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "backend"; description?: string | undefined; parameters?: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined; disabled?: boolean; execute?: ToolExecuteFunction<TArgsByName[K], TResultByName[K]>; toModelOutput?: ToolModelOutputFunction<TArgsByName[K], TResultByName[K]>; experimental_onSchemaValidationError?: (args: unknown, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>; providerOptions?: ProviderOptions; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: ((args: NoInfer<TArgsByName[K]>, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>) | undefined; } & { toModelOutput?: ToolModelOutputFunction<NoInfer<TArgsByName[K]>, NoInfer<TResultByName[K]>> | undefined; } & { experimental_onSchemaValidationError?: ((args: unknown, context: ToolExecutionContext) => NoInfer<TResultByName[K]> | Promise<NoInfer<TResultByName[K]>>) | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "human"; description?: string | undefined; parameters: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]>; disabled?: boolean; display?: "standalone"; execute?: undefined; toModelOutput?: undefined; experimental_onSchemaValidationError?: undefined; providerOptions?: ProviderOptions; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: undefined | undefined; } & { toModelOutput?: undefined | undefined; } & { experimental_onSchemaValidationError?: undefined | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "provider"; providerId: `${string}.${string}`; parameters?: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined; args: Record<string, unknown>; supportsDeferredResults?: boolean; description?: undefined; disabled?: boolean; execute?: undefined; toModelOutput?: undefined; experimental_onSchemaValidationError?: undefined; providerOptions?: ProviderOptions; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: undefined | undefined; } & { toModelOutput?: undefined | undefined; } & { experimental_onSchemaValidationError?: undefined | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "frontend"; description?: string | undefined; parameters: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]>; disabled?: boolean; execute?: ToolExecuteFunction<TArgsByName[K], TResultByName[K]>; toModelOutput?: ToolModelOutputFunction<TArgsByName[K], TResultByName[K]>; experimental_onSchemaValidationError?: (args: unknown, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>; providerOptions?: ProviderOptions; }, "type"> & { type?: undefined; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: ((args: NoInfer<TArgsByName[K]>, context: ToolExecutionContext) => TResultByName[K] | Promise<TResultByName[K]>) | undefined; } & { toModelOutput?: ToolModelOutputFunction<NoInfer<TArgsByName[K]>, NoInfer<TResultByName[K]>> | undefined; } & { experimental_onSchemaValidationError?: ((args: unknown, context: ToolExecutionContext) => NoInfer<TResultByName[K]> | Promise<NoInfer<TResultByName[K]>>) | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "human"; description?: string | undefined; parameters: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]>; disabled?: boolean; display?: "standalone"; execute?: undefined; toModelOutput?: undefined; experimental_onSchemaValidationError?: undefined; providerOptions?: ProviderOptions; }, "type"> & { type?: undefined; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: undefined | undefined; } & { toModelOutput?: undefined | undefined; } & { experimental_onSchemaValidationError?: undefined | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }) | (Omit<Omit<{ streamCall?: ToolStreamCallFunction<TArgsByName[K], TResultByName[K]>; display?: "inline" | "standalone"; unstable_backendDefault?: { parameters?: boolean; }; } & { type: "provider"; providerId: `${string}.${string}`; parameters?: JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined; args: Record<string, unknown>; supportsDeferredResults?: boolean; description?: undefined; disabled?: boolean; execute?: undefined; toModelOutput?: undefined; experimental_onSchemaValidationError?: undefined; providerOptions?: ProviderOptions; }, "type"> & { type?: undefined; }, "type" | "execute" | "streamCall" | "toModelOutput" | "experimental_onSchemaValidationError"> & { type?: never; } & { execute?: undefined | undefined; } & { toModelOutput?: undefined | undefined; } & { experimental_onSchemaValidationError?: undefined | undefined; } & { streamCall?: ((reader: ToolCallReader<TArgsByName[K], NoInfer<TResultByName[K]>>, context: ToolExecutionContext) => void) | undefined; } & { render?: ToolCallMessagePartComponent<TArgsByName[K], TResultByName[K]> | undefined; renderText?: ToolCallText<TArgsByName[K], TResultByName[K]> | undefined; } & { parameters: NonNullable<JSONSchema7 | StandardSchemaV1<TArgsByName[K], TArgsByName[K]> | undefined>; }); }
externalTool
Marks a generative toolkit entry as an externally executed backend tool.
Use this when another system (for example a backend route or LangGraph node)
already defines and executes the tool, but assistant-ui should render its
tool calls. The use-generative compiler omits execute: externalTool()
entries from the server build and keeps a type: "backend" renderer on the
client build.
function externalTool(): never;hitl
Deprecated. Use humanTool.
const hitl: typeof humanTool;hitlTool
Deprecated. Use humanTool.
const hitlTool: typeof humanTool;humanTool
Marks a tool as human-in-the-loop: the agent pauses and the UI (render)
supplies the result instead of code. Use it as the tool's execute:
confirm: { execute: humanTool(), render: (props) => <Confirm {...props} /> }Unlike defineToolkit, it has no runtime implementation: a
"use generative" compiler (e.g. @assistant-ui/next or @assistant-ui/vite)
detects execute: humanTool(), drops it, and stamps the tool type: "human".
Reaching it at runtime means the module wasn't compiled (used outside a
"use generative" file), so it throws.
function humanTool(): never;providerTool
Marks a tool as provider-executed. The use-generative compiler converts
execute: providerTool(...) into a type: "provider" tool entry.
providerTool_config: ProviderToolConfig<Record<string, unknown>>args: Record<string, unknown>Provider-specific configuration for this tool.
parameters?: StandardSchemaV1<TArgs> | JSONSchema7Schema used by adapters for validation and type plumbing.
providerOptions?: ProviderOptionsproviderId: `${string}.${string}`Provider-defined tool identifier, e.g. `openai.web_search_preview`.
supportsDeferredResults?: booleanWhether provider results may arrive after the originating response turn.
stubTool
Marks a generative toolkit entry as a frontend tool whose executor will be
supplied by useAuiToolOverrides(...).
stubTool() has no runtime implementation. It must be used inside a
"use generative" toolkit file so the compiler can strip it.
function stubTool(): never;