agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
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)