agno 2.1.2__py3-none-any.whl → 2.3.13__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 (314) hide show
  1. agno/agent/agent.py +5540 -2273
  2. agno/api/api.py +2 -0
  3. agno/api/os.py +1 -1
  4. agno/compression/__init__.py +3 -0
  5. agno/compression/manager.py +247 -0
  6. agno/culture/__init__.py +3 -0
  7. agno/culture/manager.py +956 -0
  8. agno/db/async_postgres/__init__.py +3 -0
  9. agno/db/base.py +689 -6
  10. agno/db/dynamo/dynamo.py +933 -37
  11. agno/db/dynamo/schemas.py +174 -10
  12. agno/db/dynamo/utils.py +63 -4
  13. agno/db/firestore/firestore.py +831 -9
  14. agno/db/firestore/schemas.py +51 -0
  15. agno/db/firestore/utils.py +102 -4
  16. agno/db/gcs_json/gcs_json_db.py +660 -12
  17. agno/db/gcs_json/utils.py +60 -26
  18. agno/db/in_memory/in_memory_db.py +287 -14
  19. agno/db/in_memory/utils.py +60 -2
  20. agno/db/json/json_db.py +590 -14
  21. agno/db/json/utils.py +60 -26
  22. agno/db/migrations/manager.py +199 -0
  23. agno/db/migrations/v1_to_v2.py +43 -13
  24. agno/db/migrations/versions/__init__.py +0 -0
  25. agno/db/migrations/versions/v2_3_0.py +938 -0
  26. agno/db/mongo/__init__.py +15 -1
  27. agno/db/mongo/async_mongo.py +2760 -0
  28. agno/db/mongo/mongo.py +879 -11
  29. agno/db/mongo/schemas.py +42 -0
  30. agno/db/mongo/utils.py +80 -8
  31. agno/db/mysql/__init__.py +2 -1
  32. agno/db/mysql/async_mysql.py +2912 -0
  33. agno/db/mysql/mysql.py +946 -68
  34. agno/db/mysql/schemas.py +72 -10
  35. agno/db/mysql/utils.py +198 -7
  36. agno/db/postgres/__init__.py +2 -1
  37. agno/db/postgres/async_postgres.py +2579 -0
  38. agno/db/postgres/postgres.py +942 -57
  39. agno/db/postgres/schemas.py +81 -18
  40. agno/db/postgres/utils.py +164 -2
  41. agno/db/redis/redis.py +671 -7
  42. agno/db/redis/schemas.py +50 -0
  43. agno/db/redis/utils.py +65 -7
  44. agno/db/schemas/__init__.py +2 -1
  45. agno/db/schemas/culture.py +120 -0
  46. agno/db/schemas/evals.py +1 -0
  47. agno/db/schemas/memory.py +17 -2
  48. agno/db/singlestore/schemas.py +63 -0
  49. agno/db/singlestore/singlestore.py +949 -83
  50. agno/db/singlestore/utils.py +60 -2
  51. agno/db/sqlite/__init__.py +2 -1
  52. agno/db/sqlite/async_sqlite.py +2911 -0
  53. agno/db/sqlite/schemas.py +62 -0
  54. agno/db/sqlite/sqlite.py +965 -46
  55. agno/db/sqlite/utils.py +169 -8
  56. agno/db/surrealdb/__init__.py +3 -0
  57. agno/db/surrealdb/metrics.py +292 -0
  58. agno/db/surrealdb/models.py +334 -0
  59. agno/db/surrealdb/queries.py +71 -0
  60. agno/db/surrealdb/surrealdb.py +1908 -0
  61. agno/db/surrealdb/utils.py +147 -0
  62. agno/db/utils.py +2 -0
  63. agno/eval/__init__.py +10 -0
  64. agno/eval/accuracy.py +75 -55
  65. agno/eval/agent_as_judge.py +861 -0
  66. agno/eval/base.py +29 -0
  67. agno/eval/performance.py +16 -7
  68. agno/eval/reliability.py +28 -16
  69. agno/eval/utils.py +35 -17
  70. agno/exceptions.py +27 -2
  71. agno/filters.py +354 -0
  72. agno/guardrails/prompt_injection.py +1 -0
  73. agno/hooks/__init__.py +3 -0
  74. agno/hooks/decorator.py +164 -0
  75. agno/integrations/discord/client.py +1 -1
  76. agno/knowledge/chunking/agentic.py +13 -10
  77. agno/knowledge/chunking/fixed.py +4 -1
  78. agno/knowledge/chunking/semantic.py +9 -4
  79. agno/knowledge/chunking/strategy.py +59 -15
  80. agno/knowledge/embedder/fastembed.py +1 -1
  81. agno/knowledge/embedder/nebius.py +1 -1
  82. agno/knowledge/embedder/ollama.py +8 -0
  83. agno/knowledge/embedder/openai.py +8 -8
  84. agno/knowledge/embedder/sentence_transformer.py +6 -2
  85. agno/knowledge/embedder/vllm.py +262 -0
  86. agno/knowledge/knowledge.py +1618 -318
  87. agno/knowledge/reader/base.py +6 -2
  88. agno/knowledge/reader/csv_reader.py +8 -10
  89. agno/knowledge/reader/docx_reader.py +5 -6
  90. agno/knowledge/reader/field_labeled_csv_reader.py +16 -20
  91. agno/knowledge/reader/json_reader.py +5 -4
  92. agno/knowledge/reader/markdown_reader.py +8 -8
  93. agno/knowledge/reader/pdf_reader.py +17 -19
  94. agno/knowledge/reader/pptx_reader.py +101 -0
  95. agno/knowledge/reader/reader_factory.py +32 -3
  96. agno/knowledge/reader/s3_reader.py +3 -3
  97. agno/knowledge/reader/tavily_reader.py +193 -0
  98. agno/knowledge/reader/text_reader.py +22 -10
  99. agno/knowledge/reader/web_search_reader.py +1 -48
  100. agno/knowledge/reader/website_reader.py +10 -10
  101. agno/knowledge/reader/wikipedia_reader.py +33 -1
  102. agno/knowledge/types.py +1 -0
  103. agno/knowledge/utils.py +72 -7
  104. agno/media.py +22 -6
  105. agno/memory/__init__.py +14 -1
  106. agno/memory/manager.py +544 -83
  107. agno/memory/strategies/__init__.py +15 -0
  108. agno/memory/strategies/base.py +66 -0
  109. agno/memory/strategies/summarize.py +196 -0
  110. agno/memory/strategies/types.py +37 -0
  111. agno/models/aimlapi/aimlapi.py +17 -0
  112. agno/models/anthropic/claude.py +515 -40
  113. agno/models/aws/bedrock.py +102 -21
  114. agno/models/aws/claude.py +131 -274
  115. agno/models/azure/ai_foundry.py +41 -19
  116. agno/models/azure/openai_chat.py +39 -8
  117. agno/models/base.py +1249 -525
  118. agno/models/cerebras/cerebras.py +91 -21
  119. agno/models/cerebras/cerebras_openai.py +21 -2
  120. agno/models/cohere/chat.py +40 -6
  121. agno/models/cometapi/cometapi.py +18 -1
  122. agno/models/dashscope/dashscope.py +2 -3
  123. agno/models/deepinfra/deepinfra.py +18 -1
  124. agno/models/deepseek/deepseek.py +69 -3
  125. agno/models/fireworks/fireworks.py +18 -1
  126. agno/models/google/gemini.py +877 -80
  127. agno/models/google/utils.py +22 -0
  128. agno/models/groq/groq.py +51 -18
  129. agno/models/huggingface/huggingface.py +17 -6
  130. agno/models/ibm/watsonx.py +16 -6
  131. agno/models/internlm/internlm.py +18 -1
  132. agno/models/langdb/langdb.py +13 -1
  133. agno/models/litellm/chat.py +44 -9
  134. agno/models/litellm/litellm_openai.py +18 -1
  135. agno/models/message.py +28 -5
  136. agno/models/meta/llama.py +47 -14
  137. agno/models/meta/llama_openai.py +22 -17
  138. agno/models/mistral/mistral.py +8 -4
  139. agno/models/nebius/nebius.py +6 -7
  140. agno/models/nvidia/nvidia.py +20 -3
  141. agno/models/ollama/chat.py +24 -8
  142. agno/models/openai/chat.py +104 -29
  143. agno/models/openai/responses.py +101 -81
  144. agno/models/openrouter/openrouter.py +60 -3
  145. agno/models/perplexity/perplexity.py +17 -1
  146. agno/models/portkey/portkey.py +7 -6
  147. agno/models/requesty/requesty.py +24 -4
  148. agno/models/response.py +73 -2
  149. agno/models/sambanova/sambanova.py +20 -3
  150. agno/models/siliconflow/siliconflow.py +19 -2
  151. agno/models/together/together.py +20 -3
  152. agno/models/utils.py +254 -8
  153. agno/models/vercel/v0.py +20 -3
  154. agno/models/vertexai/__init__.py +0 -0
  155. agno/models/vertexai/claude.py +190 -0
  156. agno/models/vllm/vllm.py +19 -14
  157. agno/models/xai/xai.py +19 -2
  158. agno/os/app.py +549 -152
  159. agno/os/auth.py +190 -3
  160. agno/os/config.py +23 -0
  161. agno/os/interfaces/a2a/router.py +8 -11
  162. agno/os/interfaces/a2a/utils.py +1 -1
  163. agno/os/interfaces/agui/router.py +18 -3
  164. agno/os/interfaces/agui/utils.py +152 -39
  165. agno/os/interfaces/slack/router.py +55 -37
  166. agno/os/interfaces/slack/slack.py +9 -1
  167. agno/os/interfaces/whatsapp/router.py +0 -1
  168. agno/os/interfaces/whatsapp/security.py +3 -1
  169. agno/os/mcp.py +110 -52
  170. agno/os/middleware/__init__.py +2 -0
  171. agno/os/middleware/jwt.py +676 -112
  172. agno/os/router.py +40 -1478
  173. agno/os/routers/agents/__init__.py +3 -0
  174. agno/os/routers/agents/router.py +599 -0
  175. agno/os/routers/agents/schema.py +261 -0
  176. agno/os/routers/evals/evals.py +96 -39
  177. agno/os/routers/evals/schemas.py +65 -33
  178. agno/os/routers/evals/utils.py +80 -10
  179. agno/os/routers/health.py +10 -4
  180. agno/os/routers/knowledge/knowledge.py +196 -38
  181. agno/os/routers/knowledge/schemas.py +82 -22
  182. agno/os/routers/memory/memory.py +279 -52
  183. agno/os/routers/memory/schemas.py +46 -17
  184. agno/os/routers/metrics/metrics.py +20 -8
  185. agno/os/routers/metrics/schemas.py +16 -16
  186. agno/os/routers/session/session.py +462 -34
  187. agno/os/routers/teams/__init__.py +3 -0
  188. agno/os/routers/teams/router.py +512 -0
  189. agno/os/routers/teams/schema.py +257 -0
  190. agno/os/routers/traces/__init__.py +3 -0
  191. agno/os/routers/traces/schemas.py +414 -0
  192. agno/os/routers/traces/traces.py +499 -0
  193. agno/os/routers/workflows/__init__.py +3 -0
  194. agno/os/routers/workflows/router.py +624 -0
  195. agno/os/routers/workflows/schema.py +75 -0
  196. agno/os/schema.py +256 -693
  197. agno/os/scopes.py +469 -0
  198. agno/os/utils.py +514 -36
  199. agno/reasoning/anthropic.py +80 -0
  200. agno/reasoning/gemini.py +73 -0
  201. agno/reasoning/openai.py +5 -0
  202. agno/reasoning/vertexai.py +76 -0
  203. agno/run/__init__.py +6 -0
  204. agno/run/agent.py +155 -32
  205. agno/run/base.py +55 -3
  206. agno/run/requirement.py +181 -0
  207. agno/run/team.py +125 -38
  208. agno/run/workflow.py +72 -18
  209. agno/session/agent.py +102 -89
  210. agno/session/summary.py +56 -15
  211. agno/session/team.py +164 -90
  212. agno/session/workflow.py +405 -40
  213. agno/table.py +10 -0
  214. agno/team/team.py +3974 -1903
  215. agno/tools/dalle.py +2 -4
  216. agno/tools/eleven_labs.py +23 -25
  217. agno/tools/exa.py +21 -16
  218. agno/tools/file.py +153 -23
  219. agno/tools/file_generation.py +16 -10
  220. agno/tools/firecrawl.py +15 -7
  221. agno/tools/function.py +193 -38
  222. agno/tools/gmail.py +238 -14
  223. agno/tools/google_drive.py +271 -0
  224. agno/tools/googlecalendar.py +36 -8
  225. agno/tools/googlesheets.py +20 -5
  226. agno/tools/jira.py +20 -0
  227. agno/tools/mcp/__init__.py +10 -0
  228. agno/tools/mcp/mcp.py +331 -0
  229. agno/tools/mcp/multi_mcp.py +347 -0
  230. agno/tools/mcp/params.py +24 -0
  231. agno/tools/mcp_toolbox.py +3 -3
  232. agno/tools/models/nebius.py +5 -5
  233. agno/tools/models_labs.py +20 -10
  234. agno/tools/nano_banana.py +151 -0
  235. agno/tools/notion.py +204 -0
  236. agno/tools/parallel.py +314 -0
  237. agno/tools/postgres.py +76 -36
  238. agno/tools/redshift.py +406 -0
  239. agno/tools/scrapegraph.py +1 -1
  240. agno/tools/shopify.py +1519 -0
  241. agno/tools/slack.py +18 -3
  242. agno/tools/spotify.py +919 -0
  243. agno/tools/tavily.py +146 -0
  244. agno/tools/toolkit.py +25 -0
  245. agno/tools/workflow.py +8 -1
  246. agno/tools/yfinance.py +12 -11
  247. agno/tracing/__init__.py +12 -0
  248. agno/tracing/exporter.py +157 -0
  249. agno/tracing/schemas.py +276 -0
  250. agno/tracing/setup.py +111 -0
  251. agno/utils/agent.py +938 -0
  252. agno/utils/cryptography.py +22 -0
  253. agno/utils/dttm.py +33 -0
  254. agno/utils/events.py +151 -3
  255. agno/utils/gemini.py +15 -5
  256. agno/utils/hooks.py +118 -4
  257. agno/utils/http.py +113 -2
  258. agno/utils/knowledge.py +12 -5
  259. agno/utils/log.py +1 -0
  260. agno/utils/mcp.py +92 -2
  261. agno/utils/media.py +187 -1
  262. agno/utils/merge_dict.py +3 -3
  263. agno/utils/message.py +60 -0
  264. agno/utils/models/ai_foundry.py +9 -2
  265. agno/utils/models/claude.py +49 -14
  266. agno/utils/models/cohere.py +9 -2
  267. agno/utils/models/llama.py +9 -2
  268. agno/utils/models/mistral.py +4 -2
  269. agno/utils/print_response/agent.py +109 -16
  270. agno/utils/print_response/team.py +223 -30
  271. agno/utils/print_response/workflow.py +251 -34
  272. agno/utils/streamlit.py +1 -1
  273. agno/utils/team.py +98 -9
  274. agno/utils/tokens.py +657 -0
  275. agno/vectordb/base.py +39 -7
  276. agno/vectordb/cassandra/cassandra.py +21 -5
  277. agno/vectordb/chroma/chromadb.py +43 -12
  278. agno/vectordb/clickhouse/clickhousedb.py +21 -5
  279. agno/vectordb/couchbase/couchbase.py +29 -5
  280. agno/vectordb/lancedb/lance_db.py +92 -181
  281. agno/vectordb/langchaindb/langchaindb.py +24 -4
  282. agno/vectordb/lightrag/lightrag.py +17 -3
  283. agno/vectordb/llamaindex/llamaindexdb.py +25 -5
  284. agno/vectordb/milvus/milvus.py +50 -37
  285. agno/vectordb/mongodb/__init__.py +7 -1
  286. agno/vectordb/mongodb/mongodb.py +36 -30
  287. agno/vectordb/pgvector/pgvector.py +201 -77
  288. agno/vectordb/pineconedb/pineconedb.py +41 -23
  289. agno/vectordb/qdrant/qdrant.py +67 -54
  290. agno/vectordb/redis/__init__.py +9 -0
  291. agno/vectordb/redis/redisdb.py +682 -0
  292. agno/vectordb/singlestore/singlestore.py +50 -29
  293. agno/vectordb/surrealdb/surrealdb.py +31 -41
  294. agno/vectordb/upstashdb/upstashdb.py +34 -6
  295. agno/vectordb/weaviate/weaviate.py +53 -14
  296. agno/workflow/__init__.py +2 -0
  297. agno/workflow/agent.py +299 -0
  298. agno/workflow/condition.py +120 -18
  299. agno/workflow/loop.py +77 -10
  300. agno/workflow/parallel.py +231 -143
  301. agno/workflow/router.py +118 -17
  302. agno/workflow/step.py +609 -170
  303. agno/workflow/steps.py +73 -6
  304. agno/workflow/types.py +96 -21
  305. agno/workflow/workflow.py +2039 -262
  306. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
  307. agno-2.3.13.dist-info/RECORD +613 -0
  308. agno/tools/googlesearch.py +0 -98
  309. agno/tools/mcp.py +0 -679
  310. agno/tools/memori.py +0 -339
  311. agno-2.1.2.dist-info/RECORD +0 -543
  312. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
  313. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
  314. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/db/mongo/schemas.py CHANGED
@@ -19,6 +19,9 @@ MEMORY_COLLECTION_SCHEMA = [
19
19
  {"key": "agent_id"},
20
20
  {"key": "team_id"},
21
21
  {"key": "topics"},
22
+ {"key": "input"},
23
+ {"key": "feedback"},
24
+ {"key": "created_at"},
22
25
  {"key": "updated_at"},
23
26
  ]
24
27
 
@@ -59,6 +62,42 @@ METRICS_COLLECTION_SCHEMA = [
59
62
  {"key": [("date", 1), ("aggregation_period", 1)], "unique": True},
60
63
  ]
61
64
 
65
+ CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA = [
66
+ {"key": "id", "unique": True},
67
+ {"key": "name"},
68
+ {"key": "agent_id"},
69
+ {"key": "team_id"},
70
+ {"key": "created_at"},
71
+ {"key": "updated_at"},
72
+ ]
73
+
74
+ TRACE_COLLECTION_SCHEMA = [
75
+ {"key": "trace_id", "unique": True},
76
+ {"key": "name"},
77
+ {"key": "status"},
78
+ {"key": "run_id"},
79
+ {"key": "session_id"},
80
+ {"key": "user_id"},
81
+ {"key": "agent_id"},
82
+ {"key": "team_id"},
83
+ {"key": "workflow_id"},
84
+ {"key": "start_time"},
85
+ {"key": "end_time"},
86
+ {"key": "created_at"},
87
+ ]
88
+
89
+ SPAN_COLLECTION_SCHEMA = [
90
+ {"key": "span_id", "unique": True},
91
+ {"key": "trace_id"},
92
+ {"key": "parent_span_id"},
93
+ {"key": "name"},
94
+ {"key": "span_kind"},
95
+ {"key": "status_code"},
96
+ {"key": "start_time"},
97
+ {"key": "end_time"},
98
+ {"key": "created_at"},
99
+ ]
100
+
62
101
 
63
102
  def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
64
103
  """Get the index definitions for a specific collection type."""
@@ -68,6 +107,9 @@ def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
68
107
  "metrics": METRICS_COLLECTION_SCHEMA,
69
108
  "evals": EVAL_COLLECTION_SCHEMA,
70
109
  "knowledge": KNOWLEDGE_COLLECTION_SCHEMA,
110
+ "culture": CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA,
111
+ "traces": TRACE_COLLECTION_SCHEMA,
112
+ "spans": SPAN_COLLECTION_SCHEMA,
71
113
  }
72
114
 
73
115
  indexes = index_definitions.get(collection_type)
agno/db/mongo/utils.py CHANGED
@@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional
7
7
  from uuid import uuid4
8
8
 
9
9
  from agno.db.mongo.schemas import get_collection_indexes
10
+ from agno.db.schemas.culture import CulturalKnowledge
10
11
  from agno.utils.log import log_error, log_warning
11
12
 
12
13
  try:
@@ -16,8 +17,6 @@ except ImportError:
16
17
 
17
18
 
18
19
  # -- DB util methods --
19
-
20
-
21
20
  def create_collection_indexes(collection: Collection, collection_type: str) -> None:
22
21
  """Create all required indexes for a collection"""
23
22
  try:
@@ -35,6 +34,23 @@ def create_collection_indexes(collection: Collection, collection_type: str) -> N
35
34
  log_warning(f"Error creating indexes for {collection_type} collection: {e}")
36
35
 
37
36
 
37
+ async def create_collection_indexes_async(collection: Any, collection_type: str) -> None:
38
+ """Create all required indexes for a collection (async version for Motor)"""
39
+ try:
40
+ indexes = get_collection_indexes(collection_type)
41
+ for index_spec in indexes:
42
+ key = index_spec["key"]
43
+ unique = index_spec.get("unique", False)
44
+
45
+ if isinstance(key, list):
46
+ await collection.create_index(key, unique=unique)
47
+ else:
48
+ await collection.create_index([(key, 1)], unique=unique)
49
+
50
+ except Exception as e:
51
+ log_warning(f"Error creating indexes for {collection_type} collection: {e}")
52
+
53
+
38
54
  def apply_sorting(
39
55
  query_args: Dict[str, Any], sort_by: Optional[str] = None, sort_order: Optional[str] = None
40
56
  ) -> List[tuple]:
@@ -58,8 +74,6 @@ def apply_pagination(
58
74
 
59
75
 
60
76
  # -- Metrics util methods --
61
-
62
-
63
77
  def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
64
78
  """Calculate metrics for the given single date."""
65
79
  metrics = {
@@ -92,14 +106,14 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
92
106
  all_user_ids = set()
93
107
 
94
108
  for session_type, sessions_count_key, runs_count_key in session_types:
95
- sessions = sessions_data.get(session_type, [])
109
+ sessions = sessions_data.get(session_type, []) or []
96
110
  metrics[sessions_count_key] = len(sessions)
97
111
 
98
112
  for session in sessions:
99
113
  if session.get("user_id"):
100
114
  all_user_ids.add(session["user_id"])
101
- runs = session.get("runs", []) or []
102
- metrics[runs_count_key] += len(sessions)
115
+ runs = session.get("runs", [])
116
+ metrics[runs_count_key] += len(runs)
103
117
 
104
118
  if runs := session.get("runs", []):
105
119
  if isinstance(runs, str):
@@ -120,7 +134,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
120
134
 
121
135
  model_metrics = []
122
136
  for model, count in model_counts.items():
123
- model_id, model_provider = model.split(":")
137
+ model_id, model_provider = model.rsplit(":", 1)
124
138
  model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
125
139
 
126
140
  metrics["users_count"] = len(all_user_ids)
@@ -202,3 +216,61 @@ def bulk_upsert_metrics(collection: Collection, metrics_records: List[Dict[str,
202
216
  continue
203
217
 
204
218
  return results
219
+
220
+
221
+ # -- Cultural Knowledge util methods --
222
+ def serialize_cultural_knowledge_for_db(cultural_knowledge: CulturalKnowledge) -> Dict[str, Any]:
223
+ """Serialize a CulturalKnowledge object for database storage.
224
+
225
+ Converts the model's separate content, categories, and notes fields
226
+ into a single dict for the database content column.
227
+ MongoDB stores as BSON which natively supports nested documents.
228
+
229
+ Args:
230
+ cultural_knowledge (CulturalKnowledge): The cultural knowledge object to serialize.
231
+
232
+ Returns:
233
+ Dict[str, Any]: A dictionary with the content field as a dict containing content, categories, and notes.
234
+ """
235
+ content_dict: Dict[str, Any] = {}
236
+ if cultural_knowledge.content is not None:
237
+ content_dict["content"] = cultural_knowledge.content
238
+ if cultural_knowledge.categories is not None:
239
+ content_dict["categories"] = cultural_knowledge.categories
240
+ if cultural_knowledge.notes is not None:
241
+ content_dict["notes"] = cultural_knowledge.notes
242
+
243
+ return content_dict if content_dict else {}
244
+
245
+
246
+ def deserialize_cultural_knowledge_from_db(db_row: Dict[str, Any]) -> CulturalKnowledge:
247
+ """Deserialize a database row to a CulturalKnowledge object.
248
+
249
+ The database stores content as a dict containing content, categories, and notes.
250
+ This method extracts those fields and converts them back to the model format.
251
+
252
+ Args:
253
+ db_row (Dict[str, Any]): The database row as a dictionary.
254
+
255
+ Returns:
256
+ CulturalKnowledge: The cultural knowledge object.
257
+ """
258
+ # Extract content, categories, and notes from the content field
259
+ content_json = db_row.get("content", {}) or {}
260
+
261
+ return CulturalKnowledge.from_dict(
262
+ {
263
+ "id": db_row.get("id"),
264
+ "name": db_row.get("name"),
265
+ "summary": db_row.get("summary"),
266
+ "content": content_json.get("content"),
267
+ "categories": content_json.get("categories"),
268
+ "notes": content_json.get("notes"),
269
+ "metadata": db_row.get("metadata"),
270
+ "input": db_row.get("input"),
271
+ "created_at": db_row.get("created_at"),
272
+ "updated_at": db_row.get("updated_at"),
273
+ "agent_id": db_row.get("agent_id"),
274
+ "team_id": db_row.get("team_id"),
275
+ }
276
+ )
agno/db/mysql/__init__.py CHANGED
@@ -1,3 +1,4 @@
1
+ from agno.db.mysql.async_mysql import AsyncMySQLDb
1
2
  from agno.db.mysql.mysql import MySQLDb
2
3
 
3
- __all__ = ["MySQLDb"]
4
+ __all__ = ["MySQLDb", "AsyncMySQLDb"]