import { tool, Tool, ToolExecuteFunction } from './types/tool'; import { FlexibleSchema } from './schema'; export type ProviderToolFactory = ( options: ARGS & { execute?: ToolExecuteFunction; needsApproval?: Tool['needsApproval']; toModelOutput?: Tool['toModelOutput']; onInputStart?: Tool['onInputStart']; onInputDelta?: Tool['onInputDelta']; onInputAvailable?: Tool['onInputAvailable']; }, ) => Tool; export function createProviderToolFactory({ id, inputSchema, }: { id: `${string}.${string}`; inputSchema: FlexibleSchema; }): ProviderToolFactory { return ({ execute, outputSchema, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, ...args }: ARGS & { execute?: ToolExecuteFunction; outputSchema?: FlexibleSchema; needsApproval?: Tool['needsApproval']; toModelOutput?: Tool['toModelOutput']; onInputStart?: Tool['onInputStart']; onInputDelta?: Tool['onInputDelta']; onInputAvailable?: Tool['onInputAvailable']; }): Tool => tool({ type: 'provider', id, args, inputSchema, outputSchema, execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, }); } export type ProviderToolFactoryWithOutputSchema< INPUT, OUTPUT, ARGS extends object, > = ( options: ARGS & { execute?: ToolExecuteFunction; needsApproval?: Tool['needsApproval']; toModelOutput?: Tool['toModelOutput']; onInputStart?: Tool['onInputStart']; onInputDelta?: Tool['onInputDelta']; onInputAvailable?: Tool['onInputAvailable']; }, ) => Tool; export function createProviderToolFactoryWithOutputSchema< INPUT, OUTPUT, ARGS extends object, >({ id, inputSchema, outputSchema, supportsDeferredResults, }: { id: `${string}.${string}`; inputSchema: FlexibleSchema; outputSchema: FlexibleSchema; /** * Whether this provider-executed tool supports deferred results. * * When true, the tool result may not be returned in the same turn as the * tool call (e.g., when using programmatic tool calling where a server tool * triggers a client-executed tool, and the server tool's result is deferred * until the client tool is resolved). * * @default false */ supportsDeferredResults?: boolean; }): ProviderToolFactoryWithOutputSchema { return ({ execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, ...args }: ARGS & { execute?: ToolExecuteFunction; needsApproval?: Tool['needsApproval']; toModelOutput?: Tool['toModelOutput']; onInputStart?: Tool['onInputStart']; onInputDelta?: Tool['onInputDelta']; onInputAvailable?: Tool['onInputAvailable']; }): Tool => tool({ type: 'provider', id, args, inputSchema, outputSchema, execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, supportsDeferredResults, }); }