代理+MCP+A2A演示
在这个存储库中,您将找到一个代理聊天机器人,可以回答有关小型演示产品目录的问题。它使用代理到代理(A2A)调用和模型上下文协议(MCP)来访问两个本地数据源:关系SQLite数据库和Chroma向量存储。聊天代理选择何时查询结构化数据、语义搜索或两者兼而有之,以产生有用的答案。
该项目展示了:
- 由LangGraph ReAct代理支持的FastAPI聊天服务。
- 代理到代理(A2A)通信:主聊天代理通过HTTP调用辅助代理。
- 辅助代理使用MCP工具服务器访问两个本地数据库:
- SQLite(关系型) - 色度(矢量)
建筑
flowchart TD
subgraph "Chat Server (FastAPI 8000)"
ChatAPI["POST /chat"]
ChatAgent["LangGraph ReAct Agent (chat_agent)"]
ChatAPI --> ChatAgent
end
subgraph "Data Server (FastAPI 8001)"
A2A["POST /data-agent/call"]
DataAgent["LangGraph ReAct Agent (data_agent)"]
A2A --> DataAgent
end
ChatAgent -- HTTP --> A2A
subgraph "MCP (FastMCP)"
SQLiteMCP[SQLite MCP Server]
ChromaMCP[Chroma MCP Server]
end
subgraph "Local Databases"
SQLiteDB[(SQLite demo.sqlite)]
ChromaStore[(Chroma vector store)]
end
DataAgent -- list_tools + call --> SQLiteMCP
DataAgent -- list_tools + call --> ChromaMCP
SQLiteMCP --> SQLiteDB
ChromaMCP --> ChromaStore背景:MCP和A2A
- 模型上下文协议(MCP):代理通过干净、类型化的接口发现和调用外部工具的标准方法。当您希望将精确、可靠、可审计的工具调用(例如数据库查询、知识查找、文件I/O)作为代理可以列出和调用的工具公开时,MCP是最好的选择。请参阅:
- 人类公告:https://www.anthropic.com/news/model-context-protocol - MCP组织和规范:https://github.com/modelcontextprotocol - FastMCP文档(客户端和服务器操作指南):https://fastmcp.wiki/
- 代理对代理(A2A):代理之间的直接通信,通常通过HTTP或消息传递。当一个代理应将工作委托给具有不同角色、技能或数据访问权限的另一个代理时,请使用A2A。它非常适合模块化架构、关注点分离以及从较小的代理服务中组合系统。了解更多:
- LangGraph多代理模式:https://langchain-ai.github.io/langgraph/ - Microsoft AutoGen(多代理框架):https://microsoft.github.io/autogen/ - 深度学习。人工智能短期课程(LangGraph,多代理):https://www.deeplearning.ai/short-courses/
何时使用哪个:
- 当单个代理需要对具有明确输入/输出的工具/数据进行确定性访问时,使用MCP。
- 当您希望代理跨服务协作、委派或隔离职责时,请使用A2A。
先决条件
- Python 3.11+
uv包管理器(推荐)
重要!
- 将“env”文件重命名为“.env”
- 更新.env文件中的密钥以使llm工作
安装uv
Windows(PowerShell):
# Install via pip (user-site)
python -m pip install --user uv
# You may need to restart your terminal so that the user Scripts folder is on PATH.
# Verify
uv --version安装
uv venv
uv sync
uv pip install -r requirements.txt初始化本地数据
应包含数据库,以便跳过此步骤。
uv run python -m db.init_sqlite
uv run python -m db.init_vectorsMCP服务器
运行自己的FastMCP HTTP服务器。数据服务器在运行时使用FastMCP客户端发现工具 list_tools() 并通过以下方式执行它们 call_tool().
数据服务器需要这些固定URL:
- SQLite MCP:
http://127.0.0.1:9001/mcp - 铬MCP:
http://127.0.0.1:9002/mcp
运行FastMCP服务器,使其在9001和9002上提供HTTP服务:
# Terminal 3 - SQLite MCP (HTTP on 9001)
uv run fastmcp run servers/sqlite_mcp.py:mcp --transport http --host 127.0.0.1 --port 9001
# Terminal 4 - Chroma MCP (HTTP on 9002)
uv run fastmcp run servers/chroma_mcp.py:mcp --transport http --host 127.0.0.1 --port 9002如果更改端口/主机,请更新中的固定URL app_data/main.py.
有关运行服务器和客户端工具的操作,请参阅FastMCP文档:https://fastmcp.wiki/en/clients/tools
运行服务器
在两个终端中启动数据代理服务器(端口8001)和聊天服务器(端口8000):
# Terminal 1 - Data server
uv run uvicorn app_data.main:app --reload --host 127.0.0.1 --port 8001
# Terminal 2 - Chat server
uv run uvicorn app.main:app --reload --host 127.0.0.1 --port 8000健康检查:
curl http://127.0.0.1:8000/health # chat server
curl http://127.0.0.1:8001/health # data server聊天:
curl -X POST http://127.0.0.1:8000/chat -H "content-type: application/json" -d "{\"message\":\"What headphones do we have? Use tools if needed.\"}"聊天(在powershell中):
Invoke-WebRequest -Uri "http://127.0.0.1:8000/chat" -Method Post -Headers @{ "Content-Type" = "application/json" } -Body '{"message":"What headphones do we have? Use tools if needed."}' -UseBasicParsing | Select-Object -ExpandProperty Content 聊天(在powershell中):
Invoke-RestMethod -Uri "http://127.0.0.1:8000/chat" -Method Post -Headers @{ "Content-Type" = "application/json" } -Body '{"message":"What do you think about sony products that you have and at what price?"}' 演示功能的示例提示
- 仅数据库(SQLite通过MCP):
- “列出你所有的耳机及其价格。” - “显示索尼的所有产品及其价格和库存。”
- 仅矢量存储(Chroma通过MCP):
- “查找有关降噪耳机的文章。” - “关于耳挂式和入耳式,提到的利弊是什么?”
- 将两者结合起来(使用数据库事实+向量上下文):
- “比较索尼和Bose耳机,包括价格并总结评论。” - “你的哪款预算耳机最常被描述为舒适?”
运作原理
app/main.py暴露/chat(聊天服务器)。app_data/main.py暴露/data-agent/call(数据服务器)。- 聊天代理(
agents/chat_agent.py)用途create_react_agent并且只有一个工具ask_data_agent执行对数据服务器的HTTP调用/data-agent/call. - 数据代理(
agents/data_agent.py)使用从FastMCP服务器中发现的工具为每个请求构建一个ReAct代理:
- 它召唤 list_tools() 并将返回的工具转换为LangChain工具,如下所述:https://fastmcp.wiki/en/clients/tools
- MCP服务器在
servers/sqlite_mcp.py和servers/chroma_mcp.py;将它们作为单独的FastMCP HTTP服务器运行。
备注
- 矢量存储使用非常小的确定性哈希嵌入来避免大型模型下载,仅适用于本地演示。
- 更换中的模型
agents/*根据需要,与您首选的供应商和型号联系。
