summaryrefslogtreecommitdiffhomepage
path: root/packages/core/src/tools/registry.ts
blob: 4699c935e3b9999e82e6f72b46eba68e4e5ba239 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { tool } from "ai";
import { z } from "zod";
import type { ToolDefinition } from "../types/index.js";

export function createToolRegistry(tools: ToolDefinition[]) {
	const toolMap = new Map<string, ToolDefinition>(tools.map((t) => [t.name, t]));

	return {
		getTools(): ToolDefinition[] {
			return [...toolMap.values()];
		},

		getTool(name: string): ToolDefinition | undefined {
			return toolMap.get(name);
		},

		getAISDKTools() {
			const result: Record<string, ReturnType<typeof tool>> = {};
			for (const [name, def] of toolMap) {
				const schema = def.parameters;
				const t = tool({
					description: def.description,
					parameters: schema instanceof z.ZodObject ? schema : z.object({}),
					execute: async (args) => {
						return def.execute(args as Record<string, unknown>);
					},
				});
				// The AI SDK tool() overloads cause type narrowing issues when
				// execute is provided. The runtime value is correct.
				result[name] = t as unknown as ReturnType<typeof tool>;
			}
			return result;
		},
	};
}