agno 1.8.1__py3-none-any.whl → 2.0.0a1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -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 +204 -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 +413 -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 +179 -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 +58 -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 +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -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/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -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 +2961 -4253
  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 +42 -22
  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 +18 -13
  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 +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  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 +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  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 +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  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 +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.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