agno 2.3.1__py3-none-any.whl → 2.3.2__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 CHANGED
@@ -1501,7 +1501,7 @@ class Agent:
1501
1501
  add_session_state_to_context: Optional[bool] = None,
1502
1502
  dependencies: Optional[Dict[str, Any]] = None,
1503
1503
  metadata: Optional[Dict[str, Any]] = None,
1504
- yield_run_response: bool = False, # To be deprecated: use yield_run_output instead
1504
+ yield_run_response: Optional[bool] = None, # To be deprecated: use yield_run_output instead
1505
1505
  yield_run_output: bool = False,
1506
1506
  debug_mode: Optional[bool] = None,
1507
1507
  **kwargs: Any,
agno/db/schemas/memory.py CHANGED
@@ -2,6 +2,8 @@ from dataclasses import dataclass
2
2
  from datetime import datetime, timezone
3
3
  from typing import Any, Dict, List, Optional
4
4
 
5
+ from agno.utils.dttm import now_epoch_s
6
+
5
7
 
6
8
  @dataclass
7
9
  class UserMemory:
@@ -12,8 +14,8 @@ class UserMemory:
12
14
  topics: Optional[List[str]] = None
13
15
  user_id: Optional[str] = None
14
16
  input: Optional[str] = None
15
- created_at: Optional[datetime] = None
16
- updated_at: Optional[datetime] = None
17
+ created_at: Optional[int] = None
18
+ updated_at: Optional[int] = None
17
19
  feedback: Optional[str] = None
18
20
 
19
21
  agent_id: Optional[str] = None
@@ -22,15 +24,15 @@ class UserMemory:
22
24
  def __post_init__(self) -> None:
23
25
  """Automatically set created_at if not provided."""
24
26
  if self.created_at is None:
25
- self.created_at = datetime.now(timezone.utc)
27
+ self.created_at = now_epoch_s()
26
28
 
27
29
  def to_dict(self) -> Dict[str, Any]:
28
30
  _dict = {
29
31
  "memory_id": self.memory_id,
30
32
  "memory": self.memory,
31
33
  "topics": self.topics,
32
- "created_at": self.created_at.isoformat() if self.created_at else None,
33
- "updated_at": self.updated_at.isoformat() if self.updated_at else None,
34
+ "created_at": datetime.fromtimestamp(self.created_at).isoformat() if self.created_at else None,
35
+ "updated_at": datetime.fromtimestamp(self.updated_at).isoformat() if self.updated_at else None,
34
36
  "input": self.input,
35
37
  "user_id": self.user_id,
36
38
  "agent_id": self.agent_id,
@@ -28,7 +28,7 @@ from agno.utils.log import log_debug, log_error, log_info, log_warning
28
28
  from agno.utils.string import generate_id
29
29
 
30
30
  try:
31
- from sqlalchemy import Column, MetaData, Table, and_, func, select, text
31
+ from sqlalchemy import Column, MetaData, String, Table, func, select, text
32
32
  from sqlalchemy.dialects import sqlite
33
33
  from sqlalchemy.ext.asyncio import AsyncEngine, async_sessionmaker, create_async_engine
34
34
  from sqlalchemy.schema import Index, UniqueConstraint
@@ -1182,8 +1182,8 @@ class AsyncSqliteDb(AsyncBaseDb):
1182
1182
  if team_id is not None:
1183
1183
  stmt = stmt.where(table.c.team_id == team_id)
1184
1184
  if topics is not None:
1185
- topic_conditions = [text(f"topics::text LIKE '%\"{topic}\"%'") for topic in topics]
1186
- stmt = stmt.where(and_(*topic_conditions))
1185
+ for topic in topics:
1186
+ stmt = stmt.where(func.cast(table.c.topics, String).like(f'%"{topic}"%'))
1187
1187
  if search_content is not None:
1188
1188
  stmt = stmt.where(table.c.memory.ilike(f"%{search_content}%"))
1189
1189
 
agno/db/sqlite/sqlite.py CHANGED
@@ -28,7 +28,7 @@ from agno.utils.log import log_debug, log_error, log_info, log_warning
28
28
  from agno.utils.string import generate_id
29
29
 
30
30
  try:
31
- from sqlalchemy import Column, MetaData, Table, and_, func, select, text
31
+ from sqlalchemy import Column, MetaData, String, Table, func, select, text
32
32
  from sqlalchemy.dialects import sqlite
33
33
  from sqlalchemy.engine import Engine, create_engine
34
34
  from sqlalchemy.orm import scoped_session, sessionmaker
@@ -1176,8 +1176,8 @@ class SqliteDb(BaseDb):
1176
1176
  if team_id is not None:
1177
1177
  stmt = stmt.where(table.c.team_id == team_id)
1178
1178
  if topics is not None:
1179
- topic_conditions = [text(f"topics::text LIKE '%\"{topic}\"%'") for topic in topics]
1180
- stmt = stmt.where(and_(*topic_conditions))
1179
+ for topic in topics:
1180
+ stmt = stmt.where(func.cast(table.c.topics, String).like(f'%"{topic}"%'))
1181
1181
  if search_content is not None:
1182
1182
  stmt = stmt.where(table.c.memory.ilike(f"%{search_content}%"))
1183
1183
 
@@ -1252,7 +1252,7 @@ class SqliteDb(BaseDb):
1252
1252
  )
1253
1253
 
1254
1254
  count_stmt = select(func.count()).select_from(stmt.alias())
1255
- total_count = sess.execute(count_stmt).scalar()
1255
+ total_count = sess.execute(count_stmt).scalar() or 0
1256
1256
 
1257
1257
  # Pagination
1258
1258
  if limit is not None:
agno/memory/manager.py CHANGED
@@ -13,6 +13,7 @@ from agno.models.base import Model
13
13
  from agno.models.message import Message
14
14
  from agno.models.utils import get_model
15
15
  from agno.tools.function import Function
16
+ from agno.utils.dttm import now_epoch_s
16
17
  from agno.utils.log import (
17
18
  log_debug,
18
19
  log_error,
@@ -227,7 +228,7 @@ class MemoryManager:
227
228
  memory.user_id = user_id
228
229
 
229
230
  if not memory.updated_at:
230
- memory.updated_at = datetime.now()
231
+ memory.updated_at = now_epoch_s()
231
232
 
232
233
  self._upsert_db_memory(memory=memory)
233
234
  return memory.memory_id
@@ -255,7 +256,7 @@ class MemoryManager:
255
256
  user_id = "default"
256
257
 
257
258
  if not memory.updated_at:
258
- memory.updated_at = datetime.now()
259
+ memory.updated_at = now_epoch_s()
259
260
 
260
261
  memory.memory_id = memory_id
261
262
  memory.user_id = user_id
@@ -671,7 +672,7 @@ class MemoryManager:
671
672
  # If updated_at is None, place at the beginning of the list
672
673
  sorted_memories_list = sorted(
673
674
  memories_list,
674
- key=lambda memory: memory.updated_at or datetime.min,
675
+ key=lambda m: m.updated_at if m.updated_at is not None else 0,
675
676
  )
676
677
  else:
677
678
  sorted_memories_list = []
@@ -694,6 +695,7 @@ class MemoryManager:
694
695
  if memories is None:
695
696
  memories = {}
696
697
 
698
+ MAX_UNIX_TS = 2**63 - 1
697
699
  memories_list = memories.get(user_id, [])
698
700
  # Sort memories by updated_at timestamp if available
699
701
  if memories_list:
@@ -701,7 +703,7 @@ class MemoryManager:
701
703
  # If updated_at is None, place at the end of the list
702
704
  sorted_memories_list = sorted(
703
705
  memories_list,
704
- key=lambda memory: memory.updated_at or datetime.max,
706
+ key=lambda m: m.updated_at if m.updated_at is not None else MAX_UNIX_TS,
705
707
  )
706
708
 
707
709
  else:
agno/os/router.py CHANGED
@@ -1794,7 +1794,6 @@ def get_base_router(
1794
1794
  raise HTTPException(status_code=404, detail="Database not found")
1795
1795
 
1796
1796
  if target_version:
1797
-
1798
1797
  # Use the session table as proxy for the database schema version
1799
1798
  if isinstance(db, AsyncBaseDb):
1800
1799
  current_version = await db.get_latest_schema_version(db.session_table_name)
@@ -470,6 +470,9 @@ def attach_routes(router: APIRouter, dbs: dict[str, list[Union[BaseDb, AsyncBase
470
470
  ) -> PaginatedResponse[UserStatsSchema]:
471
471
  db = await get_db(dbs, db_id, table)
472
472
  try:
473
+ # Ensure limit and page are integers
474
+ limit = int(limit) if limit is not None else 20
475
+ page = int(page) if page is not None else 1
473
476
  if isinstance(db, AsyncBaseDb):
474
477
  db = cast(AsyncBaseDb, db)
475
478
  user_stats, total_count = await db.get_user_memory_stats(
agno/team/team.py CHANGED
@@ -1784,7 +1784,7 @@ class Team:
1784
1784
  dependencies: Optional[Dict[str, Any]] = None,
1785
1785
  metadata: Optional[Dict[str, Any]] = None,
1786
1786
  debug_mode: Optional[bool] = None,
1787
- yield_run_response: bool = False, # To be deprecated: use yield_run_output instead
1787
+ yield_run_response: Optional[bool] = None, # To be deprecated: use yield_run_output instead
1788
1788
  yield_run_output: bool = False,
1789
1789
  **kwargs: Any,
1790
1790
  ) -> Iterator[Union[RunOutputEvent, TeamRunOutputEvent]]: ...
@@ -1812,7 +1812,7 @@ class Team:
1812
1812
  dependencies: Optional[Dict[str, Any]] = None,
1813
1813
  metadata: Optional[Dict[str, Any]] = None,
1814
1814
  debug_mode: Optional[bool] = None,
1815
- yield_run_response: bool = False, # To be deprecated: use yield_run_output instead
1815
+ yield_run_response: Optional[bool] = None, # To be deprecated: use yield_run_output instead
1816
1816
  yield_run_output: bool = False,
1817
1817
  **kwargs: Any,
1818
1818
  ) -> Union[TeamRunOutput, Iterator[Union[RunOutputEvent, TeamRunOutputEvent]]]:
@@ -1964,7 +1964,7 @@ class Team:
1964
1964
  last_exception = None
1965
1965
  num_attempts = retries + 1
1966
1966
 
1967
- yield_run_output = yield_run_output or yield_run_response # For backwards compatibility
1967
+ yield_run_output = bool(yield_run_output or yield_run_response) # For backwards compatibility
1968
1968
 
1969
1969
  for attempt in range(num_attempts):
1970
1970
  # Initialize the current run
@@ -2653,7 +2653,7 @@ class Team:
2653
2653
  dependencies: Optional[Dict[str, Any]] = None,
2654
2654
  metadata: Optional[Dict[str, Any]] = None,
2655
2655
  debug_mode: Optional[bool] = None,
2656
- yield_run_response: bool = False, # To be deprecated: use yield_run_output instead
2656
+ yield_run_response: Optional[bool] = None, # To be deprecated: use yield_run_output instead
2657
2657
  yield_run_output: bool = False,
2658
2658
  **kwargs: Any,
2659
2659
  ) -> AsyncIterator[Union[RunOutputEvent, TeamRunOutputEvent]]: ...
@@ -2681,7 +2681,7 @@ class Team:
2681
2681
  dependencies: Optional[Dict[str, Any]] = None,
2682
2682
  metadata: Optional[Dict[str, Any]] = None,
2683
2683
  debug_mode: Optional[bool] = None,
2684
- yield_run_response: bool = False, # To be deprecated: use yield_run_output instead
2684
+ yield_run_response: Optional[bool] = None, # To be deprecated: use yield_run_output instead
2685
2685
  yield_run_output: bool = False,
2686
2686
  **kwargs: Any,
2687
2687
  ) -> Union[TeamRunOutput, AsyncIterator[Union[RunOutputEvent, TeamRunOutputEvent]]]:
@@ -2821,7 +2821,7 @@ class Team:
2821
2821
  last_exception = None
2822
2822
  num_attempts = retries + 1
2823
2823
 
2824
- yield_run_output = yield_run_output or yield_run_response # For backwards compatibility
2824
+ yield_run_output = bool(yield_run_output or yield_run_response) # For backwards compatibility
2825
2825
 
2826
2826
  for attempt in range(num_attempts):
2827
2827
  # Run the team
agno/utils/dttm.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from datetime import datetime, timezone
2
+ from typing import Union
2
3
 
3
4
 
4
5
  def current_datetime() -> datetime:
@@ -11,3 +12,35 @@ def current_datetime_utc() -> datetime:
11
12
 
12
13
  def current_datetime_utc_str() -> str:
13
14
  return current_datetime_utc().strftime("%Y-%m-%dT%H:%M:%S")
15
+
16
+
17
+ def now_epoch_s() -> int:
18
+ return int(datetime.now(timezone.utc).timestamp())
19
+
20
+
21
+ def to_epoch_s(value: Union[int, float, str, datetime]) -> int:
22
+ """Normalize various datetime representations to epoch seconds (UTC)."""
23
+
24
+ if isinstance(value, (int, float)):
25
+ # assume value is already in seconds
26
+ return int(value)
27
+
28
+ if isinstance(value, datetime):
29
+ dt = value
30
+ if dt.tzinfo is None:
31
+ dt = dt.replace(tzinfo=timezone.utc)
32
+ return int(dt.timestamp())
33
+
34
+ if isinstance(value, str):
35
+ s = value.strip()
36
+ if s.endswith("Z"):
37
+ s = s[:-1] + "+00:00"
38
+ try:
39
+ dt = datetime.fromisoformat(s)
40
+ except ValueError as e:
41
+ raise ValueError(f"Unsupported datetime string: {value!r}") from e
42
+ if dt.tzinfo is None:
43
+ dt = dt.replace(tzinfo=timezone.utc)
44
+ return int(dt.timestamp())
45
+
46
+ raise TypeError(f"Unsupported datetime value: {type(value)}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.3.1
3
+ Version: 2.3.2
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
@@ -5,7 +5,7 @@ agno/filters.py,sha256=QxBjNUUS53o1zkG-J0F8XjDzlu0ADtJn3r6rfkGZ9Fk,12079
5
5
  agno/media.py,sha256=eTfYb_pwhX_PCIVPSrW4VYRqmoxKABEF1aZClrVvQ30,16500
6
6
  agno/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  agno/agent/__init__.py,sha256=s7S3FgsjZxuaabzi8L5n4aSH8IZAiZ7XaNNcySGR-EQ,1051
8
- agno/agent/agent.py,sha256=SGwKTd05PoEUQeanqyzFO2gnelAwOhEjHOAoJ7g7HUI,463686
8
+ agno/agent/agent.py,sha256=HayNDBIWJap3F-_6G9C7WLzQqyO569NbtJn8nvkFXi8,463695
9
9
  agno/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  agno/api/agent.py,sha256=fKlQ62E_C9Rjd7Zus3Gs3R1RG-IhzFV-ICpkb6SLqYc,932
11
11
  agno/api/api.py,sha256=gFhVjxJYkQsw8mBl2fhoStMPGlyJ37DJaqgUOwZVvQI,1021
@@ -78,16 +78,16 @@ agno/db/schemas/__init__.py,sha256=g72Zr5_nm00yXHStv4pf9PG9bGLKXEK7Av6YQtrDbCQ,1
78
78
  agno/db/schemas/culture.py,sha256=w4azKAVLf5X4xyRUFXMIEq0CA0pnyeN03W3eMpqScxo,4342
79
79
  agno/db/schemas/evals.py,sha256=T1zIiwrN5fxZVD2em85wQ9CV-HSVZvNF4D4v9_w30VA,786
80
80
  agno/db/schemas/knowledge.py,sha256=qVL6jEdaUG92WJw70-FrA7atetPqrpZnLYkYZDuiYho,1227
81
- agno/db/schemas/memory.py,sha256=tYXx3EH2H1GuHTgjYKE1j9YoI4iSl3cZv6gdql5vCvY,2060
81
+ agno/db/schemas/memory.py,sha256=dA7It1cN60dId-GpowmKTORy4Q6r9L49ZpGnnZkXmds,2126
82
82
  agno/db/schemas/metrics.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
83
  agno/db/singlestore/__init__.py,sha256=dufbaod8ZZIeZIVi0hYJQ8Eu2DfIfWdIy00cpqAsx9U,87
84
84
  agno/db/singlestore/schemas.py,sha256=7Jjuax5E-OoYa-DfiCWfaUmeOazWD3zZXhuDl-18Z2k,6678
85
85
  agno/db/singlestore/singlestore.py,sha256=ZmzTsWx2MnWXaTolE7T42UkFL6VzScHkFY_vOmrbvl8,97471
86
86
  agno/db/singlestore/utils.py,sha256=w2FVFIBpFJK6nKJVt1sgv9N-esmfpGY_8ViFRI69I2I,13677
87
87
  agno/db/sqlite/__init__.py,sha256=09V3i4y0-tBjt60--57ivZ__SaaS67GCsDT4Apzv-5Y,138
88
- agno/db/sqlite/async_sqlite.py,sha256=W3rhhStv-Zs1uJga5z59wivPg80CEEyc_CWGc2j4Ou0,100353
88
+ agno/db/sqlite/async_sqlite.py,sha256=DqAzDXa33md7-sd4QXp3SDENQRuDm21N-QWctHJ3EFg,100327
89
89
  agno/db/sqlite/schemas.py,sha256=vbP82UR8riESIwELSf4vNKf9lOYaPsilC64UP6KU-XQ,6282
90
- agno/db/sqlite/sqlite.py,sha256=qIldCOyWh6hfzeFGCHH_CPUPcHcZG-ZxIsCBl2UGDGs,98300
90
+ agno/db/sqlite/sqlite.py,sha256=jiYK33KAkvPGCb9Ozv9dbkuPsNMP_S3iHrRm7QdQK48,98279
91
91
  agno/db/sqlite/utils.py,sha256=ZCYVrhtm9Bw1gddlaVZW7bQF2XqIJ993UDWVDGsYtX8,15557
92
92
  agno/db/surrealdb/__init__.py,sha256=C8qp5-Nx9YnSmgKEtGua-sqG_ntCXONBw1qqnNyKPqI,75
93
93
  agno/db/surrealdb/metrics.py,sha256=oKDRyjRQ6KR3HaO8zDHQLVMG7-0NDkOFOKX5I7mD5FA,10336
@@ -170,7 +170,7 @@ agno/knowledge/reranker/cohere.py,sha256=2Be5blVyeZ3vYlnFa2NYvJuytjaCB8G2OWJ11pQ
170
170
  agno/knowledge/reranker/infinity.py,sha256=N9geg9xZqRdJZksfQcvbGJgMymXrQVJl_K5KICWqH8o,7193
171
171
  agno/knowledge/reranker/sentence_transformer.py,sha256=ZN4SqnMZsUhg5G7AzlONM1_UjezfNrjFYXpNVHD4U-U,1912
172
172
  agno/memory/__init__.py,sha256=XWKJU5SJObYZqEKMZ2XYwgH8-YeuWUoSRfT4dEI5HnY,101
173
- agno/memory/manager.py,sha256=8dGl4Ih4OF2dLidvcgnGGf81lY34JiDrAao2i4gZAEI,51913
173
+ agno/memory/manager.py,sha256=324cfA18z5EWylmh0nAiWgxww_E9fBVOr2VG-aJucVI,52011
174
174
  agno/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
175
  agno/models/base.py,sha256=ldFFRrFUNgqtKfMX8puBCZkOOaWwfCLtCxAIIJzqlqU,102342
176
176
  agno/models/defaults.py,sha256=1_fe4-ZbNriE8BgqxVRVi4KGzEYxYKYsz4hn6CZNEEM,40
@@ -266,7 +266,7 @@ agno/os/app.py,sha256=sAwBkRFAuJqix_KtHwrYEaViD7wlQTZ80fbzzh9WUro,34228
266
266
  agno/os/auth.py,sha256=FyBtAKWtg-qSunCas5m5pK1dVEmikOSZvcCp5r25tTA,1844
267
267
  agno/os/config.py,sha256=QPGxENF2yezEOp0yV9OXU-FBs4_vYSXkxbbSol51wPE,2932
268
268
  agno/os/mcp.py,sha256=7lAiELFmwcF-eN_pOIJVjun9r5dFcQfPTHD_rP1Zu-s,10318
269
- agno/os/router.py,sha256=iXvMEw2aWdgfTrbP842ZqENYXa0Ahnu6Lqac9334r_o,75562
269
+ agno/os/router.py,sha256=pkNjM-cxkcGn1hUiWlbmujlIwOlYh9WuudlEVJCI1D4,75549
270
270
  agno/os/schema.py,sha256=k2tqGr6nce6pWAlItSptmy2hE07K7tEGwq-MVuk8Y-4,52804
271
271
  agno/os/settings.py,sha256=Cn5_8lZI8Vx1UaUYqs9h6Qp4IMDFn4f3c35uppiaMy4,1343
272
272
  agno/os/utils.py,sha256=KdKin_Ykzj1khSUkGcc5RCsuznEutMzgeSsvRiVe5XM,22967
@@ -301,7 +301,7 @@ agno/os/routers/knowledge/__init__.py,sha256=ZSqMQ8X7C_oYn8xt7NaYlriarWUpHgaWDyH
301
301
  agno/os/routers/knowledge/knowledge.py,sha256=6rR1CiHUDmg7kJy7g218IGaFEl0YAMbCciiFNJeEBMo,45320
302
302
  agno/os/routers/knowledge/schemas.py,sha256=GUr5RsRbI7K3qrrOlGVfW0Kf7XO6HjMviMW6nEl6qf8,8847
303
303
  agno/os/routers/memory/__init__.py,sha256=9hrYFc1dkbsLBqKfqyfioQeLX9TTbLrJx6lWDKNNWbc,93
304
- agno/os/routers/memory/memory.py,sha256=d13lESaVpgcpsKORhtH425LlTYVcggn96ZLcZE1xr00,21376
304
+ agno/os/routers/memory/memory.py,sha256=9_6d3Ww-Kx68UJHxNBOgdSG1vOIf1GmElNxF7EGlk8Y,21541
305
305
  agno/os/routers/memory/schemas.py,sha256=TmeDwDEfIIxZV68ORjxfQqxJ4KArlmEUghF-xRKQqLo,2719
306
306
  agno/os/routers/metrics/__init__.py,sha256=Uw6wWEikLpF5hHxBkHtFyaTuz7OUerGYWk0JW7teUGQ,97
307
307
  agno/os/routers/metrics/metrics.py,sha256=KaH49hSsAYjJZFdNI-Zg46RYl_QajYIc0YGpKdzK4xs,8720
@@ -333,7 +333,7 @@ agno/session/summary.py,sha256=9JnDyQyggckd3zx6L8Q5f-lglZvrFQxvPjGU8gLCgR4,10292
333
333
  agno/session/team.py,sha256=-MkB6qQCrnXLKko8L5s9fJOWPsjeK5Gx0SXEPoOwSFQ,13437
334
334
  agno/session/workflow.py,sha256=nPHnh1N0SJby5JRjysCUI-kTDCelQMFfqosEnnLzPIg,19690
335
335
  agno/team/__init__.py,sha256=toHidBOo5M3n_TIVtIKHgcDbLL9HR-_U-YQYuIt_XtE,847
336
- agno/team/team.py,sha256=Xoq4PiUSfORn5K-FAlrQOXcGIL-asASB5HH7JrMTQtk,405486
336
+ agno/team/team.py,sha256=9aZamxq6DZmcuQq3qNBsCLqjaWaZXEDy9N6CUbOpyFM,405534
337
337
  agno/tools/__init__.py,sha256=jNll2sELhPPbqm5nPeT4_uyzRO2_KRTW-8Or60kioS0,210
338
338
  agno/tools/agentql.py,sha256=S82Z9aTNr-E5wnA4fbFs76COljJtiQIjf2grjz3CkHU,4104
339
339
  agno/tools/airflow.py,sha256=uf2rOzZpSU64l_qRJ5Raku-R3Gky-uewmYkh6W0-oxg,2610
@@ -467,7 +467,7 @@ agno/utils/audio.py,sha256=kdPMr_wYh-NyxQ-U57hyulK0Y7iIkuVinL9AQ7w64EU,1455
467
467
  agno/utils/certs.py,sha256=Dtqmcwngq6b-27gN7Zsmo9lKlMPYd70UNexLMqpX3BE,683
468
468
  agno/utils/code_execution.py,sha256=JAzcsuUJVO8ZVcD9AgX_O9waBegjhbrHkQZp-YZGsdA,415
469
469
  agno/utils/common.py,sha256=EJaERgzrJnin1i0Aorv0Sf5y8AfMQWM-8yYhuYtD_4Q,4445
470
- agno/utils/dttm.py,sha256=sk7olzbUlMl8ibAGx24sxoP0DGBCnH81VQRYjqIcpDg,289
470
+ agno/utils/dttm.py,sha256=MwVpm03DY_sR6NArsSBYg7_sBBsYfWMBQcLCfi7Q4rY,1290
471
471
  agno/utils/enum.py,sha256=wDHnruIf8cQU-_QdryY9LBugPCrlj-nOabQuEFnmeYM,753
472
472
  agno/utils/env.py,sha256=o8OwKhx78vi8MaXPes10mXejmJ13CqAh7ODKMS1pmcM,438
473
473
  agno/utils/events.py,sha256=eIuLXrZbD-s6owNNOGKww2NR2Xl1oBoP-sGnAbHsGic,28175
@@ -571,8 +571,8 @@ agno/workflow/step.py,sha256=_sge_L8WBWSYJRNtgzrfCWIPjrWyani1rCRTkQZu3EM,73296
571
571
  agno/workflow/steps.py,sha256=NXAOgQ8bssgl-6K1Fxd9zLm1m3ranPnMFJp-SM-GmA8,26706
572
572
  agno/workflow/types.py,sha256=T8O0CuKe48MRuPtgdDlECJQL8mgJ4TKClaw9hHN3Ebw,19149
573
573
  agno/workflow/workflow.py,sha256=XjwOxrJrWUvsWJH7qYJs-0BX7z6xyzX9mbw8dMNevUg,189538
574
- agno-2.3.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
575
- agno-2.3.1.dist-info/METADATA,sha256=c7m0u0MGZBkZnPgVpeN7KureVZKSEJDgfKefA3tvEUo,28850
576
- agno-2.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
577
- agno-2.3.1.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
578
- agno-2.3.1.dist-info/RECORD,,
574
+ agno-2.3.2.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
575
+ agno-2.3.2.dist-info/METADATA,sha256=hfrlm5PTIqOSF_oHEZFv7kttLNlxVMrhEbyvd1k67-M,28850
576
+ agno-2.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
577
+ agno-2.3.2.dist-info/top_level.txt,sha256=MKyeuVesTyOKIXUhc-d_tPa2Hrh0oTA4LM0izowpx70,5
578
+ agno-2.3.2.dist-info/RECORD,,
File without changes