%E2%80%94%E2%80%94%E9%A1%B9%E7%9B%AE%E6%8A%80%E6%9C%AF%E6%A0%88%E5%92%8C%E9%80%9A%E4%BF%A1%E6%B5%81%E7%A8%8B/image.png)
#adkhackathon
🎯 项目概述
目标: 构建一个数据提供者Agent,支持双接口架构:
- 人机交互: ADK Web UI (给人用)
- 机器间通信: A2A协议 (给其他Agent调用)
🏗️ 技术栈架构
核心组件
┌─────────────────────────────────────────────────────────────┐
│ Provider Agent 项目 │
├─────────────────────────────────────────────────────────────┤
│ ADK层 (Agent Development Kit) │
│ ├── Agent: 业务逻辑 + 工具调用 │
│ ├── Tools: scan_data, match_request, provide_access │
│ └── Model: LiteLLM (避免Vertex AI收费) │
├─────────────────────────────────────────────────────────────┤
│ A2A层 (Agent-to-Agent Protocol) │
│ ├── Agent Card: 能力声明 │
│ ├── Request Handler: 协议转换 │
│ └── Task Store: 状态管理 │
├─────────────────────────────────────────────────────────────┤
│ 服务层 │
│ ├── ADK Web UI: http://localhost:8000 (人用) │
│ └── A2A API: http://localhost:9000/a2a_api (Agent用) │
└─────────────────────────────────────────────────────────────┘
技术选型
- ADK: Google Agent Development Kit v1.0 (Agent框架)
- A2A: Agent-to-Agent Protocol v0.2 (Agent间通信标准)
- LiteLLM: 多模型支持 (避免收费,支持100+模型)
- Starlette: Web框架 (A2A服务基础)
- Uvicorn: ASGI服务器
📡 通信流程详解
1. Agent发现流程 (A2A协议核心)
sequenceDiagram
participant C as Consumer Agent
participant P as Provider Agent
participant AC as Agent Card
Note over C,P: 阶段1: 服务发现
C->>P: GET /.well-known/agent.json
P->>AC: 读取Agent Card
AC->>P: 返回能力信息
P->>C: Agent Card (JSON)
Note over C: 解析Provider能力
Note over C: - 支持的技能
Note over C: - 输入输出格式
Note over C: - API端点信息
Agent Card 内容示例:
{
"name": "Data Sharing Provider Agent",
"url": "http://localhost:9000/a2a_api",
"skills": [
{
"id": "scan_local_data",
"name": "Scan Local Data",
"examples": ["What datasets do you have?"]
},
{
"id": "match_data_request",
"name": "Match Data Request",
"examples": ["I need sales data for Q2"]
}
],
"capabilities": {"streaming": true}
}
2. 任务执行流程 (A2A + ADK协作)
sequenceDiagram
participant CA as Consumer Agent
participant A2A as A2A Handler
participant EXE as Agent Executor
participant ADK as ADK Agent
participant TOOL as Tool Implementation
Note over CA,TOOL: 阶段2: 任务执行
CA->>A2A: POST /a2a_api/<br/>{"message": "What data do you have?"}
A2A->>EXE: DefaultRequestHandler.execute()
EXE->>ADK: ProviderAgentExecutor → ADK Agent
Note over ADK: LLM分析请求<br/>决定调用scan_local_data工具
ADK->>TOOL: scan_local_data("all datasets")
TOOL->>TOOL: 扫描本地文件系统
TOOL->>ADK: {"datasets": ["sales.csv", "users.json"]}
Note over ADK: LLM生成友好回复
ADK->>EXE: "I found 2 datasets: sales.csv and users.json"
EXE->>A2A: Agent响应
A2A->>CA: {"result": {"text": "I found 2 datasets..."}}
3. 流式响应流程 (长任务处理)
sequenceDiagram
participant CA as Consumer Agent
participant A2A as A2A Streaming
participant QUEUE as Event Queue
participant ADK as ADK Agent
CA->>A2A: POST /message/stream
A2A->>QUEUE: 创建事件队列
A2A->>ADK: 异步执行任务
loop 处理进度
ADK->>QUEUE: enqueue_event("正在扫描...")
QUEUE->>A2A: 获取事件
A2A->>CA: {"content": "正在扫描..."}
ADK->>QUEUE: enqueue_event("找到3个文件...")
QUEUE->>A2A: 获取事件
A2A->>CA: {"content": "找到3个文件..."}
end
ADK->>QUEUE: enqueue_event("扫描完成", final=true)
QUEUE->>A2A: 获取最终事件
A2A->>CA: {"content": "扫描完成", "final": true}
🔄 内部数据流转
ADK Agent内部流程
用户请求 → LLM理解 → 选择工具 → 执行工具 → LLM整合 → 返回结果
↓ ↓ ↓ ↓ ↓ ↓
"找数据" → 分析意图 → scan_data → 扫描文件 → 格式化 → "找到3个数据集"
A2A协议处理流程
HTTP请求 → JSON解析 → A2A验证 → 转发给Executor → ADK处理 → 格式化响应 → HTTP返回
↓ ↓ ↓ ↓ ↓ ↓ ↓
POST / → message → 协议检查 → Agent调用 → 工具执行 → A2A格式 → JSON响应
💎 A2A协议的核心价值
1. 标准化通信
- 问题: 每个Agent都有自己的API格式,无法互通
- 解决: A2A提供统一的消息格式和发现机制
- 价值: Agent间可以像微服务一样组合
2. 服务发现机制
# 不用A2A - 硬编码集成
weather_response = requests.post("http://weather-service/api/v1/get",
json={"city": "Munich"})
# 使用A2A - 自动发现
agent_card = discover_agent("http://weather-agent/.well-known/agent.json")
if "weather_query" in agent_card.skills:
response = a2a_client.send_message("What's weather in Munich?")
3. 协议层抽象
- 底层: 各种Agent用不同技术栈 (ADK, LangChain, CrewAI…)
- A2A层: 统一的消息协议
- 价值: 技术栈无关,可以混合使用
4. 实际应用场景
企业数据流水线
数据请求 → 路由Agent → 发现Provider → 数据获取 → 处理Agent → 结果返回
多Agent协作示例
用户: "帮我分析慕尼黑的房价趋势"
主Agent → 发现房价数据Agent (Provider) → 获取数据
→ 发现分析Agent → 数据分析
→ 发现可视化Agent → 生成图表
→ 整合结果返回用户
5. 与传统API的对比
| 维度 | 传统REST API | A2A协议 |
|---|---|---|
| 发现 | 手动配置 | 自动发现(.well-known/agent.json) |
| 格式 | 各自定义 | 标准化message格式 |
| 能力 | 静态文档 | 动态Agent Card |
| 交互 | 请求-响应 | 支持流式、状态管理 |
| 语义 | 低级API调用 | 高级意图理解 |
🛠️ 项目实现细节
关键文件结构
provider-agent/
├── __main__.py # 主服务启动 (A2A + 路由)
├── agent.py # ADK标准Agent (给adk web用)
├── provider_agent/
│ ├── provider_agent.py # ADK Agent配置 (LiteLLM)
│ ├── provider_agent_executor.py # A2A执行器
│ └── provider_tools.py # 业务工具实现
└── .env # 环境配置 (API Keys)
启动顺序
- 设置环境变量 (.env文件)
- 启动A2A服务:
python __main__.py(端口9000) - 启动ADK UI:
adk web(端口8000) - 测试两个接口:
- 人工测试: http://localhost:8000
- Agent测试: http://localhost:9000/a2a_api
重要概念理解
ADK Agent vs A2A Executor
- ADK Agent: 真正的AI逻辑,处理LLM交互和工具调用
- A2A Executor: 协议适配器,将A2A消息转换为ADK调用
Agent Card vs Agent实例
- Agent Card: 静态能力声明,给其他Agent看的"简历"
- Agent实例: 运行时的实际AI,处理具体请求
🚀 扩展方向
水平扩展 (更多Agent)
Provider Agent ←→ Consumer Agent ←→ Analysis Agent ←→ Visualization Agent
垂直扩展 (更多工具)
# 在ADK Agent中添加更多工具
tools=[
scan_local_data,
match_data_request,
provide_data_access,
# 新增工具
validate_data_quality,
encrypt_sensitive_data,
log_access_audit
]
协议升级
- A2A v0.3: 支持更复杂的认证
- 状态同步: 多Agent间共享上下文
- 编排模式: 工作流定义
🎯 关键要点总结
- A2A = Agent间的HTTP协议标准
- ADK = 单个Agent的开发框架
- 两者结合 = 可组合的Agent生态系统
- 核心价值 = 标准化 + 自动发现 + 协作能力
- 实际应用 = 企业级Agent网络,像微服务但更智能
记住:A2A不是炒概念,而是解决Agent孤岛问题的实用协议!