agno 2.2.10__py3-none-any.whl → 2.2.12__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.
Files changed (73) hide show
  1. agno/agent/agent.py +75 -48
  2. agno/db/dynamo/utils.py +1 -1
  3. agno/db/firestore/utils.py +1 -1
  4. agno/db/gcs_json/utils.py +1 -1
  5. agno/db/in_memory/utils.py +1 -1
  6. agno/db/json/utils.py +1 -1
  7. agno/db/mongo/utils.py +3 -3
  8. agno/db/mysql/mysql.py +1 -1
  9. agno/db/mysql/utils.py +1 -1
  10. agno/db/postgres/utils.py +1 -1
  11. agno/db/redis/utils.py +1 -1
  12. agno/db/singlestore/singlestore.py +1 -1
  13. agno/db/singlestore/utils.py +1 -1
  14. agno/db/sqlite/async_sqlite.py +1 -1
  15. agno/db/sqlite/sqlite.py +1 -1
  16. agno/db/sqlite/utils.py +1 -1
  17. agno/filters.py +354 -0
  18. agno/knowledge/chunking/agentic.py +8 -9
  19. agno/knowledge/chunking/strategy.py +59 -15
  20. agno/knowledge/embedder/sentence_transformer.py +6 -2
  21. agno/knowledge/knowledge.py +43 -22
  22. agno/knowledge/reader/base.py +6 -2
  23. agno/knowledge/utils.py +20 -0
  24. agno/models/anthropic/claude.py +45 -9
  25. agno/models/base.py +4 -0
  26. agno/os/app.py +23 -7
  27. agno/os/interfaces/slack/router.py +53 -33
  28. agno/os/interfaces/slack/slack.py +9 -1
  29. agno/os/router.py +25 -1
  30. agno/os/routers/health.py +5 -3
  31. agno/os/routers/knowledge/knowledge.py +43 -17
  32. agno/os/routers/knowledge/schemas.py +4 -3
  33. agno/run/agent.py +11 -1
  34. agno/run/base.py +3 -2
  35. agno/session/agent.py +10 -5
  36. agno/team/team.py +57 -18
  37. agno/tools/file_generation.py +4 -4
  38. agno/tools/gmail.py +179 -0
  39. agno/tools/parallel.py +314 -0
  40. agno/utils/agent.py +22 -17
  41. agno/utils/gemini.py +15 -5
  42. agno/utils/knowledge.py +12 -5
  43. agno/utils/log.py +1 -0
  44. agno/utils/models/claude.py +2 -1
  45. agno/utils/print_response/agent.py +5 -4
  46. agno/utils/print_response/team.py +5 -4
  47. agno/vectordb/base.py +2 -4
  48. agno/vectordb/cassandra/cassandra.py +12 -5
  49. agno/vectordb/chroma/chromadb.py +10 -4
  50. agno/vectordb/clickhouse/clickhousedb.py +12 -4
  51. agno/vectordb/couchbase/couchbase.py +12 -3
  52. agno/vectordb/lancedb/lance_db.py +69 -144
  53. agno/vectordb/langchaindb/langchaindb.py +13 -4
  54. agno/vectordb/lightrag/lightrag.py +8 -3
  55. agno/vectordb/llamaindex/llamaindexdb.py +10 -4
  56. agno/vectordb/milvus/milvus.py +16 -5
  57. agno/vectordb/mongodb/mongodb.py +14 -3
  58. agno/vectordb/pgvector/pgvector.py +73 -15
  59. agno/vectordb/pineconedb/pineconedb.py +6 -2
  60. agno/vectordb/qdrant/qdrant.py +25 -13
  61. agno/vectordb/redis/redisdb.py +37 -30
  62. agno/vectordb/singlestore/singlestore.py +9 -4
  63. agno/vectordb/surrealdb/surrealdb.py +13 -3
  64. agno/vectordb/upstashdb/upstashdb.py +8 -5
  65. agno/vectordb/weaviate/weaviate.py +29 -12
  66. agno/workflow/step.py +3 -2
  67. agno/workflow/types.py +20 -1
  68. agno/workflow/workflow.py +103 -14
  69. {agno-2.2.10.dist-info → agno-2.2.12.dist-info}/METADATA +4 -1
  70. {agno-2.2.10.dist-info → agno-2.2.12.dist-info}/RECORD +73 -71
  71. {agno-2.2.10.dist-info → agno-2.2.12.dist-info}/WHEEL +0 -0
  72. {agno-2.2.10.dist-info → agno-2.2.12.dist-info}/licenses/LICENSE +0 -0
  73. {agno-2.2.10.dist-info → agno-2.2.12.dist-info}/top_level.txt +0 -0
agno/agent/agent.py CHANGED
@@ -38,6 +38,7 @@ from agno.exceptions import (
38
38
  RunCancelledException,
39
39
  StopAgentRun,
40
40
  )
41
+ from agno.filters import FilterExpr
41
42
  from agno.guardrails import BaseGuardrail
42
43
  from agno.knowledge.knowledge import Knowledge
43
44
  from agno.knowledge.types import KnowledgeFilter
@@ -233,7 +234,7 @@ class Agent:
233
234
  knowledge: Optional[Knowledge] = None
234
235
  # Enable RAG by adding references from Knowledge to the user prompt.
235
236
  # Add knowledge_filters to the Agent class attributes
236
- knowledge_filters: Optional[Dict[str, Any]] = None
237
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None
237
238
  # Let the agent choose the knowledge filters
238
239
  enable_agentic_knowledge_filters: Optional[bool] = False
239
240
  add_knowledge_to_context: bool = False
@@ -450,7 +451,7 @@ class Agent:
450
451
  store_tool_messages: bool = True,
451
452
  store_history_messages: bool = True,
452
453
  knowledge: Optional[Knowledge] = None,
453
- knowledge_filters: Optional[Dict[str, Any]] = None,
454
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
454
455
  enable_agentic_knowledge_filters: Optional[bool] = None,
455
456
  add_knowledge_to_context: bool = False,
456
457
  knowledge_retriever: Optional[Callable[..., Optional[List[Union[Dict, str]]]]] = None,
@@ -1460,7 +1461,7 @@ class Agent:
1460
1461
  videos: Optional[Sequence[Video]] = None,
1461
1462
  files: Optional[Sequence[File]] = None,
1462
1463
  retries: Optional[int] = None,
1463
- knowledge_filters: Optional[Dict[str, Any]] = None,
1464
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
1464
1465
  add_history_to_context: Optional[bool] = None,
1465
1466
  add_dependencies_to_context: Optional[bool] = None,
1466
1467
  add_session_state_to_context: Optional[bool] = None,
@@ -1487,7 +1488,7 @@ class Agent:
1487
1488
  videos: Optional[Sequence[Video]] = None,
1488
1489
  files: Optional[Sequence[File]] = None,
1489
1490
  retries: Optional[int] = None,
1490
- knowledge_filters: Optional[Dict[str, Any]] = None,
1491
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
1491
1492
  add_history_to_context: Optional[bool] = None,
1492
1493
  add_dependencies_to_context: Optional[bool] = None,
1493
1494
  add_session_state_to_context: Optional[bool] = None,
@@ -1515,7 +1516,7 @@ class Agent:
1515
1516
  videos: Optional[Sequence[Video]] = None,
1516
1517
  files: Optional[Sequence[File]] = None,
1517
1518
  retries: Optional[int] = None,
1518
- knowledge_filters: Optional[Dict[str, Any]] = None,
1519
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
1519
1520
  add_history_to_context: Optional[bool] = None,
1520
1521
  add_dependencies_to_context: Optional[bool] = None,
1521
1522
  add_session_state_to_context: Optional[bool] = None,
@@ -2385,7 +2386,7 @@ class Agent:
2385
2386
  stream_events: Optional[bool] = None,
2386
2387
  stream_intermediate_steps: Optional[bool] = None,
2387
2388
  retries: Optional[int] = None,
2388
- knowledge_filters: Optional[Dict[str, Any]] = None,
2389
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2389
2390
  add_history_to_context: Optional[bool] = None,
2390
2391
  add_dependencies_to_context: Optional[bool] = None,
2391
2392
  add_session_state_to_context: Optional[bool] = None,
@@ -2411,7 +2412,7 @@ class Agent:
2411
2412
  stream_events: Optional[bool] = None,
2412
2413
  stream_intermediate_steps: Optional[bool] = None,
2413
2414
  retries: Optional[int] = None,
2414
- knowledge_filters: Optional[Dict[str, Any]] = None,
2415
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2415
2416
  add_history_to_context: Optional[bool] = None,
2416
2417
  add_dependencies_to_context: Optional[bool] = None,
2417
2418
  add_session_state_to_context: Optional[bool] = None,
@@ -2439,7 +2440,7 @@ class Agent:
2439
2440
  stream_events: Optional[bool] = None,
2440
2441
  stream_intermediate_steps: Optional[bool] = None,
2441
2442
  retries: Optional[int] = None,
2442
- knowledge_filters: Optional[Dict[str, Any]] = None,
2443
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2443
2444
  add_history_to_context: Optional[bool] = None,
2444
2445
  add_dependencies_to_context: Optional[bool] = None,
2445
2446
  add_session_state_to_context: Optional[bool] = None,
@@ -2662,7 +2663,7 @@ class Agent:
2662
2663
  user_id: Optional[str] = None,
2663
2664
  session_id: Optional[str] = None,
2664
2665
  retries: Optional[int] = None,
2665
- knowledge_filters: Optional[Dict[str, Any]] = None,
2666
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2666
2667
  dependencies: Optional[Dict[str, Any]] = None,
2667
2668
  metadata: Optional[Dict[str, Any]] = None,
2668
2669
  debug_mode: Optional[bool] = None,
@@ -2681,7 +2682,7 @@ class Agent:
2681
2682
  user_id: Optional[str] = None,
2682
2683
  session_id: Optional[str] = None,
2683
2684
  retries: Optional[int] = None,
2684
- knowledge_filters: Optional[Dict[str, Any]] = None,
2685
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2685
2686
  dependencies: Optional[Dict[str, Any]] = None,
2686
2687
  metadata: Optional[Dict[str, Any]] = None,
2687
2688
  debug_mode: Optional[bool] = None,
@@ -2700,7 +2701,7 @@ class Agent:
2700
2701
  session_id: Optional[str] = None,
2701
2702
  run_context: Optional[RunContext] = None,
2702
2703
  retries: Optional[int] = None,
2703
- knowledge_filters: Optional[Dict[str, Any]] = None,
2704
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
2704
2705
  dependencies: Optional[Dict[str, Any]] = None,
2705
2706
  metadata: Optional[Dict[str, Any]] = None,
2706
2707
  debug_mode: Optional[bool] = None,
@@ -3223,7 +3224,7 @@ class Agent:
3223
3224
  user_id: Optional[str] = None,
3224
3225
  session_id: Optional[str] = None,
3225
3226
  retries: Optional[int] = None,
3226
- knowledge_filters: Optional[Dict[str, Any]] = None,
3227
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
3227
3228
  dependencies: Optional[Dict[str, Any]] = None,
3228
3229
  metadata: Optional[Dict[str, Any]] = None,
3229
3230
  debug_mode: Optional[bool] = None,
@@ -3242,7 +3243,7 @@ class Agent:
3242
3243
  user_id: Optional[str] = None,
3243
3244
  session_id: Optional[str] = None,
3244
3245
  retries: Optional[int] = None,
3245
- knowledge_filters: Optional[Dict[str, Any]] = None,
3246
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
3246
3247
  dependencies: Optional[Dict[str, Any]] = None,
3247
3248
  metadata: Optional[Dict[str, Any]] = None,
3248
3249
  debug_mode: Optional[bool] = None,
@@ -3261,7 +3262,7 @@ class Agent:
3261
3262
  session_id: Optional[str] = None,
3262
3263
  run_context: Optional[RunContext] = None,
3263
3264
  retries: Optional[int] = None,
3264
- knowledge_filters: Optional[Dict[str, Any]] = None,
3265
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
3265
3266
  dependencies: Optional[Dict[str, Any]] = None,
3266
3267
  metadata: Optional[Dict[str, Any]] = None,
3267
3268
  debug_mode: Optional[bool] = None,
@@ -5344,13 +5345,9 @@ class Agent:
5344
5345
  run_context: RunContext,
5345
5346
  session: AgentSession,
5346
5347
  user_id: Optional[str] = None,
5347
- knowledge_filters: Optional[Dict[str, Any]] = None,
5348
5348
  ) -> List[Union[Toolkit, Callable, Function, Dict]]:
5349
5349
  agent_tools: List[Union[Toolkit, Callable, Function, Dict]] = []
5350
5350
 
5351
- # Consider both run_context.knowledge_filters and knowledge_filters (deprecated)
5352
- run_context.knowledge_filters = run_context.knowledge_filters or knowledge_filters
5353
-
5354
5351
  # Add provided tools
5355
5352
  if self.tools is not None:
5356
5353
  # If not running in async mode, raise if any tool is async
@@ -5419,14 +5416,10 @@ class Agent:
5419
5416
  run_context: RunContext,
5420
5417
  session: AgentSession,
5421
5418
  user_id: Optional[str] = None,
5422
- knowledge_filters: Optional[Dict[str, Any]] = None,
5423
5419
  check_mcp_tools: bool = True,
5424
5420
  ) -> List[Union[Toolkit, Callable, Function, Dict]]:
5425
5421
  agent_tools: List[Union[Toolkit, Callable, Function, Dict]] = []
5426
5422
 
5427
- # Consider both run_context.knowledge_filters and knowledge_filters (deprecated)
5428
- run_context.knowledge_filters = run_context.knowledge_filters or knowledge_filters
5429
-
5430
5423
  # Connect MCP tools
5431
5424
  await self._connect_mcp_tools()
5432
5425
 
@@ -5763,6 +5756,9 @@ class Agent:
5763
5756
  raise ValueError("Db not initialized")
5764
5757
  return self.db.get_session(session_id=session_id, session_type=session_type) # type: ignore
5765
5758
  except Exception as e:
5759
+ import traceback
5760
+
5761
+ traceback.print_exc(limit=3)
5766
5762
  log_warning(f"Error getting session from db: {e}")
5767
5763
  return None
5768
5764
 
@@ -5773,12 +5769,17 @@ class Agent:
5773
5769
  try:
5774
5770
  if not self.db:
5775
5771
  raise ValueError("Db not initialized")
5776
- return await self.db.get_session(session_id=session_id, session_type=SessionType.AGENT) # type: ignore
5772
+ return await self.db.get_session(session_id=session_id, session_type=session_type) # type: ignore
5777
5773
  except Exception as e:
5774
+ import traceback
5775
+
5776
+ traceback.print_exc(limit=3)
5778
5777
  log_warning(f"Error getting session from db: {e}")
5779
5778
  return None
5780
5779
 
5781
- def _upsert_session(self, session: AgentSession) -> Optional[AgentSession]:
5780
+ def _upsert_session(
5781
+ self, session: Union[AgentSession, TeamSession, WorkflowSession]
5782
+ ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession]]:
5782
5783
  """Upsert a Session into the database."""
5783
5784
 
5784
5785
  try:
@@ -5786,16 +5787,24 @@ class Agent:
5786
5787
  raise ValueError("Db not initialized")
5787
5788
  return self.db.upsert_session(session=session) # type: ignore
5788
5789
  except Exception as e:
5790
+ import traceback
5791
+
5792
+ traceback.print_exc(limit=3)
5789
5793
  log_warning(f"Error upserting session into db: {e}")
5790
5794
  return None
5791
5795
 
5792
- async def _aupsert_session(self, session: AgentSession) -> Optional[AgentSession]:
5796
+ async def _aupsert_session(
5797
+ self, session: Union[AgentSession, TeamSession, WorkflowSession]
5798
+ ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession]]:
5793
5799
  """Upsert a Session into the database."""
5794
5800
  try:
5795
5801
  if not self.db:
5796
5802
  raise ValueError("Db not initialized")
5797
5803
  return await self.db.upsert_session(session=session) # type: ignore
5798
5804
  except Exception as e:
5805
+ import traceback
5806
+
5807
+ traceback.print_exc(limit=3)
5799
5808
  log_warning(f"Error upserting session into db: {e}")
5800
5809
  return None
5801
5810
 
@@ -6000,7 +6009,7 @@ class Agent:
6000
6009
  def get_session(
6001
6010
  self,
6002
6011
  session_id: Optional[str] = None,
6003
- ) -> Optional[AgentSession]:
6012
+ ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession]]:
6004
6013
  """Load an AgentSession from database or cache.
6005
6014
 
6006
6015
  Args:
@@ -6061,7 +6070,7 @@ class Agent:
6061
6070
  async def aget_session(
6062
6071
  self,
6063
6072
  session_id: Optional[str] = None,
6064
- ) -> Optional[AgentSession]:
6073
+ ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession]]:
6065
6074
  """Load an AgentSession from database or cache.
6066
6075
 
6067
6076
  Args:
@@ -6116,7 +6125,7 @@ class Agent:
6116
6125
  log_debug(f"AgentSession {session_id_to_load} not found in db")
6117
6126
  return None
6118
6127
 
6119
- def save_session(self, session: AgentSession) -> None:
6128
+ def save_session(self, session: Union[AgentSession, TeamSession, WorkflowSession]) -> None:
6120
6129
  """
6121
6130
  Save the AgentSession to storage
6122
6131
  """
@@ -6138,7 +6147,7 @@ class Agent:
6138
6147
  self._upsert_session(session=session)
6139
6148
  log_debug(f"Created or updated AgentSession record: {session.session_id}")
6140
6149
 
6141
- async def asave_session(self, session: AgentSession) -> None:
6150
+ async def asave_session(self, session: Union[AgentSession, TeamSession, WorkflowSession]) -> None:
6142
6151
  """
6143
6152
  Save the AgentSession to storage
6144
6153
  """
@@ -6214,12 +6223,16 @@ class Agent:
6214
6223
  if session is None:
6215
6224
  raise Exception("Session not found")
6216
6225
 
6226
+ if not hasattr(session, "agent_data"):
6227
+ raise Exception("Session is not an AgentSession")
6228
+
6217
6229
  # -*- Rename Agent
6218
6230
  self.name = name
6219
- if session.agent_data is not None:
6220
- session.agent_data["name"] = name
6231
+
6232
+ if session.agent_data is not None: # type: ignore
6233
+ session.agent_data["name"] = name # type: ignore
6221
6234
  else:
6222
- session.agent_data = {"name": name}
6235
+ session.agent_data = {"name": name} # type: ignore
6223
6236
 
6224
6237
  # -*- Save to storage
6225
6238
  if self._has_async_db():
@@ -6473,7 +6486,7 @@ class Agent:
6473
6486
  raise Exception("Session not found")
6474
6487
 
6475
6488
  # Only filter by agent_id if this is part of a team
6476
- return session.get_messages_from_last_n_runs(
6489
+ return session.get_messages_from_last_n_runs( # type: ignore
6477
6490
  agent_id=self.id if self.team_id is not None else None,
6478
6491
  )
6479
6492
 
@@ -6496,7 +6509,7 @@ class Agent:
6496
6509
  raise Exception("Session not found")
6497
6510
 
6498
6511
  # Only filter by agent_id if this is part of a team
6499
- return session.get_messages_from_last_n_runs(
6512
+ return session.get_messages_from_last_n_runs( # type: ignore
6500
6513
  agent_id=self.id if self.team_id is not None else None,
6501
6514
  )
6502
6515
 
@@ -6517,7 +6530,7 @@ class Agent:
6517
6530
  if session is None:
6518
6531
  raise Exception(f"Session {session_id} not found")
6519
6532
 
6520
- return session.get_session_summary()
6533
+ return session.get_session_summary() # type: ignore
6521
6534
 
6522
6535
  async def aget_session_summary(self, session_id: Optional[str] = None) -> Optional[SessionSummary]:
6523
6536
  """Get the session summary for the given session ID and user ID.
@@ -6536,7 +6549,7 @@ class Agent:
6536
6549
  if session is None:
6537
6550
  raise Exception(f"Session {session_id} not found")
6538
6551
 
6539
- return session.get_session_summary()
6552
+ return session.get_session_summary() # type: ignore
6540
6553
 
6541
6554
  def get_user_memories(self, user_id: Optional[str] = None) -> Optional[List[UserMemory]]:
6542
6555
  """Get the user memories for the given user ID.
@@ -7358,7 +7371,7 @@ class Agent:
7358
7371
  videos: Optional[Sequence[Video]] = None,
7359
7372
  files: Optional[Sequence[File]] = None,
7360
7373
  add_dependencies_to_context: Optional[bool] = None,
7361
- knowledge_filters: Optional[Dict[str, Any]] = None,
7374
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
7362
7375
  **kwargs: Any,
7363
7376
  ) -> Optional[Message]:
7364
7377
  """Return the user message for the Agent.
@@ -7373,7 +7386,6 @@ class Agent:
7373
7386
  dependencies = run_context.dependencies or dependencies
7374
7387
  metadata = run_context.metadata or metadata
7375
7388
  knowledge_filters = run_context.knowledge_filters or knowledge_filters
7376
-
7377
7389
  # Get references from the knowledge base to use in the user message
7378
7390
  references = None
7379
7391
 
@@ -7734,7 +7746,7 @@ class Agent:
7734
7746
  images: Optional[Sequence[Image]] = None,
7735
7747
  videos: Optional[Sequence[Video]] = None,
7736
7748
  files: Optional[Sequence[File]] = None,
7737
- knowledge_filters: Optional[Dict[str, Any]] = None,
7749
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
7738
7750
  add_history_to_context: Optional[bool] = None,
7739
7751
  dependencies: Optional[Dict[str, Any]] = None,
7740
7752
  add_dependencies_to_context: Optional[bool] = None,
@@ -8029,7 +8041,7 @@ class Agent:
8029
8041
  self,
8030
8042
  query: str,
8031
8043
  num_documents: Optional[int] = None,
8032
- filters: Optional[Dict[str, Any]] = None,
8044
+ filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
8033
8045
  **kwargs,
8034
8046
  ) -> Optional[List[Union[Dict[str, Any], str]]]:
8035
8047
  """Get relevant docs from the knowledge base to answer a query.
@@ -8062,6 +8074,10 @@ class Agent:
8062
8074
  if not filters:
8063
8075
  log_warning("No valid filters remain after validation. Search will proceed without filters.")
8064
8076
 
8077
+ if invalid_keys == [] and valid_filters == {}:
8078
+ log_warning("No valid filters provided. Search will proceed without filters.")
8079
+ filters = None
8080
+
8065
8081
  if self.knowledge_retriever is not None and callable(self.knowledge_retriever):
8066
8082
  from inspect import signature
8067
8083
 
@@ -8108,7 +8124,7 @@ class Agent:
8108
8124
  self,
8109
8125
  query: str,
8110
8126
  num_documents: Optional[int] = None,
8111
- filters: Optional[Dict[str, Any]] = None,
8127
+ filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
8112
8128
  **kwargs,
8113
8129
  ) -> Optional[List[Union[Dict[str, Any], str]]]:
8114
8130
  """Get relevant documents from knowledge base asynchronously."""
@@ -8131,6 +8147,10 @@ class Agent:
8131
8147
  if not filters:
8132
8148
  log_warning("No valid filters remain after validation. Search will proceed without filters.")
8133
8149
 
8150
+ if invalid_keys == [] and valid_filters == {}:
8151
+ log_warning("No valid filters provided. Search will proceed without filters.")
8152
+ filters = None
8153
+
8134
8154
  if self.knowledge_retriever is not None and callable(self.knowledge_retriever):
8135
8155
  from inspect import isawaitable, signature
8136
8156
 
@@ -9452,7 +9472,7 @@ class Agent:
9452
9472
  def _get_search_knowledge_base_function(
9453
9473
  self,
9454
9474
  run_response: RunOutput,
9455
- knowledge_filters: Optional[Dict[str, Any]] = None,
9475
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
9456
9476
  async_mode: bool = False,
9457
9477
  ) -> Function:
9458
9478
  """Factory function to create a search_knowledge_base function with filters."""
@@ -9528,7 +9548,7 @@ class Agent:
9528
9548
  def _search_knowledge_base_with_agentic_filters_function(
9529
9549
  self,
9530
9550
  run_response: RunOutput,
9531
- knowledge_filters: Optional[Dict[str, Any]] = None,
9551
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
9532
9552
  async_mode: bool = False,
9533
9553
  ) -> Function:
9534
9554
  """Factory function to create a search_knowledge_base function with filters."""
@@ -9798,7 +9818,7 @@ class Agent:
9798
9818
  stream_events: Optional[bool] = None,
9799
9819
  stream_intermediate_steps: Optional[bool] = None,
9800
9820
  markdown: Optional[bool] = None,
9801
- knowledge_filters: Optional[Dict[str, Any]] = None,
9821
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
9802
9822
  add_history_to_context: Optional[bool] = None,
9803
9823
  add_dependencies_to_context: Optional[bool] = None,
9804
9824
  dependencies: Optional[Dict[str, Any]] = None,
@@ -9912,7 +9932,7 @@ class Agent:
9912
9932
  stream_events: Optional[bool] = None,
9913
9933
  stream_intermediate_steps: Optional[bool] = None,
9914
9934
  markdown: Optional[bool] = None,
9915
- knowledge_filters: Optional[Dict[str, Any]] = None,
9935
+ knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
9916
9936
  add_history_to_context: Optional[bool] = None,
9917
9937
  dependencies: Optional[Dict[str, Any]] = None,
9918
9938
  add_dependencies_to_context: Optional[bool] = None,
@@ -10093,7 +10113,9 @@ class Agent:
10093
10113
 
10094
10114
  return None
10095
10115
 
10096
- def _get_effective_filters(self, knowledge_filters: Optional[Dict[str, Any]] = None) -> Optional[Dict[str, Any]]:
10116
+ def _get_effective_filters(
10117
+ self, knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None
10118
+ ) -> Optional[Any]:
10097
10119
  """
10098
10120
  Determine which knowledge filters to use, with priority to run-level filters.
10099
10121
 
@@ -10112,8 +10134,13 @@ class Agent:
10112
10134
  # If run has filters, they override agent filters
10113
10135
  if knowledge_filters:
10114
10136
  if effective_filters:
10115
- # Merge filters, with run filters taking priority
10116
- effective_filters.update(knowledge_filters)
10137
+ if isinstance(knowledge_filters, dict):
10138
+ if isinstance(effective_filters, dict):
10139
+ effective_filters.update(knowledge_filters)
10140
+ else:
10141
+ effective_filters = knowledge_filters
10142
+ elif isinstance(knowledge_filters, list):
10143
+ effective_filters = [*effective_filters, *knowledge_filters]
10117
10144
  else:
10118
10145
  effective_filters = knowledge_filters
10119
10146
 
agno/db/dynamo/utils.py CHANGED
@@ -343,7 +343,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
343
343
  ]
344
344
  all_user_ids = set()
345
345
  for session_type, sessions_count_key, runs_count_key in session_types:
346
- sessions = sessions_data.get(session_type, [])
346
+ sessions = sessions_data.get(session_type, []) or []
347
347
  metrics[sessions_count_key] = len(sessions)
348
348
  for session in sessions:
349
349
  if session.get("user_id"):
@@ -194,7 +194,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
194
194
  all_user_ids = set()
195
195
 
196
196
  for session_type, sessions_count_key, runs_count_key in session_types:
197
- sessions = sessions_data.get(session_type, [])
197
+ sessions = sessions_data.get(session_type, []) or []
198
198
  metrics[sessions_count_key] = len(sessions)
199
199
 
200
200
  for session in sessions:
agno/db/gcs_json/utils.py CHANGED
@@ -78,7 +78,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
78
78
  all_user_ids = set()
79
79
 
80
80
  for session_type, sessions_count_key, runs_count_key in session_types:
81
- sessions = sessions_data.get(session_type, [])
81
+ sessions = sessions_data.get(session_type, []) or []
82
82
  metrics[sessions_count_key] = len(sessions)
83
83
 
84
84
  for session in sessions:
@@ -78,7 +78,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
78
78
  all_user_ids = set()
79
79
 
80
80
  for session_type, sessions_count_key, runs_count_key in session_types:
81
- sessions = sessions_data.get(session_type, [])
81
+ sessions = sessions_data.get(session_type, []) or []
82
82
  metrics[sessions_count_key] = len(sessions)
83
83
 
84
84
  for session in sessions:
agno/db/json/utils.py CHANGED
@@ -78,7 +78,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
78
78
  all_user_ids = set()
79
79
 
80
80
  for session_type, sessions_count_key, runs_count_key in session_types:
81
- sessions = sessions_data.get(session_type, [])
81
+ sessions = sessions_data.get(session_type, []) or []
82
82
  metrics[sessions_count_key] = len(sessions)
83
83
 
84
84
  for session in sessions:
agno/db/mongo/utils.py CHANGED
@@ -89,14 +89,14 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
89
89
  all_user_ids = set()
90
90
 
91
91
  for session_type, sessions_count_key, runs_count_key in session_types:
92
- sessions = sessions_data.get(session_type, [])
92
+ sessions = sessions_data.get(session_type, []) or []
93
93
  metrics[sessions_count_key] = len(sessions)
94
94
 
95
95
  for session in sessions:
96
96
  if session.get("user_id"):
97
97
  all_user_ids.add(session["user_id"])
98
- runs = session.get("runs", []) or []
99
- metrics[runs_count_key] += len(sessions)
98
+ runs = session.get("runs", [])
99
+ metrics[runs_count_key] += len(runs)
100
100
 
101
101
  if runs := session.get("runs", []):
102
102
  if isinstance(runs, str):
agno/db/mysql/mysql.py CHANGED
@@ -134,7 +134,7 @@ class MySQLDb(BaseDb):
134
134
  try:
135
135
  table_schema = get_table_schema_definition(table_type)
136
136
 
137
- log_debug(f"Creating table {db_schema}.{table_name} with schema: {table_schema}")
137
+ log_debug(f"Creating table {table_name}")
138
138
 
139
139
  columns: List[Column] = []
140
140
  indexes: List[str] = []
agno/db/mysql/utils.py CHANGED
@@ -205,7 +205,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
205
205
  all_user_ids = set()
206
206
 
207
207
  for session_type, sessions_count_key, runs_count_key in session_types:
208
- sessions = sessions_data.get(session_type, [])
208
+ sessions = sessions_data.get(session_type, []) or []
209
209
  metrics[sessions_count_key] = len(sessions)
210
210
 
211
211
  for session in sessions:
agno/db/postgres/utils.py CHANGED
@@ -292,7 +292,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
292
292
  all_user_ids = set()
293
293
 
294
294
  for session_type, sessions_count_key, runs_count_key in session_types:
295
- sessions = sessions_data.get(session_type, [])
295
+ sessions = sessions_data.get(session_type, []) or []
296
296
  metrics[sessions_count_key] = len(sessions)
297
297
 
298
298
  for session in sessions:
agno/db/redis/utils.py CHANGED
@@ -200,7 +200,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
200
200
  all_user_ids = set()
201
201
 
202
202
  for session_type, sessions_count_key, runs_count_key in session_types:
203
- sessions = sessions_data.get(session_type, [])
203
+ sessions = sessions_data.get(session_type, []) or []
204
204
  metrics[sessions_count_key] = len(sessions)
205
205
 
206
206
  for session in sessions:
@@ -197,7 +197,7 @@ class SingleStoreDb(BaseDb):
197
197
  try:
198
198
  table_schema = get_table_schema_definition(table_type)
199
199
 
200
- log_debug(f"Creating table {table_ref} with schema: {table_schema}")
200
+ log_debug(f"Creating table {table_ref}")
201
201
 
202
202
  columns: List[Column] = []
203
203
  indexes: List[str] = []
@@ -234,7 +234,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
234
234
  all_user_ids = set()
235
235
 
236
236
  for session_type, sessions_count_key, runs_count_key in session_types:
237
- sessions = sessions_data.get(session_type, [])
237
+ sessions = sessions_data.get(session_type, []) or []
238
238
  metrics[sessions_count_key] = len(sessions)
239
239
 
240
240
  for session in sessions:
@@ -150,7 +150,7 @@ class AsyncSqliteDb(AsyncBaseDb):
150
150
  """
151
151
  try:
152
152
  table_schema = get_table_schema_definition(table_type)
153
- log_debug(f"Creating table {table_name} with schema: {table_schema}")
153
+ log_debug(f"Creating table {table_name}")
154
154
 
155
155
  columns: List[Column] = []
156
156
  indexes: List[str] = []
agno/db/sqlite/sqlite.py CHANGED
@@ -151,7 +151,7 @@ class SqliteDb(BaseDb):
151
151
  """
152
152
  try:
153
153
  table_schema = get_table_schema_definition(table_type)
154
- log_debug(f"Creating table {table_name} with schema: {table_schema}")
154
+ log_debug(f"Creating table {table_name}")
155
155
 
156
156
  columns: List[Column] = []
157
157
  indexes: List[str] = []
agno/db/sqlite/utils.py CHANGED
@@ -270,7 +270,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
270
270
  all_user_ids = set()
271
271
 
272
272
  for session_type, sessions_count_key, runs_count_key in session_types:
273
- sessions = sessions_data.get(session_type, [])
273
+ sessions = sessions_data.get(session_type, []) or []
274
274
  metrics[sessions_count_key] = len(sessions)
275
275
 
276
276
  for session in sessions: