import { Static } from "@sinclair/typebox";
import { FunctionTool } from "./definition";
import { RequiredActionFunctionToolCall } from "openai/resources/beta/threads/runs/runs";
import { AssistantFunction, ToolOutput } from "./types/openai";
import { ValueError } from "@sinclair/typebox/value";
type Output = string | number | boolean | object;
export type ToolsDefsToToolbox<T extends Record<string, FunctionTool>> = {
    [key in keyof T]: (params: Static<T[key]["parameters"]>) => Promise<Output>;
};
type ToolContext = {
    action: RequiredActionFunctionToolCall;
    options: ToolOptions;
    toolDef?: FunctionTool;
};
export type ToolOptions = {
    validateArguments: boolean;
    jsonParser: (args: string, ctx: ToolContext) => unknown;
    validator: (args: unknown, ctx: ToolContext) => void;
    formatToolError: (error: unknown, ctx: ToolContext) => string;
    formatValidationError: (errors: ValueError[], ctx: ToolContext) => string;
    formatOutput: (output: Output, ctx: ToolContext) => string;
};
export declare const defaultOptions: ToolOptions;
export type ToolBox<T extends Record<string, FunctionTool>> = {
    toolDefs: T;
    toolsFn: ToolsDefsToToolbox<T>;
    options: ToolOptions;
    handleAction: (action: RequiredActionFunctionToolCall) => Promise<Required<ToolOutput>>;
    payload: AssistantFunction[];
};
export declare const join: (...toolboxes: ToolBox<any>[]) => ToolBox<any>;
export declare const filter: <T extends Record<string, FunctionTool>>(tb: ToolBox<T>, filter: (key: string, tool: FunctionTool) => boolean) => ToolBox<any>;
export declare const toolbox: <T extends Record<string, FunctionTool>>(toolDefs: T, toolsFn: ToolsDefsToToolbox<T>, options?: Partial<ToolOptions>) => ToolBox<T>;
/**
 * Throw this if you want your assistant to receive the error message
 */
export declare class AssistantVisibleError extends Error {
    constructor(message?: string);
}
export {};
//# sourceMappingURL=toolbox.d.ts.map