agno 2.2.13__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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1335 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1160 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
agno/run/team.py ADDED
@@ -0,0 +1,753 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from enum import Enum
3
+ from time import time
4
+ from typing import Any, Dict, List, Optional, Sequence, Union
5
+
6
+ from pydantic import BaseModel
7
+
8
+ from agno.media import Audio, File, Image, Video
9
+ from agno.models.message import Citations, Message
10
+ from agno.models.metrics import Metrics
11
+ from agno.models.response import ToolExecution
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
15
+ from agno.utils.log import log_error
16
+ from agno.utils.media import (
17
+ reconstruct_audio_list,
18
+ reconstruct_files,
19
+ reconstruct_images,
20
+ reconstruct_response_audio,
21
+ reconstruct_videos,
22
+ )
23
+
24
+
25
+ @dataclass
26
+ class TeamRunInput:
27
+ """Container for the raw input data passed to Agent.run().
28
+ This captures the original input exactly as provided by the user,
29
+ separate from the processed messages that go to the model.
30
+ Attributes:
31
+ input_content: The literal input message/content passed to run()
32
+ images: Images directly passed to run()
33
+ videos: Videos directly passed to run()
34
+ audios: Audio files directly passed to run()
35
+ files: Files directly passed to run()
36
+ """
37
+
38
+ input_content: Union[str, List, Dict, Message, BaseModel, List[Message]]
39
+ images: Optional[Sequence[Image]] = None
40
+ videos: Optional[Sequence[Video]] = None
41
+ audios: Optional[Sequence[Audio]] = None
42
+ files: Optional[Sequence[File]] = None
43
+
44
+ def input_content_string(self) -> str:
45
+ import json
46
+
47
+ if isinstance(self.input_content, (str)):
48
+ return self.input_content
49
+ elif isinstance(self.input_content, BaseModel):
50
+ return self.input_content.model_dump_json(exclude_none=True)
51
+ elif isinstance(self.input_content, Message):
52
+ return json.dumps(self.input_content.to_dict())
53
+ elif isinstance(self.input_content, list) and self.input_content and isinstance(self.input_content[0], Message):
54
+ return json.dumps([m.to_dict() for m in self.input_content])
55
+ else:
56
+ return str(self.input_content)
57
+
58
+ def to_dict(self) -> Dict[str, Any]:
59
+ """Convert to dictionary representation"""
60
+ result: Dict[str, Any] = {}
61
+
62
+ if self.input_content is not None:
63
+ if isinstance(self.input_content, (str)):
64
+ result["input_content"] = self.input_content
65
+ elif isinstance(self.input_content, BaseModel):
66
+ result["input_content"] = self.input_content.model_dump(exclude_none=True)
67
+ elif isinstance(self.input_content, Message):
68
+ result["input_content"] = self.input_content.to_dict()
69
+
70
+ # Handle input_content provided as a list of Message objects
71
+ elif (
72
+ isinstance(self.input_content, list)
73
+ and self.input_content
74
+ and isinstance(self.input_content[0], Message)
75
+ ):
76
+ result["input_content"] = [m.to_dict() for m in self.input_content]
77
+
78
+ # Handle input_content provided as a list of dicts
79
+ elif (
80
+ isinstance(self.input_content, list) and self.input_content and isinstance(self.input_content[0], dict)
81
+ ):
82
+ for content in self.input_content:
83
+ # Handle media input
84
+ if isinstance(content, dict):
85
+ if content.get("images"):
86
+ content["images"] = [
87
+ img.to_dict() if isinstance(img, Image) else img for img in content["images"]
88
+ ]
89
+ if content.get("videos"):
90
+ content["videos"] = [
91
+ vid.to_dict() if isinstance(vid, Video) else vid for vid in content["videos"]
92
+ ]
93
+ if content.get("audios"):
94
+ content["audios"] = [
95
+ aud.to_dict() if isinstance(aud, Audio) else aud for aud in content["audios"]
96
+ ]
97
+ if content.get("files"):
98
+ content["files"] = [
99
+ file.to_dict() if isinstance(file, File) else file for file in content["files"]
100
+ ]
101
+ result["input_content"] = self.input_content
102
+ else:
103
+ result["input_content"] = self.input_content
104
+
105
+ if self.images:
106
+ result["images"] = [img.to_dict() for img in self.images]
107
+ if self.videos:
108
+ result["videos"] = [vid.to_dict() for vid in self.videos]
109
+ if self.audios:
110
+ result["audios"] = [aud.to_dict() for aud in self.audios]
111
+ if self.files:
112
+ result["files"] = [file.to_dict() for file in self.files]
113
+
114
+ return result
115
+
116
+ @classmethod
117
+ def from_dict(cls, data: Dict[str, Any]) -> "TeamRunInput":
118
+ """Create TeamRunInput from dictionary"""
119
+ images = reconstruct_images(data.get("images"))
120
+ videos = reconstruct_videos(data.get("videos"))
121
+ audios = reconstruct_audio_list(data.get("audios"))
122
+ files = reconstruct_files(data.get("files"))
123
+
124
+ return cls(
125
+ input_content=data.get("input_content", ""), images=images, videos=videos, audios=audios, files=files
126
+ )
127
+
128
+
129
+ class TeamRunEvent(str, Enum):
130
+ """Events that can be sent by the run() functions"""
131
+
132
+ run_started = "TeamRunStarted"
133
+ run_content = "TeamRunContent"
134
+ run_intermediate_content = "TeamRunIntermediateContent"
135
+ run_content_completed = "TeamRunContentCompleted"
136
+ run_completed = "TeamRunCompleted"
137
+ run_error = "TeamRunError"
138
+ run_cancelled = "TeamRunCancelled"
139
+
140
+ pre_hook_started = "TeamPreHookStarted"
141
+ pre_hook_completed = "TeamPreHookCompleted"
142
+
143
+ post_hook_started = "TeamPostHookStarted"
144
+ post_hook_completed = "TeamPostHookCompleted"
145
+
146
+ tool_call_started = "TeamToolCallStarted"
147
+ tool_call_completed = "TeamToolCallCompleted"
148
+
149
+ reasoning_started = "TeamReasoningStarted"
150
+ reasoning_step = "TeamReasoningStep"
151
+ reasoning_completed = "TeamReasoningCompleted"
152
+
153
+ memory_update_started = "TeamMemoryUpdateStarted"
154
+ memory_update_completed = "TeamMemoryUpdateCompleted"
155
+
156
+ session_summary_started = "TeamSessionSummaryStarted"
157
+ session_summary_completed = "TeamSessionSummaryCompleted"
158
+
159
+ parser_model_response_started = "TeamParserModelResponseStarted"
160
+ parser_model_response_completed = "TeamParserModelResponseCompleted"
161
+
162
+ output_model_response_started = "TeamOutputModelResponseStarted"
163
+ output_model_response_completed = "TeamOutputModelResponseCompleted"
164
+
165
+ custom_event = "CustomEvent"
166
+
167
+
168
+ @dataclass
169
+ class BaseTeamRunEvent(BaseRunOutputEvent):
170
+ created_at: int = field(default_factory=lambda: int(time()))
171
+ event: str = ""
172
+ team_id: str = ""
173
+ team_name: str = ""
174
+ run_id: Optional[str] = None
175
+ parent_run_id: Optional[str] = None
176
+ session_id: Optional[str] = None
177
+
178
+ workflow_id: Optional[str] = None
179
+ workflow_run_id: Optional[str] = None # This is the workflow's run_id
180
+ step_id: Optional[str] = None
181
+ step_name: Optional[str] = None
182
+ step_index: Optional[int] = None
183
+
184
+ # For backwards compatibility
185
+ content: Optional[Any] = None
186
+
187
+ @classmethod
188
+ def from_dict(cls, data: Dict[str, Any]) -> "BaseTeamRunEvent":
189
+ member_responses = data.pop("member_responses", None)
190
+ event = super().from_dict(data)
191
+
192
+ member_responses_final = []
193
+ for response in member_responses or []:
194
+ if "agent_id" in response:
195
+ run_response_parsed = RunOutput.from_dict(response)
196
+ else:
197
+ run_response_parsed = TeamRunOutput.from_dict(response) # type: ignore
198
+ member_responses_final.append(run_response_parsed)
199
+
200
+ if member_responses_final:
201
+ event.member_responses = member_responses_final
202
+
203
+ return event
204
+
205
+
206
+ @dataclass
207
+ class RunStartedEvent(BaseTeamRunEvent):
208
+ """Event sent when the run starts"""
209
+
210
+ event: str = TeamRunEvent.run_started.value
211
+ model: str = ""
212
+ model_provider: str = ""
213
+
214
+
215
+ @dataclass
216
+ class RunContentEvent(BaseTeamRunEvent):
217
+ """Main event for each delta of the RunOutput"""
218
+
219
+ event: str = TeamRunEvent.run_content.value
220
+ content: Optional[Any] = None
221
+ content_type: str = "str"
222
+ reasoning_content: Optional[str] = None
223
+ model_provider_data: Optional[Dict[str, Any]] = None
224
+ citations: Optional[Citations] = None
225
+ response_audio: Optional[Audio] = None # Model audio response
226
+ image: Optional[Image] = None # Image attached to the response
227
+ references: Optional[List[MessageReferences]] = None
228
+ additional_input: Optional[List[Message]] = None
229
+ reasoning_steps: Optional[List[ReasoningStep]] = None
230
+ reasoning_messages: Optional[List[Message]] = None
231
+
232
+
233
+ @dataclass
234
+ class IntermediateRunContentEvent(BaseTeamRunEvent):
235
+ event: str = TeamRunEvent.run_intermediate_content.value
236
+ content: Optional[Any] = None
237
+ content_type: str = "str"
238
+
239
+
240
+ @dataclass
241
+ class RunContentCompletedEvent(BaseTeamRunEvent):
242
+ event: str = TeamRunEvent.run_content_completed.value
243
+
244
+
245
+ @dataclass
246
+ class RunCompletedEvent(BaseTeamRunEvent):
247
+ event: str = TeamRunEvent.run_completed.value
248
+ content: Optional[Any] = None
249
+ content_type: str = "str"
250
+ reasoning_content: Optional[str] = None
251
+ citations: Optional[Citations] = None
252
+ model_provider_data: Optional[Dict[str, Any]] = None
253
+ images: Optional[List[Image]] = None # Images attached to the response
254
+ videos: Optional[List[Video]] = None # Videos attached to the response
255
+ audio: Optional[List[Audio]] = None # Audio attached to the response
256
+ response_audio: Optional[Audio] = None # Model audio response
257
+ references: Optional[List[MessageReferences]] = None
258
+ additional_input: Optional[List[Message]] = None
259
+ reasoning_steps: Optional[List[ReasoningStep]] = None
260
+ reasoning_messages: Optional[List[Message]] = None
261
+ member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
262
+ metadata: Optional[Dict[str, Any]] = None
263
+ metrics: Optional[Metrics] = None
264
+ session_state: Optional[Dict[str, Any]] = None
265
+
266
+
267
+ @dataclass
268
+ class RunErrorEvent(BaseTeamRunEvent):
269
+ event: str = TeamRunEvent.run_error.value
270
+ content: Optional[str] = None
271
+
272
+ # From exceptions
273
+ error_type: Optional[str] = None
274
+ error_id: Optional[str] = None
275
+ additional_data: Optional[Dict[str, Any]] = None
276
+
277
+
278
+ @dataclass
279
+ class RunCancelledEvent(BaseTeamRunEvent):
280
+ event: str = TeamRunEvent.run_cancelled.value
281
+ reason: Optional[str] = None
282
+
283
+ @property
284
+ def is_cancelled(self):
285
+ return True
286
+
287
+
288
+ @dataclass
289
+ class PreHookStartedEvent(BaseTeamRunEvent):
290
+ event: str = TeamRunEvent.pre_hook_started.value
291
+ pre_hook_name: Optional[str] = None
292
+ run_input: Optional[TeamRunInput] = None
293
+
294
+
295
+ @dataclass
296
+ class PreHookCompletedEvent(BaseTeamRunEvent):
297
+ event: str = TeamRunEvent.pre_hook_completed.value
298
+ pre_hook_name: Optional[str] = None
299
+ run_input: Optional[TeamRunInput] = None
300
+
301
+
302
+ @dataclass
303
+ class PostHookStartedEvent(BaseTeamRunEvent):
304
+ event: str = TeamRunEvent.post_hook_started.value
305
+ post_hook_name: Optional[str] = None
306
+
307
+
308
+ @dataclass
309
+ class PostHookCompletedEvent(BaseTeamRunEvent):
310
+ event: str = TeamRunEvent.post_hook_completed.value
311
+ post_hook_name: Optional[str] = None
312
+
313
+
314
+ @dataclass
315
+ class MemoryUpdateStartedEvent(BaseTeamRunEvent):
316
+ event: str = TeamRunEvent.memory_update_started.value
317
+
318
+
319
+ @dataclass
320
+ class MemoryUpdateCompletedEvent(BaseTeamRunEvent):
321
+ event: str = TeamRunEvent.memory_update_completed.value
322
+
323
+
324
+ @dataclass
325
+ class SessionSummaryStartedEvent(BaseTeamRunEvent):
326
+ event: str = TeamRunEvent.session_summary_started.value
327
+
328
+
329
+ @dataclass
330
+ class SessionSummaryCompletedEvent(BaseTeamRunEvent):
331
+ event: str = TeamRunEvent.session_summary_completed.value
332
+ session_summary: Optional[Any] = None
333
+
334
+
335
+ @dataclass
336
+ class ReasoningStartedEvent(BaseTeamRunEvent):
337
+ event: str = TeamRunEvent.reasoning_started.value
338
+
339
+
340
+ @dataclass
341
+ class ReasoningStepEvent(BaseTeamRunEvent):
342
+ event: str = TeamRunEvent.reasoning_step.value
343
+ content: Optional[Any] = None
344
+ content_type: str = "str"
345
+ reasoning_content: str = ""
346
+
347
+
348
+ @dataclass
349
+ class ReasoningCompletedEvent(BaseTeamRunEvent):
350
+ event: str = TeamRunEvent.reasoning_completed.value
351
+ content: Optional[Any] = None
352
+ content_type: str = "str"
353
+
354
+
355
+ @dataclass
356
+ class ToolCallStartedEvent(BaseTeamRunEvent):
357
+ event: str = TeamRunEvent.tool_call_started.value
358
+ tool: Optional[ToolExecution] = None
359
+
360
+
361
+ @dataclass
362
+ class ToolCallCompletedEvent(BaseTeamRunEvent):
363
+ event: str = TeamRunEvent.tool_call_completed.value
364
+ tool: Optional[ToolExecution] = None
365
+ content: Optional[Any] = None
366
+ images: Optional[List[Image]] = None # Images produced by the tool call
367
+ videos: Optional[List[Video]] = None # Videos produced by the tool call
368
+ audio: Optional[List[Audio]] = None # Audio produced by the tool call
369
+
370
+
371
+ @dataclass
372
+ class ParserModelResponseStartedEvent(BaseTeamRunEvent):
373
+ event: str = TeamRunEvent.parser_model_response_started.value
374
+
375
+
376
+ @dataclass
377
+ class ParserModelResponseCompletedEvent(BaseTeamRunEvent):
378
+ event: str = TeamRunEvent.parser_model_response_completed.value
379
+
380
+
381
+ @dataclass
382
+ class OutputModelResponseStartedEvent(BaseTeamRunEvent):
383
+ event: str = TeamRunEvent.output_model_response_started.value
384
+
385
+
386
+ @dataclass
387
+ class OutputModelResponseCompletedEvent(BaseTeamRunEvent):
388
+ event: str = TeamRunEvent.output_model_response_completed.value
389
+
390
+
391
+ @dataclass
392
+ class CustomEvent(BaseTeamRunEvent):
393
+ event: str = TeamRunEvent.custom_event.value
394
+
395
+ def __init__(self, **kwargs):
396
+ # Store arbitrary attributes directly on the instance
397
+ for key, value in kwargs.items():
398
+ setattr(self, key, value)
399
+
400
+
401
+ TeamRunOutputEvent = Union[
402
+ RunStartedEvent,
403
+ RunContentEvent,
404
+ IntermediateRunContentEvent,
405
+ RunContentCompletedEvent,
406
+ RunCompletedEvent,
407
+ RunErrorEvent,
408
+ RunCancelledEvent,
409
+ PreHookStartedEvent,
410
+ PreHookCompletedEvent,
411
+ ReasoningStartedEvent,
412
+ ReasoningStepEvent,
413
+ ReasoningCompletedEvent,
414
+ MemoryUpdateStartedEvent,
415
+ MemoryUpdateCompletedEvent,
416
+ SessionSummaryStartedEvent,
417
+ SessionSummaryCompletedEvent,
418
+ ToolCallStartedEvent,
419
+ ToolCallCompletedEvent,
420
+ ParserModelResponseStartedEvent,
421
+ ParserModelResponseCompletedEvent,
422
+ OutputModelResponseStartedEvent,
423
+ OutputModelResponseCompletedEvent,
424
+ CustomEvent,
425
+ ]
426
+
427
+ # Map event string to dataclass for team events
428
+ TEAM_RUN_EVENT_TYPE_REGISTRY = {
429
+ TeamRunEvent.run_started.value: RunStartedEvent,
430
+ TeamRunEvent.run_content.value: RunContentEvent,
431
+ TeamRunEvent.run_intermediate_content.value: IntermediateRunContentEvent,
432
+ TeamRunEvent.run_content_completed.value: RunContentCompletedEvent,
433
+ TeamRunEvent.run_completed.value: RunCompletedEvent,
434
+ TeamRunEvent.run_error.value: RunErrorEvent,
435
+ TeamRunEvent.run_cancelled.value: RunCancelledEvent,
436
+ TeamRunEvent.pre_hook_started.value: PreHookStartedEvent,
437
+ TeamRunEvent.pre_hook_completed.value: PreHookCompletedEvent,
438
+ TeamRunEvent.post_hook_started.value: PostHookStartedEvent,
439
+ TeamRunEvent.post_hook_completed.value: PostHookCompletedEvent,
440
+ TeamRunEvent.reasoning_started.value: ReasoningStartedEvent,
441
+ TeamRunEvent.reasoning_step.value: ReasoningStepEvent,
442
+ TeamRunEvent.reasoning_completed.value: ReasoningCompletedEvent,
443
+ TeamRunEvent.memory_update_started.value: MemoryUpdateStartedEvent,
444
+ TeamRunEvent.memory_update_completed.value: MemoryUpdateCompletedEvent,
445
+ TeamRunEvent.session_summary_started.value: SessionSummaryStartedEvent,
446
+ TeamRunEvent.session_summary_completed.value: SessionSummaryCompletedEvent,
447
+ TeamRunEvent.tool_call_started.value: ToolCallStartedEvent,
448
+ TeamRunEvent.tool_call_completed.value: ToolCallCompletedEvent,
449
+ TeamRunEvent.parser_model_response_started.value: ParserModelResponseStartedEvent,
450
+ TeamRunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
451
+ TeamRunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
452
+ TeamRunEvent.output_model_response_completed.value: OutputModelResponseCompletedEvent,
453
+ TeamRunEvent.custom_event.value: CustomEvent,
454
+ }
455
+
456
+
457
+ def team_run_output_event_from_dict(data: dict) -> BaseTeamRunEvent:
458
+ event_type = data.get("event", "")
459
+ if event_type in {e.value for e in RunEvent}:
460
+ return run_output_event_from_dict(data) # type: ignore
461
+ else:
462
+ event_class = TEAM_RUN_EVENT_TYPE_REGISTRY.get(event_type)
463
+ if not event_class:
464
+ raise ValueError(f"Unknown team event type: {event_type}")
465
+ return event_class.from_dict(data) # type: ignore
466
+
467
+
468
+ @dataclass
469
+ class TeamRunOutput:
470
+ """Response returned by Team.run() functions"""
471
+
472
+ run_id: Optional[str] = None
473
+ team_id: Optional[str] = None
474
+ team_name: Optional[str] = None
475
+ session_id: Optional[str] = None
476
+ parent_run_id: Optional[str] = None
477
+ user_id: Optional[str] = None
478
+
479
+ # Input media and messages from user
480
+ input: Optional[TeamRunInput] = None
481
+
482
+ content: Optional[Any] = None
483
+ content_type: str = "str"
484
+
485
+ messages: Optional[List[Message]] = None
486
+ metrics: Optional[Metrics] = None
487
+ model: Optional[str] = None
488
+ model_provider: Optional[str] = None
489
+
490
+ member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
491
+
492
+ tools: Optional[List[ToolExecution]] = None
493
+
494
+ images: Optional[List[Image]] = None # Images from member runs
495
+ videos: Optional[List[Video]] = None # Videos from member runs
496
+ audio: Optional[List[Audio]] = None # Audio from member runs
497
+ files: Optional[List[File]] = None # Files from member runs
498
+
499
+ response_audio: Optional[Audio] = None # Model audio response
500
+
501
+ reasoning_content: Optional[str] = None
502
+
503
+ citations: Optional[Citations] = None
504
+ model_provider_data: Optional[Dict[str, Any]] = None
505
+ metadata: Optional[Dict[str, Any]] = None
506
+ session_state: Optional[Dict[str, Any]] = None
507
+
508
+ references: Optional[List[MessageReferences]] = None
509
+ additional_input: Optional[List[Message]] = None
510
+ reasoning_steps: Optional[List[ReasoningStep]] = None
511
+ reasoning_messages: Optional[List[Message]] = None
512
+ created_at: int = field(default_factory=lambda: int(time()))
513
+
514
+ events: Optional[List[Union[RunOutputEvent, TeamRunOutputEvent]]] = None
515
+
516
+ status: RunStatus = RunStatus.running
517
+
518
+ # === FOREIGN KEY RELATIONSHIPS ===
519
+ # These fields establish relationships to parent workflow/step structures
520
+ # and should be treated as foreign keys for data integrity
521
+ workflow_step_id: Optional[str] = None # FK: Points to StepOutput.step_id
522
+
523
+ @property
524
+ def is_paused(self):
525
+ return self.status == RunStatus.paused
526
+
527
+ @property
528
+ def is_cancelled(self):
529
+ return self.status == RunStatus.cancelled
530
+
531
+ def to_dict(self) -> Dict[str, Any]:
532
+ _dict = {
533
+ k: v
534
+ for k, v in asdict(self).items()
535
+ if v is not None
536
+ and k
537
+ not in [
538
+ "messages",
539
+ "status",
540
+ "tools",
541
+ "metadata",
542
+ "images",
543
+ "videos",
544
+ "audio",
545
+ "files",
546
+ "response_audio",
547
+ "citations",
548
+ "events",
549
+ "additional_input",
550
+ "reasoning_steps",
551
+ "reasoning_messages",
552
+ "references",
553
+ ]
554
+ }
555
+ if self.events is not None:
556
+ _dict["events"] = [e.to_dict() for e in self.events]
557
+
558
+ if self.status is not None:
559
+ _dict["status"] = self.status.value if isinstance(self.status, RunStatus) else self.status
560
+
561
+ if self.messages is not None:
562
+ _dict["messages"] = [m.to_dict() for m in self.messages]
563
+
564
+ if self.metadata is not None:
565
+ _dict["metadata"] = self.metadata
566
+
567
+ if self.additional_input is not None:
568
+ _dict["additional_input"] = [m.to_dict() for m in self.additional_input]
569
+
570
+ if self.reasoning_messages is not None:
571
+ _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
572
+
573
+ if self.reasoning_steps is not None:
574
+ _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
575
+
576
+ if self.references is not None:
577
+ _dict["references"] = [r.model_dump() for r in self.references]
578
+
579
+ if self.images is not None:
580
+ _dict["images"] = [img.to_dict() for img in self.images]
581
+
582
+ if self.videos is not None:
583
+ _dict["videos"] = [vid.to_dict() for vid in self.videos]
584
+
585
+ if self.audio is not None:
586
+ _dict["audio"] = [aud.to_dict() for aud in self.audio]
587
+
588
+ if self.files is not None:
589
+ _dict["files"] = [file.to_dict() for file in self.files]
590
+
591
+ if self.response_audio is not None:
592
+ _dict["response_audio"] = self.response_audio.to_dict()
593
+
594
+ if self.member_responses:
595
+ _dict["member_responses"] = [response.to_dict() for response in self.member_responses]
596
+
597
+ if self.citations is not None:
598
+ if isinstance(self.citations, Citations):
599
+ _dict["citations"] = self.citations.model_dump(exclude_none=True)
600
+ else:
601
+ _dict["citations"] = self.citations
602
+
603
+ if self.content and isinstance(self.content, BaseModel):
604
+ _dict["content"] = self.content.model_dump(exclude_none=True, mode="json")
605
+
606
+ if self.tools is not None:
607
+ _dict["tools"] = []
608
+ for tool in self.tools:
609
+ if isinstance(tool, ToolExecution):
610
+ _dict["tools"].append(tool.to_dict())
611
+ else:
612
+ _dict["tools"].append(tool)
613
+
614
+ if self.input is not None:
615
+ _dict["input"] = self.input.to_dict()
616
+
617
+ return _dict
618
+
619
+ def to_json(self, separators=(", ", ": "), indent: Optional[int] = 2) -> str:
620
+ import json
621
+
622
+ try:
623
+ _dict = self.to_dict()
624
+ except Exception:
625
+ log_error("Failed to convert response to json", exc_info=True)
626
+ raise
627
+
628
+ if indent is None:
629
+ return json.dumps(_dict, separators=separators)
630
+ else:
631
+ return json.dumps(_dict, indent=indent, separators=separators)
632
+
633
+ @classmethod
634
+ def from_dict(cls, data: Dict[str, Any]) -> "TeamRunOutput":
635
+ events = data.pop("events", None)
636
+ final_events = []
637
+ for event in events or []:
638
+ if "agent_id" in event:
639
+ # Use the factory from response.py for agent events
640
+ from agno.run.agent import run_output_event_from_dict
641
+
642
+ event = run_output_event_from_dict(event)
643
+ else:
644
+ event = team_run_output_event_from_dict(event)
645
+ final_events.append(event)
646
+ events = final_events
647
+
648
+ messages = data.pop("messages", None)
649
+ messages = [Message.from_dict(message) for message in messages] if messages else None
650
+
651
+ member_responses = data.pop("member_responses", [])
652
+ parsed_member_responses: List[Union["TeamRunOutput", RunOutput]] = []
653
+ if member_responses:
654
+ for response in member_responses:
655
+ if "agent_id" in response:
656
+ parsed_member_responses.append(RunOutput.from_dict(response))
657
+ else:
658
+ parsed_member_responses.append(cls.from_dict(response))
659
+
660
+ additional_input = data.pop("additional_input", None)
661
+ if additional_input is not None:
662
+ additional_input = [Message.from_dict(message) for message in additional_input]
663
+
664
+ reasoning_steps = data.pop("reasoning_steps", None)
665
+ if reasoning_steps is not None:
666
+ reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
667
+
668
+ reasoning_messages = data.pop("reasoning_messages", None)
669
+ if reasoning_messages is not None:
670
+ reasoning_messages = [Message.from_dict(message) for message in reasoning_messages]
671
+
672
+ references = data.pop("references", None)
673
+ if references is not None:
674
+ references = [MessageReferences.model_validate(reference) for reference in references]
675
+
676
+ images = reconstruct_images(data.pop("images", []))
677
+ videos = reconstruct_videos(data.pop("videos", []))
678
+ audio = reconstruct_audio_list(data.pop("audio", []))
679
+ files = reconstruct_files(data.pop("files", []))
680
+
681
+ tools = data.pop("tools", [])
682
+ tools = [ToolExecution.from_dict(tool) for tool in tools] if tools else None
683
+
684
+ response_audio = reconstruct_response_audio(data.pop("response_audio", None))
685
+
686
+ input_data = data.pop("input", None)
687
+ input_obj = None
688
+ if input_data:
689
+ input_obj = TeamRunInput.from_dict(input_data)
690
+
691
+ metrics = data.pop("metrics", None)
692
+ if metrics:
693
+ metrics = Metrics(**metrics)
694
+
695
+ citations = data.pop("citations", None)
696
+ citations = Citations.model_validate(citations) if citations else None
697
+
698
+ # Filter data to only include fields that are actually defined in the TeamRunOutput dataclass
699
+ from dataclasses import fields
700
+
701
+ supported_fields = {f.name for f in fields(cls)}
702
+ filtered_data = {k: v for k, v in data.items() if k in supported_fields}
703
+
704
+ return cls(
705
+ messages=messages,
706
+ metrics=metrics,
707
+ member_responses=parsed_member_responses,
708
+ additional_input=additional_input,
709
+ reasoning_steps=reasoning_steps,
710
+ reasoning_messages=reasoning_messages,
711
+ references=references,
712
+ images=images,
713
+ videos=videos,
714
+ audio=audio,
715
+ files=files,
716
+ response_audio=response_audio,
717
+ input=input_obj,
718
+ citations=citations,
719
+ tools=tools,
720
+ events=events,
721
+ **filtered_data,
722
+ )
723
+
724
+ def get_content_as_string(self, **kwargs) -> str:
725
+ import json
726
+
727
+ from pydantic import BaseModel
728
+
729
+ if isinstance(self.content, str):
730
+ return self.content
731
+ elif isinstance(self.content, BaseModel):
732
+ return self.content.model_dump_json(exclude_none=True, **kwargs)
733
+ else:
734
+ return json.dumps(self.content, **kwargs)
735
+
736
+ def add_member_run(self, run_response: Union["TeamRunOutput", RunOutput]) -> None:
737
+ self.member_responses.append(run_response)
738
+ if run_response.images is not None:
739
+ if self.images is None:
740
+ self.images = []
741
+ self.images.extend(run_response.images)
742
+ if run_response.videos is not None:
743
+ if self.videos is None:
744
+ self.videos = []
745
+ self.videos.extend(run_response.videos)
746
+ if run_response.audio is not None:
747
+ if self.audio is None:
748
+ self.audio = []
749
+ self.audio.extend(run_response.audio)
750
+ if run_response.files is not None:
751
+ if self.files is None:
752
+ self.files = []
753
+ self.files.extend(run_response.files)