Google的A2A智能体群聊

Google的A2A智能体群聊

针对Google的A2A智能体群聊,进行一个基础的Demo演示


1-核心知识点

  • 1-开发一个最简单的A2A大模型demo示例
  • 2-熟悉A2A代码框架和基础使用

2-参考网址


3-动手实操

1-UV环境搭建

shell 复制代码
# 1-uv环境搭建
uv python pin 3.11.4
uv init python_a2a && cd python_a2a
uv venv && source .venv/bin/activate
uv add python-dotenv pydantic

# 2-uv安装requirements.txt
uv python pin 3.11.4
uv venv && source .venv/bin/activate
uv pip install -r requirements.txt
uv add -r requirements.txt

2-A2A项目


3-启动A2A

shell 复制代码
adk web
  • 打印日志
shell 复制代码
(python_a2a) (base) MacBook-Pro:python_a2a rong$ adk web
INFO:     Started server process [31551]
INFO:     Waiting for application startup.

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://127.0.0.1:8000.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

4-访问网址

拷贝控制台的地址:http://127.0.0.1:8000


4-代码说明

目录


项目概述

本项目是一个基于 Google ADK (Agent Development Kit) 的 Agent-to-Agent (A2A) 通信框架示例。通过多代理协作模式,实现了一个智能旅行规划系统,展示了主代理如何与多个子代理协同工作以完成复杂任务。

核心特性

  • 多代理协作:主代理 (Coordinator) 与子代理 (Flight Agent、Hotel Agent) 协同工作
  • 自然语言处理:通过 LLM 理解用户意图并提取结构化信息
  • 分布式任务执行:不同代理专注于特定领域的任务处理
  • 统一状态管理:自动管理会话状态和代理间通信

应用场景

复制代码
用户输入 → 协调员代理 → [航班代理 + 酒店代理] → 综合结果

技术架构

架构分层

复制代码
┌─────────────────────────────────────────────────────────┐
│                    用户交互层                            │
│              (自然语言输入/输出)                         │
└────────────────────┬────────────────────────────────────┘
                     │
┌────────────────────▼────────────────────────────────────┐
│              协调员代理 (Coordinator)                     │
│     • 信息收集与验证                                      │
│     • 任务分发与协调                                      │
│     • 结果聚合与呈现                                      │
└─────┬──────────────────────────┬────────────────────────┘
      │                          │
┌─────▼────────┐         ┌──────▼─────────┐
│  航班代理     │         │   酒店代理      │
│ (Flight Agent)│         │ (Hotel Agent)  │
│              │         │                │
│ • 航班查询   │         │ • 酒店查询     │
│ • 价格计算   │         │ • 房间推荐     │
│ • 时刻匹配   │         │ • 设施展示     │
└──────────────┘         └────────────────┘

技术栈

组件 技术 版本要求 说明
Agent 框架 google-adk ≥1.21.0 Google Agent Development Kit
LLM 集成 lite-llm - 统一的 LLM 接口层
数据验证 pydantic ≥2.12.5 数据模型与验证
环境管理 python-dotenv ≥1.2.1 环境变量加载
代码执行 rawdog-ai ≥0.1.6 动态代码执行 (可选)
Python - ≥3.11.4 运行环境

项目结构

目录树

复制代码
python_a2a/
├── .env                        # 环境变量配置 (API密钥等)
├── .gitignore                  # Git忽略规则
├── pyproject.toml              # 项目元数据与依赖声明
├── requirements.txt            # 简化的依赖列表
├── settings.py                 # 全局配置模块
├── uv.lock                     # 依赖锁定文件 (UV包管理器)
│
├── travel_planner_agent/       # 主应用包
│   ├── agent.py                # 【核心】主协调员代理定义
│   ├── subagents/              # 子代理模块
│   │   ├── flight_agent.py     # 航班查询代理
│   │   └── hotel_agent.py      # 酒店推荐代理
│   └── .adk/
│       └── session.db          # 会话持久化存储
│
└── .venv/                      # Python虚拟环境

关键文件说明

文件 作用 关键点
agent.py 定义协调员代理,整合子代理 导出 root_agent 作为入口
subagents/flight_agent.py 航班查询子代理 导出 flight_agent 实例
subagents/hotel_agent.py 酒店推荐子代理 导出 hotel_agent 实例
settings.py 全局配置,环境变量管理 统一加载 .env
.env 敏感信息存储 不提交到版本控制

环境配置

1. 安装依赖

使用 UV (推荐,快速)
bash 复制代码
# 安装 UV (如果尚未安装)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 同步依赖
uv sync

# 激活虚拟环境
source .venv/bin/activate  # Linux/Mac
# 或
.venv\Scripts\activate     # Windows
使用传统 pip
bash 复制代码
# 创建虚拟环境
python3.11 -m venv .venv

# 激活虚拟环境
source .venv/bin/activate  # Linux/Mac

# 安装依赖
pip install -r requirements.txt

2. 配置环境变量

创建 .env 文件(已包含在项目中):

bash 复制代码
# OpenAI 兼容 API 配置
OPENAI_API_KEY=your_api_key_here
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=openai/gpt-4

# 或使用其他兼容服务 (例如 DeepSeek)
OPENAI_API_KEY=sk-xxxxxxxxxxxx
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_MODEL=openai/deepseek-chat

注意.env 文件已在 .gitignore 中,不会提交到代码仓库

3. 验证安装

python 复制代码
# test_setup.py
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from settings import OPENAI_MODEL

print(f"✓ ADK 已安装")
print(f"✓ 模型配置: {OPENAI_MODEL}")

# 测试模型连接
model = LiteLlm(model=OPENAI_MODEL)
print("✓ 环境配置完成")

核心代码解析

1. 配置管理 (settings.py)

python 复制代码
import os
from pathlib import Path
from dotenv import load_dotenv

# 显式指定 .env 路径,避免路径问题
load_dotenv(Path(__file__).resolve().parent / ".env")

# 导出环境变量
OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL")
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_MODEL = os.getenv("OPENAI_MODEL")

设计原则

  • 单一职责:配置管理独立于业务逻辑
  • 路径安全 :使用 Path 对象确保跨平台兼容
  • 集中管理:所有环境变量统一加载

2. 子代理实现

航班代理 (flight_agent.py)
python 复制代码
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from settings import OPENAI_MODEL

# 初始化模型
openai_model = LiteLlm(model=OPENAI_MODEL)

# 定义航班代理
flight_agent = LlmAgent(
    name="flight_agent",
    model=openai_model,
    description="根据出发地、目的地、旅行日期和预算提供建议的航班。",

    instruction="""
    你是一个航班预订代理。协调员会给你以下信息:
    - 出发地
    - 目的地
    - 起始日期
    - 结束日期
    - 预算金额
    - 预算货币

    返回1-2个模拟航班选项,包括:
    - 航空公司名称
    - 出发和返回日期/时间
    - 价格(以指定货币表示)
    - 班级(经济舱/商务舱)

    确保总价格在预算范围内。
    """
)

关键设计

参数 作用 示例
name 代理的唯一标识 "flight_agent"
model LLM 模型实例 LiteLlm(model="...")
description 功能描述,用于代理发现 "提供建议的航班"
instruction 详细的行为指令 Markdown格式的提示词

酒店代理 (hotel_agent.py)
python 复制代码
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from settings import OPENAI_MODEL

openai_model = LiteLlm(model=OPENAI_MODEL)

hotel_agent = LlmAgent(
    name="hotel_agent",
    model=openai_model,
    description="在给定的旅行日期内找到符合目的地和预算的酒店。",

    instruction="""
    你是一个酒店预订代理。协调员会给你以下信息:
    - 目的地
    - 起始日期
    - 结束日期
    - 预算金额
    - 预算货币

    返回1-2个模拟酒店建议,包括:
    - 酒店名称
    - 每晚价格和总成本(以给定货币表示)
    - 主要设施

    确保总价格符合预算。
    """
)

3. 主协调员代理 (agent.py)

python 复制代码
from datetime import datetime
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from settings import OPENAI_MODEL
from travel_planner_agent.subagents.flight_agent import flight_agent
from travel_planner_agent.subagents.hotel_agent import hotel_agent

load_dotenv()

openai_model = LiteLlm(model=OPENAI_MODEL)
today = datetime.today().date()

# 协调员代理
coordinator_agent = LlmAgent(
    name="TravelCoordinator",
    model=openai_model,
    description="主要的协调员代理,收集旅行偏好并查询子代理。",

    instruction=f"""
    你是一个旅行规划协调员。
    你的任务是从用户那里收集旅行偏好,并与子代理协调,
    提供航班、酒店建议和日程安排。

    步骤1:提取信息
    - 出发地、目的地
    - 起始日期、结束日期 (格式: YYYY-MM-DD)
    - 预算金额、预算货币

    步骤2:处理缺失信息
    - 起始日期缺失:建议使用 {today}
    - 结束日期缺失:根据天数计算
    - 货币缺失:默认为 "USD"

    步骤3:确认信息
    向用户确认旅行偏好

    步骤4:调用子代理
    - `flight_agent` 用于航班建议
    - `hotel_agent` 用于酒店建议

    步骤5:呈现结果
    - 旅行摘要
    - 航班建议
    - 酒店建议
    - 总估算成本
    - 一日行程计划示例
    """,

    sub_agents=[flight_agent, hotel_agent]  # 🔑 关键:子代理列表
)

# 导出根代理 (ADK 框架约定)
root_agent = coordinator_agent

核心机制

  1. sub_agents 参数:声明子代理列表,框架自动处理代理间通信
  2. 模板字符串 :使用 f"{today}" 动态插入当前日期
  3. 导出约定 :必须导出 root_agent 变量作为入口点

运行方式

方式 1:使用 ADK CLI (推荐)

bash 复制代码
# 安装 ADK CLI (如果需要)
pip install google-adk

# 启动交互式会话
adk start travel_planner_agent

# 或者指定配置文件
adk start --config travel_planner_agent/.adk/config.json

方式 2:程序化调用

python 复制代码
# run_agent.py
import asyncio
from google.adk.agents import LlmAgent
from travel_planner_agent.agent import root_agent

async def main():
    # 用户输入
    user_message = """
    我想从北京到上海旅行,从 2025-01-15 到 2025-01-20,
    预算是 5000 元人民币
    """

    # 调用代理
    response = await root_agent.arun(user_message)

    # 输出结果
    print(response.content)

if __name__ == "__main__":
    asyncio.run(main())

方式 3:作为服务运行

python 复制代码
# server.py
from google.adk.server import AgentServer
from travel_planner_agent.agent import root_agent

# 启动 FastAPI 服务器
server = AgentServer(agent=root_agent)
server.run(host="0.0.0.0", port=8000)

然后通过 HTTP 调用:

bash 复制代码
curl -X POST http://localhost:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"message": "帮我计划从纽约到洛杉矶的旅行"}'

扩展开发

添加新的子代理

假设要添加一个"租车代理":

1. 创建新文件 travel_planner_agent/subagents/car_rental_agent.py
python 复制代码
from google.adk.agents import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from settings import OPENAI_MODEL

openai_model = LiteLlm(model=OPENAI_MODEL)

car_rental_agent = LlmAgent(
    name="car_rental_agent",
    model=openai_model,
    description="提供目的地租车服务建议",

    instruction="""
    你是一个租车代理。你会收到:
    - 目的地
    - 起始日期
    - 结束日期
    - 预算

    返回 1-2 个租车选项,包括:
    - 租车公司
    - 车型
    - 每日租金和总价
    - 保险选项
    """
)
2. 修改 agent.py,集成新代理
python 复制代码
from travel_planner_agent.subagents.car_rental_agent import car_rental_agent

coordinator_agent = LlmAgent(
    # ... 其他参数不变 ...

    instruction="""
    ... 现有指令 ...

    步骤4:调用子代理
    - `flight_agent` 用于航班建议
    - `hotel_agent` 用于酒店建议
    - `car_rental_agent` 用于租车建议  # 新增

    步骤5:呈现结果
    ... 现有内容 ...
    - 租车建议  # 新增
    """,

    sub_agents=[flight_agent, hotel_agent, car_rental_agent]  # 添加新代理
)

集成外部 API

使用 工具 (Tools) 扩展代理能力:

python 复制代码
from google.adk.tools import tool

@tool
def search_flights(origin: str, destination: str, date: str) -> dict:
    """调用真实航班 API"""
    # 示例:使用 requests 调用外部 API
    import requests
    response = requests.get(
        "https://api.example.com/flights",
        params={
            "origin": origin,
            "destination": destination,
            "date": date
        }
    )
    return response.json()

# 将工具绑定到代理
flight_agent = LlmAgent(
    name="flight_agent",
    model=openai_model,
    tools=[search_flights],  # 添加工具列表
    instruction="..."
)

数据持久化

ADK 自动将会话状态存储在 .adk/session.db (SQLite)。

自定义持久化配置:

python 复制代码
from google.adk.storage import SQLiteStorage

# 自定义存储路径
storage = SQLiteStorage(db_path="/path/to/custom.db")

coordinator_agent = LlmAgent(
    name="TravelCoordinator",
    model=openai_model,
    storage=storage,  # 注入自定义存储
    # ...
)

最佳实践

1. 提示词工程

python 复制代码
# ✅ 推荐:结构化、清晰的指令
instruction = """
你是航班代理。请按以下步骤操作:

步骤1:解析输入
- 提取出发地、目的地、日期
- 验证日期格式 (YYYY-MM-DD)

步骤2:生成建议
- 返回 2-3 个选项
- 包含价格、时间、航空公司

步骤3:验证预算
- 确保总价不超过预算
"""

# ❌ 避免:模糊、冗长的指令
instruction = "你是一个很棒的航班代理,请帮助用户找到最好的航班..."

2. 代理职责分离

python 复制代码
# ✅ 推荐:单一职责
flight_agent = LlmAgent(name="flight_agent", ...)
hotel_agent = LlmAgent(name="hotel_agent", ...)
car_agent = LlmAgent(name="car_agent", ...)

# ❌ 避免:全能代理
super_agent = LlmAgent(name="super_agent", ...)  # 处理所有任务

3. 错误处理

python 复制代码
from google.adk.agents import LlmAgent
from google.adk.exceptions import AgentError

try:
    response = await root_agent.arun(user_input)
except AgentError as e:
    print(f"代理执行失败: {e}")
    # 实现回退逻辑或用户通知

依赖项详解

核心依赖

toml 复制代码
# pyproject.toml
[project]
name = "python-a2a"
version = "0.1.0"
requires-python = ">=3.11.4"

dependencies = [
    "google-adk>=1.21.0",   # Agent 框架核心
    "pydantic>=2.12.5",     # 数据验证
    "python-dotenv>=1.2.1", # 环境变量
    "rawdog-ai>=0.1.6",     # 代码执行能力
]

依赖关系图

复制代码
python-a2a
├── google-adk (Agent Development Kit)
│   ├── llm-models (LiteLLM 集成)
│   ├── storage (SQLite 持久化)
│   └── communication (Agent 间消息传递)
│
├── pydantic (数据验证)
│   ├── 类型检查
│   └── 序列化/反序列化
│
├── python-dotenv
│   └── .env 文件解析
│
└── rawdog-ai (可选)
    └── 动态代码执行沙箱

常见问题

Q1: 如何切换 LLM 提供商?

修改 .env 文件:

bash 复制代码
# OpenAI
OPENAI_MODEL=openai/gpt-4

# Anthropic Claude
OPENAI_MODEL=anthropic/claude-3-sonnet
OPENAI_BASE_URL=https://api.anthropic.com

# 本地模型 (Ollama)
OPENAI_MODEL=ollama/llama2
OPENAI_BASE_URL=http://localhost:11434

Q2: 代理间如何传递数据?

ADK 框架自动处理。在 instruction 中使用 变量引用

python 复制代码
instruction="""
将以下信息传递给 flight_agent:
- {origin}      # 自动从上下文提取
- {destination}
- {budget}
"""

Q3: 如何调试代理行为?

启用详细日志:

python 复制代码
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger("google.adk")
logger.setLevel(logging.DEBUG)

进阶话题

1. 流式响应

python 复制代码
async for chunk in root_agent.astream("帮我规划旅行"):
    print(chunk.content, end="", flush=True)

2. 并行代理调用

python 复制代码
from google.adk.agents import ParallelAgent

# 并行组
parallel_agent = ParallelAgent(
    name="parallel_search",
    sub_agents=[flight_agent, hotel_agent],
    mode="all"  # 同时调用所有子代理
)

3. 条件路由

python 复制代码
from google.adk.agents import ConditionalAgent

router = ConditionalAgent(
    name="task_router",
    rules={
        "flight": flight_agent,
        "hotel": hotel_agent
    },
    default=coordinator_agent
)

资源链接


总结

A2A 框架通过 代理协作模式 简化了复杂 AI 应用的开发:

优势 说明
模块化 每个代理专注于单一任务
可扩展 轻松添加新的子代理
可维护 代码结构清晰,职责分离
生产就绪 内置持久化、错误处理

通过本指南,你应该能够:

  • ✅ 理解 A2A 架构设计
  • ✅ 创建自己的多代理系统
  • ✅ 集成外部 API 和工具
  • ✅ 部署到生产环境

相关推荐
Lucky高5 小时前
Pandas库实践3_索引
开发语言·python·pandas
Iridescent11215 小时前
Iridescent:Day33
python
傻啦嘿哟5 小时前
Python爬虫进阶:反爬机制突破与数据存储实战指南
开发语言·爬虫·python
2301_764441335 小时前
基于Streamlit构建的风水命理计算器
开发语言·python
@Mr Wang5 小时前
云服务器之使用jupyter运行ipynb文件
服务器·python·jupyter·notebook
Python私教5 小时前
Jupyter是什么?如何安装使用?
ide·python·jupyter
Salt_07285 小时前
DAY 42 图像数据与显存
人工智能·python·机器学习
q_30238195565 小时前
双能突围!能源高效型模型压缩+碳足迹追踪,解锁数据中心与农业AI新价值
人工智能·python·深度学习·能源·课程设计·ai编程
赫凯5 小时前
【强化学习】第三章 马尔可夫决策过程
python·算法