news 2026/10/22 2:33:14

openJiuwen agent-core 团队权限护栏(Team Permission Guardrails)全面指南:Leader 审批驱动的多智能体工具调用治理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
openJiuwen agent-core 团队权限护栏(Team Permission Guardrails)全面指南:Leader 审批驱动的多智能体工具调用治理
  • 人工智能
  • AI Agent
  • Agent 框架
  • 大模型
  • 工具调用
  • RAG
  • 提示工程
  • 强化学习

【免费下载链接】agent-core

openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力

项目地址:https://gitcode.com/openJiuwen/agent-core
点击查看免费下载

导读

本文系统讲解 openJiuwen agent-core 的团队权限护栏(Team Permission Guardrails)机制:它通过“角色工具集定义 + 运行时权限裁决”两层设计,限制团队各成员可调用的协调工具,并将高风险调用(ask)路由给 Leader 审批后放行。读完本文,你将掌握TeamAgentSpec.enable_permissions与 Harnesspermissions策略的配置组合、逐成员权限收窄(narrowing)的规则表与解析顺序、Leader 审批完整生命周期,以及TeamPermissionRail与旧版TeamToolApprovalRail的区别,并能在自己的多智能体团队中落地可审计、最小权限的调用治理方案。

架构总览:两层职责分离

团队权限护栏由两层实现组成,二者解决不同的问题:

层级实现职责
第一层:工具挂载控制tool_permissions.py 定义的内置协调工具集控制某个角色(Leader / Teammate / Human Agent)在不同团队模式下能否挂载某个协调工具
第二层:调用裁决TeamPermissionRail对 Teammate已挂载工具的每一次具体调用做allow/ask/deny判定,并把ask决策路由给 Leader

第一层回答“这个角色有没有这个工具”,第二层回答“这次调用能不能执行”。

注意:openjiuwen.agent_teams.tools.tool_permissions是内部角色到工具的常量定义模块,并不是名为tool_permissions的 YAML 配置段。应用侧的策略通过 Harness 的permissions配置段下发,团队编排开关则通过TeamAgentSpec.enable_permissions开启。这一点在 agent_teams/AGENTS.md 的 rail 清单中也有对应说明。

权限决策:allow / ask / deny

级别行为
allow立即执行该工具
ask中断 Teammate 的工具调用,向 Leader 发送审批请求
deny拒绝该工具调用

在 Harness 侧,三个级别由 permission_engine/models.py 中的PermissionLevel枚举定义(ALLOW = "allow"、ASK = "ask"、DENY = "deny"),裁决结果封装为PermissionResult,并提供is_allowed、is_denied、needs_approval三个属性供上层消费。

当团队权限开启时,TeamPermissionRail替换旧版TeamToolApprovalRail。若策略返回ask,TeamApprovalOrchestrator会向 Leader 发送包含以下字段的审批消息:

  • 发起成员名(member_name)
  • 工具调用 ID(tool_call_id)
  • 工具名(tool_name)
  • 命中的规则(matched_rule)
  • 参数预览(args_preview,由PermissionInterruptRail.parse_tool_args归一化后格式化)

Leader 通过approve_tool工具响应后,Teammate 从中断点恢复执行。这一消息构造逻辑直接体现在 team_permission_rail.py 的TeamApprovalOrchestrator.handle_approval_request中。

两条关键安全性质:

  1. 审批作用域为当前会话:TeamPermissionRail._persist_allow_always()恒返回False,Leader 的批准永不持久化到共享权限配置(团队配置为多成员共享,持久化单成员会话决策会污染共享配置,也不会跨会话存活)。这点在 team_permission_rail.py 有明确注释。
  2. 审计标记:审批响应自动记录decided_by="leader"。parse_confirm_payload()会把任何形式的确认负载(TeamPermissionConfirmResponse、PermissionConfirmResponse、ConfirmPayload、dict、JSON 字符串)统一包装为TeamPermissionConfirmResponse并强制设置decided_by="leader"(见 team_permission_rail.py)。

开启团队权限

在团队规格(team specification)上开启团队级开关:

from openjiuwen.agent_teams import DeepAgentSpec, TeamAgentSpec spec = TeamAgentSpec( agents={ "leader": DeepAgentSpec(), "teammate": DeepAgentSpec(), }, team_name="secured_team", spawn_mode="inprocess", enable_permissions=True, )

enable_permissions=True的作用有两个:

  1. 选择团队审批路径——AgentConfigurator在装配 rail 时,只有满足“协调型成员 + 配置了approval_required_tools+未开启enable_permissions”三个条件才会挂载TeamToolApprovalRail;一旦enable_permissions=True,该旧 rail 不会被挂载(见 agent_configurator.py 及注释 “TeamPermissionRail replaces TeamToolApprovalRail”)。
  2. 确保 Leader 保留approve_tool工具(approve_tool位于LEADER_ONLY_TOOLS集合中,见下文)。

底层策略来自 Harness 的权限配置。一个典型策略如下:

permissions: enabled: true schema: tiered_policy defaults: "*": ask tools: read_file: allow write_file: ask bash: deny file_guard: enabled: true defaults: read: ask write: ask exec: deny

permissions段支持tools、defaults、rules、approval_overrides、file_guard等字段。需要同时开启两个开关,二者语义不同:

  • enable_permissions=True:激活 Leader 中介的团队审批路径(挂在团队 rail 上);
  • permissions.enabled: true:激活 Harness 侧PermissionEngine的策略评估(evaluate_tiered_policy逐工具裁决)。

策略评估的源码对应

策略中的defaults["*"]: ask兜底、tools显式规则、file_guard与approval_overrides的解析,全部由 tool_policy.py 的evaluate_tiered_policy统一处理:内置/用户参数规则的deny优先于approval_overrides,approval_overrides只能放宽ASK(含 shell_guard),不能放宽DENY。路径类规则(按文件路径放行)则只由 Pipeline B 的file_guard识别,工具级 A 线不再匹配 path 类 rules(见该文件第 241-316 行注释)。

逐成员权限收窄(Per-Member Permission Narrowing)

当 Leader 动态创建 Teammate 时,可通过spawn_teammate.permissions为该成员设置更严格的权限。例如创建一个只读审计员:

{ "member_name": "auditor", "display_name": "Read-Only Auditor", "desc": "Reviews implementation and tests without modifying files", "permissions": { "write_file": "deny", "bash": "ask" } }

成员级覆盖只能收窄(narrow),不能放宽。有效级别取“基础级别”与“覆盖级别”中更严格者:

基础级别覆盖级别有效级别
allowaskask
allowdenydeny
askdenydeny
denyallowdeny
askallowask

当某个工具不在基础tools映射中时,框架按以下顺序解析基础级别:defaults.<tool>→defaults["*"]→ 兜底ask,然后取与覆盖级别的更严格结果。覆盖值必须是allow、ask、deny三者之一。

上述语义在源码中有精确对应:narrow_permissions(narrowing.py)对每个覆盖工具计算strictest(base_level, override_level),并保证结果“绝不比两个输入中的任何一个更宽松”;对于未显式列出的工具,按defaults键级 →defaults["*"]→PermissionLevel.ASK的顺序解析基础级别后再取严格值;其余字段(defaults、rules、approval_overrides、permission_mode等)原样保留。单测 test_permission_narrowing.py 覆盖了strictest(ALLOW, ASK) == ASK以及收紧后tools["bash"] == "ask"等行为。

两个重要性质:

  • 持久化与恢复:覆盖记录随成员记录持久化,成员重启后重新生效;它不修改团队共享的基础策略。
  • 边界约束:框架会在创建成员的工具描述中注入format_base_permissions_for_desc(narrowing.py)生成的“基础权限 + 收窄规则”说明(“只能收紧,不能放宽;ask → deny ✓,allow → ask/deny ✓,deny → allow/ask ✗ 自动修正”),从提示词层面约束 Leader 只能收窄不能放开。

Leader 审批流程

一次ask调用的完整生命周期:

  1. Teammate 发起一次工具调用;
  2. 权限引擎匹配规则并返回ask;
  3. TeamApprovalOrchestrator向 Leader 发送审批消息(含工具名、调用 ID、匹配规则、参数预览);
  4. Teammate 的工具调用进入中断状态(orchestrator 返回"interrupt"触发 rail 挂起);
  5. Leader 审查工具、参数与匹配规则后调用approve_tool;
  6. 审批结果写入团队消息存储,Teammate 恢复执行或拒绝该调用。

源码实现细节:TeamApprovalOrchestrator实现RequestPermissionConfirmationHook,被注入ToolPermissionHost作为 hosted 确认路径(见 team_permission_rail.py)。Leader 调用approve_tool后写入protocol="json"的 DB 消息(type=tool_approval_result),Teammate 的MessageHandler解析该消息并resume_interrupt——DB 消息是可靠 fallback,避免 pub/sub 事件在进程重启或断连时丢失。这一设计决策记录在 F_38_team-permission-system.md 中。

安全要点:若审批请求无法送达,该调用不得被视为已批准;不要用普通文本消息模拟审批——必须使用approve_tool,才能让决策与工具调用 ID 和中断状态正确关联。

内置团队工具权限集

框架按角色与调度模式(dispatch mode)挂载协调工具:

  • Leader获得团队构建、成员管理、任务管理、消息与审批工具(LEADER_TOOLS = LEADER_ONLY_TOOLS | SHARED_TOOLS),且 Leader 的工具名不随调度模式变化;
  • Teammate只获得活动dispatch_mode与teammate_mode所需的任务与消息工具(MEMBER_TOOLS_BY_DISPATCH按autonomous/scheduled两种调度模式区分,未知 key 在工厂处直接抛KeyError,避免静默回退到自治认领路径);
  • Human Agent使用专用的HUMAN_AGENT_TOOLS集合;
  • 与 HITT、Swarmflow 等可选能力关联的工具,在该能力未启用时不挂载(例如swarmflow工具由enable_swarmflow门控、checkpoint由enable_fork门控)。

相关集合定义全部在 tool_permissions.py 中:

集合内容要点
LEADER_ONLY_TOOLSbuild_team、clean_team、spawn_teammate、spawn_human_agent、spawn_passive_human、spawn_bridge_agent、spawn_external_cli、set_member_model、shutdown_member、approve_plan、approve_tool、list_checkpoints、create_task、update_task、swarmflow、异步任务三件套(async_tasks_list/async_task_output/async_task_cancel)
MEMBER_ONLY_TOOLSclaim_task、submit_plan、verify_task(enter_worktree/exit_worktree处于注释预留状态)
SHARED_TOOLSview_task、send_message、workspace_meta、checkpoint
MEMBER_ONLY_TOOLS_SCHEDULED调度模式下成员无认领路径:member_complete_task、submit_plan、verify_task
HUMAN_AGENT_TOOLSview_task、member_complete_task、verify_task、send_message(无claim_task,等待 Leader 显式指派)
PASSIVE_HUMAN_TOOLSHUMAN_AGENT_TOOLS | {"claim_task"}(被动人类成员即操作者本人,认领是显式意图)

这些集合是框架不变量(framework invariants):应用不应直接修改LEADER_TOOLS或MEMBER_TOOLS_BY_DISPATCH,而应通过权限策略与逐成员收窄来表达定制需求。

补充说明:member_name被当作主键、消息路由令牌与team_home下的路径段使用,因此框架将其限制为 DNS 风格字符集(小写字母开头、小写字母/数字/连字符,正则^[a-z][a-z0-9-]*$,见 tool_permissions.py),避免 CJK 或 shell 特殊字符破坏路由与磁盘目录。

安全建议

  1. 默认收紧:将ask或deny作为默认值,只对明确识别出的只读工具显式放行allow。
  2. 分类施策:为文件写入、shell 执行、外部网络、凭据访问分别定义独立规则。
  3. 只读角色显式拒写:即使团队基础策略当前允许写工具,也要对只读角色显式deny写类工具(利用逐成员收窄只能收紧的特性形成“双保险”)。
  4. 审批前展示完整信息:向 Leader 展示完整工具名、归一化后的参数与命中规则;在 UI 与日志中对敏感值脱敏。
  5. 审计完整决策链:记录decided_by、调用 ID、命中规则、决策结果与会话 ID。
  6. 开启file_guard:独立于工具级策略,强制文件读/写/执行的路径边界。

FAQ

为什么开启enable_permissions后不是直接询问最终用户?

团队模式下,ask决策由 Leader 中介处理。若需要最终用户参与,Leader 可通过 HITT Human-in-the-Team Mode 联系人类成员,但协议级审批仍必须由 Leader 调用approve_tool完成。

为什么成员设置了allow后仍然被拒绝?

成员覆盖只能收窄权限。若基础级别是deny,allow覆盖的有效级别仍然是deny(严格取二者更严者)。

approval_required_tools与团队权限有什么不同?

approval_required_tools是旧的显式工具审批机制:只对列表中列出的工具,在enable_permissions=False时才由AgentConfigurator挂载TeamToolApprovalRail(见 agent_configurator.py)。当enable_permissions=True时,TeamPermissionRail与分级权限策略接管审批,TeamToolApprovalRail不再挂载——两者互斥。

延伸阅读

  • 完整设计与决策记录:F_38_team-permission-system.md
  • 权限引擎与三级判定:permission_engine/models.py、tool_policy.py
  • 团队 rail 装配逻辑:agent_configurator.py
  • 团队工具工厂:tool_factory.py
  • 人工智能
  • AI Agent
  • Agent 框架
  • 大模型
  • 工具调用
  • RAG
  • 提示工程
  • 强化学习

【免费下载链接】agent-core

openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力

项目地址:https://gitcode.com/openJiuwen/agent-core
点击查看免费下载

相关推荐

上一篇:如何使用R2R实现BM25与向量混合搜索:提升语义搜索准确性的终极指南
下一篇:彻底搞懂Docker Compose构建上下文:服务引用不再踩坑

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 12:05:45

智慧港口方案落地:从架构拆解到避坑验收的完整指南

简介&#xff1a;一份聚焦智慧港口落地的69页可编辑PPT方案&#xff0c;面向港口信息化建设者、方案规划人员及物流技术决策者&#xff0c;按行业分析、港口需求、解决方案三大模块组织。内容覆盖全自动化集装箱码头与自动化改造、AGV/跨运车/无人集卡无线接入、港机远程操控视…

作者头像 李华
网站建设 2026/10/19 0:44:38

IIC基础常识

特点&#xff1a;只用两根线&#xff0c;就能让主控和多个外设通信 是种同步&#xff0c;半双工&#xff0c;串行通信协议 结构特点 电气特点&#xff1a;SCL和SDA都是开漏/开集电极结构&#xff0c;必配上拉电阻。I2C设备只能主动把线拉低&#xff0c;不能主动输出高电平。当没…

作者头像 李华
网站建设 2026/10/20 9:53:08

三电极体系详解:结构原理、电极选型与实操故障排查

做电化学的人&#xff0c;无论你是测电池材料、研究腐蚀&#xff0c;还是开发传感器&#xff0c;绕不开的一个话题就是“三电极体系”。我刚接触这个体系的时候也很懵&#xff1a;明明两电极也能测出电流电压&#xff0c;为什么文献里都用三个电极&#xff1f;三个电极到底谁负…

作者头像 李华
网站建设 2026/10/19 19:11:39

从解压到跑通:艺诚美业管理系统Zip包完整解析与改造

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 20:53:23

重读哈利波特:姓名、预言与魔法物件里的隐藏密码

我第一次把这七本书连在一起重读时&#xff0c;感受和单本阅读完全不同。你明明已经知道结局&#xff0c;却会被第一本里的某句话、某样物件、某个名字击中心事。那不是传统意义的“悬念”&#xff0c;更准确的词是“秘密”——所有答案早就摊在读者面前了&#xff0c;只是第一…

作者头像 李华
网站建设 2026/10/16 5:33:45

【C语言】操作符

目录 进制 字节 原码、反码与补码 移位操作符 位操作符 按位取反操作符 sizeof 条件操作符 逗号表达式 隐式类型转换&#xff08;整形提升&#xff09; 算术转换 操作符的优先级、结合性 进制 进制也就是进位计数制&#xff0c;是人为定义的带进位的计数方法。 一、…

作者头像 李华