oaslananka/a2a-mesh
GitHub: oaslananka/a2a-mesh
基于 Google A2A 协议的安全强化 TypeScript 多智能体运行时与注册中心,解决跨框架智能体之间通信的认证、发现、流传输和可观测性等基础设施痛点。
Stars: 5 | Forks: 1
a2a-mesh
用于 Google Agent-to-Agent (A2A) 协议的安全强化 TypeScript 运行时
多智能体 AI 系统缺失的基础设施层。
## 问题所在
每个 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绕过, 网络安全, 自动化攻击, 请求拦截, 轻量级, 隐私保护