从零搭建 CAD 智能体集群,A2A 协议全流程解析 从单点智能到集群协作CAD 智能体的进化之路在传统的 CAD 二次开发中我们习惯了“点击按钮 - 执行命令”的线性交互。用户想要倒角就点击倒角工具想要统计面积就运行面积统计插件。这种模式在单一任务场景下行之有效但当面对复杂的工程设计——比如“找出所有厚度小于 0.1mm 的薄壁零件并生成修复建议报告”时传统的脚本往往显得力不从心。它需要串联几何分析、规则判断、文档生成等多个环节代码耦合度高且难以维护。随着大语言模型LLM的爆发AI Agent智能体为 CAD 软件带来了新的交互范式。但单个 Agent 的能力终究有限真正的生产力飞跃来自于多个专业 Agent 的协同工作。这就引出了我们今天的主角A2AAgent-to-Agent。本文将带你从零开始构建一个基于 A2A 协议的 CAD 智能体集群让不同的智能体像工程师团队一样分工协作共同解决复杂的工程问题。基础设施搭建用 Elastic Agent Builder 打造数据大脑构建智能体集群的第一步是让 Agent 拥有“记忆”和“查询”能力。在 CAD 场景中这通常意味着能够检索设计规范、历史案例或特定的几何参数。我们将利用Elastic Agent Builder快速创建一个具备数据查询能力的 Hello World Agent作为集群中的“知识库节点”。首先你需要一个 Elastic Serverless 项目。登录 Elastic Cloud 创建新项目后进入 Developer Tools 控制台。我们需要创建一个索引来存储文档数据这里我们定义一个包含语义搜索能力的索引my-docsPUT /my-docs { mappings: { properties: { title: { type: text }, content: { type: semantic_text }, filename: { type: keyword }, last_modified: { type: date } } } }索引创建完成后注入一条测试数据。这条数据模拟了一份关于“问候语规范”的设计文档后续我们的 Agent 将依据此文档进行回复PUT /my-docs/_doc/greetings-md { title: Greetings, content: # Greetings\n## Basic Greeting\nHello!\n## Helloworld\nGreeting Hello World! \n## Not Greeting\nIm only a greeting agent. , filename: greetings.md, last_modified: 2025-11-04T12:00:00Z }数据就位后核心步骤是创建Tool工具。在 Agent Builder 中选择New Tool类型设为ES|QL。我们将定义一个名为example.get_greetings的工具其作用是从索引中提取特定的问候语文档。配置如下 ES|QL 查询语句FROM my-docs | WHERE filename greetings.md保存工具后接着创建Agent。在New Agent表单中设定 Agent ID 为helloworld_agent并在Custom Instructions中写入业务逻辑如果用户输入包含Hi或Hello则返回文档中的基础问候语若包含Hello World则返回对应的特定文本否则返回默认提示。最关键的一步是在Tools标签页中仅勾选刚才创建的example.get_greetings工具。至此一个能够理解自然语言并查询 Elastic 数据的独立 Agent 已经诞生。你可以在 Agent Builder 的聊天窗口中输入hello world进行测试它会精准地返回预设的响应。但这只是单机智能接下来我们要让它融入集群。协议核心解析读懂 Agent Card 与 Task 生命周期要让上述 Elastic Agent 与其他 CAD 专用 Agent如几何计算 Agent、渲染 Agent协作必须遵循统一的通信标准即A2A 协议。A2A 的核心在于两个概念Agent Card能力名片和Task任务对象。Agent Card智能体的身份证每个接入 A2A 网络的 Agent 都必须发布一个 JSON 格式的Agent Card。这不仅是身份标识更是能力说明书。Client 端通过读取这张“名片”决定何时调用该 Agent。一个标准的 CAD 几何分析 Agent 的 Card 可能长这样{ name: CAD Geometry Analyzer, description: Analyzes STL models for thin walls and intersections, url: https://cad-cluster.local/geometry-agent, version: 1.0.0, capabilities: { streaming: true, pushNotifications: false }, skills: [ { id: thin-wall-detection, name: Thin Wall Detection, description: Identifies triangles with thickness below threshold, inputModes: [application/json], outputModes: [application/json] }, { id: ray-intersection, name: Ray Intersection, description: Calculates intersection points for a given ray, inputModes: [application/json], outputModes: [application/json] } ] }注意skills字段它详细列出了该 Agent 能做什么。在集群中 orchestrator编排者会根据这些技能描述自动将“检查薄壁”的任务分发给这个 Agent而不是发给只负责查文档的 Elastic Agent。Task 生命周期协作的节拍器A2A 中的协作不是简单的请求 - 响应而是基于Task的状态机管理。一个 Task 拥有明确的生命周期状态submitted已提交、working处理中、input-required需要人工介入、completed完成、failed失败。当 Client 发起任务时Remote Agent 不会立即返回最终结果而是先返回一个Task对象状态标记为working。随后Agent 可以通过 SSEServer-Sent Events流式推送中间状态或日志。这种机制对于耗时的 CAD 几何计算尤为重要——用户不必盯着旋转的光标等待而是能实时看到“正在加载模型”、“正在构建 BVH、“检测到 12 个薄壁面”等进度信息。深度集成将 C# 几何内核注册为网络服务在 CAD 领域核心的几何算法如布尔运算、网格简化、射线检测通常由高性能的 C 或 C# 代码实现。如何将这些本地能力暴露给 A2A 集群我们需要构建一个Geometry API Service将其封装为符合 A2A 标准的 Remote Agent。假设我们已经有一个经过优化的 C# 几何内核支持零拷贝加载 STL 文件和基于 BVH 的射线相交检测。现在我们要为其包裹一层 HTTP 服务使其成为集群中的“几何专家”。1. 定义数据结构与接口首先确保几何接口清晰且与渲染逻辑解耦。定义基础结构如Point、Ray和Intersection并提供统一的 API 类public class GeometryAPI { private ObjectPoolTriangle _trianglePool; private BVH _bvh; public bool LoadModel(string filename) { // 零拷贝加载逻辑直接填充内存池 if (!ParseSTLToPool(filename, _trianglePool)) return false; _bvh new BVH(_trianglePool.GetAll()); _bvh.Build(); return true; } public ListIntersection GetIntersectingPoints(Ray ray) { if (_bvh null) return new ListIntersection(); var hits _bvh.Intersect(ray); // 按距离排序并返回 return hits.OrderBy(h h.Distance).Select(h h.ToIntersection()).ToList(); } public ListTriangle GetThinParts(float maxThickness) { // 遍历内存池计算厚度并筛选 return _trianglePool.GetAll() .Where(t ComputeThickness(t) maxThickness) .ToList(); } }2. 实现 A2A 服务端接下来使用 ASP.NET Core 创建一个 Web API实现 A2A 协议要求的端点。你需要处理/agent/card请求以返回前述的 JSON 名片并实现/tasks/send来处理任务提交。在处理tasks/send时服务端需解析传入的 JSON-RPC 请求。例如当收到thin-wall-detection技能调用时实例化GeometryAPI执行GetThinParts方法并将结果封装成 A2A 标准的Artifact返回。[HttpPost(/tasks/send)] public async TaskIActionResult SendTask([FromBody] A2ATaskRequest request) { var taskId Guid.NewGuid().ToString(); var skillId request.Params.Message.Parts.First().SkillId; // 异步启动任务立即返回 Task 对象状态working _ Task.Run(() ProcessGeometryTask(taskId, skillId, request.Params)); return Ok(new A2ATaskResponse { Id taskId, Status new TaskStatus { State working }, SessionId request.Params.SessionId }); }在这个后台任务ProcessGeometryTask中调用 C# 几何内核进行实际计算。计算完成后通过 SSE 通道推送最终结果或将状态更新为completed并附带包含检测结果的Artifact。这样无论底层是 C#、Python 还是 Go 实现的 Agent只要遵循 A2A 协议就能无缝对话。集群编排使用 Microsoft Agent Framework 串联工作流有了数据查询 AgentElastic和几何计算 AgentC#我们需要一个“指挥官”来协调它们。Microsoft Agent Framework提供了强大的编排能力允许我们在 Python 或 C# 中定义复杂的工作流。以下是一个基于 Python 的编排示例展示如何让两个 Agent 协作完成“查询规范并检测模型”的任务import asyncio from a2a.client import A2ACardResolver from agent_framework.a2a import A2AAgent async def main(): # 1. 发现集群中的 Agent resolver A2ACardResolver(base_urlhttp://cad-cluster.local) # 获取几何 Agent 的名片 geo_card await resolver.get_agent_card(/geometry-agent.json) geo_agent A2AAgent(agent_cardgeo_card) # 获取文档 Agent 的名片 doc_card await resolver.get_agent_card(/helloworld_agent.json) doc_agent A2AAgent(agent_carddoc_card) # 2. 定义协作流程 user_prompt 检查 engine.stl 是否有薄壁并参考问候语文档格式输出报告 # 第一步调用几何 Agent 进行检测 print( 调用几何分析 Agent...) geo_response await geo_agent.run({ file: engine.stl, threshold: 0.1 }) thin_parts geo_response.artifacts[0].data # 第二步调用文档 Agent 获取报告模板 print( 调用文档规范 Agent...) doc_response await doc_agent.run(How to format a report?) template doc_response.messages[0].text # 第三步本地整合结果或由第三个总结 Agent 完成 final_report f{template}\n\n检测结果发现 {len(thin_parts)} 处薄壁风险。 print(f\n最终报告:\n{final_report}) if __name__ __main__: asyncio.run(main())在这个流程中Microsoft Agent Framework 充当了 Client 角色它不需要知道几何计算的具体算法也不需要关心文档存储在哪个 Elastic 索引中。它只需要根据Agent Card找到对应的服务发送标准化的 Task然后处理返回的 Artifact。这种解耦使得我们可以随时替换底层的几何引擎比如从 C# 换成 Rust 实现或者升级文档数据库而无需修改上层业务逻辑。异常处理与生产级考量在实际落地中网络波动、计算超时或参数错误不可避免。A2A 协议通过Task的状态机制提供了天然的容错基础。当几何计算耗时过长导致 HTTP 超时时服务端不应直接断开连接而应保持 Task 状态为working并通过心跳包维持会话。若计算过程中发现模型文件损坏Agent 应将 Task 状态更新为failed并在Message中附带详细的错误码如ERR_INVALID_STL以便上游编排者决定是重试、跳过还是通知人工介入。此外安全性不容忽视。在生产环境中Agent Card应包含认证方案如 OAuth2 或 API Key并在 HTTP 头中校验权限。对于涉及核心设计数据的 CAD 集群建议启用 HTTPS 并配置严格的 Roots 策略限制 Agent 只能访问指定的文件目录或数据库表防止越权操作。从单个脚本到智能体集群CAD 开发的范式正在发生深刻变化。通过 A2A 协议我们将分散的工具、数据和算法连接成了一个有机的整体。无论是 Elastic 的数据检索还是 C# 的高性能几何计算都能在统一的协作框架下发挥最大价值。未来随着更多专业 Agent 的加入这个集群将不仅能执行命令更能自主规划、协同创新真正成为工程师的得力助手。