Rust 语言的 Agent2Agent (A2A) 协议 SDK,完整实现 v0.3.0 规范的 Client/Server、gRPC 传输与可插拔任务存储
ra2a 是 Rust 语言实现的 Agent2Agent (A2A) 协议 SDK,由社区开发者 qntx 维护。A2A 是 Linux 基金会托管的开放标准,用于 AI Agent 之间的互操作通信,与 MCP(agent-to-tool)互补。
项目性质#
非官方 A2A 协议 SDK(社区实现);官方 A2A SDK 为 Python/JavaScript/Java/C#/.NET/Golang。
核心能力#
- 完整实现 A2A v0.3.0 协议规范的 11 个 JSON-RPC 方法
- 事件驱动服务端:
AgentExecutor → EventQueue → RequestHandler管道 - 可组合 Axum handlers(
a2a_router),用户控制路由、监听器、TLS 和中间件 - Transport-agnostic 客户端,带
CallInterceptor中间件和自动流式回退 - gRPC 传输支持(通过 tonic/prost)
- Push Notification 配置与 HMAC-SHA256 验证
- 可插拔 SQL 任务存储(PostgreSQL/MySQL/SQLite)
组件结构#
| Crate | 说明 |
|---|---|
ra2a | 主 SDK — Client、Server、Types、gRPC、任务存储 |
ra2a-ext | 扩展包 — ExtensionActivator、MetadataPropagator 拦截器(WIP) |
JSON-RPC 方法支持#
| 方法 | 说明 |
|---|---|
message/send | 发送消息,接收 Task 或 Message |
message/stream | 发送消息,接收 SSE 事件流 |
tasks/get | 按 ID 获取任务(可选历史) |
tasks/list | 分页/过滤列出任务 |
tasks/cancel | 请求取消任务 |
tasks/resubscribe | 重新连接到进行中任务的事件流 |
tasks/pushNotificationConfig/* | Push Notification Webhook CRUD |
agent/getAuthenticatedExtendedCard | 获取认证扩展 Agent Card |
Feature Flags#
| Feature | 默认 | 说明 |
|---|---|---|
client | yes | HTTP/JSON-RPC 客户端、SSE 流式、card resolver、拦截器 |
server | yes | 可组合 Axum handlers、事件队列、任务生命周期、SSE 流式 |
grpc | — | gRPC 传输(需 protobuf 编译器) |
telemetry | — | OpenTelemetry tracing spans 和 metrics |
postgresql / mysql / sqlite | — | SQL 任务存储(通过 sqlx) |
full | — | 全部功能 |
安全模型#
支持 5 种与 OpenAPI 3.0 对齐的安全方案:
| 方案 | 说明 |
|---|---|
| API Key | Header/Query/Cookie 中的静态密钥 |
| HTTP Auth | Bearer token 或 Basic 认证 |
| OAuth 2.0 | Authorization code、Client credentials、Device code、Implicit flows |
| OpenID Connect | OIDC 发现式认证 |
| Mutual TLS | 客户端证书认证 |
分层架构#
| Layer | Key types | Role |
|---|---|---|
| Server | AgentExecutor, EventQueue, DefaultRequestHandler | 事件驱动 Agent 执行;可组合 Axum handlers |
| Client | Client, Transport, CallInterceptor | Transport-agnostic 客户端,带中间件 |
| Types | AgentCard, Task, Message, Event | A2A v0.3.0 类型定义 |
| Storage | TaskStore, PushConfigStore | 可插拔持久化 |
| gRPC | GrpcTransport, GrpcServiceImpl | 替代传输(tonic/prost) |
任务生命周期#
9 个状态,终端状态为 Completed / Failed / Canceled / Rejected:
Submitted → Working → Completed
→ Failed
→ Canceled
→ Rejected
Input Required ←→ Working
Auth Required ←→ Working
Unknown (初始/查询状态)
Agent Discovery#
Agent 在 /.well-known/agent-card.json 发布 AgentCard,描述身份、能力、技能、传输和安全要求。
安装配置#
# 基础安装(client + server 默认启用)
ra2a = "0.8"
# 仅客户端
ra2a = { version = "0.8", default-features = false, features = ["client"] }
# 带 PostgreSQL 和遥测
ra2a = { version = "0.8", features = ["server", "postgresql", "telemetry"] }
# 全功能
ra2a = { version = "0.8", features = ["full"] }
服务端示例#
use ra2a::{
server::{AgentExecutor, Event, EventQueue, RequestContext, ServerState, a2a_router},
types::{AgentCard, Message, Part, Task, TaskState, TaskStatus},
};
struct EchoAgent;
impl AgentExecutor for EchoAgent {
fn execute<'a>(
&'a self, ctx: &'a RequestContext, queue: &'a EventQueue,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'a>> {
Box::pin(async move {
let input = ctx.message.as_ref()
.and_then(ra2a::Message::text_content)
.unwrap_or_default();
let mut task = Task::new(&ctx.task_id, &ctx.context_id);
task.status = TaskStatus::with_message(
TaskState::Completed,
Message::agent(vec![Part::text(format!("Echo: {input}"))]),
);
queue.send(Event::Task(task))?;
Ok(())
})
}
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
let card = AgentCard::new("Echo Agent", "http://localhost:8080");
let state = ServerState::from_executor(EchoAgent, card);
let app = axum::Router::new().merge(a2a_router(state));
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await?;
axum::serve(listener, app).await
}
客户端示例#
use ra2a::{
client::Client,
types::{Message, MessageSendParams, Part, SendMessageResult},
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::from_url("http://localhost:8080")?;
let msg = Message::user(vec![Part::text("Hello!")]);
let result = client.send_message(&MessageSendParams::new(msg)).await?;
Ok(())
}
适用场景#
- 构建 A2A 协议兼容的 Rust Agent 服务端
- 实现 A2A 协议客户端连接远程 Agent
- 需要高性能、内存安全的 Agent 间通信基础设施
- 多 Agent 协作系统中的任务编排与状态管理
待确认信息#
| 项目 | 状态 | 说明 |
|---|---|---|
| v1.0 协议支持 | 待确认 | README 说明 v1.0 尚未正式发布,将在发布后跟进 |
| 独立安全审计 | 未进行 | README 明确声明未经独立审计 |
| ra2a-ext 完整度 | WIP | README 标注 ra2a-ext 为 Work In Progress |
| docs.rs 最新版构建 | 失败 | docs.rs 显示 0.8.0 构建失败,最近成功构建为 0.4.0 |