【免费下载链接】agentmeshAgent Mesh项目地址https://gitcode.com/gh_mirrors/sam31/agentmesh点击查看免费下载Agent Mesh 是一个面向 AI Agent 的私有 P2P 网络每个 Agent 旁边跑一个agentmesh-node负责把本地工具发布到网络、发现并调用远端服务。在 A2AAgent2Agent协议 场景下真正卡住跨网络对话的往往不是连接本身而是Agent Card——这张名片里写死了只有 Provider 本机可达的地址。Agent Mesh 通过Agent Card 再生regeneration机制在调用方节点上重新签发这张名片让未经任何修改的标准 A2A SDK 就能直接跨网络对话。本文拆解这套机制的完整原理。一、问题根源A2A 协议为什么跨不了网络1.1 Agent Card 是 A2A 的入口按照 A2A 协议规范客户端与远端 Agent 对话的第一步永远是访问约定路径GET /.well-known/agent-card.json返回的 Agent CardJSON里包含 Agent 的名称、能力capabilities、技能列表以及最关键的supportedInterfaces——一组带url字段的接口声明告诉客户端消息该发到哪里。1.2 卡点Card 里的地址是本机地址假设远端节点上的 chat Agent 监听在127.0.0.1:7777它签发的 Card 大致长这样{ name: chat, supportedInterfaces: [ { protocolBinding: JSONRPC, url: http://127.0.0.1:7777/ } ] }调用方节点虽然能通过代理路径/mesh/peer-id/a2a/chat/.well-known/agent-card.json把这张 Card 原样取回来但客户端解析后却会转头去连http://127.0.0.1:7777/——这个地址在调用方自己机器上根本不存在对话在第一步就断了。 矛盾就出在这里Card 必须被改写但客户端又不允许被改写。谁来做这个中间人二、Agent Card 再生调用方节点的三步操作Agent Mesh 的答案是由调用方节点扮演远端 Agent 的 Card 端点。当请求命中.well-known/agent-card.json或服务根路径时节点拦截请求执行抓取 → 改写 → 回签三步核心实现位于 a2a_service.go。2.1 第一步拦截请求经 mesh 抓取原始 Card调用方节点通过 libp2p 加密流向 Provider 节点发起内部 GET见 fetchRemoteAgentCard复用调用方已有的 Biscuit 凭据完成鉴权。注意两个细节主动删除If-None-Match/If-Modified-Since等缓存头——因为客户端的校验器对应的是再生后的 CardProvider 从未见过限制抓取体积为 1MB防止恶意大 Card 打爆节点内存。2.2 第二步改写接口 URL指向 mesh 代理路径regenerateAgentCardForMesh 是再生的心脏它对 Card 做四件事操作原因仅保留 JSONRPC / HTTPJSON 绑定的接口gRPC 需要端到端独占连接mesh 的 HTTP 通道承载不了直接丢弃把每个接口的url重写为http://本节点/mesh/peer-id/a2a/name/让客户端的所有后续请求都绕回 mesh 代理路径清空原签名signatures内容已被改写原签名必然失配保证 skills、inputModes 等字段是空数组而非 null严格解析器如 pydantic会拒绝 nullURL 重写还有一个安全防线meshInterfaceURL任何带 scheme、host、绝对路径或..段的引用一律回落到服务根路径——Provider 不能借 Card 把调用方引到本节点上的其他路径。2.3 第三步为再生内容重新签发缓存头Card 内容变了但 A2A 1.0 规范要求支持 ETag 协商缓存。节点对自己发出的字节计算 SHA-256 派生新的强校验器agentCardETag若请求携带的If-None-Match命中则直接回304 Not Modified既遵守 RFC 9110 的弱比较语义又避免重复抓取远端。2.4 Provider 侧的配合URL 相对化为了让改写更精确Provider 节点在向 mesh 转发 Card 响应时还会先把本机绝对 URL 转成相对路径relativizeAgentCardResponse。这样当 Agent 的 JSON-RPC 端点挂在/invoke子路径下时调用方解析相对引用后仍落在正确的代理子路径上而不是被一刀切到服务根。三、零改动接入标准 A2A 客户端实战再生机制落地后调用方看到的就是一个标准 A2A 服务。以下用官方a2aCLI 演示完整示例见 development/examples/chat-a2a/1️⃣ 把本地 A2A Agent 发布到 mesh——节点配置只需一行type: a2atarget_urlservices: - type: a2a name: chat target_url: http://127.0.0.1:77772️⃣ 发现服务discover_remote_services工具按{type:a2a}列出远端 Agent 及其 peer ID。3️⃣ 用标准客户端对话Card 地址直接指向本地节点代理路径CARDhttp://127.0.0.1:8080/mesh/peer-id/a2a/chat/.well-known/agent-card.json a2a card get $CARD # 拿到的已是再生后的 Card a2a send -a $CARD hello # message/send 自动发回 mesh 路径整个过程中a2a-sdk、a2aCLI 或任何其他 Agent 完全不知道 Agent Mesh 的存在消息与 SSE 流式响应由节点透传代理contextId原样往返多轮对话上下文完整保留。 想亲手跑通端到端演示参考 chat-a2a 用例文档它基于 kind 本地 mesh 一条命令拉起。四、这套设计的三个巧妙之处探针即健康检查节点把能取到合法 Agent Card作为服务就绪的定义A2AService.Probe。沙箱里 Agent 还没绑定端口时探测失败、服务就不会进入发现表——用协议自身的语义做准入零额外成本。能力声明不降级流式streaming等能力字段按 Agent 原样保留。因为代理是透传 SSE 流的若把流式关掉远端 Agent 反而会按 Card 拒绝SendStreamingMessage得不偿失。默认拒绝的兜底再生只发生在策略允许的/mesh/...路径上Card 请求同样先过凭据校验与 labels 门a2aEgressGate拿不到授权就是403。五、小结环节谁负责做了什么Card 抓取调用方节点经 libp2p 加密流取回原始 CardURL 再生调用方节点接口地址重写为 mesh 代理路径剥离 gRPC、清空旧签名缓存协商调用方节点对再生字节自签 ETag支持 304路径相对化Provider 节点把子路径接口改写为相对引用客户端标准 A2A SDK什么都不用改一句话总结Agent Mesh 把 Agent Card 从静态名片变成了可再生的动态路由。只要你的 Agent 会说话 HTTP 上的 A2A它就能原封不动地加入 mesh被任何标准客户端找到并对话——这正是 P2P Agent 网络最需要的零摩擦互操作。更多架构细节可阅读 架构文档 与 Node API 参考。赞分享【免费下载链接】agentmeshAgent Mesh项目地址https://gitcode.com/gh_mirrors/sam31/agentmesh点击查看免费下载相关推荐openJiuwen agent-protocol A2A C SDK 客户端开发指南Agent Card 发现、RPC 调用与流式消息openJiuwen agent protocol A2A C SDK 客户端开发指南Agent Card 发现、RPC 调用与流式消息 本篇技术指南以AI Agent人工智能认证鉴权服务注册发现工具调用为什么你控制不了AI绘图和AI视频ArtCraft把提示词变成了手艺为什么你控制不了AI绘图和AI视频ArtCraft把提示词变成了手艺 ArtCraft 是一款自称艺术家专属 IDE的桌面应用把 AI绘图 、 AI视频人工智能AI 应用媒体生成桌面应用30 行代码让你的 Python/JavaScript 程序加入 Agent Mesh原生 SDK 完全教程含浏览器端30 行代码让你的 Python/JavaScript 程序加入 Agent Mesh原生 SDK 完全教程含浏览器端 Agent Mesh 是一个把 A创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考