智能体互联网:原理、架构与开发实践—项目6:智能体安全与生命周期管理

项目六 智能体安全与生命周期管理

对应标准:GB/Z 185.3---2026(身份管理安全要求)、GB/Z 185 全系列(合规要素与生命周期管理)

建议学时:12 学时(理论 4 + 实践 8)

前置项目:项目一至项目五全部内容


项目导读

情境引入

经过前五个项目的学习,校园智能体已经具备了身份认证、能力描述、自动发现、交互协作和工具调用的完整能力。但在实际部署中,还面临两个关键挑战------

挑战一:安全

某天,校园生活助手收到一个来自"未知智能体"的请求,声称自己是"教务系统智能体",要求获取所有学生的课表数据。如果不验证对方身份就放行,学生隐私可能泄露;如果直接拒绝,又可能影响正常协作。如何做到"先验身份,再给数据"?

挑战二:生命周期

寒假期间,社团通知助手暂停服务两个月。如果它的身份凭证一直有效,可能被恶意利用。开学后,通知助手升级了功能,版本号变了但身份码应该保持不变。如何管理智能体从注册到注销的完整生命周期?

这就是本项目要回答的------规定智能体如何进行安全防护、合规检测和生命周期管理

学习目标

目标维度 具体要求
知识 ① 掌握 GB/Z 185.3 的身份鉴别通用流程和五大验证环节;② 理解 GB/Z 185 全系列的安全与合规七要素;③ 掌握智能体生命周期五大状态(待注册→已注册→活跃→已锁定→已注销)及其六大操作(注册→激活→更新→锁定→解锁→注销)
技能 ① 能搭建安全网关,实现双向身份鉴别与访问控制;② 能编写合规检测工具,自动检查智能体标准符合性;③ 能实现完整的生命周期管理平台
素养 ① 建立"安全先行、合规为本"的工程意识;② 理解全生命周期管理对智能体生态健康的重要性;③ 形成对智能体互联网治理的系统性认知

项目任务总览

任务 名称 核心标准 产出物
任务 6.1 智能体安全防护------双向身份鉴别与访问控制 GB/Z 185.3 身份鉴别 security_gateway.py------安全网关
任务 6.2 智能体合规检测------标准符合性自动化检测 GB/Z 185 全系列合规要素 compliance_checker.py------合规检测工具
任务 6.3 智能体生命周期管理------注册、更新、锁定与注销 GB/Z 185.3 生命周期 lifecycle_manager.py------生命周期管理平台

#mermaid-svg-uYFkAXSSjbwcrYBd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uYFkAXSSjbwcrYBd .error-icon{fill:#552222;}#mermaid-svg-uYFkAXSSjbwcrYBd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uYFkAXSSjbwcrYBd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uYFkAXSSjbwcrYBd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uYFkAXSSjbwcrYBd .marker.cross{stroke:#333333;}#mermaid-svg-uYFkAXSSjbwcrYBd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uYFkAXSSjbwcrYBd p{margin:0;}#mermaid-svg-uYFkAXSSjbwcrYBd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster-label text{fill:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster-label span{color:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster-label span p{background-color:transparent;}#mermaid-svg-uYFkAXSSjbwcrYBd .label text,#mermaid-svg-uYFkAXSSjbwcrYBd span{fill:#333;color:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd .node rect,#mermaid-svg-uYFkAXSSjbwcrYBd .node circle,#mermaid-svg-uYFkAXSSjbwcrYBd .node ellipse,#mermaid-svg-uYFkAXSSjbwcrYBd .node polygon,#mermaid-svg-uYFkAXSSjbwcrYBd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uYFkAXSSjbwcrYBd .rough-node .label text,#mermaid-svg-uYFkAXSSjbwcrYBd .node .label text,#mermaid-svg-uYFkAXSSjbwcrYBd .image-shape .label,#mermaid-svg-uYFkAXSSjbwcrYBd .icon-shape .label{text-anchor:middle;}#mermaid-svg-uYFkAXSSjbwcrYBd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uYFkAXSSjbwcrYBd .rough-node .label,#mermaid-svg-uYFkAXSSjbwcrYBd .node .label,#mermaid-svg-uYFkAXSSjbwcrYBd .image-shape .label,#mermaid-svg-uYFkAXSSjbwcrYBd .icon-shape .label{text-align:center;}#mermaid-svg-uYFkAXSSjbwcrYBd .node.clickable{cursor:pointer;}#mermaid-svg-uYFkAXSSjbwcrYBd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uYFkAXSSjbwcrYBd .arrowheadPath{fill:#333333;}#mermaid-svg-uYFkAXSSjbwcrYBd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uYFkAXSSjbwcrYBd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uYFkAXSSjbwcrYBd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uYFkAXSSjbwcrYBd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uYFkAXSSjbwcrYBd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uYFkAXSSjbwcrYBd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster text{fill:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd .cluster span{color:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uYFkAXSSjbwcrYBd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uYFkAXSSjbwcrYBd rect.text{fill:none;stroke-width:0;}#mermaid-svg-uYFkAXSSjbwcrYBd .icon-shape,#mermaid-svg-uYFkAXSSjbwcrYBd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uYFkAXSSjbwcrYBd .icon-shape p,#mermaid-svg-uYFkAXSSjbwcrYBd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uYFkAXSSjbwcrYBd .icon-shape .label rect,#mermaid-svg-uYFkAXSSjbwcrYBd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uYFkAXSSjbwcrYBd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uYFkAXSSjbwcrYBd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uYFkAXSSjbwcrYBd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提供安全基座
提供合规验证
统一管理
统一管理
任务 6.1安全防护GB/Z 185.3 身份鉴别
任务 6.2合规检测GB/Z 185 全系列
任务 6.3生命周期管理GB/Z 185.3 生命周期

项目与前序项目的关系

复制代码
项目一:搭建智能体 → 体验协作 → 画架构图
项目二:身份码 → 注册中心 → 凭证验证
项目三:能力名片 → 发现服务 → 自动匹配
项目四:任务状态 → 流式交互 → 多轮对话 → 主从协作
项目五:工具服务 → 工具调用 → 综合实战
项目六:安全网关 → 合规检测 → 生命周期管理  ← 你在这里

项目定位:项目一至五解决了"智能体怎么建、怎么认、怎么找、怎么交互、怎么用工具"的问题。项目六解决"智能体怎么管安全、怎么查合规、怎么管生命周期"的运维治理问题------这是从"能用"到"好用"的关键一步。


任务 6.1 智能体安全防护------双向身份鉴别与访问控制

对应标准 :GB/Z 185.3---2026 身份鉴别通用流程、安全与合规要素

建议学时:4 学时

① 任务情境

校园智能体生态日益庞大,已有通知助手、生活助手、天气工具服务等多个智能体在线运行。信息化办公室决定:

所有智能体之间的通信必须经过安全网关------网关负责验证双方身份、检查访问权限、记录审计日志。未通过身份鉴别的请求一律拒绝。

你需要搭建这个安全网关,实现 GB/Z 185.3 规定的身份鉴别通用流程。

② 知识准备

一、GB/Z 185.3 身份鉴别通用流程

GB/Z 185.3 规定了身份鉴别的五个标准环节:
身份验证方 安全网关 请求智能体 身份验证方 安全网关 请求智能体 #mermaid-svg-Vj8ucTlLFBfA9xhH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Vj8ucTlLFBfA9xhH .error-icon{fill:#552222;}#mermaid-svg-Vj8ucTlLFBfA9xhH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Vj8ucTlLFBfA9xhH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Vj8ucTlLFBfA9xhH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Vj8ucTlLFBfA9xhH .marker.cross{stroke:#333333;}#mermaid-svg-Vj8ucTlLFBfA9xhH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Vj8ucTlLFBfA9xhH p{margin:0;}#mermaid-svg-Vj8ucTlLFBfA9xhH .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vj8ucTlLFBfA9xhH text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Vj8ucTlLFBfA9xhH .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-Vj8ucTlLFBfA9xhH .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-Vj8ucTlLFBfA9xhH #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-Vj8ucTlLFBfA9xhH .sequenceNumber{fill:white;}#mermaid-svg-Vj8ucTlLFBfA9xhH #sequencenumber{fill:#333;}#mermaid-svg-Vj8ucTlLFBfA9xhH #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-Vj8ucTlLFBfA9xhH .messageText{fill:#333;stroke:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vj8ucTlLFBfA9xhH .labelText,#mermaid-svg-Vj8ucTlLFBfA9xhH .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .loopText,#mermaid-svg-Vj8ucTlLFBfA9xhH .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-Vj8ucTlLFBfA9xhH .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-Vj8ucTlLFBfA9xhH .noteText,#mermaid-svg-Vj8ucTlLFBfA9xhH .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-Vj8ucTlLFBfA9xhH .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vj8ucTlLFBfA9xhH .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vj8ucTlLFBfA9xhH .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-Vj8ucTlLFBfA9xhH .actorPopupMenu{position:absolute;}#mermaid-svg-Vj8ucTlLFBfA9xhH .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-Vj8ucTlLFBfA9xhH .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-Vj8ucTlLFBfA9xhH .actor-man circle,#mermaid-svg-Vj8ucTlLFBfA9xhH line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-Vj8ucTlLFBfA9xhH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 服务请求(携带凭证)2. 凭证出示(动态生成过程凭证包)3. 凭证验证3a. 完整性/真实性验证3b. 时效性验证3c. 状态验证(是否锁定/注销)3d. 受众范围验证3e. 委托链验证4. 鉴别断言生成5. 服务授权与会话建立授权结果

环节 名称 核心动作 对应代码
1 服务请求 智能体发起请求,携带身份凭证 AgentRequest
2 凭证出示 动态生成过程凭证包(含 AID、时间戳、签名) generate_credential()
3 凭证验证 五项验证:完整性、时效性、状态、受众、委托链 verify_credential()
4 鉴别断言 生成验证结果断言 AuthAssertion
5 服务授权 基于角色和权限授权 check_access()
二、安全与合规七要素

GB/Z 185 全系列定义了标准智能体的七项安全合规要素:

要素 含义 本任务覆盖
系统构成证明 代码哈希、版本溯源、运行环境标识 ✓ 凭证中包含
行为边界声明 用途、权限边界、操作目标 ✓ 访问控制
委托授权 委托方-智能体关系绑定 ✓ 委托链验证
日志防篡改 操作日志防篡改技术措施 ✓ 审计日志
风险自适应 根据上下文动态调整凭证策略 ✓ 风险评级
身份鉴别 双向鉴别、过程凭证包 ✓ 核心实现
生命周期管理 注册、更新、锁定、注销 任务 6.3
三、访问控制模型

本项目采用基于角色的访问控制(RBAC)
#mermaid-svg-JIgACgTh47k0tiL5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JIgACgTh47k0tiL5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JIgACgTh47k0tiL5 .error-icon{fill:#552222;}#mermaid-svg-JIgACgTh47k0tiL5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JIgACgTh47k0tiL5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JIgACgTh47k0tiL5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JIgACgTh47k0tiL5 .marker.cross{stroke:#333333;}#mermaid-svg-JIgACgTh47k0tiL5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JIgACgTh47k0tiL5 p{margin:0;}#mermaid-svg-JIgACgTh47k0tiL5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JIgACgTh47k0tiL5 .cluster-label text{fill:#333;}#mermaid-svg-JIgACgTh47k0tiL5 .cluster-label span{color:#333;}#mermaid-svg-JIgACgTh47k0tiL5 .cluster-label span p{background-color:transparent;}#mermaid-svg-JIgACgTh47k0tiL5 .label text,#mermaid-svg-JIgACgTh47k0tiL5 span{fill:#333;color:#333;}#mermaid-svg-JIgACgTh47k0tiL5 .node rect,#mermaid-svg-JIgACgTh47k0tiL5 .node circle,#mermaid-svg-JIgACgTh47k0tiL5 .node ellipse,#mermaid-svg-JIgACgTh47k0tiL5 .node polygon,#mermaid-svg-JIgACgTh47k0tiL5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JIgACgTh47k0tiL5 .rough-node .label text,#mermaid-svg-JIgACgTh47k0tiL5 .node .label text,#mermaid-svg-JIgACgTh47k0tiL5 .image-shape .label,#mermaid-svg-JIgACgTh47k0tiL5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-JIgACgTh47k0tiL5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JIgACgTh47k0tiL5 .rough-node .label,#mermaid-svg-JIgACgTh47k0tiL5 .node .label,#mermaid-svg-JIgACgTh47k0tiL5 .image-shape .label,#mermaid-svg-JIgACgTh47k0tiL5 .icon-shape .label{text-align:center;}#mermaid-svg-JIgACgTh47k0tiL5 .node.clickable{cursor:pointer;}#mermaid-svg-JIgACgTh47k0tiL5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JIgACgTh47k0tiL5 .arrowheadPath{fill:#333333;}#mermaid-svg-JIgACgTh47k0tiL5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JIgACgTh47k0tiL5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JIgACgTh47k0tiL5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JIgACgTh47k0tiL5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JIgACgTh47k0tiL5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JIgACgTh47k0tiL5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JIgACgTh47k0tiL5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JIgACgTh47k0tiL5 .cluster text{fill:#333;}#mermaid-svg-JIgACgTh47k0tiL5 .cluster span{color:#333;}#mermaid-svg-JIgACgTh47k0tiL5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JIgACgTh47k0tiL5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JIgACgTh47k0tiL5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-JIgACgTh47k0tiL5 .icon-shape,#mermaid-svg-JIgACgTh47k0tiL5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JIgACgTh47k0tiL5 .icon-shape p,#mermaid-svg-JIgACgTh47k0tiL5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JIgACgTh47k0tiL5 .icon-shape .label rect,#mermaid-svg-JIgACgTh47k0tiL5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JIgACgTh47k0tiL5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JIgACgTh47k0tiL5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JIgACgTh47k0tiL5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 拥有
绑定
控制
角色体系
管理员全部权限
服务智能体调用工具+交互
工具服务被调用
访客只读
智能体
角色
权限
操作

③ 任务实施

步骤 1:准备项目目录
powershell 复制代码
cd d:\ioa-lab
.venv\Scripts\activate

mkdir project6
cd project6
步骤 2:编写安全网关

新建文件 security_gateway.py,实现身份鉴别、访问控制和审计日志:

python 复制代码
# security_gateway.py
# 智能体安全网关------双向身份鉴别与访问控制
# 对应标准:GB/Z 185.3---2026 身份鉴别通用流程

import hashlib
import hmac
import json
import time
from datetime import datetime

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel


app = FastAPI(
    title='智能体安全网关',
    description='对应标准:GB/Z 185.3---2026 身份鉴别',
    version='1.0.0',
)
app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_methods=['*'],
    allow_headers=['*'],
)


# ============================================================
#  一、已注册智能体目录(模拟身份账户数据库)
#  对应 GB/Z 185.3 身份账户管理
# ============================================================

# 共享密钥(实际场景应使用非对称加密)
SECRET_KEYS = {
    # AID → 密钥(模拟凭证发行方分配的密钥)
    '1.2.156.3088.1.SCH001.TEAM01.A00001.I00001': 'notify_secret_key_2026',
    '1.2.156.3088.1.SCH001.TEAM01.A00002.I00001': 'life_secret_key_2026',
    '1.2.156.3088.1.SCH001.TEAM01.A00003.I00001': 'weather_secret_key_2026',
}

# 智能体信息注册表
AGENT_REGISTRY = {
    '1.2.156.3088.1.SCH001.TEAM01.A00001.I00001': {
        'name': '社团通知助手',
        'role': 'service_agent',
        'status': 'active',        # active / locked / deregistered
        'permissions': ['send_message', 'create_task'],
        'registered_at': '2026-07-01',
        'expires_at': '2027-07-01',
    },
    '1.2.156.3088.1.SCH001.TEAM01.A00002.I00001': {
        'name': '校园生活助手',
        'role': 'service_agent',
        'status': 'active',
        'permissions': ['send_message', 'create_task', 'call_tool', 'discover_agent'],
        'registered_at': '2026-07-01',
        'expires_at': '2027-07-01',
    },
    '1.2.156.3088.1.SCH001.TEAM01.A00003.I00001': {
        'name': '天气工具服务',
        'role': 'tool_service',
        'status': 'active',
        'permissions': ['be_called'],
        'registered_at': '2026-07-15',
        'expires_at': '2027-07-15',
    },
}

# 角色权限映射
ROLE_PERMISSIONS = {
    'admin': ['*'],  # 全部权限
    'service_agent': ['send_message', 'create_task', 'discover_agent'],
    'tool_service': ['be_called'],
    'guest': ['read_only'],
}


# ============================================================
#  二、凭证管理(对应 GB/Z 185.3 凭证管理)
# ============================================================

class CredentialManager:
    """凭证管理器------生成和验证过程凭证包。

    对应 GB/Z 185.3 第 6 章:凭证发行、更新、验证。
    过程凭证包包含:AID、时间戳、随机数、HMAC 签名。
    """

    @staticmethod
    def generate_credential(aid: str, secret_key: str) -> dict:
        """生成过程凭证包。

        对应 GB/Z 185.3 第 6.4 条:动态过程凭证生成。
        """
        timestamp = int(time.time())
        nonce = hashlib.sha256(f'{aid}{timestamp}{time.time()}'.encode()).hexdigest()[:16]

        # 构造待签名内容
        payload = f'{aid}|{timestamp}|{nonce}'
        signature = hmac.new(
            secret_key.encode('utf-8'),
            payload.encode('utf-8'),
            hashlib.sha256,
        ).hexdigest()

        return {
            'aid': aid,
            'timestamp': timestamp,
            'nonce': nonce,
            'signature': signature,
        }

    @staticmethod
    def verify_credential(credential: dict) -> tuple[bool, str]:
        """验证过程凭证包。

        对应 GB/Z 185.3 第 7 章:身份鉴别通用流程。
        五项验证:完整性/真实性、时效性、状态、受众范围、委托链。
        """
        aid = credential.get('aid', '')
        timestamp = credential.get('timestamp', 0)
        nonce = credential.get('nonce', '')
        signature = credential.get('signature', '')

        # === 验证 1:完整性/真实性 ===
        secret_key = SECRET_KEYS.get(aid)
        if not secret_key:
            return False, f'完整性验证失败:未知 AID {aid}'

        payload = f'{aid}|{timestamp}|{nonce}'
        expected_sig = hmac.new(
            secret_key.encode('utf-8'),
            payload.encode('utf-8'),
            hashlib.sha256,
        ).hexdigest()

        if not hmac.compare_digest(signature, expected_sig):
            return False, '完整性验证失败:签名不匹配'

        # === 验证 2:时效性 ===
        current_time = int(time.time())
        if current_time - timestamp > 300:  # 5 分钟有效期
            return False, f'时效性验证失败:凭证已过期({current_time - timestamp}秒)'

        if timestamp > current_time + 60:  # 不允许未来时间戳
            return False, '时效性验证失败:凭证时间戳异常'

        # === 验证 3:状态验证 ===
        agent_info = AGENT_REGISTRY.get(aid)
        if not agent_info:
            return False, f'状态验证失败:AID 未注册 {aid}'

        if agent_info['status'] == 'locked':
            return False, f'状态验证失败:智能体已锁定 {agent_info["name"]}'

        if agent_info['status'] == 'deregistered':
            return False, f'状态验证失败:智能体已注销 {agent_info["name"]}'

        # 凭证有效期检查
        expires_at = datetime.strptime(agent_info['expires_at'], '%Y-%m-%d')
        if datetime.now() > expires_at:
            return False, f'状态验证失败:凭证已过期(到期日 {agent_info["expires_at"]})'

        # === 验证 4:受众范围 ===
        # (本任务简化:所有已注册智能体均在可接受范围内)

        # === 验证 5:委托链 ===
        # (本任务简化:单层委托,无多层链式验证)

        return True, f'验证通过:{agent_info["name"]}'


# ============================================================
#  三、访问控制(对应 GB/Z 185.3 安全与合规要素)
# ============================================================

class AccessController:
    """访问控制器------基于角色的权限检查。

    对应 GB/Z 185.3 行为边界声明:用途、权限边界、操作目标。
    """

    @staticmethod
    def check_access(aid: str, required_permission: str) -> tuple[bool, str]:
        """检查智能体是否拥有指定权限。"""
        agent_info = AGENT_REGISTRY.get(aid)
        if not agent_info:
            return False, f'未注册智能体:{aid}'

        role = agent_info.get('role', 'guest')
        agent_permissions = agent_info.get('permissions', [])
        role_permissions = ROLE_PERMISSIONS.get(role, [])

        # 管理员拥有全部权限
        if '*' in role_permissions:
            return True, f'管理员权限通过'

        # 检查权限
        all_permissions = set(agent_permissions) | set(role_permissions)
        if required_permission in all_permissions:
            return True, f'权限验证通过:{required_permission}'
        else:
            return False, f'权限不足:需要 {required_permission},当前拥有 {all_permissions}'

    @staticmethod
    def assess_risk(aid: str, target: str, action: str) -> str:
        """风险评估------对应 GB/Z 185.3 风险自适应。

        返回风险等级:low / medium / high
        """
        agent_info = AGENT_REGISTRY.get(aid, {})
        agent_name = agent_info.get('name', '未知')

        # 简化风险评估规则
        risk_score = 0

        # 高风险操作
        if action in ('delete', 'deregister', 'lock'):
            risk_score += 3
        elif action in ('write', 'update', 'send_message'):
            risk_score += 2
        else:
            risk_score += 1

        # 跨域访问
        if target and target not in agent_name:
            risk_score += 1

        if risk_score >= 4:
            return 'high'
        elif risk_score >= 2:
            return 'medium'
        else:
            return 'low'


# ============================================================
#  四、审计日志(对应 GB/Z 185.3 日志防篡改)
# ============================================================

class AuditLogger:
    """审计日志器------防篡改操作日志。

    对应 GB/Z 185.3 日志防篡改:使用链式哈希确保日志完整性。
    每条日志包含前一条日志的哈希,形成哈希链。
    """

    def __init__(self):
        self.logs: list[dict] = []
        self._chain_hash = 'GENESIS'  # 创世哈希

    def log(self, aid: str, action: str, result: str, detail: str = '') -> None:
        """记录审计日志。"""
        entry = {
            'timestamp': datetime.now().isoformat(),
            'aid': aid,
            'action': action,
            'result': result,
            'detail': detail,
            'prev_hash': self._chain_hash,
        }
        # 计算当前条目的哈希(含前一条哈希,形成链式结构)
        entry_str = json.dumps(entry, sort_keys=True, ensure_ascii=False)
        entry['hash'] = hashlib.sha256(entry_str.encode()).hexdigest()
        self._chain_hash = entry['hash']
        self.logs.append(entry)

    def verify_integrity(self) -> tuple[bool, str]:
        """验证日志链完整性(防篡改检测)。"""
        prev_hash = 'GENESIS'
        for i, entry in enumerate(self.logs):
            if entry['prev_hash'] != prev_hash:
                return False, f'第 {i} 条日志链断裂:前驱哈希不匹配'
            # 重新计算哈希
            verify_entry = {k: v for k, v in entry.items() if k != 'hash'}
            entry_str = json.dumps(verify_entry, sort_keys=True, ensure_ascii=False)
            expected_hash = hashlib.sha256(entry_str.encode()).hexdigest()
            if entry['hash'] != expected_hash:
                return False, f'第 {i} 条日志被篡改:哈希不匹配'
            prev_hash = entry['hash']
        return True, f'日志链完整({len(self.logs)} 条记录)'

    def get_recent(self, count: int = 10) -> list[dict]:
        """获取最近的日志记录。"""
        return self.logs[-count:]


# 全局审计日志器实例
audit_logger = AuditLogger()


# ============================================================
#  五、API 接口
# ============================================================

class AgentRequest(BaseModel):
    """智能体请求模型。"""
    aid: str                        # 请求方身份码
    credential: dict                # 过程凭证包
    action: str                     # 请求的操作
    target: str = ''                # 目标资源/智能体
    payload: dict = {}              # 请求载荷


@app.get('/')
async def root():
    """网关信息。"""
    return {
        'name': '智能体安全网关',
        'standard': 'GB/Z 185.3---2026',
        'registered_agents': len(AGENT_REGISTRY),
        'audit_logs': len(audit_logger.logs),
    }


@app.post('/auth/verify')
async def verify_identity(req: AgentRequest):
    """接口 1:身份鉴别。

    对应 GB/Z 185.3 第 7 章身份鉴别通用流程。
    """
    # 步骤 1-3:凭证验证(五项验证)
    valid, message = CredentialManager.verify_credential(req.credential)
    if not valid:
        audit_logger.log(req.aid, 'auth_verify', 'denied', message)
        raise HTTPException(status_code=401, detail=message)

    # 步骤 4:生成鉴别断言
    assertion = {
        'aid': req.aid,
        'verified': True,
        'agent_name': AGENT_REGISTRY[req.aid]['name'],
        'role': AGENT_REGISTRY[req.aid]['role'],
        'verified_at': datetime.now().isoformat(),
        'message': message,
    }

    audit_logger.log(req.aid, 'auth_verify', 'granted', message)
    return {'assertion': assertion}


@app.post('/auth/access')
async def check_access(req: AgentRequest):
    """接口 2:访问控制。

    对应 GB/Z 185.3 行为边界声明 + 风险自适应。
    """
    # 先验证身份
    valid, auth_msg = CredentialManager.verify_credential(req.credential)
    if not valid:
        audit_logger.log(req.aid, 'access_check', 'denied', f'身份验证失败:{auth_msg}')
        raise HTTPException(status_code=401, detail=auth_msg)

    # 检查权限
    has_perm, perm_msg = AccessController.check_access(req.aid, req.action)
    # 风险评估
    risk_level = AccessController.assess_risk(req.aid, req.target, req.action)

    result = 'granted' if has_perm else 'denied'
    audit_logger.log(
        req.aid, f'access:{req.action}', result,
        f'{perm_msg} | 风险等级:{risk_level}',
    )

    return {
        'access_granted': has_perm,
        'message': perm_msg,
        'risk_level': risk_level,
        'action': req.action,
        'target': req.target,
    }


@app.get('/audit/logs')
async def get_audit_logs(count: int = 20):
    """接口 3:查询审计日志。"""
    return {
        'total': len(audit_logger.logs),
        'logs': audit_logger.get_recent(count),
    }


@app.get('/audit/verify')
async def verify_audit_integrity():
    """接口 4:验证审计日志完整性(防篡改检测)。"""
    valid, message = audit_logger.verify_integrity()
    return {
        'integrity_valid': valid,
        'message': message,
        'total_logs': len(audit_logger.logs),
    }


@app.get('/agents')
async def list_agents():
    """接口 5:列出已注册智能体。"""
    return {
        'count': len(AGENT_REGISTRY),
        'agents': [
            {'aid': aid, **info}
            for aid, info in AGENT_REGISTRY.items()
        ],
    }


# ============================================================
#  六、辅助工具:生成测试凭证
# ============================================================

@app.post('/auth/test-credential')
async def generate_test_credential(aid: str):
    """生成测试用凭证(仅教学使用,生产环境不开放)。"""
    secret_key = SECRET_KEYS.get(aid)
    if not secret_key:
        raise HTTPException(status_code=404, detail=f'未知 AID:{aid}')

    credential = CredentialManager.generate_credential(aid, secret_key)
    return {'aid': aid, 'credential': credential}


# ============================================================
#  入口
# ============================================================

if __name__ == '__main__':
    import uvicorn
    print('=' * 60)
    print('智能体安全网关')
    print('对应标准:GB/Z 185.3---2026 身份鉴别')
    print('服务地址:http://127.0.0.1:8002')
    print('API 文档:http://127.0.0.1:8002/docs')
    print(f'已注册智能体:{len(AGENT_REGISTRY)} 个')
    for aid, info in AGENT_REGISTRY.items():
        print(f'  · {info["name"]}({aid[-14:]})角色:{info["role"]} 状态:{info["status"]}')
    print('=' * 60)
    uvicorn.run(app, host='127.0.0.1', port=8002)
步骤 3:启动安全网关
powershell 复制代码
python security_gateway.py

预期输出:

复制代码
============================================================
智能体安全网关
对应标准:GB/Z 185.3---2026 身份鉴别
服务地址:http://127.0.0.1:8002
API 文档:http://127.0.0.1:8002/docs
已注册智能体:3 个
  · 社团通知助手(.A00001.I00001)角色:service_agent 状态:active
  · 校园生活助手(.A00002.I00001)角色:service_agent 状态:active
  · 天气工具服务(.A00003.I00001)角色:tool_service 状态:active
============================================================
INFO:     Uvicorn running on http://127.0.0.1:8002 (Press CTRL+C to quit)
步骤 4:测试身份鉴别

新开窗口,先生成测试凭证,再验证身份:

测试 1:生成凭证

powershell 复制代码
curl -X POST "http://127.0.0.1:8002/auth/test-credential?aid=1.2.156.3088.1.SCH001.TEAM01.A00001.I00001"

应返回包含 aidtimestampnoncesignature 的凭证包。

测试 2:验证身份

测试 1 返回的 credential 中的 timestampnoncesignature 三个值原样替换进下面的请求。请务必使用测试 1 实际返回的值------下方仅为示例占位,若直接原样提交会因签名与时间戳不符而返回 401:

powershell 复制代码
curl -X POST http://127.0.0.1:8002/auth/verify -H "Content-Type: application/json" -d "{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00001.I00001\",\"credential\":{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00001.I00001\",\"timestamp\":1754025600,\"nonce\":\"abc123def456\",\"signature\":\"your_signature_here\"},\"action\":\"send_message\",\"target\":\"通知助手\"}"

应返回 assertion.verified: true

测试 3:访问控制

powershell 复制代码
curl -X POST http://127.0.0.1:8002/auth/access -H "Content-Type: application/json" -d "{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00001.I00001\",\"credential\":{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00001.I00001\",\"timestamp\":TIMESTAMP,\"nonce\":\"NONCE\",\"signature\":\"SIG\"},\"action\":\"call_tool\",\"target\":\"天气服务\"}"

社团通知助手没有 call_tool 权限,应返回 access_granted: false

测试 4:查看审计日志

powershell 复制代码
curl http://127.0.0.1:8002/audit/logs

应返回所有操作日志记录。

测试 5:验证日志完整性

powershell 复制代码
curl http://127.0.0.1:8002/audit/verify

应返回 integrity_valid: true

验证要点

  • 身份鉴别:凭证验证五项检查全部通过
  • 访问控制:权限不足的请求被正确拒绝
  • 审计日志:链式哈希防篡改机制有效
  • 风险评估:不同操作产生不同风险等级

④ 任务评价

评价维度 优秀(9-10分) 良好(7-8分) 合格(6分) 需改进(<6分)
身份鉴别 五项验证全部实现 实现 3-4 项验证 实现 2 项验证 仅密码校验
访问控制 RBAC + 风险评估 RBAC 权限检查 简单权限检查 无访问控制
审计日志 链式哈希防篡改 + 完整性验证 有日志记录 基本日志 无日志
标准对照 能对应 GB/Z 185.3 全部环节 能对应主要环节 能说出流程名 无法对应

任务 6.2 智能体合规检测------标准符合性自动化检测

对应标准 :GB/Z 185 全系列合规要素

建议学时:4 学时

① 任务情境

学校信息化办公室出台了《校园智能体合规管理办法》,要求所有上线智能体必须通过合规检测------

检查智能体的身份码格式是否符合 GB/Z 185.2?描述信息是否包含 GB/Z 185.4 规定的 14 项属性?工具描述是否包含 GB/Z 185.7 规定的 6 项属性?交互能力是否符合 GB/Z 185.6?

你需要编写一个自动化合规检测工具,对智能体进行全面体检,生成合规报告。

② 知识准备

一、GB/Z 185 全系列合规要素清单

#mermaid-svg-lRltgIz4lGY72vD3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lRltgIz4lGY72vD3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lRltgIz4lGY72vD3 .error-icon{fill:#552222;}#mermaid-svg-lRltgIz4lGY72vD3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lRltgIz4lGY72vD3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lRltgIz4lGY72vD3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lRltgIz4lGY72vD3 .marker.cross{stroke:#333333;}#mermaid-svg-lRltgIz4lGY72vD3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lRltgIz4lGY72vD3 p{margin:0;}#mermaid-svg-lRltgIz4lGY72vD3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lRltgIz4lGY72vD3 .cluster-label text{fill:#333;}#mermaid-svg-lRltgIz4lGY72vD3 .cluster-label span{color:#333;}#mermaid-svg-lRltgIz4lGY72vD3 .cluster-label span p{background-color:transparent;}#mermaid-svg-lRltgIz4lGY72vD3 .label text,#mermaid-svg-lRltgIz4lGY72vD3 span{fill:#333;color:#333;}#mermaid-svg-lRltgIz4lGY72vD3 .node rect,#mermaid-svg-lRltgIz4lGY72vD3 .node circle,#mermaid-svg-lRltgIz4lGY72vD3 .node ellipse,#mermaid-svg-lRltgIz4lGY72vD3 .node polygon,#mermaid-svg-lRltgIz4lGY72vD3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lRltgIz4lGY72vD3 .rough-node .label text,#mermaid-svg-lRltgIz4lGY72vD3 .node .label text,#mermaid-svg-lRltgIz4lGY72vD3 .image-shape .label,#mermaid-svg-lRltgIz4lGY72vD3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-lRltgIz4lGY72vD3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lRltgIz4lGY72vD3 .rough-node .label,#mermaid-svg-lRltgIz4lGY72vD3 .node .label,#mermaid-svg-lRltgIz4lGY72vD3 .image-shape .label,#mermaid-svg-lRltgIz4lGY72vD3 .icon-shape .label{text-align:center;}#mermaid-svg-lRltgIz4lGY72vD3 .node.clickable{cursor:pointer;}#mermaid-svg-lRltgIz4lGY72vD3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lRltgIz4lGY72vD3 .arrowheadPath{fill:#333333;}#mermaid-svg-lRltgIz4lGY72vD3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lRltgIz4lGY72vD3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lRltgIz4lGY72vD3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lRltgIz4lGY72vD3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lRltgIz4lGY72vD3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lRltgIz4lGY72vD3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lRltgIz4lGY72vD3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lRltgIz4lGY72vD3 .cluster text{fill:#333;}#mermaid-svg-lRltgIz4lGY72vD3 .cluster span{color:#333;}#mermaid-svg-lRltgIz4lGY72vD3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lRltgIz4lGY72vD3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lRltgIz4lGY72vD3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-lRltgIz4lGY72vD3 .icon-shape,#mermaid-svg-lRltgIz4lGY72vD3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lRltgIz4lGY72vD3 .icon-shape p,#mermaid-svg-lRltgIz4lGY72vD3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lRltgIz4lGY72vD3 .icon-shape .label rect,#mermaid-svg-lRltgIz4lGY72vD3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lRltgIz4lGY72vD3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lRltgIz4lGY72vD3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lRltgIz4lGY72vD3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} GB/Z 185 合规检测
维度1: 身份码GB/Z 185.2
维度2: 身份管理GB/Z 185.3
维度3: 智能体描述GB/Z 185.4
维度4: 智能体发现GB/Z 185.5
维度5: 智能体交互GB/Z 185.6
维度6: 工具调用GB/Z 185.7
OID前缀/版本/序列号格式
身份状态/凭证有效期/角色权限
14项描述属性/8项技能属性
发现方式/可发现性配置
交互模式/任务状态/协作方式
6项工具属性/工具调用流程

二、合规检测流程
步骤 检测内容 标准 判定规则
1 身份码格式 185.2 OID 前缀、版本号、序列号格式正确
2 身份状态 185.3 状态为 active,凭证未过期
3 描述完整性 185.4 14 项属性全部填写
4 技能描述 185.4 每个技能含 8 项属性
5 发现配置 185.5 有访问地址、可被发现
6 交互能力 185.6 支持点对点模式、任务状态管理
7 工具描述 185.7 每个工具含 6 项属性

③ 任务实施

步骤 1:编写合规检测工具

新建文件 compliance_checker.py

python 复制代码
# compliance_checker.py
# 智能体合规检测工具------标准符合性自动化检测
# 对应标准:GB/Z 185 全系列合规要素

import re
from datetime import datetime
from dataclasses import dataclass, field


# ============================================================
#  一、检测数据模型
# ============================================================

@dataclass
class CheckResult:
    """单项检测结果。"""
    dimension: str          # 检测维度
    item: str              # 检测项
    standard: str          # 对应标准
    passed: bool           # 是否通过
    detail: str = ''       # 详情
    severity: str = 'error'  # error / warning / info


@dataclass
class ComplianceReport:
    """合规检测报告。"""
    agent_name: str
    agent_aid: str
    check_time: str = field(default_factory=lambda: datetime.now().isoformat())
    results: list[CheckResult] = field(default_factory=list)
    summary: dict = field(default_factory=dict)

    def add_result(self, result: CheckResult) -> None:
        self.results.append(result)

    def generate_summary(self) -> dict:
        """生成检测摘要。"""
        total = len(self.results)
        passed = sum(1 for r in self.results if r.passed)
        failed = total - passed
        errors = sum(1 for r in self.results if not r.passed and r.severity == 'error')
        warnings = sum(1 for r in self.results if not r.passed and r.severity == 'warning')

        self.summary = {
            'total_checks': total,
            'passed': passed,
            'failed': failed,
            'errors': errors,
            'warnings': warnings,
            'compliance_rate': f'{passed / total * 100:.1f}%' if total > 0 else '0%',
            'overall_result': '不合规' if errors > 0 else ('部分合规' if warnings > 0 else '合规'),
        }
        return self.summary

    def to_dict(self) -> dict:
        """转为字典。"""
        return {
            'agent_name': self.agent_name,
            'agent_aid': self.agent_aid,
            'check_time': self.check_time,
            'summary': self.generate_summary(),
            'results': [
                {
                    'dimension': r.dimension,
                    'item': r.item,
                    'standard': r.standard,
                    'passed': r.passed,
                    'detail': r.detail,
                    'severity': r.severity,
                }
                for r in self.results
            ],
        }


# ============================================================
#  二、合规检测器
# ============================================================

class ComplianceChecker:
    """智能体合规检测器。

    对应 GB/Z 185 全系列标准,执行七大维度合规检测。
    """

    # GB/Z 185.2 OID 固定前缀
    OID_PREFIX = '1.2.156.3088'

    # GB/Z 185.4 智能体描述 14 项属性
    REQUIRED_DESC_FIELDS = [
        'agentId', 'name', 'alias', 'version',
        'description', 'iconAddress', 'provider',
        'accessAddress', 'accessMethod', 'servingArea', 'authentication',
        'capabilities', 'defaultInputTypes', 'defaultOutputTypes',
    ]

    # GB/Z 185.4 技能 8 项属性
    REQUIRED_SKILL_FIELDS = [
        'skillId', 'skillName', 'skillDescription',
        'tags', 'examples', 'inputTypes', 'outputTypes', 'dependencies',
    ]

    # GB/Z 185.7 工具 6 项属性
    REQUIRED_TOOL_FIELDS = [
        'toolId', 'toolName', 'toolDescription',
        'toolVersion', 'toolInputParam', 'toolOutputParam',
    ]

    def check_all(self, agent: dict) -> ComplianceReport:
        """执行全部合规检测。"""
        report = ComplianceReport(
            agent_name=agent.get('name', '未知'),
            agent_aid=agent.get('agentId', '未知'),
        )

        # 维度 1-6 依次检测
        self._check_identity_code(agent, report)
        self._check_identity_status(agent, report)
        self._check_description(agent, report)
        self._check_skills(agent, report)
        self._check_discovery(agent, report)
        self._check_interaction(agent, report)
        self._check_tools(agent, report)

        return report

    # ============================================================
    #  维度 1:身份码格式(GB/Z 185.2)
    # ============================================================

    def _check_identity_code(self, agent: dict, report: ComplianceReport) -> None:
        """检查身份码格式。"""
        aid = agent.get('agentId', '')

        # 检查 1:OID 前缀
        passed = aid.startswith(self.OID_PREFIX)
        report.add_result(CheckResult(
            dimension='身份码', item='OID 前缀', standard='GB/Z 185.2',
            passed=passed,
            detail=f'AID={aid[:30]}...' if aid else 'AID 为空',
            severity='error',
        ))

        # 检查 2:字段数量(至少 9 段:前缀4 + 版本1 + 服务方1 + 请求方1 + 本体1 + 实例1)
        parts = aid.split('.')
        passed = len(parts) >= 9
        report.add_result(CheckResult(
            dimension='身份码', item='字段完整性', standard='GB/Z 185.2',
            passed=passed,
            detail=f'字段数={len(parts)}(要求≥9)',
            severity='error',
        ))

        # 检查 3:版本号格式(1 位 1~Z)
        if len(parts) >= 5:
            version = parts[4]
            passed = bool(re.match(r'^[1-Z]$', version))
            report.add_result(CheckResult(
                dimension='身份码', item='版本号格式', standard='GB/Z 185.2',
                passed=passed,
                detail=f'版本号={version}(要求 1 位 1~Z)',
                severity='error',
            ))

        # 检查 4:序列号格式(大写字母+数字)
        if len(parts) >= 9:
            body_serial = parts[7]
            instance_serial = parts[8]
            passed = bool(re.match(r'^[A-Z0-9]+$', body_serial)) and \
                     bool(re.match(r'^[A-Z0-9]+$', instance_serial))
            report.add_result(CheckResult(
                dimension='身份码', item='序列号格式', standard='GB/Z 185.2',
                passed=passed,
                detail=f'本体={body_serial} 实例={instance_serial}',
                severity='error',
            ))

    # ============================================================
    #  维度 2:身份状态(GB/Z 185.3)
    # ============================================================

    def _check_identity_status(self, agent: dict, report: ComplianceReport) -> None:
        """检查身份管理状态。"""
        status = agent.get('status', 'unknown')

        # 检查 1:身份状态
        valid_statuses = ['active', 'locked', 'deregistered']
        passed = status in valid_statuses
        report.add_result(CheckResult(
            dimension='身份管理', item='身份状态', standard='GB/Z 185.3',
            passed=passed,
            detail=f'状态={status}(有效值:{valid_statuses})',
            severity='error',
        ))

        # 检查 2:身份状态为 active
        passed = status == 'active'
        report.add_result(CheckResult(
            dimension='身份管理', item='活跃状态', standard='GB/Z 185.3',
            passed=passed,
            detail=f'当前状态={status}' + ('' if passed else '(非活跃状态无法正常服务)'),
            severity='warning' if status != 'active' else 'error',
        ))

        # 检查 3:凭证有效期
        expires_at = agent.get('expiresAt', '')
        if expires_at:
            try:
                exp_date = datetime.strptime(expires_at, '%Y-%m-%d')
                passed = exp_date > datetime.now()
                report.add_result(CheckResult(
                    dimension='身份管理', item='凭证有效期', standard='GB/Z 185.3',
                    passed=passed,
                    detail=f'到期日={expires_at}' + ('' if passed else '(已过期)'),
                    severity='error',
                ))
            except ValueError:
                report.add_result(CheckResult(
                    dimension='身份管理', item='凭证有效期', standard='GB/Z 185.3',
                    passed=False,
                    detail=f'日期格式错误:{expires_at}',
                    severity='error',
                ))
        else:
            report.add_result(CheckResult(
                dimension='身份管理', item='凭证有效期', standard='GB/Z 185.3',
                passed=False,
                detail='未设置凭证有效期',
                severity='warning',
            ))

        # 检查 4:角色权限
        role = agent.get('role', '')
        passed = bool(role)
        report.add_result(CheckResult(
            dimension='身份管理', item='角色权限', standard='GB/Z 185.3',
            passed=passed,
            detail=f'角色={role}' if role else '未设置角色',
            severity='error',
        ))

    # ============================================================
    #  维度 3:智能体描述(GB/Z 185.4)
    # ============================================================

    def _check_description(self, agent: dict, report: ComplianceReport) -> None:
        """检查智能体描述完整性。"""
        missing = []
        for field_name in self.REQUIRED_DESC_FIELDS:
            if field_name not in agent or not agent[field_name]:
                missing.append(field_name)

        passed = len(missing) == 0
        report.add_result(CheckResult(
            dimension='智能体描述', item='14项属性完整性', standard='GB/Z 185.4',
            passed=passed,
            detail=f'缺失 {len(missing)} 项:{", ".join(missing)}' if missing else '14 项属性全部填写',
            severity='error' if len(missing) > 3 else 'warning',
        ))

        # 检查版本号格式
        version = agent.get('version', '')
        passed = bool(re.match(r'^\d+\.\d+\.\d+', str(version)))
        report.add_result(CheckResult(
            dimension='智能体描述', item='版本号格式', standard='GB/Z 185.4',
            passed=passed,
            detail=f'版本={version}(要求 X.Y.Z 格式)',
            severity='warning',
        ))

    # ============================================================
    #  维度 4:技能描述(GB/Z 185.4)
    # ============================================================

    def _check_skills(self, agent: dict, report: ComplianceReport) -> None:
        """检查技能描述。"""
        skills = agent.get('skills', [])
        if not skills:
            report.add_result(CheckResult(
                dimension='技能描述', item='技能列表', standard='GB/Z 185.4',
                passed=False,
                detail='未声明任何技能',
                severity='warning',
            ))
            return

        for i, skill in enumerate(skills):
            missing = [
                f for f in self.REQUIRED_SKILL_FIELDS
                if f not in skill or skill[f] is None
            ]
            passed = len(missing) == 0
            skill_name = skill.get('skillName', f'技能{i+1}')
            report.add_result(CheckResult(
                dimension='技能描述', item=f'技能「{skill_name}」8项属性', standard='GB/Z 185.4',
                passed=passed,
                detail=f'缺失 {len(missing)} 项:{", ".join(missing)}' if missing else '8 项属性完整',
                severity='error' if len(missing) > 2 else 'warning',
            ))

    # ============================================================
    #  维度 5:发现配置(GB/Z 185.5)
    # ============================================================

    def _check_discovery(self, agent: dict, report: ComplianceReport) -> None:
        """检查发现配置。"""
        access_address = agent.get('accessAddress', '')
        passed = bool(access_address) and (
            access_address.startswith('http://') or
            access_address.startswith('https://')
        )
        report.add_result(CheckResult(
            dimension='智能体发现', item='访问地址', standard='GB/Z 185.5',
            passed=passed,
            detail=f'地址={access_address}' if access_address else '未设置访问地址',
            severity='error',
        ))

        access_method = agent.get('accessMethod', '')
        passed = bool(access_method)
        report.add_result(CheckResult(
            dimension='智能体发现', item='访问方法', standard='GB/Z 185.5',
            passed=passed,
            detail=f'方法={access_method}' if access_method else '未设置访问方法',
            severity='warning',
        ))

        # 可发现性配置
        discoverable = agent.get('discoverable', True)
        report.add_result(CheckResult(
            dimension='智能体发现', item='可发现性', standard='GB/Z 185.5',
            passed=True,
            detail=f'可发现={discoverable}',
            severity='info',
        ))

    # ============================================================
    #  维度 6:交互能力(GB/Z 185.6)
    # ============================================================

    def _check_interaction(self, agent: dict, report: ComplianceReport) -> None:
        """检查交互能力。"""
        capabilities = agent.get('capabilities', {})
        if isinstance(capabilities, dict):
            # 检查点对点模式支持(必须支持)
            streaming = capabilities.get('streaming', False)
            push_notifications = capabilities.get('pushNotifications', False)
            state_transition = capabilities.get('stateTransition', False)

            report.add_result(CheckResult(
                dimension='智能体交互', item='点对点模式', standard='GB/Z 185.6',
                passed=True,
                detail='点对点模式为必须支持项(已默认支持)',
                severity='info',
            ))

            report.add_result(CheckResult(
                dimension='智能体交互', item='流式交互', standard='GB/Z 185.6',
                passed=streaming,
                detail=f'streaming={streaming}',
                severity='warning' if not streaming else 'info',
            ))

            report.add_result(CheckResult(
                dimension='智能体交互', item='任务状态管理', standard='GB/Z 185.6',
                passed=state_transition,
                detail=f'stateTransition={state_transition}',
                severity='warning' if not state_transition else 'info',
            ))
        else:
            report.add_result(CheckResult(
                dimension='智能体交互', item='能力声明', standard='GB/Z 185.6',
                passed=False,
                detail='capabilities 字段格式不正确',
                severity='error',
            ))

    # ============================================================
    #  维度 7:工具调用(GB/Z 185.7)
    # ============================================================

    def _check_tools(self, agent: dict, report: ComplianceReport) -> None:
        """检查工具描述。"""
        tools = agent.get('tools', [])
        if not tools:
            # 工具是可选的,不是所有智能体都有工具
            report.add_result(CheckResult(
                dimension='工具调用', item='工具列表', standard='GB/Z 185.7',
                passed=True,
                detail='该智能体未声明工具(工具为可选)',
                severity='info',
            ))
            return

        for i, tool in enumerate(tools):
            missing = [
                f for f in self.REQUIRED_TOOL_FIELDS
                if f not in tool or tool[f] is None
            ]
            passed = len(missing) == 0
            tool_name = tool.get('toolName', f'工具{i+1}')
            report.add_result(CheckResult(
                dimension='工具调用', item=f'工具「{tool_name}」6项属性', standard='GB/Z 185.7',
                passed=passed,
                detail=f'缺失 {len(missing)} 项:{", ".join(missing)}' if missing else '6 项属性完整',
                severity='error' if len(missing) > 1 else 'warning',
            ))


# ============================================================
#  三、报告输出
# ============================================================

def print_report(report: ComplianceReport) -> None:
    """打印合规检测报告。"""
    report_dict = report.to_dict()
    summary = report_dict['summary']

    print('=' * 60)
    print('智能体合规检测报告')
    print(f'对应标准:GB/Z 185 全系列')
    print(f'检测时间:{report_dict["check_time"]}')
    print(f'智能体名称:{report_dict["agent_name"]}')
    print(f'身份码:{report_dict["agent_aid"]}')
    print('=' * 60)

    print(f'\n【检测摘要】')
    print(f'  检测项总数:{summary["total_checks"]}')
    print(f'  通过:{summary["passed"]}  失败:{summary["failed"]}')
    print(f'  错误:{summary["errors"]}  警告:{summary["warnings"]}')
    print(f'  合规率:{summary["compliance_rate"]}')
    print(f'  总体结论:{summary["overall_result"]}')

    print(f'\n【详细结果】')
    current_dim = ''
    for r in report_dict['results']:
        if r['dimension'] != current_dim:
            current_dim = r['dimension']
            print(f'\n  ── {current_dim} ──')

        status = '通过' if r['passed'] else ('警告' if r['severity'] == 'warning' else '失败')
        print(f'  {status} {r["item"]}')
        if r['detail']:
            print(f'     └ {r["detail"]}')

    print(f'\n{"=" * 60}')


# ============================================================
#  四、测试用例与主程序
# ============================================================

# 测试智能体 A:合规智能体(全部通过)
COMPLIANT_AGENT = {
    'agentId': '1.2.156.3088.1.SCH001.TEAM01.A00002.I00001',
    'name': '校园生活助手',
    'alias': '校园助手',
    'version': '1.0.0',
    'description': '帮助师生查询空教室、校历和发送通知',
    'iconAddress': 'https://school.edu.cn/icon/life.png',
    'provider': 'SCH001信息化办公室',
    'accessAddress': 'http://127.0.0.1:9999',
    'accessMethod': 'A2A-JSON-RPC',
    'servingArea': '校园',
    'authentication': 'bearer_token',
    'capabilities': {
        'streaming': True,
        'pushNotifications': False,
        'stateTransition': True,
    },
    'defaultInputTypes': ['text/plain'],
    'defaultOutputTypes': ['text/plain'],
    'skills': [
        {
            'skillId': 'skill_001',
            'skillName': '教室查询',
            'skillDescription': '查询空教室',
            'tags': ['教室', '查询'],
            'examples': ['查明天下午的空教室'],
            'inputTypes': ['text/plain'],
            'outputTypes': ['text/plain'],
            'dependencies': [],
        },
    ],
    'tools': [
        {
            'toolId': 'weather_query',
            'toolName': '天气查询',
            'toolDescription': '查询天气预报',
            'toolVersion': '1.0.0',
            'toolInputParam': [{'name': 'city', 'type': 'string', 'required': True}],
            'toolOutputParam': [{'name': 'weather', 'type': 'string'}],
        },
    ],
    'status': 'active',
    'role': 'service_agent',
    'expiresAt': '2027-07-01',
    'discoverable': True,
}

# 测试智能体 B:不合规智能体(多项缺失)
NONCOMPLIANT_AGENT = {
    'agentId': '1.2.156.3088.0.SCH001.TEAM01.A00099.I00001',  # 版本号非法(不在 1~Z 范围)
    'name': '测试助手',
    'version': 'v1',  # 版本格式错误
    'description': '测试用',
    # 缺少多个必填字段
    'accessAddress': 'ftp://broken-address',  # 协议错误
    'capabilities': 'wrong_type',  # 格式错误
    'skills': [
        {
            'skillId': 's1',
            # 缺少大部分技能属性
        },
    ],
    'tools': [
        {
            'toolId': 't1',
            # 缺少大部分工具属性
        },
    ],
    'status': 'locked',  # 非活跃状态
    'role': '',
    'expiresAt': '2025-01-01',  # 已过期
}


def main():
    checker = ComplianceChecker()

    print('\n' + '=' * 30)
    print('  检测 1:合规智能体(预期:全部通过)')
    print('=' * 30)
    report1 = checker.check_all(COMPLIANT_AGENT)
    print_report(report1)

    print('\n\n' + '=' * 30)
    print('  检测 2:不合规智能体(预期:多项失败)')
    print('=' * 30)
    report2 = checker.check_all(NONCOMPLIANT_AGENT)
    print_report(report2)


if __name__ == '__main__':
    main()
步骤 2:运行合规检测
powershell 复制代码
python compliance_checker.py

预期输出(检测 1:合规智能体):

复制代码
==============================
  检测 1:合规智能体(预期:全部通过)
==============================
============================================================
智能体合规检测报告
对应标准:GB/Z 185 全系列
检测时间:2026-08-01T16:30:00
智能体名称:校园生活助手
身份码:1.2.156.3088.1.SCH001.TEAM01.A00002.I00001
============================================================

【检测摘要】
  检测项总数:18
  通过:18  失败:0
  错误:0  警告:0
  合规率:100.0%
  总体结论:合规

【详细结果】

  ── 身份码 ──
  通过 OID 前缀
     └ AID=1.2.156.3088.1.SCH001.T...
  通过 字段完整性
     └ 字段数=9(要求≥9)
  通过 版本号格式
     └ 版本号=1(要求 1 位 1~Z)
  通过 序列号格式
     └ 本体=A00002 实例=I00001

  ── 身份管理 ──
  通过 身份状态
  通过 活跃状态
  通过 凭证有效期
  通过 角色权限

  ── 智能体描述 ──
  通过 14项属性完整性
     └ 14 项属性全部填写
  通过 版本号格式

  ── 技能描述 ──
  通过 技能「教室查询」8项属性
     └ 8 项属性完整

  ── 智能体发现 ──
  通过 访问地址
  通过 访问方法
  通过 可发现性

  ── 智能体交互 ──
  通过 点对点模式
  通过 流式交互
  通过 任务状态管理

  ── 工具调用 ──
  通过 工具「天气查询」6项属性
     └ 6 项属性完整

============================================================

验证要点

  • 合规智能体:18 项检测全部通过,合规率 100%
  • 不合规智能体:多项检测失败(版本号非法、字段缺失、状态锁定、凭证过期等)
  • 七大维度覆盖:身份码、身份管理、描述、技能、发现、交互、工具

④ 任务评价

评价维度 优秀(9-10分) 良好(7-8分) 合格(6分) 需改进(<6分)
检测维度 七大维度全覆盖 覆盖 5-6 个维度 覆盖 3-4 个维度 覆盖 ❤️ 个维度
检测精度 精确检测格式+内容 检测主要格式 基本检测 检测粗糙
报告质量 分维度+摘要+建议 有摘要和详情 有基本报告 无格式化输出
标准对照 每项检测标注标准条款 标注主要标准 标注标准名 无标准对照

任务 6.3 智能体生命周期管理------注册、更新、锁定与注销

对应标准 :GB/Z 185.3---2026 身份账户管理、凭证管理

建议学时:4 学时

① 任务情境

随着校园智能体数量增长,信息化办公室需要一个统一的生命周期管理平台------

新智能体上线需要注册 ;功能升级需要更新 (身份码不变);寒假暂停服务需要锁定 ;开学恢复需要解锁 ;永久下线需要注销。所有操作都需要记录日志、同步状态、通知相关服务。

你需要搭建这个生命周期管理平台,整合任务 6.1 的安全网关和任务 6.2 的合规检测。

② 知识准备

一、智能体生命周期状态与六大操作

#mermaid-svg-jz0AhY3Rjd2rumQm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jz0AhY3Rjd2rumQm .error-icon{fill:#552222;}#mermaid-svg-jz0AhY3Rjd2rumQm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jz0AhY3Rjd2rumQm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jz0AhY3Rjd2rumQm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm .marker.cross{stroke:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jz0AhY3Rjd2rumQm p{margin:0;}#mermaid-svg-jz0AhY3Rjd2rumQm defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-jz0AhY3Rjd2rumQm g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-jz0AhY3Rjd2rumQm g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-jz0AhY3Rjd2rumQm g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-jz0AhY3Rjd2rumQm g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-jz0AhY3Rjd2rumQm .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-jz0AhY3Rjd2rumQm .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-jz0AhY3Rjd2rumQm .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-jz0AhY3Rjd2rumQm .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-jz0AhY3Rjd2rumQm .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-jz0AhY3Rjd2rumQm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jz0AhY3Rjd2rumQm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jz0AhY3Rjd2rumQm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jz0AhY3Rjd2rumQm .edgeLabel .label text{fill:#333;}#mermaid-svg-jz0AhY3Rjd2rumQm .label div .edgeLabel{color:#333;}#mermaid-svg-jz0AhY3Rjd2rumQm .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-jz0AhY3Rjd2rumQm .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-jz0AhY3Rjd2rumQm .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-jz0AhY3Rjd2rumQm .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm #statediagram-barbEnd{fill:#333333;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jz0AhY3Rjd2rumQm .cluster-label,#mermaid-svg-jz0AhY3Rjd2rumQm .nodeLabel{color:#131300;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-jz0AhY3Rjd2rumQm .note-edge{stroke-dasharray:5;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-note text{fill:black;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram-note .nodeLabel{color:black;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagram .edgeLabel{color:red;}#mermaid-svg-jz0AhY3Rjd2rumQm #dependencyStart,#mermaid-svg-jz0AhY3Rjd2rumQm #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-jz0AhY3Rjd2rumQm .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jz0AhY3Rjd2rumQm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 提交注册申请
身份验证通过 + 激活
管理员锁定/异常锁定
管理员解锁
提交变更申请(身份码不变)
注销申请
注销申请
归档
待注册
已注册
活跃
已锁定
已注销
正常服务状态
拒绝所有请求
不可恢复

二、GB/Z 185.3 生命周期管理要求
操作 规则 身份码变化 凭证变化
注册 身份注册→核验→凭证发行→激活 新分配 新发行
更新 身份码保持不变 不变 可更新
锁定 拒绝凭证发行和验证 不变 状态置为锁定
解锁 恢复正常 不变 状态恢复
注销 归档信息,同步注销凭证 废弃不复用 同步注销

关键原则

  • 身份码不可复用:注销的身份码永不重新分配
  • 身份码不变:更新时身份码保持不变,仅变更描述信息
  • 锁定即拒绝:锁定状态下拒绝所有凭证发行和身份验证

③ 任务实施

步骤 1:编写生命周期管理平台

新建文件 lifecycle_manager.py

python 复制代码
# lifecycle_manager.py
# 智能体生命周期管理平台
# 对应标准:GB/Z 185.3---2026 身份账户管理

from datetime import datetime
from enum import Enum
from typing import Optional

from fastapi import FastAPI, HTTPException, Query
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel


app = FastAPI(
    title='智能体生命周期管理平台',
    description='对应标准:GB/Z 185.3---2026',
    version='1.0.0',
)
app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_methods=['*'],
    allow_headers=['*'],
)


# ============================================================
#  一、生命周期状态定义
# ============================================================

class AgentState(str, Enum):
    """智能体生命周期状态。"""
    PENDING = 'pending'          # 待注册
    REGISTERED = 'registered'    # 已注册(未激活)
    ACTIVE = 'active'            # 活跃(正常服务)
    LOCKED = 'locked'            # 已锁定
    DEREGISTERED = 'deregistered'  # 已注销


# 合法状态转换
STATE_TRANSITIONS = {
    AgentState.PENDING: [AgentState.REGISTERED],
    AgentState.REGISTERED: [AgentState.ACTIVE, AgentState.DEREGISTERED],
    AgentState.ACTIVE: [AgentState.LOCKED, AgentState.DEREGISTERED],
    AgentState.LOCKED: [AgentState.ACTIVE, AgentState.DEREGISTERED],
    AgentState.DEREGISTERED: [],  # 终态,不可转换
}


# ============================================================
#  二、智能体记录模型
# ============================================================

class AgentRecord(BaseModel):
    """智能体生命周期记录。"""
    aid: str
    name: str
    version: str
    description: str
    provider: str
    state: AgentState = AgentState.PENDING
    registered_at: Optional[str] = None
    activated_at: Optional[str] = None
    locked_at: Optional[str] = None
    deregistered_at: Optional[str] = None
    last_updated: Optional[str] = None
    update_count: int = 0
    lock_count: int = 0
    lock_reason: Optional[str] = None


# ============================================================
#  三、生命周期管理器
# ============================================================

class LifecycleManager:
    """智能体生命周期管理器。

    对应 GB/Z 185.3 第 5 章:身份账户管理。
    支持:注册、激活、更新、锁定、解锁、注销。
    """

    def __init__(self):
        self.agents: dict[str, AgentRecord] = {}
        self.deregistered_aids: set[str] = set()  # 已注销 AID(不可复用)
        self.operation_logs: list[dict] = []

    def _log(self, aid: str, operation: str, detail: str = '') -> None:
        """记录操作日志。"""
        self.operation_logs.append({
            'timestamp': datetime.now().isoformat(),
            'aid': aid,
            'operation': operation,
            'detail': detail,
        })

    def _validate_aid(self, aid: str) -> None:
        """验证 AID 格式。"""
        if aid in self.deregistered_aids:
            raise ValueError(f'AID 已注销,不可复用:{aid}')
        parts = aid.split('.')
        if len(parts) < 9 or not aid.startswith('1.2.156.3088'):
            raise ValueError(f'AID 格式非法:{aid}')

    def _assert_transition(self, record: AgentRecord, target: AgentState) -> None:
        """校验状态转换是否合法(使用 STATE_TRANSITIONS 状态机)。

        对应 GB/Z 185.3 第 5 章:仅允许状态机定义内的合法转换;
        已注销为终态,不可再转换。
        """
        allowed = STATE_TRANSITIONS.get(record.state, [])
        if target not in allowed:
            raise ValueError(f'非法状态转换:{record.state.value} → {target.value}')

    # ----- 注册 -----

    def register(self, record: AgentRecord) -> AgentRecord:
        """注册智能体。

        对应 GB/Z 185.3 第 5.1 条:身份注册发起 → 风险评估 →
        证据提交与核验 → 身份建立及凭证发行 → 身份账户激活。
        """
        self._validate_aid(record.aid)

        if record.aid in self.agents:
            raise ValueError(f'AID 已注册:{record.aid}')

        self._assert_transition(record, AgentState.REGISTERED)
        record.state = AgentState.REGISTERED
        record.registered_at = datetime.now().isoformat()
        self.agents[record.aid] = record
        self._log(record.aid, 'register', f'注册智能体:{record.name}')
        return record

    # ----- 激活 -----

    def activate(self, aid: str) -> AgentRecord:
        """激活智能体。"""
        record = self._get_agent(aid)

        self._assert_transition(record, AgentState.ACTIVE)
        record.state = AgentState.ACTIVE
        record.activated_at = datetime.now().isoformat()
        self._log(aid, 'activate', f'激活智能体:{record.name}')
        return record

    # ----- 更新 -----

    def update(self, aid: str, updates: dict) -> AgentRecord:
        """更新智能体信息。

        对应 GB/Z 185.3 第 5.2 条:更新时身份码保持不变。
        """
        record = self._get_agent(aid)

        if record.state not in (AgentState.ACTIVE, AgentState.LOCKED):
            raise ValueError(f'当前状态 {record.state.value} 不允许更新')

        # 身份码不可变更
        if 'aid' in updates and updates['aid'] != aid:
            raise ValueError('身份码不可变更')

        # 应用更新
        for key, value in updates.items():
            if key != 'aid' and hasattr(record, key):
                setattr(record, key, value)

        record.update_count += 1
        record.last_updated = datetime.now().isoformat()
        self._log(aid, 'update', f'更新智能体(第 {record.update_count} 次)')
        return record

    # ----- 锁定 -----

    def lock(self, aid: str, reason: str = '') -> AgentRecord:
        """锁定智能体。

        对应 GB/Z 185.3 第 5.3 条:锁定状态拒绝凭证发行和验证。
        """
        record = self._get_agent(aid)

        self._assert_transition(record, AgentState.LOCKED)
        record.state = AgentState.LOCKED
        record.locked_at = datetime.now().isoformat()
        record.lock_count += 1
        record.lock_reason = reason
        self._log(aid, 'lock', f'锁定智能体(第 {record.lock_count} 次):{reason}')
        return record

    # ----- 解锁 -----

    def unlock(self, aid: str) -> AgentRecord:
        """解锁智能体。"""
        record = self._get_agent(aid)

        self._assert_transition(record, AgentState.ACTIVE)
        record.state = AgentState.ACTIVE
        record.locked_at = None
        record.lock_reason = None
        self._log(aid, 'unlock', f'解锁智能体:{record.name}')
        return record

    # ----- 注销 -----

    def deregister(self, aid: str, reason: str = '') -> AgentRecord:
        """注销智能体。

        对应 GB/Z 185.3 第 5.4 条:注销后归档,AID 不可复用,
        关联凭证同步注销。
        """
        record = self._get_agent(aid)

        self._assert_transition(record, AgentState.DEREGISTERED)
        record.state = AgentState.DEREGISTERED
        record.deregistered_at = datetime.now().isoformat()
        self.deregistered_aids.add(aid)
        self._log(aid, 'deregister', f'注销智能体:{reason}')
        return record

    # ----- 查询 -----

    def _get_agent(self, aid: str) -> AgentRecord:
        if aid not in self.agents:
            raise ValueError(f'未找到智能体:{aid}')
        return self.agents[aid]

    def get_agent(self, aid: str) -> dict:
        record = self._get_agent(aid)
        return record.model_dump()

    def list_agents(self, state: Optional[str] = None) -> list[dict]:
        agents = list(self.agents.values())
        if state:
            agents = [a for a in agents if a.state.value == state]
        return [a.model_dump() for a in agents]

    def get_logs(self, count: int = 20) -> list[dict]:
        return self.operation_logs[-count:]

    def get_statistics(self) -> dict:
        """获取生命周期统计信息。"""
        total = len(self.agents)
        return {
            'total': total,
            'active': sum(1 for a in self.agents.values() if a.state == AgentState.ACTIVE),
            'locked': sum(1 for a in self.agents.values() if a.state == AgentState.LOCKED),
            'registered': sum(1 for a in self.agents.values() if a.state == AgentState.REGISTERED),
            'deregistered': sum(1 for a in self.agents.values() if a.state == AgentState.DEREGISTERED),
            'deregistered_aids': len(self.deregistered_aids),
            'total_operations': len(self.operation_logs),
        }


# 全局生命周期管理器
lifecycle_mgr = LifecycleManager()


# ============================================================
#  四、API 接口
# ============================================================

class RegisterRequest(BaseModel):
    aid: str
    name: str
    version: str = '1.0.0'
    description: str = ''
    provider: str = ''


class UpdateRequest(BaseModel):
    name: Optional[str] = None
    version: Optional[str] = None
    description: Optional[str] = None
    provider: Optional[str] = None


@app.post('/agents/register')
async def register_agent(req: RegisterRequest):
    """接口 1:注册智能体。"""
    try:
        record = AgentRecord(
            aid=req.aid, name=req.name, version=req.version,
            description=req.description, provider=req.provider,
        )
        result = lifecycle_mgr.register(record)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.post('/agents/{aid}/activate')
async def activate_agent(aid: str):
    """接口 2:激活智能体。"""
    try:
        result = lifecycle_mgr.activate(aid)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.put('/agents/{aid}')
async def update_agent(aid: str, req: UpdateRequest):
    """接口 3:更新智能体(身份码不变)。"""
    try:
        updates = {k: v for k, v in req.model_dump().items() if v is not None}
        result = lifecycle_mgr.update(aid, updates)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.post('/agents/{aid}/lock')
async def lock_agent(aid: str, reason: str = ''):
    """接口 4:锁定智能体。"""
    try:
        result = lifecycle_mgr.lock(aid, reason)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.post('/agents/{aid}/unlock')
async def unlock_agent(aid: str):
    """接口 5:解锁智能体。"""
    try:
        result = lifecycle_mgr.unlock(aid)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.post('/agents/{aid}/deregister')
async def deregister_agent(aid: str, reason: str = ''):
    """接口 6:注销智能体。"""
    try:
        result = lifecycle_mgr.deregister(aid, reason)
        return {'success': True, 'agent': result.model_dump()}
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))


@app.get('/agents')
async def list_agents(state: Optional[str] = Query(None)):
    """接口 7:查询智能体列表。"""
    return {
        'count': len(lifecycle_mgr.list_agents(state)),
        'agents': lifecycle_mgr.list_agents(state),
    }


@app.get('/agents/{aid}')
async def get_agent(aid: str):
    """接口 8:查询单个智能体。"""
    try:
        return lifecycle_mgr.get_agent(aid)
    except ValueError as e:
        raise HTTPException(status_code=404, detail=str(e))


@app.get('/logs')
async def get_logs(count: int = 20):
    """接口 9:查询操作日志。"""
    return {
        'total': len(lifecycle_mgr.operation_logs),
        'logs': lifecycle_mgr.get_logs(count),
    }


@app.get('/statistics')
async def get_statistics():
    """接口 10:获取统计信息。"""
    return lifecycle_mgr.get_statistics()


# ============================================================
#  入口
# ============================================================

if __name__ == '__main__':
    import uvicorn

    # 预置示例数据
    lifecycle_mgr.register(AgentRecord(
        aid='1.2.156.3088.1.SCH001.TEAM01.A00001.I00001',
        name='社团通知助手', version='1.0.0',
        description='发送社团活动通知', provider='SCH001信息化办公室',
    ))
    lifecycle_mgr.activate('1.2.156.3088.1.SCH001.TEAM01.A00001.I00001')

    lifecycle_mgr.register(AgentRecord(
        aid='1.2.156.3088.1.SCH001.TEAM01.A00002.I00001',
        name='校园生活助手', version='1.0.0',
        description='校园生活服务', provider='SCH001信息化办公室',
    ))
    lifecycle_mgr.activate('1.2.156.3088.1.SCH001.TEAM01.A00002.I00001')

    print('=' * 60)
    print('智能体生命周期管理平台')
    print('对应标准:GB/Z 185.3---2026 身份账户管理')
    print('服务地址:http://127.0.0.1:8003')
    print('API 文档:http://127.0.0.1:8003/docs')
    print(f'已注册智能体:{len(lifecycle_mgr.agents)} 个')
    for aid, record in lifecycle_mgr.agents.items():
        print(f'  · {record.name}(状态:{record.state.value})')
    print('=' * 60)
    uvicorn.run(app, host='127.0.0.1', port=8003)
步骤 2:启动生命周期管理平台
powershell 复制代码
python lifecycle_manager.py

预期输出:

复制代码
============================================================
智能体生命周期管理平台
对应标准:GB/Z 185.3---2026 身份账户管理
服务地址:http://127.0.0.1:8003
API 文档:http://127.0.0.1:8003/docs
已注册智能体:2 个
  · 社团通知助手(状态:active)
  · 校园生活助手(状态:active)
============================================================
INFO:     Uvicorn running on http://127.0.0.1:8003 (Press CTRL+C to quit)
步骤 3:测试生命周期操作

测试 1:注册新智能体

powershell 复制代码
curl -X POST http://127.0.0.1:8003/agents/register -H "Content-Type: application/json" -d "{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00003.I00001\",\"name\":\"天气工具服务\",\"version\":\"1.0.0\",\"description\":\"提供天气查询工具\",\"provider\":\"SCH001信息化办公室\"}"

应返回 state: registered

测试 2:激活智能体

powershell 复制代码
curl -X POST "http://127.0.0.1:8003/agents/1.2.156.3088.1.SCH001.TEAM01.A00003.I00001/activate"

应返回 state: active

测试 3:更新智能体(身份码不变)

powershell 复制代码
curl -X PUT "http://127.0.0.1:8003/agents/1.2.156.3088.1.SCH001.TEAM01.A00003.I00001" -H "Content-Type: application/json" -d "{\"version\":\"1.1.0\",\"description\":\"提供天气查询和预报工具\"}"

应返回 version: 1.1.0update_count: 1,身份码不变。

测试 4:锁定智能体

powershell 复制代码
curl -X POST "http://127.0.0.1:8003/agents/1.2.156.3088.1.SCH001.TEAM01.A00003.I00001/lock?reason=寒假暂停服务"

应返回 state: lockedlock_reason: 寒假暂停服务

测试 5:解锁智能体

powershell 复制代码
curl -X POST "http://127.0.0.1:8003/agents/1.2.156.3088.1.SCH001.TEAM01.A00003.I00001/unlock"

应返回 state: active

测试 6:注销智能体

powershell 复制代码
curl -X POST "http://127.0.0.1:8003/agents/1.2.156.3088.1.SCH001.TEAM01.A00003.I00001/deregister?reason=服务下线"

应返回 state: deregistered

测试 7:验证注销后不可复用

powershell 复制代码
curl -X POST http://127.0.0.1:8003/agents/register -H "Content-Type: application/json" -d "{\"aid\":\"1.2.156.3088.1.SCH001.TEAM01.A00003.I00001\",\"name\":\"新服务\"}"

应返回 400 错误:AID 已注销,不可复用

测试 8:查看统计信息

powershell 复制代码
curl http://127.0.0.1:8003/statistics

应返回各状态智能体数量统计。

验证要点

  • 注册→激活→更新→锁定→解锁→注销 完整生命周期闭环
  • 身份码不可复用:注销后重新注册被正确拒绝
  • 身份码不变:更新时身份码保持不变
  • 操作日志:所有操作都有日志记录

④ 任务评价

评价维度 优秀(9-10分) 良好(7-8分) 合格(6分) 需改进(<6分)
生命周期操作 六大操作全部实现 实现 4-5 项 实现 3 项 ❤️ 项
状态转换 合法转换校验+终态保护 有状态校验 基本校验 无校验
不可复用 注销 AID 不可复用 有注销记录 可注销 无注销
日志统计 完整日志+统计面板 有操作日志 基本日志 无日志

项目总结与全书能力进阶

项目六知识体系

复制代码
项目六:智能体安全与生命周期管理
├── 任务 6.1:安全防护------双向身份鉴别与访问控制(GB/Z 185.3 身份鉴别)
│   ├── 身份鉴别通用流程:服务请求→凭证出示→五项验证→断言→授权
│   ├── 过程凭证包:AID + 时间戳 + 随机数 + HMAC 签名
│   ├── 五项验证:完整性/真实性、时效性、状态、受众、委托链
│   ├── RBAC 访问控制:角色→权限→操作
│   ├── 风险自适应:根据操作类型和目标评估风险等级
│   └── 审计日志:链式哈希防篡改
├── 任务 6.2:合规检测------标准符合性自动化检测(GB/Z 185 全系列)
│   ├── 七大检测维度:身份码、身份管理、描述、技能、发现、交互、工具
│   ├── 检测规则:格式校验 + 完整性校验 + 状态校验
│   ├── 合规报告:分维度 + 摘要 + 详情 + 合规率
│   └── 严重级别:error / warning / info
└── 任务 6.3:生命周期管理------注册、更新、锁定与注销(GB/Z 185.3)
    ├── 生命周期状态五大:待注册→已注册→活跃→已锁定→已注销;六大操作:注册→激活→更新→锁定→解锁→注销
    ├── 状态转换规则:合法转换校验 + 终态保护
    ├── 关键原则:身份码不可复用、更新时不变
    └── 操作日志:全操作记录 + 统计面板

全书六大项目知识体系总览

项目 主题 对应标准 核心能力 关键产出
项目一 认识智能体互联网 GB/Z 185.1 搭建智能体、体验协作 社团通知助手
项目二 身份码与身份管理 GB/Z 185.2-3 身份注册、凭证验证 AID 生成器、注册中心
项目三 描述与发现 GB/Z 185.4-5 能力名片、发现服务 Agent Card、发现 API
项目四 智能体交互 GB/Z 185.6 任务状态、流式、多轮、协作 状态管理、多轮对话、编排器
项目五 工具调用 GB/Z 185.7 工具服务、工具调用循环 工具服务、综合助理
项目六 安全与生命周期 GB/Z 185.3+全系列 安全网关、合规检测、生命周期 安全网关、合规工具、管理平台

GB/Z 185 全系列标准与本书对照

复制代码
GB/Z 185.1 总体架构      ← 项目一(概念模型、四层架构、五大概念域)
    ↓
GB/Z 185.2 身份码        ← 项目二(OID 分层结构、AID 生成器)
GB/Z 185.3 身份管理      ← 项目二(注册中心、凭证验证)
                           ← 项目六(安全网关、生命周期管理)  ★ 新增
    ↓
GB/Z 185.4 智能体描述    ← 项目三(14 项属性、Agent Card)
GB/Z 185.5 智能体发现    ← 项目三(发现服务、双路径发现)
    ↓
GB/Z 185.6 智能体交互    ← 项目四(三种模式、四种元素、三种协作)
    ↓
GB/Z 185.7 工具调用      ← 项目五(五大实体、三大流程、调用循环)
    ↓
全系列合规检测           ← 项目六(七大维度自动化检测)  ★ 新增

能力进阶全路径

层级 能力描述 对应项目
L1 认知 知道 IoA 是什么 项目一
L2 安全 能给智能体上身份 项目二
L3 可见 能让智能体被发现 项目三
L4 交互 能让智能体协作 项目四
L5 增强 能让智能体调用工具 项目五
L6 整合 能构建完整 IoA 系统 项目五综合实战
L7 治理 能管安全、查合规、管生命周期 项目六

课后拓展

  1. (基础) 为安全网关增加"IP 白名单"功能------只允许指定 IP 地址的智能体发起请求。
  2. (进阶) 将合规检测工具升级为"持续合规监控"------定时检测所有已注册智能体,发现不合规自动告警。
  3. (实操) 在生命周期管理平台中增加"批量操作"功能------支持批量锁定、批量激活多个智能体。
  4. (探索) 研究 GB/Z 185.3 中的"委托链验证"机制,实现多层委托关系的安全性验证(A 委托 B,B 委托 C,验证 A→B→C 的完整委托链)。

全书结语

恭喜你完成了全部六个项目的学习!

从项目一的"认识 IoA",到项目六的"安全与生命周期管理",你已经掌握了智能体互联网的全栈技术与治理能力:

  • 身份层:让智能体可信(GB/Z 185.2-3)→ 项目二 + 项目六
  • 描述层:让智能体可见(GB/Z 185.4-5)→ 项目三
  • 交互层:让智能体协作(GB/Z 185.6)→ 项目四
  • 工具层:让智能体强大(GB/Z 185.7)→ 项目五
  • 治理层:让智能体安全可控(GB/Z 185 全系列)→ 项目六

智能体互联网正在改变人机交互的方式。未来,每一个服务都可能成为一个智能体,每一次交互都可能跨越多个智能体。掌握这些标准和技术,你就已经站在了智能体时代的前沿。

继续探索,继续创造!

相关推荐
147API1 小时前
AI 图片编辑接口报 400 怎么排查?先读错误体,再查参数、图片与 mask
网络·人工智能
戴西软件2 小时前
戴西CAxWorks.VPG车辆工程仿真软件技术解析(上)——安全仿真体系的自动化构建
运维·网络·数据库·人工智能·算法·安全·自动化
ZENERGY-众壹2 小时前
电力监控系统安全防护实战:如何将生产大区逆变器数据安全穿透至 SIS 平台
安全·系统安全
砚凝霜2 小时前
软考网络工程师|第 6 章 应用层安全协议、防火墙完整备考笔记
网络·笔记·安全
gnhpc12 小时前
国产龙芯主板为智能电网网络安全升级筑牢防护屏障
安全
小马过河R3 小时前
AI Coding应用上线安全实践指南
人工智能·安全·安全架构·engineering·ai coding·harness
M158227690553 小时前
SG-CANFiber-120 (S) 环网 CAN 光纤中继器,解决工业 CAN 远距离通信难题
网络
小小龙学IT3 小时前
Day 26-27 项目实战:从零构建一个高并发聊天室(epoll + 线程池)
linux·服务器·c语言·开发语言·网络
灵析表格3 小时前
灵析表格手机号处理函数深度分析报告
前端·网络·json·wps·灵析表格·excel公式盒子