AI SDK
Stream useChat responses from a procedure, and give procedures to the model as tools.
On this page
AI SDK (v7) streams chat responses as a ReadableStream of UI message chunks. A procedure returns that stream as it is, and the client gets a ReadableStream back, which is what useChat's transport returns. This needs no adapter package, and it's tested against the real library in test/integration/.
import {
function convertToModelMessages<UI_MESSAGE extends UIMessage>(messages: Array<Omit<UI_MESSAGE, "id">>, options?: {
tools?: ToolSet;
ignoreIncompleteToolCalls?: boolean;
convertDataPart?: (part: DataUIPart<InferUIMessageData<UI_MESSAGE>>) => TextPart | FilePart | undefined;
}): Promise<ModelMessage[]>
convertToModelMessages,
function streamText<TOOLS extends ToolSet, RUNTIME_CONTEXT extends Context = Context, OUTPUT extends Output = Output<string, string, never>>({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, streamRetries, abortSignal, timeout, headers, stopWhen, experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry, prepareStep, providerOptions, activeTools, toolOrder, experimental_repairToolCall, repairToolCall, experimental_refineToolInput: refineToolInput, experimental_transform: transform, experimental_download: download, includeRawChunks, onChunk, onError: onErrorArg, onFinish, onEnd, onAbort, onStepEnd, onStepFinish, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, runtimeContext, toolsContext, experimental_include, include, _internal: { now, generateId, generateCallId }, ...settings }: LanguageModelCallOptions & RequestOptions<TOOLS> & Prompt & ToolsContextParameter<TOOLS> & {
model: LanguageModel;
toolChoice?: ToolChoice<TOOLS>;
stopWhen?: Arrayable<StopCondition<NoInfer<TOOLS>, RUNTIME_CONTEXT>>;
telemetry?: TelemetryOptions<RUNTIME_CONTEXT, NoInfer<TOOLS>>;
experimental_telemetry?: TelemetryOptions<RUNTIME_CONTEXT, NoInfer<TOOLS>>;
providerOptions?: ProviderOptions;
experimental_sandbox?: SandboxSession;
runtimeContext?: RUNTIME_CONTEXT;
activeTools?: ActiveTools<NoInfer<TOOLS>>;
toolOrder?: ToolOrder<NoInfer<TOOLS>>;
output?: OUTPUT;
toolApproval?: ToolApprovalConfiguration<TOOLS, RUNTIME_CONTEXT>;
experimental_toolCallers?: Experimental_ToolCallers<NoInfer<TOOLS>>;
experimental_toolApprovalSecret?: string | Uint8Array;
prepareStep?: PrepareStepFunction<NoInfer<TOOLS>, RUNTIME_CONTEXT>;
repairToolCall?: ToolCallRepairFunction<TOOLS>;
experimental_repairToolCall?: ToolCallRepairFunction<TOOLS>;
experimental_refineToolInput?: ToolInputRefinement<NoInfer<TOOLS>>;
experimental_transform?: Arrayable<StreamTextTransform<TOOLS>>;
experimental_download?: DownloadFunction | undefined;
includeRawChunks?: boolean;
onChunk?: StreamTextOnChunkCallback<TOOLS>;
onError?: StreamTextOnErrorCallback | StreamTextOnErrorRetryCallback | StreamTextOnErrorHandler;
streamRetries?: number;
onEnd?: StreamTextOnEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onFinish?: StreamTextOnEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onAbort?: StreamTextOnAbortCallback<...>;
onStepEnd?: GenerateTextOnStepEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
onStart?: GenerateTextOnStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
experimental_onStart?: GenerateTextOnStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onStepStart?: GenerateTextOnStepStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
experimental_onStepStart?: GenerateTextOnStepStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onLanguageModelCallStart?: OnLanguageModelCallStartCallback;
experimental_onLanguageModelCallStart?: OnLanguageModelCallStartCallback;
onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<NoInfer<TOOLS>>;
experimental_onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<NoInfer<TOOLS>>;
onToolExecutionStart?: OnToolExecutionStartCallback<NoInfer<TOOLS>>;
experimental_onToolCallStart?: OnToolExecutionStartCallback<NoInfer<TOOLS>>;
onToolExecutionEnd?: OnToolExecutionEndCallback<NoInfer<TOOLS>>;
experimental_onToolCallFinish?: OnToolExecutionEndCallback<NoInfer<TOOLS>>;
include?: StreamTextInclude;
experimental_include?: StreamTextInclude;
_internal?: {
now?: () => number;
generateId?: IdGenerator;
generateCallId?: IdGenerator;
};
}): StreamTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>
streamText,
function toUIMessageStream<TOOLS extends ToolSet = ToolSet, UI_MESSAGE extends UIMessage = UIMessage<unknown, UIDataTypes, UITools>>({ stream, tools, sendReasoning, sendSources, sendStart, sendFinish, onError, messageMetadata, originalMessages, generateMessageId, onStepEnd, onStepFinish, onEnd, onFinish }: {
stream: ReadableStream<TextStreamPart<TOOLS>>;
tools?: TOOLS;
} & UIMessageStreamOptions<UI_MESSAGE>): ReadableStream<InferUIMessageChunk<UI_MESSAGE>>
toUIMessageStream,
type interface UIMessage<METADATA = unknown, DATA_PARTS extends UIDataTypes = UIDataTypes, TOOLS extends UITools = UITools>UIMessage,
} from 'ai';
const const router: {
chat: BuildProcedure<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>, "mutation", {
output: ReadableStream<InferUIMessageChunk<UIMessage<unknown, UIDataTypes, UITools>>>;
errors: never;
services: never;
unmapped: never;
}>;
}
router = {
chat: BuildProcedure<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>, "mutation", {
output: ReadableStream<InferUIMessageChunk<UIMessage<unknown, UIDataTypes, UITools>>>;
errors: never;
services: never;
unmapped: never;
}>
chat: const t: TrpcRoot<Context, {}, RootDef<Context, {}>>t.TrpcRoot<Context, {}, RootDef<Context, {}>>.procedure: ProcedureBuilder<RootDef<Context, {}>>procedure
.ProcedureBuilder<RootDef<Context, {}>>.input<z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>(schema: z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>): ProcedureBuilder<InputDef<RootDef<Context, {}>, z.ZodObject<...>>> (+1 overload)
input(
import zz.function object<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}>(shape?: {
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
} | undefined, params?: string | {
error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssueUnrecognizedKeys | z.core.$ZodIssueInvalidType<unknown>>> | undefined;
message?: string | undefined | undefined;
} | undefined): z.ZodObject<...>
object({
chatId: z.ZodStringchatId: import zz.function string(params?: string | z.core.$ZodStringParams): z.ZodString (+1 overload)string(),
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>messages: import zz.function array<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>(element: z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>, params?: string | z.core.$ZodArrayParams): z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>array(import zz.function custom<UIMessage<unknown, UIDataTypes, UITools>>(fn?: (data: unknown) => unknown, _params?: string | {
path?: PropertyKey[] | undefined | undefined;
params?: Record<string, any> | undefined;
abort?: boolean | undefined | undefined;
when?: ((payload: z.core.ParsePayload) => boolean) | undefined | undefined;
error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssue>> | undefined;
message?: string | undefined | undefined;
} | undefined): z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<...>>
custom<interface UIMessage<METADATA = unknown, DATA_PARTS extends UIDataTypes = UIDataTypes, TOOLS extends UITools = UITools>UIMessage>()),
}),
)
.ProcedureBuilder<InputDef<RootDef<Context, {}>, ZodObject<{ chatId: ZodString; messages: ZodArray<ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<...>>>; }, $strip>>>.mutation<Promise<ReadableStream<InferUIMessageChunk<UIMessage<unknown, UIDataTypes, UITools>>>>>(resolver: (opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>>) => Promise<ReadableStream<InferUIMessageChunk<UIMessage<unknown, UIDataTypes, UITools>>>>): BuildProcedure<...>
mutation(async (opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>>
opts) => {
const const result: StreamTextResult<ToolSet, Context, Output<string, string, never>>result = streamText<ToolSet, Context, Output<string, string, never>>({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, streamRetries, abortSignal, timeout, headers, stopWhen, experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry, prepareStep, providerOptions, activeTools, toolOrder, experimental_repairToolCall, repairToolCall, experimental_refineToolInput: refineToolInput, experimental_transform: transform, experimental_download: download, includeRawChunks, onChunk, onError: onErrorArg, onFinish, onEnd, onAbort, onStepEnd, onStepFinish, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, runtimeContext, toolsContext, experimental_include, include, _internal: { now, generateId, generateCallId }, ...settings }: ((LanguageModelCallOptions & (RequestOptions<ToolSet> & Prompt)) & {
tools?: ToolSet | undefined;
}) & {
toolsContext?: never;
} & {
model: LanguageModel;
toolChoice?: ToolChoice<ToolSet> | undefined;
stopWhen?: Arrayable<StopCondition<NoInfer<ToolSet>, Context>>;
telemetry?: TelemetryOptions<Context, NoInfer<ToolSet>> | undefined;
... 39 more ...;
_internal?: {
now?: () => number;
generateId?: IdGenerator;
generateCallId?: IdGenerator;
};
}): StreamTextResult<...>
streamText({
model: LanguageModelmodel,
messages: ModelMessage[]messages: await convertToModelMessages<UIMessage<unknown, UIDataTypes, UITools>>(messages: Omit<UIMessage<unknown, UIDataTypes, UITools>, "id">[], options?: {
tools?: ToolSet;
ignoreIncompleteToolCalls?: boolean;
convertDataPart?: ((part: {
type: `data-${string}`;
id?: string;
data: unknown;
}) => TextPart | FilePart | undefined) | undefined;
} | undefined): Promise<ModelMessage[]>
convertToModelMessages(opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>>
opts.ResolverOpts<InputDef<RootDef<Context, {}>, ZodObject<{ chatId: ZodString; messages: ZodArray<ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<...>>>; }, $strip>>>.input: {
chatId: string;
messages: UIMessage<unknown, UIDataTypes, UITools>[];
}
input.messages: UIMessage<unknown, UIDataTypes, UITools>[]messages),
abortSignal?: AbortSignal | undefinedabortSignal: opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
chatId: z.ZodString;
messages: z.ZodArray<z.ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<unknown, UIDataTypes, UITools>>>;
}, z.core.$strip>>>
opts.ResolverOpts<InputDef<RootDef<Context, {}>, ZodObject<{ chatId: ZodString; messages: ZodArray<ZodCustom<UIMessage<unknown, UIDataTypes, UITools>, UIMessage<...>>>; }, $strip>>>.signal: AbortSignalsignal,
});
return toUIMessageStream<ToolSet, UIMessage<unknown, UIDataTypes, UITools>>({ stream, tools, sendReasoning, sendSources, sendStart, sendFinish, onError, messageMetadata, originalMessages, generateMessageId, onStepEnd, onStepFinish, onEnd, onFinish }: {
stream: ReadableStream<TextStreamPart<ToolSet>>;
tools?: ToolSet | undefined;
} & UIMessageStreamOptions<UIMessage<unknown, UIDataTypes, UITools>>): ReadableStream<InferUIMessageChunk<UIMessage<unknown, UIDataTypes, UITools>>>
toUIMessageStream({ stream: ReadableStream<TextStreamPart<ToolSet>>stream: const result: StreamTextResult<ToolSet, Context, Output<string, string, never>>result.StreamTextResult<ToolSet, Context, Output<string, string, never>>.stream: AsyncIterableStream<TextStreamPart<ToolSet>>stream });
}),
};import { useChat } from '@ai-sdk/react';
const chat = useChat({
transport: {
sendMessages: (opts) =>
client.chat.mutate(
{ chatId: opts.chatId, messages: opts.messages },
{ signal: opts.abortSignal },
),
reconnectToStream: async () => null,
},
});- The chunks stream as JSONL (or binary frames) and arrive as plain objects, so AI SDK's
structuredCloneworks on them. - Stopping the chat aborts the call;
signalreachesstreamText, which stops the model. reconnectToStreamreturningnullmeans "nothing to resume". For resumable chats, keep the stream behind aPublisherchannel and return a subscription to it.
Procedures as tools
AI SDK takes Standard Schema as a tool's inputSchema, so a tool reuses the procedure's input schema and runs the procedure with call(), middleware and validation included:
import { function generateText<TOOLS extends ToolSet, RUNTIME_CONTEXT extends Context = Context, OUTPUT extends Output = Output<string, string, any>>({ model: modelArg, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries: maxRetriesArg, abortSignal, timeout, headers, stopWhen, experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry, providerOptions, activeTools, toolOrder, prepareStep, experimental_repairToolCall, repairToolCall, experimental_refineToolInput: refineToolInput, experimental_download: download, runtimeContext, toolsContext, experimental_include, include, _internal: { generateId, generateCallId, now }, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, onStepEnd, onStepFinish, onFinish, onEnd, ...settings }: LanguageModelCallOptions & RequestOptions<TOOLS> & Prompt & ToolsContextParameter<TOOLS> & {
model: LanguageModel;
toolChoice?: ToolChoice<NoInfer<TOOLS>>;
stopWhen?: Arrayable<StopCondition<NoInfer<TOOLS>, RUNTIME_CONTEXT>>;
telemetry?: TelemetryOptions<RUNTIME_CONTEXT, NoInfer<TOOLS>>;
experimental_telemetry?: TelemetryOptions<RUNTIME_CONTEXT, NoInfer<TOOLS>>;
providerOptions?: ProviderOptions;
experimental_sandbox?: SandboxSession;
runtimeContext?: RUNTIME_CONTEXT;
activeTools?: ActiveTools<NoInfer<TOOLS>>;
toolOrder?: ToolOrder<NoInfer<TOOLS>>;
output?: OUTPUT;
toolApproval?: ToolApprovalConfiguration<TOOLS, RUNTIME_CONTEXT>;
experimental_toolCallers?: Experimental_ToolCallers<NoInfer<TOOLS>>;
experimental_toolApprovalSecret?: string | Uint8Array;
experimental_download?: DownloadFunction | undefined;
prepareStep?: PrepareStepFunction<NoInfer<TOOLS>, RUNTIME_CONTEXT>;
repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;
experimental_repairToolCall?: ToolCallRepairFunction<NoInfer<TOOLS>>;
experimental_refineToolInput?: ToolInputRefinement<NoInfer<TOOLS>>;
onStart?: GenerateTextOnStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
experimental_onStart?: GenerateTextOnStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onStepStart?: GenerateTextOnStepStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
experimental_onStepStart?: GenerateTextOnStepStartCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>, NoInfer<OUTPUT>>;
onLanguageModelCallStart?: OnLanguageModelCallStartCallback;
experimental_onLanguageModelCallStart?: OnLanguageModelCallStartCallback;
onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<NoInfer<TOOLS>>;
experimental_onLanguageModelCallEnd?: OnLanguageModelCallEndCallback<NoInfer<TOOLS>>;
onToolExecutionStart?: OnToolExecutionStartCallback<NoInfer<TOOLS>>;
experimental_onToolCallStart?: OnToolExecutionStartCallback<NoInfer<TOOLS>>;
onToolExecutionEnd?: OnToolExecutionEndCallback<NoInfer<TOOLS>>;
experimental_onToolCallFinish?: OnToolExecutionEndCallback<NoInfer<TOOLS>>;
onStepEnd?: GenerateTextOnStepEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
onStepFinish?: GenerateTextOnStepFinishCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
onEnd?: GenerateTextOnEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
onFinish?: GenerateTextOnEndCallback<NoInfer<TOOLS>, NoInfer<RUNTIME_CONTEXT>>;
include?: GenerateTextInclude;
experimental_include?: GenerateTextInclude;
_internal?: {
generateId?: IdGenerator;
generateCallId?: IdGenerator;
now?: () => number;
};
}): Promise<GenerateTextResult<TOOLS, RUNTIME_CONTEXT, OUTPUT>>
generateText, function tool<INPUT, OUTPUT, CONTEXT extends Context>(tool: Tool<INPUT, OUTPUT, CONTEXT> & {
execute: ToolExecuteFunction<INPUT, OUTPUT, CONTEXT>;
}): ExecutableTool<Tool<INPUT, OUTPUT, CONTEXT>> (+4 overloads)
tool } from 'ai';
import { function call<TDef extends ProcedureDef>(procedure: Procedure<TDef>, input: TDef["input"], opts: CallOptions<TDef>): Promise<TDef["output"]>call } from '@trpc12/trpc/server';
const const WeatherInput: z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>
WeatherInput = import zz.function object<{
city: z.ZodString;
}>(shape?: {
city: z.ZodString;
} | undefined, params?: string | {
error?: string | z.core.$ZodErrorMap<NonNullable<z.core.$ZodIssueInvalidType<unknown> | z.core.$ZodIssueUnrecognizedKeys>> | undefined;
message?: string | undefined | undefined;
} | undefined): z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>
object({ city: z.ZodStringcity: import zz.function string(params?: string | z.core.$ZodStringParams): z.ZodString (+1 overload)string() });
const const weatherProcedure: BuildProcedure<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>, "query", {
output: string;
errors: never;
services: never;
unmapped: never;
}>
weatherProcedure = const t: TrpcRoot<Context, {}, RootDef<Context, {}>>t.TrpcRoot<Context, {}, RootDef<Context, {}>>.procedure: ProcedureBuilder<RootDef<Context, {}>>procedure
.ProcedureBuilder<RootDef<Context, {}>>.input<z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>(schema: z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>): ProcedureBuilder<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>> (+1 overload)
input(const WeatherInput: z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>
WeatherInput)
.ProcedureBuilder<InputDef<RootDef<Context, {}>, ZodObject<{ city: ZodString; }, $strip>>>.query<Promise<string>>(resolver: (opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>>) => Promise<string>): BuildProcedure<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>, "query", {
output: string;
errors: never;
services: never;
unmapped: never;
}>
query((opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>>
opts) => function forecast(city: string): Promise<string>forecast(opts: ResolverOpts<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>>
opts.ResolverOpts<InputDef<RootDef<Context, {}>, ZodObject<{ city: ZodString; }, $strip>>>.input: {
city: string;
}
input.city: stringcity));
const const weather: ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & {
...;
} & {
...;
} & {
...;
} & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
})
weather = tool<{
city: string;
}, string, Context>(tool: ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & {
...;
} & {
...;
} & {
...;
} & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
})): ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ... 2 more ... | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => ... (+4 overloads)
tool({
description?: string | ((options: {
context: NoInfer<Context>;
experimental_sandbox?: SandboxSession;
}) => string) | undefined
description: 'The weather in a city',
inputSchema: FlexibleSchema<{
city: string;
}>
inputSchema: const WeatherInput: z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>
WeatherInput,
execute: (input: {
city: string;
}) => Promise<string>
execute: (input: {
city: string;
}
input) => call<{
type: "query";
ctx: Context;
meta: {};
input: {
city: string;
};
output: string;
errors: InputValidationError<{
readonly code: "unrecognized_keys";
readonly keys: readonly string[];
readonly path: readonly [] | readonly ["city"];
readonly message: string;
} | {
readonly code: "invalid_type";
readonly expected: z.core.$ZodInvalidTypeExpected;
readonly path: readonly [] | readonly ["city"];
readonly message: string;
} | {
readonly code: "too_big";
readonly origin: "number" | "int" | "bigint" | "date" | "string" | "array" | "set" | "file" | (string & {});
readonly maximum: string | number;
readonly inclusive?: boolean | undefined;
readonly exact?: boolean | undefined;
readonly path: readonly [] | readonly [...];
readonly message: string;
} | ... 8 more ... | {
...;
}>;
services: never;
}>(procedure: Procedure<...>, input: {
...;
}, opts: CallOptions<...>): Promise<...>
call(const weatherProcedure: BuildProcedure<InputDef<RootDef<Context, {}>, z.ZodObject<{
city: z.ZodString;
}, z.core.$strip>>, "query", {
output: string;
errors: never;
services: never;
unmapped: never;
}>
weatherProcedure, input: {
city: string;
}
input, { ctx: Contextctx }),
});
await generateText<{
weather: ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & {
...;
} & {
...;
} & {
...;
} & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
});
}, Context, Output<...>>({ model: modelArg, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries: maxRetriesArg, abortSignal, timeout, headers, stopWhen, experimental_sandbox: sandbox, output, toolApproval, experimental_toolCallers, experimental_toolApprovalSecret, experimental_telemetry, telemetry, providerOptions, activeTools, toolOrder, prepareStep, experimental_repairToolCall, repairToolCall, experimental_refineToolInput: refineToolInput, experimental_download: download, runtimeContext, toolsContext, experimental_include, include, _internal: { generateId, generateCallId, now }, onStart, experimental_onStart, onStepStart, experimental_onStepStart, onLanguageModelCallStart, experimental_onLanguageModelCallStart, onLanguageModelCallEnd, experimental_onLanguageModelCallEnd, onToolExecutionStart, onToolExecutionEnd, experimental_onToolCallStart, experimental_onToolCallFinish, onStepEnd, onStepFinish, onFinish, onEnd, ...settings }: ((LanguageModelCallOptions & (RequestOptions<...> & Prompt)) & {
...;
}) ...
generateText({ model: LanguageModelmodel, tools?: {
weather: ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & {
...;
} & {
...;
} & {
...;
} & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
});
} | undefined
tools: { weather: ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & {
...;
} & {
...;
} & {
...;
} & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
}) | ({
deferLoading?: boolean;
title?: string;
providerOptions?: ProviderOptions;
metadata?: JSONObject;
inputSchema: FlexibleSchema<{
city: string;
}>;
contextSchema?: FlexibleSchema<Context> | undefined;
needsApproval?: boolean | ToolNeedsApprovalFunction<{
city: string;
}, NoInfer<Context>> | undefined;
onInputStart?: ((options: ToolExecutionOptions<NoInfer<Context>>) => void | PromiseLike<void>) | undefined;
onInputDelta?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
onInputAvailable?: ((options: {
...;
} & ToolExecutionOptions<...>) => void | PromiseLike<void>) | undefined;
toModelOutput?: ((options: {
...;
}) => ToolResultOutput | PromiseLike<ToolResultOutput>) | undefined;
} & ... 3 more ... & {
...;
})
weather }, prompt: string | ModelMessage[]prompt });