From fececd89ab8dc9fee5bf57f26819a63c32cca51a Mon Sep 17 00:00:00 2001
From: Thuc Pham <51660321+thucpn@users.noreply.github.com>
Date: Fri, 22 Mar 2024 14:40:41 +0700
Subject: [PATCH] feat: add tool factory (#663)

---
 .changeset/lemon-windows-fetch.md      |  5 ++++
 packages/core/src/tools/ToolFactory.ts | 33 ++++++++++++++++++++++++++
 packages/core/src/tools/index.ts       |  1 +
 3 files changed, 39 insertions(+)
 create mode 100644 .changeset/lemon-windows-fetch.md
 create mode 100644 packages/core/src/tools/ToolFactory.ts

diff --git a/.changeset/lemon-windows-fetch.md b/.changeset/lemon-windows-fetch.md
new file mode 100644
index 000000000..72d27fc61
--- /dev/null
+++ b/.changeset/lemon-windows-fetch.md
@@ -0,0 +1,5 @@
+---
+"llamaindex": patch
+---
+
+feat: add tool factory
diff --git a/packages/core/src/tools/ToolFactory.ts b/packages/core/src/tools/ToolFactory.ts
new file mode 100644
index 000000000..d40b0d950
--- /dev/null
+++ b/packages/core/src/tools/ToolFactory.ts
@@ -0,0 +1,33 @@
+import type { BaseTool } from "../types.js";
+import { WikipediaTool } from "./WikipediaTool.js";
+
+enum Tools {
+  Wikipedia = "wikipedia.WikipediaToolSpec",
+}
+
+type ToolConfig = { [key in Tools]: Record<string, any> };
+
+export class ToolFactory {
+  private static async createTool(
+    key: Tools,
+    options: Record<string, any>,
+  ): Promise<BaseTool> {
+    if (key === Tools.Wikipedia) {
+      const tool = new WikipediaTool();
+      return tool;
+    }
+
+    throw new Error(
+      `Sorry! Tool ${key} is not supported yet. Options: ${options}`,
+    );
+  }
+
+  public static async createTools(config: ToolConfig): Promise<BaseTool[]> {
+    const tools: BaseTool[] = [];
+    for (const [key, value] of Object.entries(config as ToolConfig)) {
+      const tool = await ToolFactory.createTool(key as Tools, value);
+      tools.push(tool);
+    }
+    return tools;
+  }
+}
diff --git a/packages/core/src/tools/index.ts b/packages/core/src/tools/index.ts
index 2b52c32ed..c9d38eef9 100644
--- a/packages/core/src/tools/index.ts
+++ b/packages/core/src/tools/index.ts
@@ -1,4 +1,5 @@
 export * from "./QueryEngineTool.js";
+export * from "./ToolFactory.js";
 export * from "./WikipediaTool.js";
 export * from "./functionTool.js";
 export * from "./types.js";
-- 
GitLab