agno 2.2.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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -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 +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -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 +1335 -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 +1160 -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 +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
agno/tools/mem0.py ADDED
@@ -0,0 +1,193 @@
1
+ import json
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional, Union
4
+
5
+ from agno.tools import Toolkit
6
+ from agno.utils.log import log_debug, log_error, log_warning
7
+
8
+ try:
9
+ from mem0.client.main import MemoryClient
10
+ from mem0.memory.main import Memory
11
+ except ImportError:
12
+ raise ImportError("`mem0ai` package not found. Please install it with `pip install mem0ai`")
13
+
14
+
15
+ class Mem0Tools(Toolkit):
16
+ def __init__(
17
+ self,
18
+ config: Optional[Dict[str, Any]] = None,
19
+ api_key: Optional[str] = None,
20
+ user_id: Optional[str] = None,
21
+ org_id: Optional[str] = None,
22
+ project_id: Optional[str] = None,
23
+ infer: bool = True,
24
+ enable_add_memory: bool = True,
25
+ enable_search_memory: bool = True,
26
+ enable_get_all_memories: bool = True,
27
+ enable_delete_all_memories: bool = True,
28
+ all: bool = False,
29
+ **kwargs,
30
+ ):
31
+ tools: List[Any] = []
32
+ if enable_add_memory or all:
33
+ tools.append(self.add_memory)
34
+ if enable_search_memory or all:
35
+ tools.append(self.search_memory)
36
+ if enable_get_all_memories or all:
37
+ tools.append(self.get_all_memories)
38
+ if enable_delete_all_memories or all:
39
+ tools.append(self.delete_all_memories)
40
+
41
+ super().__init__(name="mem0_tools", tools=tools, **kwargs)
42
+ self.api_key = api_key or getenv("MEM0_API_KEY")
43
+ self.user_id = user_id
44
+ self.org_id = org_id or getenv("MEM0_ORG_ID")
45
+ self.project_id = project_id or getenv("MEM0_PROJECT_ID")
46
+ self.client: Union[Memory, MemoryClient]
47
+ self.infer = infer
48
+
49
+ try:
50
+ if self.api_key:
51
+ log_debug("Using Mem0 Platform API key.")
52
+ client_kwargs = {"api_key": self.api_key}
53
+ if self.org_id:
54
+ client_kwargs["org_id"] = self.org_id
55
+ if self.project_id:
56
+ client_kwargs["project_id"] = self.project_id
57
+ self.client = MemoryClient(**client_kwargs)
58
+ elif config is not None:
59
+ log_debug("Using Mem0 with config.")
60
+ self.client = Memory.from_config(config)
61
+ else:
62
+ log_debug("Initializing Mem0 with default settings.")
63
+ self.client = Memory()
64
+ except Exception as e:
65
+ log_error(f"Failed to initialize Mem0 client: {e}")
66
+ raise ConnectionError("Failed to initialize Mem0 client. Ensure API keys/config are set.") from e
67
+
68
+ def _get_user_id(
69
+ self,
70
+ method_name: str,
71
+ session_state: Dict[str, Any],
72
+ ) -> str:
73
+ """Resolve the user ID"""
74
+ resolved_user_id = self.user_id
75
+ if not resolved_user_id:
76
+ try:
77
+ resolved_user_id = session_state.get("current_user_id")
78
+ except Exception:
79
+ pass
80
+ if not resolved_user_id:
81
+ error_msg = f"Error in {method_name}: A user_id must be provided in the method call."
82
+ log_error(error_msg)
83
+ return error_msg
84
+ return resolved_user_id
85
+
86
+ def add_memory(
87
+ self,
88
+ session_state,
89
+ content: Union[str, Dict[str, str]],
90
+ ) -> str:
91
+ """Add facts to the user's memory.
92
+ Args:
93
+ content(Union[str, Dict[str, str]]): The facts that should be stored.
94
+ Example:
95
+ content = "I live in NYC"
96
+ content = {"Name": "John", "Age": 30, "Location": "New York"}
97
+ Returns:
98
+ str: JSON-encoded Mem0 response or an error message.
99
+ """
100
+
101
+ resolved_user_id = self._get_user_id("add_memory", session_state=session_state)
102
+ if isinstance(resolved_user_id, str) and resolved_user_id.startswith("Error in add_memory:"):
103
+ return resolved_user_id
104
+ try:
105
+ if isinstance(content, dict):
106
+ log_debug("Wrapping dict message into content string")
107
+ content = json.dumps(content)
108
+ elif not isinstance(content, str):
109
+ content = str(content)
110
+ messages_list = [{"role": "user", "content": content}]
111
+
112
+ result = self.client.add(
113
+ messages_list,
114
+ user_id=resolved_user_id,
115
+ infer=self.infer,
116
+ )
117
+ return json.dumps(result)
118
+ except Exception as e:
119
+ log_error(f"Error adding memory: {e}")
120
+ return f"Error adding memory: {e}"
121
+
122
+ def search_memory(
123
+ self,
124
+ session_state: Dict[str, Any],
125
+ query: str,
126
+ ) -> str:
127
+ """Semantic search for *query* across the user's stored memories."""
128
+
129
+ resolved_user_id = self._get_user_id("search_memory", session_state=session_state)
130
+ if isinstance(resolved_user_id, str) and resolved_user_id.startswith("Error in search_memory:"):
131
+ return resolved_user_id
132
+ try:
133
+ results = self.client.search(
134
+ query=query,
135
+ user_id=resolved_user_id,
136
+ )
137
+
138
+ if isinstance(results, dict) and "results" in results:
139
+ search_results_list = results.get("results", [])
140
+ elif isinstance(results, list):
141
+ search_results_list = results
142
+ else:
143
+ log_warning(f"Unexpected return type from mem0.search: {type(results)}. Returning empty list.")
144
+ search_results_list = []
145
+
146
+ return json.dumps(search_results_list)
147
+ except ValueError as ve:
148
+ log_error(str(ve))
149
+ return str(ve)
150
+ except Exception as e:
151
+ log_error(f"Error searching memory: {e}")
152
+ return f"Error searching memory: {e}"
153
+
154
+ def get_all_memories(self, session_state: Dict[str, Any]) -> str:
155
+ """Return **all** memories for the current user as a JSON string."""
156
+
157
+ resolved_user_id = self._get_user_id("get_all_memories", session_state=session_state)
158
+ if isinstance(resolved_user_id, str) and resolved_user_id.startswith("Error in get_all_memories:"):
159
+ return resolved_user_id
160
+ try:
161
+ results = self.client.get_all(
162
+ user_id=resolved_user_id,
163
+ )
164
+
165
+ if isinstance(results, dict) and "results" in results:
166
+ memories_list = results.get("results", [])
167
+ elif isinstance(results, list):
168
+ memories_list = results
169
+ else:
170
+ log_warning(f"Unexpected return type from mem0.get_all: {type(results)}. Returning empty list.")
171
+ memories_list = []
172
+ return json.dumps(memories_list)
173
+ except ValueError as ve:
174
+ log_error(str(ve))
175
+ return str(ve)
176
+ except Exception as e:
177
+ log_error(f"Error getting all memories: {e}")
178
+ return f"Error getting all memories: {e}"
179
+
180
+ def delete_all_memories(self, session_state: Dict[str, Any]) -> str:
181
+ """Delete *all* memories associated with the current user"""
182
+
183
+ resolved_user_id = self._get_user_id("delete_all_memories", session_state=session_state)
184
+ if isinstance(resolved_user_id, str) and resolved_user_id.startswith("Error in delete_all_memories:"):
185
+ error_msg = resolved_user_id
186
+ log_error(error_msg)
187
+ return f"Error deleting all memories: {error_msg}"
188
+ try:
189
+ self.client.delete_all(user_id=resolved_user_id)
190
+ return f"Successfully deleted all memories for user_id: {resolved_user_id}."
191
+ except Exception as e:
192
+ log_error(f"Error deleting all memories: {e}")
193
+ return f"Error deleting all memories: {e}"
agno/tools/memori.py ADDED
@@ -0,0 +1,339 @@
1
+ import json
2
+ from typing import Any, Dict, List, Optional
3
+
4
+ from agno.tools.toolkit import Toolkit
5
+ from agno.utils.log import log_debug, log_error, log_info, log_warning
6
+
7
+ try:
8
+ from memori import Memori, create_memory_tool
9
+ except ImportError:
10
+ raise ImportError("`memorisdk` package not found. Please install it with `pip install memorisdk`")
11
+
12
+
13
+ class MemoriTools(Toolkit):
14
+ """
15
+ Memori ToolKit for Agno Agents and Teams, providing persistent memory capabilities.
16
+
17
+ This toolkit integrates Memori's memory system with Agno, allowing Agents and Teams to:
18
+ - Store and retrieve conversation history
19
+ - Search through past interactions
20
+ - Maintain user preferences and context
21
+ - Build long-term memory across sessions
22
+
23
+ Requirements:
24
+ - pip install memorisdk
25
+ - Database connection string (SQLite, PostgreSQL, etc.)
26
+
27
+ Example:
28
+ ```python
29
+ from agno.tools.memori import MemoriTools
30
+
31
+ # Initialize with SQLite (default)
32
+ memori_tools = MemoriTools(
33
+ database_connect="sqlite:///agent_memory.db",
34
+ namespace="my_agent",
35
+ auto_ingest=True # Automatically ingest conversations
36
+ )
37
+
38
+ # Add to agent
39
+ agent = Agent(
40
+ model=OpenAIChat(),
41
+ tools=[memori_tools],
42
+ description="An AI assistant with persistent memory"
43
+ )
44
+ ```
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ database_connect: Optional[str] = None,
50
+ namespace: Optional[str] = None,
51
+ conscious_ingest: bool = True,
52
+ auto_ingest: bool = True,
53
+ verbose: bool = False,
54
+ config: Optional[Dict[str, Any]] = None,
55
+ auto_enable: bool = True,
56
+ enable_search_memory: bool = True,
57
+ enable_record_conversation: bool = True,
58
+ enable_get_memory_stats: bool = True,
59
+ all: bool = False,
60
+ **kwargs,
61
+ ):
62
+ """
63
+ Initialize Memori toolkit.
64
+
65
+ Args:
66
+ database_connect: Database connection string (e.g., "sqlite:///memory.db")
67
+ namespace: Namespace for organizing memories (e.g., "agent_v1", "user_session")
68
+ conscious_ingest: Whether to use conscious memory ingestion
69
+ auto_ingest: Whether to automatically ingest conversations into memory
70
+ verbose: Enable verbose logging from Memori
71
+ config: Additional Memori configuration
72
+ auto_enable: Automatically enable the memory system on initialization
73
+ **kwargs: Additional arguments passed to Toolkit base class
74
+ """
75
+ tools: List[Any] = []
76
+ if all or enable_search_memory:
77
+ tools.append(self.search_memory)
78
+ if all or enable_record_conversation:
79
+ tools.append(self.record_conversation)
80
+ if all or enable_get_memory_stats:
81
+ tools.append(self.get_memory_stats)
82
+
83
+ super().__init__(name="memori_tools", tools=tools, **kwargs)
84
+
85
+ # Set default database connection if not provided
86
+ if not database_connect:
87
+ sqlite_db = "sqlite:///agno_memori_memory.db"
88
+ log_info(f"No database connection provided, using default SQLite database at {sqlite_db}")
89
+ database_connect = sqlite_db
90
+
91
+ self.database_connect = database_connect
92
+ self.namespace = namespace or "agno_default"
93
+ self.conscious_ingest = conscious_ingest
94
+ self.auto_ingest = auto_ingest
95
+ self.verbose = verbose
96
+ self.config = config or {}
97
+
98
+ try:
99
+ # Initialize Memori memory system
100
+ log_debug(f"Initializing Memori with database: {self.database_connect}")
101
+ self.memory_system = Memori(
102
+ database_connect=self.database_connect,
103
+ conscious_ingest=self.conscious_ingest,
104
+ auto_ingest=self.auto_ingest,
105
+ verbose=self.verbose,
106
+ namespace=self.namespace,
107
+ **self.config,
108
+ )
109
+
110
+ # Enable the memory system if auto_enable is True
111
+ if auto_enable:
112
+ self.memory_system.enable()
113
+ log_debug("Memori memory system enabled")
114
+
115
+ # Create the memory tool for internal use
116
+ self._memory_tool = create_memory_tool(self.memory_system)
117
+
118
+ except Exception as e:
119
+ log_error(f"Failed to initialize Memori: {e}")
120
+ raise ConnectionError("Failed to initialize Memori memory system") from e
121
+
122
+ def search_memory(
123
+ self,
124
+ query: str,
125
+ limit: Optional[int] = None,
126
+ ) -> str:
127
+ """
128
+ Search the Agent's memory for past conversations and information.
129
+
130
+ This performs semantic search across all stored memories to find
131
+ relevant information based on the provided query.
132
+
133
+ Args:
134
+ query: What to search for in memory (e.g., "past conversations about AI", "user preferences")
135
+ limit: Maximum number of results to return (optional)
136
+
137
+ Returns:
138
+ str: JSON-encoded search results or error message
139
+
140
+ Example:
141
+ search_memory("user's favorite programming languages")
142
+ search_memory("previous discussions about machine learning")
143
+ """
144
+ try:
145
+ if not query.strip():
146
+ return json.dumps({"error": "Please provide a search query"})
147
+
148
+ log_debug(f"Searching memory for: {query}")
149
+
150
+ # Execute search using Memori's memory tool
151
+ result = self._memory_tool.execute(query=query.strip())
152
+
153
+ if result:
154
+ # If limit is specified, truncate results
155
+ if limit and isinstance(result, list):
156
+ result = result[:limit]
157
+
158
+ return json.dumps(
159
+ {
160
+ "success": True,
161
+ "query": query,
162
+ "results": result,
163
+ "count": len(result) if isinstance(result, list) else 1,
164
+ }
165
+ )
166
+ else:
167
+ return json.dumps(
168
+ {
169
+ "success": True,
170
+ "query": query,
171
+ "results": [],
172
+ "count": 0,
173
+ "message": "No relevant memories found",
174
+ }
175
+ )
176
+
177
+ except Exception as e:
178
+ log_error(f"Error searching memory: {e}")
179
+ return json.dumps({"success": False, "error": f"Memory search error: {str(e)}"})
180
+
181
+ def record_conversation(self, content: str) -> str:
182
+ """
183
+ Add important information or facts to memory.
184
+
185
+ Use this tool to store important information, user preferences, facts, or context that should be remembered
186
+ for future conversations.
187
+
188
+ Args:
189
+ content: The information/facts to store in memory
190
+
191
+ Returns:
192
+ str: Success message or error details
193
+
194
+ Example:
195
+ record_conversation("User prefers Python over JavaScript")
196
+ record_conversation("User is working on an e-commerce project using Django")
197
+ record_conversation("User's name is John and they live in NYC")
198
+ """
199
+ try:
200
+ if not content.strip():
201
+ return json.dumps({"success": False, "error": "Content cannot be empty"})
202
+
203
+ log_debug(f"Adding conversation: {content}")
204
+
205
+ # Extract the actual AI response from the agent's conversation history
206
+ ai_output = "I've noted this information and will remember it."
207
+
208
+ self.memory_system.record_conversation(user_input=content, ai_output=str(ai_output))
209
+ return json.dumps(
210
+ {
211
+ "success": True,
212
+ "message": "Memory added successfully via conversation recording",
213
+ "content_length": len(content),
214
+ }
215
+ )
216
+
217
+ except Exception as e:
218
+ log_error(f"Error adding memory: {e}")
219
+ return json.dumps({"success": False, "error": f"Failed to add memory: {str(e)}"})
220
+
221
+ def get_memory_stats(
222
+ self,
223
+ ) -> str:
224
+ """
225
+ Get statistics about the memory system.
226
+
227
+ Returns information about the current state of the memory system,
228
+ including total memories, memory distribution by retention type
229
+ (short-term vs long-term), and system configuration.
230
+
231
+ Returns:
232
+ str: JSON-encoded memory statistics
233
+
234
+ Example:
235
+ Returns statistics like:
236
+ {
237
+ "success": true,
238
+ "total_memories": 42,
239
+ "memories_by_retention": {
240
+ "short_term": 5,
241
+ "long_term": 37
242
+ },
243
+ "namespace": "my_agent",
244
+ "conscious_ingest": true,
245
+ "auto_ingest": true,
246
+ "memory_system_enabled": true
247
+ }
248
+ """
249
+ try:
250
+ log_debug("Retrieving memory statistics")
251
+
252
+ # Base stats about the system configuration
253
+ stats = {
254
+ "success": True,
255
+ "namespace": self.namespace,
256
+ "database_connect": self.database_connect,
257
+ "conscious_ingest": self.conscious_ingest,
258
+ "auto_ingest": self.auto_ingest,
259
+ "verbose": self.verbose,
260
+ "memory_system_enabled": hasattr(self.memory_system, "_enabled") and self.memory_system._enabled,
261
+ }
262
+
263
+ # Get Memori's built-in memory statistics
264
+ try:
265
+ if hasattr(self.memory_system, "get_memory_stats"):
266
+ # Use the get_memory_stats method as shown in the example
267
+ memori_stats = self.memory_system.get_memory_stats()
268
+
269
+ # Add the Memori-specific stats to our response
270
+ if isinstance(memori_stats, dict):
271
+ # Include total memories
272
+ if "total_memories" in memori_stats:
273
+ stats["total_memories"] = memori_stats["total_memories"]
274
+
275
+ # Include memory distribution by retention type
276
+ if "memories_by_retention" in memori_stats:
277
+ stats["memories_by_retention"] = memori_stats["memories_by_retention"]
278
+
279
+ # Also add individual counts for convenience
280
+ retention_info = memori_stats["memories_by_retention"]
281
+ stats["short_term_memories"] = retention_info.get("short_term", 0)
282
+ stats["long_term_memories"] = retention_info.get("long_term", 0)
283
+
284
+ # Include any other available stats
285
+ for key, value in memori_stats.items():
286
+ if key not in stats:
287
+ stats[key] = value
288
+
289
+ log_debug(
290
+ f"Retrieved memory stats: total={stats.get('total_memories', 0)}, "
291
+ f"short_term={stats.get('short_term_memories', 0)}, "
292
+ f"long_term={stats.get('long_term_memories', 0)}"
293
+ )
294
+
295
+ else:
296
+ log_debug("get_memory_stats method not available, providing basic stats only")
297
+ stats["total_memories"] = 0
298
+ stats["memories_by_retention"] = {"short_term": 0, "long_term": 0}
299
+ stats["short_term_memories"] = 0
300
+ stats["long_term_memories"] = 0
301
+
302
+ except Exception as e:
303
+ log_debug(f"Could not retrieve detailed memory stats: {e}")
304
+ # Provide basic stats if detailed stats fail
305
+ stats["total_memories"] = 0
306
+ stats["memories_by_retention"] = {"short_term": 0, "long_term": 0}
307
+ stats["short_term_memories"] = 0
308
+ stats["long_term_memories"] = 0
309
+ stats["stats_warning"] = "Detailed memory statistics not available"
310
+
311
+ return json.dumps(stats)
312
+
313
+ except Exception as e:
314
+ log_error(f"Error getting memory stats: {e}")
315
+ return json.dumps({"success": False, "error": f"Failed to get memory statistics: {str(e)}"})
316
+
317
+ def enable_memory_system(self) -> bool:
318
+ """Enable the Memori memory system."""
319
+ try:
320
+ self.memory_system.enable()
321
+ log_debug("Memori memory system enabled")
322
+ return True
323
+ except Exception as e:
324
+ log_error(f"Failed to enable memory system: {e}")
325
+ return False
326
+
327
+ def disable_memory_system(self) -> bool:
328
+ """Disable the Memori memory system."""
329
+ try:
330
+ if hasattr(self.memory_system, "disable"):
331
+ self.memory_system.disable()
332
+ log_debug("Memori memory system disabled")
333
+ return True
334
+ else:
335
+ log_warning("Memory system disable method not available")
336
+ return False
337
+ except Exception as e:
338
+ log_error(f"Failed to disable memory system: {e}")
339
+ return False