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/run/team.py CHANGED
@@ -1,23 +1,25 @@
1
1
  from dataclasses import asdict, dataclass, field
2
2
  from enum import Enum
3
3
  from time import time
4
- from typing import Any, Dict, List, Optional, Union
4
+ from typing import Any, Dict, List, Optional, Sequence, Union
5
5
 
6
6
  from pydantic import BaseModel
7
7
 
8
- from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
8
+ from agno.media import Audio, File, Image, Video
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.run.response import RunEvent, RunResponse, RunResponseEvent, run_response_event_from_dict
12
+ from agno.reasoning.step import ReasoningStep
13
+ from agno.run.agent import RunEvent, RunOutput, RunOutputEvent, run_output_event_from_dict
14
+ from agno.run.base import BaseRunOutputEvent, MessageReferences, RunStatus
13
15
 
14
16
 
15
17
  class TeamRunEvent(str, Enum):
16
18
  """Events that can be sent by the run() functions"""
17
19
 
18
20
  run_started = "TeamRunStarted"
19
- run_response_content = "TeamRunResponseContent"
20
- run_intermediate_response_content = "TeamRunIntermediateResponseContent"
21
+ run_content = "TeamRunContent"
22
+ run_intermediate_content = "TeamRunIntermediateContent"
21
23
  run_completed = "TeamRunCompleted"
22
24
  run_error = "TeamRunError"
23
25
  run_cancelled = "TeamRunCancelled"
@@ -38,32 +40,38 @@ class TeamRunEvent(str, Enum):
38
40
  output_model_response_started = "TeamOutputModelResponseStarted"
39
41
  output_model_response_completed = "TeamOutputModelResponseCompleted"
40
42
 
43
+ custom_event = "CustomEvent"
44
+
41
45
 
42
46
  @dataclass
43
- class BaseTeamRunResponseEvent(BaseRunResponseEvent):
47
+ class BaseTeamRunEvent(BaseRunOutputEvent):
44
48
  created_at: int = field(default_factory=lambda: int(time()))
45
49
  event: str = ""
46
50
  team_id: str = ""
47
51
  team_name: str = ""
48
52
  run_id: Optional[str] = None
49
53
  session_id: Optional[str] = None
50
- # If the team is a member of a team, this will be the session id of the parent team
51
- team_session_id: Optional[str] = None
54
+
55
+ workflow_id: Optional[str] = None
56
+ workflow_run_id: Optional[str] = None # This is the workflow's run_id
57
+ step_id: Optional[str] = None
58
+ step_name: Optional[str] = None
59
+ step_index: Optional[int] = None
52
60
 
53
61
  # For backwards compatibility
54
62
  content: Optional[Any] = None
55
63
 
56
64
  @classmethod
57
- def from_dict(cls, data: Dict[str, Any]) -> "BaseTeamRunResponseEvent":
65
+ def from_dict(cls, data: Dict[str, Any]) -> "BaseTeamRunEvent":
58
66
  member_responses = data.pop("member_responses", None)
59
67
  event = super().from_dict(data)
60
68
 
61
69
  member_responses_final = []
62
70
  for response in member_responses or []:
63
71
  if "agent_id" in response:
64
- run_response_parsed = RunResponse.from_dict(response)
72
+ run_response_parsed = RunOutput.from_dict(response)
65
73
  else:
66
- run_response_parsed = TeamRunResponse.from_dict(response) # type: ignore
74
+ run_response_parsed = TeamRunOutput.from_dict(response) # type: ignore
67
75
  member_responses_final.append(run_response_parsed)
68
76
 
69
77
  if member_responses_final:
@@ -73,7 +81,7 @@ class BaseTeamRunResponseEvent(BaseRunResponseEvent):
73
81
 
74
82
 
75
83
  @dataclass
76
- class RunResponseStartedEvent(BaseTeamRunResponseEvent):
84
+ class RunStartedEvent(BaseTeamRunEvent):
77
85
  """Event sent when the run starts"""
78
86
 
79
87
  event: str = TeamRunEvent.run_started.value
@@ -82,71 +90,82 @@ class RunResponseStartedEvent(BaseTeamRunResponseEvent):
82
90
 
83
91
 
84
92
  @dataclass
85
- class RunResponseContentEvent(BaseTeamRunResponseEvent):
86
- """Main event for each delta of the RunResponse"""
93
+ class RunContentEvent(BaseTeamRunEvent):
94
+ """Main event for each delta of the RunOutput"""
87
95
 
88
- event: str = TeamRunEvent.run_response_content.value
96
+ event: str = TeamRunEvent.run_content.value
89
97
  content: Optional[Any] = None
90
98
  content_type: str = "str"
91
- thinking: Optional[str] = None
99
+ reasoning_content: Optional[str] = None
92
100
  citations: Optional[Citations] = None
93
- response_audio: Optional[AudioResponse] = None # Model audio response
94
- image: Optional[ImageArtifact] = None # Image attached to the response
95
- extra_data: Optional[RunResponseExtraData] = None
101
+ response_audio: Optional[Audio] = None # Model audio response
102
+ image: Optional[Image] = None # Image attached to the response
103
+ references: Optional[List[MessageReferences]] = None
104
+ additional_input: Optional[List[Message]] = None
105
+ reasoning_steps: Optional[List[ReasoningStep]] = None
106
+ reasoning_messages: Optional[List[Message]] = None
96
107
 
97
108
 
98
109
  @dataclass
99
- class IntermediateRunResponseContentEvent(BaseTeamRunResponseEvent):
100
- event: str = TeamRunEvent.run_intermediate_response_content.value
110
+ class IntermediateRunContentEvent(BaseTeamRunEvent):
111
+ event: str = TeamRunEvent.run_intermediate_content.value
101
112
  content: Optional[Any] = None
102
113
  content_type: str = "str"
103
114
 
104
115
 
105
116
  @dataclass
106
- class RunResponseCompletedEvent(BaseTeamRunResponseEvent):
117
+ class RunCompletedEvent(BaseTeamRunEvent):
107
118
  event: str = TeamRunEvent.run_completed.value
108
119
  content: Optional[Any] = None
109
120
  content_type: str = "str"
110
121
  reasoning_content: Optional[str] = None
111
- thinking: Optional[str] = None
112
122
  citations: Optional[Citations] = None
113
- images: Optional[List[ImageArtifact]] = None # Images attached to the response
114
- videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
115
- audio: Optional[List[AudioArtifact]] = None # Audio attached to the response
116
- response_audio: Optional[AudioResponse] = None # Model audio response
117
- extra_data: Optional[RunResponseExtraData] = None
118
- member_responses: List[Union["TeamRunResponse", RunResponse]] = field(default_factory=list)
123
+ images: Optional[List[Image]] = None # Images attached to the response
124
+ videos: Optional[List[Video]] = None # Videos attached to the response
125
+ audio: Optional[List[Audio]] = None # Audio attached to the response
126
+ response_audio: Optional[Audio] = None # Model audio response
127
+ references: Optional[List[MessageReferences]] = None
128
+ additional_input: Optional[List[Message]] = None
129
+ reasoning_steps: Optional[List[ReasoningStep]] = None
130
+ reasoning_messages: Optional[List[Message]] = None
131
+ member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
132
+ metadata: Optional[Dict[str, Any]] = None
133
+ metrics: Optional[Metrics] = None
119
134
 
120
135
 
121
136
  @dataclass
122
- class RunResponseErrorEvent(BaseTeamRunResponseEvent):
137
+ class RunErrorEvent(BaseTeamRunEvent):
123
138
  event: str = TeamRunEvent.run_error.value
124
139
  content: Optional[str] = None
125
140
 
126
141
 
127
142
  @dataclass
128
- class RunResponseCancelledEvent(BaseTeamRunResponseEvent):
143
+ class RunCancelledEvent(BaseTeamRunEvent):
129
144
  event: str = TeamRunEvent.run_cancelled.value
130
145
  reason: Optional[str] = None
131
146
 
147
+ @property
148
+ def is_cancelled(self):
149
+ return True
150
+
132
151
 
133
152
  @dataclass
134
- class MemoryUpdateStartedEvent(BaseTeamRunResponseEvent):
153
+ class MemoryUpdateStartedEvent(BaseTeamRunEvent):
135
154
  event: str = TeamRunEvent.memory_update_started.value
136
155
 
137
156
 
138
157
  @dataclass
139
- class MemoryUpdateCompletedEvent(BaseTeamRunResponseEvent):
158
+ class MemoryUpdateCompletedEvent(BaseTeamRunEvent):
140
159
  event: str = TeamRunEvent.memory_update_completed.value
141
160
 
142
161
 
143
162
  @dataclass
144
- class ReasoningStartedEvent(BaseTeamRunResponseEvent):
163
+ class ReasoningStartedEvent(BaseTeamRunEvent):
145
164
  event: str = TeamRunEvent.reasoning_started.value
146
165
 
147
166
 
148
167
  @dataclass
149
- class ReasoningStepEvent(BaseTeamRunResponseEvent):
168
+ class ReasoningStepEvent(BaseTeamRunEvent):
150
169
  event: str = TeamRunEvent.reasoning_step.value
151
170
  content: Optional[Any] = None
152
171
  content_type: str = "str"
@@ -154,55 +173,60 @@ class ReasoningStepEvent(BaseTeamRunResponseEvent):
154
173
 
155
174
 
156
175
  @dataclass
157
- class ReasoningCompletedEvent(BaseTeamRunResponseEvent):
176
+ class ReasoningCompletedEvent(BaseTeamRunEvent):
158
177
  event: str = TeamRunEvent.reasoning_completed.value
159
178
  content: Optional[Any] = None
160
179
  content_type: str = "str"
161
180
 
162
181
 
163
182
  @dataclass
164
- class ToolCallStartedEvent(BaseTeamRunResponseEvent):
183
+ class ToolCallStartedEvent(BaseTeamRunEvent):
165
184
  event: str = TeamRunEvent.tool_call_started.value
166
185
  tool: Optional[ToolExecution] = None
167
186
 
168
187
 
169
188
  @dataclass
170
- class ToolCallCompletedEvent(BaseTeamRunResponseEvent):
189
+ class ToolCallCompletedEvent(BaseTeamRunEvent):
171
190
  event: str = TeamRunEvent.tool_call_completed.value
172
191
  tool: Optional[ToolExecution] = None
173
192
  content: Optional[Any] = None
174
- images: Optional[List[ImageArtifact]] = None # Images produced by the tool call
175
- videos: Optional[List[VideoArtifact]] = None # Videos produced by the tool call
176
- audio: Optional[List[AudioArtifact]] = None # Audio produced by the tool call
193
+ images: Optional[List[Image]] = None # Images produced by the tool call
194
+ videos: Optional[List[Video]] = None # Videos produced by the tool call
195
+ audio: Optional[List[Audio]] = None # Audio produced by the tool call
177
196
 
178
197
 
179
198
  @dataclass
180
- class ParserModelResponseStartedEvent(BaseTeamRunResponseEvent):
199
+ class ParserModelResponseStartedEvent(BaseTeamRunEvent):
181
200
  event: str = TeamRunEvent.parser_model_response_started.value
182
201
 
183
202
 
184
203
  @dataclass
185
- class ParserModelResponseCompletedEvent(BaseTeamRunResponseEvent):
204
+ class ParserModelResponseCompletedEvent(BaseTeamRunEvent):
186
205
  event: str = TeamRunEvent.parser_model_response_completed.value
187
206
 
188
207
 
189
208
  @dataclass
190
- class OutputModelResponseStartedEvent(BaseTeamRunResponseEvent):
209
+ class OutputModelResponseStartedEvent(BaseTeamRunEvent):
191
210
  event: str = TeamRunEvent.output_model_response_started.value
192
211
 
193
212
 
194
213
  @dataclass
195
- class OutputModelResponseCompletedEvent(BaseTeamRunResponseEvent):
214
+ class OutputModelResponseCompletedEvent(BaseTeamRunEvent):
196
215
  event: str = TeamRunEvent.output_model_response_completed.value
197
216
 
198
217
 
199
- TeamRunResponseEvent = Union[
200
- RunResponseStartedEvent,
201
- RunResponseContentEvent,
202
- IntermediateRunResponseContentEvent,
203
- RunResponseCompletedEvent,
204
- RunResponseErrorEvent,
205
- RunResponseCancelledEvent,
218
+ @dataclass
219
+ class CustomEvent(BaseTeamRunEvent):
220
+ event: str = TeamRunEvent.custom_event.value
221
+
222
+
223
+ TeamRunOutputEvent = Union[
224
+ RunStartedEvent,
225
+ RunContentEvent,
226
+ IntermediateRunContentEvent,
227
+ RunCompletedEvent,
228
+ RunErrorEvent,
229
+ RunCancelledEvent,
206
230
  ReasoningStartedEvent,
207
231
  ReasoningStepEvent,
208
232
  ReasoningCompletedEvent,
@@ -214,16 +238,17 @@ TeamRunResponseEvent = Union[
214
238
  ParserModelResponseCompletedEvent,
215
239
  OutputModelResponseStartedEvent,
216
240
  OutputModelResponseCompletedEvent,
241
+ CustomEvent,
217
242
  ]
218
243
 
219
244
  # Map event string to dataclass for team events
220
245
  TEAM_RUN_EVENT_TYPE_REGISTRY = {
221
- TeamRunEvent.run_started.value: RunResponseStartedEvent,
222
- TeamRunEvent.run_response_content.value: RunResponseContentEvent,
223
- TeamRunEvent.run_intermediate_response_content.value: IntermediateRunResponseContentEvent,
224
- TeamRunEvent.run_completed.value: RunResponseCompletedEvent,
225
- TeamRunEvent.run_error.value: RunResponseErrorEvent,
226
- TeamRunEvent.run_cancelled.value: RunResponseCancelledEvent,
246
+ TeamRunEvent.run_started.value: RunStartedEvent,
247
+ TeamRunEvent.run_content.value: RunContentEvent,
248
+ TeamRunEvent.run_intermediate_content.value: IntermediateRunContentEvent,
249
+ TeamRunEvent.run_completed.value: RunCompletedEvent,
250
+ TeamRunEvent.run_error.value: RunErrorEvent,
251
+ TeamRunEvent.run_cancelled.value: RunCancelledEvent,
227
252
  TeamRunEvent.reasoning_started.value: ReasoningStartedEvent,
228
253
  TeamRunEvent.reasoning_step.value: ReasoningStepEvent,
229
254
  TeamRunEvent.reasoning_completed.value: ReasoningCompletedEvent,
@@ -235,13 +260,14 @@ TEAM_RUN_EVENT_TYPE_REGISTRY = {
235
260
  TeamRunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
236
261
  TeamRunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
237
262
  TeamRunEvent.output_model_response_completed.value: OutputModelResponseCompletedEvent,
263
+ TeamRunEvent.custom_event.value: CustomEvent,
238
264
  }
239
265
 
240
266
 
241
- def team_run_response_event_from_dict(data: dict) -> BaseTeamRunResponseEvent:
267
+ def team_run_output_event_from_dict(data: dict) -> BaseTeamRunEvent:
242
268
  event_type = data.get("event", "")
243
269
  if event_type in {e.value for e in RunEvent}:
244
- return run_response_event_from_dict(data) # type: ignore
270
+ return run_output_event_from_dict(data) # type: ignore
245
271
  else:
246
272
  event_class = TEAM_RUN_EVENT_TYPE_REGISTRY.get(event_type)
247
273
  if not event_class:
@@ -250,46 +276,126 @@ def team_run_response_event_from_dict(data: dict) -> BaseTeamRunResponseEvent:
250
276
 
251
277
 
252
278
  @dataclass
253
- class TeamRunResponse:
279
+ class TeamRunInput:
280
+ """Container for the raw input data passed to Agent.run().
281
+ This captures the original input exactly as provided by the user,
282
+ separate from the processed messages that go to the model.
283
+ Attributes:
284
+ input_content: The literal input message/content passed to run()
285
+ images: Images directly passed to run()
286
+ videos: Videos directly passed to run()
287
+ audios: Audio files directly passed to run()
288
+ files: Files directly passed to run()
289
+ """
290
+
291
+ input_content: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None
292
+ images: Optional[Sequence[Image]] = None
293
+ videos: Optional[Sequence[Video]] = None
294
+ audios: Optional[Sequence[Audio]] = None
295
+ files: Optional[Sequence[File]] = None
296
+
297
+ def to_dict(self) -> Dict[str, Any]:
298
+ """Convert to dictionary representation"""
299
+ result: Dict[str, Any] = {}
300
+
301
+ if self.input_content is not None:
302
+ if isinstance(self.input_content, (str)):
303
+ result["input_content"] = self.input_content
304
+ elif isinstance(self.input_content, BaseModel):
305
+ result["input_content"] = self.input_content.model_dump(exclude_none=True)
306
+ elif isinstance(self.input_content, Message):
307
+ result["input_content"] = self.input_content.to_dict()
308
+ elif (
309
+ isinstance(self.input_content, list)
310
+ and self.input_content
311
+ and isinstance(self.input_content[0], Message)
312
+ ):
313
+ result["input_content"] = [m.to_dict() for m in self.input_content]
314
+ else:
315
+ result["input_content"] = self.input_content
316
+
317
+ if self.images:
318
+ result["images"] = [img.to_dict() for img in self.images]
319
+ if self.videos:
320
+ result["videos"] = [vid.to_dict() for vid in self.videos]
321
+ if self.audios:
322
+ result["audios"] = [aud.to_dict() for aud in self.audios]
323
+
324
+ return result
325
+
326
+ @classmethod
327
+ def from_dict(cls, data: Dict[str, Any]) -> "TeamRunInput":
328
+ """Create TeamRunInput from dictionary"""
329
+ images = None
330
+ if data.get("images"):
331
+ images = [Image.model_validate(img_data) for img_data in data["images"]]
332
+
333
+ videos = None
334
+ if data.get("videos"):
335
+ videos = [Video.model_validate(vid_data) for vid_data in data["videos"]]
336
+
337
+ audios = None
338
+ if data.get("audios"):
339
+ audios = [Audio.model_validate(aud_data) for aud_data in data["audios"]]
340
+
341
+ files = None
342
+ if data.get("files"):
343
+ files = [File.model_validate(file_data) for file_data in data["files"]]
344
+
345
+ return cls(input_content=data.get("input_content"), images=images, videos=videos, audios=audios, files=files)
346
+
347
+
348
+ @dataclass
349
+ class TeamRunOutput:
254
350
  """Response returned by Team.run() functions"""
255
351
 
256
352
  content: Optional[Any] = None
257
353
  content_type: str = "str"
258
- thinking: Optional[str] = None
259
354
  messages: Optional[List[Message]] = None
260
- metrics: Optional[Dict[str, Any]] = None
355
+ metrics: Optional[Metrics] = None
261
356
  model: Optional[str] = None
262
357
  model_provider: Optional[str] = None
263
358
 
264
- member_responses: List[Union["TeamRunResponse", RunResponse]] = field(default_factory=list)
359
+ member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
265
360
 
266
361
  run_id: Optional[str] = None
267
362
  team_id: Optional[str] = None
268
363
  team_name: Optional[str] = None
269
364
  session_id: Optional[str] = None
270
- # If the team is a member of a team, this will be the session id of the parent team
271
- team_session_id: Optional[str] = None
365
+ parent_run_id: Optional[str] = None
272
366
 
273
367
  tools: Optional[List[ToolExecution]] = None
274
- formatted_tool_calls: Optional[List[str]] = None
275
368
 
276
- images: Optional[List[ImageArtifact]] = None # Images from member runs
277
- videos: Optional[List[VideoArtifact]] = None # Videos from member runs
278
- audio: Optional[List[AudioArtifact]] = None # Audio from member runs
369
+ images: Optional[List[Image]] = None # Images from member runs
370
+ videos: Optional[List[Video]] = None # Videos from member runs
371
+ audio: Optional[List[Audio]] = None # Audio from member runs
372
+
373
+ response_audio: Optional[Audio] = None # Model audio response
279
374
 
280
- response_audio: Optional[AudioResponse] = None # Model audio response
375
+ # Input media and messages from user
376
+ input: Optional[TeamRunInput] = None
281
377
 
282
378
  reasoning_content: Optional[str] = None
283
379
 
284
380
  citations: Optional[Citations] = None
285
381
 
286
- extra_data: Optional[RunResponseExtraData] = None
382
+ metadata: Optional[Dict[str, Any]] = None
383
+
384
+ references: Optional[List[MessageReferences]] = None
385
+ additional_input: Optional[List[Message]] = None
386
+ reasoning_steps: Optional[List[ReasoningStep]] = None
387
+ reasoning_messages: Optional[List[Message]] = None
287
388
  created_at: int = field(default_factory=lambda: int(time()))
288
389
 
289
- events: Optional[List[Union[RunResponseEvent, TeamRunResponseEvent]]] = None
390
+ events: Optional[List[Union[RunOutputEvent, TeamRunOutputEvent]]] = None
290
391
 
291
392
  status: RunStatus = RunStatus.running
292
393
 
394
+ # === FOREIGN KEY RELATIONSHIPS ===
395
+ # These fields establish relationships to parent workflow/step structures
396
+ # and should be treated as foreign keys for data integrity
397
+ workflow_step_id: Optional[str] = None # FK: Points to StepOutput.step_id
398
+
293
399
  @property
294
400
  def is_paused(self):
295
401
  return self.status == RunStatus.paused
@@ -308,13 +414,17 @@ class TeamRunResponse:
308
414
  "messages",
309
415
  "status",
310
416
  "tools",
311
- "extra_data",
417
+ "metadata",
312
418
  "images",
313
419
  "videos",
314
420
  "audio",
315
421
  "response_audio",
316
422
  "citations",
317
423
  "events",
424
+ "additional_input",
425
+ "reasoning_steps",
426
+ "reasoning_messages",
427
+ "references",
318
428
  ]
319
429
  }
320
430
  if self.events is not None:
@@ -326,8 +436,20 @@ class TeamRunResponse:
326
436
  if self.messages is not None:
327
437
  _dict["messages"] = [m.to_dict() for m in self.messages]
328
438
 
329
- if self.extra_data is not None:
330
- _dict["extra_data"] = self.extra_data.to_dict()
439
+ if self.metadata is not None:
440
+ _dict["metadata"] = self.metadata
441
+
442
+ if self.additional_input is not None:
443
+ _dict["additional_input"] = [m.to_dict() for m in self.additional_input]
444
+
445
+ if self.reasoning_messages is not None:
446
+ _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
447
+
448
+ if self.reasoning_steps is not None:
449
+ _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
450
+
451
+ if self.references is not None:
452
+ _dict["references"] = [r.model_dump() for r in self.references]
331
453
 
332
454
  if self.images is not None:
333
455
  _dict["images"] = [img.to_dict() for img in self.images]
@@ -361,6 +483,9 @@ class TeamRunResponse:
361
483
  else:
362
484
  _dict["tools"].append(tool)
363
485
 
486
+ if self.input is not None:
487
+ _dict["input"] = self.input.to_dict()
488
+
364
489
  return _dict
365
490
 
366
491
  def to_json(self) -> str:
@@ -371,17 +496,17 @@ class TeamRunResponse:
371
496
  return json.dumps(_dict, indent=2)
372
497
 
373
498
  @classmethod
374
- def from_dict(cls, data: Dict[str, Any]) -> "TeamRunResponse":
499
+ def from_dict(cls, data: Dict[str, Any]) -> "TeamRunOutput":
375
500
  events = data.pop("events", None)
376
501
  final_events = []
377
502
  for event in events or []:
378
503
  if "agent_id" in event:
379
504
  # Use the factory from response.py for agent events
380
- from agno.run.response import run_response_event_from_dict
505
+ from agno.run.agent import run_output_event_from_dict
381
506
 
382
- event = run_response_event_from_dict(event)
507
+ event = run_output_event_from_dict(event)
383
508
  else:
384
- event = team_run_response_event_from_dict(event)
509
+ event = team_run_output_event_from_dict(event)
385
510
  final_events.append(event)
386
511
  events = final_events
387
512
 
@@ -389,48 +514,70 @@ class TeamRunResponse:
389
514
  messages = [Message.model_validate(message) for message in messages] if messages else None
390
515
 
391
516
  member_responses = data.pop("member_responses", [])
392
- parsed_member_responses: List[Union["TeamRunResponse", RunResponse]] = []
517
+ parsed_member_responses: List[Union["TeamRunOutput", RunOutput]] = []
393
518
  if member_responses:
394
519
  for response in member_responses:
395
520
  if "agent_id" in response:
396
- parsed_member_responses.append(RunResponse.from_dict(response))
521
+ parsed_member_responses.append(RunOutput.from_dict(response))
397
522
  else:
398
523
  parsed_member_responses.append(cls.from_dict(response))
399
524
 
400
- extra_data = data.pop("extra_data", None)
401
- if extra_data is not None:
402
- extra_data = RunResponseExtraData.from_dict(extra_data)
525
+ additional_input = data.pop("additional_input", None)
526
+ if additional_input is not None:
527
+ additional_input = [Message.model_validate(message) for message in additional_input]
528
+
529
+ reasoning_steps = data.pop("reasoning_steps", None)
530
+ if reasoning_steps is not None:
531
+ reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
532
+
533
+ reasoning_messages = data.pop("reasoning_messages", None)
534
+ if reasoning_messages is not None:
535
+ reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
536
+
537
+ references = data.pop("references", None)
538
+ if references is not None:
539
+ references = [MessageReferences.model_validate(reference) for reference in references]
403
540
 
404
541
  images = data.pop("images", [])
405
- images = [ImageArtifact.model_validate(image) for image in images] if images else None
542
+ images = [Image.model_validate(image) for image in images] if images else None
406
543
 
407
544
  videos = data.pop("videos", [])
408
- videos = [VideoArtifact.model_validate(video) for video in videos] if videos else None
545
+ videos = [Video.model_validate(video) for video in videos] if videos else None
409
546
 
410
547
  audio = data.pop("audio", [])
411
- audio = [AudioArtifact.model_validate(audio) for audio in audio] if audio else None
548
+ audio = [Audio.model_validate(audio) for audio in audio] if audio else None
412
549
 
413
550
  tools = data.pop("tools", [])
414
551
  tools = [ToolExecution.from_dict(tool) for tool in tools] if tools else None
415
552
 
416
553
  response_audio = data.pop("response_audio", None)
417
- response_audio = AudioResponse.model_validate(response_audio) if response_audio else None
554
+ response_audio = Audio.model_validate(response_audio) if response_audio else None
555
+
556
+ input_data = data.pop("input", None)
557
+ input_obj = None
558
+ if input_data:
559
+ input_obj = TeamRunInput.from_dict(input_data)
560
+
561
+ metrics = data.pop("metrics", None)
562
+ if metrics:
563
+ metrics = Metrics(**metrics)
418
564
 
419
565
  citations = data.pop("citations", None)
420
566
  citations = Citations.model_validate(citations) if citations else None
421
567
 
422
- # To make it backwards compatible
423
- if "event" in data:
424
- data.pop("event")
425
-
426
568
  return cls(
427
569
  messages=messages,
570
+ metrics=metrics,
428
571
  member_responses=parsed_member_responses,
429
- extra_data=extra_data,
572
+ additional_input=additional_input,
573
+ reasoning_steps=reasoning_steps,
574
+ reasoning_messages=reasoning_messages,
575
+ references=references,
430
576
  images=images,
431
577
  videos=videos,
432
578
  audio=audio,
433
579
  response_audio=response_audio,
580
+ input=input_obj,
434
581
  citations=citations,
435
582
  tools=tools,
436
583
  events=events,
@@ -449,7 +596,7 @@ class TeamRunResponse:
449
596
  else:
450
597
  return json.dumps(self.content, **kwargs)
451
598
 
452
- def add_member_run(self, run_response: Union["TeamRunResponse", RunResponse]) -> None:
599
+ def add_member_run(self, run_response: Union["TeamRunOutput", RunOutput]) -> None:
453
600
  self.member_responses.append(run_response)
454
601
  if run_response.images is not None:
455
602
  if self.images is None: