MINARA
貢獻指南

新增工具

如何向註冊表添加新工具

工具是帶 JSON-Schema 參數的 TypeScript 函數。它們位於 apps/agent/src/tools/<name>.ts,並導出返回 ToolEntry[] 的工廠函數。

最小示例

創建 apps/agent/src/tools/my-provider.ts

import { PermissionTier, type ToolEntry } from "../core/tool-registry.js";
import { ok, err, errFromThrow } from "./_shared/result.js";

export function createMyProviderTools(): ToolEntry[] {
  const apiKey = process.env.MY_PROVIDER_API_KEY;
  if (!apiKey) return []; // feature-gate: registry hides missing tools

  return [
    {
      name: "my_provider_search",
      toolSet: "research",
      permissionTier: PermissionTier.READ_ONLY,
      isAsync: true,
      description: "Search My Provider for a query",
      schema: {
        name: "my_provider_search",
        description: "Search My Provider for a query",
        parameters: {
          type: "object",
          properties: {
            query: { type: "string", description: "The search query" },
            limit: { type: "number", description: "Max results", default: 10 },
          },
          required: ["query"],
        },
      },
      handler: async ({ query, limit }) => {
        try {
          const res = await fetch(
            `https://api.myprovider.com/search?q=${encodeURIComponent(query)}&limit=${limit ?? 10}`,
            { headers: { Authorization: `Bearer ${apiKey}` } },
          );
          if (!res.ok) return err(`HTTP ${res.status}`);
          return ok(await res.json());
        } catch (e) {
          return errFromThrow(e);
        }
      },
    },
  ];
}

在最接近的能力旁註冊工廠。屬於某個裝配領域的工具應放入 apps/agent/src/app/ 下的對應 Builder,例如 messaging.tsinstitution.tsartifacts.ts。沒有對應 Builder 的能力留在 apps/agent/src/app.ts,並放在相關注冊附近。

import { createMyProviderTools } from "./tools/my-provider.js";
// ...
for (const tool of createMyProviderTools()) toolRegistry.register(tool);

apps/agent/src/core/tool-registry.tsBUILTIN_TOOL_SETS 中添加工具集條目:

research: {
  description: "Market and social research tools",
  tools: [
    // ... existing
    "my_provider_search",
  ],
},

如果 Agent 應通過某項技能發現該工具,請將準確的工具名加入該技能的 metadata.minara.tool_names。延遲加載工具通過 tool_search 被發現,因此描述必須具體且不與其他工具衝突。

權限等級

權限等級在 apps/agent/src/core/tool-registry.ts 中定義:

等級名稱使用場景
1READ_ONLY價格 / 餘額 / 搜索 / read_file
2CONFIRM_ONCE分析、研究、小額兌換
3ALWAYS_CONFIRMwrite_filepatch、涉及資金的操作、文檔生成
4MANUAL_ONLY提現、外部地址轉賬、緊急停止開關

如有疑問,參考最接近的現有工具。資金操作工具還要聲明 isFundMoving: truecontrolPolicy.confirm。統一權限門會展示預覽,並在處理器運行前確認準確請求。

結果包裹

每個處理器都通過 apps/agent/src/tools/_shared/result.ts 中的 ok({...}) / err("...") 返回字符串。永遠不要從處理器拋出異常。使用 errFromThrow(e) 轉換捕獲的錯誤。Agent 循環解析包裹並向 LLM 呈現結構化錯誤。

沙盒根目錄文件工具

如果工具涉及文件系統,使用 apps/agent/src/tools/_security/sandbox.ts 中的 resolveInSandbox() 解析所有路徑。這是強制要求。參見沙盒與權限

驗證並更新文檔

apps/agent/tests/unit/tools/ 下添加聚焦測試,覆蓋成功結果、提供商錯誤、憑據缺失和聲明的安全策略。

pnpm --filter @minara/agent exec vitest run tests/unit/tools/my-provider.test.ts
pnpm --filter @minara/agent typecheck
pnpm --filter @minara/docs generate

工具改變公共流程時,需要同步更新四種語言的手寫文檔。生成的工具參考來自 BUILTIN_TOOL_SETS,不要直接編輯。

本頁目錄