agno-2-工具(Tools)

📅 2026/7/5 9:04:36
agno-2-工具(Tools)
在 Agno 框架中工具Tools是赋予智能体Agent与外部世界交互能力的关键。简单来说工具就是智能体可以调用的函数使其能够执行实际操作比如搜索网页、查询数据库或发送邮件从而将智能体从一个“对话者”转变为真正的“行动者”。Agno 为开发者提供了灵活的工具系统既有丰富的内置工具也支持通过简单的 Python 代码创建自定义工具。核心概念工具如何工作Agno 智能体的核心是一个LLM 循环LLM Loop。当用户提出请求时这个循环会反复执行以下步骤直到智能体得出最终答案发送上下文智能体将系统消息、用户问题、对话历史以及所有可用工具的定义即函数名、描述和参数发送给大语言模型LLM。模型决策LLM 分析后会决定是直接生成回答还是调用某个工具。执行工具如果 LLM 决定调用工具智能体会执行相应的函数并将执行结果返回给 LLM。迭代与回答LLM 会处理这个新信息并可能再次调用工具或最终生成回答。这个过程会一直持续直到 LLM 不再调用工具为止。Agno 会自动将你的 Python 函数转换为 LLM 能够理解的 JSON 格式工具定义整个过程对开发者是透明的。如何创建和使用工具Agno 中创建和使用工具非常灵活主要有三种方式1. 直接使用函数最简单的开始任何 Python 函数都可以直接作为工具使用。只需要定义好函数并确保它有清晰的文档字符串docstring因为 LLM 会依靠这个描述来理解工具的用途from agno.agent import Agent from agno.models.deepseek import DeepSeek from dotenv import load_dotenv load_dotenv() deepseek DeepSeek(iddeepseek-chat) def get_weather(city: str) - str: 获取天气 Args: city (str): 城市 Returns: str: 天气 return f当前{city}的天气是晴天 agent Agent( name天气助手, modeldeepseek, tools[get_weather], instructions[你是一个智能助手可以调用工具来执行操作。], ) resp agent.run(查询一下北京的天气) print(resp.content)2. 使用tool装饰器更精细的控制通过agno.tools中的tool装饰器你可以对工具的行为进行更精细的控制。常用参数show_result: 布尔值如果为True工具的执行结果会直接显示在智能体的最终回复中。stop_after_tool_call: 布尔值如果为True智能体在执行完此工具后会立即停止不再进行后续的推理或工具调用。requires_confirmation: 布尔值如果为True在执行该工具前会暂停需要用户手动确认是实现人机回环Human-in-the-loop的关键。from agno.agent import Agent from agno.models.deepseek import DeepSeek from agno.tools import tool from dotenv import load_dotenv load_dotenv() deepseek DeepSeek(iddeepseek-chat) tool(show_resultTrue, stop_after_tool_callTrue) def delete_user_log(user_id: str) - str: 删除用户的日志记录 Args: user_id (str): 用户ID Returns: str: 删除结果 return fThe log of user {user_id} has been deleted. agent Agent( name日志删除助手, modeldeepseek, tools[delete_user_log], instructions[你是一个智能助手可以调用工具来执行操作。], ) resp agent.run(删除用户ID为12345的日志记录) print(resp.content)3. 创建工具包Toolkit组织多个相关工具当你的智能体需要一组相关的工具时可以将它们组织成一个工具包Toolkit。工具包是一个继承自agno.tools.Toolkit的类用于将相关的函数捆绑在一起便于复用和管理from agno.agent import Toolkit from agno.agent import Agent from agno.models.deepseek import DeepSeek from dotenv import load_dotenv load_dotenv() deepseek DeepSeek(iddeepseek-chat) class MyTool(Toolkit): def __init__(self): tools [self.get_weather, self.get_time] super().__init__(nameMyTool, toolstools) def get_weather(self, city): Get the weather for a given city. return fThe weather in {city} is sunny. def get_time(self, city): Get the current time for a given city. return fThe current time in {city} is 12:00 PM. agent Agent( name智能助手, modeldeepseek, tools[MyTool()], instructions[你是一个智能助手可以调用工具来执行操作。], ) resp agent.run(北京的天气怎么样) print(resp.content)内置工具Built-in ToolsAgno 提供了超过 100 个内置工具覆盖了各种常见场景。以下是一些主要类别搜索工具 (Search)DuckDuckGo:from agno.tools.duckduckgo import DuckDuckGoToolsTavily:from agno.tools.tavily import TavilyToolsWikipedia:from agno.tools.wikipedia import WikipediaToolsArxiv:from agno.tools.arxiv import ArxivTools金融工具 (Finance)YFinance:from agno.tools.yfinance import YFinanceToolsOpenBB:from agno.tools.openbb import OpenBBTools数据库工具 (Database)Postgres:from agno.tools.postgres import PostgresToolsDuckDB:from agno.tools.duckdb import DuckDbToolsSQL:from agno.tools.sql import SQLTools社交媒体与通讯 (Social Communication)Slack:from agno.tools.slack import SlackToolsGmail:from agno.tools.gmail import GmailToolsDiscord:from agno.tools.discord import DiscordTools网络爬虫 (Web Scraping)Firecrawl:from agno.tools.firecrawl import FirecrawlToolsNewspaper:from agno.tools.newspaper import NewspaperTools本地与系统工具 (Local System)File Tools:from agno.tools.file import FileToolsShell Tools:from agno.tools.shell import ShellToolsPython:from agno.tools.python import PythonTools具体使用可以参考官方文档https://docs.agno.com/examples/tools/overviewfrom agno.agent import Agent from agno.tools.baidusearch import BaiduSearchTools from agno.models.deepseek import DeepSeek from dotenv import load_dotenv load_dotenv() deepseek DeepSeek(iddeepseek-chat) agent Agent( tools[BaiduSearchTools()], modeldeepseek, description智能助手, instructions[ 你是一个智能助手可以通过调用工具回答用户的问题, ], ) if __name__ __main__: agent.print_response(什么是ai, markdownTrue)MCPMCP (Model Context Protocol, 模型上下文协议) 是一个开放标准为AI应用与外部工具、数据源之间提供了一种统一的连接方式。简单来说你可以把MCP理解为AI领域的“USB-C接口”它为AI智能体Agent连接外部世界提供了一个标准化的通用协议。Agno为MCP提供了一流的first-class支持。这意味着你可以非常便捷地将任何遵循MCP标准的服务器连接到你的Agno智能体上。MCP在Agno中的角色Agno主要将MCP服务器作为工具Tools的来源来集成。一个MCP服务器会对外暴露一组工具Tools、资源Resources和提示词Prompts。Agno的MCPTools类会在连接时自动发现MCP服务器提供的所有工具并将它们注册为智能体可以调用的原生工具。这使得智能体能力瞬间得到极大扩展可以访问海量的外部系统如何使用核心组件与步骤Agno中与MCP集成主要涉及以下核心组件和步骤MCPTools: 用于连接单个MCP服务器。MultiMCPTools: 用于同时连接和管理多个MCP服务器from agno.agent import Agent from agno.tools.mcp import MCPTools from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek DeepSeek(iddeepseek-chat) mcp_tools MCPTools( transportsse, urlhttps://mcp.api-inference.modelscope.net/2aa16717859046/sse, refresh_connectionTrue # 每次调用前刷新连接 ) agent Agent( modeldeepseek, tools[mcp_tools], markdownTrue, instructions[你是一个智能助手可以根据用户的指令调用mcp工具来回答用户的问题] ) resp agent.run( 北京今天的天气怎么样 ) print(resp.content)多个示例from agno.agent import Agent from agno.tools.mcp import MultiMCPTools from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek DeepSeek(iddeepseek-chat) mcp_tools MultiMCPTools( urls[ https://mcp.api-inference.modelscope.net/2aa16717859046/sse, https://mcp.api-inference.modelscope.net/3d52f9994fce47/mcp ], # 服务器 URL 列表 urls_transports[sse, streamable-http], # 对应的传输协议列表 refresh_connectionTrue, # 可选每次运行时刷新连接 # timeout_seconds30, # 可选连接超时时间 ) agent Agent( modeldeepseek, tools[mcp_tools], markdownTrue, instructions[你是一个智能助手可以调用工具来执行操作。] ) resp agent.run( 小明男1992年8月22日出生于北京八字测命 ) print(resp.content)异步案例from agno.agent import Agent from agno.tools.mcp import MCPTools from dotenv import load_dotenv from agno.models.deepseek import DeepSeek load_dotenv() #定义大模型 deepseek DeepSeek(iddeepseek-chat) async def main(): mcp_tools MCPTools( transportsse, urlhttps://mcp.api-inference.modelscope.net/2aa16717859046/sse, refresh_connectionTrue # 每次调用前刷新连接 ) async with mcp_tools: agent Agent( modeldeepseek, tools[mcp_tools], markdownTrue, instructions[你是一个智能助手可以根据用户的指令调用mcp工具来回答用户的问题] ) resp await agent.arun( 北京今天的天气怎么样 ) print(resp.content) if __name__ __main__: import asyncio asyncio.run(main())