62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
/**
|
|
* Minimal Kimi deferred-tool loading demo.
|
|
*
|
|
* pi -e ./kimi-deferred-tools.ts
|
|
* example prompt: Use the available tools to calculate 100 + 500. Do not calculate it yourself.
|
|
*/
|
|
|
|
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
import { Type } from "typebox";
|
|
|
|
function calculate(_expr: string): string {
|
|
return "42";
|
|
}
|
|
|
|
export default function (pi: ExtensionAPI): void {
|
|
pi.registerTool({
|
|
name: "Calculator",
|
|
label: "Calculator",
|
|
description: "Evaluate a simple arithmetic expression.",
|
|
parameters: Type.Object({
|
|
expr: Type.String({ description: "An expression such as 100 + 500" }),
|
|
}),
|
|
async execute(_toolCallId, params) {
|
|
return {
|
|
content: [{ type: "text", text: calculate(params.expr) }],
|
|
details: {},
|
|
};
|
|
},
|
|
});
|
|
|
|
pi.registerTool({
|
|
name: "tool_search",
|
|
label: "Tool Search",
|
|
description: "Find and activate tools for a capability.",
|
|
promptSnippet: "Search for additional tools when the active tools cannot perform the task",
|
|
parameters: Type.Object({
|
|
query: Type.String({ description: "Capability to search for" }),
|
|
}),
|
|
async execute(_toolCallId, params) {
|
|
if (!params.query.toLowerCase().includes("calc")) {
|
|
return {
|
|
content: [{ type: "text", text: "The relevant tools do not exist." }],
|
|
details: { matches: [], added: [] },
|
|
};
|
|
}
|
|
|
|
const active = pi.getActiveTools();
|
|
const added = active.includes("Calculator") ? [] : ["Calculator"];
|
|
if (added.length > 0) pi.setActiveTools([...active, ...added]);
|
|
|
|
return {
|
|
content: [{ type: "text", text: "Success. Found 1 matching tool(s)" }],
|
|
details: { matches: ["Calculator"], added },
|
|
};
|
|
},
|
|
});
|
|
|
|
pi.on("session_start", () => {
|
|
pi.setActiveTools(["tool_search"]);
|
|
});
|
|
}
|