【AgentScope Java新手村系列】(13)工具分组

简介: 工具分组 — Toolkit 注册全量工具,ToolsConfig 按 allow/deny 精确匹配过滤,同一套工具两个角色两个视野。

第十三章 工具分组:workspace/tools.json + toolFilter,按角色配置化限定工具

"我们希望"客服 agent"只能查订单和物流,"财务 agent"只能用支付相关工具。1.x 时代我们在 Java 端写一堆条件判断;2.0 用 workspace/tools.json + toolFilter 把这套规则配置化:新增一个角色只需要在 JSON 里加一段,不需要改 Java 代码。"

本章你将学到:如何写 workspace/tools.json、如何用 toolFilter 限定工具集、如何让 subagent 继承主 agent 的工具 / 屏蔽危险工具。

13.1 工具分组的两种方式

2.0 提供两套"工具分组"机制,可以单独用,也可以组合:

方式 配置位置 适用场景
Java 端 Toolkit HarnessAgent.builder().toolkit(toolkit) 代码定义工具,编译即固定
Java 端 toolsConfig HarnessAgent.builder().toolsConfig(config) 程序化 allow/deny,无需 JSON 文件
workspace tools.json workspace/tools.json 运行时可改,多环境差异化

生产建议:基础工具集放 Java 端(Toolkit),角色级过滤放 toolsConfig(Java 端)或 tools.json(文件端)。

13.2 第一个 tools.json

{
   
  "tools": [
    {
   
      "name": "query_order",
      "class": "demo.tools.OrderTool",
      "description": "查订单"
    },
    {
   
      "name": "query_logistics",
      "class": "demo.tools.LogisticsTool",
      "description": "查物流"
    },
    {
   
      "name": "refund_order",
      "class": "demo.tools.RefundTool",
      "description": "退款"
    }
  ]
}

HarnessAgent.builder().workspace(...) 启动时会自动扫描 workspace/tools.json 并把工具注册进 agent。但不传 classpath 时默认关闭——需要显式开:

HarnessAgent agent = HarnessAgent.builder()
        ...
        .workspace(Path.of("./workspace"))
        .loadWorkspaceTools(true)        // 2.0 新增
        .build();

工具类的 class 必须在 classpath 里能找到(通过反射 Class.forName(...) 实例化),所以 demo.tools.OrderTool 这种业务类要保证在 agent 进程的 classpath 上。

13.3 角色级 toolFilter:allow / deny

一个 tools.json 可以同时定义工具列表和可见性规则:

{
   
  "tools": [
    {
    "name": "query_order",     "class": "demo.tools.OrderTool" },
    {
    "name": "query_logistics", "class": "demo.tools.LogisticsTool" },
    {
    "name": "refund_order",    "class": "demo.tools.RefundTool" }
  ],
  "toolFilter": {
   
    "allow": ["query_order", "query_logistics"],
    "deny":  ["refund_order"]
  }
}

行为:

  • allow 白名单模式:只放行名字精确匹配的工具;其他一律不可见
  • deny 黑名单模式:名字匹配的工具被移除;其他都可见
  • allowdeny 同时存在:deny 优先(先 allow 再 deny)
  • 注意:使用精确工具名匹配,不支持通配符

HarnessAgent 启动时按 toolFilter 把工具列表过滤后再交给 LLM——LLM 看不到的工具连描述都不会出现在 prompt 里,避免"模型想调却调不到"。

13.4 给 subagent 单独配置 tools.json

每个 subagent 可以在 workspace/subagents/<id>.md 里声明自己的工具集:

# customer_service.md
id: customer_service
description: 客服 agent;只能查订单和物流,不能退款
toolsFile: customer_service.tools.json
sysPrompt: |
  你是客服,只能查订单和物流,不能直接退款。
  如需退款,转人工。

workspace/subagents/customer_service.tools.json

{
   
  "tools": [
    {
    "name": "query_order",     "class": "demo.tools.OrderTool" },
    {
    "name": "query_logistics", "class": "demo.tools.LogisticsTool" }
  ],
  "toolFilter": {
   
    "deny": ["refund_order"]
  }
}

13.5 在 Java 端过滤

不写 JSON 也行——直接用 ToolsConfig 对象:

ToolsConfig config = new ToolsConfig();
config.setAllow(List.of("query_order", "query_logistics"));
config.setDeny(List.of("refund_order"));

HarnessAgent agent = HarnessAgent.builder()
        ...
        .toolsConfig(config)
        .build();

ToolsConfigtools.json 里的 toolFilter 字段语义完全一致。

13.6 工具权限的"四层防线"

生产环境推荐工具分组 + Permission 双保险:

第 1 层:工具注册(class 必须在 classpath)
第 2 层:toolFilter(allow / deny 精确匹配)
第 3 层:Permission rule(运行时再校验一次)
第 4 层:Middleware onModelCall / onActing(埋点 / 限流)

例:想让"退款"工具运行时必须经过人审批:

PermissionContextState perms = PermissionContextState.builder()
        .mode(PermissionMode.ACCEPT_EDITS)
        .addAskRule("refund_order",
                new PermissionRule("refund_order", null, PermissionBehavior.ASK, "userSettings"))
        .build();

HarnessAgent agent = HarnessAgent.builder()
        .permissionContext(perms)
        .build();

即使 LLM 想调 refund_order,Permission 也会拦下来问用户。

13.7 完整可运行示例

这个例子在演示什么?

我们注册 3 个工具:query_order(查订单)、query_logistics(查物流)、refund_order(退款)。然后创建两个 agent:

  • 客服 agentdeny 屏蔽 refund_order → 只能查订单和物流,不能退款
  • 财务 agentallow 只放行 refund_order → 只能退款,看不到查询工具

同一套工具,两个角色两个视野。新增角色只需要改 ToolsConfig,不改 Java 代码。

import io.agentscope.core.tool.Tool;
import io.agentscope.core.tool.Toolkit;
import io.agentscope.harness.agent.tools.ToolsConfig;
import io.agentscope.harness.HarnessAgent;

import java.util.List;

public class Chapter13_ToolFilter {
   

    // 业务工具类:@Tool 注解标记方法名即工具名
    public static class OrderTools {
   
        @Tool(name = "query_order", description = "查询订单状态和详情")
        public String queryOrder(String orderId) {
   
            return "订单 " + orderId + ":已发货。";
        }
    }

    public static class LogisticsTools {
   
        @Tool(name = "query_logistics", description = "查询物流轨迹")
        public String queryLogistics(String trackingId) {
   
            return "物流 " + trackingId + ":快件在北京分拣中心。";
        }
    }

    public static class RefundTools {
   
        @Tool(name = "refund_order", description = "处理订单退款")
        public String refundOrder(String orderId) {
   
            return "订单 " + orderId + " 退款已处理。";
        }
    }

    public static void main(String[] args) {
   
        // 1. 全部工具注册到同一个 Toolkit
        Toolkit baseToolkit = new Toolkit();
        baseToolkit.registerTool(new OrderTools());
        baseToolkit.registerTool(new LogisticsTools());
        baseToolkit.registerTool(new RefundTools());

        // 2. 客服 agent:deny "refund_order" — 看不到退款工具
        ToolsConfig csConfig = new ToolsConfig();
        csConfig.setDeny(List.of("refund_order"));

        HarnessAgent customerService = HarnessAgent.builder()
                .name("customer_service")
                .sysPrompt("你是客服,只能查订单和物流。不能退款,如需退款请转人工。")
                .model(model())
                .workspace(Path.of("./workspace"))
                .toolkit(baseToolkit)
                .toolsConfig(csConfig)
                .build();

        // 3. 财务 agent:allow "refund_order" — 只能看到退款工具
        ToolsConfig finConfig = new ToolsConfig();
        finConfig.setAllow(List.of("refund_order"));

        HarnessAgent finance = HarnessAgent.builder()
                .name("finance")
                .sysPrompt("你是财务,只处理退款。")
                .model(model())
                .workspace(Path.of("./workspace"))
                .toolkit(baseToolkit)
                .toolsConfig(finConfig)
                .build();

        // 问客服"订单 123 的状态"——能答
        // 问客服"退款"——会说"请转人工"
        // 问财务"订单 123 的状态"——看不到 query 工具
        // 问财务"退款"——正常处理
    }
}

关键ToolsConfigallow/denyHarnessAgent.build() 里被 ToolFilter.apply() 执行——从 Toolkit物理删除对应工具。LLM 的 prompt 里根本不会出现被屏蔽工具的描述,不存在"知道但不能用"的半吊子状态。

13.8 本章小结

  • workspace/tools.json 让工具配置离开 Java 代码,运行时可改。
  • toolFilterallow / deny + 精确工具名限定角色可调工具。
  • subagent 可声明自己的 toolsFile 单独配工具集。
  • 工具权限推荐四层防线:注册 → toolFilter → Permission → Middleware。
目录
相关文章
|
4天前
|
云安全 人工智能 运维
阿里云SecOps Agent,全新安全跨产品执行体验
自然语言驱动 云安全中心/WAF/CFW/ 等多款安全产品联动
1596 2
|
1天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
354 123
|
4天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
593 4
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
15天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
15天前
|
JavaScript 定位技术 API
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
CodeGraph 是一款爆火的本地代码智能工具,通过 tree-sitter 解析 AST 构建结构化知识图谱(存于 SQLite),为编程 Agent 提前生成“代码地图”。它显著降低 Agent 在中大型项目中的探索成本——实测工具调用减少71%、Token 降57%、速度提升46%,支持19+语言及主流框架路由识别,完全离线、无需 API Key。
921 12
CodeGraph 爆火:编程 Agent 需要的不是更多上下文,而是一张提前画好的代码地图
|
8天前
|
缓存 人工智能 运维
GLM 5.2自托管全流程实战:硬件选型、vLLM/SGLang部署与成本盈亏测算
2026年智谱发布GLM 5.2超大混合专家模型,区别于以往仅开放API的闭源大模型,该模型权重以MIT开源协议对外发布,企业与开发者可完整下载、本地审计、私有化部署,实现数据不出环境、自定义微调、自主调度推理资源。GLM 5.2拥有753B总参数,原生支持百万级上下文窗口,在代码生成、长文档推理、数学逻辑等多项基准测试中对标国际顶尖商用模型,是首款可完整自托管的前沿代码向大模型。
676 0
|
3天前
|
消息中间件 人工智能 Kafka
AI 时代,实时入湖正在告别 ETL:从 Kafka 到 Iceberg 的架构减法
本文围绕“零 ETL”这一趋势,讨论流数据入湖为什么需要做架构减法,并结合 Kafka × Table Bucket 的实践,分析一种将通用入湖能力前移到消息与表存储链路中的方案,如何在降低复杂度的同时,兼顾实时性、一致性、Schema 演进、CDC 语义与开放生态兼容。
193 121
|
3天前
|
人工智能 监控 前端开发
Electron 监控:让桌面 Agent 监控触手可及
一行代码实现Electron桌面端全景监控,自动还原崩溃现场、预警内存泄漏、全链路追踪、 SSE流式响应与交互埋点,让 AI 助手运行状态清晰可见,助力快速恢复稳定与流畅。
185 125
|
11天前
|
人工智能 自然语言处理 算法
阿里云百炼Qwen 3.7 Plus与Max实测全解:性价比与多模态能力、成本深度对比
2026年,阿里云百炼平台推出的Qwen 3.7系列成为企业与开发者落地AI应用的核心选择,其中Qwen 3.7 Max与Plus作为两大旗舰版本,定位差异显著:Max是纯文本推理旗舰,专注高强度智能体与复杂逻辑任务;Plus则是多模态全能版,在保留强大文本能力的同时,补齐图像、视频理解能力,且价格大幅降低。本文基于2026年最新实测数据,从核心参数、文本能力、多模态能力、智能体表现、性价比与场景选型六大维度,全面解析两款模型的差异,为用户提供精准选型参考。
547 0

热门文章

最新文章