summaryrefslogtreecommitdiffhomepage
path: root/js/src/tool/tool.ts
blob: 0cd65e007e42f577a1de915cf3681d7e9bddb19d (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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import { tool, type Tool as AITool } from "ai";
import { Log } from "../util/log";

const log = Log.create({ service: "tool" });

export namespace Tool {
  export interface Metadata<
    Properties extends Record<string, any> = Record<string, any>,
  > {
    properties: Properties;
    time: {
      start: number;
      end: number;
    };
  }
  export function define<
    Params,
    Output extends { metadata?: any; output: any },
    Name extends string,
  >(
    input: AITool<Params, Output> & {
      name: Name;
    },
  ) {
    return tool({
      ...input,
      execute: async (params, opts) => {
        log.info("invoking", {
          id: opts.toolCallId,
          name: input.name,
          ...params,
        });
        try {
          const start = Date.now();
          const result = await input.execute!(params, opts);
          const metadata: Metadata<Output["metadata"]> = {
            ...result.metadata,
            time: {
              start,
              end: Date.now(),
            },
          };
          return {
            metadata,
            output: result.output,
          };
        } catch (e: any) {
          log.error("error", {
            msg: e.toString(),
          });
          return {
            metadata: {
              error: true,
            },
            output: "An error occurred: " + e.toString(),
          };
        }
      },
    });
  }
}