【AgentScope Java新手村系列】(14)人机交互
第十四章 人机交互Permission 系统 ALLOW/DENY/ASK 规则运行时 HITL 自动拦截用户让 agent 删数据库——我们不希望它问都不问就执行。1.x 时代用Hook.stopAgent()在onActing阶段抛异常中断2.0 推荐用Permission系统——为每个 tool 配 ALLOW / DENY / ASK 规则运行时自动拦截、提示用户、收集决策。这比 hook 优雅得多。本章你将学到PermissionMode5 种模式、PermissionRule4 个字段、ASK模式下如何给前端推送确认请求、以及Middleware在 HITL 中的辅助角色。14.1 1.x 时代怎么拦截工具1.x 时代要在工具调用前拦下来业务方在Hook.onActing里throw new StopAgentException()。问题异常语义不直观不能区分想确认 vs 直接拒绝没法让前端弹是否放行对话框只能字符串错误2.0 用Permission系统替代了这套写法决策含义ALLOW直接执行DENY直接拒绝 错误反馈给 LLMASK暂停工具执行推送确认请求给用户用户回 ALLOW/DENY 后继续PASSTHROUGH跳过本条规则看下一条14.2 第一个 Permission 例子这个例子在演示什么你有一个 DB 管理员 agent它有drop_table这种危险工具。你不希望它问都不问就删表——所以给drop_table配了一条ASK规则agent 想删表时Permission 引擎会暂停执行把确认请求推给前端等用户点了允许才继续。import io.agentscope.core.agent.RuntimeContext; import io.agentscope.core.message.UserMessage; import io.agentscope.core.model.DashScopeChatModel; import io.agentscope.core.permission.*; import io.agentscope.harness.HarnessAgent; import java.util.List; public class Chapter14_Permission { public static void main(String[] args) { // 1. 准备 PermissionContextACCEPT_EDITS 模式大部分操作放行 // 但 drop_table 必须人工确认ASK PermissionContextState perms PermissionContextState.builder() .mode(PermissionMode.ACCEPT_EDITS) .addAskRule(drop_table, new PermissionRule( drop_table, null, // null 匹配所有 drop_table 调用 PermissionBehavior.ASK, userSettings)) .build(); // 2. 构造 agent HarnessAgent agent HarnessAgent.builder() .name(db_admin) .sysPrompt(你是一个 DB 管理员可以查表但删表必须先问。) .model(DashScopeChatModel.builder() .apiKey(System.getenv(DASHSCOPE_API_KEY)) .modelName(qwen-plus) .build()) .workspace(Path.of(./workspace)) .permissionContext(perms) .build(); agent.call( List.of(new UserMessage(user, 把 orders_2024 表 drop 掉。)), RuntimeContext.empty()) .block(); // 跑到 drop_table 时Permission 会发出 ConfirmRequest前端需要回应 } }PermissionRule四个字段toolName— 工具名ruleContent— 匹配模式null 表示对所有调用匹配behavior—ALLOW/DENY/ASK/PASSTHROUGHsource— 规则来源便于审计userSettings/projectSettings/session/suggested14.3 5 种 PermissionModeMode行为适用场景DEFAULT所有未命中规则都ASK最安全推荐默认值ACCEPT_EDITS自动放行工作目录内的文件操作用户在场的活跃开发EXPLORE只读放行读、拒绝所有写与命令代码探索、规划BYPASS放行一切deny / ask 规则仍生效完全可信的沙箱DONT_ASK把所有 ASK 转为 DENY无人值守 / 计划任务注意EXPLORE模式下 deny 是不可绕过的——即使在BYPASS模式下也照常生效。这是 2.0 的危险工具不可绕过原则。14.3.1PermissionContextState——整个权限系统的配置单前面一直用.builder().mode(...).addAskRule(...).build()这个构建出来的对象就是PermissionContextState。它是 agent 权限的全部配置一张对象里包了三样东西PermissionContextState ├── mode ← 一个 PermissionModeDEFAULT / ACCEPT_EDITS / EXPLORE / BYPASS / DONT_ASK ├── allowRules ← Map工具名, ListPermissionRule — 哪些工具直接放行 ├── denyRules ← Map工具名, ListPermissionRule — 哪些工具直接拒绝 └── askRules ← Map工具名, ListPermissionRule — 哪些工具暂停问用户核心地位PermissionContextState是 agent 能做什么、不能做什么的唯一配置文件。它不属于某个 session不属于某个工具——它是整个 agent 的权限配置在HarnessAgent.builder().permissionContext(perms)时注入之后不可变。你可以把它理解为agent 的权限清单——清单上写了哪些工具要问、哪些直接放、哪些打死不能用。PermissionEngine权限引擎在每次工具调用前照着清单判定。14.4 ASK 的完整流程LLM 想调drop_tablePermission 引擎查规则 →ASK引擎生成建议规则——基于本次调用入参drop_table(orders_2024)引擎把ConfirmRequest推给前端通过streamEvents()的PermissionAskEvent前端弹是否放行对话框用户回 ALLOW 接受建议规则后端调agent.call(...)时把ConfirmResult注入回 session工具执行 自动把建议规则加入PermissionContextStateimport io.agentscope.core.event.ConfirmResult; import io.agentscope.core.event.ConfirmRequest; public MapString, Object handleAsk(ConfirmRequest req) { // 1. 推送给前端 sendToFrontend(req); // 2. 等用户回 ALLOW boolean userAllowed waitForUserDecision(); // 3. 构造 ConfirmResult ConfirmResult result new ConfirmResult( userAllowed, req.getToolCall(), userAllowed ? req.getSuggestedRules() : List.of() // 接受建议 ); return Map.of(decision, result); }14.5 Middleware 在 HITL 中的辅助角色Permission只解决能不能跑Middleware解决跑之前 / 之后还要做什么。HITL 场景里常见的 Middleware 用法class HitlAuditMiddleware extends MiddlewareBase { Override public MonoHookEvent onActing(MiddlewareContext ctx, HookEvent event) { event.getToolCalls().forEach(tc - { auditLog.info(user{} tool{} input{}, ctx.runtime().getUserId(), tc.getName(), tc.getInput()); }); return Mono.just(event); } }Permission给能不能跑的答案Middleware记谁、什么时候、跑了什么。14.6 与前端 SSE 的协作streamEvents()会发出PermissionAskEventevent: permission-ask data: {toolCallId:tc-1,toolName:drop_table,input:{table:orders_2024},suggestedRules:[...]}前端订阅后弹窗用户决策通过另一个 HTTP 端点回传POST /api/agent/permission/respond后端用agent.resume(sessionId, confirmResult)继续。agent.resume(...)2.0 新增——专门用于 ASK 暂停后的恢复。14.7 1.xHook.stopAgent还能用吗能但不推荐。io.agentscope.core.hook.Hook在 2.0 标Deprecated但语义保留class LegacyHitlHook implements Hook { Override public void onActing(HookEvent event) { if (event.getToolCalls().stream().anyMatch(t - drop_table.equals(t.getName()))) { throw new StopAgentException(drop_table is forbidden); } } }新代码请统一用Permission系统Hook只用来写日志/埋点等不需要 ASK 的场景。14.8 完整可运行示例这个例子在演示什么你有一个客服 agent配了 3 个工具query_order查订单、refund_order退款、drop_table删表——危险操作。我们希望查订单直接放行不打扰用户ALLOW退款弹窗问用户是否确认退款ASK删表直接拒绝agent 根本没机会删DENY下面用一个 agent 配 3 条 PermissionRule连续问 3 次每次触发不同行为public class Chapter14_FullHitl { public static void main(String[] args) { PermissionContextState perms PermissionContextState.builder() .mode(PermissionMode.DEFAULT) .addAllowRule(query_order, new PermissionRule( query_order, null, PermissionBehavior.ALLOW, userSettings)) .addAskRule(refund_order, new PermissionRule( refund_order, null, PermissionBehavior.ASK, userSettings)) .addDenyRule(drop_table, new PermissionRule( drop_table, null, PermissionBehavior.DENY, userSettings)) .build(); HarnessAgent agent HarnessAgent.builder() .name(customer_service) .sysPrompt(你是客服可以查订单但退款需要用户确认删表绝对禁止。) .model(model()) .workspace(Path.of(./workspace)) .permissionContext(perms) .build(); // 查订单 → ALLOW工具直接执行无任何中断 agent.call(List.of(new UserMessage(user, 查订单 123)), RuntimeContext.empty()).block(); // 退款 → ASKPermission 引擎暂停发出 ConfirmRequest 等前端回应 agent.call(List.of(new UserMessage(user, 给订单 123 退款 100 元)), RuntimeContext.empty()).block(); // 删表 → DENY工具调用被直接拒绝agent 收到错误反馈 agent.call(List.of(new UserMessage(user, 删掉 orders 表)), RuntimeContext.empty()).block(); } }注意addAllowRule/addAskRule/addDenyRule的第一个参数是精确工具名不支持通配符。必须写query_order而非query_*。14.9 本章小结2.0 用Permission系统做工具调用级 HITL比 1.xHook.stopAgent优雅。5 种PermissionMode适配不同部署场景4 种行为ALLOW/DENY/ASK/PASSTHROUGH。ASK模式PermissionAskEvent推前端 用户回ConfirmResult。Deny规则和危险路径检查不可绕过——BYPASS模式也拦不住。Middleware留给日志/埋点等不需要决策的副作用。

相关新闻

3分钟解决PDF比对难题:diff-pdf视觉差异检测全攻略

3分钟解决PDF比对难题:diff-pdf视觉差异检测全攻略

3分钟解决PDF比对难题:diff-pdf视觉差异检测全攻略 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 你是否曾为两个看似相同的PDF文件而困惑?合同条款的细…

2026/6/29 18:25:47阅读更多 →
单层 ?? 的含义是:左边为 null 则取右边。

单层 ?? 的含义是:左边为 null 则取右边。

<span style"background-color:#e3eaf2"><span style"color:#111b27"><code class"language-none">string name userInput ?? "未命名"; // 等价于 string name userInput is not null ? userInput : "未…

2026/6/29 18:25:47阅读更多 →
别再熬夜写论文了!6款一键生成论文工具,一键极速生成超长篇幅!

别再熬夜写论文了!6款一键生成论文工具,一键极速生成超长篇幅!

别再做“学术裁缝”触碰学术不端风险了&#xff01;本文解析论文写作新范式&#xff0c;介绍AI辅助原创、人机协同深化、全流程合规保障三大核心&#xff0c;并推荐6款免费AI论文工具&#xff0c;覆盖全流程生成、深度对话构思、理工科适配、范文参考、文献检索、学术润色翻译等…

2026/6/29 18:20:46阅读更多 →
从失败到成功:记录第11次ChatGPT Plus付费全过程——含OpenAI客服英文申诉模板+时效性凭证截图

从失败到成功:记录第11次ChatGPT Plus付费全过程——含OpenAI客服英文申诉模板+时效性凭证截图

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ChatGPT Plus付费失败的典型归因分析 ChatGPT Plus订阅过程中出现付款失败&#xff0c;是用户高频反馈的问题之一。其背后成因并非单一&#xff0c;而是涉及支付渠道、账户状态、地区策略与客户端环境等…

2026/6/29 19:41:08阅读更多 →
美食生活助手:基于 HarmonyOS ArkTS 的 AI 菜谱推荐应用开发实践

美食生活助手:基于 HarmonyOS ArkTS 的 AI 菜谱推荐应用开发实践

美食生活助手&#xff1a;基于 HarmonyOS ArkTS 的 AI 菜谱推荐应用开发实践一、项目背景与问题定义 1.1 厨房里的"选择困难症" 每个人在做饭前都经历过这样的时刻&#xff1a;打开冰箱&#xff0c;看着零零散散的食材&#xff0c;脑子里一片空白——"今天吃什么…

2026/6/29 19:41:08阅读更多 →
斜率加一个点就可以确定直线,确定直线就可以确定方向

斜率加一个点就可以确定直线,确定直线就可以确定方向

斜率 一个点 切线确定了 就像你拿一支笔&#xff1a; 点告诉你笔放在哪里斜率告诉你笔倾斜的角度 这两个信息确定了&#xff0c;直线就唯一画出来了。斜率告诉你趋势斜率意思m>0m > 0m>0&#xff08;正数&#xff09;往右走&#xff0c;曲线向上爬m<0m < 0m&l…

2026/6/29 19:41:08阅读更多 →
bp如何导出证书,安装在谷歌浏览器中

bp如何导出证书,安装在谷歌浏览器中

一、前提1.因好久不用的知识很容易忘记&#xff0c;再找起来特别费事&#xff0c;故用文章笔记的形式记录在此。二、操作点击导出证书这是选择生成证书的目录&#xff08;记得文件名cacert.der&#xff0c;不然无法用&#xff09;成功导出打开谷歌浏览器---设置--隐私与安全---…

2026/6/29 19:41:08阅读更多 →
靠谱收银软件源头四家厂家深度横评

靠谱收银软件源头四家厂家深度横评

在零售和餐饮行业数字化转型的浪潮中&#xff0c;很多老板和技術负责人都面临着一个共同的痛点&#xff1a;市面上的 SaaS 软件虽然开箱即用&#xff0c;但数据不在自己手里&#xff0c;功能迭代受制于人&#xff0c;一旦业务规模扩大&#xff0c;高昂的年费和僵化的流程就成了…

2026/6/29 19:41:08阅读更多 →
Java基础V1

Java基础V1

程序结构我们想要编写一个Java程序&#xff0c;需要在Java代码文件当中编写一个类结构&#xff0c;结构的代码如下package lyx0623; //类结构 public class HelloWorld { //程序入口static void main() {} }在类结构中&#xff0c;必须定义一个程序入口结构才能运行&#xff0c…

2026/6/29 19:36:06阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/29 3:27:55阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/6/29 2:19:08阅读更多 →
如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图:DeepBump的终极指南

如何在3秒内从普通图片生成专业级法线贴图&#xff1a;DeepBump的终极指南 【免费下载链接】DeepBump Normal & height maps generation from single pictures 项目地址: https://gitcode.com/gh_mirrors/de/DeepBump 还在为3D建模中的纹理制作而烦恼吗&#xff1f;…

2026/6/29 0:01:47阅读更多 →
OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools:终极OpenCore配置工具,让黑苹果安装从未如此简单!

OCAuxiliaryTools&#xff1a;终极OpenCore配置工具&#xff0c;让黑苹果安装从未如此简单&#xff01; 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore&#xff08;OCAT&#xff09; 项目地址: https://gitcode.com/gh_mirrors/oc/OCA…

2026/6/29 0:01:47阅读更多 →
终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南:使用tiny11builder快速创建纯净系统镜像

终极Windows 11精简指南&#xff1a;使用tiny11builder快速创建纯净系统镜像 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否厌倦了Windows 11系统自带的20…

2026/6/29 0:01:47阅读更多 →