agno 1.8.2__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 (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/memory/db/sqlite.py DELETED
@@ -1,193 +0,0 @@
1
- from pathlib import Path
2
- from typing import List, Optional
3
-
4
- try:
5
- from sqlalchemy import (
6
- Column,
7
- DateTime,
8
- Engine,
9
- MetaData,
10
- String,
11
- Table,
12
- create_engine,
13
- delete,
14
- inspect,
15
- select,
16
- text,
17
- )
18
- from sqlalchemy.exc import SQLAlchemyError
19
- from sqlalchemy.orm import scoped_session, sessionmaker
20
- except ImportError:
21
- raise ImportError("`sqlalchemy` not installed. Please install it with `pip install sqlalchemy`")
22
-
23
- from agno.memory.db import MemoryDb
24
- from agno.memory.row import MemoryRow
25
- from agno.utils.log import log_debug, log_info, logger
26
-
27
-
28
- class SqliteMemoryDb(MemoryDb):
29
- def __init__(
30
- self,
31
- table_name: str = "memory",
32
- db_url: Optional[str] = None,
33
- db_file: Optional[str] = None,
34
- db_engine: Optional[Engine] = None,
35
- ):
36
- """
37
- This class provides a memory store backed by a SQLite table.
38
-
39
- The following order is used to determine the database connection:
40
- 1. Use the db_engine if provided
41
- 2. Use the db_url
42
- 3. Use the db_file
43
- 4. Create a new in-memory database
44
-
45
- Args:
46
- table_name: The name of the table to store Agent sessions.
47
- db_url: The database URL to connect to.
48
- db_file: The database file to connect to.
49
- db_engine: The database engine to use.
50
- """
51
- _engine: Optional[Engine] = db_engine
52
- if _engine is None and db_url is not None:
53
- _engine = create_engine(db_url)
54
- elif _engine is None and db_file is not None:
55
- # Use the db_file to create the engine
56
- db_path = Path(db_file).resolve()
57
- # Ensure the directory exists
58
- db_path.parent.mkdir(parents=True, exist_ok=True)
59
- _engine = create_engine(f"sqlite:///{db_path}")
60
- else:
61
- _engine = create_engine("sqlite://")
62
-
63
- if _engine is None:
64
- raise ValueError("Must provide either db_url, db_file or db_engine")
65
-
66
- # Database attributes
67
- self.table_name: str = table_name
68
- self.db_url: Optional[str] = db_url
69
- self.db_engine: Engine = _engine
70
- self.metadata: MetaData = MetaData()
71
- self.inspector = inspect(self.db_engine)
72
-
73
- # Database session
74
- self.Session = scoped_session(sessionmaker(bind=self.db_engine))
75
- # Database table for memories
76
- self.table: Table = self.get_table()
77
-
78
- def get_table(self) -> Table:
79
- return Table(
80
- self.table_name,
81
- self.metadata,
82
- Column("id", String, primary_key=True),
83
- Column("user_id", String),
84
- Column("memory", String),
85
- Column("created_at", DateTime, server_default=text("CURRENT_TIMESTAMP")),
86
- Column(
87
- "updated_at", DateTime, server_default=text("CURRENT_TIMESTAMP"), onupdate=text("CURRENT_TIMESTAMP")
88
- ),
89
- extend_existing=True,
90
- )
91
-
92
- def create(self) -> None:
93
- if not self.table_exists():
94
- try:
95
- log_debug(f"Creating table: {self.table_name}")
96
- self.table.create(self.db_engine, checkfirst=True)
97
- except Exception as e:
98
- logger.error(f"Error creating table '{self.table_name}': {e}")
99
- raise
100
-
101
- def memory_exists(self, memory: MemoryRow) -> bool:
102
- with self.Session() as session:
103
- stmt = select(self.table.c.id).where(self.table.c.id == memory.id)
104
- result = session.execute(stmt).first()
105
- return result is not None
106
-
107
- def read_memories(
108
- self, user_id: Optional[str] = None, limit: Optional[int] = None, sort: Optional[str] = None
109
- ) -> List[MemoryRow]:
110
- memories: List[MemoryRow] = []
111
- try:
112
- with self.Session() as session:
113
- stmt = select(self.table)
114
- if user_id is not None:
115
- stmt = stmt.where(self.table.c.user_id == user_id)
116
-
117
- if sort == "asc":
118
- stmt = stmt.order_by(self.table.c.created_at.asc())
119
- else:
120
- stmt = stmt.order_by(self.table.c.created_at.desc())
121
-
122
- if limit is not None:
123
- stmt = stmt.limit(limit)
124
-
125
- result = session.execute(stmt)
126
- for row in result:
127
- memories.append(MemoryRow(id=row.id, user_id=row.user_id, memory=eval(row.memory)))
128
- except SQLAlchemyError as e:
129
- log_debug(f"Exception reading from table: {e}")
130
- log_debug(f"Table does not exist: {self.table_name}")
131
- log_debug("Creating table for future transactions")
132
- self.create()
133
- return memories
134
-
135
- def upsert_memory(self, memory: MemoryRow, create_and_retry: bool = True) -> None:
136
- try:
137
- with self.Session() as session:
138
- # Check if the memory already exists
139
- existing = session.execute(select(self.table).where(self.table.c.id == memory.id)).first()
140
-
141
- if existing:
142
- # Update existing memory
143
- stmt = (
144
- self.table.update()
145
- .where(self.table.c.id == memory.id)
146
- .values(user_id=memory.user_id, memory=str(memory.memory), updated_at=text("CURRENT_TIMESTAMP"))
147
- )
148
- else:
149
- # Insert new memory
150
- stmt = self.table.insert().values(id=memory.id, user_id=memory.user_id, memory=str(memory.memory)) # type: ignore
151
-
152
- session.execute(stmt)
153
- session.commit()
154
- except SQLAlchemyError as e:
155
- logger.error(f"Exception upserting into table: {e}")
156
- if not self.table_exists():
157
- log_info(f"Table does not exist: {self.table_name}")
158
- log_info("Creating table for future transactions")
159
- self.create()
160
- if create_and_retry:
161
- return self.upsert_memory(memory, create_and_retry=False)
162
- else:
163
- raise
164
-
165
- def delete_memory(self, id: str) -> None:
166
- with self.Session() as session:
167
- stmt = delete(self.table).where(self.table.c.id == id)
168
- session.execute(stmt)
169
- session.commit()
170
-
171
- def drop_table(self) -> None:
172
- if self.table_exists():
173
- log_debug(f"Deleting table: {self.table_name}")
174
- self.table.drop(self.db_engine)
175
-
176
- def table_exists(self) -> bool:
177
- log_debug(f"Checking if table exists: {self.table.name}")
178
- try:
179
- return self.inspector.has_table(self.table.name)
180
- except Exception as e:
181
- logger.error(e)
182
- return False
183
-
184
- def clear(self) -> bool:
185
- with self.Session() as session:
186
- stmt = delete(self.table)
187
- session.execute(stmt)
188
- session.commit()
189
- return True
190
-
191
- def __del__(self):
192
- # self.Session.remove()
193
- pass
agno/memory/memory.py DELETED
@@ -1,22 +0,0 @@
1
- from enum import Enum
2
- from typing import Any, Dict, Optional
3
-
4
- from pydantic import BaseModel
5
-
6
-
7
- class MemoryRetrieval(str, Enum):
8
- last_n = "last_n"
9
- first_n = "first_n"
10
- semantic = "semantic"
11
-
12
-
13
- class Memory(BaseModel):
14
- """Model for Agent Memories"""
15
-
16
- memory: str
17
- id: Optional[str] = None
18
- topic: Optional[str] = None
19
- input: Optional[str] = None
20
-
21
- def to_dict(self) -> Dict[str, Any]:
22
- return self.model_dump(exclude_none=True)
agno/memory/row.py DELETED
@@ -1,36 +0,0 @@
1
- import json
2
- from datetime import datetime
3
- from hashlib import md5
4
- from typing import Any, Dict, Optional
5
-
6
- from pydantic import BaseModel, ConfigDict, model_validator
7
-
8
-
9
- class MemoryRow(BaseModel):
10
- """Memory Row that is stored in the database"""
11
-
12
- memory: Dict[str, Any]
13
- user_id: Optional[str] = None
14
- created_at: Optional[datetime] = None
15
- updated_at: Optional[datetime] = None
16
- # id for this memory, auto-generated from the memory
17
- id: Optional[str] = None
18
-
19
- model_config = ConfigDict(from_attributes=True, arbitrary_types_allowed=True)
20
-
21
- def serializable_dict(self) -> Dict[str, Any]:
22
- _dict = self.model_dump(exclude={"created_at", "updated_at"})
23
- _dict["created_at"] = self.created_at.isoformat() if self.created_at else None
24
- _dict["updated_at"] = self.updated_at.isoformat() if self.updated_at else None
25
- return _dict
26
-
27
- def to_dict(self) -> Dict[str, Any]:
28
- return self.serializable_dict()
29
-
30
- @model_validator(mode="after")
31
- def generate_id(self) -> "MemoryRow":
32
- if self.id is None:
33
- memory_str = json.dumps(self.memory, sort_keys=True)
34
- cleaned_memory = memory_str.replace(" ", "").replace("\n", "").replace("\t", "")
35
- self.id = md5(cleaned_memory.encode()).hexdigest()
36
- return self
agno/memory/summarizer.py DELETED
@@ -1,201 +0,0 @@
1
- import json
2
- from textwrap import dedent
3
- from typing import Any, Dict, List, Optional, Tuple, cast
4
-
5
- from pydantic import BaseModel, ValidationError
6
-
7
- from agno.memory.summary import SessionSummary
8
- from agno.models.base import Model
9
- from agno.models.message import Message
10
- from agno.utils.log import log_debug, log_info, logger
11
-
12
-
13
- class MemorySummarizer(BaseModel):
14
- model: Optional[Model] = None
15
- use_structured_outputs: bool = False
16
-
17
- def update_model(self) -> None:
18
- if self.model is None:
19
- try:
20
- from agno.models.openai import OpenAIChat
21
- except ModuleNotFoundError as e:
22
- logger.exception(e)
23
- logger.error(
24
- "Agno uses `openai` as the default model provider. Please provide a `model` or install `openai`."
25
- )
26
- exit(1)
27
- self.model = OpenAIChat(id="gpt-4o")
28
-
29
- def get_system_message(self, messages_for_summarization: List[Dict[str, str]]) -> Message:
30
- # -*- Return a system message for summarization
31
- system_prompt = dedent("""\
32
- Analyze the following conversation between a user and an assistant, and extract the following details:
33
- - Summary (str): Provide a concise summary of the session, focusing on important information that would be helpful for future interactions.
34
- - Topics (Optional[List[str]]): List the topics discussed in the session.
35
- Please ignore any frivolous information.
36
-
37
- Conversation:
38
- """)
39
- conversation = []
40
- for message_pair in messages_for_summarization:
41
- conversation.append(f"User: {message_pair['user']}")
42
- if "assistant" in message_pair:
43
- conversation.append(f"Assistant: {message_pair['assistant']}")
44
- elif "model" in message_pair:
45
- conversation.append(f"Assistant: {message_pair['model']}")
46
-
47
- system_prompt += "\n".join(conversation)
48
-
49
- if not self.use_structured_outputs:
50
- system_prompt += "\n\nProvide your output as a JSON containing the following fields:"
51
- json_schema = SessionSummary.model_json_schema()
52
- response_model_properties = {}
53
- json_schema_properties = json_schema.get("properties")
54
- if json_schema_properties is not None:
55
- for field_name, field_properties in json_schema_properties.items():
56
- formatted_field_properties = {
57
- prop_name: prop_value
58
- for prop_name, prop_value in field_properties.items()
59
- if prop_name != "title"
60
- }
61
- response_model_properties[field_name] = formatted_field_properties
62
-
63
- if len(response_model_properties) > 0:
64
- system_prompt += "\n<json_fields>"
65
- system_prompt += f"\n{json.dumps([key for key in response_model_properties.keys() if key != '$defs'])}"
66
- system_prompt += "\n</json_fields>"
67
- system_prompt += "\nHere are the properties for each field:"
68
- system_prompt += "\n<json_field_properties>"
69
- system_prompt += f"\n{json.dumps(response_model_properties, indent=2)}"
70
- system_prompt += "\n</json_field_properties>"
71
-
72
- system_prompt += "\nStart your response with `{` and end it with `}`."
73
- system_prompt += "\nYour output will be passed to json.loads() to convert it to a Python object."
74
- system_prompt += "\nMake sure it only contains valid JSON."
75
- return Message(role="system", content=system_prompt)
76
-
77
- def run(
78
- self,
79
- message_pairs: List[Tuple[Message, Message]],
80
- **kwargs: Any,
81
- ) -> Optional[SessionSummary]:
82
- log_debug("*********** MemorySummarizer Start ***********")
83
-
84
- if message_pairs is None or len(message_pairs) == 0:
85
- log_info("No message pairs provided for summarization.")
86
- return None
87
-
88
- # Update the Model (set defaults, add logit etc.)
89
- self.update_model()
90
-
91
- # Set response_format if it is not set on the Model
92
- if self.use_structured_outputs:
93
- response_format: Any = SessionSummary
94
- else:
95
- response_format = {"type": "json_object"}
96
-
97
- # Convert the message pairs to a list of dictionaries
98
- messages_for_summarization: List[Dict[str, str]] = []
99
- for message_pair in message_pairs:
100
- user_message, assistant_message = message_pair
101
- messages_for_summarization.append(
102
- {
103
- user_message.role: user_message.get_content_string(),
104
- assistant_message.role: assistant_message.get_content_string(),
105
- }
106
- )
107
-
108
- # Prepare the List of messages to send to the Model
109
- messages_for_model: List[Message] = [
110
- self.get_system_message(messages_for_summarization),
111
- # For models that require a non-system message
112
- Message(role="user", content="Provide the summary of the conversation."),
113
- ]
114
-
115
- # Generate a response from the Model (includes running function calls)
116
- self.model = cast(Model, self.model)
117
- response = self.model.response(messages=messages_for_model, response_format=response_format)
118
- log_debug("*********** MemorySummarizer End ***********")
119
-
120
- # If the model natively supports structured outputs, the parsed value is already in the structured format
121
- if self.use_structured_outputs and response.parsed is not None and isinstance(response.parsed, SessionSummary):
122
- return response.parsed
123
-
124
- # Otherwise convert the response to the structured format
125
- if isinstance(response.content, str):
126
- try:
127
- session_summary = None
128
- try:
129
- session_summary = SessionSummary.model_validate_json(response.content)
130
- except ValidationError:
131
- # Check if response starts with ```json
132
- if response.content.startswith("```json"):
133
- response.content = response.content.replace("```json\n", "").replace("\n```", "")
134
- try:
135
- session_summary = SessionSummary.model_validate_json(response.content)
136
- except ValidationError as exc:
137
- logger.warning(f"Failed to validate session_summary response: {exc}")
138
- return session_summary
139
- except Exception as e:
140
- logger.warning(f"Failed to convert response to session_summary: {e}")
141
- return None
142
-
143
- async def arun(
144
- self,
145
- message_pairs: List[Tuple[Message, Message]],
146
- **kwargs: Any,
147
- ) -> Optional[SessionSummary]:
148
- log_debug("*********** Async MemorySummarizer Start ***********")
149
-
150
- if message_pairs is None or len(message_pairs) == 0:
151
- log_info("No message pairs provided for summarization.")
152
- return None
153
-
154
- # Update the Model (set defaults, add logit etc.)
155
- self.update_model()
156
-
157
- # Convert the message pairs to a list of dictionaries
158
- messages_for_summarization: List[Dict[str, str]] = []
159
- for message_pair in message_pairs:
160
- user_message, assistant_message = message_pair
161
- messages_for_summarization.append(
162
- {
163
- user_message.role: user_message.get_content_string(),
164
- assistant_message.role: assistant_message.get_content_string(),
165
- }
166
- )
167
-
168
- # Prepare the List of messages to send to the Model
169
- messages_for_model: List[Message] = [
170
- self.get_system_message(messages_for_summarization),
171
- # For models that require a non-system message
172
- Message(role="user", content="Provide the summary of the conversation."),
173
- ]
174
-
175
- # Generate a response from the Model (includes running function calls)
176
- self.model = cast(Model, self.model)
177
- response = await self.model.aresponse(messages=messages_for_model)
178
- log_debug("*********** Async MemorySummarizer End ***********")
179
-
180
- # If the model natively supports structured outputs, the parsed value is already in the structured format
181
- if self.use_structured_outputs and response.parsed is not None and isinstance(response.parsed, SessionSummary):
182
- return response.parsed
183
-
184
- # Otherwise convert the response to the structured format
185
- if isinstance(response.content, str):
186
- try:
187
- session_summary = None
188
- try:
189
- session_summary = SessionSummary.model_validate_json(response.content)
190
- except ValidationError:
191
- # Check if response starts with ```json
192
- if response.content.startswith("```json"):
193
- response.content = response.content.replace("```json\n", "").replace("\n```", "")
194
- try:
195
- session_summary = SessionSummary.model_validate_json(response.content)
196
- except ValidationError as exc:
197
- logger.warning(f"Failed to validate session_summary response: {exc}")
198
- return session_summary
199
- except Exception as e:
200
- logger.warning(f"Failed to convert response to session_summary: {e}")
201
- return None
agno/memory/summary.py DELETED
@@ -1,19 +0,0 @@
1
- from typing import Any, Dict, List, Optional
2
-
3
- from pydantic import BaseModel, Field
4
-
5
-
6
- class SessionSummary(BaseModel):
7
- """Model for Session Summary."""
8
-
9
- summary: str = Field(
10
- ...,
11
- description="Summary of the session. Be concise and focus on only important information. Do not make anything up.",
12
- )
13
- topics: Optional[List[str]] = Field(None, description="Topics discussed in the session.")
14
-
15
- def to_dict(self) -> Dict[str, Any]:
16
- return self.model_dump(exclude_none=True)
17
-
18
- def to_json(self) -> str:
19
- return self.model_dump_json(exclude_none=True, indent=2)