@ai-sdk/provider-utils
Version:
139 lines (135 loc) • 4.63 kB
text/typescript
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>;
}