import { z } from "zod"; import { CallbackManagerForToolRun } from "../callbacks/manager.js"; import { StructuredTool, Tool, ToolParams } from "./base.js"; export interface BaseDynamicToolInput extends ToolParams { name: string; description: string; returnDirect?: boolean; } export interface DynamicToolInput extends BaseDynamicToolInput { func: ( input: string, runManager?: CallbackManagerForToolRun ) => Promise; } export interface DynamicStructuredToolInput< // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends z.ZodObject = z.ZodObject > extends BaseDynamicToolInput { func: ( input: z.infer, runManager?: CallbackManagerForToolRun ) => Promise; schema: T; } /** * A tool that can be created dynamically from a function, name, and description. */ export class DynamicTool extends Tool { name: string; description: string; func: DynamicToolInput["func"]; constructor(fields: DynamicToolInput) { super(fields); this.name = fields.name; this.description = fields.description; this.func = fields.func; this.returnDirect = fields.returnDirect ?? this.returnDirect; } /** @ignore */ async _call( input: string, runManager?: CallbackManagerForToolRun ): Promise { return this.func(input, runManager); } } export class DynamicStructuredTool< // eslint-disable-next-line @typescript-eslint/no-explicit-any T extends z.ZodObject = z.ZodObject > extends StructuredTool { name: string; description: string; func: DynamicStructuredToolInput["func"]; schema: T; constructor(fields: DynamicStructuredToolInput) { super(fields); this.name = fields.name; this.description = fields.description; this.func = fields.func; this.returnDirect = fields.returnDirect ?? this.returnDirect; this.schema = fields.schema; } protected _call( arg: z.output, runManager?: CallbackManagerForToolRun ): Promise { return this.func(arg, runManager); } }