- 人工智能
- AI Agent
- Agent 框架
- 大模型
- 工具调用
- RAG
- 提示工程
- 强化学习
【免费下载链接】agent-core
openJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力
导读
本文系统讲解 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中。
两条关键安全性质:
- 审批作用域为当前会话:
TeamPermissionRail._persist_allow_always()恒返回False,Leader 的批准永不持久化到共享权限配置(团队配置为多成员共享,持久化单成员会话决策会污染共享配置,也不会跨会话存活)。这点在 team_permission_rail.py 有明确注释。 - 审计标记:审批响应自动记录
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的作用有两个:
- 选择团队审批路径——
AgentConfigurator在装配 rail 时,只有满足“协调型成员 + 配置了approval_required_tools+未开启enable_permissions”三个条件才会挂载TeamToolApprovalRail;一旦enable_permissions=True,该旧 rail 不会被挂载(见 agent_configurator.py 及注释 “TeamPermissionRail replaces TeamToolApprovalRail”)。 - 确保 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: denypermissions段支持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),不能放宽。有效级别取“基础级别”与“覆盖级别”中更严格者:
| 基础级别 | 覆盖级别 | 有效级别 |
|---|---|---|
allow | ask | ask |
allow | deny | deny |
ask | deny | deny |
deny | allow | deny |
ask | allow | ask |
当某个工具不在基础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调用的完整生命周期:
- Teammate 发起一次工具调用;
- 权限引擎匹配规则并返回
ask; TeamApprovalOrchestrator向 Leader 发送审批消息(含工具名、调用 ID、匹配规则、参数预览);- Teammate 的工具调用进入中断状态(orchestrator 返回
"interrupt"触发 rail 挂起); - Leader 审查工具、参数与匹配规则后调用
approve_tool; - 审批结果写入团队消息存储,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_TOOLS | build_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_TOOLS | claim_task、submit_plan、verify_task(enter_worktree/exit_worktree处于注释预留状态) |
SHARED_TOOLS | view_task、send_message、workspace_meta、checkpoint |
MEMBER_ONLY_TOOLS_SCHEDULED | 调度模式下成员无认领路径:member_complete_task、submit_plan、verify_task |
HUMAN_AGENT_TOOLS | view_task、member_complete_task、verify_task、send_message(无claim_task,等待 Leader 显式指派) |
PASSIVE_HUMAN_TOOLS | HUMAN_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 特殊字符破坏路由与磁盘目录。
安全建议
- 默认收紧:将
ask或deny作为默认值,只对明确识别出的只读工具显式放行allow。 - 分类施策:为文件写入、shell 执行、外部网络、凭据访问分别定义独立规则。
- 只读角色显式拒写:即使团队基础策略当前允许写工具,也要对只读角色显式
deny写类工具(利用逐成员收窄只能收紧的特性形成“双保险”)。 - 审批前展示完整信息:向 Leader 展示完整工具名、归一化后的参数与命中规则;在 UI 与日志中对敏感值脱敏。
- 审计完整决策链:记录
decided_by、调用 ID、命中规则、决策结果与会话 ID。 - 开启
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能力
相关推荐
openJiuwen agent-core 团队技能演进(Team Skill Evolution):多智能体协作经验的自动沉淀与在线演进实战指南
openJiuwen agent core 团队技能演进(Team Skill Evolution):多智能体协作经验的自动沉淀与在线演进实战指南 本篇技术指南
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习Laravel Permission团队功能:多团队权限管理的完整实现指南
Laravel Permission团队功能:多团队权限管理的完整实现指南 在复杂的Web应用中,多团队权限管理是确保数据隔离和安全性的关键功能。Laravel
后端认证鉴权GetQzonehistory:三步完整备份你的QQ空间历史说说,免费导出Excel与离线网页
GetQzonehistory:三步完整备份你的QQ空间历史说说,免费导出Excel与离线网页 GetQzonehistory 是一款QQ空间历史说说备份的开源
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考