news 2026/9/19 11:21:12

Agent Governance Toolkit Framework Adapter Contract 1.0:HostSession 生命周期治理与框架适配器集成规范

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Agent Governance Toolkit Framework Adapter Contract 1.0:HostSession 生命周期治理与框架适配器集成规范

Agent Governance Toolkit Framework Adapter Contract 1.0:HostSession 生命周期治理与框架适配器集成规范

【免费下载链接】agent-governance-toolkitAI 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 Agent Governance Toolkit(下文简称 AGT)中的 Framework Adapter Contract 1.0 规范。该规范定义了框架适配器如何将 LangChain、OpenAI Agents、AutoGen 等原生 Agent 运行时的生命周期事件接入统一的治理管线:适配器通过HostSession承载会话级状态、在副作用或信息披露之前应用策略变换、向宿主透出原生PolicyEvaluation错误,同时把会话计数器留在无状态运行时之外。读完本文,你将掌握适配器的干预点声明、动作解析、身份绑定、审计追踪与失败关闭(fail-closed)的完整实现路径,并能基于 agent-governance-typescript 的GenericFrameworkAdapter源码落地一个可运行的治理适配器。

一、契约核心:适配器、运行时与 HostSession 的边界

Framework Adapter Contract 1.0(docs/specs/FRAMEWORK-ADAPTER-CONTRACT-1.0.md)用一段精炼的语义定义了三方职责边界:

  • 框架适配器(Framework Adapter):接受一个原生运行时(native runtime),把框架自身的生命周期事件翻译成治理调用;
  • HostSession:承载单个会话的SnapshotBuilder、计数器与原生干预点调用,是所有会话级状态的家;
  • 治理运行时(AgentControl):无会话状态、可共享,拥有审批解析器(approval resolver)与超时行为。

契约原文强调五个强制点:

  1. 适配器必须声明所需的干预点(required intervention points),并在执行前完成契约校验;
  2. 适配器在副作用或信息披露之前应用变换(transform);
  3. 适配器向宿主透出原生PolicyEvaluation错误,而非私有的 v4 结果类型;
  4. 会话计数器存放在无状态的运行时之外(即HostSession内);
  5. 审批解析(approval resolution)属于运行时的职责,适配器不得携带竞争性的解析器配置。

这五条与 v4 策略语言移除计划(docs/v4-removal.md)中的 Phase 2 提取边界一一对应:HostSession现在独占一个会话的SnapshotBuilder、计数器与原生干预点调用,它会在执行前预留工具调用预算(因此被拒绝和失败的尝试同样消耗预算),并在post_model_call之后记录模型 token,只对计数器变更做串行化;AgentControl保持无会话且可在回调线程安全的前提下被多个宿主共享。

二、为什么需要适配器契约:从 v4 桥到原生 HostSession

理解这份契约的背景是 v4 策略语言的移除。AGT 正在移除旧的 v4 意图式策略语言,使 ACS(Agent Control Specification,v5)策略层成为工具箱中唯一的策略契约。在移除计划(docs/v4-removal.md)的符号清单中,v4 的PolicyInterceptorExecutionContextAdapterRuntimeBridge全部由HostSessionoverAgentControl取代:

v4 符号原位置替代品
GovernancePolicyPatternTypeagent_os/integrations/base.pyACS manifest 加AgentControl
PolicyInterceptorExecutionContextagent_os/integrations/base.pyHostSessionoverAgentControl
get_runtime_bridgeAdapterRuntimeBridgeagent_os/integrations/_v5_runtime_bridge.pyHostSession
PolicyDocumentCedarBackendagent_os/policies/ACSpolicies.type: cedar与原生 manifest

移除了桥接层之后,框架适配器只依赖两个原生契约:

  • 原生 manifest:以AgentControl.from_path(str(...))为规范运行时构造函数,携带父目录作为 provenance,相对 bundle、data、prompt、Cedar 与extends引用都相对 manifest 解析,而不是相对当前工作目录;
  • 原生干预点结果AgentControl.evaluate_intervention_point(...)返回不可变的InterventionPointResult,其verdict携带decisionreasonmessagetransformevidenceresult_labels,审计信封使用agt.policy_evaluation.v1schema。

ACS(policy-engine/spec/README.md)定义了八个干预点:agent_startupinputpre_model_callpost_model_callpre_tool_callpost_tool_calloutputagent_shutdown。每个干预点条目通过policy_target选择值、可请求annotations,并通过policy.id引用顶层policies条目。适配器契约正是在这八个点上挂接治理逻辑,其中pre_tool_call是工具调用类动作的默认治理关口。

适配器强制契约速览

移除计划中以表格形式给出了适配器强制契约(Adapter enforcement contract),这是 Framework Adapter Contract 的运行时化表述:

关注点原生契约
必需干预点每个适配器声明它们,执行前校验运行时契约;缺失必需干预点是构造错误,绝不是运行时允许的回退
工具目录manifest要求静态toolshost_dynamic由宿主同步;optional不施加目录要求
变换每个适配器声明可应用变换的干预点,共享的适配器会话在转发载荷前应用变换
审批AgentControl拥有解析器与超时行为;拿到运行时的适配器不得再接受竞争性的解析器配置
预算尝试的调用消耗工具调用预算,包括被拒绝与失败的尝试;会话计数器位于适配器会话,而非AgentControl
运行时共享当宿主分发器与审批回调线程安全时,一个运行时可被共享;会话快照与计数器绝不存放在运行时上
失败方向非法 manifest、缺失必需绑定、分发器错误与审批错误一律失败关闭;原生路径不会把未知干预点或工具重写为允许

三、源码级落地:TypeScript 版 GenericFrameworkAdapter

框架适配器契约在 agent-governance-typescript 中由 src/framework-adapter.ts 完整实现,并从 src/index.ts 导出GenericFrameworkAdapterFrameworkInvocationHandle,同时导出FrameworkInvocationFrameworkInvocationOutcomeGenericFrameworkAdapterOptions等类型。这一实现与契约五条强制点一一对应。

3.1 核心类型定义

调用方与适配器交互的数据结构如下(src/framework-adapter.ts):

export interface FrameworkInvocation { name: string; kind?: TraceSpanKind; // 如 'tool_call' | 'llm_inference' | 'internal' action?: string; // 显式动作名,优先于自动解析 /** 可选诊断身份提示;若提供则必须匹配绑定的客户端身份。 */ agentId?: string; input?: Record<string, unknown>; attributes?: Record<string, unknown>; trustedSkillMetadata?: TrustedSkillMetadataSource; } export interface FrameworkInvocationOutcome<TOutput = unknown> { output?: TOutput; error?: string; status?: TraceSpanStatus; costUsd?: number; } export interface FrameworkAdapterResult<TOutput = unknown> { allowed: boolean; reason: string; action: string; invocation: FrameworkInvocation; governanceResult: GovernanceResult; output?: TOutput; error?: string; trace: ExecutionTrace; } export interface GenericFrameworkAdapterOptions { metrics?: GovernanceMetrics; actionPrefix?: string; // 默认 'framework' actionResolver?: (invocation: FrameworkInvocation) => string; }

其中FrameworkAdapterResult是适配器运行的最终产物:allowedreason构成决策可解释性,governanceResult内含decisiontrustScoreauditEntryexecutionTimelifecycleStatetrace是完整的执行追踪(ExecutionTrace)。

3.2 动作解析:显式优先,前缀兜底

GenericFrameworkAdapter构造时接受actionPrefix(默认'framework')与可选的actionResolver。动作解析逻辑(src/framework-adapter.ts)遵循三级优先级:

  1. invocation.action显式指定,直接使用;
  2. 否则调用actionResolver(invocation),用于框架定制命名(如 LangChain 的langchain.invoke.${name});
  3. 兜底拼接${actionPrefix}.${invocation.kind ?? 'internal'}.${invocation.name},即framework.tool_call.search这类默认动作名。

测试 tests/framework-adapter.test.ts 验证了自定义解析路径:策略规则langchain.invoke.chat_modeleffect: 'allow'actionResolver返回langchain.invoke.${invocation.name},最终result.actionlangchain.invoke.chat_model。这意味着未来任何框架适配器(LangChain、LlamaIndex、Semantic Kernel 等)都可以通过actionResolver建立自己的命名空间,而不必改动治理管线。

3.3 beginInvocation:治理前置与身份绑定

beginInvocation(src/framework-adapter.ts)是治理决策发生的地方,它完成以下步骤:

  1. 解析动作:按 3.2 的三级优先级得到治理动作名;
  2. 身份规范化:以绑定客户端的 DID(this.client.identity.did)作为规范身份,覆盖调用方的agentId;空字符串视为未断言;
  3. 身份一致性校验:若调用方断言的agentId与绑定身份不一致,直接生成拒绝结果,记录Caller-asserted agentId ... does not match bound client identity ...的审计条目并降低信任分(rejectIdentityMismatch,src/framework-adapter.ts);
  4. 开启追踪 span:以TraceCapture记录动作名、类型、输入与属性;
  5. 执行治理this.client.executeWithGovernance(action, input, skillAuditMetadata)走完整的治理管线——环强制(ring enforcement)、策略求值、信任分读取、审计日志(src/client.ts);
  6. 记录指标:策略决策、信任分、审计条目长度;
  7. 决策分支allowedfalse时立即终结 span(状态error)、完成追踪并finalizeDenied,处理器永远不会执行。

executeWithGovernance的底层管线(src/client.ts)体现了完整的治理语义:

// 简化自 AgentMeshClient.executeWithGovernance this.ringEnforcer.enforce(action); // 1. 执行环校验(Ring2/Ring3 越权即 deny) const decision = this.policy.evaluate(action, params); // 2. 策略求值 const trustScore = this.trust.getTrustScore(this.identity.did); const auditEntry = this.audit.log({ agentId, action, decision, skillAuditMetadata }); if (decision === 'allow') this.trust.recordSuccess(agentId); else if (decision === 'deny') this.trust.recordFailure(agentId);

环违反(RingBreachError)会触发隔离(quarantine)甚至 kill-switch,同时记录 deny 审计并降低信任分,最后以ringViolation字段携带违规详情返回。

3.4 FrameworkInvocationHandle:预检与完成的两阶段生命周期

beginInvocation返回FrameworkInvocationHandle<TOutput>(src/framework-adapter.ts),这是一个两阶段句柄,专门为框架特定的包装器设计:

  • 预检阶段:句柄携带allowedreasongovernanceResulttraceId,框架可以据此决定是否继续;
  • 完成阶段complete(outcome)终结 span(依据errorstatus判定'ok' | 'error'),对tool_call类型的调用记录耗时(metrics.recordToolCall),归一化输出(对象原样保留,标量包装为{ value }),完成追踪并返回FrameworkAdapterResult
  • 保护机制:未完成即调用toResult()抛错Invocation has not been completed;重复complete抛错Invocation already completed;预检即被拒绝的调用(无 capture/span)抛错Invocation was already finalized during preflight

3.5 run:一站式治理执行入口

run(src/framework-adapter.ts)把两阶段封装成一步式 API,是最常用的入口:

async run<TOutput>( invocation: FrameworkInvocation, handler: () => Promise<TOutput> | TOutput, ): Promise<FrameworkAdapterResult<TOutput>> { const handle = await this.beginInvocation<TOutput>(invocation); if (!handle.allowed) { return handle.toResult(); // 拒绝时处理器绝不执行 } try { const output = await handler(); // 允许时执行真实副作用 return handle.complete({ output }); } catch (error) { return handle.complete({ error: error instanceof Error ? error.message : 'Unknown framework handler error', status: 'error', }); } }

注意handle.allowed === falsehandler完全不执行——这正是契约中"在副作用或信息披露之前应用变换/决策"的体现,也是测试 tests/framework-adapter.test.ts 用jest.fn验证的失败关闭行为:策略规则{ action: '*', effect: 'deny' }下,处理器从未被调用,result.trace.successfalse

四、配置与使用:如何实例化一个受治理的适配器

4.1 最小可用示例

参考测试 tests/framework-adapter.test.ts,一个最小可用的治理适配器如下:

import { AgentMeshClient } from './client'; import { GenericFrameworkAdapter } from './framework-adapter'; import { GovernanceMetrics } from './metrics'; // 1. 创建带策略的治理客户端 const client = AgentMeshClient.create('adapter-agent', { policyRules: [ { action: 'framework.tool_call.search', effect: 'allow' }, ], }); // 2. 可选:开启指标采集 const metrics = new GovernanceMetrics({ enabled: true }); // 3. 构造适配器 const adapter = new GenericFrameworkAdapter(client, { metrics }); // 4. 治理式执行 const result = await adapter.run( { name: 'search', kind: 'tool_call', input: { query: 'status' }, }, async () => ({ items: 3 }), ); console.log(result.allowed); // true console.log(result.output); // { items: 3 } console.log(result.trace.spans.length); // 1 console.log(metrics.getSnapshot().counters['trace.captures']); // 1

4.2 策略规则形态

AgentMeshClient.createpolicyRules是动作到效应的映射,常用的三种形态:

规则示例语义
{ action: 'framework.tool_call.search', effect: 'allow' }精确放行单个动作
{ action: '*', effect: 'deny' }默认拒绝一切(失败关闭的基线)
{ action: 'langchain.invoke.chat_model', effect: 'allow' }配合actionResolver的框架命名空间

结合执行环配置,还可以为动作指定所需特权环(见测试 tests/framework-adapter.test.ts):

const client = AgentMeshClient.create('adapter-agent', { policyRules: [{ action: 'framework.tool_call.lookup', effect: 'allow' }], execution: { agentRing: ExecutionRing.Ring2, actionRings: { 'framework.tool_call.lookup': ExecutionRing.Ring2, }, }, });

4.3 技能审计元数据与上下文哈希

契约要求适配器在披露前做变换,而审计层面则要求可追溯。FrameworkInvocation.trustedSkillMetadata携带可信的技能来源(skillNameskillOrigin),buildSkillAuditMetadata(src/framework-adapter.ts)会:

  • 对调用输入做稳定序列化后 SHA-256 哈希contextHashBefore);
  • 有可信元数据或上下文哈希时才构造SkillAuditMetadata,并标记provenanceSourceTrust: 'trusted'
  • 哈希使用键排序的稳定序列化(sortKeys+JSON.stringify),因此对象键顺序不影响哈希值——测试 tests/framework-adapter.test.ts 用{a:1,b:2}{b:2,a:1}两种输入验证了哈希一致。

这些元数据最终随审计条目写入governanceResult.auditEntry.skillAuditMetadata,为事后取证提供"调用前上下文指纹"。

4.4 身份绑定的失败关闭语义

身份是零信任治理的第一道关。契约与实现共同确立以下规则:

  • agentId省略或为空字符串:绑定到客户端 DID,正常执行;
  • agentId与客户端 DID 一致:正常执行(测试 tests/framework-adapter.test.ts);
  • agentId与客户端 DID 不一致:失败关闭——即使策略允许该动作,也会生成deny决策、写入审计、降低信任分,处理器绝不执行(测试 tests/framework-adapter.test.ts 中did:agentmesh:spoofed:1234被拒绝)。

实现上,beginInvocation在规范化时用canonicalAgentId覆盖invocation.agentId,保证审计与追踪中的身份永远是绑定身份,防止伪造身份混入证据链。

五、失败方向与错误透出:原生 PolicyEvaluation

契约与移除计划共同强调:非法 manifest、缺失必需绑定、分发器错误与审批错误一律失败关闭,原生路径不会把未知干预点或工具重写为允许。对应的工程语义:

  1. 缺失必需干预点 = 构造错误:适配器声明的必需干预点在运行时契约校验中缺失时,直接构造失败,而不是在运行时静默放行;
  2. 原生错误透出:原生拒绝通过PolicyViolationError附带evaluation_resultagt.policy_evaluation.v1审计记录;PolicyViolationError.from_evaluation_result(...)会生成稳定、脱敏的公开消息,不把策略或用户内容复制进异常文本;
  3. 审批归属运行时AgentControl独占审批解析器与超时行为;适配器可以省略approval_resolver或重复相同回调(过渡期),但传入不同回调会在构造时被拒绝;
  4. 预算失败也计费HostSession在执行前预留工具调用预算,因此被拒绝与失败的尝试同样消耗预算,防止通过"反复试错"绕过治理。

TypeScript 侧对应的失败关闭体现在两处:runallowed === false时跳过handlerbeginInvocation在身份不匹配或治理 deny 时通过finalizeDenied生成allowed: false的结果,且拒绝路径的追踪success恒为false

六、生态中的适配器范围与演进路线

Framework Adapter Contract 是跨语言、跨框架的。移除计划(docs/v4-removal.md)列出了 17 个桥接框架适配器在 Phase 3 全部切换到原生runtime参数与NativeAdapterRuntime/HostSession:A2A、Agent Shield、Anthropic、AutoGen、Bedrock、CrewAI、Gemini、Google ADK、Guardrails、LangChain、LlamaIndex、MAF、Mistral、OpenAI、PydanticAI、Semantic Kernel、Smolagents。它们不再通过AdapterRuntimeBridgeBridgeResult导入与求值,唯一保留的桥接依赖只是过渡期的构造选择器。

演进分六个阶段(strangler 模式加一次原子性公开破坏性发布):

阶段内容
0语义清点与 Python/Rust/TypeScript 的 CI 棘轮(ratchet)
1定义原生 v5 结果、错误、审计、类型化 manifest 与适配器强制契约
2从 v4 运行时桥中抽取 ACS 原生HostSession,隔离并加固迁移翻译器
317 个框架适配器按绿色纵向切片迁移并配套测试与示例
4迁移非适配器消费方并删除运行时governance.yaml解析
5重写 Rust 与 TypeScript 的 v4 表面并修复包构建
6原子性移除全部桥接、v4 结果转换与再导出,棘轮收紧为零

贯穿全程的是scripts/check_v4_ratchet.py棘轮(docs/v4-removal.md 中的命令):

python scripts/check_v4_ratchet.py # 对照基线做门禁 python scripts/check_v4_ratchet.py --report # 查看清单 python scripts/check_v4_ratchet.py --update-baseline # 真实削减后更新基线

对于存量 v4 项目,官方迁移路径是一次性执行agt migrate v4-to-v5(见 docs/specs/AGENT-OS-POLICY-ENGINE-1.0.md),运行时模块不再加载旧治理文件。

七、结语:契约的工程价值

Framework Adapter Contract 1.0 的工程价值可以浓缩为三句话:

  • 干预点声明前置:适配器把"我需要在哪里被治理"变成显式的构造期契约,杜绝静默放行;
  • 状态与运行时分离:计数器、快照、预算全在HostSessionAgentControl保持无状态可共享,天然支持多宿主并发;
  • 失败关闭是默认值:身份不匹配、环越权、策略 deny、审批缺失、manifest 非法,任何一环失败都阻止副作用发生,且拒绝路径同样留下审计与追踪证据。

对于要在 AGT 上接入新框架的开发者,参考实现就是 agent-governance-typescript/src/framework-adapter.ts 与其配套测试 tests/framework-adapter.test.ts:声明干预点、绑定身份、解析动作、调用run或两阶段的beginInvocation/complete,即可把任意 Agent 框架纳入 AGT 的策略、信任、审计与追踪体系。

【免费下载链接】agent-governance-toolkitAI 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),仅供参考

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

Docker部署iVentoy:轻松实现PXE网络批量装机

最近这段时间一直在折腾机房里的批量装系统&#xff0c;几十台机器一台台插U盘刻盘&#xff0c;真是又慢又费腰。后来换了思路&#xff0c;用 Docker 部署了一个 iVentoy&#xff0c;直接把 PXE 网络装机平台搭起来了&#xff0c;现在只要把 ISO 镜像往目录里一丢&#xff0c;客…

作者头像 李华
网站建设 2026/9/19 11:20:36

老式.doc教案解析:从格式识别到RAG知识库构建

简介&#xff1a;一份面向高校师生及自学者编写的《高等数学》教案&#xff0c;系统覆盖新教程序言、函数概念、基本初等函数、复合函数与初等函数等核心章节&#xff0c;重点解析函数定义域与值域、图像特征、复合函数分解原则等难点&#xff0c;并配有典型例题、思考题与探究…

作者头像 李华
网站建设 2026/9/19 11:19:51

iOS多格式解压实战:ZIP/RAR/7z密码包与流式解压架构

先问你一个问题&#xff1a;你手头的 iOS 项目里&#xff0c;如果 PM 忽然提需求说要加一个“支持 ZIP、RAR、7z 解压&#xff0c;最好还能解密码包”的文件处理模块&#xff0c;你的第一反应是什么&#xff1f;说实话&#xff0c;大多数人的第一反应是“找个库直接拖进来”&am…

作者头像 李华
网站建设 2026/9/19 11:17:03

TRAE IDE与TRAE WORK历史版本下载指南:从版本选择到兼容性验证

1. 为什么“找历史版本”这件事比想象中更折腾做开发工具支持这些年&#xff0c;我被问得最多的问题之一就是&#xff1a;“新版本跑不起来&#xff0c;旧版本去哪下&#xff1f;”这次聊的 TRAE IDE 和 TRAE WORK 历史版本下载&#xff0c;就是这类需求的典型代表。TRAE IDE 是…

作者头像 李华