forked from CopilotKit/CopilotKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuse-render-tool-call.ts
More file actions
89 lines (80 loc) · 2.74 KB
/
Copy pathuse-render-tool-call.ts
File metadata and controls
89 lines (80 loc) · 2.74 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { type Parameter, getZodParameters } from "@copilotkit/shared";
import { parseJson } from "@copilotkit/shared";
import { defineToolCallRenderer, useCopilotKit } from "../v2";
import type React from "react";
import { useEffect, useRef } from "react";
import {
type ActionRenderProps,
type ActionRenderPropsNoArgs,
ActionRenderPropsWait,
type FrontendAction,
} from "../types";
type ToolCallRendererDefinition = Parameters<typeof defineToolCallRenderer>[0];
export type UseRenderToolCallArgs<T extends Parameter[] | [] = []> = Pick<
FrontendAction<T>,
"name" | "description" | "parameters"
> & {
available?: "disabled" | "enabled";
render: T extends []
? (props: ActionRenderPropsNoArgs<T>) => React.ReactElement
: (props: ActionRenderProps<T>) => React.ReactElement;
};
export function useRenderToolCall<const T extends Parameter[] | [] = []>(
tool: UseRenderToolCallArgs<T>,
dependencies?: any[],
) {
const { copilotkit } = useCopilotKit();
// Track whether we've already added this renderer to avoid duplicates
const hasAddedRef = useRef(false);
useEffect(() => {
const { name, parameters, render } = tool;
const zodParameters = getZodParameters(parameters);
const renderToolCall =
name === "*"
? defineToolCallRenderer({
name: "*",
render: ((args) => {
return render({
...args,
result: args.result
? parseJson(args.result, args.result)
: args.result,
});
}) as ToolCallRendererDefinition["render"],
})
: defineToolCallRenderer({
name,
args: zodParameters,
render: ((args) => {
return render({
...args,
result: args.result
? parseJson(args.result, args.result)
: args.result,
});
}) as ToolCallRendererDefinition["render"],
});
// Remove any existing renderer with the same name
const existingIndex = copilotkit.renderToolCalls.findIndex(
(r) => r.name === name,
);
if (existingIndex !== -1) {
copilotkit.renderToolCalls.splice(existingIndex, 1);
}
// Add the new renderer
copilotkit.renderToolCalls.push(renderToolCall);
hasAddedRef.current = true;
// Cleanup: remove this renderer when the component unmounts or tool changes
return () => {
if (hasAddedRef.current) {
const index = copilotkit.renderToolCalls.findIndex(
(r) => r.name === name,
);
if (index !== -1) {
copilotkit.renderToolCalls.splice(index, 1);
}
hasAddedRef.current = false;
}
};
}, [tool, ...(dependencies ?? [])]);
}