agno 0.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 (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1791 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1312 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/db/base.py ADDED
@@ -0,0 +1,946 @@
1
+ from abc import ABC, abstractmethod
2
+ from datetime import date, datetime
3
+ from enum import Enum
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
5
+ from uuid import uuid4
6
+
7
+ if TYPE_CHECKING:
8
+ from agno.tracing.schemas import Span, Trace
9
+
10
+ from agno.db.schemas import UserMemory
11
+ from agno.db.schemas.culture import CulturalKnowledge
12
+ from agno.db.schemas.evals import EvalFilterType, EvalRunRecord, EvalType
13
+ from agno.db.schemas.knowledge import KnowledgeRow
14
+ from agno.session import Session
15
+
16
+
17
+ class SessionType(str, Enum):
18
+ AGENT = "agent"
19
+ TEAM = "team"
20
+ WORKFLOW = "workflow"
21
+
22
+
23
+ class BaseDb(ABC):
24
+ """Base abstract class for all our Database implementations."""
25
+
26
+ # We assume the database to be up to date with the 2.0.0 release
27
+ default_schema_version = "2.0.0"
28
+
29
+ def __init__(
30
+ self,
31
+ session_table: Optional[str] = None,
32
+ culture_table: Optional[str] = None,
33
+ memory_table: Optional[str] = None,
34
+ metrics_table: Optional[str] = None,
35
+ eval_table: Optional[str] = None,
36
+ knowledge_table: Optional[str] = None,
37
+ traces_table: Optional[str] = None,
38
+ spans_table: Optional[str] = None,
39
+ versions_table: Optional[str] = None,
40
+ id: Optional[str] = None,
41
+ ):
42
+ self.id = id or str(uuid4())
43
+ self.session_table_name = session_table or "agno_sessions"
44
+ self.culture_table_name = culture_table or "agno_culture"
45
+ self.memory_table_name = memory_table or "agno_memories"
46
+ self.metrics_table_name = metrics_table or "agno_metrics"
47
+ self.eval_table_name = eval_table or "agno_eval_runs"
48
+ self.knowledge_table_name = knowledge_table or "agno_knowledge"
49
+ self.trace_table_name = traces_table or "agno_traces"
50
+ self.span_table_name = spans_table or "agno_spans"
51
+ self.versions_table_name = versions_table or "agno_schema_versions"
52
+
53
+ @abstractmethod
54
+ def table_exists(self, table_name: str) -> bool:
55
+ raise NotImplementedError
56
+
57
+ def _create_all_tables(self) -> None:
58
+ """Create all tables for this database."""
59
+ pass
60
+
61
+ # --- Schema Version ---
62
+ @abstractmethod
63
+ def get_latest_schema_version(self, table_name: str):
64
+ raise NotImplementedError
65
+
66
+ @abstractmethod
67
+ def upsert_schema_version(self, table_name: str, version: str):
68
+ """Upsert the schema version into the database."""
69
+ raise NotImplementedError
70
+
71
+ # --- Sessions ---
72
+ @abstractmethod
73
+ def delete_session(self, session_id: str) -> bool:
74
+ raise NotImplementedError
75
+
76
+ @abstractmethod
77
+ def delete_sessions(self, session_ids: List[str]) -> None:
78
+ raise NotImplementedError
79
+
80
+ @abstractmethod
81
+ def get_session(
82
+ self,
83
+ session_id: str,
84
+ session_type: SessionType,
85
+ user_id: Optional[str] = None,
86
+ deserialize: Optional[bool] = True,
87
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
88
+ raise NotImplementedError
89
+
90
+ @abstractmethod
91
+ def get_sessions(
92
+ self,
93
+ session_type: SessionType,
94
+ user_id: Optional[str] = None,
95
+ component_id: Optional[str] = None,
96
+ session_name: Optional[str] = None,
97
+ start_timestamp: Optional[int] = None,
98
+ end_timestamp: Optional[int] = None,
99
+ limit: Optional[int] = None,
100
+ page: Optional[int] = None,
101
+ sort_by: Optional[str] = None,
102
+ sort_order: Optional[str] = None,
103
+ deserialize: Optional[bool] = True,
104
+ ) -> Union[List[Session], Tuple[List[Dict[str, Any]], int]]:
105
+ raise NotImplementedError
106
+
107
+ @abstractmethod
108
+ def rename_session(
109
+ self,
110
+ session_id: str,
111
+ session_type: SessionType,
112
+ session_name: str,
113
+ deserialize: Optional[bool] = True,
114
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
115
+ raise NotImplementedError
116
+
117
+ @abstractmethod
118
+ def upsert_session(
119
+ self, session: Session, deserialize: Optional[bool] = True
120
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
121
+ raise NotImplementedError
122
+
123
+ @abstractmethod
124
+ def upsert_sessions(
125
+ self,
126
+ sessions: List[Session],
127
+ deserialize: Optional[bool] = True,
128
+ preserve_updated_at: bool = False,
129
+ ) -> List[Union[Session, Dict[str, Any]]]:
130
+ """Bulk upsert multiple sessions for improved performance on large datasets."""
131
+ raise NotImplementedError
132
+
133
+ # --- Memory ---
134
+ @abstractmethod
135
+ def clear_memories(self) -> None:
136
+ raise NotImplementedError
137
+
138
+ @abstractmethod
139
+ def delete_user_memory(self, memory_id: str, user_id: Optional[str] = None) -> None:
140
+ raise NotImplementedError
141
+
142
+ @abstractmethod
143
+ def delete_user_memories(self, memory_ids: List[str], user_id: Optional[str] = None) -> None:
144
+ raise NotImplementedError
145
+
146
+ @abstractmethod
147
+ def get_all_memory_topics(self, user_id: Optional[str] = None) -> List[str]:
148
+ raise NotImplementedError
149
+
150
+ @abstractmethod
151
+ def get_user_memory(
152
+ self,
153
+ memory_id: str,
154
+ deserialize: Optional[bool] = True,
155
+ user_id: Optional[str] = None,
156
+ ) -> Optional[Union[UserMemory, Dict[str, Any]]]:
157
+ raise NotImplementedError
158
+
159
+ @abstractmethod
160
+ def get_user_memories(
161
+ self,
162
+ user_id: Optional[str] = None,
163
+ agent_id: Optional[str] = None,
164
+ team_id: Optional[str] = None,
165
+ topics: Optional[List[str]] = None,
166
+ search_content: Optional[str] = None,
167
+ limit: Optional[int] = None,
168
+ page: Optional[int] = None,
169
+ sort_by: Optional[str] = None,
170
+ sort_order: Optional[str] = None,
171
+ deserialize: Optional[bool] = True,
172
+ ) -> Union[List[UserMemory], Tuple[List[Dict[str, Any]], int]]:
173
+ raise NotImplementedError
174
+
175
+ @abstractmethod
176
+ def get_user_memory_stats(
177
+ self,
178
+ limit: Optional[int] = None,
179
+ page: Optional[int] = None,
180
+ user_id: Optional[str] = None,
181
+ ) -> Tuple[List[Dict[str, Any]], int]:
182
+ raise NotImplementedError
183
+
184
+ @abstractmethod
185
+ def upsert_user_memory(
186
+ self, memory: UserMemory, deserialize: Optional[bool] = True
187
+ ) -> Optional[Union[UserMemory, Dict[str, Any]]]:
188
+ raise NotImplementedError
189
+
190
+ @abstractmethod
191
+ def upsert_memories(
192
+ self,
193
+ memories: List[UserMemory],
194
+ deserialize: Optional[bool] = True,
195
+ preserve_updated_at: bool = False,
196
+ ) -> List[Union[UserMemory, Dict[str, Any]]]:
197
+ """Bulk upsert multiple memories for improved performance on large datasets."""
198
+ raise NotImplementedError
199
+
200
+ # --- Metrics ---
201
+ @abstractmethod
202
+ def get_metrics(
203
+ self,
204
+ starting_date: Optional[date] = None,
205
+ ending_date: Optional[date] = None,
206
+ ) -> Tuple[List[Dict[str, Any]], Optional[int]]:
207
+ raise NotImplementedError
208
+
209
+ @abstractmethod
210
+ def calculate_metrics(self) -> Optional[Any]:
211
+ raise NotImplementedError
212
+
213
+ # --- Knowledge ---
214
+ @abstractmethod
215
+ def delete_knowledge_content(self, id: str):
216
+ """Delete a knowledge row from the database.
217
+
218
+ Args:
219
+ id (str): The ID of the knowledge row to delete.
220
+ """
221
+ raise NotImplementedError
222
+
223
+ @abstractmethod
224
+ def get_knowledge_content(self, id: str) -> Optional[KnowledgeRow]:
225
+ """Get a knowledge row from the database.
226
+
227
+ Args:
228
+ id (str): The ID of the knowledge row to get.
229
+
230
+ Returns:
231
+ Optional[KnowledgeRow]: The knowledge row, or None if it doesn't exist.
232
+ """
233
+ raise NotImplementedError
234
+
235
+ @abstractmethod
236
+ def get_knowledge_contents(
237
+ self,
238
+ limit: Optional[int] = None,
239
+ page: Optional[int] = None,
240
+ sort_by: Optional[str] = None,
241
+ sort_order: Optional[str] = None,
242
+ ) -> Tuple[List[KnowledgeRow], int]:
243
+ """Get all knowledge contents from the database.
244
+
245
+ Args:
246
+ limit (Optional[int]): The maximum number of knowledge contents to return.
247
+ page (Optional[int]): The page number.
248
+ sort_by (Optional[str]): The column to sort by.
249
+ sort_order (Optional[str]): The order to sort by.
250
+
251
+ Returns:
252
+ Tuple[List[KnowledgeRow], int]: The knowledge contents and total count.
253
+
254
+ Raises:
255
+ Exception: If an error occurs during retrieval.
256
+ """
257
+ raise NotImplementedError
258
+
259
+ @abstractmethod
260
+ def upsert_knowledge_content(self, knowledge_row: KnowledgeRow):
261
+ """Upsert knowledge content in the database.
262
+
263
+ Args:
264
+ knowledge_row (KnowledgeRow): The knowledge row to upsert.
265
+
266
+ Returns:
267
+ Optional[KnowledgeRow]: The upserted knowledge row, or None if the operation fails.
268
+ """
269
+ raise NotImplementedError
270
+
271
+ # --- Evals ---
272
+ @abstractmethod
273
+ def create_eval_run(self, eval_run: EvalRunRecord) -> Optional[EvalRunRecord]:
274
+ raise NotImplementedError
275
+
276
+ @abstractmethod
277
+ def delete_eval_runs(self, eval_run_ids: List[str]) -> None:
278
+ raise NotImplementedError
279
+
280
+ @abstractmethod
281
+ def get_eval_run(
282
+ self, eval_run_id: str, deserialize: Optional[bool] = True
283
+ ) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
284
+ raise NotImplementedError
285
+
286
+ @abstractmethod
287
+ def get_eval_runs(
288
+ self,
289
+ limit: Optional[int] = None,
290
+ page: Optional[int] = None,
291
+ sort_by: Optional[str] = None,
292
+ sort_order: Optional[str] = None,
293
+ agent_id: Optional[str] = None,
294
+ team_id: Optional[str] = None,
295
+ workflow_id: Optional[str] = None,
296
+ model_id: Optional[str] = None,
297
+ filter_type: Optional[EvalFilterType] = None,
298
+ eval_type: Optional[List[EvalType]] = None,
299
+ deserialize: Optional[bool] = True,
300
+ ) -> Union[List[EvalRunRecord], Tuple[List[Dict[str, Any]], int]]:
301
+ raise NotImplementedError
302
+
303
+ @abstractmethod
304
+ def rename_eval_run(
305
+ self, eval_run_id: str, name: str, deserialize: Optional[bool] = True
306
+ ) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
307
+ raise NotImplementedError
308
+
309
+ # --- Traces ---
310
+ @abstractmethod
311
+ def upsert_trace(self, trace: "Trace") -> None:
312
+ """Create or update a single trace record in the database.
313
+
314
+ Args:
315
+ trace: The Trace object to store (one per trace_id).
316
+ """
317
+ raise NotImplementedError
318
+
319
+ @abstractmethod
320
+ def get_trace(
321
+ self,
322
+ trace_id: Optional[str] = None,
323
+ run_id: Optional[str] = None,
324
+ session_id: Optional[str] = None,
325
+ user_id: Optional[str] = None,
326
+ agent_id: Optional[str] = None,
327
+ ):
328
+ """Get a single trace by trace_id or other filters.
329
+
330
+ Args:
331
+ trace_id: The unique trace identifier.
332
+ run_id: Filter by run ID (returns first match).
333
+ session_id: Filter by session ID (returns first match).
334
+ user_id: Filter by user ID (returns first match).
335
+ agent_id: Filter by agent ID (returns first match).
336
+
337
+ Returns:
338
+ Optional[Trace]: The trace if found, None otherwise.
339
+
340
+ Note:
341
+ If multiple filters are provided, trace_id takes precedence.
342
+ For other filters, the most recent trace is returned.
343
+ """
344
+ raise NotImplementedError
345
+
346
+ @abstractmethod
347
+ def get_traces(
348
+ self,
349
+ run_id: Optional[str] = None,
350
+ session_id: Optional[str] = None,
351
+ user_id: Optional[str] = None,
352
+ agent_id: Optional[str] = None,
353
+ team_id: Optional[str] = None,
354
+ workflow_id: Optional[str] = None,
355
+ status: Optional[str] = None,
356
+ start_time: Optional[datetime] = None,
357
+ end_time: Optional[datetime] = None,
358
+ limit: Optional[int] = 20,
359
+ page: Optional[int] = 1,
360
+ ) -> tuple[List, int]:
361
+ """Get traces matching the provided filters with pagination.
362
+
363
+ Args:
364
+ run_id: Filter by run ID.
365
+ session_id: Filter by session ID.
366
+ user_id: Filter by user ID.
367
+ agent_id: Filter by agent ID.
368
+ team_id: Filter by team ID.
369
+ workflow_id: Filter by workflow ID.
370
+ status: Filter by status (OK, ERROR).
371
+ start_time: Filter traces starting after this datetime.
372
+ end_time: Filter traces ending before this datetime.
373
+ limit: Maximum number of traces to return per page.
374
+ page: Page number (1-indexed).
375
+
376
+ Returns:
377
+ tuple[List[Trace], int]: Tuple of (list of matching traces with datetime fields, total count).
378
+ """
379
+ raise NotImplementedError
380
+
381
+ @abstractmethod
382
+ def get_trace_stats(
383
+ self,
384
+ user_id: Optional[str] = None,
385
+ agent_id: Optional[str] = None,
386
+ team_id: Optional[str] = None,
387
+ workflow_id: Optional[str] = None,
388
+ start_time: Optional[datetime] = None,
389
+ end_time: Optional[datetime] = None,
390
+ limit: Optional[int] = 20,
391
+ page: Optional[int] = 1,
392
+ ) -> tuple[List[Dict[str, Any]], int]:
393
+ """Get trace statistics grouped by session.
394
+
395
+ Args:
396
+ user_id: Filter by user ID.
397
+ agent_id: Filter by agent ID.
398
+ team_id: Filter by team ID.
399
+ workflow_id: Filter by workflow ID.
400
+ start_time: Filter sessions with traces created after this datetime.
401
+ end_time: Filter sessions with traces created before this datetime.
402
+ limit: Maximum number of sessions to return per page.
403
+ page: Page number (1-indexed).
404
+
405
+ Returns:
406
+ tuple[List[Dict], int]: Tuple of (list of session stats dicts, total count).
407
+ Each dict contains: session_id, user_id, agent_id, team_id, total_traces,
408
+ first_trace_at (datetime), last_trace_at (datetime).
409
+ """
410
+ raise NotImplementedError
411
+
412
+ # --- Spans ---
413
+ @abstractmethod
414
+ def create_span(self, span: "Span") -> None:
415
+ """Create a single span in the database.
416
+
417
+ Args:
418
+ span: The Span object to store.
419
+ """
420
+ raise NotImplementedError
421
+
422
+ @abstractmethod
423
+ def create_spans(self, spans: List) -> None:
424
+ """Create multiple spans in the database as a batch.
425
+
426
+ Args:
427
+ spans: List of Span objects to store.
428
+ """
429
+ raise NotImplementedError
430
+
431
+ @abstractmethod
432
+ def get_span(self, span_id: str):
433
+ """Get a single span by its span_id.
434
+
435
+ Args:
436
+ span_id: The unique span identifier.
437
+
438
+ Returns:
439
+ Optional[Span]: The span if found, None otherwise.
440
+ """
441
+ raise NotImplementedError
442
+
443
+ @abstractmethod
444
+ def get_spans(
445
+ self,
446
+ trace_id: Optional[str] = None,
447
+ parent_span_id: Optional[str] = None,
448
+ limit: Optional[int] = 1000,
449
+ ) -> List:
450
+ """Get spans matching the provided filters.
451
+
452
+ Args:
453
+ trace_id: Filter by trace ID.
454
+ parent_span_id: Filter by parent span ID.
455
+ limit: Maximum number of spans to return.
456
+
457
+ Returns:
458
+ List[Span]: List of matching spans.
459
+ """
460
+ raise NotImplementedError
461
+
462
+ # --- Cultural Knowledge ---
463
+ @abstractmethod
464
+ def clear_cultural_knowledge(self) -> None:
465
+ raise NotImplementedError
466
+
467
+ @abstractmethod
468
+ def delete_cultural_knowledge(self, id: str) -> None:
469
+ raise NotImplementedError
470
+
471
+ @abstractmethod
472
+ def get_cultural_knowledge(self, id: str) -> Optional[CulturalKnowledge]:
473
+ raise NotImplementedError
474
+
475
+ @abstractmethod
476
+ def get_all_cultural_knowledge(
477
+ self,
478
+ name: Optional[str] = None,
479
+ limit: Optional[int] = None,
480
+ page: Optional[int] = None,
481
+ sort_by: Optional[str] = None,
482
+ sort_order: Optional[str] = None,
483
+ agent_id: Optional[str] = None,
484
+ team_id: Optional[str] = None,
485
+ ) -> Optional[List[CulturalKnowledge]]:
486
+ raise NotImplementedError
487
+
488
+ @abstractmethod
489
+ def upsert_cultural_knowledge(self, cultural_knowledge: CulturalKnowledge) -> Optional[CulturalKnowledge]:
490
+ raise NotImplementedError
491
+
492
+
493
+ class AsyncBaseDb(ABC):
494
+ """Base abstract class for all our async database implementations."""
495
+
496
+ def __init__(
497
+ self,
498
+ id: Optional[str] = None,
499
+ session_table: Optional[str] = None,
500
+ memory_table: Optional[str] = None,
501
+ metrics_table: Optional[str] = None,
502
+ eval_table: Optional[str] = None,
503
+ knowledge_table: Optional[str] = None,
504
+ traces_table: Optional[str] = None,
505
+ spans_table: Optional[str] = None,
506
+ culture_table: Optional[str] = None,
507
+ versions_table: Optional[str] = None,
508
+ ):
509
+ self.id = id or str(uuid4())
510
+ self.session_table_name = session_table or "agno_sessions"
511
+ self.memory_table_name = memory_table or "agno_memories"
512
+ self.metrics_table_name = metrics_table or "agno_metrics"
513
+ self.eval_table_name = eval_table or "agno_eval_runs"
514
+ self.knowledge_table_name = knowledge_table or "agno_knowledge"
515
+ self.trace_table_name = traces_table or "agno_traces"
516
+ self.span_table_name = spans_table or "agno_spans"
517
+ self.culture_table_name = culture_table or "agno_culture"
518
+ self.versions_table_name = versions_table or "agno_schema_versions"
519
+
520
+ @abstractmethod
521
+ async def table_exists(self, table_name: str) -> bool:
522
+ """Check if a table with the given name exists in this database.
523
+
524
+ Default implementation returns True if the table name is configured.
525
+ Subclasses should override this to perform actual existence checks.
526
+
527
+ Args:
528
+ table_name: Name of the table to check
529
+
530
+ Returns:
531
+ bool: True if the table exists, False otherwise
532
+ """
533
+ raise NotImplementedError
534
+
535
+ @abstractmethod
536
+ async def get_latest_schema_version(self, table_name: str) -> str:
537
+ raise NotImplementedError
538
+
539
+ @abstractmethod
540
+ async def upsert_schema_version(self, table_name: str, version: str):
541
+ """Upsert the schema version into the database."""
542
+ raise NotImplementedError
543
+
544
+ # --- Sessions ---
545
+ @abstractmethod
546
+ async def delete_session(self, session_id: str) -> bool:
547
+ raise NotImplementedError
548
+
549
+ @abstractmethod
550
+ async def delete_sessions(self, session_ids: List[str]) -> None:
551
+ raise NotImplementedError
552
+
553
+ @abstractmethod
554
+ async def get_session(
555
+ self,
556
+ session_id: str,
557
+ session_type: SessionType,
558
+ user_id: Optional[str] = None,
559
+ deserialize: Optional[bool] = True,
560
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
561
+ raise NotImplementedError
562
+
563
+ @abstractmethod
564
+ async def get_sessions(
565
+ self,
566
+ session_type: Optional[SessionType] = None,
567
+ user_id: Optional[str] = None,
568
+ component_id: Optional[str] = None,
569
+ session_name: Optional[str] = None,
570
+ start_timestamp: Optional[int] = None,
571
+ end_timestamp: Optional[int] = None,
572
+ limit: Optional[int] = None,
573
+ page: Optional[int] = None,
574
+ sort_by: Optional[str] = None,
575
+ sort_order: Optional[str] = None,
576
+ deserialize: Optional[bool] = True,
577
+ ) -> Union[List[Session], Tuple[List[Dict[str, Any]], int]]:
578
+ raise NotImplementedError
579
+
580
+ @abstractmethod
581
+ async def rename_session(
582
+ self,
583
+ session_id: str,
584
+ session_type: SessionType,
585
+ session_name: str,
586
+ deserialize: Optional[bool] = True,
587
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
588
+ raise NotImplementedError
589
+
590
+ @abstractmethod
591
+ async def upsert_session(
592
+ self, session: Session, deserialize: Optional[bool] = True
593
+ ) -> Optional[Union[Session, Dict[str, Any]]]:
594
+ raise NotImplementedError
595
+
596
+ # --- Memory ---
597
+ @abstractmethod
598
+ async def clear_memories(self) -> None:
599
+ raise NotImplementedError
600
+
601
+ @abstractmethod
602
+ async def delete_user_memory(self, memory_id: str, user_id: Optional[str] = None) -> None:
603
+ raise NotImplementedError
604
+
605
+ @abstractmethod
606
+ async def delete_user_memories(self, memory_ids: List[str], user_id: Optional[str] = None) -> None:
607
+ raise NotImplementedError
608
+
609
+ @abstractmethod
610
+ async def get_all_memory_topics(self, user_id: Optional[str] = None) -> List[str]:
611
+ raise NotImplementedError
612
+
613
+ @abstractmethod
614
+ async def get_user_memory(
615
+ self,
616
+ memory_id: str,
617
+ deserialize: Optional[bool] = True,
618
+ user_id: Optional[str] = None,
619
+ ) -> Optional[Union[UserMemory, Dict[str, Any]]]:
620
+ raise NotImplementedError
621
+
622
+ @abstractmethod
623
+ async def get_user_memories(
624
+ self,
625
+ user_id: Optional[str] = None,
626
+ agent_id: Optional[str] = None,
627
+ team_id: Optional[str] = None,
628
+ topics: Optional[List[str]] = None,
629
+ search_content: Optional[str] = None,
630
+ limit: Optional[int] = None,
631
+ page: Optional[int] = None,
632
+ sort_by: Optional[str] = None,
633
+ sort_order: Optional[str] = None,
634
+ deserialize: Optional[bool] = True,
635
+ ) -> Union[List[UserMemory], Tuple[List[Dict[str, Any]], int]]:
636
+ raise NotImplementedError
637
+
638
+ @abstractmethod
639
+ async def get_user_memory_stats(
640
+ self,
641
+ limit: Optional[int] = None,
642
+ page: Optional[int] = None,
643
+ user_id: Optional[str] = None,
644
+ ) -> Tuple[List[Dict[str, Any]], int]:
645
+ raise NotImplementedError
646
+
647
+ @abstractmethod
648
+ async def upsert_user_memory(
649
+ self, memory: UserMemory, deserialize: Optional[bool] = True
650
+ ) -> Optional[Union[UserMemory, Dict[str, Any]]]:
651
+ raise NotImplementedError
652
+
653
+ # --- Metrics ---
654
+ @abstractmethod
655
+ async def get_metrics(
656
+ self, starting_date: Optional[date] = None, ending_date: Optional[date] = None
657
+ ) -> Tuple[List[Dict[str, Any]], Optional[int]]:
658
+ raise NotImplementedError
659
+
660
+ @abstractmethod
661
+ async def calculate_metrics(self) -> Optional[Any]:
662
+ raise NotImplementedError
663
+
664
+ # --- Knowledge ---
665
+ @abstractmethod
666
+ async def delete_knowledge_content(self, id: str):
667
+ """Delete a knowledge row from the database.
668
+
669
+ Args:
670
+ id (str): The ID of the knowledge row to delete.
671
+ """
672
+ raise NotImplementedError
673
+
674
+ @abstractmethod
675
+ async def get_knowledge_content(self, id: str) -> Optional[KnowledgeRow]:
676
+ """Get a knowledge row from the database.
677
+
678
+ Args:
679
+ id (str): The ID of the knowledge row to get.
680
+
681
+ Returns:
682
+ Optional[KnowledgeRow]: The knowledge row, or None if it doesn't exist.
683
+ """
684
+ raise NotImplementedError
685
+
686
+ @abstractmethod
687
+ async def get_knowledge_contents(
688
+ self,
689
+ limit: Optional[int] = None,
690
+ page: Optional[int] = None,
691
+ sort_by: Optional[str] = None,
692
+ sort_order: Optional[str] = None,
693
+ ) -> Tuple[List[KnowledgeRow], int]:
694
+ """Get all knowledge contents from the database.
695
+
696
+ Args:
697
+ limit (Optional[int]): The maximum number of knowledge contents to return.
698
+ page (Optional[int]): The page number.
699
+ sort_by (Optional[str]): The column to sort by.
700
+ sort_order (Optional[str]): The order to sort by.
701
+
702
+ Returns:
703
+ Tuple[List[KnowledgeRow], int]: The knowledge contents and total count.
704
+
705
+ Raises:
706
+ Exception: If an error occurs during retrieval.
707
+ """
708
+ raise NotImplementedError
709
+
710
+ @abstractmethod
711
+ async def upsert_knowledge_content(self, knowledge_row: KnowledgeRow):
712
+ """Upsert knowledge content in the database.
713
+
714
+ Args:
715
+ knowledge_row (KnowledgeRow): The knowledge row to upsert.
716
+
717
+ Returns:
718
+ Optional[KnowledgeRow]: The upserted knowledge row, or None if the operation fails.
719
+ """
720
+ raise NotImplementedError
721
+
722
+ # --- Evals ---
723
+ @abstractmethod
724
+ async def create_eval_run(self, eval_run: EvalRunRecord) -> Optional[EvalRunRecord]:
725
+ raise NotImplementedError
726
+
727
+ @abstractmethod
728
+ async def delete_eval_runs(self, eval_run_ids: List[str]) -> None:
729
+ raise NotImplementedError
730
+
731
+ @abstractmethod
732
+ async def get_eval_run(
733
+ self, eval_run_id: str, deserialize: Optional[bool] = True
734
+ ) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
735
+ raise NotImplementedError
736
+
737
+ @abstractmethod
738
+ async def get_eval_runs(
739
+ self,
740
+ limit: Optional[int] = None,
741
+ page: Optional[int] = None,
742
+ sort_by: Optional[str] = None,
743
+ sort_order: Optional[str] = None,
744
+ agent_id: Optional[str] = None,
745
+ team_id: Optional[str] = None,
746
+ workflow_id: Optional[str] = None,
747
+ model_id: Optional[str] = None,
748
+ filter_type: Optional[EvalFilterType] = None,
749
+ eval_type: Optional[List[EvalType]] = None,
750
+ deserialize: Optional[bool] = True,
751
+ ) -> Union[List[EvalRunRecord], Tuple[List[Dict[str, Any]], int]]:
752
+ raise NotImplementedError
753
+
754
+ @abstractmethod
755
+ async def rename_eval_run(
756
+ self, eval_run_id: str, name: str, deserialize: Optional[bool] = True
757
+ ) -> Optional[Union[EvalRunRecord, Dict[str, Any]]]:
758
+ raise NotImplementedError
759
+
760
+ # --- Traces ---
761
+ @abstractmethod
762
+ async def upsert_trace(self, trace) -> None:
763
+ """Create or update a single trace record in the database.
764
+
765
+ Args:
766
+ trace: The Trace object to update (one per trace_id).
767
+ """
768
+ raise NotImplementedError
769
+
770
+ @abstractmethod
771
+ async def get_trace(
772
+ self,
773
+ trace_id: Optional[str] = None,
774
+ run_id: Optional[str] = None,
775
+ session_id: Optional[str] = None,
776
+ user_id: Optional[str] = None,
777
+ agent_id: Optional[str] = None,
778
+ ):
779
+ """Get a single trace by trace_id or other filters.
780
+
781
+ Args:
782
+ trace_id: The unique trace identifier.
783
+ run_id: Filter by run ID (returns first match).
784
+ session_id: Filter by session ID (returns first match).
785
+ user_id: Filter by user ID (returns first match).
786
+ agent_id: Filter by agent ID (returns first match).
787
+
788
+ Returns:
789
+ Optional[Trace]: The trace if found, None otherwise.
790
+
791
+ Note:
792
+ If multiple filters are provided, trace_id takes precedence.
793
+ For other filters, the most recent trace is returned.
794
+ """
795
+ raise NotImplementedError
796
+
797
+ @abstractmethod
798
+ async def get_traces(
799
+ self,
800
+ run_id: Optional[str] = None,
801
+ session_id: Optional[str] = None,
802
+ user_id: Optional[str] = None,
803
+ agent_id: Optional[str] = None,
804
+ team_id: Optional[str] = None,
805
+ workflow_id: Optional[str] = None,
806
+ status: Optional[str] = None,
807
+ start_time: Optional[datetime] = None,
808
+ end_time: Optional[datetime] = None,
809
+ limit: Optional[int] = 20,
810
+ page: Optional[int] = 1,
811
+ ) -> tuple[List, int]:
812
+ """Get traces matching the provided filters with pagination.
813
+
814
+ Args:
815
+ run_id: Filter by run ID.
816
+ session_id: Filter by session ID.
817
+ user_id: Filter by user ID.
818
+ agent_id: Filter by agent ID.
819
+ team_id: Filter by team ID.
820
+ workflow_id: Filter by workflow ID.
821
+ status: Filter by status (OK, ERROR).
822
+ start_time: Filter traces starting after this datetime.
823
+ end_time: Filter traces ending before this datetime.
824
+ limit: Maximum number of traces to return per page.
825
+ page: Page number (1-indexed).
826
+
827
+ Returns:
828
+ tuple[List[Trace], int]: Tuple of (list of matching traces with datetime fields, total count).
829
+ """
830
+ raise NotImplementedError
831
+
832
+ @abstractmethod
833
+ async def get_trace_stats(
834
+ self,
835
+ user_id: Optional[str] = None,
836
+ agent_id: Optional[str] = None,
837
+ team_id: Optional[str] = None,
838
+ workflow_id: Optional[str] = None,
839
+ start_time: Optional[datetime] = None,
840
+ end_time: Optional[datetime] = None,
841
+ limit: Optional[int] = 20,
842
+ page: Optional[int] = 1,
843
+ ) -> tuple[List[Dict[str, Any]], int]:
844
+ """Get trace statistics grouped by session.
845
+
846
+ Args:
847
+ user_id: Filter by user ID.
848
+ agent_id: Filter by agent ID.
849
+ team_id: Filter by team ID.
850
+ workflow_id: Filter by workflow ID.
851
+ start_time: Filter sessions with traces created after this datetime.
852
+ end_time: Filter sessions with traces created before this datetime.
853
+ limit: Maximum number of sessions to return per page.
854
+ page: Page number (1-indexed).
855
+
856
+ Returns:
857
+ tuple[List[Dict], int]: Tuple of (list of session stats dicts, total count).
858
+ Each dict contains: session_id, user_id, agent_id, team_id, total_traces,
859
+ first_trace_at (datetime), last_trace_at (datetime).
860
+ """
861
+ raise NotImplementedError
862
+
863
+ # --- Spans ---
864
+ @abstractmethod
865
+ async def create_span(self, span) -> None:
866
+ """Create a single span in the database.
867
+
868
+ Args:
869
+ span: The Span object to store.
870
+ """
871
+ raise NotImplementedError
872
+
873
+ @abstractmethod
874
+ async def create_spans(self, spans: List) -> None:
875
+ """Create multiple spans in the database as a batch.
876
+
877
+ Args:
878
+ spans: List of Span objects to store.
879
+ """
880
+ raise NotImplementedError
881
+
882
+ @abstractmethod
883
+ async def get_span(self, span_id: str):
884
+ """Get a single span by its span_id.
885
+
886
+ Args:
887
+ span_id: The unique span identifier.
888
+
889
+ Returns:
890
+ Optional[Span]: The span if found, None otherwise.
891
+ """
892
+ raise NotImplementedError
893
+
894
+ @abstractmethod
895
+ async def get_spans(
896
+ self,
897
+ trace_id: Optional[str] = None,
898
+ parent_span_id: Optional[str] = None,
899
+ limit: Optional[int] = 1000,
900
+ ) -> List:
901
+ """Get spans matching the provided filters.
902
+
903
+ Args:
904
+ trace_id: Filter by trace ID.
905
+ parent_span_id: Filter by parent span ID.
906
+ limit: Maximum number of spans to return.
907
+
908
+ Returns:
909
+ List[Span]: List of matching spans.
910
+ """
911
+ raise NotImplementedError
912
+
913
+ # --- Cultural Notions ---
914
+ @abstractmethod
915
+ async def clear_cultural_knowledge(self) -> None:
916
+ raise NotImplementedError
917
+
918
+ @abstractmethod
919
+ async def delete_cultural_knowledge(self, id: str) -> None:
920
+ raise NotImplementedError
921
+
922
+ @abstractmethod
923
+ async def get_cultural_knowledge(
924
+ self, id: str, deserialize: Optional[bool] = True
925
+ ) -> Optional[Union[CulturalKnowledge, Dict[str, Any]]]:
926
+ raise NotImplementedError
927
+
928
+ @abstractmethod
929
+ async def get_all_cultural_knowledge(
930
+ self,
931
+ agent_id: Optional[str] = None,
932
+ team_id: Optional[str] = None,
933
+ name: Optional[str] = None,
934
+ limit: Optional[int] = None,
935
+ page: Optional[int] = None,
936
+ sort_by: Optional[str] = None,
937
+ sort_order: Optional[str] = None,
938
+ deserialize: Optional[bool] = True,
939
+ ) -> Union[List[CulturalKnowledge], Tuple[List[Dict[str, Any]], int]]:
940
+ raise NotImplementedError
941
+
942
+ @abstractmethod
943
+ async def upsert_cultural_knowledge(
944
+ self, cultural_knowledge: CulturalKnowledge, deserialize: Optional[bool] = True
945
+ ) -> Optional[Union[CulturalKnowledge, Dict[str, Any]]]:
946
+ raise NotImplementedError