首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenClaw 插件代理工具 (Agent Tools) 深度指南

OpenClaw 插件代理工具 (Agent Tools) 深度指南

原创
作者头像
jack.yang
发布2026-03-18 20:24:11
发布2026-03-18 20:24:11
200
举报

核心概念:在 OpenClaw 中,插件不仅是功能的扩展,更是智能体 (Agent) 的手脚。通过注册 Agent Tools,插件可以将具体的函数能力(如查询数据库、执行工作流、调用外部 API)以标准化的 JSON Schema 形式暴露给大语言模型 (LLM),让 AI 能够自主规划并执行复杂任务。 适用场景

  • 开发自定义插件并希望 AI 能调用其功能。
  • 需要控制某些高风险工具的权限(按需开启)。
  • 配置多 Agent 架构下的工具隔离策略。

🚀 一、什么是 Agent Tools?

在 OpenClaw 架构中,Agent Tool 是一个遵循特定规范的函数定义。它包含三个核心要素:

  1. 名称与描述:告诉 LLM“我是谁”以及“我能做什么”。
  2. 参数 Schema:使用 JSON Schema (通常通过 @sinclair/typebox 定义) 严格规定输入格式,确保 LLM 生成的参数合法。
  3. 执行逻辑:当 LLM 决定调用该工具时,实际运行的 TypeScript/JavaScript 代码。

工具分为两类:

  • 必需工具 (Required):插件安装后默认对所有 Agent 可见(除非被全局禁用)。适用于安全、通用的功能。
  • 可选工具 (Optional)默认不可见。必须在配置文件中显式加入“白名单 (Allowlist)”才能被 Agent 调用。适用于有副作用、高成本或需要额外凭证的功能。

🛠️ 二、开发实战:如何注册工具

1. 基础工具 (Basic Tool)

这是最常见的形式。插件加载后,该工具自动对拥有插件权限的 Agent 可用。

依赖准备: 你需要使用 @sinclair/typebox 来定义参数结构,这比手写 JSON Schema 更安全且具备类型提示。

代码语言:javascript
复制
import { Type } from "@sinclair/typebox";

// 插件入口函数
export default function (api) {
  api.registerTool({
    // 1. 工具名称:全局唯一,避免与核心工具冲突
    name: "fetch_weather",
    
    // 2. 描述:LLM 根据此描述决定是否调用
    description: "Get real-time weather information for a specific city.",
    
    // 3. 参数定义:使用 Typebox 构建 JSON Schema
    parameters: Type.Object({
      city: Type.String({ description: "The name of the city, e.g., 'Beijing'" }),
      unit: Type.Optional(Type.Enum({ celsius: "celsius", fahrenheit: "fahrenheit" }, { default: "celsius" }))
    }),
    
    // 4. 执行逻辑:异步函数,接收调用 ID 和解析后的参数
    async execute(_id, params) {
      // 模拟 API 调用
      const weatherData = await mockWeatherApi(params.city, params.unit);
      
      // 返回标准格式响应
      return { 
        content: [
          { type: "text", text: `🌤️ ${params.city} current weather: ${weatherData.condition}, ${weatherData.temp}°${params.unit}` }
        ] 
      };
    },
  });
}

2. 可选工具 (Optional Tool / Opt-in)

对于可能产生副作用(如删除文件、发送邮件、执行 Shell 命令)的工具,必须标记为 optional: true。这是一种安全机制,防止用户意外安装插件后,AI 自动执行危险操作。

代码语言:javascript
复制
export default function (api) {
  api.registerTool(
    {
      name: "execute_workflow",
      description: "Trigger a local automation workflow by name. Requires explicit permission.",
      // 这里也可以直接使用原生 JSON Schema 对象,不一定非要用 Typebox
      parameters: {
        type: "object",
        properties: {
          pipeline: { 
            type: "string", 
            description: "The name of the workflow pipeline to run" 
          },
          dryRun: {
            type: "boolean",
            description: "If true, only simulate the execution",
            default: false
          }
        },
        required: ["pipeline"],
      },
      async execute(_id, params) {
        if (params.dryRun) {
          return { content: [{ type: "text", text: `[Simulated] Would run pipeline: ${params.pipeline}` }] };
        }
        // 执行真实逻辑...
        return { content: [{ type: "text", text: `✅ Pipeline ${params.pipeline} executed successfully.` }] };
      },
    },
    // ⚠️ 关键配置:标记为可选
    { optional: true },
  );
}

🔐 三、配置与权限控制 (Allowlists)

可选工具不会自动生效。你需要在 openclaw.json (或环境变量对应的配置) 中通过 Allowlist (白名单) 机制显式授权。

1. 配置层级

工具权限可以在两个层级配置:

  • 全局层级 (tools):影响所有 Agent。
  • Agent 层级 (agents.list[].tools):仅影响特定 Agent,优先级更高。

2. 白名单语法详解

在配置文件中,allow 数组支持三种引用方式:

代码语言:javascript
复制
{
  "agents": {
    "list": [
      {
        "id": "admin-agent",
        "tools": {
          "allow": [
            // 方式 A: 指定具体工具名 (最精确)
            "execute_workflow", 
            
            // 方式 B: 指定插件 ID (启用该插件下所有工具,包括可选的)
            "my-automation-plugin", 
            
            // 方式 C: 使用组别名 (启用所有插件提供的工具)
            "group:plugins"
          ],
          // 可选:拒绝列表,优先级高于 allow
          "deny": [
            "dangerous_delete_tool"
          ]
        }
      },
      {
        "id": "readonly-agent",
        "tools": {
          // 只允许核心工具,不允许任何插件的可选工具
          "allow": [
            "group:core" 
          ]
        }
      }
    ]
  }
}

3. 关键行为规则

  • 插件即白名单:如果在 allow 列表中写入的是插件 ID(如 my-automation-plugin),系统会将其视为对该插件所有可选工具的授权。
  • 核心工具隔离:如果 allow 列表中包含了插件相关的条目(插件 ID 或 group:plugins),那么核心工具 (Core Tools) 将默认被禁用
    • 修正策略:如果你既想要插件工具,又想要核心工具,必须显式添加核心工具组:

    allow: ["group:plugins", "group:core"]

  • 命名冲突:插件工具名称不能与核心工具名称冲突。如果冲突,插件工具将被跳过并记录警告日志。

4. 高级配置项

除了基础的 allow/deny,OpenClaw 还支持更细粒度的控制:

配置项

位置

作用

tools.profile

全局 / Agent

定义一个基础白名单模板,可被复用。

tools.byProvider

全局 / Agent

针对不同 LLM 提供商 (如 OpenAI vs Anthropic) 设置不同的工具集(因为某些模型对工具调用支持不同)。

tools.sandbox.tools.*

全局

当 Agent 运行在沙箱环境时,限制可用的底层系统工具。


💡 四、最佳实践与安全建议

1. 默认最小权限原则 (Least Privilege)

  • 永远将涉及写操作、网络请求、文件系统的工具标记为 { optional: true }
  • 让用户在安装插件后,明确知道他们需要修改配置文件才能启用这些强力功能。

2. 清晰的描述 (Description is King)

  • LLM 完全依赖 description 字段来决定是否调用工具。
  • 坏例子: "Run a script."
  • 好例子: "Executes a predefined bash script by name. Only scripts located in /safe/scripts are allowed. Does not accept arbitrary commands."

3. 参数验证

  • 利用 Typebox 或 JSON Schema 的 requiredformat 字段进行强校验。
  • execute 函数内部,再次验证关键参数(防御性编程),防止 Schema 绕过。

4. 避免命名污染

  • 给你的工具加上插件前缀,例如 github_create_issue 而不是 create_issue,以减少与未来核心工具或其他插件冲突的概率。

📝 五、故障排查 (Troubleshooting)

问题现象

可能原因

解决方案

LLM 看不到我的工具

1. 工具标记为 optional 但未配置白名单。2. 插件未正确加载。

检查 agents.list[].tools.allow 是否包含工具名或插件 ID。查看启动日志确认插件加载成功。

核心工具消失了

allow 列表中只写了插件相关项,未包含 group:core。

在 allow 数组中添加 "group:core" 或具体的核心工具名。

工具调用报错 "Unknown Tool"

工具名在配置中拼写错误,或与核心工具冲突被跳过。

运行 openclaw plugins info <plugin-name> 查看已注册的工具列表,核对名称。

参数解析失败

LLM 生成的参数不符合 Schema 定义。

优化 description 引导 LLM;检查 parameters 定义是否过于严格或缺少默认值。


🎯 总结

OpenClaw 的插件工具系统设计哲学是 “灵活扩展,安全可控”

  • 作为开发者:善用 optional: true 保护用户,提供精准的 Schema 和描述。
  • 作为用户:理解 allow 列表的威力,按需授权,构建安全的 Agent 工作流。

通过这套机制,你可以将 OpenClaw 从一个简单的聊天机器人,进化为能够安全执行复杂业务逻辑的超级自动化平台。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🚀 一、什么是 Agent Tools?
  • 🛠️ 二、开发实战:如何注册工具
    • 1. 基础工具 (Basic Tool)
    • 2. 可选工具 (Optional Tool / Opt-in)
  • 🔐 三、配置与权限控制 (Allowlists)
    • 1. 配置层级
    • 2. 白名单语法详解
    • 3. 关键行为规则
    • 4. 高级配置项
  • 💡 四、最佳实践与安全建议
    • 1. 默认最小权限原则 (Least Privilege)
    • 2. 清晰的描述 (Description is King)
    • 3. 参数验证
    • 4. 避免命名污染
  • 📝 五、故障排查 (Troubleshooting)
  • 🎯 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档