谷歌云Next ’25宣布了多个突破性的公告,我有幸亲自参加了这次活动。这次经历充满创新、现场演示、产品演示和深刻讨论,非常启发人心。
去年的焦点是GenAI(聊天机器人)和Vertex AI,而今年的主题非常明确——全都是代理。从ADK到A2A协议以及代理空间,还有谷歌的旗舰大型语言模型——Gemini 2.5 Pro预览
在我的上一篇文章里,我探讨了如何通过将Gemini LLM与模型上下文协议(MCP)结合,并作为MCP客户端,实现与外部API和系统的结构化、工具增强型交互。我们还讨论了MCP的核心概念、应用场景以及示例。
在本文中,我们的重点将是利用 现有MCP服务器 并通过 ADK代理 作为 MCP客户端,并通过 Gemini LLM 调用工具的能力,利用外部 MCP 动力工具提供的功能。在讨论代码实现之前,我们先来了解 ADK 的核心概念,实现功能。
ADK是什么?它是一个代理程序开发工具包。
代理开发工具包(ADK,Agent Development Kit的缩写) 是一个开源的、代码优先的Python工具包,用于构建、评估和部署智能AI代理程序。
在ADK中,Agent是什么?ADK 允许开发人员创建智能代理流程 — 从单一代理任务到复杂多代理的编排 — 所有这些都可以在一个模块化和可扩展的框架内完成。
一个智能代理是自主运行的执行单元,旨在实现特定目标。智能代理可以
- 完成任务,
- 与用户交流,
- 使用外部工具,
- 和其他代理一起合作以完成复杂的任务流程。
https://google.github.io/adk-docs/agents/
核心代理类别ADK 提供三种主要代理类型以支持
- LLM代理 (例如:LlmAgent, Agent) :利用LLM来理解、推理、规划和行动——适用于动态语言驱动的任务。
- 工作流代理 (例如:SequentialAgent, ParallelAgent, LoopAgent) :按照可预测的模式调度其他代理而不依赖于LLM进行流程控制——最适合结构化和可重复的过程。
- 自定义代理 :通过扩展BaseAgent来实现自定义逻辑、专业的流程或独特的工具集成——适合高级定制化的解决方案。
在这篇文章中,我们将使用LLM Agents这种类型的工具与MCPTools。
在ADK上下文中,工具是指什么?一个 工具 代表赋予AI代理的特定能力,使其能够执行动作和互动,并与基本文本生成和推理之外的外部环境进行互动。
如何使用工具?一个工具通常是模块化代码组件,比如一个Python函数、类中的方法,或者是一个其他代理,用来完成特定任务。
代理通过功能调用的方式动态利用工具,在此过程中,模型会根据上下文选择并调用合适的工具,同时生成相应的输入,观察到的结果,并然后将输出整合到下一步行动或回应中。
ADK中的工具种类ADK支持多种工具类型。
- 功能工具集:专为我们的应用程序的独特逻辑及工作流程设计的工具。
- 函数和方法:作为工具注册的标准同步Python函数(def)或类方法。
- 用作工具的代理:在父代理中使用专门代理作为工具,实现模块化。
- 长时间运行的工具:设计用于异步或耗时任务的工具。
2. 内置工具:框架中预设的工具,可用于执行网络搜索、代码执行或RAG等任务。RAG是指检索增强生成。
3. 第三方工具:轻松整合来自流行生态系统的工具,如LangChain或CrewAI。
架构我们将使用和前面文章一样的架构,还会用到ADK。
作者拍摄
实施让我们着手构建这个基于ADK + MCP + 该Gemini AI的管道,分步骤实施。
预备知识- 安装了 Python 3.8 及以上版本
2. Google Gemini 服务 生成式 AI 功能通过 API 密钥来使用
3. 有效SerpAPI密钥(用于获取实时航班信息)
第一步:设置虚拟环境: 安装依赖项 # 设置虚拟环境(mac或Unix)
python -m venv venv && source venv/bin/activate
# 安装代理开发工具包
pip install google-adk
# 安装MCP服务器端
pip install mcp-flight-search
# 安装GenAI Python SDK
pip install google-genai
google-sdk:(^1) Google 的代理开发工具包(ADK),用于构建代理程序。
(^1) 注:google-sdk 是 Google 提供的用于构建代理程序的工具包。
google-genai : Google的生成式AI模型互动库,例如Gemini。
mcp-flight-search : 使用MCP库并通过SerpAPI获取航班信息的MCP服务器
设置一下环境变量:
请注意这里的不同:这里要用 GOOGLE_API_KEY,而不是 GEMINI_API_KEY 在 ADK
export GOOGLE_API_KEY="你的Google API密钥值"
export SERP_API_KEY="你的SerpApi密钥值"
步骤 2: 安装 MCP 服务器(mcp-flight-search)
为了让 Gemini 能与实际的 API 交互,我们将使用一个遵循 MCP 标准的服务器。
我们将使用mcp-flight-search,它是一个使用FastMCP构建的轻量级的MCP服务器。这个工具可以使用SerpAPI实时查询航班数据。
请确认已安装的MCP服务器软件包 https://pypi.org/project/mcp-flight-search/,并检查其状态。
如果你还没装,可以用pip安装mcp-flight-search(之前在步骤 1 已经装过了)
第三步:理解 ADK 如何作为 MCP 客户端
从 google.adk.agents.llm_agent 导入 LlmAgent,
从 google.adk.runners 导入 Runner,
从 google.adk.sessions 导入 InMemorySessionService,
从 google.adk.tools.mcp_tool.mcp_toolset 导入 MCPToolset, StdioServerParameters,
LlmAgent — 是 ADK 中的核心组件,扮演应用程序的‘思考’角色,利用大型语言模型(LLM)来进行推理、理解自然语言、做决定、生成回应以及与工具互动交流。
Runner 负责在整个代理生命周期中协调各组件间的交互。Runner 使用内存实现方式来提供工件、会话和内存服务的内存实现,从而为代理执行提供轻量级且自包含的内存环境。
InMemorySessionService 实现了 ADK 的 SessionService 接口,它将所有会话信息(如对话历史、状态和元数据等信息)直接存储在应用程序的内存中。这表示一旦应用停止或重启,所有会话信息都将丢失。
当用户与AI代理进行交互时,会创建一个会话对象来跟踪对话内容。
MCPToolSet — 是 ADK 中的一个工具类,它使我们的 AI 代理能够连接到外部 MCP 服务器。这些服务器提供工具,例如 API 和服务,代理可以使用这些工具来执行特定的作业。通过 MCPToolSet,代理可以无缝地发现、调用和管理这些工具。
StdioServerParameters 是一个配置类,用于指定代理通过标准输入输出流连接到 MCP 服务器的方式。这在 MCP 服务器作为一个本地进程并通过控制台通信时特别有用。
MCPToolSet和StdioServerParameters是如何协同工作的?
当结合使用MCPToolset和StdioServerParameters时,ADK代理可以做到:
- 建立连接:使用StdioServerParameters定义启动MCP服务器进程所需的命令和参数,确保它们正确无误。
- 发现可用工具:MCPToolset连接到MCP服务器并检索可用于代理的工具列表。
- 将工具集成到代理中:将发现的工具适配为与ADK代理兼容的格式,从而在代理执行过程中实现无缝调用。
- 管理连接生命周期:MCPToolset负责建立和终止与MCP服务器的连接,合理管理资源。
StdioServerParameters定义了使用MCPToolSet进行异步操作,以监听和列出MCP配置。
# --- 步骤 1:从 MCP 服务器获取工具 ---
async def get_tools_async():
"""从 MCP 飞行搜索服务器获取工具。"""
print("正在尝试连接到 MCP 飞行搜索服务器...")
server_params = StdioServerParameters(
command="mcp-flight-search",
args=["--connection_type", "stdio"],
env={"SERP_API_KEY": os.getenv("SERP_API_KEY")},
)
tools, exit_stack = await MCPToolset.from_server(
connection_params=server_params
)
print("MCP 工具集成功创建。")
return tools, exit_stack
步骤5:从ADK创建智能代理
正如提到的,我们正在使用Llm代理(思考组件),这是应用程序的思考模块。
# --- 步骤 2:定义 ADK 代理创建过程 ---
async def get_agent_async():
"""创建一个配备了来自 MCP 服务器的工具的 ADK 代理。"""
tools, exit_stack = await get_tools_async()
print(f"异步地从 MCP 服务器获取了 {len(tools)} 个工具。")
root_agent = LlmAgent(
model=os.getenv("GEMINI_MODEL", "gemini-2.5-pro-preview-03-25"),
name='flight_search_assistant',
instruction='帮助用户根据提示使用可用工具搜索航班。如果没有指定返回日期,则视为单程行程,并使用空字符串。',
tools=tools,
)
return root_agent, exit_stack
第六步:将代理生成、会话处理和编排集成在一起与运行器
async def async_main():
# 创建服务
session_service = InMemorySessionService()
# 创建一个会话
session = session_service.create_session(
state={}, app_name='flight_search_app', user_id='user_flights'
)
# 查找2025年5月5日从亚特兰大到拉斯维加斯的航班
query = "查找2025年5月5日从亚特兰大到拉斯维加斯的航班"
print(f"用户查询: '{query}'")
# 将输入格式化为types.Content
content = types.Content(role='user', parts=[types.Part(text=query)])
# 获取智能代理和exit_stack
root_agent, exit_stack = await get_agent_async()
# 创建Runner
runner = Runner(
app_name='flight_search_app',
agent=root_agent,
session_service=session_service,
)
print("正在运行代理...")
events_async = runner.run_async(
session_id=session.id,
user_id=session.user_id,
new_message=content
)
# 正在处理事件...
final_content = None
async for event in events_async:
print(f"收到事件: {event}")
# 关闭与MCP服务器的连接...
print("关闭与MCP服务器的连接...")
await exit_stack.aclose()
print("清理完成。")
第七步:演示环节
用户在MCP客户端的查询:
query = "从亚特兰大到拉斯维加斯2025年5月5日的航班"
标准日志记录示例
调试日志演示
- MCP VS ADK
- MCP 是一个 开放标准协议,规范了AI模型与外部工具和数据源之间的交互方式。
- ADK 是一个 基于Python的框架,用于构建和部署AI代理程序。
- MCPToolset :通过使ADK代理能够使用MCP服务器提供的工具,连接MCP和ADK。
要构建一个MCP服务器,请使用Python中的MCP库。
2. 工具种类及其集成
- ADK 工具:例如 BaseTool 和 FunctionTool 这样的 Python 对象,它们专门用于直接在 ADK 代理中使用。
- MCP 工具:由 MCP 服务器提供的功能,通过 MCPToolset 进行适配,以在 ADK 代理中使用。
- 第三方工具:例如 LangChain 和 CrewAI 这样的库,它们提供了可以通过 LangchainTool 和 CrewaiTool 等适配器集成到 ADK 中的工具。
3. 异步架构
- ADK 和 MCP 的 Python 库(库)都是使用 Python 的 asyncio 框架构建的。
- 工具实现和服务器处理器应当使用异步定义(async def),以确保异步操作。
4. MCP 中的有状态的会话
- MCP 在客户端和服务器之间建立持久的保持状态的连接,而不同于典型的无状态 REST API。
- 这种有状态的方式使得跨会话保留上下文成为可能,但需要小心管理会话状态。
5. 部署注意事项
- MCP连接的持续性可能会对扩展和部署造成挑战,这特别是在需要支持多个用户的远程服务器上。
- 考虑到架构,需要包括负载均衡和会话保持以保持连接的稳定。
-
管理并处理ADK的MCP连接
*MCPToolset 负责管理 ADK 中 MCP 连接的整个生命周期。
- 使用 exit_stack 可以确保代理执行结束后正确终止这些连接。
故障解决:
默认情况下,adk库期望GCP项目的Vertex AI、地点和VertexAI配置。请使用GOOGLE_API_KEY而不是GEMINI_API_KEY,因为错误信息可能不会明确指出缺少的环境变量。
解决:确保将变量设置为GOOGLE_API_KEY。
值错误:缺少关键参数!要使用Google AI API,请提供(`api_key`)参数。要使用Google Cloud API,请提供(`vertexai`, `project` 和 `location`)参数。
- 经常遇到 429 限速错误和 500 服务器错误。
切换到Gemini 2 Flash作为Gemini API 的“免费层级”通过 API 服务提供,但速率限制较低,适用于测试[更多详情]
google.genai.errors.ClientError: 429 资源已耗尽。{'error': {'code': 429, 'message': '您已超出当前配额,请检查您的配额和计费详情。有关此错误的更多信息,请访问:https://ai.google.dev/gemini-api/docs/rate-limits.', 'status': 'RESOURCE_EXHAUSTED', 'details': [{'@type': 'type.googleapis.com/google.rpc.QuotaFailure', 'violations': [{'quotaMetric': 'generativelanguage.googleapis.com/generate_content_free_tier_requests', 'quotaId': 'GenerateRequestsPerDayPerProjectPerModel-FreeTier', 'quotaDimensions': {'model': 'gemini-2.0-pro-exp', 'location': 'global'}, 'quotaValue': '25'}]}, {'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': '了解更多关于 Gemini API 配额的信息', 'url': 'https://ai.google.dev/gemini-api/docs/rate-limits'}]}, {'@type': 'type.googleapis.com/google.rpc.RetryInfo', 'retryDelay': '27s'}]}}
执行过程中发生错误:500 内部错误:{'error': {'code': 500, 'message': '发生内部错误。请重试或在此链接 https://developers.generativeai.google/guide/troubleshooting 报告此错误', 'status': 'INTERNAL'}}
双子API: 成本计费
Gemini 2.5 Pro 预览— 根据 Google 文档,Gemini API 的“免费层级”提供较低的速率限制,适用于测试。Gemini API 的“付费层级”则提供了更高的速率限制、额外功能和不同的数据处理方法。更多详情请参阅更高的速率限制。
- Agent Development Kit (ADK) 文档 — 与 Gemini 和 Google 集成的开源 AI 代理框架的完整指南。
- ADK 中的大型语言模型代理 — 关于实现 LLM 代理的详细文档,包括定义身份、指令、工具和高级配置。
- 使用 ADK 的 MCP 工具和服务器 — 如何使用 ADK 作为 MCP 客户端连接到 MCP 服务器的具体指导。
你可以在我的 GitHub 上找到本教程中用到的所有代码:
GitHub - arjunprabhulal/adk-python-mcp-client通过在 GitHub 上创建账户,加入 arjunprabhulal/adk-python-mcp-client 的开发中。
最后在这篇文章中,我们探讨了如何使用开源ADK来构建一个使用模型上下文协议(MCP)的代理安装助手,并将Google Gemini LLM作为MCP客户端进行集成。
共同学习,写下你的评论
评论加载中...
作者其他优质文章