UNPKG

@ai-sdk/provider-utils

Version:
139 lines (135 loc) • 4.63 kB
import { tool, type ProviderDefinedTool, type Tool } from './types/tool'; import type { FlexibleSchema } from './schema'; import type { Context } from './types/context'; import type { ToolExecuteFunction } from './types/tool-execute-function'; import { withTelemetryRedaction } from './telemetry-redaction'; /** * A provider-defined tool is a tool for which the provider defines the input * and output schemas, but does not execute the tool. */ export type ProviderDefinedToolFactory< INPUT, ARGS extends object, CONTEXT extends Context = {}, > = <OUTPUT>( options: ARGS & { execute?: ToolExecuteFunction<INPUT, OUTPUT, CONTEXT>; needsApproval?: Tool<INPUT, OUTPUT, CONTEXT>['needsApproval']; toModelOutput?: Tool<INPUT, OUTPUT, CONTEXT>['toModelOutput']; onInputStart?: Tool<INPUT, OUTPUT, CONTEXT>['onInputStart']; onInputDelta?: Tool<INPUT, OUTPUT, CONTEXT>['onInputDelta']; onInputAvailable?: Tool<INPUT, OUTPUT, CONTEXT>['onInputAvailable']; }, ) => ProviderDefinedTool<INPUT, OUTPUT, CONTEXT>; export function createProviderDefinedToolFactory< INPUT, ARGS extends object, CONTEXT extends Context = {}, >({ id, inputSchema, redactArgs, }: { id: `${string}.${string}`; inputSchema: FlexibleSchema<INPUT>; /** Provider-owned telemetry view of the tool configuration. */ redactArgs?: (args: Record<string, unknown>) => Record<string, unknown>; }): ProviderDefinedToolFactory<INPUT, ARGS, CONTEXT> { return <OUTPUT>({ execute, outputSchema, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, ...args }: ARGS & { execute?: ToolExecuteFunction<INPUT, OUTPUT, CONTEXT>; outputSchema?: FlexibleSchema<OUTPUT>; needsApproval?: Tool<INPUT, OUTPUT, CONTEXT>['needsApproval']; toModelOutput?: Tool<INPUT, OUTPUT, CONTEXT>['toModelOutput']; onInputStart?: Tool<INPUT, OUTPUT, CONTEXT>['onInputStart']; onInputDelta?: Tool<INPUT, OUTPUT, CONTEXT>['onInputDelta']; onInputAvailable?: Tool<INPUT, OUTPUT, CONTEXT>['onInputAvailable']; }): ProviderDefinedTool<INPUT, OUTPUT, CONTEXT> => tool({ type: 'provider', isProviderExecuted: false, id, args: redactArgs == null ? args : withTelemetryRedaction(args, redactArgs), inputSchema, outputSchema, execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, }) as ProviderDefinedTool<INPUT, OUTPUT, CONTEXT>; } export type ProviderDefinedToolFactoryWithOutputSchema< INPUT, OUTPUT, ARGS extends object, CONTEXT extends Context = {}, > = ( options: ARGS & { execute?: ToolExecuteFunction<INPUT, OUTPUT, CONTEXT>; needsApproval?: Tool<INPUT, OUTPUT, CONTEXT>['needsApproval']; toModelOutput?: Tool<INPUT, OUTPUT, CONTEXT>['toModelOutput']; onInputStart?: Tool<INPUT, OUTPUT, CONTEXT>['onInputStart']; onInputDelta?: Tool<INPUT, OUTPUT, CONTEXT>['onInputDelta']; onInputAvailable?: Tool<INPUT, OUTPUT, CONTEXT>['onInputAvailable']; }, ) => ProviderDefinedTool<INPUT, OUTPUT, CONTEXT>; export function createProviderDefinedToolFactoryWithOutputSchema< INPUT, OUTPUT, ARGS extends object, CONTEXT extends Context = {}, >({ id, inputSchema, outputSchema, redactArgs, }: { id: `${string}.${string}`; inputSchema: FlexibleSchema<INPUT>; outputSchema: FlexibleSchema<OUTPUT>; /** Provider-owned telemetry view of the tool configuration. */ redactArgs?: (args: Record<string, unknown>) => Record<string, unknown>; }): ProviderDefinedToolFactoryWithOutputSchema<INPUT, OUTPUT, ARGS, CONTEXT> { return ({ execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, ...args }: ARGS & { execute?: ToolExecuteFunction<INPUT, OUTPUT, CONTEXT>; needsApproval?: Tool<INPUT, OUTPUT, CONTEXT>['needsApproval']; toModelOutput?: Tool<INPUT, OUTPUT, CONTEXT>['toModelOutput']; onInputStart?: Tool<INPUT, OUTPUT, CONTEXT>['onInputStart']; onInputDelta?: Tool<INPUT, OUTPUT, CONTEXT>['onInputDelta']; onInputAvailable?: Tool<INPUT, OUTPUT, CONTEXT>['onInputAvailable']; }): ProviderDefinedTool<INPUT, OUTPUT, CONTEXT> => tool({ type: 'provider', isProviderExecuted: false, id, args: redactArgs == null ? args : withTelemetryRedaction(args, redactArgs), inputSchema, outputSchema, execute, needsApproval, toModelOutput, onInputStart, onInputDelta, onInputAvailable, }) as ProviderDefinedTool<INPUT, OUTPUT, CONTEXT>; }