oaslananka/a2a-mesh

GitHub: oaslananka/a2a-mesh

基于 Google A2A 协议的安全强化 TypeScript 多智能体运行时与注册中心,解决跨框架智能体之间通信的认证、发现、流传输和可观测性等基础设施痛点。

Stars: 5 | Forks: 1

a2a-mesh

用于 Google Agent-to-Agent (A2A) 协议的安全强化 TypeScript 运行时

多智能体 AI 系统缺失的基础设施层。

npm version npm downloads Coverage License A2A Protocol Node.js

## 问题所在 每个 AI 框架都有自己的一套让智能体相互通信的方式。要让一个 LangChain 智能体通过 HTTP 将工作委派给一个由 OpenAI 支持的智能体,通常意味着要从头重建传输、认证、重试、流传输、任务状态、发现和可观测性。 **Google 的 A2A 协议** 定义了线上标准。`a2a-mesh` 是使其在实际构建中变得可行的运行时、注册中心和集成工具包。 ## 您将获得 | 能力 | 详情 | | ----------------------------- | ----------------------------------------------------------------------------------------------------------- | | **A2A 协议 v1.0 运行时** | JSON-RPC 处理、SSE 流传输、推送通知、健康检查端点、智能体卡片 | | **多框架适配器** | OpenAI、Anthropic、LangChain、Google ADK、LlamaIndex、CrewAI HTTP 桥接 | | **注册中心控制平面** | 智能体发现、能力匹配、健康轮询、SSE 注册中心更新、Redis 后端 | | **安全控制** | 经过验证的 JWT/JWKS 和 API 密钥认证、类型化的请求上下文、感知租户的任务访问、SSRF 和来源策略 | | **可观测性** | OpenTelemetry span 钩子、结构化审计日志、注册中心指标、Grafana 和告警制品 | | **网络弹性** | 重试、指数退避、抖动、超时、断路器原语 | | **传输扩展** | 目前的 WebSocket 传输包,实验性的 gRPC 传输包 | | **测试工具集** | `A2ATestServer`、`MockA2AClient`、测试固件、匹配器、集成测试 | | **脚手架 CLI** | 用于新智能体和多智能体入门套件的 `pnpm dlx create-a2a-mesh` | ## 30 秒试用 ``` pnpm dlx create-a2a-mesh demo cd demo pnpm install pnpm run dev ``` 然后发送一个任务: ``` curl -s -X POST http://localhost:3000/rpc \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":"1","method":"message/send","params":{"message":{"role":"user","messageId":"m1","timestamp":"2026-04-06T00:00:00.000Z","parts":[{"type":"text","text":"Hello agent!"}]}}}' ``` 您将看到一个任务通过 A2A 运行时被立即创建、完成并返回。 ## 快速入门 要获取一个真正的多智能体入门套件: ``` pnpm dlx create-a2a-mesh my-team --adapter pack-research-team cd my-team cp .env.example .env # 添加 OPENAI_API_KEY 到 .env pnpm install pnpm run dev ``` 此套件会启动一个本地注册中心以及多个通过 A2A 连接在一起的智能体。原始注册中心目录可在 `http://localhost:3099/agents` 获取。 ### 或手动安装 ``` pnpm add a2a-mesh ``` ``` import { A2AServer, type AgentCard, type Artifact, type Message, type Task } from 'a2a-mesh'; const card: AgentCard = { protocolVersion: '1.0', name: 'My Agent', description: 'Does one thing well', url: 'http://localhost:3001', version: '1.0.0', capabilities: { streaming: true, pushNotifications: false, stateTransitionHistory: true, }, skills: [ { id: 'hello', name: 'Hello', description: 'Says hello back', tags: ['demo'], inputModes: ['text'], outputModes: ['text'], }, ], defaultInputModes: ['text'], defaultOutputModes: ['text'], securitySchemes: [], }; class MyAgent extends A2AServer { constructor() { super(card); } async handleTask(_task: Task, message: Message): Promise { const text = message.parts.find((part) => part.type === 'text'); return [ { artifactId: 'reply-1', parts: [ { type: 'text', text: `Hello from a2a-mesh. You said: ${text?.type === 'text' ? text.text : ''}`, }, ], index: 0, lastChunk: true, }, ]; } } new MyAgent().start(3001); console.log('Agent running at http://localhost:3001'); ``` ## 框架适配器 ``` // OpenAI import OpenAI from 'openai'; import { OpenAIAdapter } from 'a2a-mesh-adapters'; class MyOpenAIAgent extends OpenAIAdapter { constructor() { super(card, new OpenAI({ apiKey: process.env.OPENAI_API_KEY }), 'gpt-5-mini'); } } // Anthropic Claude import Anthropic from '@anthropic-ai/sdk'; import { AnthropicAdapter } from 'a2a-mesh-adapters'; class MyClaudeAgent extends AnthropicAdapter { constructor() { super( card, new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY }), 'claude-sonnet-4-20250514', ); } } // LangChain import { LangChainAdapter } from 'a2a-mesh-adapters'; const runnable = { async invoke(input: unknown) { return JSON.stringify(input); }, }; class MyLangChainAgent extends LangChainAdapter { constructor() { super(card, runnable); } } ``` ## MCP 桥接 将任何 A2A 智能体暴露为 MCP 工具: ``` import { createMcpToolFromAgent, handleA2AMcpToolCall } from 'a2a-mesh-mcp-bridge'; const config = { agentUrl: 'http://localhost:3001', name: 'researcher', description: 'Searches and summarizes web content.', }; const tool = createMcpToolFromAgent(config); const result = await handleA2AMcpToolCall(config, { message: 'Summarize the latest A2A protocol changes.', }); ``` 将 MCP 工具定义包装为可通过 A2A 发现的技能: ``` import { createA2ASkillFromMcpTool } from 'a2a-mesh-mcp-bridge'; const skill = createA2ASkillFromMcpTool(tool, { tags: ['search', 'mcp'], inputModes: ['json'], }); ``` ## 架构 ``` ┌──────────────────── Control Plane ────────────────────┐ │ Registry UI │ │ Topology · Live task stream · Health · Search │ └────────────────────────────┬───────────────────────────┘ │ SSE / HTTP ┌──────▼──────┐ │ Registry │ ← InMemory or Redis │ :3099 │ └──┬──────┬───┘ │ │ Register +│ │Search / heartbeats │ │ ┌────────▼──┐ ┌▼────────────┐ │ Agent A │ │ Agent B │ │ :3001 │◄─► :3002 │ └───────────┘ └─────────────┘ │ │ MCP bridge OpenAI / Anthropic / LangChain / ADK / ... ``` ## 软件包 | 包 | 状态 | 描述 | | --------------------- | -------- | ---------------------------------------------------------------------------- | | `a2a-mesh` | npm | 核心运行时:服务器、客户端、认证、遥测、存储 | | `a2a-mesh-adapters` | npm | 适用于 OpenAI、Anthropic、LangChain、ADK、CrewAI、LlamaIndex 的框架适配器 | | `a2a-mesh-registry` | npm | 带有发现、健康轮询、SSE 更新的注册中心服务器 | | `a2a-mesh-cli` | npm | 用于发现、验证、发送、监控和脚手架的 CLI | | `create-a2a-mesh` | npm | 项目脚手架生成器 | | `a2a-mesh-client` | monorepo | 目前保留在代码库中的独立客户端接口 | | `a2a-mesh-testing` | monorepo | 测试辅助工具、固件和匹配器 | | `a2a-mesh-mcp-bridge` | monorepo | MCP ↔ A2A 桥接,已为 npm 发布做好准备 | | `a2a-mesh-ws` | monorepo | 实验性 WebSocket 传输 | | `a2a-mesh-grpc` | monorepo | 实验性 gRPC 传输 | ## 部署 **Docker Compose** 可在本地运行注册中心、演示智能体、Redis 和 Jaeger: ``` docker compose up ``` 有关涵盖 Docker、Kubernetes、Cloud Run、Railway 以及无需 GitHub Actions 即可发布文档站点的手动部署指南,请参见 [docs/deployment.md](./docs/deployment.md)。 ## 贡献 请参见 [CONTRIBUTING.md](./CONTRIBUTING.md)。请使用 Conventional Commits,并在提交 PR 之前运行本地验证套件。 ## 许可证 Apache 2.0 — 参见 [LICENSE](./LICENSE)。
标签:A2A协议, Agent-to-Agent, AI基础设施, API网关, API集成, GitHub Advanced Security, GNU通用公共许可证, Google A2A, IP 地址批量处理, JSON-RPC, LangChain, MCP桥接, MITM代理, Node.js, NPM包, OpenAI, OSV-Scalibr, PyRIT, Python工具, Redis发现, SSE, TypeScript运行时, 人工智能, 内存规避, 可观测性, 基础设施层, 多智能体协同, 多智能体系统, 安全加固, 开源框架, 微服务通信, 持续集成, 搜索引擎查询, 服务注册与发现, 流式传输, 用户代理, 用户模式Hook绕过, 网络安全, 自动化攻击, 请求拦截, 轻量级, 隐私保护