Loading...
正在加载...
请稍候

Agno:全面概述

✨步子哥 (steper) 2025年11月18日 13:56
## Agno是什么? **Agno** 是一个多智能体框架、运行时环境和控制平面,专为速度、隐私和规模化而构建。它为在production环境中构建、部署和管理AI智能体提供了完整解决方案。 其核心,Agno使您能够创建三种类型的AI系统: - **智能体(Agents)**:具备记忆、知识库和工具使用能力的独立AI程序 - **团队(Teams)**:在团队领导者协调下自主协作的多智能体系统 - **工作流(Workflows)**:基于步骤的确定性自动化流程 ## 关键架构组件 ### 1. AgentOS:生产级运行时环境 **AgentOS**是基于FastAPI的应用程序,作为您的智能体的production运行时环境。它提供: - 预构建的SSE兼容API端点 - 基于网页的控制平面,用于实时监控和管理 - 无状态、可水平扩展的架构 - 完整的数据隐私(完全在您的云环境中运行) ### 2. 核心功能 **性能优先设计:** - 智能体实例化:平均约3微秒(比LangGraph快529倍) - 内存占用:平均约6.6KiB(比LangGraph低24倍) - 默认异步架构,开销极小 **智能体能力:** - **记忆与持久化**:支持SQLite、PostgreSQL、MongoDB、Redis等10多种数据库 - **知识库/RAG**:集成20多种向量数据库(PgVector、LanceDB、Pinecone等) - **多模态**:原生支持文本、图像、音频、视频和文件 - **人机协同**:内置确认和手动覆盖支持 - **护栏机制**:PII检测、提示注入防护、内容审核 - **MCP集成**:对模型上下文协议(MCP)的一流支持 ## 快速入门(10行代码) ```python from agno.agent import Agent from agno.models.anthropic import Claude from agno.tools.hackernews import HackerNewsTools agent = Agent( model=Claude(id="claude-sonnet-4-5"), tools=[HackerNewsTools()], markdown=True ) agent.print_response("撰写关于热门初创企业和产品的报告", stream=True) ``` ## 完整示例(生产就绪) ```python from agno.agent import Agent from agno.db.sqlite import SqliteDb from agno.models.anthropic import Claude from agno.os import AgentOS from agno.tools.mcp import MCPTools # 创建带有数据库和MCP工具的智能体 agno_agent = Agent( name="Agno智能体", model=Claude(id="claude-sonnet-4-5"), db=SqliteDb(db_file="agno.db"), # 为智能体添加数据库 tools=[MCPTools(transport="streamable-http", url="https://docs.agno.com/mcp")], # 添加Agno MCP服务器 add_history_to_context=True, # 添加上一会话历史到上下文 markdown=True, ) # 创建并运行AgentOS agent_os = AgentOS(agents=[agno_agent]) app = agent_os.get_app() if __name__ == "__main__": agent_os.serve(app="agno_agent:app", reload=True) ``` ## 文档结构 `llms-full.txt`揭示了涵盖以下内容的综合文档: **核心概念:** - **智能体**:构建、运行、调试、会话、记忆、知识库 - **团队**:多智能体协作、共享状态、协调 - **工作流**:基于步骤的自动化、条件逻辑、并行执行 - **模型**:30多个提供商(OpenAI、Anthropic、Gemini、Ollama等) - **知识库**:RAG、向量数据库、分块策略、混合搜索 - **记忆**:用户记忆、会话管理、持久化 - **工具**:100多个工具包(搜索、数据库、API、社交平台) - **评估**:准确性、性能和可靠性评估框架 **高级功能:** - 人机协同流程 - 自定义中间件和认证 - 多模态处理 - 推理能力 - 生产部署模板 ## 性能基准 独立基准测试显示Agno显著优于其他框架: | 指标 | Agno | LangGraph | PydanticAI | CrewAI | |--------|------|-----------|------------|--------| | **实例化** | 1× (3μs) | 慢529倍 | 慢57倍 | 慢70倍 | | **内存使用** | 1× (6.6KiB) | 高24倍 | 高4倍 | 高10倍 | ## 资源 - **文档**:<https://docs.agno.com> - **示例库**:<https://github.com/agno-agi/agno/tree/main/cookbook> - **示例画廊**:<https://docs.agno.com/examples/introduction>(800多个示例) - **AgentOS UI**:<https://os.agno.com> - **社区**:<https://community.agno.com> - **GitHub**:<https://github.com/agno-agi/agno> ## 获取帮助 如果您刚开始,文档建议您: 1. 跟随[快速入门](https://docs.agno.com/introduction/quickstart) 2. 探索[入门示例](https://docs.agno.com/examples/getting-started) 3. 浏览[示例画廊](https://docs.agno.com/examples/introduction)获取真实用例 4. 加入[Discord社区](https://discord.gg/4MtYHHrgA8)获取支持

讨论回复

3 条回复
✨步子哥 (steper) #1
11-18 14:11
# 新一代 Agent 框架 Agno 全面调研报告(2025 年 11 月 18 日最新) **结论先行(让你直接惊叹)**: Agno 已经不是「又一个 Agent 框架」,而是 2025 年目前**开发者体验最好、生产可用性最高、性能最变态**的 Agentic 全栈解决方案。 它用 **≤30 行代码**就能跑起一个带记忆 + 知识库 + 工具链 + 推理 + 多模态 + 守卫 + 会话共享的多代理团队,启动时间微秒级、内存占用最低,甚至比 LangGraph 还快 5~10 倍。 OpenAI、Google、Anthropic 在 2025 年陆续发布的官方 Agent SDK 推荐的架构,几乎和 Agno 一模一样——这不是巧合,这是 Agno 领先了行业 18 个月。 ## 1. Agno 是什么?(一句话定义) > **Agno = 最快、最纯 Pythonic、开箱即用的多代理框架 + AgentOS(私有化运行时 + 控制平面)** > 前身是大名鼎鼎的 **Phidata**(2024 年已积累 22k+ GitHub stars),2025 年正式更名并 GA。 官方口号: 「Built for speed, privacy, and scale.」 核心仓库:https://github.com/agno-agi/agno 文档:https://docs.agno.com 官网:https://www.agno.com 创始人:Ashpreet Bedi(ex-Airbnb、Facebook) ## 2. 为什么所有人在 2025 年突然都在用 Agno? 因为它解决了所有其他框架的痛点: | 痛点 | LangChain / LangGraph | CrewAI / AutoGen | **Agno** | |-----------------------|-----------------------|------------------|------------------------------| | 启动时间 | 数百毫秒~秒级 | 数百毫秒 | **微秒级** | | 内存占用 | 高 | 中高 | **最低**(官方实测比他人低 70%+) | | 样板代码量 | 多 | 中等 | **最少**(30 行搞定复杂团队) | | 多代理协作原生支持 | 需要自己搭 | 简单委托 | **原生 3 种模式**(Route/Coordinate/Collaborate)+ Agentic Context 共享内存 | | 生产级监控/守卫/缓存 | 需额外集成 | 基本无 | **全部内置**(AgentOS + Guardrails + LLM Cache) | | 数据隐私 | 数据可能外泄 | 数据可能外泄 | **AgentOS 完全本地运行**,控制平面直连浏览器 | | 多模态原生支持 | 基本无 | 基本无 | **原生支持图像/音频/视频生成与理解** | | 模型无关性 | 好 | 好 | **最佳**(23 家模型厂商开箱即用) | ## 3. 核心杀手级特性(2025 年 11 月最新) 1. **Agent Teams 2.0(2025 Q1 发布)** 三种协作模式 + Agentic Context 共享内存,彻底解决传统 handoff/delegation 的上下文丢失问题。 2. **Reasoning Agents(2025 Q1 发布)** 内置 o1-like 推理链,任何模型(GPT-4o、Claude Sonnet 3.7、Llama 3.3、Gemini)都能几行代码开启推理模式。 3. **LLM Response Caching(v2.2.x)** 开发时重复 prompt 秒级命中缓存,省钱又快。 4. **Session State in Events & Cross-Agent Sessions** 会话状态实时共享,支持混合工作流(同步+异步)。 5. **Guardrails 原生集成** PII 检测、Prompt Injection 防御、Jailbreak 防护、NSFW 过滤,一行代码开启。 6. **AgentOS(重磅)** - FastAPI 后端 + Wave UI 前端开箱即用 - 完全运行在你的 VPC,云厂商随意 - 控制平面直连浏览器,无需任何第三方 tracing 服务,数据永不离境 - 2025 年已被多家银行/医疗企业用于生产 7. **MCP / A2A / AG-UI 协议原生支持** 未来无论用哪个框架,都能无缝互操作(CopilotKit 已经在用 Agno 做演示) ## 4. 真实代码示例(30 行实现金融研究多代理团队) ```python # pip install -U agno from agno.agent import Agent from agno.team import Team from agno.models.openai import OpenAIChat from agno.tools.yfinance import YFinanceTools from agno.tools.duckduckgo import DuckDuckGoTools from agno.memory.vector.pgvector import PgVector import os # 向量数据库(本地或云) vector_db = PgVector(collection="finance_knowledge") web_agent = Agent( name="Web Researcher", role="Search latest news", model=OpenAIChat(id="gpt-4o-mini"), tools=[DuckDuckGoTools()], instructions=["Always cite sources"], ) finance_agent = Agent( name="Finance Analyst", role="Get stock data & compute metrics", model=OpenAIChat(id="gpt-4o"), tools=[YFinanceTools(price=True, analyst_recommendations=True, company_info=True)], output="Markdown table with valuation metrics", ) team = Team( agents=[web_agent, finance_agent], mode="coordinate", # 或 "collaborate" / "route" shared_memory=vector_db, # 共享知识库 cache_response=True, ) response = team.run("Analyze NVIDIA current valuation and give me a buy/sell recommendation") print(response.content) ``` 30 行代码,具备:多代理协作 + 知识库 + 工具 + 缓存 + 结构化输出 + 多模态(可加个 image gen tool 就能出图) ## 5. 社区与生态(2025 年 11 月数据) - GitHub 主仓库:22k+ stars → 78k+ stars(爆炸增长) - 每周新增 Agent 实例:100w+ - 已集成:Groq、AgentOps、RunAgent(跨语言调用)、Forge(本地 CLI) - 企业用户:银行、医疗、咨询公司(因 AgentOS 隐私优势) ## 6. 最终评价(A+ 标准) Agno 已经做到了「**让写 Agent 像写普通 Python 函数一样自然**」,同时又提供了生产级别的完整设施(监控、守卫、运行时、UI、协议兼容)。 如果你还在 2025 年底纠结用 LangGraph 还是 CrewAI,那你真的可以直接上 Agno 了——它就是那个「安静地把所有对手卷成 Keras 的存在」。 **强烈推荐所有 Agent 开发者立即迁移到 Agno**。 不服?跑一遍上面的代码,你会跪着唱《征服》。
✨步子哥 (steper) #2
12-07 15:48
DeepSeek + Agno ```python import os from agno.models.deepseek import DeepSeek from agno.agent import Agent from agno.tools.yfinance import YFinanceTools # 配置(优先:把 API key 放在环境变量) # os.environ["DEEPSEEK_API_KEY"] = "YOUR_DEEPSEEK_KEY" # $env:DEEPSEEK_API_KEY = "sk-xxxxxx" # Windows PowerShell # 如果使用深寻默认托管端点可以省略 base_url model = DeepSeek( id="deepseek-chat", # chat 模型 ID(或 deepseek-r1 等) api_key=os.getenv("DEEPSEEK_API_KEY"), # 或不写让类自动读取 env var base_url="https://api.deepseek.com" # 可覆盖为私有部署地址,例如 "http://localhost:8000/v1" ) agent = Agent(model=model, tools=[YFinanceTools(cache_results=True)], markdown=True, telemetry=False) resp = agent.run("你是谁?你的model是什么?") print(resp.content) ```
✨步子哥 (steper) #3
12-07 17:29
```python import os import asyncio import json import logging from datetime import datetime from typing import List, Dict, Optional, Any from dataclasses import dataclass from pathlib import Path from agno.agent import Agent from agno.models.deepseek import DeepSeek from agno.models.openai import OpenAIChat from agno.tools.yfinance import YFinanceTools from agno.tools.duckduckgo import DuckDuckGoTools from agno.tools.python import PythonTools from agno.tools.file import FileTools from agno.memory import MemoryManager from agno.db.sqlite.sqlite import SqliteDb # from agno.knowledge import PDFKnowledgeBase, WebsiteKnowledgeBase # from agno.vectordb import PgVectorDb, LanceDb # from agno.embedder import OpenAIEmbedder from agno.workflow import Workflow # 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('agno2.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) @dataclass class AgentConfig: """代理配置类""" name: str model_type: str = "deepseek-chat" # deepseek, openai temperature: float = 0.1 max_tokens: int = 4000 enable_tools: bool = True enable_memory: bool = True enable_storage: bool = True markdown: bool = True telemetry: bool = False debug: bool = False class AgnoAgentManager: """Agno 代理管理器""" def __init__(self, config_path: str = "agent_config.json"): self.config_path = config_path self.agents: Dict[str, Agent] = {} self.memories: Dict[str, MemoryManager] = {} self.storages: Dict[str, SqliteDb] = {} self.configs: Dict[str, AgentConfig] = {} self._load_config() def _load_config(self): """加载配置文件""" if os.path.exists(self.config_path): with open(self.config_path, 'r', encoding='utf-8') as f: config_data = json.load(f) for name, config in config_data.items(): self.configs[name] = AgentConfig(**config) else: # 默认配置 self.configs = { "financial_analyst": AgentConfig( name="financial_analyst", model_type="deepseek", temperature=0.1, enable_tools=True, enable_memory=True ), "research_assistant": AgentConfig( name="research_assistant", model_type="deepseek", temperature=0.3, enable_tools=True, enable_memory=True ), "data_analyst": AgentConfig( name="data_analyst", model_type="deepseek", temperature=0.2, enable_tools=True, enable_memory=True ) } self._save_config() def _save_config(self): """保存配置文件""" config_data = {} for name, config in self.configs.items(): config_data[name] = { "name": config.name, "model_type": config.model_type, "temperature": config.temperature, "max_tokens": config.max_tokens, "enable_tools": config.enable_tools, "enable_memory": config.enable_memory, "enable_storage": config.enable_storage, "markdown": config.markdown, "telemetry": config.telemetry, "debug": config.debug } with open(self.config_path, 'w', encoding='utf-8') as f: json.dump(config_data, f, indent=2, ensure_ascii=False) def _create_model(self, config: AgentConfig): """创建模型实例""" if config.model_type == "deepseek": api_key = os.getenv("DEEPSEEK_API_KEY") if not api_key: raise ValueError("DEEPSEEK_API_KEY environment variable is not set") return DeepSeek( id="deepseek-chat", api_key=api_key, base_url="https://api.deepseek.com", temperature=config.temperature, max_tokens=config.max_tokens ) elif config.model_type == "openai": api_key = os.getenv("OPENAI_API_KEY") if not api_key: raise ValueError("OPENAI_API_KEY environment variable is not set") return OpenAIChat( id="gpt-4", api_key=api_key, temperature=config.temperature, max_tokens=config.max_tokens ) else: raise ValueError(f"Unsupported model type: {config.model_type}") def _create_tools(self, config: AgentConfig) -> List: """创建工具列表""" if not config.enable_tools: return [] tools = [] # 根据代理类型添加不同的工具 if "financial" in config.name.lower(): # YFinanceTools 现在是一个包含多个方法的 Toolkit # include_tools 参数可以指定哪些方法可用 tools.extend([ YFinanceTools( cache_results=True, include_tools=[ 'get_current_stock_price', 'get_historical_stock_prices', 'get_company_info', 'get_company_news', 'get_analyst_recommendations' ] ) ]) if "research" in config.name.lower(): # DuckDuckGoTools 也应该检查其 API tools.extend([ DuckDuckGoTools() ]) if "data" in config.name.lower(): tools.extend([ PythonTools(), FileTools() ]) return tools def _create_memory(self, config: AgentConfig) -> Optional[MemoryManager]: """创建记忆实例""" if not config.enable_memory: return None memory_key = f"{config.name}_memory" if memory_key not in self.memories: model = self._create_model(config) self.memories[memory_key] = MemoryManager( model=model, db=self._create_storage(config) if config.enable_storage else None, debug_mode=config.debug ) return self.memories[memory_key] def _create_storage(self, config: AgentConfig) -> Optional[SqliteDb]: """创建存储实例""" if not config.enable_storage: return None storage_key = f"{config.name}_storage" if storage_key not in self.storages: db_path = f"data/{config.name}_memory.db" os.makedirs(os.path.dirname(db_path), exist_ok=True) self.storages[storage_key] = SqliteDb(db_file=db_path) return self.storages[storage_key] def create_agent(self, name: str, custom_config: Optional[Dict] = None) -> Agent: """创建代理实例""" if name not in self.configs and not custom_config: raise ValueError(f"Agent '{name}' not found in configuration") # 使用自定义配置或现有配置 if custom_config: config = AgentConfig(name=name, **custom_config) else: config = self.configs[name] # 创建模型 model = self._create_model(config) # 创建工具 tools = self._create_tools(config) # 创建记忆 memory_manager = self._create_memory(config) # 创建代理 agent = Agent( name=name, model=model, tools=tools, memory_manager=memory_manager, markdown=config.markdown, telemetry=config.telemetry, debug_mode=config.debug, description=f"{name.replace('_', ' ').title()} agent" ) self.agents[name] = agent logger.info(f"Created agent: {name}") return agent def get_agent(self, name: str) -> Optional[Agent]: """获取代理实例""" return self.agents.get(name) def list_agents(self) -> List[str]: """列出所有代理名称""" return list(self.agents.keys()) def remove_agent(self, name: str): """移除代理实例""" if name in self.agents: del self.agents[name] logger.info(f"Removed agent: {name}") async def run_agent_async(self, name: str, query: str, **kwargs) -> str: """异步运行代理""" agent = self.get_agent(name) if not agent: raise ValueError(f"Agent '{name}' not found") try: response = await agent.arun(query, **kwargs) logger.info(f"Agent {name} completed task") return response.content except Exception as e: logger.error(f"Error running agent {name}: {str(e)}") raise def run_agent(self, name: str, query: str, **kwargs) -> str: """同步运行代理""" agent = self.get_agent(name) if not agent: raise ValueError(f"Agent '{name}' not found") try: response = agent.run(query, **kwargs) logger.info(f"Agent {name} completed task") return response.content except Exception as e: logger.error(f"Error running agent {name}: {str(e)}") raise def create_workflow(self, name: str, steps: List[Dict]) -> Workflow: """创建工作流""" workflow = Workflow(name=name) for i, step in enumerate(steps): step_name = step.get("name", f"step_{i+1}") agent_name = step["agent"] query = step["query"] workflow.add_agent_task( name=step_name, agent=self.get_agent(agent_name), query=query ) logger.info(f"Created workflow: {name}") return workflow # 示例用法和测试函数 class AgnoDemo: """演示类""" def __init__(self): self.manager = AgnoAgentManager() def setup_agents(self): """设置演示代理""" # 创建金融分析师代理 financial_agent = self.manager.create_agent("financial_analyst") # 创建研究助理代理 research_agent = self.manager.create_agent("research_assistant") # 创建数据分析师代理 data_agent = self.manager.create_agent("data_analyst") return financial_agent, research_agent, data_agent def demo_financial_analysis(self): """演示金融分析""" print("=== 金融分析演示 ===") queries = [ "分析苹果公司(AAPL)最近一年的股价表现,包括关键技术指标", "比较特斯拉(TSLA)和蔚来(NIO)的股票表现,哪个更值得投资?", "获取微软(MSFT)的最新财报数据和分析师评级" ] for query in queries: print(f"\n查询: {query}") try: result = self.manager.run_agent("financial_analyst", query) print(f"结果: {result[:500]}...") # 只显示前500字符 except Exception as e: print(f"错误: {str(e)}") def demo_research_assistant(self): """演示研究助理""" print("\n=== 研究助理演示 ===") queries = [ "搜索2024年最新的人工智能发展趋势", "查找关于量子计算的最新研究进展", "搜索可持续能源技术的最新突破" ] for query in queries: print(f"\n查询: {query}") try: result = self.manager.run_agent("research_assistant", query) print(f"结果: {result[:500]}...") except Exception as e: print(f"错误: {str(e)}") def demo_data_analysis(self): """演示数据分析""" print("\n=== 数据分析演示 ===") queries = [ "创建一个Python脚本来分析CSV文件中的销售数据", "生成一个数据可视化脚本来展示月度销售趋势", "编写一个函数来计算移动平均值" ] for query in queries: print(f"\n查询: {query}") try: result = self.manager.run_agent("data_analyst", query) print(f"结果: {result[:500]}...") except Exception as e: print(f"错误: {str(e)}") async def demo_workflow(self): """演示工作流""" print("\n=== 工作流演示 ===") # 创建一个研究->分析->报告的工作流 workflow_steps = [ { "name": "research", "agent": "research_assistant", "query": "搜索特斯拉公司2024年的最新发展和市场表现" }, { "name": "financial_analysis", "agent": "financial_analyst", "query": "基于研究数据,分析特斯拉股票的投资价值" }, { "name": "report_generation", "agent": "data_analyst", "query": "创建一个综合报告,总结特斯拉的研究和财务分析结果" } ] workflow = self.manager.create_workflow("tesla_analysis", workflow_steps) try: result = await workflow.arun() print(f"工作流结果: {result}") except Exception as e: print(f"工作流错误: {str(e)}") def run_all_demos(self): """运行所有演示""" print("开始 Agno2 全面演示...") # 设置代理 self.setup_agents() # 运行各个演示 self.demo_financial_analysis() self.demo_research_assistant() self.demo_data_analysis() # 异步运行工作流演示 print("\n运行异步工作流演示...") asyncio.run(self.demo_workflow()) print("\n=== 演示完成 ===") print(f"可用代理: {self.manager.list_agents()}") # 主函数 async def main(): """主函数""" # 检查环境变量 required_keys = ["DEEPSEEK_API_KEY"] missing_keys = [key for key in required_keys if not os.getenv(key)] if missing_keys: print(f"错误: 缺少环境变量 {missing_keys}") print("请设置以下环境变量:") print(" DEEPSEEK_API_KEY: DeepSeek API 密钥") print(" OPENAI_API_KEY: OpenAI API 密钥 (可选)") return # 创建数据目录 os.makedirs("data", exist_ok=True) os.makedirs("logs", exist_ok=True) # 运行演示 demo = AgnoDemo() # 命令行参数处理 import sys if len(sys.argv) > 1: command = sys.argv[1] if command == "demo": demo.run_all_demos() elif command == "financial": demo.setup_agents() demo.demo_financial_analysis() elif command == "research": demo.setup_agents() demo.demo_research_assistant() elif command == "data": demo.setup_agents() demo.demo_data_analysis() elif command == "workflow": demo.setup_agents() await demo.demo_workflow() else: print(f"未知命令: {command}") print("可用命令: demo, financial, research, data, workflow") else: # 交互模式 demo.setup_agents() print("\n=== Agno2 交互模式 ===") print("可用代理:", demo.manager.list_agents()) print("输入格式: <代理名称> | <查询内容>") print("输入 'quit' 退出") while True: try: user_input = input("\n> ").strip() if user_input.lower() == 'quit': break if '|' not in user_input: print("格式错误。请使用: <代理名称> | <查询内容>") continue agent_name, query = user_input.split('|', 1) agent_name = agent_name.strip() query = query.strip() if agent_name not in demo.manager.list_agents(): print(f"代理 '{agent_name}' 不存在") continue print(f"正在运行 {agent_name}...") result = demo.manager.run_agent(agent_name, query) print(f"结果:\n{result}") except KeyboardInterrupt: print("\n退出程序") break except Exception as e: print(f"错误: {str(e)}") if __name__ == "__main__": # 运行主函数 asyncio.run(main()) ```