agno 1.8.1__py3-none-any.whl → 2.0.0__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  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/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,109 @@
1
+ """Table schemas and related utils used by the RedisDb class"""
2
+
3
+ from typing import Any
4
+
5
+ SESSION_SCHEMA = {
6
+ "session_id": {"type": "string", "primary_key": True},
7
+ "session_type": {"type": "string"},
8
+ "agent_id": {"type": "string"},
9
+ "team_id": {"type": "string"},
10
+ "workflow_id": {"type": "string"},
11
+ "user_id": {"type": "string"},
12
+ "session_data": {"type": "json"},
13
+ "agent_data": {"type": "json"},
14
+ "team_data": {"type": "json"},
15
+ "workflow_data": {"type": "json"},
16
+ "metadata": {"type": "json"},
17
+ "runs": {"type": "json"},
18
+ "summary": {"type": "json"},
19
+ "created_at": {"type": "integer"},
20
+ "updated_at": {"type": "integer"},
21
+ }
22
+
23
+ USER_MEMORY_SCHEMA = {
24
+ "memory_id": {"type": "string", "primary_key": True},
25
+ "memory": {"type": "json"},
26
+ "agent_id": {"type": "string"},
27
+ "team_id": {"type": "string"},
28
+ "user_id": {"type": "string"},
29
+ "topics": {"type": "json"},
30
+ "updated_at": {"type": "integer"},
31
+ }
32
+
33
+ METRICS_SCHEMA = {
34
+ "id": {"type": "string", "primary_key": True},
35
+ "agent_runs_count": {"type": "integer", "default": 0},
36
+ "team_runs_count": {"type": "integer", "default": 0},
37
+ "workflow_runs_count": {"type": "integer", "default": 0},
38
+ "agent_sessions_count": {"type": "integer", "default": 0},
39
+ "team_sessions_count": {"type": "integer", "default": 0},
40
+ "workflow_sessions_count": {"type": "integer", "default": 0},
41
+ "users_count": {"type": "integer", "default": 0},
42
+ "token_metrics": {"type": "json", "default": {}},
43
+ "model_metrics": {"type": "json", "default": {}},
44
+ "date": {"type": "date"},
45
+ "aggregation_period": {"type": "string"},
46
+ "created_at": {"type": "integer"},
47
+ "updated_at": {"type": "integer"},
48
+ "completed": {"type": "boolean", "default": False},
49
+ }
50
+
51
+ EVAL_SCHEMA = {
52
+ "run_id": {"type": "string", "primary_key": True},
53
+ "eval_type": {"type": "string"},
54
+ "eval_data": {"type": "json"},
55
+ "eval_input": {"type": "json"},
56
+ "name": {"type": "string"},
57
+ "agent_id": {"type": "string"},
58
+ "team_id": {"type": "string"},
59
+ "workflow_id": {"type": "string"},
60
+ "model_id": {"type": "string"},
61
+ "model_provider": {"type": "string"},
62
+ "evaluated_component_name": {"type": "string"},
63
+ "created_at": {"type": "integer"},
64
+ "updated_at": {"type": "integer"},
65
+ }
66
+
67
+ KNOWLEDGE_SCHEMA = {
68
+ "id": {"type": "string", "primary_key": True},
69
+ "name": {"type": "string"},
70
+ "description": {"type": "string"},
71
+ "metadata": {"type": "json"},
72
+ "type": {"type": "string"},
73
+ "size": {"type": "integer"},
74
+ "linked_to": {"type": "string"},
75
+ "access_count": {"type": "integer"},
76
+ "created_at": {"type": "integer"},
77
+ "updated_at": {"type": "integer"},
78
+ "status": {"type": "string"},
79
+ "status_message": {"type": "string"},
80
+ "external_id": {"type": "string"},
81
+ }
82
+
83
+
84
+ def get_table_schema_definition(table_type: str) -> dict[str, Any]:
85
+ """
86
+ Get the expected schema definition for the given table.
87
+
88
+ For Redis, we don't need actual schemas since it's a key-value store,
89
+ but we maintain this for compatibility with the base interface.
90
+
91
+ Args:
92
+ table_type (str): The type of table to get the schema for.
93
+
94
+ Returns:
95
+ Dict[str, Any]: Dictionary containing schema information for the table
96
+ """
97
+ schemas = {
98
+ "sessions": SESSION_SCHEMA,
99
+ "memories": USER_MEMORY_SCHEMA,
100
+ "metrics": METRICS_SCHEMA,
101
+ "evals": EVAL_SCHEMA,
102
+ "knowledge": KNOWLEDGE_SCHEMA,
103
+ }
104
+
105
+ schema = schemas.get(table_type, {})
106
+ if not schema:
107
+ raise ValueError(f"Unknown table type: {table_type}")
108
+
109
+ return schema
agno/db/redis/utils.py ADDED
@@ -0,0 +1,288 @@
1
+ """Utility functions for the Redis database class."""
2
+
3
+ import json
4
+ import time
5
+ from datetime import date, datetime, timedelta, timezone
6
+ from typing import Any, Dict, List, Optional
7
+ from uuid import UUID
8
+
9
+ from agno.utils.log import log_warning
10
+
11
+ try:
12
+ from redis import Redis
13
+ except ImportError:
14
+ raise ImportError("`redis` not installed. Please install it using `pip install redis`")
15
+
16
+
17
+ # -- Serialization and deserialization --
18
+
19
+
20
+ class CustomEncoder(json.JSONEncoder):
21
+ """Custom encoder to handle non JSON serializable types."""
22
+
23
+ def default(self, obj):
24
+ if isinstance(obj, UUID):
25
+ return str(obj)
26
+ elif isinstance(obj, (date, datetime)):
27
+ return obj.isoformat()
28
+
29
+ return super().default(obj)
30
+
31
+
32
+ def serialize_data(data: dict) -> str:
33
+ return json.dumps(data, ensure_ascii=False, cls=CustomEncoder)
34
+
35
+
36
+ def deserialize_data(data: str) -> dict:
37
+ return json.loads(data)
38
+
39
+
40
+ # -- Redis utils --
41
+
42
+
43
+ def generate_redis_key(prefix: str, table_type: str, key_id: str) -> str:
44
+ """Generate Redis key with proper namespacing."""
45
+ return f"{prefix}:{table_type}:{key_id}"
46
+
47
+
48
+ def generate_index_key(prefix: str, table_type: str, index_field: str, index_value: str) -> str:
49
+ """Generate Redis key for index entries."""
50
+ return f"{prefix}:{table_type}:index:{index_field}:{index_value}"
51
+
52
+
53
+ def get_all_keys_for_table(redis_client: Redis, prefix: str, table_type: str) -> List[str]:
54
+ """Get all relevant keys for the given table type.
55
+
56
+ Args:
57
+ redis_client (Redis): The Redis client.
58
+ prefix (str): The prefix for the keys.
59
+ table_type (str): The table type.
60
+
61
+ Returns:
62
+ List[str]: A list of all relevant keys for the given table type.
63
+ """
64
+ pattern = f"{prefix}:{table_type}:*"
65
+ all_keys = redis_client.scan_iter(match=pattern)
66
+ relevant_keys = []
67
+
68
+ for key in all_keys:
69
+ if ":index:" in key: # Skip index keys
70
+ continue
71
+ relevant_keys.append(key)
72
+
73
+ return relevant_keys
74
+
75
+
76
+ # -- DB util methods --
77
+
78
+
79
+ def apply_sorting(
80
+ records: List[Dict[str, Any]], sort_by: Optional[str] = None, sort_order: Optional[str] = None
81
+ ) -> List[Dict[str, Any]]:
82
+ if sort_by is None:
83
+ return records
84
+
85
+ def get_sort_key(record):
86
+ value = record.get(sort_by, 0)
87
+ if value is None:
88
+ return 0 if isinstance(records[0].get(sort_by, 0), (int, float)) else ""
89
+ return value
90
+
91
+ try:
92
+ is_reverse = sort_order == "desc"
93
+ return sorted(records, key=get_sort_key, reverse=is_reverse)
94
+
95
+ except Exception as e:
96
+ log_warning(f"Error sorting Redisrecords: {e}")
97
+ return records
98
+
99
+
100
+ def apply_pagination(
101
+ records: List[Dict[str, Any]], limit: Optional[int] = None, page: Optional[int] = None
102
+ ) -> List[Dict[str, Any]]:
103
+ if limit is None:
104
+ return records
105
+
106
+ if page is not None and page > 0:
107
+ start_idx = (page - 1) * limit
108
+ end_idx = start_idx + limit
109
+ return records[start_idx:end_idx]
110
+
111
+ return records[:limit]
112
+
113
+
114
+ def apply_filters(records: List[Dict[str, Any]], conditions: Dict[str, Any]) -> List[Dict[str, Any]]:
115
+ if not conditions:
116
+ return records
117
+
118
+ filtered_records = []
119
+ for record in records:
120
+ match = True
121
+ for key, value in conditions.items():
122
+ if key not in record or record[key] != value:
123
+ match = False
124
+ break
125
+ if match:
126
+ filtered_records.append(record)
127
+
128
+ return filtered_records
129
+
130
+
131
+ def create_index_entries(
132
+ redis_client: Redis,
133
+ prefix: str,
134
+ table_type: str,
135
+ record_id: str,
136
+ record_data: Dict[str, Any],
137
+ index_fields: List[str],
138
+ ) -> None:
139
+ for field in index_fields:
140
+ if field in record_data and record_data[field] is not None:
141
+ index_key = generate_index_key(prefix, table_type, field, str(record_data[field]))
142
+ redis_client.sadd(index_key, record_id)
143
+
144
+
145
+ def remove_index_entries(
146
+ redis_client: Redis,
147
+ prefix: str,
148
+ table_type: str,
149
+ record_id: str,
150
+ record_data: Dict[str, Any],
151
+ index_fields: List[str],
152
+ ) -> None:
153
+ for field in index_fields:
154
+ if field in record_data and record_data[field] is not None:
155
+ index_key = generate_index_key(prefix, table_type, field, str(record_data[field]))
156
+ redis_client.srem(index_key, record_id)
157
+
158
+
159
+ # -- Metrics utils --
160
+
161
+
162
+ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
163
+ """Calculate metrics for the given date.
164
+
165
+ Args:
166
+ date_to_process (date): The date to calculate metrics for.
167
+ sessions_data (dict): The sessions data.
168
+
169
+ Returns:
170
+ dict: A dictionary with the calculated metrics.
171
+ """
172
+ metrics = {
173
+ "users_count": 0,
174
+ "agent_sessions_count": 0,
175
+ "team_sessions_count": 0,
176
+ "workflow_sessions_count": 0,
177
+ "agent_runs_count": 0,
178
+ "team_runs_count": 0,
179
+ "workflow_runs_count": 0,
180
+ }
181
+ token_metrics = {
182
+ "input_tokens": 0,
183
+ "output_tokens": 0,
184
+ "total_tokens": 0,
185
+ "audio_total_tokens": 0,
186
+ "audio_input_tokens": 0,
187
+ "audio_output_tokens": 0,
188
+ "cache_read_tokens": 0,
189
+ "cache_write_tokens": 0,
190
+ "reasoning_tokens": 0,
191
+ }
192
+ model_counts: Dict[str, int] = {}
193
+
194
+ session_types = [
195
+ ("agent", "agent_sessions_count", "agent_runs_count"),
196
+ ("team", "team_sessions_count", "team_runs_count"),
197
+ ("workflow", "workflow_sessions_count", "workflow_runs_count"),
198
+ ]
199
+ all_user_ids = set()
200
+
201
+ for session_type, sessions_count_key, runs_count_key in session_types:
202
+ sessions = sessions_data.get(session_type, [])
203
+ metrics[sessions_count_key] = len(sessions)
204
+
205
+ for session in sessions:
206
+ if session.get("user_id"):
207
+ all_user_ids.add(session["user_id"])
208
+ metrics[runs_count_key] += len(session.get("runs", []))
209
+ if runs := session.get("runs", []):
210
+ for run in runs:
211
+ if model_id := run.get("model"):
212
+ model_provider = run.get("model_provider", "")
213
+ model_counts[f"{model_id}:{model_provider}"] = (
214
+ model_counts.get(f"{model_id}:{model_provider}", 0) + 1
215
+ )
216
+
217
+ session_metrics = session.get("session_data", {}).get("session_metrics", {})
218
+ for field in token_metrics:
219
+ token_metrics[field] += session_metrics.get(field, 0)
220
+
221
+ model_metrics = []
222
+ for model, count in model_counts.items():
223
+ model_id, model_provider = model.split(":")
224
+ model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
225
+
226
+ metrics["users_count"] = len(all_user_ids)
227
+ current_time = int(time.time())
228
+
229
+ # Create a deterministic ID based on date and aggregation period. This simplifies avoiding duplicates
230
+ metric_id = f"{date_to_process.isoformat()}_daily"
231
+
232
+ return {
233
+ "id": metric_id,
234
+ "date": date_to_process,
235
+ "completed": date_to_process < datetime.now(timezone.utc).date(),
236
+ "token_metrics": token_metrics,
237
+ "model_metrics": model_metrics,
238
+ "created_at": current_time,
239
+ "updated_at": current_time,
240
+ "aggregation_period": "daily",
241
+ **metrics,
242
+ }
243
+
244
+
245
+ def fetch_all_sessions_data(
246
+ sessions: List[Dict[str, Any]], dates_to_process: list[date], start_timestamp: int
247
+ ) -> Optional[dict]:
248
+ """Return all session data for the given dates, for all session types.
249
+
250
+ Args:
251
+ sessions (List[Dict[str, Any]]): The sessions data.
252
+ dates_to_process (list[date]): The dates to process.
253
+ start_timestamp (int): The start timestamp.
254
+
255
+ Returns:
256
+ Optional[dict]: A dictionary with the session data for the given dates, for all session types.
257
+ """
258
+ if not dates_to_process:
259
+ return None
260
+
261
+ all_sessions_data: Dict[str, Dict[str, List[Dict[str, Any]]]] = {
262
+ date_to_process.isoformat(): {"agent": [], "team": [], "workflow": []} for date_to_process in dates_to_process
263
+ }
264
+
265
+ for session in sessions:
266
+ session_date = (
267
+ datetime.fromtimestamp(session.get("created_at", start_timestamp), tz=timezone.utc).date().isoformat()
268
+ )
269
+ if session_date in all_sessions_data:
270
+ all_sessions_data[session_date][session["session_type"]].append(session)
271
+
272
+ return all_sessions_data
273
+
274
+
275
+ def get_dates_to_calculate_metrics_for(starting_date: date) -> list[date]:
276
+ """Return the list of dates to calculate metrics for.
277
+
278
+ Args:
279
+ starting_date (date): The starting date.
280
+
281
+ Returns:
282
+ list[date]: The list of dates to calculate metrics for.
283
+ """
284
+ today = datetime.now(timezone.utc).date()
285
+ days_diff = (today - starting_date).days + 1
286
+ if days_diff <= 0:
287
+ return []
288
+ return [starting_date + timedelta(days=x) for x in range(days_diff)]
@@ -0,0 +1,3 @@
1
+ from agno.db.schemas.memory import UserMemory
2
+
3
+ __all__ = ["UserMemory"]
@@ -0,0 +1,33 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, Optional
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ class EvalType(str, Enum):
8
+ ACCURACY = "accuracy"
9
+ PERFORMANCE = "performance"
10
+ RELIABILITY = "reliability"
11
+
12
+
13
+ class EvalFilterType(str, Enum):
14
+ AGENT = "agent"
15
+ TEAM = "team"
16
+ WORKFLOW = "workflow"
17
+
18
+
19
+ class EvalRunRecord(BaseModel):
20
+ """Evaluation run results stored in the database"""
21
+
22
+ agent_id: Optional[str] = None
23
+ model_id: Optional[str] = None
24
+ model_provider: Optional[str] = None
25
+ team_id: Optional[str] = None
26
+ workflow_id: Optional[str] = None
27
+ name: Optional[str] = None
28
+ evaluated_component_name: Optional[str] = None
29
+
30
+ run_id: str
31
+ eval_type: EvalType
32
+ eval_data: Dict[str, Any]
33
+ eval_input: Optional[Dict[str, Any]] = None
@@ -0,0 +1,40 @@
1
+ from datetime import datetime
2
+ from typing import Any, Dict, Optional
3
+
4
+ from pydantic import BaseModel, ConfigDict, model_validator
5
+
6
+
7
+ class KnowledgeRow(BaseModel):
8
+ """Knowledge Row that is stored in the database"""
9
+
10
+ # id for this knowledge, auto-generated if not provided
11
+ id: Optional[str] = None
12
+ name: str
13
+ description: str
14
+ metadata: Optional[Dict[str, Any]] = None
15
+ type: Optional[str] = None
16
+ size: Optional[int] = None
17
+ linked_to: Optional[str] = None
18
+ access_count: Optional[int] = None
19
+ status: Optional[str] = None
20
+ status_message: Optional[str] = None
21
+ created_at: Optional[int] = None
22
+ updated_at: Optional[int] = None
23
+ external_id: Optional[str] = None
24
+
25
+ model_config = ConfigDict(from_attributes=True, arbitrary_types_allowed=True)
26
+
27
+ @model_validator(mode="after")
28
+ def generate_id(self) -> "KnowledgeRow":
29
+ if self.id is None:
30
+ from uuid import uuid4
31
+
32
+ self.id = str(uuid4())
33
+ return self
34
+
35
+ def to_dict(self) -> Dict[str, Any]:
36
+ _dict = self.model_dump(exclude={"updated_at"})
37
+
38
+ _dict["updated_at"] = datetime.fromtimestamp(self.updated_at).isoformat() if self.updated_at else None
39
+
40
+ return _dict
@@ -0,0 +1,46 @@
1
+ from dataclasses import dataclass
2
+ from datetime import datetime, timezone
3
+ from typing import Any, Dict, List, Optional
4
+
5
+
6
+ @dataclass
7
+ class UserMemory:
8
+ """Model for User Memories"""
9
+
10
+ memory: str
11
+ memory_id: Optional[str] = None
12
+ topics: Optional[List[str]] = None
13
+ user_id: Optional[str] = None
14
+ input: Optional[str] = None
15
+ updated_at: Optional[datetime] = None
16
+ feedback: Optional[str] = None
17
+
18
+ agent_id: Optional[str] = None
19
+ team_id: Optional[str] = None
20
+
21
+ def to_dict(self) -> Dict[str, Any]:
22
+ _dict = {
23
+ "memory_id": self.memory_id,
24
+ "memory": self.memory,
25
+ "topics": self.topics,
26
+ "updated_at": self.updated_at.isoformat() if self.updated_at else None,
27
+ "input": self.input,
28
+ "user_id": self.user_id,
29
+ "agent_id": self.agent_id,
30
+ "team_id": self.team_id,
31
+ "feedback": self.feedback,
32
+ }
33
+ return {k: v for k, v in _dict.items() if v is not None}
34
+
35
+ @classmethod
36
+ def from_dict(cls, data: Dict[str, Any]) -> "UserMemory":
37
+ data = dict(data)
38
+
39
+ # Convert updated_at to datetime
40
+ if updated_at := data.get("updated_at"):
41
+ if isinstance(updated_at, (int, float)):
42
+ data["updated_at"] = datetime.fromtimestamp(updated_at, tz=timezone.utc)
43
+ else:
44
+ data["updated_at"] = datetime.fromisoformat(updated_at)
45
+
46
+ return cls(**data)
@@ -0,0 +1,3 @@
1
+ from agno.db.singlestore.singlestore import SingleStoreDb
2
+
3
+ __all__ = ["SingleStoreDb"]
@@ -0,0 +1,116 @@
1
+ """Table schemas and related utils used by the SingleStoreDb class"""
2
+
3
+ from typing import Any
4
+
5
+ try:
6
+ from sqlalchemy.types import JSON, BigInteger, Boolean, Date, String, Text
7
+ except ImportError:
8
+ raise ImportError("`sqlalchemy` not installed. Please install it using `pip install sqlalchemy`")
9
+
10
+ SESSION_TABLE_SCHEMA = {
11
+ "session_id": {"type": lambda: String(128), "nullable": False},
12
+ "session_type": {"type": lambda: String(20), "nullable": False, "index": True},
13
+ "agent_id": {"type": lambda: String(128), "nullable": True},
14
+ "team_id": {"type": lambda: String(128), "nullable": True},
15
+ "workflow_id": {"type": lambda: String(128), "nullable": True},
16
+ "user_id": {"type": lambda: String(128), "nullable": True},
17
+ "session_data": {"type": JSON, "nullable": True},
18
+ "agent_data": {"type": JSON, "nullable": True},
19
+ "team_data": {"type": JSON, "nullable": True},
20
+ "workflow_data": {"type": JSON, "nullable": True},
21
+ "metadata": {"type": JSON, "nullable": True},
22
+ "runs": {"type": JSON, "nullable": True},
23
+ "summary": {"type": JSON, "nullable": True},
24
+ "created_at": {"type": BigInteger, "nullable": False, "index": True},
25
+ "updated_at": {"type": BigInteger, "nullable": True},
26
+ "_unique_constraints": [
27
+ {
28
+ "name": "uq_session_id",
29
+ "columns": ["session_id"],
30
+ },
31
+ ],
32
+ }
33
+
34
+ USER_MEMORY_TABLE_SCHEMA = {
35
+ "memory_id": {"type": lambda: String(128), "primary_key": True, "nullable": False},
36
+ "memory": {"type": JSON, "nullable": False},
37
+ "input": {"type": Text, "nullable": True},
38
+ "agent_id": {"type": lambda: String(128), "nullable": True},
39
+ "team_id": {"type": lambda: String(128), "nullable": True},
40
+ "user_id": {"type": lambda: String(128), "nullable": True, "index": True},
41
+ "topics": {"type": JSON, "nullable": True},
42
+ "updated_at": {"type": BigInteger, "nullable": True, "index": True},
43
+ }
44
+
45
+ EVAL_TABLE_SCHEMA = {
46
+ "run_id": {"type": lambda: String(128), "primary_key": True, "nullable": False},
47
+ "eval_type": {"type": lambda: String(50), "nullable": False},
48
+ "eval_data": {"type": JSON, "nullable": False},
49
+ "eval_input": {"type": JSON, "nullable": False},
50
+ "name": {"type": lambda: String(255), "nullable": True},
51
+ "agent_id": {"type": lambda: String(128), "nullable": True},
52
+ "team_id": {"type": lambda: String(128), "nullable": True},
53
+ "workflow_id": {"type": lambda: String(128), "nullable": True},
54
+ "model_id": {"type": lambda: String(128), "nullable": True},
55
+ "model_provider": {"type": lambda: String(50), "nullable": True},
56
+ "evaluated_component_name": {"type": lambda: String(255), "nullable": True},
57
+ "created_at": {"type": BigInteger, "nullable": False, "index": True},
58
+ "updated_at": {"type": BigInteger, "nullable": True},
59
+ }
60
+
61
+ KNOWLEDGE_TABLE_SCHEMA = {
62
+ "id": {"type": lambda: String(128), "primary_key": True, "nullable": False},
63
+ "name": {"type": lambda: String(255), "nullable": False},
64
+ "description": {"type": Text, "nullable": False},
65
+ "metadata": {"type": JSON, "nullable": True},
66
+ "type": {"type": lambda: String(50), "nullable": True},
67
+ "size": {"type": BigInteger, "nullable": True},
68
+ "linked_to": {"type": lambda: String(128), "nullable": True},
69
+ "access_count": {"type": BigInteger, "nullable": True},
70
+ "status": {"type": lambda: String(50), "nullable": True},
71
+ "status_message": {"type": Text, "nullable": True},
72
+ "created_at": {"type": BigInteger, "nullable": True},
73
+ "updated_at": {"type": BigInteger, "nullable": True},
74
+ "external_id": {"type": lambda: String(128), "nullable": True},
75
+ }
76
+
77
+ METRICS_TABLE_SCHEMA = {
78
+ "id": {"type": lambda: String(128), "primary_key": True, "nullable": False},
79
+ "agent_runs_count": {"type": BigInteger, "nullable": False, "default": 0},
80
+ "team_runs_count": {"type": BigInteger, "nullable": False, "default": 0},
81
+ "workflow_runs_count": {"type": BigInteger, "nullable": False, "default": 0},
82
+ "agent_sessions_count": {"type": BigInteger, "nullable": False, "default": 0},
83
+ "team_sessions_count": {"type": BigInteger, "nullable": False, "default": 0},
84
+ "workflow_sessions_count": {"type": BigInteger, "nullable": False, "default": 0},
85
+ "users_count": {"type": BigInteger, "nullable": False, "default": 0},
86
+ "token_metrics": {"type": JSON, "nullable": False, "default": {}},
87
+ "model_metrics": {"type": JSON, "nullable": False, "default": {}},
88
+ "date": {"type": Date, "nullable": False, "index": True},
89
+ "aggregation_period": {"type": lambda: String(20), "nullable": False, "index": True},
90
+ "created_at": {"type": BigInteger, "nullable": False},
91
+ "updated_at": {"type": BigInteger, "nullable": True},
92
+ "completed": {"type": Boolean, "nullable": False, "default": False},
93
+ }
94
+
95
+
96
+ def get_table_schema_definition(table_type: str) -> dict[str, Any]:
97
+ """
98
+ Get the expected schema definition for the given table.
99
+ Args:
100
+ table_type (str): The type of table to get the schema for.
101
+ Returns:
102
+ Dict[str, Any]: Dictionary containing column definitions for the table
103
+ """
104
+ schemas = {
105
+ "sessions": SESSION_TABLE_SCHEMA,
106
+ "evals": EVAL_TABLE_SCHEMA,
107
+ "metrics": METRICS_TABLE_SCHEMA,
108
+ "memories": USER_MEMORY_TABLE_SCHEMA,
109
+ "knowledge_contents": KNOWLEDGE_TABLE_SCHEMA,
110
+ }
111
+ schema = schemas.get(table_type, {})
112
+
113
+ if not schema:
114
+ raise ValueError(f"Unknown table type: {table_type}")
115
+
116
+ return schema # type: ignore[return-value]