订单副本——多代理支持编排器(ADK+A2A+MCP)
一种生产风格的企业代理顶点,展示了Gemini驱动的根编排器如何通过A2A委托给远程子代理,调用自定义工具(包括长时间运行的暂停/恢复流),并桥接到MCP(模型上下文协议)以进行外部访问。它附带了Dev UI、跟踪/事件、一个小型评估集和Docker/Cloud运行路径。
Track:企业代理
原因:客户支持需要一名助理负责产品、合规性、运输ETA和异步风险扫描
如何:ADK根剂⇄ A2A子代理+本地工具+MCP网桥
价值:明确的路由、模块化所有权、最低权限边界和云就绪部署
🚀 问题→ 解决方案→ Value
问题 支持团队会回答一系列问题:产品(库存/价格)、合规性(如增值税)、运输ETA和长期风险扫描。
解决方案 根LLM代理(support_orchetrator)路由到正确的功能:
产品→ 产品目录代理(A2A)
合规→ 合规代理(A2A)
发货预计到达时间→ shipping_ta(自定义工具)
风险扫描→ start_risk_scan/resume_risk_scan(长时间运行)
本地笔记(演示)→ mcp_fetch_file_note(mcp网桥存根)
价值 每个功能的独立可演化性(版本、规模、治理),具有可观察性和评估挂钩。
🧱 仓库布局 adk顶石/ ├─ README.md ├─ 需求.txt ├─ .env.example#安全模板(无秘密) ├─ Dockerfile.root#根代理映像 ├─ Dockerfile.catalog#产品目录A2A服务 ├─ Dockerfile.comcompliance#合规A2A服务 ├─ 订单_飞行员/ │ ├─ root_agent.yaml#告诉开发人员UI要运行哪个根代理 │ ├─ 代理商/ │ │ ├─ support_oarchstrator.py │ │ └─ __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├─ 服务器/ │ │ ├─ product_catalog_server.py#A2A@:8001 │ │ ├─ 合规性_服务器.py#A2A@:8002 │ │ └─ __初始化__南美国家巴拉圭的缩写(Paraguay) │ ├─ 工具/#(可选存根:ETA、长期、MCP) │ ├─ eval/ │ │ ├─ evalset.yaml │ │ └─ cases.jsonl │ └─ __初始化__南美国家巴拉圭的缩写(Paraguay) └─ 脚本/ ├─ run_catalog.ps/run_catalog.sh ├─ run_compliance.ps/run_comployance.sh └─ run_devui.ps1/run_devue.sh
🧩 架构与交互 +------------------------------+A2A(HTTP/代理卡)+---------------------------+ |根LLM代理|───────────────────────────▶ | 产品目录代理| |support_oarcher ||-get_product_info()| |(Gemini 2.5 Flash Lite)◀─────────────────────────── | - 代理卡@:8001| | | +---------------------------+ |工具:shipping_eta()| |start_risk_scan()|A2A(HTTP/代理卡)+---------------------------+ |结果风险扫描▶ | 合规代理| |mcp_fetch_file_note()||-check_country_vat()| | | ◀─────────────────────────── | - 代理卡@:8002| |开发UI:跟踪/事件/图形|+---------------------------+ |MCP桥(演示存根)─────────▶ 文件系统/未来的MCP提供者(Jira、Drive、DB) +------------------------------+
亮点
AUTO工具调用让Gemini选择正确的工具/代理,然后根将结果总结为友好的答案。
A2A将子代理隔离到单独的服务中(自己的生命周期和规模)。
长时间运行的扫描返回一个令牌;稍后,继续 完成。
MCP演示展示了如何通过协议边界安全地访问本地/外部系统。
✅ 特征检查表(课程评价标准)
多代理系统:根LLM+两个远程A2A子代理
工具:自定义(ETA,长时间运行)+MCP桥接存根
长时间运行的操作:带令牌的start_risk_scan/resumme_risk_scan
会话和状态:开发UI会话+内存令牌缓存
可观察性:跨工具和A2A调用的开发UI事件/图形/跟踪
评估:order_copilot/eval/{evalset.yaml,cases.jsonl}
A2A协议:通过代理卡暴露和消费的子代理
部署:Docker构建/运行;下面的可选云运行部分
📦 入门指南
回复:https://https://sanikacentric/KAGGLE-ADK-CAPSTONE-A2A-MCP-多代理/树/主
- 克隆与环境
git clone https://github.com/sanikacentric/KAGGLE-ADK-CAPSTONE-A2A-MCP-Multiagent.git cd KAGGLE-ADK-CAPSTONE-A2A MCP多药/ADK CAPSTONE
创建虚拟环境并安装deps:
macOS/Linux
python-m venv.venv source.ven/bin/activate pip安装-r要求.txt
Windows(PowerShell)
python-m venv.venv ..venv\\Scripts\\Activate.ps1 pip安装-r要求.txt
复制env模板并设置密钥:
cp.env.example.env
编辑.env以设置:
GOOGLE_API_键=
目录_基础\_ URL=http://127.0.0.1:8001
合规性_基本要求=http://127.0.0.1:8002
- 运行A2A子代理(两个终端)
产品目录@8001
macOS/Linux
source.ven/bin/activate export GOOGLE_API_KEY=“\” python-m uvicon“order_copilot.servers.product_catalog_server:app”--主机127.0.0.1-端口8001--应用程序目录。
视窗
..venv\\Scripts\\Activate.ps1 $env:GOOGLE_API_KEY=“\” python-m uvicon“order_copilot.servers.product_catalog_server:app”--主机127.0.0.1-端口8001--应用程序目录。
合规@8002
macOS/Linux
source.ven/bin/activate export GOOGLE_API_KEY=“\” python-m uvicorn“order_copilot.servers.compliance_server:app”--主机127.0.0.1--端口8002--应用程序目录。
视窗
..venv\\Scripts\\Activate.ps1 $env:GOOGLE_API_KEY=“\” python-m uvicorn“order_copilot.servers.compliance_server:app”--主机127.0.0.1--端口8002--应用程序目录。
健康检查代理卡
curl-sIhttp://127.0.0.1:8001/.well-已知/代理卡json|head-n1 curl-sIhttp://127.0.0.1:8002/.well-已知/代理卡json|head-n1
预计HTTP/1.1 200可以
- 运行ADK开发UI(第三终端)
macOS/Linux
source.ven/bin/activate export GOOGLE_API_KEY=“\” 导出目录_BASE_URL=“http://127.0.0.1:8001" 导出合规性_BASE_URL=“http://127.0.0.1:8002" adk网络。
视窗
..venv\\Scripts\\Activate.ps1 $env:GOOGLE_API_KEY=“\” $env:CATALOG_BASE_URL=“http://127.0.0.1:8001" $env:COMPLIANCE_BASE_URL=“http://127.0.0.1:8002" adk网络。
打开http://127.0.0.1:8000聊天。
- 演示提示
产品(A2A)
“iPhone 15 Pro有现货吗?”
“iPhone 15 Pro的价格/规格?”
“戴尔XPS 15有现货吗?”
“索尼WH-1000XM5的价格是多少?”
合规性(A2A)
“检查比利时的增值税:BE01234567”
“增值税BE01234567在比利时有效吗?”
发货预计到达时间(工具)
“到07001的预计发货时间是什么时候?”
“预计交货时间为90210。”
长时间运行(工具)
“扫描订单ORD-42”→ 返回一个令牌
“简历 “或”最后继续“
MCP(演示存根)
“获取note./notes/todo.txt”
🔎 可观测性
使用开发人员UI→ 事件/图表/跟踪以查看每个工具调用、A2A跳和最终LLM摘要。日志在您交互时显示会话ID和服务器运行状况。
🧪 评估
小烟雾测试eval按顺序运行_copilot/eval。
文件
cases.jsonl--提示+预期的文本片段
evalset.yaml——ADK评估定义
跑
adk评估顺序_copilot/eval/evalset.yaml
🐳 Docker(本地镜像)
从repo根构建映像:
根代理(开发UI运行器)
docker build-f Dockerfile.root-t ordercopilot/root:local。
A2A子代理
docker build-f Dockerfile.catalog-t ordercopilot/catalog:local。 docker build-f Dockerfile.comcompliance-t ordercopilot/compliance:本地。
运行容器:
产品目录@8001
docker运行--rm-p 8001:8001 \ -e GOOGLE_API_KEY=$GOOGLE-API_KEY \ 订单副本/目录:本地
合规@8002
docker运行--rm-p 8002:8002 \ -e GOOGLE_API_KEY=$GOOGLE-API_KEY \ 订单副本/合规性:本地
开发UI/根代理@8000
docker运行--rm-p 8000:8000 \ -e GOOGLE_API_KEY=$GOOGLE-API_KEY \ -e目录_基本信息_URL=http://host.docker.internal:8001 \ -e合规_基础_URL=http://host.docker.internal:8002 \ ordercopilot/root:本地
在Linux上,将host.docker.internal替换为您的主机IP(例如172.17.0.1),或在共享docker网络中运行所有三个。
☁️ (可选)部署到云运行
标记和推送图像(示例使用gcr.io/PROJECT/…):
项目ID= gcloud身份验证配置docker
docker标签ordercopilot/catalog:local gcr.io/$PROJECT_ID/ordercopilot-catalog:v1 docker标签ordercopilot/compliance:local gcr.io/$PROJECT_ID/ordercopilot compliance:v1 docker标签ordercopilot/root:local gcr.io/$PROJECT_ID/ordercopilot-root:v1
docker推送gcr.io/$PROJECT_ID/ordercopilot目录:v1 docker推送gcr.io/$PROJECT_ID/ordercopilot合规性:v1 docker推送gcr.io/$PROJECT_ID/ordercopilot根目录:v1
部署A2A服务(公开用于演示;在prod中锁定):
gcloud运行部署命令副本目录 \ --image-gcr.io/$PROJECT_ID/ordercopilot目录:v1 \ --平台管理——以美国为中心的区域1——允许未经身份验证 \ --set-env-vars GOOGLE_API_KEY=\
gcloud运行部署命令副本合规性 \ --image gcr.io/$PROJECT_ID/ordercopilot合规性:v1 \ --平台管理——以美国为中心的区域1——允许未经身份验证 \ --set-env-vars GOOGLE_API_KEY=\
部署root用户界面/开发用户界面
gcloud运行部署命令副本根 \ --图像gcr.io/$PROJECT_ID/ordercopilot根目录:v1 \ --平台管理——以美国为中心的区域1——允许未经身份验证 \ --set-env-vars GOOGLE\_ API\_,\ 目录基url=\,\ COMPLIANCE_BASE_URL=\
打开根服务URL并聊天。
Prod注释:使用VPC-E、私有出口、工作负载标识,并限制公共访问;按服务设置IAM;将机密存储在Secret Manager中;pin ADK版本。
🧠 为什么ADK、A2A和MCP很重要
ADK(Agent Development Kit):用于组合LLM、工具、内存和具有可观察性和评估性的远程代理的标准方法。对企业护栏有足够的意见,但对创新有足够的灵活性。
A2A(代理到代理):定义代理如何通过代理卡和干净的HTTP合约发现和调用彼此。团队可以独立拥有子代理,单独扩展它们,并强制执行最小特权。
MCP(模型上下文协议):添加一个安全边界,通过提供程序访问本地/企业资源(文件系统、Jira、Git、DB),避免从LLM直接任意访问系统。
🧯 故障排除
功能工具kwargs(名称/描述) 此仓库的support_orchestrator.py使用文档字符串,因此它适用于旧的ADK,其中FunctionTool只接受可调用对象。如果您升级ADK并想要显式的名称/描述,可以重新启用关键字args。
代理卡404 确保两台A2A服务器正在运行且可访问。检查CATALOG_BASE_URL和合规性_BASE_URL。
CORS/云运行 如果根服务跨域调用子代理,请配置允许的源和服务以进行服务身份验证,或将其与VPC/E和授权调用私有化。
