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/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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
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 "Thinking..." status
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.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, run, manage multi-agent systems.
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
- Agno is a framework, runtime, and control plane for multi-agent systems.
463
+ **A Python SDK for building agents that learn and improve with every interaction.**
461
464
 
462
- | Layer | What it does |
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
- ## Why Agno?
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
- - **Private by design.** AgentOS runs in your cloud. The control plane connects directly to your runtime from your browser. No retention costs, no vendor lock-in, no compliance headaches.
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.anthropic import Claude
481
- from agno.os import AgentOS
482
- from agno.tools.mcp import MCPTools
475
+ from agno.models.openai import OpenAIResponses
483
476
 
484
- agno_agent = Agent(
485
- name="Agno Agent",
486
- model=Claude(id="claude-sonnet-4-5"),
487
- db=SqliteDb(db_file="agno.db"),
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
- Run this and connect to the [AgentOS UI](https://os.agno.com):
484
+ One line. Your agent now remembers users, accumulates knowledge, and improves over time.
485
+
486
+ ## Production Stack
501
487
 
502
- https://github.com/user-attachments/assets/feb23db8-15cc-4e88-be7c-01a21a03ebf6
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
- **Memory & Knowledge**
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
- - Culture: shared long-term memory across agents
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 guide](https://github.com/agno-agi/agno/tree/main/cookbook/00_quickstart)
535
- 2. Browse the [cookbook](https://github.com/agno-agi/agno/tree/main/cookbook) for real-world examples
536
- 3. Read the [docs](https://docs.agno.com) to go deeper
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
- We welcome contributions. See the [contributing guide](https://github.com/agno-agi/agno/blob/v2.0/CONTRIBUTING.md).
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=NKiEhrEOgTtjtLmMrwEw3zlD0Ebg19JhDm7B3sOboWw,562930
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=BDs5yk1N3G6XGPDz3OYEwuGDkli5MwZHSRCTaFwbK8w,12899
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=uTS-dEtBJfDYftRwJNoVtUFXz-t2c4kvTdS7DAiniCQ,213543
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=WeQ5ORe_CxsGYg0udOXjvwBo95hnpPZHVpFj-bMzuVU,3168
136
- agno/knowledge/chunking/code.py,sha256=YLdHL3muYz9MhDqxXPW7MGfqEph4KIZu6_RXPp6KUIc,3569
137
- agno/knowledge/chunking/document.py,sha256=uCHbPdZR4ILbm9RkpuVu8zw4dPIH0jd1XIRELOixRlI,6454
138
- agno/knowledge/chunking/fixed.py,sha256=Mz0QgxqVNSaOYPtzihLz6yJdz19zCZ8zLRXIREjgTb8,2371
139
- agno/knowledge/chunking/markdown.py,sha256=5hiHuvuGJq0UBk7gwnFV5Q84MumXD39UNcY4qlzH1fk,14665
140
- agno/knowledge/chunking/recursive.py,sha256=PXeq-RF9nJ8alV771q0jEyl1C2QPMVFUTOiJSU0nStw,2357
141
- agno/knowledge/chunking/row.py,sha256=yFGKMsHd2Ml0fkJLksw8ULUpWXmbSXIQwnwlKHVPP40,1426
142
- agno/knowledge/chunking/semantic.py,sha256=_PVDvmtJhpoamtpn-kHq54rwLgrbScEky5yqUbBc6JQ,7267
143
- agno/knowledge/chunking/strategy.py,sha256=Q-HkzcO7YbRY_fbrLz-GRrlplT-F3UeL77R51OoHAGk,7265
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=XLsPqOANI-zRgOp1ueKHD8D14AdP_N1m0ij7Isqi1Fc,4615
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=M86NeGNOWqfdbKMvPCOv11Rigzsmy8wcT1R-rV3NZn8,59297
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=EZRrJuoWu_k2zp2l7Y_6pRXHYah3TfH3RvR75Ckgab8,476539
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=GCC0i-NRYaJzJ2x8B1igVaZ1-hDv_4E1GbvvgiG9xdc,40424
617
- agno/utils/print_response/team.py,sha256=8uu0mfqnkTEDR1Jo6AYNUWHXtQZPh1apkzVh7MQj5Kc,88763
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.4.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
677
- agno-2.4.4.dist-info/METADATA,sha256=ULxZRXgBJ7i2ZJQ61KZSeaSt8ySYUX7DsY8YHs42ooQ,22229
678
- agno-2.4.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
679
- agno-2.4.4.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
680
- agno-2.4.4.dist-info/RECORD,,
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