agno 2.4.4__py3-none-any.whl → 2.4.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/agent/agent.py +47 -39
- agno/db/surrealdb/models.py +1 -1
- agno/knowledge/chunking/agentic.py +1 -5
- agno/knowledge/chunking/code.py +1 -1
- agno/knowledge/chunking/document.py +22 -42
- agno/knowledge/chunking/fixed.py +1 -5
- agno/knowledge/chunking/markdown.py +9 -25
- agno/knowledge/chunking/recursive.py +1 -3
- agno/knowledge/chunking/row.py +3 -2
- agno/knowledge/chunking/semantic.py +1 -1
- agno/knowledge/chunking/strategy.py +19 -0
- agno/knowledge/knowledge.py +181 -24
- agno/knowledge/reader/text_reader.py +1 -1
- agno/learn/stores/learned_knowledge.py +108 -131
- agno/team/team.py +27 -20
- agno/tools/seltz.py +134 -0
- agno/utils/print_response/agent.py +8 -8
- agno/utils/print_response/team.py +8 -8
- {agno-2.4.4.dist-info → agno-2.4.6.dist-info}/METADATA +36 -58
- {agno-2.4.4.dist-info → agno-2.4.6.dist-info}/RECORD +23 -22
- {agno-2.4.4.dist-info → agno-2.4.6.dist-info}/WHEEL +0 -0
- {agno-2.4.4.dist-info → agno-2.4.6.dist-info}/licenses/LICENSE +0 -0
- {agno-2.4.4.dist-info → agno-2.4.6.dist-info}/top_level.txt +0 -0
agno/tools/seltz.py
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.tools import Toolkit
|
|
6
|
+
from agno.utils.log import log_info, logger
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
from seltz import Seltz
|
|
10
|
+
from seltz.exceptions import (
|
|
11
|
+
SeltzAPIError,
|
|
12
|
+
SeltzAuthenticationError,
|
|
13
|
+
SeltzConfigurationError,
|
|
14
|
+
SeltzConnectionError,
|
|
15
|
+
SeltzError,
|
|
16
|
+
SeltzRateLimitError,
|
|
17
|
+
SeltzTimeoutError,
|
|
18
|
+
)
|
|
19
|
+
except ImportError as exc:
|
|
20
|
+
raise ImportError("`seltz` not installed. Please install using `pip install seltz`") from exc
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class SeltzTools(Toolkit):
|
|
24
|
+
"""Toolkit for interacting with the Seltz AI-powered search API.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
api_key: Seltz API key. If not provided, uses the `SELTZ_API_KEY` env var.
|
|
28
|
+
endpoint: Optional Seltz gRPC endpoint. If not provided, uses SDK default.
|
|
29
|
+
insecure: Use an insecure gRPC channel. Defaults to False.
|
|
30
|
+
max_documents: Default maximum number of documents to return per search.
|
|
31
|
+
show_results: Log search results for debugging.
|
|
32
|
+
enable_search: Enable search tool functionality. Defaults to True.
|
|
33
|
+
all: Enable all tools. Overrides individual flags when True. Defaults to False.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
api_key: Optional[str] = None,
|
|
39
|
+
endpoint: Optional[str] = None,
|
|
40
|
+
insecure: bool = False,
|
|
41
|
+
max_documents: int = 10,
|
|
42
|
+
show_results: bool = False,
|
|
43
|
+
enable_search: bool = True,
|
|
44
|
+
all: bool = False,
|
|
45
|
+
**kwargs: Any,
|
|
46
|
+
):
|
|
47
|
+
if max_documents <= 0:
|
|
48
|
+
raise ValueError("max_documents must be greater than 0")
|
|
49
|
+
|
|
50
|
+
self.api_key = api_key or getenv("SELTZ_API_KEY")
|
|
51
|
+
if not self.api_key:
|
|
52
|
+
logger.error("SELTZ_API_KEY not set. Please set the SELTZ_API_KEY environment variable.")
|
|
53
|
+
|
|
54
|
+
self.endpoint = endpoint
|
|
55
|
+
self.insecure = insecure
|
|
56
|
+
self.max_documents = max_documents
|
|
57
|
+
self.show_results = show_results
|
|
58
|
+
|
|
59
|
+
self.client: Optional[Seltz] = None
|
|
60
|
+
if self.api_key:
|
|
61
|
+
client_kwargs: dict[str, Any] = {"api_key": self.api_key}
|
|
62
|
+
if self.endpoint:
|
|
63
|
+
client_kwargs["endpoint"] = self.endpoint
|
|
64
|
+
if self.insecure:
|
|
65
|
+
client_kwargs["insecure"] = self.insecure
|
|
66
|
+
self.client = Seltz(**client_kwargs)
|
|
67
|
+
|
|
68
|
+
tools: List[Any] = []
|
|
69
|
+
if all or enable_search:
|
|
70
|
+
tools.append(self.search_seltz)
|
|
71
|
+
|
|
72
|
+
super().__init__(name="seltz", tools=tools, **kwargs)
|
|
73
|
+
|
|
74
|
+
def _parse_documents(self, documents: Any) -> str:
|
|
75
|
+
"""Convert Seltz documents into JSON for the agent."""
|
|
76
|
+
parsed: List[dict[str, Any]] = []
|
|
77
|
+
for doc in documents or []:
|
|
78
|
+
doc_dict: dict[str, Any] = {}
|
|
79
|
+
url = getattr(doc, "url", None)
|
|
80
|
+
content = getattr(doc, "content", None)
|
|
81
|
+
|
|
82
|
+
if url is not None:
|
|
83
|
+
doc_dict["url"] = url
|
|
84
|
+
if content:
|
|
85
|
+
doc_dict["content"] = content
|
|
86
|
+
if doc_dict:
|
|
87
|
+
parsed.append(doc_dict)
|
|
88
|
+
return json.dumps(parsed, indent=4, ensure_ascii=False)
|
|
89
|
+
|
|
90
|
+
def search_seltz(self, query: str, max_documents: Optional[int] = None) -> str:
|
|
91
|
+
"""Use this function to search Seltz for a query.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
query: The query to search for.
|
|
95
|
+
max_documents: Maximum number of documents to return. Defaults to toolkit `max_documents`.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
str: Search results in JSON format.
|
|
99
|
+
"""
|
|
100
|
+
if not query:
|
|
101
|
+
return "Error: Please provide a query to search for."
|
|
102
|
+
|
|
103
|
+
if not self.client:
|
|
104
|
+
return "Error: SELTZ_API_KEY not set. Please set the SELTZ_API_KEY environment variable."
|
|
105
|
+
|
|
106
|
+
limit = max_documents if max_documents is not None else self.max_documents
|
|
107
|
+
if limit <= 0:
|
|
108
|
+
return "Error: max_documents must be greater than 0."
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
if self.show_results:
|
|
112
|
+
log_info(f"Searching Seltz for: {query}")
|
|
113
|
+
|
|
114
|
+
response = self.client.search(query, max_documents=limit)
|
|
115
|
+
result = self._parse_documents(getattr(response, "documents", []))
|
|
116
|
+
|
|
117
|
+
if self.show_results:
|
|
118
|
+
log_info(result)
|
|
119
|
+
|
|
120
|
+
return result
|
|
121
|
+
except (
|
|
122
|
+
SeltzConfigurationError,
|
|
123
|
+
SeltzAuthenticationError,
|
|
124
|
+
SeltzConnectionError,
|
|
125
|
+
SeltzTimeoutError,
|
|
126
|
+
SeltzRateLimitError,
|
|
127
|
+
SeltzAPIError,
|
|
128
|
+
SeltzError,
|
|
129
|
+
) as exc:
|
|
130
|
+
logger.error(f"Seltz error: {exc}")
|
|
131
|
+
return f"Error: {exc}"
|
|
132
|
+
except Exception as exc:
|
|
133
|
+
logger.error(f"Failed to search Seltz: {exc}")
|
|
134
|
+
return f"Error: {exc}"
|
|
@@ -57,7 +57,7 @@ def print_response_stream(
|
|
|
57
57
|
accumulated_tool_calls: List = []
|
|
58
58
|
|
|
59
59
|
with Live(console=console) as live_log:
|
|
60
|
-
status = Status("
|
|
60
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
61
61
|
live_log.update(status)
|
|
62
62
|
response_timer = Timer()
|
|
63
63
|
response_timer.start()
|
|
@@ -224,7 +224,7 @@ def print_response_stream(
|
|
|
224
224
|
|
|
225
225
|
response_timer.stop()
|
|
226
226
|
|
|
227
|
-
# Final update to remove the "
|
|
227
|
+
# Final update to remove the "Working..." status
|
|
228
228
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
229
229
|
live_log.update(Group(*panels))
|
|
230
230
|
|
|
@@ -262,7 +262,7 @@ async def aprint_response_stream(
|
|
|
262
262
|
accumulated_tool_calls: List = []
|
|
263
263
|
|
|
264
264
|
with Live(console=console) as live_log:
|
|
265
|
-
status = Status("
|
|
265
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
266
266
|
live_log.update(status)
|
|
267
267
|
response_timer = Timer()
|
|
268
268
|
response_timer.start()
|
|
@@ -429,7 +429,7 @@ async def aprint_response_stream(
|
|
|
429
429
|
|
|
430
430
|
response_timer.stop()
|
|
431
431
|
|
|
432
|
-
# Final update to remove the "
|
|
432
|
+
# Final update to remove the "Working..." status
|
|
433
433
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
434
434
|
live_log.update(Group(*panels))
|
|
435
435
|
|
|
@@ -571,7 +571,7 @@ def print_response(
|
|
|
571
571
|
**kwargs: Any,
|
|
572
572
|
):
|
|
573
573
|
with Live(console=console) as live_log:
|
|
574
|
-
status = Status("
|
|
574
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
575
575
|
live_log.update(status)
|
|
576
576
|
response_timer = Timer()
|
|
577
577
|
response_timer.start()
|
|
@@ -659,7 +659,7 @@ def print_response(
|
|
|
659
659
|
live_log.update(Group(*panels))
|
|
660
660
|
agent.session_summary_manager.summaries_updated = False
|
|
661
661
|
|
|
662
|
-
# Final update to remove the "
|
|
662
|
+
# Final update to remove the "Working..." status
|
|
663
663
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
664
664
|
live_log.update(Group(*panels))
|
|
665
665
|
|
|
@@ -691,7 +691,7 @@ async def aprint_response(
|
|
|
691
691
|
**kwargs: Any,
|
|
692
692
|
):
|
|
693
693
|
with Live(console=console) as live_log:
|
|
694
|
-
status = Status("
|
|
694
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
695
695
|
live_log.update(status)
|
|
696
696
|
response_timer = Timer()
|
|
697
697
|
response_timer.start()
|
|
@@ -779,7 +779,7 @@ async def aprint_response(
|
|
|
779
779
|
panels.append(summary_panel)
|
|
780
780
|
live_log.update(Group(*panels))
|
|
781
781
|
|
|
782
|
-
# Final update to remove the "
|
|
782
|
+
# Final update to remove the "Working..." status
|
|
783
783
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
784
784
|
live_log.update(Group(*panels))
|
|
785
785
|
|
|
@@ -61,7 +61,7 @@ def print_response(
|
|
|
61
61
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
62
62
|
|
|
63
63
|
with Live(console=console) as live_console:
|
|
64
|
-
status = Status("
|
|
64
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
65
65
|
live_console.update(status)
|
|
66
66
|
|
|
67
67
|
response_timer = Timer()
|
|
@@ -349,7 +349,7 @@ def print_response(
|
|
|
349
349
|
panels.append(summary_panel)
|
|
350
350
|
team.session_summary_manager.summaries_updated = False
|
|
351
351
|
|
|
352
|
-
# Final update to remove the "
|
|
352
|
+
# Final update to remove the "Working..." status
|
|
353
353
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
354
354
|
live_console.update(Group(*panels))
|
|
355
355
|
|
|
@@ -410,7 +410,7 @@ def print_response_stream(
|
|
|
410
410
|
processed_tool_calls = set()
|
|
411
411
|
|
|
412
412
|
with Live(console=console) as live_console:
|
|
413
|
-
status = Status("
|
|
413
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
414
414
|
live_console.update(status)
|
|
415
415
|
response_timer = Timer()
|
|
416
416
|
response_timer.start()
|
|
@@ -735,7 +735,7 @@ def print_response_stream(
|
|
|
735
735
|
live_console.update(Group(*panels))
|
|
736
736
|
team.session_summary_manager.summaries_updated = False
|
|
737
737
|
|
|
738
|
-
# Final update to remove the "
|
|
738
|
+
# Final update to remove the "Working..." status
|
|
739
739
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
740
740
|
|
|
741
741
|
if markdown:
|
|
@@ -992,7 +992,7 @@ async def aprint_response(
|
|
|
992
992
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
993
993
|
|
|
994
994
|
with Live(console=console) as live_console:
|
|
995
|
-
status = Status("
|
|
995
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
996
996
|
live_console.update(status)
|
|
997
997
|
|
|
998
998
|
response_timer = Timer()
|
|
@@ -1278,7 +1278,7 @@ async def aprint_response(
|
|
|
1278
1278
|
panels.append(summary_panel)
|
|
1279
1279
|
team.session_summary_manager.summaries_updated = False
|
|
1280
1280
|
|
|
1281
|
-
# Final update to remove the "
|
|
1281
|
+
# Final update to remove the "Working..." status
|
|
1282
1282
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
1283
1283
|
live_console.update(Group(*panels))
|
|
1284
1284
|
|
|
@@ -1340,7 +1340,7 @@ async def aprint_response_stream(
|
|
|
1340
1340
|
final_panels = [] # type: ignore
|
|
1341
1341
|
|
|
1342
1342
|
with Live(console=console) as live_console:
|
|
1343
|
-
status = Status("
|
|
1343
|
+
status = Status("Working...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
1344
1344
|
live_console.update(status)
|
|
1345
1345
|
response_timer = Timer()
|
|
1346
1346
|
response_timer.start()
|
|
@@ -1663,7 +1663,7 @@ async def aprint_response_stream(
|
|
|
1663
1663
|
live_console.update(Group(*panels))
|
|
1664
1664
|
team.session_summary_manager.summaries_updated = False
|
|
1665
1665
|
|
|
1666
|
-
# Final update to remove the "
|
|
1666
|
+
# Final update to remove the "Working..." status
|
|
1667
1667
|
panels = [p for p in panels if not isinstance(p, Status)]
|
|
1668
1668
|
|
|
1669
1669
|
if markdown:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agno
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.6
|
|
4
4
|
Summary: Agno: a lightweight library for building Multi-Agent Systems
|
|
5
5
|
Author-email: Ashpreet Bedi <ashpreet@agno.com>
|
|
6
6
|
Project-URL: homepage, https://agno.com
|
|
@@ -132,6 +132,8 @@ Provides-Extra: evm
|
|
|
132
132
|
Requires-Dist: web3; extra == "evm"
|
|
133
133
|
Provides-Extra: exa
|
|
134
134
|
Requires-Dist: exa_py; extra == "exa"
|
|
135
|
+
Provides-Extra: seltz
|
|
136
|
+
Requires-Dist: seltz; extra == "seltz"
|
|
135
137
|
Provides-Extra: fal
|
|
136
138
|
Requires-Dist: fal_client; extra == "fal"
|
|
137
139
|
Provides-Extra: firecrawl
|
|
@@ -264,7 +266,7 @@ Provides-Extra: excel
|
|
|
264
266
|
Requires-Dist: openpyxl; extra == "excel"
|
|
265
267
|
Requires-Dist: xlrd; extra == "excel"
|
|
266
268
|
Provides-Extra: markdown
|
|
267
|
-
Requires-Dist: unstructured; extra == "markdown"
|
|
269
|
+
Requires-Dist: unstructured<0.18.31; extra == "markdown"
|
|
268
270
|
Requires-Dist: markdown; extra == "markdown"
|
|
269
271
|
Requires-Dist: aiofiles; extra == "markdown"
|
|
270
272
|
Provides-Extra: chonkie
|
|
@@ -308,6 +310,7 @@ Provides-Extra: tools
|
|
|
308
310
|
Requires-Dist: agno[apify]; extra == "tools"
|
|
309
311
|
Requires-Dist: agno[arxiv]; extra == "tools"
|
|
310
312
|
Requires-Dist: agno[exa]; extra == "tools"
|
|
313
|
+
Requires-Dist: agno[seltz]; extra == "tools"
|
|
311
314
|
Requires-Dist: agno[cartesia]; extra == "tools"
|
|
312
315
|
Requires-Dist: agno[ddg]; extra == "tools"
|
|
313
316
|
Requires-Dist: agno[duckdb]; extra == "tools"
|
|
@@ -442,7 +445,7 @@ Dynamic: license-file
|
|
|
442
445
|
</div>
|
|
443
446
|
|
|
444
447
|
<p align="center">
|
|
445
|
-
Build
|
|
448
|
+
Build agents that learn.
|
|
446
449
|
</p>
|
|
447
450
|
|
|
448
451
|
<div align="center">
|
|
@@ -457,68 +460,58 @@ Dynamic: license-file
|
|
|
457
460
|
|
|
458
461
|
## What is Agno?
|
|
459
462
|
|
|
460
|
-
|
|
463
|
+
**A Python SDK for building agents that learn and improve with every interaction.**
|
|
461
464
|
|
|
462
|
-
|
|
463
|
-
|-------|--------------|
|
|
464
|
-
| **Framework** | Build agents, teams, and workflows with memory, knowledge, guardrails, and 100+ integrations |
|
|
465
|
-
| **AgentOS Runtime** | Run your system in production with a stateless, secure FastAPI backend |
|
|
466
|
-
| **Control Plane** | Test, monitor, and manage your system using the [AgentOS UI](https://os.agno.com) |
|
|
465
|
+
Most agents are stateless. They reason, respond, forget. Session history helps, but they're exactly as capable on day 1000 as they were on day 1.
|
|
467
466
|
|
|
468
|
-
|
|
467
|
+
Agno agents are different. They remember users across sessions, accumulate knowledge across conversations, and learn from decisions. Insights from one user benefit everyone.
|
|
469
468
|
|
|
470
|
-
|
|
471
|
-
- **Production-ready on day one.** Pre-built FastAPI runtime with SSE endpoints, ready to deploy.
|
|
472
|
-
- **Fast.** 529× faster instantiation than LangGraph. 24× lower memory. [See benchmarks →](#performance)
|
|
469
|
+
Everything runs in your cloud. Your data never leaves your environment.
|
|
473
470
|
|
|
474
|
-
## Example
|
|
475
|
-
|
|
476
|
-
An agent with MCP tools, persistent state, served via FastAPI:
|
|
471
|
+
## Quick Example
|
|
477
472
|
```python
|
|
478
473
|
from agno.agent import Agent
|
|
479
474
|
from agno.db.sqlite import SqliteDb
|
|
480
|
-
from agno.models.
|
|
481
|
-
from agno.os import AgentOS
|
|
482
|
-
from agno.tools.mcp import MCPTools
|
|
475
|
+
from agno.models.openai import OpenAIResponses
|
|
483
476
|
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
tools=[MCPTools(transport="streamable-http", url="https://docs.agno.com/mcp")],
|
|
489
|
-
add_history_to_context=True,
|
|
490
|
-
markdown=True,
|
|
477
|
+
agent = Agent(
|
|
478
|
+
model=OpenAIResponses(id="gpt-5.2"),
|
|
479
|
+
db=SqliteDb(db_file="tmp/agents.db"),
|
|
480
|
+
learning=True,
|
|
491
481
|
)
|
|
492
|
-
|
|
493
|
-
agent_os = AgentOS(agents=[agno_agent])
|
|
494
|
-
app = agent_os.get_app()
|
|
495
|
-
|
|
496
|
-
if __name__ == "__main__":
|
|
497
|
-
agent_os.serve(app="agno_agent:app", reload=True)
|
|
498
482
|
```
|
|
499
483
|
|
|
500
|
-
|
|
484
|
+
One line. Your agent now remembers users, accumulates knowledge, and improves over time.
|
|
485
|
+
|
|
486
|
+
## Production Stack
|
|
501
487
|
|
|
502
|
-
|
|
488
|
+
| Layer | What it does |
|
|
489
|
+
|-------|--------------|
|
|
490
|
+
| **SDK** | Build agents with learning, tools, knowledge, and guardrails |
|
|
491
|
+
| **Runtime** | Run in production using [AgentOS](https://docs.agno.com/agent-os/introduction) |
|
|
492
|
+
| **Control Plane** | Monitor and manage via the [AgentOS UI](https://os.agno.com) |
|
|
503
493
|
|
|
504
494
|
## Features
|
|
505
495
|
|
|
496
|
+
**Learning**
|
|
497
|
+
- User profiles that persist across sessions
|
|
498
|
+
- User memories that accumulate over time
|
|
499
|
+
- Learned knowledge that transfers across users
|
|
500
|
+
- Always or agentic learning modes
|
|
501
|
+
|
|
506
502
|
**Core**
|
|
507
503
|
- Model-agnostic: OpenAI, Anthropic, Google, local models
|
|
508
504
|
- Type-safe I/O with `input_schema` and `output_schema`
|
|
509
505
|
- Async-first, built for long-running tasks
|
|
510
506
|
- Natively multimodal (text, images, audio, video, files)
|
|
511
507
|
|
|
512
|
-
**
|
|
513
|
-
- Persistent storage for session history and state
|
|
514
|
-
- User memory across sessions
|
|
508
|
+
**Knowledge**
|
|
515
509
|
- Agentic RAG with 20+ vector stores, hybrid search, reranking
|
|
516
|
-
-
|
|
510
|
+
- Persistent storage for session history and state
|
|
517
511
|
|
|
518
512
|
**Orchestration**
|
|
519
513
|
- Human-in-the-loop (confirmations, approvals, overrides)
|
|
520
514
|
- Guardrails for validation and security
|
|
521
|
-
- Pre/post hooks for the agent lifecycle
|
|
522
515
|
- First-class MCP and A2A support
|
|
523
516
|
- 100+ built-in toolkits
|
|
524
517
|
|
|
@@ -526,27 +519,12 @@ https://github.com/user-attachments/assets/feb23db8-15cc-4e88-be7c-01a21a03ebf6
|
|
|
526
519
|
- Ready-to-use FastAPI runtime
|
|
527
520
|
- Integrated control plane UI
|
|
528
521
|
- Evals for accuracy, performance, latency
|
|
529
|
-
- Durable execution for resumable workflows
|
|
530
|
-
- RBAC and per-agent permissions
|
|
531
522
|
|
|
532
523
|
## Getting Started
|
|
533
524
|
|
|
534
|
-
1. Follow the [quickstart
|
|
535
|
-
2. Browse the [cookbook](https://github.com/agno-agi/agno/tree/main/cookbook)
|
|
536
|
-
3. Read the [docs](https://docs.agno.com)
|
|
537
|
-
|
|
538
|
-
## Performance
|
|
539
|
-
|
|
540
|
-
Agent workloads spawn hundreds of instances. Stateless, horizontal scalability isn't optional.
|
|
541
|
-
|
|
542
|
-
| Metric | Agno | LangGraph | PydanticAI | CrewAI |
|
|
543
|
-
|--------|------|-----------|------------|--------|
|
|
544
|
-
| Instantiation | **3μs** | 1,587μs (529×) | 170μs (57×) | 210μs (70×) |
|
|
545
|
-
| Memory | **6.6 KiB** | 161 KiB (24×) | 29 KiB (4×) | 66 KiB (10×) |
|
|
546
|
-
|
|
547
|
-
<sub>Apple M4 MacBook Pro, Oct 2025. [Run benchmarks yourself →](https://github.com/agno-agi/agno/tree/main/cookbook/12_evals/performance)</sub>
|
|
548
|
-
|
|
549
|
-
https://github.com/user-attachments/assets/54b98576-1859-4880-9f2d-15e1a426719d
|
|
525
|
+
1. Follow the [quickstart](https://docs.agno.com/get-started/quickstart)
|
|
526
|
+
2. Browse the [cookbook](https://github.com/agno-agi/agno/tree/main/cookbook)
|
|
527
|
+
3. Read the [docs](https://docs.agno.com)
|
|
550
528
|
|
|
551
529
|
## IDE Integration
|
|
552
530
|
|
|
@@ -558,7 +536,7 @@ Also works with VSCode, Windsurf, and similar tools.
|
|
|
558
536
|
|
|
559
537
|
## Contributing
|
|
560
538
|
|
|
561
|
-
|
|
539
|
+
See the [contributing guide](https://github.com/agno-agi/agno/blob/v2.0/CONTRIBUTING.md).
|
|
562
540
|
|
|
563
541
|
## Telemetry
|
|
564
542
|
|
|
@@ -6,7 +6,7 @@ agno/media.py,sha256=PisfrNwkx2yVOW8p6LXlV237jI06Y6kGjd7wUMk5170,17121
|
|
|
6
6
|
agno/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
7
|
agno/table.py,sha256=9hHFnInNsrj0ZKtWjGDP5c6kbmNdtQvDDYT2j2CZJ6o,198
|
|
8
8
|
agno/agent/__init__.py,sha256=YwN1bvBECSRRQ9mOCZ40eCO4WN5xEPEh0jxWyc83vX4,1190
|
|
9
|
-
agno/agent/agent.py,sha256=
|
|
9
|
+
agno/agent/agent.py,sha256=mu6uYbs5G31HFfMEM5qmmD6r7ic5OTRKsiOVgjnYLEg,563740
|
|
10
10
|
agno/agent/remote.py,sha256=3PvPEXLH4QAGVsPnoD0qKDv05swRZpB0gw9bQDCJiLw,19667
|
|
11
11
|
agno/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
12
|
agno/api/agent.py,sha256=fKlQ62E_C9Rjd7Zus3Gs3R1RG-IhzFV-ICpkb6SLqYc,932
|
|
@@ -103,7 +103,7 @@ agno/db/sqlite/sqlite.py,sha256=0GQR3FS9UlDxFQs1VF_t5OXhw7FBccfL6CO8JZE7CKY,1765
|
|
|
103
103
|
agno/db/sqlite/utils.py,sha256=PZp-g4oUf6Iw1kuDAmOpIBtfyg4poKiG_DxXP4EonFI,15721
|
|
104
104
|
agno/db/surrealdb/__init__.py,sha256=C8qp5-Nx9YnSmgKEtGua-sqG_ntCXONBw1qqnNyKPqI,75
|
|
105
105
|
agno/db/surrealdb/metrics.py,sha256=oKDRyjRQ6KR3HaO8zDHQLVMG7-0NDkOFOKX5I7mD5FA,10336
|
|
106
|
-
agno/db/surrealdb/models.py,sha256=
|
|
106
|
+
agno/db/surrealdb/models.py,sha256=2x0HQSifkxVhQg2eJyAnRyBQASY09Rgbx3HACC_XpqQ,12887
|
|
107
107
|
agno/db/surrealdb/queries.py,sha256=s__yJSFIx387IEflcDdti7T5j6H9NX_-zIj13F9CN9s,2051
|
|
108
108
|
agno/db/surrealdb/surrealdb.py,sha256=RpjWArgMSzRE5MCclGVh-0d3T2bYmIIRB-1mJwHhgSo,77128
|
|
109
109
|
agno/db/surrealdb/utils.py,sha256=PcZo_cTy-jI59I-XhzAomRLdV9-m0irtO4C-AYGSghs,5405
|
|
@@ -127,20 +127,20 @@ agno/integrations/discord/client.py,sha256=HbXQHHOKKSVFZs0sIJlzoW9bLigbBgOE2kP0I
|
|
|
127
127
|
agno/knowledge/__init__.py,sha256=MTLKRRh6eqz-w_gw56rqdwV9FoeE9zjX8xYUCCdYg8A,243
|
|
128
128
|
agno/knowledge/content.py,sha256=q2bjcjDhfge_UrQAcygrv5R9ZTk7vozzKnQpatDQWRo,2295
|
|
129
129
|
agno/knowledge/filesystem.py,sha256=zq7xMDkH64x4UM9jcKLIBmPOJcrud2e-lb-pMtaFUSI,15102
|
|
130
|
-
agno/knowledge/knowledge.py,sha256=
|
|
130
|
+
agno/knowledge/knowledge.py,sha256=Gm37EALvmgTm-PeIqPpWYq-vGkTqtkgOuNHCJvXyqwo,221034
|
|
131
131
|
agno/knowledge/protocol.py,sha256=_hSe0czvTOmu9_NtzsaOxDCnTMYklObxYTphQB3pZ9M,4248
|
|
132
132
|
agno/knowledge/types.py,sha256=4NnkL_h2W-7GQnHW-yIqMNPUCWLzo5qBXF99gfsMe08,773
|
|
133
133
|
agno/knowledge/utils.py,sha256=GJHL1vAOrD6KFEpOiN4Gsgz70fRG0E-jooKIBdfq4zI,9853
|
|
134
134
|
agno/knowledge/chunking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
135
|
-
agno/knowledge/chunking/agentic.py,sha256=
|
|
136
|
-
agno/knowledge/chunking/code.py,sha256=
|
|
137
|
-
agno/knowledge/chunking/document.py,sha256=
|
|
138
|
-
agno/knowledge/chunking/fixed.py,sha256=
|
|
139
|
-
agno/knowledge/chunking/markdown.py,sha256=
|
|
140
|
-
agno/knowledge/chunking/recursive.py,sha256=
|
|
141
|
-
agno/knowledge/chunking/row.py,sha256=
|
|
142
|
-
agno/knowledge/chunking/semantic.py,sha256=
|
|
143
|
-
agno/knowledge/chunking/strategy.py,sha256=
|
|
135
|
+
agno/knowledge/chunking/agentic.py,sha256=5gQFL0OCGlYY_c9_1RmcCNSRixFSQOxc6FCDqpS7xTM,3038
|
|
136
|
+
agno/knowledge/chunking/code.py,sha256=mlr5mcaC-5HHfiVvigsBtxcFQ77teFe0ArZx2F-oA10,3572
|
|
137
|
+
agno/knowledge/chunking/document.py,sha256=aEl_n3EOZbSGUaxABgF8Up_QL1hFb1U6SDEhq1jX5N8,5872
|
|
138
|
+
agno/knowledge/chunking/fixed.py,sha256=Boa64-g6xHoMqIeGZwvjkWy0PrkByP00NRwZ2EwXia4,2241
|
|
139
|
+
agno/knowledge/chunking/markdown.py,sha256=AOOaqFLRFnXPMVQ7oingA_zy_LPaerNpPlsx_p3MON4,14179
|
|
140
|
+
agno/knowledge/chunking/recursive.py,sha256=sU-1tlWdeJ5sh2_R3HM0e0rrEFWIV12mqR0TgPx9uZY,2320
|
|
141
|
+
agno/knowledge/chunking/row.py,sha256=k3-kI33n2a4Pe5b66_WUU2DLgw-0Me_s30WKptTjwEk,1477
|
|
142
|
+
agno/knowledge/chunking/semantic.py,sha256=saVCSWjy4ZC44UWsTwUt25FPjemK4oLZgZkPt8JdZpg,7270
|
|
143
|
+
agno/knowledge/chunking/strategy.py,sha256=M8-2i5uXZCEYHswuzLcyAdZL1cgczd7-SAK3-gDp2nE,8102
|
|
144
144
|
agno/knowledge/document/__init__.py,sha256=vxMAu103larPlcpJFG3sBg-sCATf-LZZO_SlOwlEY5E,81
|
|
145
145
|
agno/knowledge/document/base.py,sha256=kvoLSAxc8snrayo_-C6L3HxJVXwZiXd7Maq6VToLgfg,2087
|
|
146
146
|
agno/knowledge/embedder/__init__.py,sha256=RdjcB1qoXuGVLlIkD-hn3B4zs8ycabmCVRmZsG3RhCQ,81
|
|
@@ -177,7 +177,7 @@ agno/knowledge/reader/pptx_reader.py,sha256=wk3gSEhxJl36jlbNYCDIyKXjx_sy7r4xiRMa
|
|
|
177
177
|
agno/knowledge/reader/reader_factory.py,sha256=Sl8KbeRJW1vAbxvK8imnS3Wae5zRsB1zvYN_50DPjO0,17349
|
|
178
178
|
agno/knowledge/reader/s3_reader.py,sha256=F1glvjOpArXPSN8uCdjtnEe-S8HTJ-w7Av34bsFa7-g,3279
|
|
179
179
|
agno/knowledge/reader/tavily_reader.py,sha256=LpKdMb9Z6UpDyNq137voesolGE8uCGjqf398JsQqkgY,7228
|
|
180
|
-
agno/knowledge/reader/text_reader.py,sha256=
|
|
180
|
+
agno/knowledge/reader/text_reader.py,sha256=RNiH-vkAyxR7bTsmmxDwZxmFWnOLYgStvN2XFonoA7o,4607
|
|
181
181
|
agno/knowledge/reader/web_search_reader.py,sha256=bhFJqqlaRxJSQYE1oMlUiImW4DriOH1GwS5MAkBXyHA,12118
|
|
182
182
|
agno/knowledge/reader/website_reader.py,sha256=B64_xoH3Mlfweyj96msTiIW42-aN_OOAfhNkZyWIzmU,19431
|
|
183
183
|
agno/knowledge/reader/wikipedia_reader.py,sha256=C5aMlTwRHRW7FFh2c-JKZLlX5l0PzW6khq5Tu37FwbU,3137
|
|
@@ -201,7 +201,7 @@ agno/learn/utils.py,sha256=dUL_oKWHPyUWF5e2muJyNo9W4Y7fwePESI_APQUZ12g,5672
|
|
|
201
201
|
agno/learn/stores/__init__.py,sha256=c5kC8X5bgZwwRG7epKU5IHdJ-eA9qKcC9G756Xrk2CA,1306
|
|
202
202
|
agno/learn/stores/decision_log.py,sha256=gzGhHKe8YZ3I8C_xuTJzAobUmVQRhrFZSZ5W9pyHxis,37933
|
|
203
203
|
agno/learn/stores/entity_memory.py,sha256=6liU6aoR7C2tI91fgU2BUChtTYlCLM1dH4Ad6Iu7dOY,117078
|
|
204
|
-
agno/learn/stores/learned_knowledge.py,sha256=
|
|
204
|
+
agno/learn/stores/learned_knowledge.py,sha256=raSP6T4zEEYRzEtepA4Vi042yqZpWbM7mIcPSFZiFh8,57001
|
|
205
205
|
agno/learn/stores/protocol.py,sha256=SaB76BIXCQMTcEHQDNxUxPnOE2Jx9MMPj3tNsk9_VJk,3324
|
|
206
206
|
agno/learn/stores/session_context.py,sha256=OQFk4OfYmHSNsytTfmm_4DJNTptNoDHWfqGnBHh06zU,48128
|
|
207
207
|
agno/learn/stores/user_memory.py,sha256=le3Vi1hsokopWeMkme9t-ju6GCP1w6z16iJ6Mi6hKdQ,55648
|
|
@@ -422,7 +422,7 @@ agno/skills/loaders/base.py,sha256=Syt6lIOe-m_Kz68ndwuVed3wZFAPvYDDnJkhypazYJ8,7
|
|
|
422
422
|
agno/skills/loaders/local.py,sha256=7budE7d-JG86XyqnRwo495yiYWDjj16yDV67aiSacOQ,7478
|
|
423
423
|
agno/team/__init__.py,sha256=Ff5VMcZnkimttdCcRFEL852JgInlWCkpdlgyfhXfIo8,971
|
|
424
424
|
agno/team/remote.py,sha256=BgUEQsTFA4tehDas1YO7lwQCj3cLJrxfoSFVOYm_1po,16979
|
|
425
|
-
agno/team/team.py,sha256=
|
|
425
|
+
agno/team/team.py,sha256=rIgZH9J0CRPEiInYQkS4xTSNsFZIkXMC1NvMBEirJv0,477194
|
|
426
426
|
agno/tools/__init__.py,sha256=jNll2sELhPPbqm5nPeT4_uyzRO2_KRTW-8Or60kioS0,210
|
|
427
427
|
agno/tools/agentql.py,sha256=S82Z9aTNr-E5wnA4fbFs76COljJtiQIjf2grjz3CkHU,4104
|
|
428
428
|
agno/tools/airflow.py,sha256=uf2rOzZpSU64l_qRJ5Raku-R3Gky-uewmYkh6W0-oxg,2610
|
|
@@ -507,6 +507,7 @@ agno/tools/replicate.py,sha256=xVh6F2OCjIuCT8qt_ryzHb46ZctQ3_9bQhXQ5-HrzYQ,4459
|
|
|
507
507
|
agno/tools/resend.py,sha256=TKsb5W_Yj0SaVBFL2ySACkehIW6bPnQ9GzYwldfordo,1990
|
|
508
508
|
agno/tools/scrapegraph.py,sha256=j72ZfoITjqcRgGUesgHZddwt9kj1dS1KGyLKI0EFbHE,8328
|
|
509
509
|
agno/tools/searxng.py,sha256=t041lAuCIAREU6I13SvNwh3B27m62c_0mfiB3_bx9vw,4970
|
|
510
|
+
agno/tools/seltz.py,sha256=hWZMYQl-FdXhlUQqr5lQzplNEIHacL_J0j2DKavd-5A,4678
|
|
510
511
|
agno/tools/serpapi.py,sha256=3jTBH93OiN7LvS7zJt4xOhkNsNd_SADHLKzQKDckh2s,3925
|
|
511
512
|
agno/tools/serper.py,sha256=3UfqCgJLjQopomy_7JDWHN6WOyOYKlTr1bOpw1vd934,9069
|
|
512
513
|
agno/tools/shell.py,sha256=1cQVdrJI6oWzDY6H50ISFfzvnK7p6uH3FqRa4HXbM_U,1764
|
|
@@ -613,8 +614,8 @@ agno/utils/models/openai_responses.py,sha256=63f2UgDFCzrr6xQITrGtn42UUHQBcZFUUFM
|
|
|
613
614
|
agno/utils/models/schema_utils.py,sha256=L6TkraMClI471H6xYy7V81lhHR4qQloVKCN0bF4Ajw0,5047
|
|
614
615
|
agno/utils/models/watsonx.py,sha256=fe6jN0hBvOCQurqjS6_9PIwDHt-4kVod9qW236Zs6DU,1496
|
|
615
616
|
agno/utils/print_response/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
616
|
-
agno/utils/print_response/agent.py,sha256=
|
|
617
|
-
agno/utils/print_response/team.py,sha256=
|
|
617
|
+
agno/utils/print_response/agent.py,sha256=NIDrS4zl6FzFyAgMKBF_6V9A9ELUPwMEev73bfddkrc,40416
|
|
618
|
+
agno/utils/print_response/team.py,sha256=cODB1m0AxVlnLseTt2_dlZl02-rFPtwvp-8TPdD_C4c,88755
|
|
618
619
|
agno/utils/print_response/workflow.py,sha256=pZ7DmJaLx0FWNzXJCKs6gplmA0XAzqxZK1nLQNfePW0,78707
|
|
619
620
|
agno/vectordb/__init__.py,sha256=P0QP9PUC4j2JtWIfYJX7LeC-oiPuh_QsUaOaP1ZY_dI,64
|
|
620
621
|
agno/vectordb/base.py,sha256=0AmdEM2DIE2WdRJIcISEfaQgeYIDpZrMfbnPPI2HrE4,4344
|
|
@@ -673,8 +674,8 @@ agno/workflow/step.py,sha256=AgSugOOoWidfZGFtR5PMpgWSBpIeUQB45vmaUDnV7E8,77919
|
|
|
673
674
|
agno/workflow/steps.py,sha256=p1RdyTZIKDYOPdxU7FbsX_vySWehPWaobge76Q_UDac,26462
|
|
674
675
|
agno/workflow/types.py,sha256=t4304WCKB19QFdV3ixXZICcU8wtBza4EBCIz5Ve6MSQ,18035
|
|
675
676
|
agno/workflow/workflow.py,sha256=S4Iwx3LtpeE_XZ61slYvnM90BdnGhW6Gfax_BKEUG68,218609
|
|
676
|
-
agno-2.4.
|
|
677
|
-
agno-2.4.
|
|
678
|
-
agno-2.4.
|
|
679
|
-
agno-2.4.
|
|
680
|
-
agno-2.4.
|
|
677
|
+
agno-2.4.6.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
678
|
+
agno-2.4.6.dist-info/METADATA,sha256=MmLfiyHxq2B7hn_o0JMPG7Hwnk5Hn_yz8RhixiReUOY,21116
|
|
679
|
+
agno-2.4.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
680
|
+
agno-2.4.6.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
|
|
681
|
+
agno-2.4.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|