agno 1.8.1__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/api/user.py DELETED
@@ -1,160 +0,0 @@
1
- from typing import Dict, List, Optional, Union
2
-
3
- from httpx import Response, codes
4
-
5
- from agno.api.api import api, invalid_response
6
- from agno.api.routes import ApiRoutes
7
- from agno.api.schemas.user import EmailPasswordAuthSchema, UserSchema
8
- from agno.cli.config import AgnoCliConfig
9
- from agno.cli.settings import agno_cli_settings
10
- from agno.utils.log import logger
11
-
12
-
13
- def user_ping() -> bool:
14
- if not agno_cli_settings.api_enabled:
15
- return False
16
-
17
- logger.debug("--**-- Ping user api")
18
- with api.Client() as api_client:
19
- try:
20
- r: Response = api_client.get(ApiRoutes.USER_HEALTH)
21
- if invalid_response(r):
22
- return False
23
-
24
- if r.status_code == codes.OK:
25
- return True
26
- except Exception as e:
27
- logger.debug(f"Could not ping user api: {e}")
28
- return False
29
-
30
-
31
- def authenticate_and_get_user(auth_token: str, existing_user: Optional[UserSchema] = None) -> Optional[UserSchema]:
32
- if not agno_cli_settings.api_enabled:
33
- return None
34
-
35
- from agno.cli.credentials import read_auth_token
36
-
37
- logger.debug("--**-- Getting user")
38
- auth_header = {agno_cli_settings.auth_token_header: auth_token}
39
- anon_user = None
40
- if existing_user is not None:
41
- if existing_user.email == "anon":
42
- logger.debug(f"Claiming anonymous user: {existing_user.id_user}")
43
- anon_user = {
44
- "email": existing_user.email,
45
- "id_user": existing_user.id_user,
46
- "auth_token": read_auth_token() or "",
47
- }
48
- with api.Client() as api_client:
49
- try:
50
- r: Response = api_client.post(ApiRoutes.USER_CLI_AUTH, headers=auth_header, json=anon_user)
51
- if invalid_response(r):
52
- return None
53
-
54
- user_data = r.json()
55
- if not isinstance(user_data, dict):
56
- return None
57
-
58
- return UserSchema.model_validate(user_data)
59
-
60
- except Exception as e:
61
- logger.debug(f"Could not authenticate user: {e}")
62
- return None
63
-
64
-
65
- def sign_in_user(sign_in_data: EmailPasswordAuthSchema) -> Optional[UserSchema]:
66
- if not agno_cli_settings.api_enabled:
67
- return None
68
-
69
- from agno.cli.credentials import save_auth_token
70
-
71
- logger.debug("--**-- Signing in user")
72
- with api.Client() as api_client:
73
- try:
74
- r: Response = api_client.post(ApiRoutes.USER_SIGN_IN, json=sign_in_data.model_dump())
75
- if invalid_response(r):
76
- return None
77
-
78
- agno_auth_token = r.headers.get(agno_cli_settings.auth_token_header)
79
- if agno_auth_token is None:
80
- logger.error("Could not authenticate user")
81
- return None
82
-
83
- user_data = r.json()
84
- if not isinstance(user_data, dict):
85
- return None
86
-
87
- current_user: UserSchema = UserSchema.model_validate(user_data)
88
-
89
- if current_user is not None:
90
- save_auth_token(agno_auth_token)
91
- return current_user
92
- except Exception as e:
93
- logger.debug(f"Could not sign in user: {e}")
94
- return None
95
-
96
-
97
- def user_is_authenticated() -> bool:
98
- if not agno_cli_settings.api_enabled:
99
- return False
100
-
101
- logger.debug("--**-- Checking if user is authenticated")
102
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
103
- if agno_config is None:
104
- return False
105
- user: Optional[UserSchema] = agno_config.user
106
- if user is None:
107
- return False
108
-
109
- with api.AuthenticatedClient() as api_client:
110
- try:
111
- r: Response = api_client.post(
112
- ApiRoutes.USER_AUTHENTICATE, json=user.model_dump(include={"id_user", "email"})
113
- )
114
- if invalid_response(r):
115
- return False
116
-
117
- response_json: Union[Dict, List] = r.json()
118
- if response_json is None or not isinstance(response_json, dict):
119
- logger.error("Could not parse response")
120
- return False
121
- if response_json.get("status") == "success":
122
- return True
123
- except Exception as e:
124
- logger.debug(f"Could not check if user is authenticated: {e}")
125
- return False
126
-
127
-
128
- def create_anon_user() -> Optional[UserSchema]:
129
- if not agno_cli_settings.api_enabled:
130
- return None
131
-
132
- from agno.cli.credentials import save_auth_token
133
-
134
- logger.debug("--**-- Creating anon user")
135
- with api.Client() as api_client:
136
- try:
137
- r: Response = api_client.post(
138
- ApiRoutes.USER_CREATE_ANON,
139
- json={"user": {"email": "anon", "username": "anon", "is_machine": True}},
140
- timeout=2.0,
141
- )
142
- if invalid_response(r):
143
- return None
144
-
145
- agno_auth_token = r.headers.get(agno_cli_settings.auth_token_header)
146
- if agno_auth_token is None:
147
- logger.debug("Could not create anon user")
148
- return None
149
-
150
- user_data = r.json()
151
- if not isinstance(user_data, dict):
152
- return None
153
-
154
- current_user: UserSchema = UserSchema.model_validate(user_data)
155
- if current_user is not None:
156
- save_auth_token(agno_auth_token)
157
- return current_user
158
- except Exception as e:
159
- logger.debug(f"Could not create anon user: {e}")
160
- return None
agno/api/workflows.py DELETED
@@ -1,33 +0,0 @@
1
- from agno.api.api import api
2
- from agno.api.routes import ApiRoutes
3
- from agno.api.schemas.workflows import WorkflowCreate
4
- from agno.cli.settings import agno_cli_settings
5
- from agno.utils.log import log_debug
6
-
7
-
8
- def create_workflow(workflow: WorkflowCreate) -> None:
9
- if not agno_cli_settings.api_enabled:
10
- return
11
-
12
- with api.AuthenticatedClient() as api_client:
13
- try:
14
- api_client.post(
15
- ApiRoutes.WORKFLOW_CREATE,
16
- json=workflow.model_dump(exclude_none=True),
17
- )
18
- except Exception as e:
19
- log_debug(f"Could not create Workflow: {e}")
20
-
21
-
22
- async def acreate_workflow(workflow: WorkflowCreate) -> None:
23
- if not agno_cli_settings.api_enabled:
24
- return
25
-
26
- async with api.AuthenticatedAsyncClient() as api_client:
27
- try:
28
- await api_client.post(
29
- ApiRoutes.WORKFLOW_CREATE,
30
- json=workflow.model_dump(exclude_none=True),
31
- )
32
- except Exception as e:
33
- log_debug(f"Could not create Team: {e}")
agno/api/workspace.py DELETED
@@ -1,175 +0,0 @@
1
- from typing import Dict, List, Optional, Union
2
-
3
- from httpx import Response
4
-
5
- from agno.api.api import api, invalid_response
6
- from agno.api.routes import ApiRoutes
7
- from agno.api.schemas.user import TeamIdentifier, TeamSchema, UserSchema
8
- from agno.api.schemas.workspace import (
9
- WorkspaceCreate,
10
- WorkspaceEvent,
11
- WorkspaceSchema,
12
- WorkspaceUpdate,
13
- )
14
- from agno.cli.settings import agno_cli_settings
15
- from agno.utils.log import logger
16
-
17
-
18
- def get_teams_for_user(user: UserSchema) -> Optional[List[TeamSchema]]:
19
- logger.debug("--**-- Reading teams for user")
20
- with api.AuthenticatedClient() as api_client:
21
- try:
22
- r: Response = api_client.post(
23
- ApiRoutes.TEAM_READ_ALL,
24
- json={
25
- "user": user.model_dump(include={"id_user", "email"}),
26
- },
27
- timeout=2.0,
28
- )
29
- if invalid_response(r):
30
- return None
31
-
32
- response_json: Optional[List[Dict]] = r.json()
33
- if response_json is None:
34
- return None
35
-
36
- teams: List[TeamSchema] = [TeamSchema.model_validate(team) for team in response_json]
37
- return teams
38
- except Exception as e:
39
- logger.debug(f"Could not read teams: {e}")
40
- return None
41
-
42
-
43
- def create_workspace_for_user(
44
- user: UserSchema, workspace: WorkspaceCreate, team: Optional[TeamIdentifier] = None
45
- ) -> Optional[WorkspaceSchema]:
46
- logger.debug("--**-- Creating workspace")
47
- with api.AuthenticatedClient() as api_client:
48
- try:
49
- payload = {
50
- "user": user.model_dump(include={"id_user", "email"}),
51
- "workspace": workspace.model_dump(exclude_none=True),
52
- }
53
- if team is not None:
54
- payload["team"] = team.model_dump(exclude_none=True)
55
-
56
- r: Response = api_client.post(
57
- ApiRoutes.WORKSPACE_CREATE,
58
- json=payload,
59
- timeout=2.0,
60
- )
61
- if invalid_response(r):
62
- try:
63
- error_msg = r.json().get("detail", "Permission denied")
64
- except Exception:
65
- error_msg = f"Could not create workspace: {r.text}"
66
- logger.error(error_msg)
67
- return None
68
-
69
- response_json: Union[Dict, List] = r.json()
70
- if response_json is None:
71
- return None
72
-
73
- created_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
74
- if created_workspace is not None:
75
- return created_workspace
76
- except Exception as e:
77
- logger.debug(f"Could not create workspace: {e}")
78
- return None
79
-
80
-
81
- def update_workspace_for_user(user: UserSchema, workspace: WorkspaceUpdate) -> Optional[WorkspaceSchema]:
82
- logger.debug("--**-- Updating workspace for user")
83
- with api.AuthenticatedClient() as api_client:
84
- try:
85
- payload = {
86
- "user": user.model_dump(include={"id_user", "email"}),
87
- "workspace": workspace.model_dump(exclude_none=True),
88
- }
89
-
90
- r: Response = api_client.post(
91
- ApiRoutes.WORKSPACE_UPDATE,
92
- json=payload,
93
- )
94
- if invalid_response(r):
95
- try:
96
- error_msg = r.json().get("detail", "Could not update workspace")
97
- except Exception:
98
- error_msg = f"Could not update workspace: {r.text}"
99
- logger.error(error_msg)
100
- return None
101
-
102
- response_json: Union[Dict, List] = r.json()
103
- if response_json is None:
104
- return None
105
-
106
- updated_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
107
- if updated_workspace is not None:
108
- return updated_workspace
109
- except Exception as e:
110
- logger.debug(f"Could not update workspace: {e}")
111
- return None
112
-
113
-
114
- def update_workspace_for_team(
115
- user: UserSchema, workspace: WorkspaceUpdate, team: TeamIdentifier
116
- ) -> Optional[WorkspaceSchema]:
117
- logger.debug("--**-- Updating workspace for team")
118
- with api.AuthenticatedClient() as api_client:
119
- try:
120
- payload = {
121
- "user": user.model_dump(include={"id_user", "email"}),
122
- "team_workspace": workspace.model_dump(exclude_none=True).update({"id_team": team.id_team}),
123
- }
124
-
125
- r: Response = api_client.post(
126
- ApiRoutes.WORKSPACE_UPDATE,
127
- json=payload,
128
- )
129
- if invalid_response(r):
130
- try:
131
- error_msg = r.json().get("detail", "Could not update workspace")
132
- except Exception:
133
- error_msg = f"Could not update workspace: {r.text}"
134
- logger.error(error_msg)
135
- return None
136
-
137
- response_json: Union[Dict, List] = r.json()
138
- if response_json is None:
139
- return None
140
-
141
- updated_workspace: WorkspaceSchema = WorkspaceSchema.model_validate(response_json)
142
- if updated_workspace is not None:
143
- return updated_workspace
144
- except Exception as e:
145
- logger.debug(f"Could not update workspace: {e}")
146
- return None
147
-
148
-
149
- def log_workspace_event(user: UserSchema, workspace_event: WorkspaceEvent) -> bool:
150
- if not agno_cli_settings.api_enabled:
151
- return False
152
-
153
- logger.debug("--**-- Log workspace event")
154
- with api.AuthenticatedClient() as api_client:
155
- try:
156
- r: Response = api_client.post(
157
- ApiRoutes.WORKSPACE_EVENT_CREATE,
158
- json={
159
- "user": user.model_dump(include={"id_user", "email"}),
160
- "event": workspace_event.model_dump(exclude_none=True),
161
- },
162
- )
163
- if invalid_response(r):
164
- return False
165
-
166
- response_json: Union[Dict, List] = r.json()
167
- if response_json is None:
168
- return False
169
-
170
- if isinstance(response_json, dict) and response_json.get("status") == "success":
171
- return True
172
- return False
173
- except Exception as e:
174
- logger.debug(f"Could not log workspace event: {e}")
175
- return False
agno/app/agui/__init__.py DELETED
@@ -1,3 +0,0 @@
1
- from agno.app.agui.app import AGUIApp
2
-
3
- __all__ = ["AGUIApp"]
agno/app/agui/app.py DELETED
@@ -1,17 +0,0 @@
1
- """Main class for the AG-UI app, used to expose an Agno Agent or Team in an AG-UI compatible format."""
2
-
3
- from fastapi.routing import APIRouter
4
-
5
- from agno.app.agui.async_router import get_async_agui_router
6
- from agno.app.agui.sync_router import get_sync_agui_router
7
- from agno.app.base import BaseAPIApp
8
-
9
-
10
- class AGUIApp(BaseAPIApp):
11
- type = "agui"
12
-
13
- def get_router(self) -> APIRouter:
14
- return get_sync_agui_router(agent=self.agent, team=self.team)
15
-
16
- def get_async_router(self) -> APIRouter:
17
- return get_async_agui_router(agent=self.agent, team=self.team)
@@ -1,120 +0,0 @@
1
- """Async router handling exposing an Agno Agent or Team in an AG-UI compatible format."""
2
-
3
- import logging
4
- import uuid
5
- from typing import Iterator, Optional
6
-
7
- from ag_ui.core import (
8
- BaseEvent,
9
- EventType,
10
- RunAgentInput,
11
- RunErrorEvent,
12
- RunStartedEvent,
13
- )
14
- from ag_ui.encoder import EventEncoder
15
- from fastapi import APIRouter
16
- from fastapi.responses import StreamingResponse
17
-
18
- from agno.agent.agent import Agent
19
- from agno.app.agui.utils import convert_agui_messages_to_agno_messages, stream_agno_response_as_agui_events
20
- from agno.team.team import Team
21
-
22
- logger = logging.getLogger(__name__)
23
-
24
-
25
- def run_agent(agent: Agent, run_input: RunAgentInput) -> Iterator[BaseEvent]:
26
- """Run the contextual Agent, mapping AG-UI input messages to Agno format, and streaming the response in AG-UI format."""
27
- run_id = run_input.run_id or str(uuid.uuid4())
28
-
29
- try:
30
- # Preparing the input for the Agent and emitting the run started event
31
- messages = convert_agui_messages_to_agno_messages(run_input.messages or [])
32
- yield RunStartedEvent(type=EventType.RUN_STARTED, thread_id=run_input.thread_id, run_id=run_id)
33
-
34
- # Request streaming response from agent
35
- response_stream = agent.run(
36
- messages=messages,
37
- session_id=run_input.thread_id,
38
- stream=True,
39
- stream_intermediate_steps=True,
40
- )
41
-
42
- # Stream the response content in AG-UI format
43
- for event in stream_agno_response_as_agui_events(
44
- response_stream=response_stream, thread_id=run_input.thread_id, run_id=run_id
45
- ):
46
- yield event
47
-
48
- # Emit a RunErrorEvent if any error occurs
49
- except Exception as e:
50
- logger.error(f"Error running agent: {e}", exc_info=True)
51
- yield RunErrorEvent(type=EventType.RUN_ERROR, message=str(e))
52
-
53
-
54
- def run_team(team: Team, input: RunAgentInput) -> Iterator[BaseEvent]:
55
- """Run the contextual Team, mapping AG-UI input messages to Agno format, and streaming the response in AG-UI format."""
56
- run_id = input.run_id or str(uuid.uuid4())
57
- try:
58
- # Extract the last user message for team execution
59
- messages = convert_agui_messages_to_agno_messages(input.messages or [])
60
- yield RunStartedEvent(type=EventType.RUN_STARTED, thread_id=input.thread_id, run_id=run_id)
61
-
62
- # Request streaming response from team
63
- response_stream = team.run(
64
- message=messages,
65
- session_id=input.thread_id,
66
- stream=True,
67
- stream_intermediate_steps=True,
68
- )
69
-
70
- # Stream the response content in AG-UI format
71
- for event in stream_agno_response_as_agui_events(
72
- response_stream=response_stream, thread_id=input.thread_id, run_id=run_id
73
- ):
74
- yield event
75
-
76
- except Exception as e:
77
- logger.error(f"Error running team: {e}", exc_info=True)
78
- yield RunErrorEvent(type=EventType.RUN_ERROR, message=str(e))
79
-
80
-
81
- def get_sync_agui_router(agent: Optional[Agent] = None, team: Optional[Team] = None) -> APIRouter:
82
- """Return an AG-UI compatible FastAPI router."""
83
- if (agent is None and team is None) or (agent is not None and team is not None):
84
- raise ValueError("One of 'agent' or 'team' must be provided.")
85
-
86
- router = APIRouter()
87
- encoder = EventEncoder()
88
-
89
- def _run(run_input: RunAgentInput):
90
- def event_generator():
91
- if agent:
92
- for event in run_agent(agent, run_input):
93
- encoded_event = encoder.encode(event)
94
- yield encoded_event
95
- elif team:
96
- for event in run_team(team, run_input):
97
- encoded_event = encoder.encode(event)
98
- yield encoded_event
99
-
100
- return StreamingResponse(
101
- event_generator(),
102
- media_type="text/event-stream",
103
- headers={
104
- "Cache-Control": "no-cache",
105
- "Connection": "keep-alive",
106
- "Access-Control-Allow-Origin": "*",
107
- "Access-Control-Allow-Methods": "POST, GET, OPTIONS",
108
- "Access-Control-Allow-Headers": "*",
109
- },
110
- )
111
-
112
- @router.post("/agui")
113
- def run_agent_agui(run_input: RunAgentInput):
114
- return _run(run_input)
115
-
116
- @router.get("/status")
117
- def get_status():
118
- return {"status": "available"}
119
-
120
- return router
agno/app/base.py DELETED
@@ -1,186 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from os import getenv
3
- from typing import Any, Dict, Optional, Union
4
- from uuid import uuid4
5
-
6
- import uvicorn
7
- from fastapi import FastAPI, HTTPException, Request
8
- from fastapi.responses import JSONResponse
9
- from fastapi.routing import APIRouter
10
- from starlette.middleware.cors import CORSMiddleware
11
-
12
- from agno.agent.agent import Agent
13
- from agno.api.app import AppCreate, create_app
14
- from agno.app.settings import APIAppSettings
15
- from agno.team.team import Team
16
- from agno.utils.log import log_debug, log_info
17
-
18
-
19
- class BaseAPIApp(ABC):
20
- type: Optional[str] = None
21
-
22
- def __init__(
23
- self,
24
- agent: Optional[Agent] = None,
25
- team: Optional[Team] = None,
26
- settings: Optional[APIAppSettings] = None,
27
- api_app: Optional[FastAPI] = None,
28
- router: Optional[APIRouter] = None,
29
- monitoring: bool = True,
30
- app_id: Optional[str] = None,
31
- name: Optional[str] = None,
32
- description: Optional[str] = None,
33
- version: Optional[str] = None,
34
- ):
35
- if not agent and not team:
36
- raise ValueError("Either agent or team must be provided.")
37
-
38
- if agent and team:
39
- raise ValueError("Only one of agent or team can be provided.")
40
-
41
- self.agent: Optional[Agent] = agent
42
- self.team: Optional[Team] = team
43
- self.settings: APIAppSettings = settings or APIAppSettings()
44
- self.api_app: Optional[FastAPI] = api_app
45
- self.router: Optional[APIRouter] = router
46
- self.monitoring = monitoring
47
- self.app_id: Optional[str] = app_id
48
- self.name: Optional[str] = name
49
- self.description = description
50
- self.version = version
51
- self.set_app_id()
52
-
53
- if self.agent:
54
- if not self.agent.app_id:
55
- self.agent.app_id = self.app_id
56
- self.agent.initialize_agent()
57
-
58
- if self.team:
59
- if not self.team.app_id:
60
- self.team.app_id = self.app_id
61
- self.team.initialize_team()
62
- for member in self.team.members:
63
- if isinstance(member, Agent):
64
- if not member.app_id:
65
- member.app_id = self.app_id
66
- member.team_id = None
67
- member.initialize_agent()
68
- elif isinstance(member, Team):
69
- member.initialize_team()
70
-
71
- def set_app_id(self) -> str:
72
- # If app_id is already set, keep it instead of overriding with UUID
73
- if self.app_id is None:
74
- self.app_id = str(uuid4())
75
-
76
- # Don't override existing app_id
77
- return self.app_id
78
-
79
- def _set_monitoring(self) -> None:
80
- monitor_env = getenv("AGNO_MONITOR")
81
- if monitor_env is not None:
82
- self.monitoring = monitor_env.lower() == "true"
83
-
84
- @abstractmethod
85
- def get_router(self) -> APIRouter:
86
- raise NotImplementedError("get_router must be implemented")
87
-
88
- @abstractmethod
89
- def get_async_router(self) -> APIRouter:
90
- raise NotImplementedError("get_async_router must be implemented")
91
-
92
- def get_app(self, use_async: bool = True, prefix: str = "") -> FastAPI:
93
- if not self.api_app:
94
- kwargs = {
95
- "title": self.settings.title,
96
- }
97
- if self.version:
98
- kwargs["version"] = self.version
99
- if self.settings.docs_enabled:
100
- kwargs["docs_url"] = "/docs"
101
- kwargs["redoc_url"] = "/redoc"
102
- kwargs["openapi_url"] = "/openapi.json"
103
-
104
- self.api_app = FastAPI(
105
- **kwargs, # type: ignore
106
- )
107
-
108
- if not self.api_app:
109
- raise Exception("API App could not be created.")
110
-
111
- @self.api_app.exception_handler(HTTPException)
112
- async def http_exception_handler(request: Request, exc: HTTPException) -> JSONResponse:
113
- return JSONResponse(
114
- status_code=exc.status_code,
115
- content={"detail": str(exc.detail)},
116
- )
117
-
118
- async def general_exception_handler(request: Request, call_next):
119
- try:
120
- return await call_next(request)
121
- except Exception as e:
122
- return JSONResponse(
123
- status_code=e.status_code if hasattr(e, "status_code") else 500,
124
- content={"detail": str(e)},
125
- )
126
-
127
- self.api_app.middleware("http")(general_exception_handler)
128
-
129
- if not self.router:
130
- self.router = APIRouter(prefix=prefix)
131
-
132
- if not self.router:
133
- raise Exception("API Router could not be created.")
134
-
135
- if use_async:
136
- self.router.include_router(self.get_async_router())
137
- else:
138
- self.router.include_router(self.get_router())
139
-
140
- self.api_app.include_router(self.router)
141
-
142
- self.api_app.add_middleware(
143
- CORSMiddleware,
144
- allow_origins=["*"],
145
- allow_credentials=True,
146
- allow_methods=["*"],
147
- allow_headers=["*"],
148
- expose_headers=["*"],
149
- )
150
-
151
- return self.api_app
152
-
153
- def serve(
154
- self,
155
- app: Union[str, FastAPI],
156
- *,
157
- host: str = "localhost",
158
- port: int = 7777,
159
- reload: bool = False,
160
- **kwargs,
161
- ):
162
- self.set_app_id()
163
- self.register_app_on_platform()
164
- log_info(f"Starting API on {host}:{port}")
165
-
166
- uvicorn.run(app=app, host=host, port=port, reload=reload, **kwargs)
167
-
168
- def register_app_on_platform(self) -> None:
169
- self._set_monitoring()
170
- if not self.monitoring:
171
- return
172
-
173
- try:
174
- log_debug(f"Creating app on Platform: {self.name}, {self.app_id}")
175
- create_app(app=AppCreate(name=self.name, app_id=self.app_id, config=self.to_dict()))
176
- except Exception as e:
177
- log_debug(f"Could not create Agent app: {e}")
178
- log_debug(f"Agent app created: {self.name}, {self.app_id}")
179
-
180
- def to_dict(self) -> Dict[str, Any]:
181
- payload = {
182
- "type": self.type,
183
- "description": self.description,
184
- }
185
- payload = {k: v for k, v in payload.items() if v is not None}
186
- return payload