agno 1.8.1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  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/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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -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 +204 -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 +413 -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 +179 -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 +58 -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 +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -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/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -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 +2961 -4253
  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 +42 -22
  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 +18 -13
  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 +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  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 +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  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 +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  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 +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
@@ -7,8 +7,10 @@ from pydantic import BaseModel
7
7
 
8
8
  from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
9
9
  from agno.models.message import Citations, Message
10
+ from agno.models.metrics import Metrics
10
11
  from agno.models.response import ToolExecution
11
- from agno.run.base import BaseRunResponseEvent, RunResponseExtraData, RunStatus
12
+ from agno.reasoning.step import ReasoningStep
13
+ from agno.run.base import BaseRunOutputEvent, MessageReferences, RunStatus
12
14
  from agno.utils.log import logger
13
15
 
14
16
 
@@ -16,8 +18,8 @@ class RunEvent(str, Enum):
16
18
  """Events that can be sent by the run() functions"""
17
19
 
18
20
  run_started = "RunStarted"
19
- run_response_content = "RunResponseContent"
20
- run_intermediate_response_content = "RunIntermediateResponseContent"
21
+ run_content = "RunContent"
22
+ run_intermediate_content = "RunIntermediateContent"
21
23
  run_completed = "RunCompleted"
22
24
  run_error = "RunError"
23
25
  run_cancelled = "RunCancelled"
@@ -43,14 +45,20 @@ class RunEvent(str, Enum):
43
45
 
44
46
 
45
47
  @dataclass
46
- class BaseAgentRunResponseEvent(BaseRunResponseEvent):
48
+ class BaseAgentRunEvent(BaseRunOutputEvent):
47
49
  created_at: int = field(default_factory=lambda: int(time()))
48
50
  event: str = ""
49
51
  agent_id: str = ""
50
52
  agent_name: str = ""
51
53
  run_id: Optional[str] = None
52
54
  session_id: Optional[str] = None
53
- team_session_id: Optional[str] = None
55
+
56
+ # Step context for workflow execution
57
+ workflow_id: Optional[str] = None
58
+ workflow_run_id: Optional[str] = None
59
+ step_id: Optional[str] = None
60
+ step_name: Optional[str] = None
61
+ step_index: Optional[int] = None
54
62
  tools: Optional[List[ToolExecution]] = None
55
63
 
56
64
  # For backwards compatibility
@@ -70,7 +78,7 @@ class BaseAgentRunResponseEvent(BaseRunResponseEvent):
70
78
 
71
79
 
72
80
  @dataclass
73
- class RunResponseStartedEvent(BaseAgentRunResponseEvent):
81
+ class RunStartedEvent(BaseAgentRunEvent):
74
82
  """Event sent when the run starts"""
75
83
 
76
84
  event: str = RunEvent.run_started.value
@@ -79,44 +87,50 @@ class RunResponseStartedEvent(BaseAgentRunResponseEvent):
79
87
 
80
88
 
81
89
  @dataclass
82
- class RunResponseContentEvent(BaseAgentRunResponseEvent):
83
- """Main event for each delta of the RunResponse"""
90
+ class RunContentEvent(BaseAgentRunEvent):
91
+ """Main event for each delta of the RunOutput"""
84
92
 
85
- event: str = RunEvent.run_response_content.value
93
+ event: str = RunEvent.run_content.value
86
94
  content: Optional[Any] = None
87
95
  content_type: str = "str"
88
- thinking: Optional[str] = None
89
96
  reasoning_content: Optional[str] = None
90
97
  citations: Optional[Citations] = None
91
98
  response_audio: Optional[AudioResponse] = None # Model audio response
92
99
  image: Optional[ImageArtifact] = None # Image attached to the response
93
- extra_data: Optional[RunResponseExtraData] = None
100
+ references: Optional[List[MessageReferences]] = None
101
+ additional_input: Optional[List[Message]] = None
102
+ reasoning_steps: Optional[List[ReasoningStep]] = None
103
+ reasoning_messages: Optional[List[Message]] = None
94
104
 
95
105
 
96
106
  @dataclass
97
- class IntermediateRunResponseContentEvent(BaseAgentRunResponseEvent):
98
- event: str = RunEvent.run_intermediate_response_content.value
107
+ class IntermediateRunContentEvent(BaseAgentRunEvent):
108
+ event: str = RunEvent.run_intermediate_content.value
99
109
  content: Optional[Any] = None
100
110
  content_type: str = "str"
101
111
 
102
112
 
103
113
  @dataclass
104
- class RunResponseCompletedEvent(BaseAgentRunResponseEvent):
114
+ class RunCompletedEvent(BaseAgentRunEvent):
105
115
  event: str = RunEvent.run_completed.value
106
116
  content: Optional[Any] = None
107
117
  content_type: str = "str"
108
118
  reasoning_content: Optional[str] = None
109
- thinking: Optional[str] = None
110
119
  citations: Optional[Citations] = None
111
120
  images: Optional[List[ImageArtifact]] = None # Images attached to the response
112
121
  videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
113
122
  audio: Optional[List[AudioArtifact]] = None # Audio attached to the response
114
123
  response_audio: Optional[AudioResponse] = None # Model audio response
115
- extra_data: Optional[RunResponseExtraData] = None
124
+ references: Optional[List[MessageReferences]] = None
125
+ additional_input: Optional[List[Message]] = None
126
+ reasoning_steps: Optional[List[ReasoningStep]] = None
127
+ reasoning_messages: Optional[List[Message]] = None
128
+ metadata: Optional[Dict[str, Any]] = None
129
+ metrics: Optional[Metrics] = None
116
130
 
117
131
 
118
132
  @dataclass
119
- class RunResponsePausedEvent(BaseAgentRunResponseEvent):
133
+ class RunPausedEvent(BaseAgentRunEvent):
120
134
  event: str = RunEvent.run_paused.value
121
135
  tools: Optional[List[ToolExecution]] = None
122
136
 
@@ -126,18 +140,18 @@ class RunResponsePausedEvent(BaseAgentRunResponseEvent):
126
140
 
127
141
 
128
142
  @dataclass
129
- class RunResponseContinuedEvent(BaseAgentRunResponseEvent):
143
+ class RunContinuedEvent(BaseAgentRunEvent):
130
144
  event: str = RunEvent.run_continued.value
131
145
 
132
146
 
133
147
  @dataclass
134
- class RunResponseErrorEvent(BaseAgentRunResponseEvent):
148
+ class RunErrorEvent(BaseAgentRunEvent):
135
149
  event: str = RunEvent.run_error.value
136
150
  content: Optional[str] = None
137
151
 
138
152
 
139
153
  @dataclass
140
- class RunResponseCancelledEvent(BaseAgentRunResponseEvent):
154
+ class RunCancelledEvent(BaseAgentRunEvent):
141
155
  event: str = RunEvent.run_cancelled.value
142
156
  reason: Optional[str] = None
143
157
 
@@ -147,22 +161,22 @@ class RunResponseCancelledEvent(BaseAgentRunResponseEvent):
147
161
 
148
162
 
149
163
  @dataclass
150
- class MemoryUpdateStartedEvent(BaseAgentRunResponseEvent):
164
+ class MemoryUpdateStartedEvent(BaseAgentRunEvent):
151
165
  event: str = RunEvent.memory_update_started.value
152
166
 
153
167
 
154
168
  @dataclass
155
- class MemoryUpdateCompletedEvent(BaseAgentRunResponseEvent):
169
+ class MemoryUpdateCompletedEvent(BaseAgentRunEvent):
156
170
  event: str = RunEvent.memory_update_completed.value
157
171
 
158
172
 
159
173
  @dataclass
160
- class ReasoningStartedEvent(BaseAgentRunResponseEvent):
174
+ class ReasoningStartedEvent(BaseAgentRunEvent):
161
175
  event: str = RunEvent.reasoning_started.value
162
176
 
163
177
 
164
178
  @dataclass
165
- class ReasoningStepEvent(BaseAgentRunResponseEvent):
179
+ class ReasoningStepEvent(BaseAgentRunEvent):
166
180
  event: str = RunEvent.reasoning_step.value
167
181
  content: Optional[Any] = None
168
182
  content_type: str = "str"
@@ -170,20 +184,20 @@ class ReasoningStepEvent(BaseAgentRunResponseEvent):
170
184
 
171
185
 
172
186
  @dataclass
173
- class ReasoningCompletedEvent(BaseAgentRunResponseEvent):
187
+ class ReasoningCompletedEvent(BaseAgentRunEvent):
174
188
  event: str = RunEvent.reasoning_completed.value
175
189
  content: Optional[Any] = None
176
190
  content_type: str = "str"
177
191
 
178
192
 
179
193
  @dataclass
180
- class ToolCallStartedEvent(BaseAgentRunResponseEvent):
194
+ class ToolCallStartedEvent(BaseAgentRunEvent):
181
195
  event: str = RunEvent.tool_call_started.value
182
196
  tool: Optional[ToolExecution] = None
183
197
 
184
198
 
185
199
  @dataclass
186
- class ToolCallCompletedEvent(BaseAgentRunResponseEvent):
200
+ class ToolCallCompletedEvent(BaseAgentRunEvent):
187
201
  event: str = RunEvent.tool_call_completed.value
188
202
  tool: Optional[ToolExecution] = None
189
203
  content: Optional[Any] = None
@@ -193,34 +207,34 @@ class ToolCallCompletedEvent(BaseAgentRunResponseEvent):
193
207
 
194
208
 
195
209
  @dataclass
196
- class ParserModelResponseStartedEvent(BaseAgentRunResponseEvent):
210
+ class ParserModelResponseStartedEvent(BaseAgentRunEvent):
197
211
  event: str = RunEvent.parser_model_response_started.value
198
212
 
199
213
 
200
214
  @dataclass
201
- class ParserModelResponseCompletedEvent(BaseAgentRunResponseEvent):
215
+ class ParserModelResponseCompletedEvent(BaseAgentRunEvent):
202
216
  event: str = RunEvent.parser_model_response_completed.value
203
217
 
204
218
 
205
219
  @dataclass
206
- class OutputModelResponseStartedEvent(BaseAgentRunResponseEvent):
220
+ class OutputModelResponseStartedEvent(BaseAgentRunEvent):
207
221
  event: str = RunEvent.output_model_response_started.value
208
222
 
209
223
 
210
224
  @dataclass
211
- class OutputModelResponseCompletedEvent(BaseAgentRunResponseEvent):
225
+ class OutputModelResponseCompletedEvent(BaseAgentRunEvent):
212
226
  event: str = RunEvent.output_model_response_completed.value
213
227
 
214
228
 
215
- RunResponseEvent = Union[
216
- RunResponseStartedEvent,
217
- RunResponseContentEvent,
218
- IntermediateRunResponseContentEvent,
219
- RunResponseCompletedEvent,
220
- RunResponseErrorEvent,
221
- RunResponseCancelledEvent,
222
- RunResponsePausedEvent,
223
- RunResponseContinuedEvent,
229
+ RunOutputEvent = Union[
230
+ RunStartedEvent,
231
+ RunContentEvent,
232
+ IntermediateRunContentEvent,
233
+ RunCompletedEvent,
234
+ RunErrorEvent,
235
+ RunCancelledEvent,
236
+ RunPausedEvent,
237
+ RunContinuedEvent,
224
238
  ReasoningStartedEvent,
225
239
  ReasoningStepEvent,
226
240
  ReasoningCompletedEvent,
@@ -237,14 +251,14 @@ RunResponseEvent = Union[
237
251
 
238
252
  # Map event string to dataclass
239
253
  RUN_EVENT_TYPE_REGISTRY = {
240
- RunEvent.run_started.value: RunResponseStartedEvent,
241
- RunEvent.run_response_content.value: RunResponseContentEvent,
242
- RunEvent.run_intermediate_response_content.value: IntermediateRunResponseContentEvent,
243
- RunEvent.run_completed.value: RunResponseCompletedEvent,
244
- RunEvent.run_error.value: RunResponseErrorEvent,
245
- RunEvent.run_cancelled.value: RunResponseCancelledEvent,
246
- RunEvent.run_paused.value: RunResponsePausedEvent,
247
- RunEvent.run_continued.value: RunResponseContinuedEvent,
254
+ RunEvent.run_started.value: RunStartedEvent,
255
+ RunEvent.run_content.value: RunContentEvent,
256
+ RunEvent.run_intermediate_content.value: IntermediateRunContentEvent,
257
+ RunEvent.run_completed.value: RunCompletedEvent,
258
+ RunEvent.run_error.value: RunErrorEvent,
259
+ RunEvent.run_cancelled.value: RunCancelledEvent,
260
+ RunEvent.run_paused.value: RunPausedEvent,
261
+ RunEvent.run_continued.value: RunContinuedEvent,
248
262
  RunEvent.reasoning_started.value: ReasoningStartedEvent,
249
263
  RunEvent.reasoning_step.value: ReasoningStepEvent,
250
264
  RunEvent.reasoning_completed.value: ReasoningCompletedEvent,
@@ -259,7 +273,7 @@ RUN_EVENT_TYPE_REGISTRY = {
259
273
  }
260
274
 
261
275
 
262
- def run_response_event_from_dict(data: dict) -> BaseRunResponseEvent:
276
+ def run_output_event_from_dict(data: dict) -> BaseRunOutputEvent:
263
277
  event_type = data.get("event", "")
264
278
  cls = RUN_EVENT_TYPE_REGISTRY.get(event_type)
265
279
  if not cls:
@@ -268,37 +282,53 @@ def run_response_event_from_dict(data: dict) -> BaseRunResponseEvent:
268
282
 
269
283
 
270
284
  @dataclass
271
- class RunResponse:
285
+ class RunOutput:
272
286
  """Response returned by Agent.run() or Workflow.run() functions"""
273
287
 
274
- content: Optional[Any] = None
275
- content_type: str = "str"
276
- thinking: Optional[str] = None
277
- reasoning_content: Optional[str] = None
278
- messages: Optional[List[Message]] = None
279
- metrics: Optional[Dict[str, Any]] = None
280
- model: Optional[str] = None
281
- model_provider: Optional[str] = None
282
288
  run_id: Optional[str] = None
283
289
  agent_id: Optional[str] = None
284
290
  agent_name: Optional[str] = None
285
291
  session_id: Optional[str] = None
286
- team_session_id: Optional[str] = None
292
+ parent_run_id: Optional[str] = None
287
293
  workflow_id: Optional[str] = None
294
+ user_id: Optional[str] = None
295
+
296
+ content: Optional[Any] = None
297
+ content_type: str = "str"
298
+
299
+ reasoning_content: Optional[str] = None
300
+ reasoning_steps: Optional[List[ReasoningStep]] = None
301
+ reasoning_messages: Optional[List[Message]] = None
302
+
303
+ model: Optional[str] = None
304
+ model_provider: Optional[str] = None
305
+ messages: Optional[List[Message]] = None
306
+ metrics: Optional[Metrics] = None
307
+ additional_input: Optional[List[Message]] = None
308
+
288
309
  tools: Optional[List[ToolExecution]] = None
289
- formatted_tool_calls: Optional[List[str]] = None
310
+
290
311
  images: Optional[List[ImageArtifact]] = None # Images attached to the response
291
312
  videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
292
313
  audio: Optional[List[AudioArtifact]] = None # Audio attached to the response
293
314
  response_audio: Optional[AudioResponse] = None # Model audio response
315
+
294
316
  citations: Optional[Citations] = None
295
- extra_data: Optional[RunResponseExtraData] = None
317
+ references: Optional[List[MessageReferences]] = None
318
+
319
+ metadata: Optional[Dict[str, Any]] = None
320
+
296
321
  created_at: int = field(default_factory=lambda: int(time()))
297
322
 
298
- events: Optional[List[RunResponseEvent]] = None
323
+ events: Optional[List[RunOutputEvent]] = None
299
324
 
300
325
  status: RunStatus = RunStatus.running
301
326
 
327
+ # === FOREIGN KEY RELATIONSHIPS ===
328
+ # These fields establish relationships to parent workflow/step structures
329
+ # and should be treated as foreign keys for data integrity
330
+ workflow_step_id: Optional[str] = None # FK: Points to StepOutput.step_id
331
+
302
332
  @property
303
333
  def is_paused(self):
304
334
  return self.status == RunStatus.paused
@@ -328,16 +358,23 @@ class RunResponse:
328
358
  not in [
329
359
  "messages",
330
360
  "tools",
331
- "extra_data",
361
+ "metadata",
332
362
  "images",
333
363
  "videos",
334
364
  "audio",
335
365
  "response_audio",
336
366
  "citations",
337
367
  "events",
368
+ "additional_input",
369
+ "reasoning_steps",
370
+ "reasoning_messages",
371
+ "references",
338
372
  ]
339
373
  }
340
374
 
375
+ if self.metrics is not None:
376
+ _dict["metrics"] = self.metrics.to_dict() if isinstance(self.metrics, Metrics) else self.metrics
377
+
341
378
  if self.events is not None:
342
379
  _dict["events"] = [e.to_dict() for e in self.events]
343
380
 
@@ -347,10 +384,20 @@ class RunResponse:
347
384
  if self.messages is not None:
348
385
  _dict["messages"] = [m.to_dict() for m in self.messages]
349
386
 
350
- if self.extra_data is not None:
351
- _dict["extra_data"] = (
352
- self.extra_data.to_dict() if isinstance(self.extra_data, RunResponseExtraData) else self.extra_data
353
- )
387
+ if self.metadata is not None:
388
+ _dict["metadata"] = self.metadata
389
+
390
+ if self.additional_input is not None:
391
+ _dict["additional_input"] = [m.to_dict() for m in self.additional_input]
392
+
393
+ if self.reasoning_messages is not None:
394
+ _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
395
+
396
+ if self.reasoning_steps is not None:
397
+ _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
398
+
399
+ if self.references is not None:
400
+ _dict["references"] = [r.model_dump() for r in self.references]
354
401
 
355
402
  if self.images is not None:
356
403
  _dict["images"] = []
@@ -413,9 +460,12 @@ class RunResponse:
413
460
  return json.dumps(_dict, indent=2)
414
461
 
415
462
  @classmethod
416
- def from_dict(cls, data: Dict[str, Any]) -> "RunResponse":
463
+ def from_dict(cls, data: Dict[str, Any]) -> "RunOutput":
464
+ if "run" in data:
465
+ data = data.pop("run")
466
+
417
467
  events = data.pop("events", None)
418
- events = [run_response_event_from_dict(event) for event in events] if events else None
468
+ events = [run_output_event_from_dict(event) for event in events] if events else None
419
469
 
420
470
  messages = data.pop("messages", None)
421
471
  messages = [Message.model_validate(message) for message in messages] if messages else None
@@ -438,12 +488,30 @@ class RunResponse:
438
488
  response_audio = data.pop("response_audio", None)
439
489
  response_audio = AudioResponse.model_validate(response_audio) if response_audio else None
440
490
 
441
- # To make it backwards compatible
442
- if "event" in data:
443
- data.pop("event")
491
+ metrics = data.pop("metrics", None)
492
+ if metrics:
493
+ metrics = Metrics(**metrics)
494
+
495
+ additional_input = data.pop("additional_input", None)
496
+
497
+ if additional_input is not None:
498
+ additional_input = [Message.model_validate(message) for message in additional_input]
499
+
500
+ reasoning_steps = data.pop("reasoning_steps", None)
501
+ if reasoning_steps is not None:
502
+ reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
503
+
504
+ reasoning_messages = data.pop("reasoning_messages", None)
505
+ if reasoning_messages is not None:
506
+ reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
507
+
508
+ references = data.pop("references", None)
509
+ if references is not None:
510
+ references = [MessageReferences.model_validate(reference) for reference in references]
444
511
 
445
512
  return cls(
446
513
  messages=messages,
514
+ metrics=metrics,
447
515
  citations=citations,
448
516
  tools=tools,
449
517
  images=images,
@@ -451,6 +519,10 @@ class RunResponse:
451
519
  videos=videos,
452
520
  response_audio=response_audio,
453
521
  events=events,
522
+ additional_input=additional_input,
523
+ reasoning_steps=reasoning_steps,
524
+ reasoning_messages=reasoning_messages,
525
+ references=references,
454
526
  **data,
455
527
  )
456
528
 
agno/run/base.py CHANGED
@@ -1,18 +1,19 @@
1
1
  from dataclasses import asdict, dataclass
2
2
  from enum import Enum
3
- from typing import Any, Dict, List, Optional
3
+ from typing import Any, Dict
4
4
 
5
5
  from pydantic import BaseModel
6
6
 
7
7
  from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
8
8
  from agno.models.message import Citations, Message, MessageReferences
9
+ from agno.models.metrics import Metrics
9
10
  from agno.models.response import ToolExecution
10
11
  from agno.reasoning.step import ReasoningStep
11
12
  from agno.utils.log import log_error
12
13
 
13
14
 
14
15
  @dataclass
15
- class BaseRunResponseEvent:
16
+ class BaseRunOutputEvent:
16
17
  def to_dict(self) -> Dict[str, Any]:
17
18
  _dict = {
18
19
  k: v
@@ -22,7 +23,7 @@ class BaseRunResponseEvent:
22
23
  not in [
23
24
  "tools",
24
25
  "tool",
25
- "extra_data",
26
+ "metadata",
26
27
  "image",
27
28
  "images",
28
29
  "videos",
@@ -30,13 +31,28 @@ class BaseRunResponseEvent:
30
31
  "response_audio",
31
32
  "citations",
32
33
  "member_responses",
34
+ "reasoning_messages",
35
+ "reasoning_steps",
36
+ "references",
37
+ "additional_input",
38
+ "metrics",
33
39
  ]
34
40
  }
35
41
 
36
- if hasattr(self, "extra_data") and self.extra_data is not None:
37
- _dict["extra_data"] = (
38
- self.extra_data.to_dict() if isinstance(self.extra_data, RunResponseExtraData) else self.extra_data
39
- )
42
+ if hasattr(self, "metadata") and self.metadata is not None:
43
+ _dict["metadata"] = self.metadata
44
+
45
+ if hasattr(self, "additional_input") and self.additional_input is not None:
46
+ _dict["additional_input"] = [m.to_dict() for m in self.additional_input]
47
+
48
+ if hasattr(self, "reasoning_messages") and self.reasoning_messages is not None:
49
+ _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
50
+
51
+ if hasattr(self, "reasoning_steps") and self.reasoning_steps is not None:
52
+ _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
53
+
54
+ if hasattr(self, "references") and self.references is not None:
55
+ _dict["references"] = [r.model_dump() for r in self.references]
40
56
 
41
57
  if hasattr(self, "member_responses") and self.member_responses:
42
58
  _dict["member_responses"] = [response.to_dict() for response in self.member_responses]
@@ -100,6 +116,9 @@ class BaseRunResponseEvent:
100
116
  else:
101
117
  _dict["tool"] = self.tool
102
118
 
119
+ if hasattr(self, "metrics") and self.metrics is not None:
120
+ _dict["metrics"] = self.metrics.to_dict()
121
+
103
122
  return _dict
104
123
 
105
124
  def to_json(self) -> str:
@@ -139,13 +158,25 @@ class BaseRunResponseEvent:
139
158
  if response_audio:
140
159
  data["response_audio"] = AudioResponse.model_validate(response_audio)
141
160
 
142
- extra_data = data.pop("extra_data", None)
143
- if extra_data:
144
- data["extra_data"] = RunResponseExtraData.from_dict(extra_data)
161
+ additional_input = data.pop("additional_input", None)
162
+ if additional_input is not None:
163
+ data["additional_input"] = [Message.model_validate(message) for message in additional_input]
145
164
 
146
- # To make it backwards compatible
147
- if "event" in data:
148
- data.pop("event")
165
+ reasoning_steps = data.pop("reasoning_steps", None)
166
+ if reasoning_steps is not None:
167
+ data["reasoning_steps"] = [ReasoningStep.model_validate(step) for step in reasoning_steps]
168
+
169
+ reasoning_messages = data.pop("reasoning_messages", None)
170
+ if reasoning_messages is not None:
171
+ data["reasoning_messages"] = [Message.model_validate(message) for message in reasoning_messages]
172
+
173
+ references = data.pop("references", None)
174
+ if references is not None:
175
+ data["references"] = [MessageReferences.model_validate(reference) for reference in references]
176
+
177
+ metrics = data.pop("metrics", None)
178
+ if metrics:
179
+ data["metrics"] = Metrics(**metrics)
149
180
 
150
181
  return cls(**data)
151
182
 
@@ -158,51 +189,6 @@ class BaseRunResponseEvent:
158
189
  return False
159
190
 
160
191
 
161
- @dataclass
162
- class RunResponseExtraData:
163
- references: Optional[List[MessageReferences]] = None
164
- add_messages: Optional[List[Message]] = None
165
- reasoning_steps: Optional[List[ReasoningStep]] = None
166
- reasoning_messages: Optional[List[Message]] = None
167
-
168
- def to_dict(self) -> Dict[str, Any]:
169
- _dict = {}
170
- if self.add_messages is not None:
171
- _dict["add_messages"] = [m.to_dict() for m in self.add_messages]
172
- if self.reasoning_messages is not None:
173
- _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
174
- if self.reasoning_steps is not None:
175
- _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
176
- if self.references is not None:
177
- _dict["references"] = [r.model_dump() for r in self.references]
178
- return _dict
179
-
180
- @classmethod
181
- def from_dict(cls, data: Dict[str, Any]) -> "RunResponseExtraData":
182
- add_messages = data.pop("add_messages", None)
183
- if add_messages is not None:
184
- add_messages = [Message.model_validate(message) for message in add_messages]
185
-
186
- reasoning_steps = data.pop("reasoning_steps", None)
187
- if reasoning_steps is not None:
188
- reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
189
-
190
- reasoning_messages = data.pop("reasoning_messages", None)
191
- if reasoning_messages is not None:
192
- reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
193
-
194
- references = data.pop("references", None)
195
- if references is not None:
196
- references = [MessageReferences.model_validate(reference) for reference in references]
197
-
198
- return cls(
199
- add_messages=add_messages,
200
- reasoning_steps=reasoning_steps,
201
- reasoning_messages=reasoning_messages,
202
- references=references,
203
- )
204
-
205
-
206
192
  class RunStatus(str, Enum):
207
193
  """State of the main run response"""
208
194
 
agno/run/cancel.py ADDED
@@ -0,0 +1,83 @@
1
+ """Run cancellation management."""
2
+
3
+ import threading
4
+ from typing import Dict
5
+
6
+ from agno.exceptions import RunCancelledException
7
+ from agno.utils.log import logger
8
+
9
+
10
+ class RunCancellationManager:
11
+ """Manages cancellation state for agent runs."""
12
+
13
+ def __init__(self):
14
+ self._cancelled_runs: Dict[str, bool] = {}
15
+ self._lock = threading.Lock()
16
+
17
+ def register_run(self, run_id: str) -> None:
18
+ """Register a new run as not cancelled."""
19
+ with self._lock:
20
+ self._cancelled_runs[run_id] = False
21
+ logger.debug(f"Registered run {run_id} for cancellation tracking")
22
+
23
+ def cancel_run(self, run_id: str) -> bool:
24
+ """Cancel a run by marking it as cancelled.
25
+
26
+ Returns:
27
+ bool: True if run was found and cancelled, False if run not found.
28
+ """
29
+ with self._lock:
30
+ if run_id in self._cancelled_runs:
31
+ self._cancelled_runs[run_id] = True
32
+ logger.info(f"Run {run_id} marked for cancellation")
33
+ return True
34
+ else:
35
+ logger.warning(f"Attempted to cancel unknown run {run_id}")
36
+ return False
37
+
38
+ def is_cancelled(self, run_id: str) -> bool:
39
+ """Check if a run is cancelled."""
40
+ with self._lock:
41
+ return self._cancelled_runs.get(run_id, False)
42
+
43
+ def cleanup_run(self, run_id: str) -> None:
44
+ """Remove a run from tracking (called when run completes)."""
45
+ with self._lock:
46
+ if run_id in self._cancelled_runs:
47
+ del self._cancelled_runs[run_id]
48
+ logger.debug(f"Cleaned up cancellation tracking for run {run_id}")
49
+
50
+ def raise_if_cancelled(self, run_id: str) -> None:
51
+ """Check if a run should be cancelled and raise exception if so."""
52
+ if self.is_cancelled(run_id):
53
+ logger.info(f"Cancelling run {run_id}")
54
+ raise RunCancelledException(f"Run {run_id} was cancelled")
55
+
56
+ def get_active_runs(self) -> Dict[str, bool]:
57
+ """Get all currently tracked runs and their cancellation status."""
58
+ with self._lock:
59
+ return self._cancelled_runs.copy()
60
+
61
+
62
+ # Global cancellation manager instance
63
+ _cancellation_manager = RunCancellationManager()
64
+
65
+
66
+ def register_run(run_id: str) -> None:
67
+ """Register a new run for cancellation tracking."""
68
+ _cancellation_manager.register_run(run_id)
69
+
70
+
71
+ def cancel_run(run_id: str) -> bool:
72
+ """Cancel a run."""
73
+ return _cancellation_manager.cancel_run(run_id)
74
+
75
+
76
+ def cleanup_run(run_id: str) -> None:
77
+ """Clean up cancellation tracking for a completed run."""
78
+ _cancellation_manager.cleanup_run(run_id)
79
+
80
+
81
+ def raise_if_cancelled(run_id: str) -> None:
82
+ """Check if a run should be cancelled and raise exception if so."""
83
+ _cancellation_manager.raise_if_cancelled(run_id)