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
@@ -1,3 +0,0 @@
1
- from agno.app.discord.client import DiscordClient
2
-
3
- __all__ = ["DiscordClient"]
@@ -1,3 +0,0 @@
1
- from agno.app.fastapi.app import FastAPIApp
2
-
3
- __all__ = ["FastAPIApp"]
agno/app/fastapi/app.py DELETED
@@ -1,107 +0,0 @@
1
- import logging
2
- from typing import List, Optional, Union
3
-
4
- import uvicorn
5
- from fastapi import FastAPI
6
- from fastapi.routing import APIRouter
7
-
8
- from agno.agent.agent import Agent
9
- from agno.app.base import BaseAPIApp
10
- from agno.app.fastapi.async_router import get_async_router
11
- from agno.app.fastapi.sync_router import get_sync_router
12
- from agno.app.settings import APIAppSettings
13
- from agno.app.utils import generate_id
14
- from agno.team.team import Team
15
- from agno.utils.log import log_info
16
- from agno.workflow.workflow import Workflow
17
-
18
- logger = logging.getLogger(__name__)
19
-
20
-
21
- class FastAPIApp(BaseAPIApp):
22
- type = "fastapi"
23
-
24
- def __init__(
25
- self,
26
- agents: Optional[List[Agent]] = None,
27
- teams: Optional[List[Team]] = None,
28
- workflows: Optional[List[Workflow]] = None,
29
- settings: Optional[APIAppSettings] = None,
30
- api_app: Optional[FastAPI] = None,
31
- router: Optional[APIRouter] = None,
32
- app_id: Optional[str] = None,
33
- name: Optional[str] = None,
34
- description: Optional[str] = None,
35
- version: Optional[str] = None,
36
- monitoring: bool = True,
37
- ):
38
- if not agents and not teams and not workflows:
39
- raise ValueError("Either agents, teams or workflows must be provided.")
40
-
41
- self.agents: Optional[List[Agent]] = agents
42
- self.teams: Optional[List[Team]] = teams
43
- self.workflows: Optional[List[Workflow]] = workflows
44
-
45
- self.settings: APIAppSettings = settings or APIAppSettings()
46
- self.api_app: Optional[FastAPI] = api_app
47
- self.router: Optional[APIRouter] = router
48
-
49
- self.app_id: Optional[str] = app_id
50
- self.name: Optional[str] = name
51
- self.monitoring = monitoring
52
- self.description = description
53
- self.version = version
54
-
55
- self.set_app_id()
56
-
57
- if self.agents:
58
- for agent in self.agents:
59
- if not agent.app_id:
60
- agent.app_id = self.app_id
61
- agent.initialize_agent()
62
-
63
- if self.teams:
64
- for team in self.teams:
65
- if not team.app_id:
66
- team.app_id = self.app_id
67
- team.initialize_team()
68
- for member in team.members:
69
- if isinstance(member, Agent):
70
- if not member.app_id:
71
- member.app_id = self.app_id
72
-
73
- member.team_id = None
74
- member.initialize_agent()
75
- elif isinstance(member, Team):
76
- member.initialize_team()
77
-
78
- if self.workflows:
79
- for workflow in self.workflows:
80
- if hasattr(workflow, "app_id") and not workflow.app_id:
81
- workflow.app_id = self.app_id
82
- if not workflow.workflow_id:
83
- workflow.workflow_id = generate_id(workflow.name)
84
- workflow.initialize_workflow()
85
-
86
- def get_router(self) -> APIRouter:
87
- return get_sync_router(agents=self.agents, teams=self.teams, workflows=self.workflows)
88
-
89
- def get_async_router(self) -> APIRouter:
90
- return get_async_router(agents=self.agents, teams=self.teams, workflows=self.workflows)
91
-
92
- def serve(
93
- self,
94
- app: Union[str, FastAPI],
95
- *,
96
- host: str = "localhost",
97
- port: int = 7777,
98
- reload: bool = False,
99
- workers: Optional[int] = None,
100
- **kwargs,
101
- ):
102
- self.set_app_id()
103
- self.register_app_on_platform()
104
-
105
- log_info(f"Starting API on {host}:{port}")
106
-
107
- uvicorn.run(app=app, host=host, port=port, reload=reload, workers=workers, **kwargs)
@@ -1,457 +0,0 @@
1
- import json
2
- from dataclasses import asdict
3
- from io import BytesIO
4
- from typing import Any, AsyncGenerator, Dict, List, Optional, Union, cast
5
- from uuid import uuid4
6
-
7
- from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
8
- from fastapi.responses import StreamingResponse
9
-
10
- from agno.agent.agent import Agent, RunResponse
11
- from agno.app.playground.utils import process_audio, process_document, process_image, process_video
12
- from agno.media import Audio, Image, Video
13
- from agno.media import File as FileMedia
14
- from agno.run.response import RunResponseErrorEvent
15
- from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
16
- from agno.run.team import TeamRunResponse, TeamRunResponseEvent
17
- from agno.run.v2.workflow import WorkflowErrorEvent
18
- from agno.team.team import Team
19
- from agno.utils.log import logger
20
- from agno.workflow.v2.workflow import Workflow as WorkflowV2
21
- from agno.workflow.workflow import Workflow
22
-
23
-
24
- async def agent_chat_response_streamer(
25
- agent: Agent,
26
- message: str,
27
- session_id: Optional[str] = None,
28
- user_id: Optional[str] = None,
29
- images: Optional[List[Image]] = None,
30
- audio: Optional[List[Audio]] = None,
31
- videos: Optional[List[Video]] = None,
32
- ) -> AsyncGenerator:
33
- try:
34
- run_response = await agent.arun(
35
- message,
36
- session_id=session_id,
37
- user_id=user_id,
38
- images=images,
39
- audio=audio,
40
- videos=videos,
41
- stream=True,
42
- stream_intermediate_steps=True,
43
- )
44
- async for run_response_chunk in run_response:
45
- run_response_chunk = cast(RunResponse, run_response_chunk)
46
- yield run_response_chunk.to_json()
47
- except Exception as e:
48
- error_response = RunResponseErrorEvent(
49
- content=str(e),
50
- )
51
- yield error_response.to_json()
52
- return
53
-
54
-
55
- async def team_chat_response_streamer(
56
- team: Team,
57
- message: str,
58
- session_id: Optional[str] = None,
59
- user_id: Optional[str] = None,
60
- images: Optional[List[Image]] = None,
61
- audio: Optional[List[Audio]] = None,
62
- videos: Optional[List[Video]] = None,
63
- files: Optional[List[FileMedia]] = None,
64
- ) -> AsyncGenerator:
65
- try:
66
- run_response = await team.arun(
67
- message,
68
- session_id=session_id,
69
- user_id=user_id,
70
- images=images,
71
- audio=audio,
72
- videos=videos,
73
- files=files,
74
- stream=True,
75
- stream_intermediate_steps=True,
76
- )
77
- async for run_response_chunk in run_response:
78
- run_response_chunk = cast(TeamRunResponseEvent, run_response_chunk)
79
- yield run_response_chunk.to_json()
80
- except Exception as e:
81
- error_response = TeamRunResponseErrorEvent(
82
- content=str(e),
83
- )
84
- yield error_response.to_json()
85
- return
86
-
87
-
88
- async def workflow_response_streamer(
89
- workflow: WorkflowV2,
90
- body: Union[Dict[str, Any], str],
91
- session_id: Optional[str] = None,
92
- user_id: Optional[str] = None,
93
- ) -> AsyncGenerator:
94
- try:
95
- if isinstance(body, dict):
96
- run_response = await workflow.arun( # type: ignore
97
- **body,
98
- user_id=user_id,
99
- session_id=session_id,
100
- stream=True,
101
- stream_intermediate_steps=True,
102
- )
103
- else:
104
- run_response = await workflow.arun( # type: ignore
105
- body,
106
- user_id=user_id,
107
- session_id=session_id,
108
- stream=True,
109
- stream_intermediate_steps=True,
110
- )
111
- async for run_response_chunk in run_response:
112
- yield run_response_chunk.to_json()
113
- except Exception as e:
114
- import traceback
115
-
116
- traceback.print_exc(limit=3)
117
- error_response = WorkflowErrorEvent(
118
- error=str(e),
119
- )
120
- yield error_response.to_json()
121
- return
122
-
123
-
124
- def get_async_router(
125
- agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None, workflows: Optional[List[Workflow]] = None
126
- ) -> APIRouter:
127
- router = APIRouter()
128
-
129
- if agents is None and teams is None and workflows is None:
130
- raise ValueError("Either agents, teams or workflows must be provided.")
131
-
132
- @router.get("/status")
133
- async def status():
134
- return {"status": "available"}
135
-
136
- async def agent_process_file(
137
- files: List[UploadFile],
138
- agent: Agent,
139
- ):
140
- base64_images: List[Image] = []
141
- base64_audios: List[Audio] = []
142
- base64_videos: List[Video] = []
143
- for file in files:
144
- logger.info(f"Processing file: {file.content_type}")
145
- if file.content_type in ["image/png", "image/jpeg", "image/jpg", "image/webp"]:
146
- try:
147
- base64_image = process_image(file)
148
- base64_images.append(base64_image)
149
- except Exception as e:
150
- logger.error(f"Error processing image {file.filename}: {e}")
151
- continue
152
- elif file.content_type in ["audio/wav", "audio/mp3", "audio/mpeg"]:
153
- try:
154
- base64_audio = process_audio(file)
155
- base64_audios.append(base64_audio)
156
- except Exception as e:
157
- logger.error(f"Error processing audio {file.filename}: {e}")
158
- continue
159
- elif file.content_type in [
160
- "video/x-flv",
161
- "video/quicktime",
162
- "video/mpeg",
163
- "video/mpegs",
164
- "video/mpgs",
165
- "video/mpg",
166
- "video/mpg",
167
- "video/mp4",
168
- "video/webm",
169
- "video/wmv",
170
- "video/3gpp",
171
- ]:
172
- try:
173
- base64_video = process_video(file)
174
- base64_videos.append(base64_video)
175
- except Exception as e:
176
- logger.error(f"Error processing video {file.filename}: {e}")
177
- continue
178
- else:
179
- # Check for knowledge base before processing documents
180
- if agent.knowledge is None:
181
- raise HTTPException(status_code=404, detail="KnowledgeBase not found")
182
-
183
- if file.content_type == "application/pdf":
184
- from agno.document.reader.pdf_reader import PDFReader
185
-
186
- contents = await file.read()
187
- pdf_file = BytesIO(contents)
188
- pdf_file.name = file.filename
189
- file_content = PDFReader().read(pdf_file)
190
- if agent.knowledge is not None:
191
- await agent.knowledge.async_load_documents(file_content)
192
- elif file.content_type == "text/csv":
193
- from agno.document.reader.csv_reader import CSVReader
194
-
195
- contents = await file.read()
196
- csv_file = BytesIO(contents)
197
- csv_file.name = file.filename
198
- file_content = CSVReader().read(csv_file)
199
- if agent.knowledge is not None:
200
- await agent.knowledge.async_load_documents(file_content)
201
- elif file.content_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
202
- from agno.document.reader.docx_reader import DocxReader
203
-
204
- contents = await file.read()
205
- docx_file = BytesIO(contents)
206
- docx_file.name = file.filename
207
- file_content = DocxReader().read(docx_file)
208
- if agent.knowledge is not None:
209
- await agent.knowledge.async_load_documents(file_content)
210
- elif file.content_type == "text/plain":
211
- from agno.document.reader.text_reader import TextReader
212
-
213
- contents = await file.read()
214
- text_file = BytesIO(contents)
215
- text_file.name = file.filename
216
- file_content = TextReader().read(text_file)
217
- if agent.knowledge is not None:
218
- await agent.knowledge.async_load_documents(file_content)
219
-
220
- elif file.content_type == "application/json":
221
- from agno.document.reader.json_reader import JSONReader
222
-
223
- contents = await file.read()
224
- json_file = BytesIO(contents)
225
- json_file.name = file.filename
226
- file_content = JSONReader().read(json_file)
227
- if agent.knowledge is not None:
228
- await agent.knowledge.async_load_documents(file_content)
229
- else:
230
- raise HTTPException(status_code=400, detail="Unsupported file type")
231
-
232
- return base64_images, base64_audios, base64_videos
233
-
234
- async def team_process_file(
235
- files: List[UploadFile],
236
- ):
237
- base64_images: List[Image] = []
238
- base64_audios: List[Audio] = []
239
- base64_videos: List[Video] = []
240
- document_files: List[FileMedia] = []
241
- for file in files:
242
- if file.content_type in ["image/png", "image/jpeg", "image/jpg", "image/webp"]:
243
- try:
244
- base64_image = process_image(file)
245
- base64_images.append(base64_image)
246
- except Exception as e:
247
- logger.error(f"Error processing image {file.filename}: {e}")
248
- continue
249
- elif file.content_type in ["audio/wav", "audio/mp3", "audio/mpeg"]:
250
- try:
251
- base64_audio = process_audio(file)
252
- base64_audios.append(base64_audio)
253
- except Exception as e:
254
- logger.error(f"Error processing audio {file.filename}: {e}")
255
- continue
256
- elif file.content_type in [
257
- "video/x-flv",
258
- "video/quicktime",
259
- "video/mpeg",
260
- "video/mpegs",
261
- "video/mpgs",
262
- "video/mpg",
263
- "video/mpg",
264
- "video/mp4",
265
- "video/webm",
266
- "video/wmv",
267
- "video/3gpp",
268
- ]:
269
- try:
270
- base64_video = process_video(file)
271
- base64_videos.append(base64_video)
272
- except Exception as e:
273
- logger.error(f"Error processing video {file.filename}: {e}")
274
- continue
275
- elif file.content_type in [
276
- "application/pdf",
277
- "text/csv",
278
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
279
- "text/plain",
280
- "application/json",
281
- ]:
282
- document_file = process_document(file)
283
- if document_file is not None:
284
- document_files.append(document_file)
285
- else:
286
- raise HTTPException(status_code=400, detail="Unsupported file type")
287
-
288
- return base64_images, base64_audios, base64_videos, document_files
289
-
290
- @router.post("/runs")
291
- async def run_agent_or_team_or_workflow(
292
- message: str = Form(None),
293
- stream: bool = Form(False),
294
- monitor: bool = Form(False),
295
- session_id: Optional[str] = Form(None),
296
- user_id: Optional[str] = Form(None),
297
- files: Optional[List[UploadFile]] = File(None),
298
- agent_id: Optional[str] = Query(None),
299
- team_id: Optional[str] = Query(None),
300
- workflow_id: Optional[str] = Query(None),
301
- workflow_input: Optional[str] = Form(None),
302
- ):
303
- if session_id is not None and session_id != "":
304
- logger.debug(f"Continuing session: {session_id}")
305
- else:
306
- logger.debug("Creating new session")
307
- session_id = str(uuid4())
308
-
309
- agent = None
310
- team = None
311
- workflow = None
312
-
313
- # Only one of agent_id, team_id or workflow_id can be provided
314
- if agent_id and team_id or agent_id and workflow_id or team_id and workflow_id:
315
- raise HTTPException(status_code=400, detail="Only one of agent_id, team_id or workflow_id can be provided")
316
-
317
- if not agent_id and not team_id and not workflow_id:
318
- raise HTTPException(status_code=400, detail="One of agent_id, team_id or workflow_id must be provided")
319
-
320
- if agent_id and agents:
321
- agent = next((agent for agent in agents if agent.agent_id == agent_id), None)
322
- if agent is None:
323
- raise HTTPException(status_code=404, detail="Agent not found")
324
- if not message:
325
- raise HTTPException(status_code=400, detail="Message is required")
326
- if team_id and teams:
327
- team = next((team for team in teams if team.team_id == team_id), None)
328
- if team is None:
329
- raise HTTPException(status_code=404, detail="Team not found")
330
- if not message:
331
- raise HTTPException(status_code=400, detail="Message is required")
332
- if workflow_id and workflows:
333
- workflow = next((workflow for workflow in workflows if workflow.workflow_id == workflow_id), None)
334
- if workflow is None:
335
- raise HTTPException(status_code=404, detail="Workflow not found")
336
- if not workflow_input:
337
- raise HTTPException(status_code=400, detail="Workflow input is required")
338
-
339
- # Parse workflow_input into a dict if it is a valid JSON
340
- try:
341
- parsed_workflow_input = json.loads(workflow_input)
342
- workflow_input = parsed_workflow_input
343
- except json.JSONDecodeError:
344
- pass
345
-
346
- if agent:
347
- agent.monitoring = bool(monitor)
348
- elif team:
349
- team.monitoring = bool(monitor)
350
- elif workflow:
351
- workflow.monitoring = bool(monitor)
352
-
353
- base64_images: List[Image] = []
354
- base64_audios: List[Audio] = []
355
- base64_videos: List[Video] = []
356
- document_files: List[FileMedia] = []
357
- if files:
358
- if agent:
359
- base64_images, base64_audios, base64_videos = await agent_process_file(files, agent)
360
- elif team:
361
- base64_images, base64_audios, base64_videos, document_files = await team_process_file(files)
362
-
363
- if stream:
364
- if agent:
365
- return StreamingResponse(
366
- agent_chat_response_streamer(
367
- agent,
368
- message,
369
- session_id=session_id,
370
- user_id=user_id,
371
- images=base64_images if base64_images else None,
372
- audio=base64_audios if base64_audios else None,
373
- videos=base64_videos if base64_videos else None,
374
- ),
375
- media_type="text/event-stream",
376
- )
377
- elif team:
378
- return StreamingResponse(
379
- team_chat_response_streamer(
380
- team,
381
- message,
382
- session_id=session_id,
383
- user_id=user_id,
384
- images=base64_images if base64_images else None,
385
- audio=base64_audios if base64_audios else None,
386
- videos=base64_videos if base64_videos else None,
387
- files=document_files if document_files else None,
388
- ),
389
- media_type="text/event-stream",
390
- )
391
- elif workflow:
392
- if isinstance(workflow, Workflow):
393
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
394
- workflow_instance.user_id = user_id
395
- workflow_instance.session_name = None
396
-
397
- if isinstance(workflow_input, dict):
398
- return StreamingResponse(
399
- (json.dumps(asdict(result)) for result in await workflow_instance.arun(**workflow_input)),
400
- media_type="text/event-stream",
401
- )
402
- else:
403
- return StreamingResponse(
404
- (json.dumps(asdict(result)) for result in await workflow_instance.arun(workflow_input)), # type: ignore
405
- media_type="text/event-stream",
406
- )
407
- else:
408
- return StreamingResponse(
409
- workflow_response_streamer(workflow, workflow_input, session_id=session_id, user_id=user_id), # type: ignore
410
- media_type="text/event-stream",
411
- )
412
- else:
413
- if agent:
414
- run_response = cast(
415
- RunResponse,
416
- await agent.arun(
417
- message=message,
418
- session_id=session_id,
419
- user_id=user_id,
420
- images=base64_images if base64_images else None,
421
- audio=base64_audios if base64_audios else None,
422
- videos=base64_videos if base64_videos else None,
423
- stream=False,
424
- ),
425
- )
426
- return run_response.to_dict()
427
- elif team:
428
- team_run_response = cast(
429
- TeamRunResponse,
430
- await team.arun(
431
- message=message,
432
- session_id=session_id,
433
- user_id=user_id,
434
- images=base64_images if base64_images else None,
435
- audio=base64_audios if base64_audios else None,
436
- videos=base64_videos if base64_videos else None,
437
- files=document_files if document_files else None,
438
- stream=False,
439
- ),
440
- )
441
- return team_run_response.to_dict()
442
- elif workflow:
443
- if isinstance(workflow, Workflow):
444
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
445
- workflow_instance.user_id = user_id
446
- workflow_instance.session_name = None
447
- if isinstance(workflow_input, dict):
448
- return (await workflow_instance.arun(**workflow_input)).to_dict()
449
- else:
450
- return (await workflow_instance.arun(workflow_input)).to_dict() # type: ignore
451
- else:
452
- if isinstance(workflow_input, dict):
453
- return (await workflow.arun(**workflow_input, session_id=session_id, user_id=user_id)).to_dict()
454
- else:
455
- return (await workflow.arun(workflow_input, session_id=session_id, user_id=user_id)).to_dict() # type: ignore
456
-
457
- return router