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,757 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, List, Optional, cast
3
-
4
- from rich.prompt import Prompt
5
-
6
- from agno.api.schemas.user import TeamIdentifier, TeamSchema
7
- from agno.api.schemas.workspace import (
8
- WorkspaceCreate,
9
- WorkspaceEvent,
10
- WorkspaceSchema,
11
- WorkspaceUpdate,
12
- )
13
- from agno.api.workspace import log_workspace_event
14
- from agno.cli.config import AgnoCliConfig
15
- from agno.cli.console import (
16
- console,
17
- log_config_not_available_msg,
18
- print_heading,
19
- print_info,
20
- print_subheading,
21
- )
22
- from agno.infra.resources import InfraResources
23
- from agno.utils.common import str_to_int
24
- from agno.utils.log import logger
25
- from agno.workspace.config import WorkspaceConfig
26
- from agno.workspace.enums import WorkspaceStarterTemplate
27
-
28
- TEMPLATE_TO_NAME_MAP: Dict[WorkspaceStarterTemplate, str] = {
29
- WorkspaceStarterTemplate.agent_app: "agent-app",
30
- WorkspaceStarterTemplate.agent_api: "agent-api",
31
- }
32
- TEMPLATE_TO_REPO_MAP: Dict[WorkspaceStarterTemplate, str] = {
33
- WorkspaceStarterTemplate.agent_app: "https://github.com/agno-agi/agent-app-aws",
34
- WorkspaceStarterTemplate.agent_api: "https://github.com/agno-agi/agent-api-aws",
35
- }
36
-
37
-
38
- def create_workspace(
39
- name: Optional[str] = None, template: Optional[str] = None, url: Optional[str] = None
40
- ) -> Optional[WorkspaceConfig]:
41
- """Creates a new workspace and returns the WorkspaceConfig.
42
-
43
- This function clones a template or url on the users machine at the path:
44
- cwd/name
45
- """
46
- from shutil import copytree
47
-
48
- import git
49
-
50
- from agno.cli.operator import initialize_agno
51
- from agno.utils.filesystem import rmdir_recursive
52
- from agno.utils.git import GitCloneProgress
53
- from agno.workspace.helpers import get_workspace_dir_path
54
-
55
- current_dir: Path = Path(".").resolve()
56
-
57
- # Initialize Agno before creating a workspace
58
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
59
- if not agno_config:
60
- agno_config = initialize_agno()
61
- if not agno_config:
62
- log_config_not_available_msg()
63
- return None
64
- agno_config = cast(AgnoCliConfig, agno_config)
65
-
66
- ws_dir_name: Optional[str] = name
67
- repo_to_clone: Optional[str] = url
68
- ws_template = WorkspaceStarterTemplate.agent_app
69
- templates = list(WorkspaceStarterTemplate.__members__.values())
70
-
71
- if repo_to_clone is None:
72
- # Get repo_to_clone from template
73
- if template is None:
74
- # Get starter template from the user if template is not provided
75
- # Display available starter templates and ask user to select one
76
- print_info("Select starter template or press Enter for default (agent-app)")
77
- for template_id, template_name in enumerate(templates, start=1):
78
- print_info(" [b][{}][/b] {}".format(template_id, WorkspaceStarterTemplate(template_name).value))
79
-
80
- # Get starter template from the user
81
- template_choices = [str(idx) for idx, _ in enumerate(templates, start=1)]
82
- template_inp_raw = Prompt.ask("Template Number", choices=template_choices, default="1", show_choices=False)
83
- # Convert input to int
84
- template_inp = str_to_int(template_inp_raw)
85
-
86
- if template_inp is not None:
87
- template_inp_idx = template_inp - 1
88
- ws_template = WorkspaceStarterTemplate(templates[template_inp_idx])
89
- elif template.lower() in WorkspaceStarterTemplate.__members__.values():
90
- ws_template = WorkspaceStarterTemplate(template)
91
- else:
92
- raise Exception(f"{template} is not a supported template, please choose from: {templates}")
93
-
94
- logger.debug(f"Selected Template: {ws_template.value}")
95
- repo_to_clone = TEMPLATE_TO_REPO_MAP.get(ws_template)
96
-
97
- if ws_dir_name is None:
98
- default_ws_name = "agent-app"
99
- if url is not None:
100
- # Get default_ws_name from url
101
- default_ws_name = url.split("/")[-1].split(".")[0]
102
- else:
103
- # Get default_ws_name from template
104
- default_ws_name = TEMPLATE_TO_NAME_MAP.get(ws_template, "agent-app")
105
- logger.debug(f"Asking for ws name with default: {default_ws_name}")
106
- # Ask user for workspace name if not provided
107
- ws_dir_name = Prompt.ask("Workspace Name", default=default_ws_name, console=console)
108
-
109
- if ws_dir_name is None:
110
- logger.error("Workspace name is required")
111
- return None
112
- if repo_to_clone is None:
113
- logger.error("URL or Template is required")
114
- return None
115
-
116
- # Check if we can create the workspace in the current dir
117
- ws_root_path: Path = current_dir.joinpath(ws_dir_name)
118
- if ws_root_path.exists():
119
- logger.error(f"Directory {ws_root_path} exists, please delete directory or choose another name for workspace")
120
- return None
121
-
122
- print_info(f"Creating {str(ws_root_path)}")
123
- logger.debug("Cloning: {}".format(repo_to_clone))
124
- try:
125
- _cloned_git_repo: git.Repo = git.Repo.clone_from(
126
- repo_to_clone,
127
- str(ws_root_path),
128
- progress=GitCloneProgress(), # type: ignore
129
- )
130
- except Exception as e:
131
- logger.error(e)
132
- return None
133
-
134
- # Remove existing .git folder
135
- _dot_git_folder = ws_root_path.joinpath(".git")
136
- _dot_git_exists = _dot_git_folder.exists()
137
- if _dot_git_exists:
138
- logger.debug(f"Deleting {_dot_git_folder}")
139
- try:
140
- _dot_git_exists = not rmdir_recursive(_dot_git_folder)
141
- except Exception as e:
142
- logger.warning(f"Failed to delete {_dot_git_folder}: {e}")
143
- logger.info("Please delete the .git folder manually")
144
- pass
145
-
146
- agno_config.add_new_ws_to_config(ws_root_path=ws_root_path)
147
-
148
- try:
149
- # workspace_dir_path is the path to the ws_root/workspace dir
150
- workspace_dir_path: Path = get_workspace_dir_path(ws_root_path)
151
- workspace_secrets_dir = workspace_dir_path.joinpath("secrets").resolve()
152
- workspace_example_secrets_dir = workspace_dir_path.joinpath("example_secrets").resolve()
153
-
154
- print_info(f"Creating {str(workspace_secrets_dir)}")
155
- copytree(
156
- str(workspace_example_secrets_dir),
157
- str(workspace_secrets_dir),
158
- )
159
- except Exception as e:
160
- logger.warning(f"Could not create workspace/secrets: {e}")
161
- logger.warning("Please manually copy workspace/example_secrets to workspace/secrets")
162
-
163
- print_info(f"Your new workspace is available at {str(ws_root_path)}\n")
164
- return setup_workspace(ws_root_path=ws_root_path)
165
-
166
-
167
- def setup_workspace(ws_root_path: Path) -> Optional[WorkspaceConfig]:
168
- """Setup an Agno workspace at `ws_root_path` and return the WorkspaceConfig
169
-
170
- 1. Pre-requisites
171
- 1.1 Check ws_root_path exists and is a directory
172
- 1.2 Create AgnoCliConfig if needed
173
- 1.3 Create a WorkspaceConfig if needed
174
- 1.4 Get the workspace name
175
- 1.5 Get the git remote origin url
176
- 1.6 Create anon user if needed
177
-
178
- 2. Create or update WorkspaceSchema
179
- 2.1 Check if a ws_schema exists for this workspace, meaning this workspace has a record in agno-api
180
- 2.2 Create WorkspaceSchema if it doesn't exist
181
- 2.3 Update WorkspaceSchema if git_url is updated
182
- """
183
- from rich.live import Live
184
- from rich.status import Status
185
-
186
- from agno.cli.operator import initialize_agno
187
- from agno.utils.git import get_remote_origin_for_dir
188
- from agno.workspace.helpers import get_workspace_dir_path
189
-
190
- print_heading("Setting up workspace\n")
191
-
192
- ######################################################
193
- ## 1. Pre-requisites
194
- ######################################################
195
- # 1.1 Check ws_root_path exists and is a directory
196
- ws_is_valid: bool = ws_root_path is not None and ws_root_path.exists() and ws_root_path.is_dir()
197
- if not ws_is_valid:
198
- logger.error("Invalid directory: {}".format(ws_root_path))
199
- return None
200
-
201
- # 1.2 Create AgnoCliConfig if needed
202
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
203
- if not agno_config:
204
- agno_config = initialize_agno()
205
- if not agno_config:
206
- log_config_not_available_msg()
207
- return None
208
-
209
- # 1.3 Create a WorkspaceConfig if needed
210
- logger.debug(f"Checking for a workspace at {ws_root_path}")
211
- ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(ws_root_path)
212
- if ws_config is None:
213
- # There's no record of this workspace, reasons:
214
- # - The user is setting up a new workspace
215
- # - The user ran `ag init -r` which erased existing workspaces
216
- logger.debug(f"Could not find a workspace at: {ws_root_path}")
217
-
218
- # Check if the workspace contains a `workspace` dir
219
- workspace_ws_dir_path = get_workspace_dir_path(ws_root_path)
220
- logger.debug(f"Found the `workspace` configuration at: {workspace_ws_dir_path}")
221
- ws_config = agno_config.create_or_update_ws_config(ws_root_path=ws_root_path, set_as_active=True)
222
- if ws_config is None:
223
- logger.error(f"Failed to create WorkspaceConfig for {ws_root_path}")
224
- return None
225
- else:
226
- logger.debug(f"Found workspace at {ws_root_path}")
227
-
228
- # 1.4 Get the workspace name
229
- workspace_name = ws_root_path.stem.replace(" ", "-").replace("_", "-").lower()
230
- logger.debug(f"Workspace name: {workspace_name}")
231
-
232
- # 1.5 Get the git remote origin url
233
- git_remote_origin_url: Optional[str] = get_remote_origin_for_dir(ws_root_path)
234
- logger.debug("Git origin: {}".format(git_remote_origin_url))
235
-
236
- # 1.6 Create anon user if the user is not logged in
237
- if agno_config.user is None:
238
- from agno.api.user import create_anon_user
239
-
240
- logger.debug("Creating anon user")
241
- with Live(transient=True) as live_log:
242
- status = Status("Creating user...", spinner="aesthetic", speed=2.0, refresh_per_second=10)
243
- live_log.update(status)
244
- anon_user = create_anon_user()
245
- status.stop()
246
- if anon_user is not None:
247
- agno_config.user = anon_user
248
-
249
- ######################################################
250
- ## 2. Create or update WorkspaceSchema
251
- ######################################################
252
- # 2.1 Check if a ws_schema exists for this workspace, meaning this workspace has a record in agno-api
253
- ws_schema: Optional[WorkspaceSchema] = ws_config.ws_schema if ws_config is not None else None
254
- if agno_config.user is not None:
255
- # 2.2 Create WorkspaceSchema if it doesn't exist
256
- if ws_schema is None or ws_schema.id_workspace is None:
257
- from agno.api.workspace import create_workspace_for_user, get_teams_for_user
258
-
259
- # If ws_schema is None, this is a NEW WORKSPACE.
260
- # We make a call to the api to create a new ws_schema
261
- logger.debug("Creating ws_schema")
262
- logger.debug(f"Getting teams for user: {agno_config.user.email}")
263
- teams: Optional[List[TeamSchema]] = None
264
- selected_team: Optional[TeamSchema] = None
265
- team_identifier: Optional[TeamIdentifier] = None
266
- with Live(transient=True) as live_log:
267
- status = Status(
268
- "Checking for available teams...", spinner="aesthetic", speed=2.0, refresh_per_second=10
269
- )
270
- live_log.update(status)
271
- teams = get_teams_for_user(agno_config.user)
272
- status.stop()
273
- if teams is not None and len(teams) > 0:
274
- logger.debug(f"The user has {len(teams)} available teams. Checking if they want to use one of them")
275
- print_info("Which account would you like to create this workspace in?")
276
- print_info(" [b][1][/b] Personal (default)")
277
- for team_idx, team_schema in enumerate(teams, start=2):
278
- print_info(" [b][{}][/b] {}".format(team_idx, team_schema.name))
279
-
280
- account_choices = ["1"] + [str(idx) for idx, _ in enumerate(teams, start=2)]
281
- account_inp_raw = Prompt.ask("Account Number", choices=account_choices, default="1", show_choices=False)
282
- account_inp = str_to_int(account_inp_raw)
283
-
284
- if account_inp is not None:
285
- if account_inp == 1:
286
- print_info("Creating workspace in your personal account")
287
- else:
288
- selected_team = teams[account_inp - 2]
289
- print_info(f"Creating workspace in {selected_team.name}")
290
- team_identifier = TeamIdentifier(id_team=selected_team.id_team, team_url=selected_team.url)
291
-
292
- with Live(transient=True) as live_log:
293
- status = Status("Creating workspace...", spinner="aesthetic", speed=2.0, refresh_per_second=10)
294
- live_log.update(status)
295
- ws_schema = create_workspace_for_user(
296
- user=agno_config.user,
297
- workspace=WorkspaceCreate(
298
- ws_name=workspace_name,
299
- git_url=git_remote_origin_url,
300
- ),
301
- team=team_identifier,
302
- )
303
- status.stop()
304
-
305
- logger.debug(f"Workspace created: {workspace_name}")
306
- if selected_team is not None:
307
- logger.debug(f"Selected team: {selected_team.name}")
308
- ws_config = agno_config.create_or_update_ws_config(
309
- ws_root_path=ws_root_path, ws_schema=ws_schema, ws_team=selected_team, set_as_active=True
310
- )
311
-
312
- # 2.3 Update WorkspaceSchema if git_url is updated
313
- if git_remote_origin_url is not None and ws_schema is not None and ws_schema.git_url != git_remote_origin_url:
314
- from agno.api.workspace import update_workspace_for_team, update_workspace_for_user
315
-
316
- logger.debug("Updating workspace")
317
- logger.debug(f"Existing git_url: {ws_schema.git_url}")
318
- logger.debug(f"New git_url: {git_remote_origin_url}")
319
-
320
- if ws_config is not None and ws_config.ws_team is not None:
321
- updated_workspace_schema = update_workspace_for_team(
322
- user=agno_config.user,
323
- workspace=WorkspaceUpdate(
324
- id_workspace=ws_schema.id_workspace,
325
- git_url=git_remote_origin_url,
326
- ),
327
- team=TeamIdentifier(id_team=ws_config.ws_team.id_team, team_url=ws_config.ws_team.url),
328
- )
329
- else:
330
- updated_workspace_schema = update_workspace_for_user(
331
- user=agno_config.user,
332
- workspace=WorkspaceUpdate(
333
- id_workspace=ws_schema.id_workspace,
334
- git_url=git_remote_origin_url,
335
- ),
336
- )
337
- if updated_workspace_schema is not None:
338
- # Update the ws_schema for this workspace.
339
- ws_config = agno_config.create_or_update_ws_config(
340
- ws_root_path=ws_root_path, ws_schema=updated_workspace_schema, set_as_active=True
341
- )
342
- else:
343
- logger.debug("Failed to update workspace. Please setup again")
344
-
345
- if ws_config is not None:
346
- # logger.debug("Workspace Config: {}".format(ws_config.model_dump_json(indent=2)))
347
- print_subheading("Setup complete! Next steps:")
348
- print_info("1. Start workspace:")
349
- print_info("\tag ws up")
350
- print_info("2. Stop workspace:")
351
- print_info("\tag ws down")
352
-
353
- if ws_config.ws_schema is not None and agno_config.user is not None:
354
- log_workspace_event(
355
- user=agno_config.user,
356
- workspace_event=WorkspaceEvent(
357
- id_workspace=ws_config.ws_schema.id_workspace,
358
- event_type="setup",
359
- event_status="success",
360
- event_data={"workspace_root_path": str(ws_root_path)},
361
- ),
362
- )
363
- return ws_config
364
- else:
365
- print_info("Workspace setup unsuccessful. Please try again.")
366
- return None
367
- ######################################################
368
- ## End Workspace setup
369
- ######################################################
370
-
371
-
372
- def start_workspace(
373
- agno_config: AgnoCliConfig,
374
- ws_config: WorkspaceConfig,
375
- target_env: Optional[str] = None,
376
- target_infra: Optional[str] = None,
377
- target_group: Optional[str] = None,
378
- target_name: Optional[str] = None,
379
- target_type: Optional[str] = None,
380
- dry_run: Optional[bool] = False,
381
- auto_confirm: Optional[bool] = False,
382
- force: Optional[bool] = None,
383
- pull: Optional[bool] = False,
384
- ) -> None:
385
- """Start an Agno Workspace. This is called from `ag ws up`"""
386
- if ws_config is None:
387
- logger.error("WorkspaceConfig invalid")
388
- return
389
-
390
- print_heading("Starting workspace: {}".format(str(ws_config.ws_root_path.stem)))
391
- logger.debug(f"\ttarget_env : {target_env}")
392
- logger.debug(f"\ttarget_infra : {target_infra}")
393
- logger.debug(f"\ttarget_group : {target_group}")
394
- logger.debug(f"\ttarget_name : {target_name}")
395
- logger.debug(f"\ttarget_type : {target_type}")
396
- logger.debug(f"\tdry_run : {dry_run}")
397
- logger.debug(f"\tauto_confirm : {auto_confirm}")
398
- logger.debug(f"\tforce : {force}")
399
- logger.debug(f"\tpull : {pull}")
400
-
401
- # Set the local environment variables before processing configs
402
- ws_config.set_local_env()
403
-
404
- # Get resource groups to deploy
405
- resource_groups_to_create: List[InfraResources] = ws_config.get_resources(
406
- env=target_env,
407
- infra=target_infra,
408
- order="create",
409
- )
410
-
411
- # Track number of resource groups created
412
- num_rgs_created = 0
413
- num_rgs_to_create = len(resource_groups_to_create)
414
- # Track number of resources created
415
- num_resources_created = 0
416
- num_resources_to_create = 0
417
-
418
- if num_rgs_to_create == 0:
419
- print_info("No resources to create")
420
- return
421
-
422
- logger.debug(f"Deploying {num_rgs_to_create} resource groups")
423
- for rg in resource_groups_to_create:
424
- _num_resources_created, _num_resources_to_create = rg.create_resources(
425
- group_filter=target_group,
426
- name_filter=target_name,
427
- type_filter=target_type,
428
- dry_run=dry_run,
429
- auto_confirm=auto_confirm,
430
- force=force,
431
- pull=pull,
432
- )
433
- if _num_resources_created > 0:
434
- num_rgs_created += 1
435
- num_resources_created += _num_resources_created
436
- num_resources_to_create += _num_resources_to_create
437
- logger.debug(f"Deployed {num_resources_created} resources in {num_rgs_created} resource groups")
438
-
439
- if dry_run:
440
- return
441
-
442
- if num_resources_created == 0:
443
- return
444
-
445
- print_heading(f"\n--**-- ResourceGroups deployed: {num_rgs_created}/{num_rgs_to_create}\n")
446
-
447
- workspace_event_status = "in_progress"
448
- if num_resources_created == num_resources_to_create:
449
- workspace_event_status = "success"
450
- else:
451
- logger.error("Some resources failed to create, please check logs")
452
- workspace_event_status = "failed"
453
-
454
- if (
455
- agno_config.user is not None
456
- and ws_config.ws_schema is not None
457
- and ws_config.ws_schema.id_workspace is not None
458
- ):
459
- # Log workspace start event
460
- log_workspace_event(
461
- user=agno_config.user,
462
- workspace_event=WorkspaceEvent(
463
- id_workspace=ws_config.ws_schema.id_workspace,
464
- event_type="start",
465
- event_status=workspace_event_status,
466
- event_data={
467
- "target_env": target_env,
468
- "target_infra": target_infra,
469
- "target_group": target_group,
470
- "target_name": target_name,
471
- "target_type": target_type,
472
- "dry_run": dry_run,
473
- "auto_confirm": auto_confirm,
474
- "force": force,
475
- },
476
- ),
477
- )
478
-
479
-
480
- def stop_workspace(
481
- agno_config: AgnoCliConfig,
482
- ws_config: WorkspaceConfig,
483
- target_env: Optional[str] = None,
484
- target_infra: Optional[str] = None,
485
- target_group: Optional[str] = None,
486
- target_name: Optional[str] = None,
487
- target_type: Optional[str] = None,
488
- dry_run: Optional[bool] = False,
489
- auto_confirm: Optional[bool] = False,
490
- force: Optional[bool] = None,
491
- ) -> None:
492
- """Stop an Agno Workspace. This is called from `ag ws down`"""
493
- if ws_config is None:
494
- logger.error("WorkspaceConfig invalid")
495
- return
496
-
497
- print_heading("Stopping workspace: {}".format(str(ws_config.ws_root_path.stem)))
498
- logger.debug(f"\ttarget_env : {target_env}")
499
- logger.debug(f"\ttarget_infra : {target_infra}")
500
- logger.debug(f"\ttarget_group : {target_group}")
501
- logger.debug(f"\ttarget_name : {target_name}")
502
- logger.debug(f"\ttarget_type : {target_type}")
503
- logger.debug(f"\tdry_run : {dry_run}")
504
- logger.debug(f"\tauto_confirm : {auto_confirm}")
505
- logger.debug(f"\tforce : {force}")
506
-
507
- # Set the local environment variables before processing configs
508
- ws_config.set_local_env()
509
-
510
- # Get resource groups to delete
511
- resource_groups_to_delete: List[InfraResources] = ws_config.get_resources(
512
- env=target_env,
513
- infra=target_infra,
514
- order="delete",
515
- )
516
-
517
- # Track number of resource groups deleted
518
- num_rgs_deleted = 0
519
- num_rgs_to_delete = len(resource_groups_to_delete)
520
- # Track number of resources deleted
521
- num_resources_deleted = 0
522
- num_resources_to_delete = 0
523
-
524
- if num_rgs_to_delete == 0:
525
- print_info("No resources to delete")
526
- return
527
-
528
- logger.debug(f"Deleting {num_rgs_to_delete} resource groups")
529
- for rg in resource_groups_to_delete:
530
- _num_resources_deleted, _num_resources_to_delete = rg.delete_resources(
531
- group_filter=target_group,
532
- name_filter=target_name,
533
- type_filter=target_type,
534
- dry_run=dry_run,
535
- auto_confirm=auto_confirm,
536
- force=force,
537
- )
538
- if _num_resources_deleted > 0:
539
- num_rgs_deleted += 1
540
- num_resources_deleted += _num_resources_deleted
541
- num_resources_to_delete += _num_resources_to_delete
542
- logger.debug(f"Deleted {num_resources_deleted} resources in {num_rgs_deleted} resource groups")
543
-
544
- if dry_run:
545
- return
546
-
547
- if num_resources_deleted == 0:
548
- return
549
-
550
- print_heading(f"\n--**-- ResourceGroups deleted: {num_rgs_deleted}/{num_rgs_to_delete}\n")
551
-
552
- workspace_event_status = "in_progress"
553
- if num_resources_to_delete == num_resources_deleted:
554
- workspace_event_status = "success"
555
- else:
556
- logger.error("Some resources failed to delete, please check logs")
557
- workspace_event_status = "failed"
558
-
559
- if (
560
- agno_config.user is not None
561
- and ws_config.ws_schema is not None
562
- and ws_config.ws_schema.id_workspace is not None
563
- ):
564
- # Log workspace stop event
565
- log_workspace_event(
566
- user=agno_config.user,
567
- workspace_event=WorkspaceEvent(
568
- id_workspace=ws_config.ws_schema.id_workspace,
569
- event_type="stop",
570
- event_status=workspace_event_status,
571
- event_data={
572
- "target_env": target_env,
573
- "target_infra": target_infra,
574
- "target_group": target_group,
575
- "target_name": target_name,
576
- "target_type": target_type,
577
- "dry_run": dry_run,
578
- "auto_confirm": auto_confirm,
579
- "force": force,
580
- },
581
- ),
582
- )
583
-
584
-
585
- def update_workspace(
586
- agno_config: AgnoCliConfig,
587
- ws_config: WorkspaceConfig,
588
- target_env: Optional[str] = None,
589
- target_infra: Optional[str] = None,
590
- target_group: Optional[str] = None,
591
- target_name: Optional[str] = None,
592
- target_type: Optional[str] = None,
593
- dry_run: Optional[bool] = False,
594
- auto_confirm: Optional[bool] = False,
595
- force: Optional[bool] = None,
596
- pull: Optional[bool] = False,
597
- ) -> None:
598
- """Update an Agno Workspace. This is called from `ag ws patch`"""
599
- if ws_config is None:
600
- logger.error("WorkspaceConfig invalid")
601
- return
602
-
603
- print_heading("Updating workspace: {}".format(str(ws_config.ws_root_path.stem)))
604
- logger.debug(f"\ttarget_env : {target_env}")
605
- logger.debug(f"\ttarget_infra : {target_infra}")
606
- logger.debug(f"\ttarget_group : {target_group}")
607
- logger.debug(f"\ttarget_name : {target_name}")
608
- logger.debug(f"\ttarget_type : {target_type}")
609
- logger.debug(f"\tdry_run : {dry_run}")
610
- logger.debug(f"\tauto_confirm : {auto_confirm}")
611
- logger.debug(f"\tforce : {force}")
612
- logger.debug(f"\tpull : {pull}")
613
-
614
- # Set the local environment variables before processing configs
615
- ws_config.set_local_env()
616
-
617
- # Get resource groups to update
618
- resource_groups_to_update: List[InfraResources] = ws_config.get_resources(
619
- env=target_env,
620
- infra=target_infra,
621
- order="create",
622
- )
623
- # Track number of resource groups updated
624
- num_rgs_updated = 0
625
- num_rgs_to_update = len(resource_groups_to_update)
626
- # Track number of resources updated
627
- num_resources_updated = 0
628
- num_resources_to_update = 0
629
-
630
- if num_rgs_to_update == 0:
631
- print_info("No resources to update")
632
- return
633
-
634
- logger.debug(f"Updating {num_rgs_to_update} resource groups")
635
- for rg in resource_groups_to_update:
636
- _num_resources_updated, _num_resources_to_update = rg.update_resources(
637
- group_filter=target_group,
638
- name_filter=target_name,
639
- type_filter=target_type,
640
- dry_run=dry_run,
641
- auto_confirm=auto_confirm,
642
- force=force,
643
- pull=pull,
644
- )
645
- if _num_resources_updated > 0:
646
- num_rgs_updated += 1
647
- num_resources_updated += _num_resources_updated
648
- num_resources_to_update += _num_resources_to_update
649
- logger.debug(f"Updated {num_resources_updated} resources in {num_rgs_updated} resource groups")
650
-
651
- if dry_run:
652
- return
653
-
654
- if num_resources_updated == 0:
655
- return
656
-
657
- print_heading(f"\n--**-- ResourceGroups updated: {num_rgs_updated}/{num_rgs_to_update}\n")
658
-
659
- workspace_event_status = "in_progress"
660
- if num_resources_updated == num_resources_to_update:
661
- workspace_event_status = "success"
662
- else:
663
- logger.error("Some resources failed to update, please check logs")
664
- workspace_event_status = "failed"
665
-
666
- if (
667
- agno_config.user is not None
668
- and ws_config.ws_schema is not None
669
- and ws_config.ws_schema.id_workspace is not None
670
- ):
671
- # Log workspace start event
672
- log_workspace_event(
673
- user=agno_config.user,
674
- workspace_event=WorkspaceEvent(
675
- id_workspace=ws_config.ws_schema.id_workspace,
676
- event_type="update",
677
- event_status=workspace_event_status,
678
- event_data={
679
- "target_env": target_env,
680
- "target_infra": target_infra,
681
- "target_group": target_group,
682
- "target_name": target_name,
683
- "target_type": target_type,
684
- "dry_run": dry_run,
685
- "auto_confirm": auto_confirm,
686
- "force": force,
687
- },
688
- ),
689
- )
690
-
691
-
692
- def delete_workspace(agno_config: AgnoCliConfig, ws_to_delete: Optional[List[Path]]) -> None:
693
- if ws_to_delete is None or len(ws_to_delete) == 0:
694
- print_heading("No workspaces to delete")
695
- return
696
-
697
- for ws_root in ws_to_delete:
698
- agno_config.delete_ws(ws_root_path=ws_root)
699
-
700
-
701
- def set_workspace_as_active(ws_dir_name: Optional[str]) -> None:
702
- from agno.cli.operator import initialize_agno
703
-
704
- ######################################################
705
- ## 1. Validate Pre-requisites
706
- ######################################################
707
- ######################################################
708
- # 1.1 Check AgnoCliConfig is valid
709
- ######################################################
710
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
711
- if not agno_config:
712
- agno_config = initialize_agno()
713
- if not agno_config:
714
- log_config_not_available_msg()
715
- return
716
-
717
- ######################################################
718
- # 1.2 Check ws_root_path is valid
719
- ######################################################
720
- # By default, we assume this command is run from the workspace directory
721
- ws_root_path: Optional[Path] = None
722
- if ws_dir_name is None:
723
- # If the user does not provide a ws_name, that implies `ag set` is ran from
724
- # the workspace directory.
725
- ws_root_path = Path(".").resolve()
726
- else:
727
- # If the user provides a workspace name manually, we find the dir for that ws
728
- ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_dir_name(ws_dir_name)
729
- if ws_config is None:
730
- logger.error(f"Could not find workspace {ws_dir_name}")
731
- return
732
- ws_root_path = ws_config.ws_root_path
733
-
734
- ws_dir_is_valid: bool = ws_root_path is not None and ws_root_path.exists() and ws_root_path.is_dir()
735
- if not ws_dir_is_valid:
736
- logger.error("Invalid workspace directory: {}".format(ws_root_path))
737
- return
738
-
739
- ######################################################
740
- # 1.3 Validate WorkspaceConfig is available i.e. a workspace is available at this directory
741
- ######################################################
742
- logger.debug(f"Checking for a workspace at path: {ws_root_path}")
743
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(ws_root_path)
744
- if active_ws_config is None:
745
- # This happens when the workspace is not yet setup
746
- print_info(f"Could not find a workspace at path: {ws_root_path}")
747
- # TODO: setup automatically for the user
748
- print_info("If this workspace has not been setup, please run `ag ws setup` from the workspace directory")
749
- return
750
-
751
- ######################################################
752
- ## 2. Set workspace as active
753
- ######################################################
754
- print_heading(f"Setting workspace {active_ws_config.ws_root_path.stem} as active")
755
- agno_config.set_active_ws_dir(active_ws_config.ws_root_path)
756
- print_info("Active workspace updated")
757
- return