import { JSONSchemaType } from 'ajv';
import { z } from 'zod';
import { JSONValue } from '../../global/dist/index.cjs';
import { BaseTool, ToolMetadata } from '../../llms/dist/index.cjs';

declare class FunctionTool<T, R extends JSONValue | Promise<JSONValue>, AdditionalToolArgument extends object = object> implements BaseTool<T> {
    #private;
    constructor(fn: (input: T, additionalArg?: AdditionalToolArgument) => R, metadata: ToolMetadata<JSONSchemaType<T>>, zodType?: z.ZodType<T>, additionalArg?: AdditionalToolArgument);
    static from<T, AdditionalToolArgument extends object = object>(fn: (input: T, additionalArg?: AdditionalToolArgument) => JSONValue | Promise<JSONValue>, schema: ToolMetadata<JSONSchemaType<T>>): FunctionTool<T, JSONValue | Promise<JSONValue>, AdditionalToolArgument>;
    static from<R extends z.ZodType, AdditionalToolArgument extends object = object>(fn: (input: z.infer<R>, additionalArg?: AdditionalToolArgument) => JSONValue | Promise<JSONValue>, schema: Omit<ToolMetadata, "parameters"> & {
        parameters: R;
    }): FunctionTool<z.infer<R>, JSONValue | Promise<JSONValue>, AdditionalToolArgument>;
    static from<T, R extends z.ZodType<T>, AdditionalToolArgument extends object = object>(fn: (input: T, additionalArg?: AdditionalToolArgument) => JSONValue | Promise<JSONValue>, schema: Omit<ToolMetadata, "parameters"> & {
        parameters: R;
    }): FunctionTool<T, JSONValue, AdditionalToolArgument>;
    static from<R extends z.ZodType, AdditionalToolArgument extends object = object>(config: Omit<ToolMetadata, "parameters"> & {
        parameters: R;
        execute: (input: z.infer<R>, additionalArg?: AdditionalToolArgument) => JSONValue | Promise<JSONValue>;
    }): FunctionTool<z.infer<R>, JSONValue | Promise<JSONValue>, AdditionalToolArgument>;
    get metadata(): BaseTool<T>["metadata"];
    bind: (additionalArg: AdditionalToolArgument) => FunctionTool<T, R, AdditionalToolArgument>;
    call: (input: T) => R;
}
/**
 * A simpler alias for creating a FunctionTool.
 */
declare const tool: typeof FunctionTool.from;

export { FunctionTool, tool };
