UNPKG

@langgraph-js/sdk

Version:

The UI SDK for LangGraph - seamlessly integrate your AI agents with frontend interfaces

123 lines (122 loc) 3.66 kB
import { createJSONDefineTool } from "./tool/createTool.js"; /** * @zh ToolManager 类用于管理和执行工具。 * @en The ToolManager class is used to manage and execute tools. */ export class ToolManager { constructor() { this.tools = new Map(); // === 专门为前端设计的异步触发结构 this.waitingMap = new Map(); } /** * @zh 注册一个工具。 * @en Registers a tool. */ bindTool(tool) { if (this.tools.has(tool.name)) { throw new Error(`Tool with name ${tool.name} already exists`); } this.tools.set(tool.name, tool); } /** * @zh 注册多个工具。 * @en Registers multiple tools. */ bindTools(tools) { tools.forEach((tool) => this.bindTool(tool)); } /** * @zh 获取所有已注册的工具。 * @en Gets all registered tools. */ getAllTools() { return Array.from(this.tools.values()); } /** * @zh 获取指定名称的工具。 * @en Gets the tool with the specified name. */ getTool(name) { return this.tools.get(name); } /** * @zh 移除指定名称的工具。 * @en Removes the tool with the specified name. */ removeTool(name) { return this.tools.delete(name); } /** * @zh 清空所有工具。 * @en Clears all tools. */ clearTools() { this.tools.clear(); } reset() { this.clearTools(); this.clearWaiting(); } clearWaiting() { this.waitingMap.clear(); } /** * @zh 调用指定名称的工具。 * @en Calls the tool with the specified name. */ async callTool(name, args, context) { var _a; const tool = this.getTool(name); if (!tool) { throw new Error(`Tool with name ${name} not found`); } return await ((_a = tool.execute) === null || _a === void 0 ? void 0 : _a.call(tool, args, context)); } /** * @zh 将所有工具转换为 JSON 定义格式。 * @en Converts all tools to JSON definition format. */ async toJSON(graphId, remote = true) { return Array.from(this.tools.values()) .filter((i) => (remote ? !i.onlyRender : true)) .filter((i) => !i.allowGraph || i.allowGraph.includes(graphId)) .map((i) => createJSONDefineTool(i)); } /** * @zh 标记指定 ID 的工具等待已完成,并传递结果。 * @en Marks the tool waiting with the specified ID as completed and passes the result. */ doneWaiting(id, value) { if (this.waitingMap.has(id)) { this.waitingMap.get(id)(value); this.waitingMap.delete(id); return true; } else { console.warn(`Waiting for tool ${id} not found`); return false; } } /** * @zh 等待指定 ID 的工具完成。 * @en Waits for the tool with the specified ID to complete. */ waitForDone(id) { if (this.waitingMap.has(id)) { return this.waitingMap.get(id); } const promise = new Promise((resolve, reject) => { this.waitingMap.set(id, resolve); }); return promise; } /** * @zh 一个静态方法,用于在前端等待用户界面操作完成。 * @en A static method used in the frontend to wait for user interface operations to complete. */ static waitForUIDone(_, context) { // console.log(context.message); return context.client.tools.waitForDone(context.message.id); } }