agno 1.8.0__py3-none-any.whl → 2.0.0a1__py3-none-any.whl

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