当前位置: 首页 > java >正文

ADK实战-基于ollama+qwen3实现外部工具串行调用

0 环境准备

1 开发环境准备

1.1 创建项目python环境

1.2 在pycharm创建项目

1.3 安装项目依赖

2 资源准备

3 adk agent构建

3.1 新建adk_agent_tool_serial python包

3.2 编辑__init__.py文件

4  配置env

4.1 新建.env文件

4.2 编辑.env文件

5 agent逻辑实现

5.1 新建agent.py文件

5.2 导入相关依赖包

5.3 加载配置文件

5.4 定义请求天气接口方法

5.5 定义格式化天气结果方法

5.6 定义获取天气工具方法

5.7 定义天气agent

5.8 定义写入本地文件方法

5.9 定义写入本地文件agent

5.10 定义串行agent

6 完整代码


0 环境准备

  • ollama已部署推理模型qwen3:8b
  • 已安装miniconda环境
  • 具备科学上网条件

1 开发环境准备

1.1 创建项目python环境

通过conda命令创建项目的python开发环境

 conda create -n mcp_demo python=3.10

1.2 在pycharm创建项目

  • 解释器类型:选择自定义环境
  • 环境:选择现有
  • 类型:选择conda
  • 环境:选择上一步创建的环境

1.3 安装项目依赖

安装adk、litellm相关依赖

安装python-dotenv python读取环境配置文件依赖

pip install google-adk litellm python-dotenv httpx

2 资源准备

        本项目中需要调用天气接口获取城市的天气信息,因此需要注册天气API网站,并且获取调用key。

具体流程请参考以下链接的第二章节:MCP实战-基于Ollama+qwen2.5以sse方式实现MCP协议工具调用_mcp sse-CSDN博客

3 adk agent构建

3.1 新建adk_agent_tool_serial python包

        adk在识别agent时是一个python包一个agent,包名就是agent名字,因此我们需要新建一个目录,此例中是adk_agent_tool_serial,如下图所示:

3.2 编辑__init__.py文件

from . import agent

这样可以是adk_agent_tool_serial的内容可以被导入,adk可以识别并调用adk_agent_tool_serial。

4  配置env

4.1 新建.env文件

4.2 编辑.env文件

        填充模型,open weather等配置参数

OLLAMA_API_BASE=http://localhost:11434
MODEL=qwen3:8b
EMBEDDINGS_MODEL=quentinz/bge-large-zh-v1.5:latest
OPENAI_API_KEY=ollama
OPENWEATHER_API_KEY=5082xxxxd4cddffd1051163cb
OPENWEATHER_BASE_URL=https://api.openweathermap.org/data/2.5/weather
USER_AGENT=weather-app/1.0

注意将key换成自己的key,按照参考博客一步步申请。

5 agent逻辑实现

5.1 新建agent.py文件

5.2 导入相关依赖包

import json
import osimport httpx
from dotenv import load_dotenv
from google.adk.agents import LlmAgent, SequentialAgent
from google.adk.models.lite_llm import LiteLlm

5.3 加载配置文件

load_dotenv()model_name = os.getenv('MODEL')
api_base = os.getenv('OLLAMA_API_BASE')openweather_api_key = os.getenv('OPENWEATHER_API_KEY')
openweather_base_url = os.getenv('OPENWEATHER_BASE_URL')
user_agent = os.getenv('USER_AGENT')

5.4 定义请求天气接口方法


async def get_weather(city):"""从OpenWeather API 获取天气信息:param city: 城市名称(需要试用英文,如 beijing):return: 天气数据字典;若发生错误,返回包含error信息的字典"""params = {"q": city,"appid": openweather_api_key,"units": "metric","lang": "zh_cn",}headers = {"User-Agent": user_agent}async with httpx.AsyncClient() as client:try:response = await client.get(openweather_base_url, params=params, headers=headers, timeout=30)response.raise_for_status()return response.json()except httpx.HTTPStatusError as e:return {"error": f"HTTP请求错误:{e}"}except Exception as e:return {"error": f"发生错误:{e}"}

5.5 定义格式化天气结果方法

def format_weather_data(data):"""格式化天气数据:param data: 天气数据字典:return: 格式化后的字符串;若发生错误,返回包含error信息的字符串"""#  如果传入的是字符串,则先转换成字典if isinstance(data, str):data = json.loads(data)if "error" in data:return data["error"]weather = data["weather"][0]["description"]temperature = data["main"]["temp"]city = data["name"]country = data["sys"]["country"]humidity = data["main"]["humidity"]wind = data["wind"]["speed"]return f"城市:{city}, {country}\n天气:{weather}\n温度:{temperature}°C\n湿度:{humidity}%\n风速:{wind}m/s"

5.6 定义获取天气工具方法

async def get_weather_tool(city: str):"""查询即时天气函数:param city: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则city参数需要输入'Beijing';:return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather\返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息"""weather_data = await get_weather(city)return format_weather_data(weather_data)

5.7 定义天气agent

weather_agent = LlmAgent(name = "天气查询agent",model=LiteLlm(model=f"{model_name}",api_base=api_base,custom_llm_provider="ollama"),description = ("回答城市天气情况的问题"),instruction = ("你是一个天气助手,根据输入的城市输出该城市的天气情况"),tools = [get_weather_tool],output_key = "content"
)

5.8 定义写入本地文件方法

def write_weather_to_file(content: str) -> bool:"""将天气结果写入本地文件。:param content: 必要参数,字符串类型,用于表示需要写入文档的具体内容。:return:是否成功写入"""flag = Truetry:with open("weather.txt", "w", encoding="utf-8") as file:file.write(content)except Exception as e:print(f"写入文件时发生错误: {e}")flag = Falsereturn flag

5.9 定义写入本地文件agent

write_weather_to_file_agent = LlmAgent(name = "将天气结果写入文件agent",model=LiteLlm(model=f"ollama_chat/{model_name}",api_base=api_base,custom_llm_provider="ollama"),description = ("将天气结果内容写入文件"),instruction = ("你是一个写本地文件的助手,根据天气结果写入到本地文件中"),tools = [write_weather_to_file]
)

5.10 定义串行agent

root_agent = SequentialAgent(name = "串行agent",sub_agents = [weather_agent, write_weather_to_file],description = ("你是一个天气助手,你可以根据输入的城市,将该城市的天气情况写入到本地文件中")
)

6 完整代码

import json
import osimport httpx
from dotenv import load_dotenv
from google.adk.agents import LlmAgent, SequentialAgent
from google.adk.models.lite_llm import LiteLlmload_dotenv()model_name = os.getenv('MODEL')
api_base = os.getenv('OLLAMA_API_BASE')openweather_api_key = os.getenv('OPENWEATHER_API_KEY')
openweather_base_url = os.getenv('OPENWEATHER_BASE_URL')
user_agent = os.getenv('USER_AGENT')async def get_weather(city):"""从OpenWeather API 获取天气信息:param city: 城市名称(需要试用英文,如 beijing):return: 天气数据字典;若发生错误,返回包含error信息的字典"""params = {"q": city,"appid": openweather_api_key,"units": "metric","lang": "zh_cn",}headers = {"User-Agent": user_agent}async with httpx.AsyncClient() as client:try:response = await client.get(openweather_base_url, params=params, headers=headers, timeout=30)response.raise_for_status()return response.json()except httpx.HTTPStatusError as e:return {"error": f"HTTP请求错误:{e}"}except Exception as e:return {"error": f"发生错误:{e}"}def format_weather_data(data) -> str:"""格式化天气数据:param data: 天气数据字典:return: 格式化后的字符串;若发生错误,返回包含error信息的字符串"""#  如果传入的是字符串,则先转换成字典if isinstance(data, str):data = json.loads(data)if "error" in data:return data["error"]weather = data["weather"][0]["description"]temperature = data["main"]["temp"]city = data["name"]country = data["sys"]["country"]humidity = data["main"]["humidity"]wind = data["wind"]["speed"]return f"城市:{city}, {country}\n天气:{weather}\n温度:{temperature}°C\n湿度:{humidity}%\n风速:{wind}m/s"async def get_weather_tool(city: str) -> str:"""查询即时天气函数:param city: 必要参数,字符串类型,用于表示查询天气的具体城市名称,\注意,中国的城市需要用对应城市的英文名称代替,例如如果需要查询北京市天气,则city参数需要输入'Beijing';:return:OpenWeather API查询即时天气的结果,具体URL请求地址为:https://api.openweathermap.org/data/2.5/weather\返回结果对象类型为解析之后的JSON格式对象,并用字符串形式进行表示,其中包含了全部重要的天气信息"""weather_data = await get_weather(city)return format_weather_data(weather_data)def write_weather_to_file(content: str) -> bool:"""将天气结果写入本地文件。:param content: 必要参数,字符串类型,用于表示需要写入文档的具体内容。:return:是否成功写入"""flag = Truetry:with open("weather.txt", "w", encoding="utf-8") as file:file.write(content)except Exception as e:print(f"写入文件时发生错误: {e}")flag = Falsereturn flagweather_agent = LlmAgent(name = "天气查询agent",model=LiteLlm(model=f"{model_name}",api_base=api_base,custom_llm_provider="ollama"),description = ("回答城市天气情况的问题"),instruction = ("你是一个天气助手,根据输入的城市输出该城市的天气情况"),tools = [get_weather_tool],output_key = "content"
)write_weather_to_file_agent = LlmAgent(name = "将天气结果写入文件agent",model=LiteLlm(model=f"ollama_chat/{model_name}",api_base=api_base,custom_llm_provider="ollama"),description = ("将天气结果内容写入文件"),instruction = ("你是一个写本地文件的助手,根据天气结果写入到本地文件中"),tools = [write_weather_to_file]
)root_agent = SequentialAgent(name = "串行agent",sub_agents = [weather_agent, write_weather_to_file],description = ("你是一个天气助手,你可以根据输入的城市,将该城市的天气情况写入到本地文件中")
)

http://www.xdnf.cn/news/10810.html

相关文章:

  • 帝可得 - 运营管理APP
  • MMAD论文精读
  • day20 奇异值SVD分解
  • 线程池和数据库连接池的区别
  • 3-10单元格行、列号获取(实例:表格选与维度转换)学习笔记
  • 163MusicLyrics(歌词下载工具) v7.0
  • MDP的observations部分
  • MS9288C+MS2131 1080P@60Hz USB3.0环出采集
  • 常见的七种排序算法 ——直接插入排序
  • 个人博客系统自动化测试报告
  • 最佳实践 | 璞华易研“PLM+AI智能研发平台”,助力汉旸科技实现高新材料“数据驱动研发”
  • 95. Java 数字和字符串 - 操作字符串的其他方法
  • OpenEMMA: 打破Waymo闭源,首个开源端到端多模态模型
  • 蓝绿部署解析
  • Python爬虫监控程序设计思路
  • 统信 UOS 服务器版离线部署 DeepSeek 攻略
  • 飞牛fnNAS存储模式RAID 5数据恢复
  • DSN(数字交换网络)由什么组成?
  • 基于Hutool的验证码功能完整技术文档
  • Nginx 响应头 Vary 的介绍与应用
  • YOLO学习笔记 | 一种用于海面目标检测的多尺度YOLO算法
  • 在前端使用JS生成音频文件并保存到本地
  • day18 leetcode-hot100-36(二叉树1)
  • tauri项目绕开plugin-shell直接调用可执行文件并携带任意参数
  • 【深度学习】大模型MCP工作流原理介绍、编写MCP
  • 谷歌地图2022高清卫星地图手机版v10.38.2 安卓版 - 前端工具导航
  • 小白的进阶之路系列之十一----人工智能从初步到精通pytorch综合运用的讲解第四部分
  • Franka科研新力量——基于异构预训练Transformer的扩展研究
  • 智能氮气柜的发展历程和前景展望
  • 从基础原理到Nginx实战应用