多代理客户服务系统-A2A ADK MCP实现
概述
该项目使用谷歌的代理开发工具包(ADK)实现了一个多代理客户服务系统,该工具包具有代理到代理(A2A)通信协议和模型上下文协议(MCP)用于数据库访问。
系统架构
组件
- MCP服务器 (端口8000)
- 在SQLite数据库上提供HTTP API层 - 处理客户帐户和支持票的CRUD操作
- 客户信息代理 (端口9300)
- 专注于数据检索和客户记录管理 - 执行查找、更新和复杂查询
- 支持专家代理 (9301端口)
- 处理客户服务咨询 - 创建和管理具有优先级的支持票
- 编排代理 (端口9400)
- 用户请求的主要入口点 - 将查询发送给适当的专业代理 - 协调多代理工作流
文件结构
project/
├── a2a_patch.py # Compatibility patch for A2A client
├── agent_definitions.py # Agent configurations and capabilities
├── client_runner.py # Test client and integration test suite
├── database_utility.py # SQLite connection utilities
├── mcp_server.py # MCP HTTP server implementation
├── server_launcher.py # Multi-server orchestration
├── service_tools.py # MCP tool wrappers for agents
├── main.py # Main entry point
├── .env # Environment variables (GEMINI_API_KEY)
└── service_db.sqlite # SQLite database (auto-created)先决条件
必需的Python包
pip install google-adk
pip install a2a
pip install httpx
pip install uvicorn
pip install starlette
pip install python-dotenv
pip install nest-asyncio
pip install pandas # Optional, for database inspection环境变量
创建一个 .env 项目根目录中的文件:
GEMINI_API_KEY=your_gemini_api_key_here安装
- 将所有项目文件克隆或下载到一个目录
- 安装所需的软件包(请参阅先决条件)
- 创建
.env使用GEMINI_API_KEY文件 - 确保所有Python文件都在同一目录中
运行系统
选项1:命令行
python main.py这将:
- 使用种子数据初始化SQLite数据库
- 启动所有四台服务器(MCP+3个A2A代理)
- 自动运行集成测试套件
- 保持服务器运行直到中断(Ctrl+C)
选项2:Jupyter笔记本
在提供的笔记本中按顺序运行单元格,以便逐步执行和更好的输出可视化。
测试场景
该系统包括5个集成测试用例:
- 简单数据检索
- 按ID获取完整的客户记录 - 测试基本代理路由和工具使用情况
- 协调服务请求
- 客户要求服务升级 - 测试多代理协调和工单创建
- 复杂过滤查询
- 列出有未结票证的活动帐户 - 测试需要多个工具调用的多步骤查询
- 高优先级票证记录
- 带有退款请求的紧急账单问题 - 测试优先级检测和高紧急票创建
- 多步记录更新
- 更新客户电子邮件并检索票务历史记录 - 测试顺序操作和错误处理
数据库模式
客户_帐户
- 标识符(主键)
- full_name
- contact_电子邮件
- 联系电话
- account_status
- creation_timestamp
- 最后修改时间戳
支持票
- ticket_id(主键)
- account_id(外键)
- 描述
- 状态
- 优先级(低/中/高)
- 提交时间戳
API终点
MCP服务器(http://127.0.0.1:8000)
- GET/tools-列出可用操作
- POST/call-执行数据库操作
代理服务器
- GET/.knowledge/agent-card.json-代理能力卡
- POST/-向代理发送消息(A2A协议)
可用的MCP工具
- fetch_customer_data(customer_id:int)
- 按ID检索客户帐户
- search_customer_accounts(account_status:str,result_limit:int)
- 按状态搜索帐户(活动/禁用)
- modify_customer_record(customer_id:int,update_payload:str)
- 更新客户字段(需要JSON字符串)
- register_support_issue(客户id:int,查询描述:str,紧急级别:str)
- 创建新的支持票
- retrieve_customer_history(customer_id:int)
- 为客户获取所有门票
