agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  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 +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  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 +54 -41
  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 +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
@@ -1,339 +0,0 @@
1
- import os
2
- from datetime import datetime, timezone
3
- from typing import Any, Dict, List, Optional
4
-
5
- from agno.memory.v2.db.base import MemoryDb
6
- from agno.memory.v2.db.schema import MemoryRow
7
- from agno.utils.log import log_debug, logger
8
-
9
- try:
10
- from google.api_core import exceptions as google_exceptions
11
- from google.cloud.firestore_v1 import (
12
- Client,
13
- CollectionReference,
14
- DocumentReference,
15
- Query,
16
- Transaction,
17
- transactional,
18
- )
19
- except ImportError:
20
- raise ImportError(
21
- "`google-cloud-firestore` not installed. Please install it using `pip install google-cloud-firestore`"
22
- )
23
-
24
-
25
- class FirestoreMemoryDb(MemoryDb):
26
- def __init__(
27
- self,
28
- collection_name: str = "memory",
29
- db_name: Optional[str] = "(default)",
30
- client: Optional[Client] = None,
31
- project_id: Optional[str] = None,
32
- ):
33
- """
34
- This class provides a memory store backed by a Firestore collection.
35
-
36
- Args:
37
- collection_name: The name of the collection to store memories
38
- db_name: Name of the Firestore database (Default is "(default)" for free tier)
39
- client: Optional existing Firestore client
40
- project_id: Optional name of the GCP project to use
41
- """
42
- self.collection_name = collection_name
43
- self.db_name = db_name
44
- self.project_id = project_id or os.getenv("GOOGLE_CLOUD_PROJECT")
45
-
46
- # Initialize Firestore client
47
- self._client = client
48
- if self._client is None:
49
- self._client = self._initialize_client()
50
-
51
- # Get root collection reference
52
- self.collection: CollectionReference = self._client.collection(self.collection_name)
53
-
54
- # Store user_id for delete operations due to the data structure
55
- self._user_id: Optional[str] = None
56
-
57
- log_debug(f"Created FirestoreMemoryDb with collection: '{self.collection_name}'")
58
-
59
- def _initialize_client(self) -> Client:
60
- """Initialize and return a Firestore client with proper error handling."""
61
- try:
62
- client = Client(database=self.db_name, project=self.project_id)
63
- # Test the connection by listing collections
64
- list(client.collections())
65
- log_debug(f"Firestore client initialized with database: '{self.db_name}'")
66
- return client
67
- except google_exceptions.Unauthenticated as e:
68
- logger.error(
69
- "Firestore authentication failed. Please ensure you have proper Google Cloud credentials set up."
70
- )
71
- logger.error("Run 'gcloud auth application-default login' or set GOOGLE_APPLICATION_CREDENTIALS")
72
- raise ImportError(
73
- "Failed to authenticate with Google Cloud. Please set up authentication:\n"
74
- "1. Run: gcloud auth application-default login\n"
75
- "2. Or set GOOGLE_APPLICATION_CREDENTIALS environment variable"
76
- ) from e
77
- except google_exceptions.PermissionDenied as e:
78
- logger.error(
79
- "Permission denied. Please ensure your service account has the necessary Firestore permissions."
80
- )
81
- raise ImportError(
82
- "Permission denied when accessing Firestore. Please ensure:\n"
83
- "1. Your service account has the 'Cloud Datastore User' role\n"
84
- "2. The Firestore API is enabled for your project"
85
- ) from e
86
- except google_exceptions.InvalidArgument as e:
87
- if "database" in str(e).lower():
88
- logger.error(f"Invalid database name '{self.db_name}'. Use '(default)' for the default database.")
89
- raise ImportError(
90
- f"Invalid database name '{self.db_name}'. For free tier, use '(default)' as the database name."
91
- ) from e
92
- else:
93
- logger.error(f"Invalid argument when initializing Firestore: {e}")
94
- raise
95
- except Exception as e:
96
- logger.error(f"Failed to initialize Firestore client: {e}")
97
- raise
98
-
99
- def get_user_collection(self, user_id: str) -> CollectionReference:
100
- """Get the user-specific collection for storing memories."""
101
- if self._client is None:
102
- raise RuntimeError("Firestore client is not initialized")
103
- return self._client.collection(f"{self.collection_name}/{user_id}/memories")
104
-
105
- def _delete_document(self, document: DocumentReference) -> None:
106
- """Recursively delete a document and all its subcollections."""
107
- log_debug(f"Deleting document: {document.path}")
108
- for collection in document.collections():
109
- self._delete_collection(collection)
110
- document.delete()
111
-
112
- def _delete_collection(self, collection: CollectionReference) -> None:
113
- """Recursively delete all documents in a collection."""
114
- for document in collection.list_documents():
115
- self._delete_document(document)
116
-
117
- def create(self) -> None:
118
- """
119
- Create the collection index.
120
- For Firestore using user/memory model, this is a no-op to avoid index creation.
121
- """
122
- try:
123
- # Test connection
124
- if self._client:
125
- list(self._client.collections())
126
- log_debug("Firestore connection successful")
127
- except Exception as e:
128
- logger.error(f"Could not connect to Firestore: {e}")
129
- raise
130
-
131
- def memory_exists(self, memory: MemoryRow) -> bool:
132
- """Check if a memory exists."""
133
- try:
134
- log_debug(f"Checking if memory exists: {memory.id}")
135
- # Save user_id for potential future operations
136
- self._user_id = memory.user_id
137
-
138
- # Check in the user-specific collection
139
- if memory.user_id is None:
140
- # Return False when no user_id is provided (internal Memory v2 operations)
141
- return False
142
-
143
- user_collection = self.get_user_collection(memory.user_id)
144
- doc = user_collection.document(memory.id).get()
145
- return doc.exists
146
- except Exception as e:
147
- logger.error(f"Error checking memory existence: {e}")
148
- return False
149
-
150
- def read_memories(
151
- self, user_id: Optional[str] = None, limit: Optional[int] = None, sort: Optional[str] = None
152
- ) -> List[MemoryRow]:
153
- """
154
- Read memories from the collection.
155
-
156
- Args:
157
- user_id: ID of the user to read
158
- limit: Maximum number of memories to read
159
- sort: Sort order ("asc" or "desc")
160
-
161
- Returns:
162
- List[MemoryRow]: List of memories
163
- """
164
- memories: List[MemoryRow] = []
165
-
166
- if user_id is None:
167
- return memories
168
-
169
- try:
170
- # Save user_id for potential future operations
171
- self._user_id = user_id
172
-
173
- # Get user-specific collection
174
- user_collection = self.get_user_collection(user_id)
175
-
176
- # Build query with ordering
177
- query = user_collection.order_by(
178
- "created_at",
179
- direction=(Query.ASCENDING if sort == "asc" else Query.DESCENDING),
180
- )
181
-
182
- # Apply limit if specified
183
- if limit is not None:
184
- query = query.limit(limit)
185
-
186
- # Execute query and build results
187
- for doc in query.stream():
188
- data = doc.to_dict()
189
- if data is None:
190
- continue
191
-
192
- # Get timestamps for last_updated
193
- updated_at = data.get("updated_at")
194
- created_at = data.get("created_at")
195
- last_updated = None
196
- if updated_at:
197
- last_updated = datetime.fromtimestamp(updated_at, tz=timezone.utc)
198
- elif created_at:
199
- last_updated = datetime.fromtimestamp(created_at, tz=timezone.utc)
200
-
201
- memories.append(
202
- MemoryRow(
203
- id=data.get("id"),
204
- user_id=data.get("user_id", user_id),
205
- memory=data.get("memory", {}),
206
- last_updated=last_updated,
207
- )
208
- )
209
-
210
- return memories
211
- except Exception as e:
212
- logger.error(f"Error reading memories: {e}")
213
- return []
214
-
215
- def upsert_memory(self, memory: MemoryRow) -> None:
216
- """
217
- Upsert a memory into the user-specific collection.
218
-
219
- Args:
220
- memory: MemoryRow to upsert
221
-
222
- Returns:
223
- None
224
- """
225
- try:
226
- log_debug(f"Upserting memory: {memory.id} for user: {memory.user_id}")
227
-
228
- # Save user_id for potential future operations
229
- self._user_id = memory.user_id
230
-
231
- # Prepare timestamp
232
- now = datetime.now(timezone.utc)
233
- timestamp = int(now.timestamp())
234
-
235
- # Get user-specific collection and document reference
236
- if memory.user_id is None:
237
- # Skip upsert when no user_id is provided (internal Memory v2 operations)
238
- return
239
-
240
- user_collection = self.get_user_collection(memory.user_id)
241
- doc_ref = user_collection.document(memory.id)
242
-
243
- # Prepare memory data with version for optimistic locking
244
- memory_dict = memory.model_dump()
245
- if "_version" not in memory_dict:
246
- memory_dict["_version"] = 1
247
- else:
248
- memory_dict["_version"] += 1
249
-
250
- # Build update data - include all fields
251
- update_data: Dict[str, Any] = {
252
- "id": memory.id,
253
- "user_id": memory.user_id,
254
- "memory": memory.memory,
255
- "updated_at": timestamp,
256
- "_version": memory_dict["_version"],
257
- }
258
-
259
- # Check if document exists to set created_at
260
- doc = doc_ref.get()
261
- if not doc.exists:
262
- update_data["created_at"] = timestamp
263
- else:
264
- # Preserve existing created_at
265
- existing_data = doc.to_dict()
266
- if existing_data and "created_at" in existing_data:
267
- update_data["created_at"] = existing_data["created_at"]
268
-
269
- # Use a transaction for atomic update
270
- if self._client is None:
271
- raise RuntimeError("Firestore client is not initialized")
272
-
273
- transaction = self._client.transaction()
274
-
275
- @transactional
276
- def update_in_transaction(transaction: Transaction) -> None:
277
- # Re-read within transaction to ensure consistency
278
- _ = doc_ref.get(transaction=transaction) # Read for consistency check
279
- transaction.set(doc_ref, update_data)
280
-
281
- # Execute the transaction
282
- update_in_transaction(transaction)
283
-
284
- except Exception as e:
285
- logger.error(f"Error upserting memory: {e}")
286
- raise
287
-
288
- def delete_memory(self, memory_id: str) -> None:
289
- """
290
- Delete a memory from the collection.
291
-
292
- Args:
293
- memory_id: ID of the memory to delete
294
- """
295
- try:
296
- log_debug(f"Deleting memory with id: {memory_id}")
297
-
298
- if self._user_id:
299
- user_collection = self.get_user_collection(self._user_id)
300
- user_collection.document(memory_id).delete()
301
- log_debug(f"Successfully deleted memory with id: {memory_id}")
302
- else:
303
- # Skip deletion when no user_id is available
304
- pass
305
-
306
- except Exception as e:
307
- logger.error(f"Error deleting memory: {e}")
308
- raise
309
-
310
- def clear(self) -> bool:
311
- """Clear all memories from the collection."""
312
- try:
313
- for doc in self.collection.list_documents():
314
- self._delete_document(doc)
315
- log_debug(f"Cleared all memories in collection: {self.collection_name}")
316
- return True
317
- except Exception as e:
318
- logger.error(f"Error clearing collection: {e}")
319
- return False
320
-
321
- def drop_table(self) -> None:
322
- """Drop the collection."""
323
- try:
324
- for doc in self.collection.list_documents():
325
- self._delete_document(doc)
326
- log_debug(f"Dropped collection: {self.collection_name}")
327
- except Exception as e:
328
- logger.error(f"Error dropping collection: {e}")
329
- raise
330
-
331
- def table_exists(self) -> bool:
332
- """Check if the collection exists."""
333
- try:
334
- # Try to stream one document to check if collection exists
335
- _ = list(self.collection.limit(1).stream())
336
- return True
337
- except Exception as e:
338
- logger.error(f"Error checking collection existence: {e}")
339
- return False
@@ -1,196 +0,0 @@
1
- from datetime import datetime, timezone
2
- from typing import Any, Dict, List, Optional
3
-
4
- try:
5
- from pymongo import MongoClient
6
- from pymongo.collection import Collection
7
- from pymongo.database import Database
8
- from pymongo.errors import PyMongoError
9
- except ImportError:
10
- raise ImportError("`pymongo` not installed. Please install it with `pip install pymongo`")
11
-
12
- from agno.memory.v2.db import MemoryDb
13
- from agno.memory.v2.db.schema import MemoryRow
14
- from agno.utils.log import log_debug, logger
15
-
16
-
17
- class MongoMemoryDb(MemoryDb):
18
- def __init__(
19
- self,
20
- collection_name: str = "memory",
21
- db_url: Optional[str] = None,
22
- db_name: str = "agno",
23
- client: Optional[MongoClient] = None,
24
- ):
25
- """
26
- This class provides a memory store backed by a MongoDB collection.
27
-
28
- Args:
29
- collection_name: The name of the collection to store memories
30
- db_url: MongoDB connection URL
31
- db_name: Name of the database
32
- client: Optional existing MongoDB client
33
- """
34
- self._client: Optional[MongoClient] = client
35
- if self._client is None and db_url is not None:
36
- self._client = MongoClient(db_url)
37
-
38
- if self._client is None:
39
- raise ValueError("Must provide either db_url or client")
40
-
41
- self.collection_name: str = collection_name
42
- self.db_name: str = db_name
43
- self.db: Database = self._client[self.db_name]
44
- self.collection: Collection = self.db[self.collection_name]
45
-
46
- def __dict__(self) -> Dict[str, Any]:
47
- return {
48
- "name": "MongoMemoryDb",
49
- "collection_name": self.collection_name,
50
- "db_name": self.db_name,
51
- }
52
-
53
- def create(self) -> None:
54
- """Create indexes for the collection"""
55
- try:
56
- # Create indexes
57
- self.collection.create_index("id", unique=True)
58
- self.collection.create_index("user_id")
59
- self.collection.create_index("created_at")
60
- except PyMongoError as e:
61
- logger.error(f"Error creating indexes for collection '{self.collection_name}': {e}")
62
- raise
63
-
64
- def memory_exists(self, memory: MemoryRow) -> bool:
65
- """Check if a memory exists
66
- Args:
67
- memory: MemoryRow to check
68
- Returns:
69
- bool: True if the memory exists, False otherwise
70
- """
71
- try:
72
- result = self.collection.find_one({"id": memory.id})
73
- return result is not None
74
- except PyMongoError as e:
75
- logger.error(f"Error checking memory existence: {e}")
76
- return False
77
-
78
- def read_memories(
79
- self, user_id: Optional[str] = None, limit: Optional[int] = None, sort: Optional[str] = None
80
- ) -> List[MemoryRow]:
81
- """Read memories from the collection
82
- Args:
83
- user_id: ID of the user to read
84
- limit: Maximum number of memories to read
85
- sort: Sort order ("asc" or "desc")
86
- Returns:
87
- List[MemoryRow]: List of memories
88
- """
89
- memories: List[MemoryRow] = []
90
- try:
91
- # Build query
92
- query = {}
93
- if user_id is not None:
94
- query["user_id"] = user_id
95
-
96
- # Build sort order
97
- sort_order = -1 if sort != "asc" else 1
98
- cursor = self.collection.find(query).sort("created_at", sort_order)
99
-
100
- if limit is not None:
101
- cursor = cursor.limit(limit)
102
-
103
- for doc in cursor:
104
- # Remove MongoDB _id before converting to MemoryRow
105
- doc.pop("_id", None)
106
- memories.append(MemoryRow(user_id=doc["user_id"], memory=doc["memory"]))
107
- except PyMongoError as e:
108
- logger.error(f"Error reading memories: {e}")
109
- return memories
110
-
111
- def upsert_memory(self, memory: MemoryRow, create_and_retry: bool = True) -> None:
112
- """Upsert a memory into the collection
113
- Args:
114
- memory: MemoryRow to upsert
115
- create_and_retry: Whether to create a new memory if the id already exists
116
- Returns:
117
- None
118
- """
119
- try:
120
- now = datetime.now(timezone.utc)
121
- timestamp = int(now.timestamp())
122
-
123
- # Add version field for optimistic locking
124
- memory_dict = memory.model_dump()
125
- if "_version" not in memory_dict:
126
- memory_dict["_version"] = 1
127
- else:
128
- memory_dict["_version"] += 1
129
-
130
- update_data = {
131
- "user_id": memory.user_id,
132
- "memory": memory.memory,
133
- "updated_at": timestamp,
134
- "_version": memory_dict["_version"],
135
- }
136
-
137
- # For new documents, set created_at
138
- query = {"id": memory.id}
139
- doc = self.collection.find_one(query)
140
- if not doc:
141
- update_data["created_at"] = timestamp
142
-
143
- result = self.collection.update_one(query, {"$set": update_data}, upsert=True)
144
-
145
- if not result.acknowledged:
146
- logger.error("Memory upsert not acknowledged")
147
-
148
- except PyMongoError as e:
149
- logger.error(f"Error upserting memory: {e}")
150
- raise
151
-
152
- def delete_memory(self, memory_id: str) -> None:
153
- """Delete a memory from the collection
154
- Args:
155
- id: ID of the memory to delete
156
- Returns:
157
- None
158
- """
159
- try:
160
- result = self.collection.delete_one({"id": memory_id})
161
- if result.deleted_count == 0:
162
- log_debug(f"No memory found with id: {memory_id}")
163
- else:
164
- log_debug(f"Successfully deleted memory with id: {memory_id}")
165
- except PyMongoError as e:
166
- logger.error(f"Error deleting memory: {e}")
167
- raise
168
-
169
- def drop_table(self) -> None:
170
- """Drop the collection
171
- Returns:
172
- None
173
- """
174
- try:
175
- self.collection.drop()
176
- except PyMongoError as e:
177
- logger.error(f"Error dropping collection: {e}")
178
-
179
- def table_exists(self) -> bool:
180
- """Check if the collection exists
181
- Returns:
182
- bool: True if the collection exists, False otherwise
183
- """
184
- return self.collection_name in self.db.list_collection_names()
185
-
186
- def clear(self) -> bool:
187
- """Clear the collection
188
- Returns:
189
- bool: True if the collection was cleared, False otherwise
190
- """
191
- try:
192
- result = self.collection.delete_many({})
193
- return result.acknowledged
194
- except PyMongoError as e:
195
- logger.error(f"Error clearing collection: {e}")
196
- return False