将 Agent Control Specification 集成到 Agent Host:ACS 策略执行引擎实战指南
2026/9/20 0:30:36 网站建设 项目流程
  • 人工智能
  • AI Agent
  • AI 安全治理
  • 策略引擎
  • Agent 沙箱
  • 认证鉴权

【免费下载链接】agent-governance-toolkit

AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 OWASP Agentic Top 10.

项目地址:https://gitcode.com/GitHub_Trending/ag/agent-governance-toolkit
点击查看免费下载

本篇技术指南以 policy-engine/QUICKSTART.md 为骨架,完整讲解如何把 Agent Control Specification(ACS)策略执行引擎接入任意 Agent Host:从一张空白的 manifest 开始,逐步构建出在每一个模型边界与工具边界都被策略中介(mediate)的 Agent 循环。文中 manifest 与策略编写步骤是语言无关的,构造与评估步骤则同时给出 Rust、Python、Node、.NET 四种 SDK 的等价写法,全部示例与底层原理均来自当前仓库 policy-engine/ 目录。读完后你将掌握:声明 ACS manifest 与 Rego 策略、在八个干预点评估并执行判定、用编排 helper 一次性完成"评估+执行+转换+审批"、通过生成器初始化合规的 ACS 制品,以及如何用仓库内的测试与示例验证自己的集成。

ACS 在 Host 中的定位:PEP 与 PDP 分离

ACS 是 Agent Governance Toolkit 的策略层,定位为一个**无状态、确定性、失败即关闭(fail closed)**的策略决策运行时(见 policy-engine/README.md)。它的集成模型非常清晰:

  • Host 拥有 Agent 循环,充当策略执行点(PEP,Policy Enforcement Point)。在每个干预点上,Host 把"即将发生什么"的完整 JSON 快照交给 ACS,例如入站请求、一次模型调用、一次具体的工具调用。
  • ACS 充当策略决策点(PDP,Policy Decision Point)。它评估绑定在该干预点上的策略,返回三种东西:verdict(判定)、仅当判定为transform时可选的已转换策略目标(transformed policy target)、以及产生该决策的策略输入(policy input)。

ACS 在调用之间不持有任何状态,因此 Host 每次都必须提供完整快照;同时 Host 负责对判定采取行动——ACS 决策,Host 执行。这与 README 中声明的运行时契约一致:无状态(运行时不保留会影响后续判定的可变状态)、确定性(相同 manifest、快照、模式与 dispatcher 输出必然产生相同判定)、失败即关闭(运行时故障一律返回deny,使用保留的运行时错误 reason,且不应用任何转换)。

前置条件

需求用途
任一 SDK 工具链(Rust 1.85+、Python 3.11+、Node 18+ 或 .NET 8)从你的 Host 构建并调用 ACS
PATH上的opa内置的、用于运行 Rego 策略的 dispatcher。仅当 manifest 使用rego策略时才需要

注意:OPA 只在策略通过内置 OPA dispatcher 求值时、于运行时才需要。如果 Host 自带策略 dispatcher,则无需安装 OPA。

Step 1. 安装 SDK

四种 SDK 的常规安装方式如下:

SDK安装命令
Rustcargo add agent_control_specification
Pythonpython -m pip install agent-control-specification
Nodenpm install agent-control-specification
.NETdotnet add package AgentControlSpecification

每个 SDK 都加载同一个原生核心:Rust crate 直接链接它,Python 与 Node 包携带编译好的原生扩展,.NET 包则把原生库与托管程序集一起发布。如果要从本仓库源码构建而非使用已发布包,请遵循 SDK 矩阵 中的构建命令。

使用独立 ACS 制品包(artifact kit)安装

如果软件包尚未发布、需要从独立制品包安装,请把ACS_KIT环境变量指向包含artifacts/的制品包根目录:

SDK仅制品安装
Rust解压agent_control_specification_core-*.crateagent_control_specification-*.crate以及你需要的集成 crate(如agent_control_specification_openai-*.crateagent_control_specification_mcp-*.crateagent_control_specification_rig-*.crate),然后添加指向解压目录的[patch.crates-io]条目。
Pythonpython -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.1b1-*.whl
Nodenpm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-linux-x64-gnu-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.1-beta.0.tgz
.NETdotnet add package AgentControlSpecification --version 0.3.1-beta.0 --source "$ACS_KIT/artifacts"
生成器python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.1b1-*.whl "$ACS_KIT"/artifacts/acs_generator-0.4.0b0-py3-none-any.whl
C ABI编译时链接"$ACS_KIT"/artifacts/include/agent_control_specification.h,链接或加载"$ACS_KIT"/artifacts/libagent_control_specification_core.so

两点平台注意事项:Python 制品安装可能从你配置的软件包索引解析第三方 wheel 依赖,除非制品包同时包含 Python 依赖 wheelhouse;只有包含该依赖闭包的制品包才能配合--no-index --find-links "$ACS_KIT/artifacts"使用。Node 制品安装中,请把agent-control-specification-linux-x64-gnuagent-control-specification-opa-linux-x64替换为与宿主平台匹配的原生包与 OPA 包。

Step 2. 声明 Manifest:把策略绑定到干预点

manifest 的作用是把命名策略绑定到干预点。最小的可用 manifest 声明一条 Rego 策略并守卫一个干预点。把下面的内容保存为 Host 旁边的manifest.yaml

agent_control_specification_version: "0.4.0-alpha.1" metadata: name: "my-agent" policies: email_policy: type: rego bundle: ./policy query: data.my_agent.verdict intervention_points: pre_tool_call: policy_target: "$.tool_call.args" policy_target_kind: tool_args tool_name_from: "$.tool_call.name" policy: id: email_policy tools: send_email: type: Tool id: send_email clearance: internal

字段含义:policy_target是待求值值在快照中的路径;tool_name_from仅在两个工具干预点上必需,用于指明承载当前工具名的路径;tools块是投影后的工具元数据目录,策略可以读取它。manifest 模式的完整概览见 README 的 Manifest schema overview,规范定义见 policy-engine/spec/SPECIFICATION.md。

从 README 可以进一步了解 manifest 的顶层块:

含义
agent_control_specification_version非空版本字符串,当前规范描述为0.4.0-alpha.1
metadata自由形式的 manifest 元数据
extends有序的父 manifest 路径或 HTTPS URL(ACS 兼容),AGT Host 提交的是解析后的 manifest
policies命名策略定义,支持regocedartestcustom四种类型
intervention_points以八个干预点名称为键的封闭映射,每个条目绑定一条策略
tools投影工具元数据目录,条目接受任意字段,包括clearancesecurity_labels
annotators命名注释器声明,类型为classifierllmendpoint
approval由 AGT 拥有的升级后端(escalation backend)配置

干预点条目字段:policy_target(待求值值的快照路径)、policy_target_kind(可选描述性标签,会复制进策略输入)、annotations(按点选择已声明注释器及其from路径)、policy(含id、可选query与 Host 定义的 adapter 字段)、tool_name_from(仅工具干预点上的当前工具名快照路径)。

仓库中 policy-engine/examples/bank_agent/manifest.yaml 给出了一个绑定全部八个干预点、附带八个classifier注释器与工具目录(含clearancesecurity_labels)的完整参考 manifest,是理解字段组合方式的极佳样例。

Step 3. 编写策略:verdict 契约与五种决策

内置 dispatcher 会相对 manifest 解析bundle路径,所以创建policy/my_agent.rego。下面这条策略拒绝任何参数中提到外部收件人的工具调用:

package my_agent import rego.v1 default verdict := {"decision": "allow"} verdict := { "decision": "deny", "reason": "external_recipient_blocked", "message": "This tool may not send to external recipients.", } if { args := object.get(input.policy_target, "value", {}) contains(lower(object.get(args, "to", "")), "@external.example") }

verdict 必须携带decision,取值只能是allowdenywarnescalatetransform之一。其余字段约定(与 README 中 verdict 成员表一致):

verdict 成员含义
decision必填,取值为allowdenywarnescalatetransform
reason可选的低基数(low cardinality)错误码
message可选、面向 Host 的文本
transform可选主体,仅transform决策需要
evidence可选的不透明证据对象,会传播到遥测
result_labels可选标签,Host 可随产出的数据一并持久化

两条硬性规则:策略只有在transform决策下才能返回transform主体——allowwarndenyescalate四种决策永不修改策略目标;reason 不得使用保留的runtime_error:前缀(该命名空间是运行时故障专用的,详见 README 的 Reserved reasons 一节与规范第 15 节)。

仓库中 policy-engine/examples/bank_agent/policy/bank_agent_rego.rego 展示了更完整的策略写法:用default <point>_verdict声明八个默认判定,再以input.intervention_point分派到各点的具体规则,涵盖 deny(高风险输入、模型建议绕过审批)、escalate(大额转账需人工审批)、transform(插入系统提示、脱敏账号)、warn(关闭审计)等全部五种决策形态,与 Step 5-7 的语义一一对应。

Step 4. 构造运行时:零配置from_path

使用零配置的from_path构造器。不带任何 dispatcher 参数时,它会针对 manifest 相对路径的 Rego bundle 接好内置 OPA 策略 dispatcher,因此 Rego Host 无需编写任何 dispatcher 代码(何时需要自供 dispatcher 见 README 的 Zero-config construction):

use agent_control_specification::AgentControl; let control = AgentControl::from_path("manifest.yaml")?;
from agent_control_specification import AgentControl control = AgentControl.from_path("manifest.yaml")
const { AgentControl } = require("agent-control-specification"); const control = AgentControl.fromPath("manifest.yaml");
using AgentControlSpecification; var control = AgentControl.FromPath("manifest.yaml");

Step 5. 在干预点求值:传入干预点与完整快照

在你声明的边界处调用 SDK,传入干预点与快照。结果携带verdicttransform时的已转换策略目标,以及产生决策的策略输入:

use agent_control_specification::{Decision, EnforcementMode, InterventionPoint}; use serde_json::json; let result = control.evaluate_intervention_point( InterventionPoint::PreToolCall, json!({"tool_call": {"id": "t1", "name": "send_email", "args": {"to": "user@external.example"}}}), EnforcementMode::Enforce, ); assert_eq!(result.verdict.decision, Decision::Deny);
from agent_control_specification import InterventionPoint result = await control.evaluate_intervention_point( InterventionPoint.PRE_TOOL_CALL, {"tool_call": {"id": "t1", "name": "send_email", "args": {"to": "user@external.example"}}}, ) assert result.verdict.decision.value == "deny"
const { InterventionPoint } = require("agent-control-specification"); const result = await control.evaluateInterventionPoint( InterventionPoint.PreToolCall, { tool_call: { id: "t1", name: "send_email", args: { to: "user@external.example" } } }, );
var result = await control.EvaluateInterventionPointAsync( InterventionPoint.PreToolCall, System.Text.Json.JsonDocument.Parse( """{"tool_call":{"id":"t1","name":"send_email","args":{"to":"user@external.example"}}}""").RootElement.Clone());

注意 API 差异:Rust SDK 在evaluate_intervention_point上接收EnforcementMode;Python、Node、.NET SDK 求值时不带模式,而是通过 Step 7 介绍的runenforcehelper 应用执行(enforcement)。

Step 6. 执行判定:五种决策的 Host 动作

evaluate_intervention_point返回判定后,由 Host 决定如何处理:

决策Host 动作
allow使用原始策略目标继续执行。
warn使用原始策略目标继续执行,但记录该警告。
deny阻止该动作,向调用方展示reasonmessage
escalate挂起该动作,在继续前请求人类或外部权威机构审批。
transform仅使用返回的已转换策略目标继续执行。

当策略返回transform时,运行时在enforce模式下校验转换路径、将其应用到策略目标,并把转换后的值暴露在结果上。执行工具、发送模型请求、存储工具结果或披露输出之前,必须读取已转换的策略目标而非原始值。脱敏(redaction)是最常见的用例,但核心在任何情况下都不会在allowwarndenyescalate时修改数据。这也呼应了 README 中与上游 ACS 的一个关键分歧:本引擎把 effect 机制移除、替换为transform判定类型,使"转换"成为可审计、可验证的显式决策。

Step 7. 中介整个 Agent 循环:八个干预点与编排 helper

真实 Host 守卫的不止一个点。在循环的对应位置接入每个相关干预点:

干预点何时调用
agent_startup会话或运行开始时、循环开始之前
input外部请求到达时、Agent 处理它之前
pre_model_call模型请求组装完成后、模型调用之前
post_model_call模型响应返回后、Host 处理它之前
pre_tool_call具体工具调用就绪后、执行之前
post_tool_call工具结果返回后、到达 Agent 或调用方之前
output最终面向用户可见的响应组装完成后、发送之前
agent_shutdown会话或运行结束时

其中pre_tool_callpost_tool_call是仅有的两个工具干预点,也是仅有的接受tool_name_from的点。手动逐点调用evaluate_intervention_point可行,但每个 SDK 都内置了编排 helper,把求值、执行、转换应用与审批打包进一次调用,普通 Host 应优先使用:

Helper守卫的点
run包裹一个运行可调用对象的inputoutput
run_model包裹一次模型调用的pre_model_callpost_model_call
run_toolprotect_tool包裹一次工具执行的pre_tool_callpost_tool_call

在 enforce 模式下,这些 helper 遇到deny会抛出阻塞错误(blocked error),遇到escalate则咨询审批解析器(approval resolver)——它是 Host 侧的一个回调,返回 allow、deny 或 suspend。各语言的方法名与接线细节见仓库sdk/下的各 SDK README,以及制品包内附的PYTHON_README.mdNODE_README.mdDOTNET_README.md

仓库中 policy-engine/examples/bank_agent/manifest.yaml 与配套 Rego 策略是"全循环中介"的完整可运行参考:八个干预点全部绑定策略,pre_tool_call对 10000 以上电汇返回escalatepost_model_call拦截"bypass approval"提示,output用正则把CHK-[0-9]+账号脱敏为ACCOUNT-REDACTED。另有 policy-engine/integrations/openai/、policy-engine/integrations/mcp/、policy-engine/integrations/rig/ 下的 Rust 集成 crate 示例,展示在真实框架的工具调用点挂上守卫的写法。

Step 8. 添加注释器与脱敏

有两类常见需求不需要在 Host 侧编写超出内置默认的 dispatcher 代码。

注释器(annotators):把派生的信号(如分类器评分)挂到策略输入的annotations.<name>下,供策略读取。在 manifest 的annotators块中声明它们,并用annotations映射让某个干预点选入。注意,内置的classifierllmendpoint注释器会发起网络调用,因此零配置使用注释器需要一个可达的端点以及所需的凭证。参考 dispatcher 示例位于仓库 policy-engine/integrations/annotators/,Rust 侧实现对应core/src/dispatchers/classifier.rscore/src/dispatchers/llm.rscore/src/dispatchers/endpoint.rs;运行时把每个点特定的from路径对初步策略输入解析后调用 dispatcher,且只在annotations.<name>下写入返回值。README 中的 LLM 注释器供应商指南 提供了可插拔供应商预设。

脱敏(redaction):不需要自定义 dispatcher。返回transform判定、让transform.value携带脱敏后的策略目标,然后按 Step 6 读取已转换策略目标即可。仓库示例 policy-engine/examples/support_agent/ 正是以这种方式脱敏 PII。

Step 9. 验证集成:制品冒烟测试与跨 SDK 一致性

先确认 SDK 在你的环境中能正确对接原生核心。在制品包场景下,把包安装进一个临时 Host 项目,用你计划发布的 manifest 跑一个 allow 和一个 deny 冒烟测试;在源码检出场景下,使用项目构建说明描述的各语言测试套件。

SDK制品冒烟测试
Rust构建一个依赖本地.crate制品的临时 crate,求值一个 manifest。
Pythonartifacts/中的 wheel 安装进临时虚拟环境,调用NativeRuntimeClient.from_path
Nodeartifacts/中的.tgz包安装进临时项目,调用AgentControl.fromPath
.NETartifacts/的本地 nupkg 源还原,调用AgentControl.FromPath

在本地验证 CI 对齐时设置AGENT_CONTROL_REQUIRE_OPA=1,让依赖 OPA 的测试在缺失 OPA 时响亮失败而不是被跳过。仓库 policy-engine/tests/ 下的跨 SDK 一致性 fixtures 断言四个 SDK 对同一批快照给出相同判定。

对于仅制品的包,请从临时 Host 项目验证已安装包,而不是运行仓库检出的测试套件:

SDK仅制品冒烟检查命令
Rustmkdir crates && for c in agent_control_specification_core agent_control_specification agent_control_specification_openai agent_control_specification_mcp agent_control_specification_rig; do tar -xzf "$ACS_KIT"/artifacts/$c-0.3.1-beta.0.crate -C crates 2>/dev/null || true; done,然后在cargo check之前把[patch.crates-io]指向解压出的crates/<name>-0.3.1-beta.0目录
Pythonpython -m venv .venv && .venv/bin/python -m pip install "$ACS_KIT"/artifacts/agent_control_specification-0.3.1b1-*.whl && .venv/bin/python -c "import agent_control_specification as acs; print(acs.AgentControl)"
Nodenpm init -y && npm install "$ACS_KIT"/artifacts/agent-control-specification-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-linux-x64-gnu-0.3.1-beta.0.tgz "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.1-beta.0.tgz && node -e "const acs=require('agent-control-specification'); console.log(typeof acs.AgentControl)"
.NETdotnet new console -n AcsSmoke && cd AcsSmoke && dotnet add package AgentControlSpecification --version 0.3.1-beta.0 --source "$ACS_KIT/artifacts" && dotnet build

制品校验:所有 SDK 共享同一个原生实现

除冒烟测试外,Rust 核心还暴露validate_acs_artifacts,每个语言 SDK 都委托给该实现;四个 SDK 返回的结果结构完全一致——valid加上针对 manifest 模式、类型化 ACS 语义、OPA Rego 解析的结构化诊断:

use agent_control_specification::validate_acs_artifacts; let result = validate_acs_artifacts(manifest_yaml, &rego_modules, None);

策略绑定通过policy.id选择一条策略;Rego 策略要求在策略定义或绑定上给出query。规范 JSON Schema 位于 policy-engine/core/schema/(含manifest.schema.jsonapproval.schema.json),规范的权威契约见 policy-engine/spec/SPECIFICATION.md。

用生成器初始化:acs-generate init

当第一套 ACS 制品应当"构造即正确"(valid by construction)而不是手工拼装时,使用生成器。引导式初始化流程会询问你要中介的干预点、工具目录条目、要拦截的关键词、审批门与输出脱敏模式,然后写出 manifest、Rego 策略、报告与可选的示例快照:

acs-generate init --non-interactive --name "Demo Agent" --points input,pre_tool_call,output --tool send_email:internal --deny-keyword secret --escalate-tool send_email --sample-snapshot --out build/demo-acs

输出目录必须为空,除非提供--force。当本地 OPA 校验必须与 CI 一致时,加上--strict。安装生成器包后,同一命令也可以写为acs init。生成器会写manifest.yamlpolicy/<slug>.regoreport.md,以及可选的snapshots/<intervention_point>.jsontest_policy.py冒烟测试。生成器 README(policy-engine/generator/README.md)还补充了两点生产实践:

  • 可重复运行--answers-file支持 CI 与重复本地运行,接受与 CLI 标志一致的字段(namepointstoolsdeny_keywordsescalate_toolsredact_output_patterns),不支持的关键字会快速失败,避免 CI 静默忽略预期设置;--answers-file -支持从 stdin 读取 JSON/YAML。
  • 严格模式下的 OPA:仅制品包内置本地 Node 可选 OPA 包,安装后把其bin目录前置到PATH再运行--strict
    npm install "$ACS_KIT"/artifacts/agent-control-specification-opa-linux-x64-0.3.1-beta.0.tgz PATH="$PWD/node_modules/agent-control-specification-opa-linux-x64/bin:$PATH" \ acs-generate init --strict --non-interactive --name "Payments Agent" --out build/acs-payments

生成后的叠加:extends子 manifest

生成之后要做增量改动时,使用带extends的子 manifest。子 manifest 可以添加 metadata 键、策略、注释器、工具或新的干预点,但不能用不同的值替换已有干预点的策略、目标或tool_name_from——冲突的重复项在 manifest 加载时会失败即关闭。

基于文件的extends限定在顶层 manifest 根目录内:把父 manifest 放在子根目录之下,例如base/manifest.yaml;或者当 SDK 提供 manifest-chain 构造器时,用它加载并列的兄弟 manifest。这一"父策略不可被替换、只能叠加"的合并语义也体现在 AGT 的 ADR(docs/adr/0014-parent-deny-rules-immutable-in-merge.md)中,属于本项目对上游 ACS 的既定分歧之一。

更进一步:从 Quickstart 到生产落地

  • 阅读权威契约:policy-engine/spec/SPECIFICATION.md
  • 了解 Host 义务与安全边界:policy-engine/docs/security-model.md,以及无状态运行时契约 policy-engine/docs/stateless-runtime.md
  • 挑选合适的 SDK 面:policy-engine/docs/sdk-surfaces.md
  • 包装真实 Agent 框架:参考 policy-engine/docs/adapter-matrix.md 与 README 的 Framework adapters 一节
  • 研究可运行 Host 示例:仓库 policy-engine/examples/ 下按场景组织,包括bank_agent(全生命周期点、转换与脱敏)、lifecycle_rego(零配置 Rego 全流程)、custom_dispatchers(离线分类器/端点/LLM 注释器与自定义策略 dispatcher)、manifest_extends(文件式 manifest 组合)、conformance_snapshots(fixture 驱动的策略评审)、coding_agent(Rust Host 应用)、ifc_agent(无状态信息流控制标签流转)
  • 遥测:Rust 核心通过TelemetrySink输出结构化、默认脱敏的事件(decisionpolicy_evaluationintervention_point.transformed等),四个 SDK 都内置可插拔 sink 与 OpenTelemetry 指标契约(acs_intervention_{allow,deny,warn,escalate,transform}_total计数器与acs_intervention_duration_ms直方图,meter 名为agent_control_specification),见 policy-engine/docs/observability.md

至此,你已拥有一套从空 manifest 到全循环中介的完整集成路径:声明策略、绑定干预点、零配置构造运行时、按五种判定执行、用编排 helper 覆盖整个 Agent 生命周期,并通过制品校验、冒烟测试与生成器保证制品质量。ACS 的"定义一次,处处执行(Define once. Enforce everywhere.)"理念,最终落地为 Host 与策略层之间清晰、可审计、失败即关闭的决策契约。

  • 人工智能
  • AI Agent
  • AI 安全治理
  • 策略引擎
  • Agent 沙箱
  • 认证鉴权

【免费下载链接】agent-governance-toolkit

AI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 OWASP Agentic Top 10.

项目地址:https://gitcode.com/GitHub_Trending/ag/agent-governance-toolkit
点击查看免费下载

相关推荐

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询