项目六 智能体安全与生命周期管理
对应标准: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"
应返回包含 aid、timestamp、nonce、signature 的凭证包。
测试 2:验证身份
将测试 1 返回的 credential 中的 timestamp、nonce、signature 三个值原样替换进下面的请求。请务必使用测试 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.0,update_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: locked,lock_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 治理 | 能管安全、查合规、管生命周期 | 项目六 |
课后拓展
- (基础) 为安全网关增加"IP 白名单"功能------只允许指定 IP 地址的智能体发起请求。
- (进阶) 将合规检测工具升级为"持续合规监控"------定时检测所有已注册智能体,发现不合规自动告警。
- (实操) 在生命周期管理平台中增加"批量操作"功能------支持批量锁定、批量激活多个智能体。
- (探索) 研究 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 全系列)→ 项目六
智能体互联网正在改变人机交互的方式。未来,每一个服务都可能成为一个智能体,每一次交互都可能跨越多个智能体。掌握这些标准和技术,你就已经站在了智能体时代的前沿。
继续探索,继续创造!