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/session/agent.py ADDED
@@ -0,0 +1,244 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import asdict, dataclass
4
+ from typing import Any, Dict, List, Mapping, Optional
5
+
6
+ from agno.models.message import Message
7
+ from agno.run.agent import RunOutput
8
+ from agno.run.base import RunStatus
9
+ from agno.session.summary import SessionSummary
10
+ from agno.utils.log import log_debug, log_warning
11
+
12
+
13
+ @dataclass
14
+ class AgentSession:
15
+ """Agent Session that is stored in the database"""
16
+
17
+ # Session UUID
18
+ session_id: str
19
+
20
+ # ID of the agent that this session is associated with
21
+ agent_id: Optional[str] = None
22
+ # ID of the team that this session is associated with
23
+ team_id: Optional[str] = None
24
+ # # ID of the user interacting with this agent
25
+ user_id: Optional[str] = None
26
+ # ID of the workflow that this session is associated with
27
+ workflow_id: Optional[str] = None
28
+
29
+ # Session Data: session_name, session_state, images, videos, audio
30
+ session_data: Optional[Dict[str, Any]] = None
31
+ # Metadata stored with this agent
32
+ metadata: Optional[Dict[str, Any]] = None
33
+ # Agent Data: agent_id, name and model
34
+ agent_data: Optional[Dict[str, Any]] = None
35
+ # List of all runs in the session
36
+ runs: Optional[List[RunOutput]] = None
37
+ # Summary of the session
38
+ summary: Optional["SessionSummary"] = None
39
+
40
+ # The unix timestamp when this session was created
41
+ created_at: Optional[int] = None
42
+ # The unix timestamp when this session was last updated
43
+ updated_at: Optional[int] = None
44
+
45
+ def to_dict(self) -> Dict[str, Any]:
46
+ session_dict = asdict(self)
47
+
48
+ session_dict["runs"] = [run.to_dict() for run in self.runs] if self.runs else None
49
+ session_dict["summary"] = self.summary.to_dict() if self.summary else None
50
+
51
+ return session_dict
52
+
53
+ @classmethod
54
+ def from_dict(cls, data: Mapping[str, Any]) -> Optional[AgentSession]:
55
+ if data is None or data.get("session_id") is None:
56
+ log_warning("AgentSession is missing session_id")
57
+ return None
58
+
59
+ runs = data.get("runs")
60
+ if runs is not None and isinstance(runs[0], dict):
61
+ runs = [RunOutput.from_dict(run) for run in runs]
62
+
63
+ summary = data.get("summary")
64
+ if summary is not None and isinstance(summary, dict):
65
+ summary = SessionSummary.from_dict(summary)
66
+
67
+ metadata = data.get("metadata")
68
+
69
+ return cls(
70
+ session_id=data.get("session_id"), # type: ignore
71
+ agent_id=data.get("agent_id"),
72
+ user_id=data.get("user_id"),
73
+ workflow_id=data.get("workflow_id"),
74
+ team_id=data.get("team_id"),
75
+ agent_data=data.get("agent_data"),
76
+ session_data=data.get("session_data"),
77
+ metadata=metadata,
78
+ created_at=data.get("created_at"),
79
+ updated_at=data.get("updated_at"),
80
+ runs=runs,
81
+ summary=summary,
82
+ )
83
+
84
+ def upsert_run(self, run: RunOutput):
85
+ """Adds a RunOutput, together with some calculated data, to the runs list."""
86
+ messages = run.messages
87
+ for m in messages or []:
88
+ if m.metrics is not None:
89
+ m.metrics.duration = None
90
+
91
+ if not self.runs:
92
+ self.runs = []
93
+
94
+ for i, existing_run in enumerate(self.runs or []):
95
+ if existing_run.run_id == run.run_id:
96
+ self.runs[i] = run
97
+ break
98
+ else:
99
+ self.runs.append(run)
100
+
101
+ log_debug("Added RunOutput to Agent Session")
102
+
103
+ def get_run(self, run_id: str) -> Optional[RunOutput]:
104
+ for run in self.runs or []:
105
+ if run.run_id == run_id:
106
+ return run
107
+ return None
108
+
109
+ def get_messages_from_last_n_runs(
110
+ self,
111
+ agent_id: Optional[str] = None,
112
+ team_id: Optional[str] = None,
113
+ last_n: Optional[int] = None,
114
+ skip_role: Optional[str] = None,
115
+ skip_status: Optional[List[RunStatus]] = None,
116
+ skip_history_messages: bool = True,
117
+ ) -> List[Message]:
118
+ """Returns the messages from the last_n runs, excluding previously tagged history messages.
119
+ Args:
120
+ agent_id: The id of the agent to get the messages from.
121
+ team_id: The id of the team to get the messages from.
122
+ last_n: The number of runs to return from the end of the conversation. Defaults to all runs.
123
+ skip_role: Skip messages with this role.
124
+ skip_status: Skip messages with this status.
125
+ skip_history_messages: Skip messages that were tagged as history in previous runs.
126
+ Returns:
127
+ A list of Messages from the specified runs, excluding history messages.
128
+ """
129
+ if not self.runs:
130
+ return []
131
+
132
+ if skip_status is None:
133
+ skip_status = [RunStatus.paused, RunStatus.cancelled, RunStatus.error]
134
+
135
+ session_runs = self.runs
136
+ # Filter by agent_id and team_id
137
+ if agent_id:
138
+ session_runs = [run for run in session_runs if hasattr(run, "agent_id") and run.agent_id == agent_id] # type: ignore
139
+ if team_id:
140
+ session_runs = [run for run in session_runs if hasattr(run, "team_id") and run.team_id == team_id] # type: ignore
141
+
142
+ # Filter by status
143
+ session_runs = [run for run in session_runs if hasattr(run, "status") and run.status not in skip_status] # type: ignore
144
+
145
+ # Filter by last_n
146
+ runs_to_process = session_runs[-last_n:] if last_n is not None else session_runs
147
+ messages_from_history = []
148
+ system_message = None
149
+ for run_response in runs_to_process:
150
+ if not (run_response and run_response.messages):
151
+ continue
152
+
153
+ for message in run_response.messages or []:
154
+ # Skip messages with specified role
155
+ if skip_role and message.role == skip_role:
156
+ continue
157
+ # Skip messages that were tagged as history in previous runs
158
+ if hasattr(message, "from_history") and message.from_history and skip_history_messages:
159
+ continue
160
+ if message.role == "system":
161
+ # Only add the system message once
162
+ if system_message is None:
163
+ system_message = message
164
+ messages_from_history.append(system_message)
165
+ else:
166
+ messages_from_history.append(message)
167
+
168
+ log_debug(f"Getting messages from previous runs: {len(messages_from_history)}")
169
+ return messages_from_history
170
+
171
+ def get_tool_calls(self, num_calls: Optional[int] = None) -> List[Dict[str, Any]]:
172
+ """Returns a list of tool calls from the messages"""
173
+
174
+ tool_calls = []
175
+ if self.runs:
176
+ session_runs = self.runs
177
+ for run_response in session_runs[::-1]:
178
+ if run_response and run_response.messages:
179
+ for message in run_response.messages or []:
180
+ if message.tool_calls:
181
+ for tool_call in message.tool_calls:
182
+ tool_calls.append(tool_call)
183
+ if num_calls and len(tool_calls) >= num_calls:
184
+ return tool_calls
185
+ return tool_calls
186
+
187
+ def get_messages_for_session(
188
+ self,
189
+ user_role: str = "user",
190
+ assistant_role: Optional[List[str]] = None,
191
+ skip_history_messages: bool = True,
192
+ ) -> List[Message]:
193
+ """Returns a list of messages for the session that iterate through user message and assistant response."""
194
+
195
+ if assistant_role is None:
196
+ # TODO: Check if we still need CHATBOT as a role
197
+ assistant_role = ["assistant", "model", "CHATBOT"]
198
+
199
+ final_messages: List[Message] = []
200
+ session_runs = self.runs
201
+ if not session_runs:
202
+ return []
203
+
204
+ for run_response in session_runs:
205
+ if run_response and run_response.messages:
206
+ user_message_from_run = None
207
+ assistant_message_from_run = None
208
+
209
+ # Start from the beginning to look for the user message
210
+ for message in run_response.messages or []:
211
+ if hasattr(message, "from_history") and message.from_history and skip_history_messages:
212
+ continue
213
+ if message.role == user_role:
214
+ user_message_from_run = message
215
+ break
216
+
217
+ # Start from the end to look for the assistant response
218
+ for message in run_response.messages[::-1]:
219
+ if hasattr(message, "from_history") and message.from_history and skip_history_messages:
220
+ continue
221
+ if message.role in assistant_role:
222
+ assistant_message_from_run = message
223
+ break
224
+
225
+ if user_message_from_run and assistant_message_from_run:
226
+ final_messages.append(user_message_from_run)
227
+ final_messages.append(assistant_message_from_run)
228
+ return final_messages
229
+
230
+ def get_session_summary(self) -> Optional[SessionSummary]:
231
+ """Get the session summary for the session"""
232
+
233
+ if self.summary is None:
234
+ return None
235
+ return self.summary
236
+
237
+ # Chat History functions
238
+ def get_chat_history(self) -> List[Message]:
239
+ """Get the chat history for the session"""
240
+
241
+ messages = []
242
+ for run in self.runs or []:
243
+ messages.extend([msg for msg in run.messages or [] if not msg.from_history])
244
+ return messages
@@ -0,0 +1,225 @@
1
+ from dataclasses import dataclass
2
+ from datetime import datetime
3
+ from textwrap import dedent
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union, cast
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from agno.models.base import Model
9
+ from agno.run.agent import Message
10
+ from agno.utils.log import log_debug, log_warning
11
+
12
+ # TODO: Look into moving all managers into a separate dir
13
+ if TYPE_CHECKING:
14
+ from agno.session import Session
15
+ from agno.session.agent import AgentSession
16
+ from agno.session.team import TeamSession
17
+
18
+
19
+ @dataclass
20
+ class SessionSummary:
21
+ """Model for Session Summary."""
22
+
23
+ summary: str
24
+ topics: Optional[List[str]] = None
25
+ updated_at: Optional[datetime] = None
26
+
27
+ def to_dict(self) -> Dict[str, Any]:
28
+ _dict = {
29
+ "summary": self.summary,
30
+ "topics": self.topics,
31
+ "updated_at": self.updated_at.isoformat() if self.updated_at else None,
32
+ }
33
+ return {k: v for k, v in _dict.items() if v is not None}
34
+
35
+ @classmethod
36
+ def from_dict(cls, data: Dict[str, Any]) -> "SessionSummary":
37
+ updated_at = data.get("updated_at")
38
+ if updated_at:
39
+ data["updated_at"] = datetime.fromisoformat(updated_at)
40
+ return cls(**data)
41
+
42
+
43
+ class SessionSummaryResponse(BaseModel):
44
+ """Model for Session Summary."""
45
+
46
+ summary: str = Field(
47
+ ...,
48
+ description="Summary of the session. Be concise and focus on only important information. Do not make anything up.",
49
+ )
50
+ topics: Optional[List[str]] = Field(None, description="Topics discussed in the session.")
51
+
52
+ def to_dict(self) -> Dict[str, Any]:
53
+ return self.model_dump(exclude_none=True)
54
+
55
+ def to_json(self) -> str:
56
+ return self.model_dump_json(exclude_none=True, indent=2)
57
+
58
+
59
+ @dataclass
60
+ class SessionSummaryManager:
61
+ """Session Summary Manager"""
62
+
63
+ # Model used for session summary generation
64
+ model: Optional[Model] = None
65
+
66
+ # Prompt used for session summary generation
67
+ session_summary_prompt: Optional[str] = None
68
+
69
+ # Whether session summaries were created in the last run
70
+ summaries_updated: bool = False
71
+
72
+ def get_response_format(self, model: "Model") -> Union[Dict[str, Any], Type[BaseModel]]: # type: ignore
73
+ if model.supports_native_structured_outputs:
74
+ return SessionSummaryResponse
75
+
76
+ elif model.supports_json_schema_outputs:
77
+ return {
78
+ "type": "json_schema",
79
+ "json_schema": {
80
+ "name": SessionSummaryResponse.__name__,
81
+ "schema": SessionSummaryResponse.model_json_schema(),
82
+ },
83
+ }
84
+ else:
85
+ return {"type": "json_object"}
86
+
87
+ def get_system_message(
88
+ self,
89
+ conversation: List[Message],
90
+ response_format: Union[Dict[str, Any], Type[BaseModel]],
91
+ ) -> Message:
92
+ if self.session_summary_prompt is not None:
93
+ return Message(role="system", content=self.session_summary_prompt)
94
+
95
+ system_prompt = dedent("""\
96
+ Analyze the following conversation between a user and an assistant, and extract the following details:
97
+ - Summary (str): Provide a concise summary of the session, focusing on important information that would be helpful for future interactions.
98
+ - Topics (Optional[List[str]]): List the topics discussed in the session.
99
+ Keep the summary concise and to the point. Only include relevant information.
100
+
101
+ <conversation>
102
+ """)
103
+ conversation_messages = []
104
+ for message in conversation:
105
+ if message.role == "user":
106
+ conversation_messages.append(f"User: {message.content}")
107
+ elif message.role in ["assistant", "model"]:
108
+ conversation_messages.append(f"Assistant: {message.content}\n")
109
+ system_prompt += "\n".join(conversation_messages)
110
+ system_prompt += "</conversation>"
111
+
112
+ if response_format == {"type": "json_object"}:
113
+ from agno.utils.prompts import get_json_output_prompt
114
+
115
+ system_prompt += "\n" + get_json_output_prompt(SessionSummaryResponse) # type: ignore
116
+
117
+ return Message(role="system", content=system_prompt)
118
+
119
+ def _prepare_summary_messages(
120
+ self,
121
+ session: Optional["Session"] = None,
122
+ ) -> List[Message]:
123
+ """Prepare messages for session summary generation"""
124
+ self.model = cast(Model, self.model)
125
+ response_format = self.get_response_format(self.model)
126
+
127
+ return (
128
+ [
129
+ self.get_system_message(
130
+ conversation=session.get_messages_for_session(), # type: ignore
131
+ response_format=response_format,
132
+ ),
133
+ Message(role="user", content="Provide the summary of the conversation."),
134
+ ]
135
+ if session
136
+ else []
137
+ )
138
+
139
+ def _process_summary_response(self, summary_response, session_summary_model: "Model") -> Optional[SessionSummary]: # type: ignore
140
+ """Process the model response into a SessionSummary"""
141
+ from datetime import datetime
142
+
143
+ if summary_response is None:
144
+ return None
145
+
146
+ # Handle native structured outputs
147
+ if (
148
+ session_summary_model.supports_native_structured_outputs
149
+ and summary_response.parsed is not None
150
+ and isinstance(summary_response.parsed, SessionSummaryResponse)
151
+ ):
152
+ session_summary = SessionSummary(
153
+ summary=summary_response.parsed.summary,
154
+ topics=summary_response.parsed.topics,
155
+ updated_at=datetime.now(),
156
+ )
157
+ self.summary = session_summary
158
+ log_debug("Session summary created", center=True)
159
+ return session_summary
160
+
161
+ # Handle string responses
162
+ if isinstance(summary_response.content, str):
163
+ try:
164
+ from agno.utils.string import parse_response_model_str
165
+
166
+ parsed_summary: SessionSummaryResponse = parse_response_model_str( # type: ignore
167
+ summary_response.content, SessionSummaryResponse
168
+ )
169
+
170
+ if parsed_summary is not None:
171
+ session_summary = SessionSummary(
172
+ summary=parsed_summary.summary, topics=parsed_summary.topics, updated_at=datetime.now()
173
+ )
174
+ self.summary = session_summary
175
+ log_debug("Session summary created", center=True)
176
+ return session_summary
177
+ else:
178
+ log_warning("Failed to parse session summary response")
179
+
180
+ except Exception as e:
181
+ log_warning(f"Failed to parse session summary response: {e}")
182
+
183
+ return None
184
+
185
+ def create_session_summary(
186
+ self,
187
+ session: Union["AgentSession", "TeamSession"],
188
+ ) -> Optional[SessionSummary]:
189
+ """Creates a summary of the session"""
190
+ log_debug("Creating session summary", center=True)
191
+ if self.model is None:
192
+ return None
193
+
194
+ messages = self._prepare_summary_messages(session)
195
+ response_format = self.get_response_format(self.model)
196
+
197
+ summary_response = self.model.response(messages=messages, response_format=response_format)
198
+ session_summary = self._process_summary_response(summary_response, self.model)
199
+
200
+ if session is not None and session_summary is not None:
201
+ session.summary = session_summary
202
+ self.summaries_updated = True
203
+
204
+ return session_summary
205
+
206
+ async def acreate_session_summary(
207
+ self,
208
+ session: Union["AgentSession", "TeamSession"],
209
+ ) -> Optional[SessionSummary]:
210
+ """Creates a summary of the session"""
211
+ log_debug("Creating session summary", center=True)
212
+ if self.model is None:
213
+ return None
214
+
215
+ messages = self._prepare_summary_messages(session)
216
+ response_format = self.get_response_format(self.model)
217
+
218
+ summary_response = await self.model.aresponse(messages=messages, response_format=response_format)
219
+ session_summary = self._process_summary_response(summary_response, self.model)
220
+
221
+ if session is not None and session_summary is not None:
222
+ session.summary = session_summary
223
+ self.summaries_updated = True
224
+
225
+ return session_summary