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
agno/cli/ws/ws_cli.py DELETED
@@ -1,817 +0,0 @@
1
- """Agno Workspace Cli
2
-
3
- This is the entrypoint for the `agno ws` application.
4
- """
5
-
6
- from pathlib import Path
7
- from typing import List, Optional, cast
8
-
9
- import typer
10
-
11
- from agno.cli.console import (
12
- log_active_workspace_not_available,
13
- log_config_not_available_msg,
14
- print_available_workspaces,
15
- print_info,
16
- )
17
- from agno.utils.log import logger, set_log_level_to_debug
18
-
19
- ws_cli = typer.Typer(
20
- name="ws",
21
- short_help="Manage workspaces",
22
- help="""\b
23
- Use `ag ws [COMMAND]` to create, setup, start or stop your workspace.
24
- Run `ag ws [COMMAND] --help` for more info.
25
- """,
26
- no_args_is_help=True,
27
- add_completion=False,
28
- invoke_without_command=True,
29
- options_metavar="",
30
- subcommand_metavar="[COMMAND] [OPTIONS]",
31
- )
32
-
33
-
34
- @ws_cli.command(short_help="Create a new workspace in the current directory.")
35
- def create(
36
- name: Optional[str] = typer.Option(
37
- None,
38
- "-n",
39
- "--name",
40
- help="Name of the new workspace.",
41
- show_default=False,
42
- ),
43
- template: Optional[str] = typer.Option(
44
- None,
45
- "-t",
46
- "--template",
47
- help="Starter template for the workspace.",
48
- show_default=False,
49
- ),
50
- url: Optional[str] = typer.Option(
51
- None,
52
- "-u",
53
- "--url",
54
- help="URL of the starter template.",
55
- show_default=False,
56
- ),
57
- print_debug_log: bool = typer.Option(
58
- False,
59
- "-d",
60
- "--debug",
61
- help="Print debug logs.",
62
- ),
63
- ):
64
- """\b
65
- Create a new workspace in the current directory using a starter template or url
66
- \b
67
- Examples:
68
- > ag ws create -t ai-app -> Create an `ai-app` in the current directory
69
- > ag ws create -t ai-app -n my-ai-app -> Create an `ai-app` named `my-ai-app` in the current directory
70
- """
71
- if print_debug_log:
72
- set_log_level_to_debug()
73
-
74
- from agno.workspace.operator import create_workspace
75
-
76
- create_workspace(name=name, template=template, url=url)
77
-
78
-
79
- @ws_cli.command(short_help="Setup workspace from the current directory")
80
- def setup(
81
- path: Optional[str] = typer.Argument(
82
- None,
83
- help="Path to workspace [default: current directory]",
84
- show_default=False,
85
- ),
86
- print_debug_log: bool = typer.Option(
87
- False,
88
- "-d",
89
- "--debug",
90
- help="Print debug logs.",
91
- ),
92
- ):
93
- """\b
94
- Setup a workspace. This command can be run from the workspace directory OR using the workspace path.
95
- \b
96
- Examples:
97
- > `ag ws setup` -> Setup the current directory as a workspace
98
- > `ag ws setup ai-app` -> Setup the `ai-app` folder as a workspace
99
- """
100
- if print_debug_log:
101
- set_log_level_to_debug()
102
-
103
- from agno.workspace.operator import setup_workspace
104
-
105
- # By default, we assume this command is run from the workspace directory
106
- ws_root_path: Path = Path(".").resolve()
107
-
108
- # If the user provides a path, use that to setup the workspace
109
- if path is not None:
110
- ws_root_path = Path(".").joinpath(path).resolve()
111
- setup_workspace(ws_root_path=ws_root_path)
112
-
113
-
114
- @ws_cli.command(short_help="Create resources for the active workspace")
115
- def up(
116
- resource_filter: Optional[str] = typer.Argument(
117
- None,
118
- help="Resource filter. Format - ENV:INFRA:GROUP:NAME:TYPE",
119
- ),
120
- env_filter: Optional[str] = typer.Option(None, "-e", "--env", metavar="", help="Filter the environment to deploy."),
121
- infra_filter: Optional[str] = typer.Option(None, "-i", "--infra", metavar="", help="Filter the infra to deploy."),
122
- group_filter: Optional[str] = typer.Option(
123
- None, "-g", "--group", metavar="", help="Filter resources using group name."
124
- ),
125
- name_filter: Optional[str] = typer.Option(None, "-n", "--name", metavar="", help="Filter resource using name."),
126
- type_filter: Optional[str] = typer.Option(
127
- None,
128
- "-t",
129
- "--type",
130
- metavar="",
131
- help="Filter resource using type",
132
- ),
133
- dry_run: bool = typer.Option(
134
- False,
135
- "-dr",
136
- "--dry-run",
137
- help="Print resources and exit.",
138
- ),
139
- auto_confirm: bool = typer.Option(
140
- False,
141
- "-y",
142
- "--yes",
143
- help="Skip confirmation before deploying resources.",
144
- ),
145
- print_debug_log: bool = typer.Option(
146
- False,
147
- "-d",
148
- "--debug",
149
- help="Print debug logs.",
150
- ),
151
- force: Optional[bool] = typer.Option(
152
- None,
153
- "-f",
154
- "--force",
155
- help="Force create resources where applicable.",
156
- ),
157
- pull: Optional[bool] = typer.Option(
158
- None,
159
- "-p",
160
- "--pull",
161
- help="Pull images where applicable.",
162
- ),
163
- ):
164
- """\b
165
- Create resources for the active workspace
166
- Options can be used to limit the resources to create.
167
- --env : Env (dev, stg, prd)
168
- --infra : Infra type (docker, aws)
169
- --group : Group name
170
- --name : Resource name
171
- --type : Resource type
172
- \b
173
- Options can also be provided as a RESOURCE_FILTER in the format: ENV:INFRA:GROUP:NAME:TYPE
174
- \b
175
- Examples:
176
- > `ag ws up` -> Deploy all resources
177
- > `ag ws up dev` -> Deploy all dev resources
178
- > `ag ws up prd` -> Deploy all prd resources
179
- > `ag ws up prd:aws` -> Deploy all prd aws resources
180
- > `ag ws up prd:::s3` -> Deploy prd resources matching name s3
181
- """
182
- if print_debug_log:
183
- set_log_level_to_debug()
184
-
185
- from agno.cli.config import AgnoCliConfig
186
- from agno.cli.operator import initialize_agno
187
- from agno.utils.resource_filter import parse_resource_filter
188
- from agno.workspace.config import WorkspaceConfig
189
- from agno.workspace.helpers import get_workspace_dir_path
190
- from agno.workspace.operator import setup_workspace, start_workspace
191
-
192
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
193
- if not agno_config:
194
- agno_config = initialize_agno()
195
- if not agno_config:
196
- log_config_not_available_msg()
197
- return
198
- agno_config = cast(AgnoCliConfig, agno_config)
199
-
200
- # Workspace to start
201
- ws_to_start: Optional[WorkspaceConfig] = None
202
-
203
- # If there is an existing workspace at current path, use that workspace
204
- current_path: Path = Path(".").resolve()
205
- ws_at_current_path: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(current_path)
206
- if ws_at_current_path is not None:
207
- logger.debug(f"Found workspace at: {ws_at_current_path.ws_root_path}")
208
- if str(ws_at_current_path.ws_root_path) != agno_config.active_ws_dir:
209
- logger.debug(f"Updating active workspace to {ws_at_current_path.ws_root_path}")
210
- agno_config.set_active_ws_dir(ws_at_current_path.ws_root_path)
211
- ws_to_start = ws_at_current_path
212
-
213
- # If there's no existing workspace at current path, check if there's a `workspace` dir in the current path
214
- # In that case setup the workspace
215
- if ws_to_start is None:
216
- workspace_ws_dir_path = get_workspace_dir_path(current_path)
217
- if workspace_ws_dir_path is not None:
218
- logger.debug(f"Found workspace directory: {workspace_ws_dir_path}")
219
- logger.debug(f"Setting up a workspace at: {current_path}")
220
- ws_to_start = setup_workspace(ws_root_path=current_path)
221
- print_info("")
222
-
223
- # If there's no workspace at current path, check if an active workspace exists
224
- if ws_to_start is None:
225
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_active_ws_config()
226
- # If there's an active workspace, use that workspace
227
- if active_ws_config is not None:
228
- ws_to_start = active_ws_config
229
-
230
- # If there's no workspace to start, raise an error showing available workspaces
231
- if ws_to_start is None:
232
- log_active_workspace_not_available()
233
- avl_ws = agno_config.available_ws
234
- if avl_ws:
235
- print_available_workspaces(avl_ws)
236
- return
237
-
238
- target_env: Optional[str] = None
239
- target_infra: Optional[str] = None
240
- target_group: Optional[str] = None
241
- target_name: Optional[str] = None
242
- target_type: Optional[str] = None
243
-
244
- # derive env:infra:name:type:group from ws_filter
245
- if resource_filter is not None:
246
- if not isinstance(resource_filter, str):
247
- raise TypeError(f"Invalid resource_filter. Expected: str, Received: {type(resource_filter)}")
248
- (
249
- target_env,
250
- target_infra,
251
- target_group,
252
- target_name,
253
- target_type,
254
- ) = parse_resource_filter(resource_filter)
255
-
256
- # derive env:infra:name:type:group from command options
257
- if target_env is None and env_filter is not None and isinstance(env_filter, str):
258
- target_env = env_filter
259
- if target_infra is None and infra_filter is not None and isinstance(infra_filter, str):
260
- target_infra = infra_filter
261
- if target_group is None and group_filter is not None and isinstance(group_filter, str):
262
- target_group = group_filter
263
- if target_name is None and name_filter is not None and isinstance(name_filter, str):
264
- target_name = name_filter
265
- if target_type is None and type_filter is not None and isinstance(type_filter, str):
266
- target_type = type_filter
267
-
268
- # derive env:infra:name:type:group from defaults
269
- if target_env is None:
270
- target_env = ws_to_start.workspace_settings.default_env if ws_to_start.workspace_settings else None
271
- if target_infra is None:
272
- target_infra = ws_to_start.workspace_settings.default_infra if ws_to_start.workspace_settings else None
273
-
274
- start_workspace(
275
- agno_config=agno_config,
276
- ws_config=ws_to_start,
277
- target_env=target_env,
278
- target_infra=target_infra,
279
- target_group=target_group,
280
- target_name=target_name,
281
- target_type=target_type,
282
- dry_run=dry_run,
283
- auto_confirm=auto_confirm,
284
- force=force,
285
- pull=pull,
286
- )
287
-
288
-
289
- @ws_cli.command(short_help="Delete resources for active workspace")
290
- def down(
291
- resource_filter: Optional[str] = typer.Argument(
292
- None,
293
- help="Resource filter. Format - ENV:INFRA:GROUP:NAME:TYPE",
294
- ),
295
- env_filter: str = typer.Option(None, "-e", "--env", metavar="", help="Filter the environment to shut down."),
296
- infra_filter: Optional[str] = typer.Option(
297
- None, "-i", "--infra", metavar="", help="Filter the infra to shut down."
298
- ),
299
- group_filter: Optional[str] = typer.Option(
300
- None, "-g", "--group", metavar="", help="Filter resources using group name."
301
- ),
302
- name_filter: Optional[str] = typer.Option(None, "-n", "--name", metavar="", help="Filter resource using name."),
303
- type_filter: Optional[str] = typer.Option(
304
- None,
305
- "-t",
306
- "--type",
307
- metavar="",
308
- help="Filter resource using type",
309
- ),
310
- dry_run: bool = typer.Option(
311
- False,
312
- "-dr",
313
- "--dry-run",
314
- help="Print resources and exit.",
315
- ),
316
- auto_confirm: bool = typer.Option(
317
- False,
318
- "-y",
319
- "--yes",
320
- help="Skip the confirmation before deleting resources.",
321
- ),
322
- print_debug_log: bool = typer.Option(
323
- False,
324
- "-d",
325
- "--debug",
326
- help="Print debug logs.",
327
- ),
328
- force: bool = typer.Option(
329
- None,
330
- "-f",
331
- "--force",
332
- help="Force",
333
- ),
334
- ):
335
- """\b
336
- Delete resources for the active workspace.
337
- Options can be used to limit the resources to delete.
338
- --env : Env (dev, stg, prd)
339
- --infra : Infra type (docker, aws)
340
- --group : Group name
341
- --name : Resource name
342
- --type : Resource type
343
- \b
344
- Options can also be provided as a RESOURCE_FILTER in the format: ENV:INFRA:GROUP:NAME:TYPE
345
- \b
346
- Examples:
347
- > `ag ws down` -> Delete all resources
348
- """
349
- if print_debug_log:
350
- set_log_level_to_debug()
351
-
352
- from agno.cli.config import AgnoCliConfig
353
- from agno.cli.operator import initialize_agno
354
- from agno.utils.resource_filter import parse_resource_filter
355
- from agno.workspace.config import WorkspaceConfig
356
- from agno.workspace.helpers import get_workspace_dir_path
357
- from agno.workspace.operator import setup_workspace, stop_workspace
358
-
359
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
360
- if not agno_config:
361
- agno_config = initialize_agno()
362
- if not agno_config:
363
- log_config_not_available_msg()
364
- return
365
-
366
- # Workspace to stop
367
- ws_to_stop: Optional[WorkspaceConfig] = None
368
-
369
- # If there is an existing workspace at current path, use that workspace
370
- current_path: Path = Path(".").resolve()
371
- ws_at_current_path: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(current_path)
372
- if ws_at_current_path is not None:
373
- logger.debug(f"Found workspace at: {ws_at_current_path.ws_root_path}")
374
- if str(ws_at_current_path.ws_root_path) != agno_config.active_ws_dir:
375
- logger.debug(f"Updating active workspace to {ws_at_current_path.ws_root_path}")
376
- agno_config.set_active_ws_dir(ws_at_current_path.ws_root_path)
377
- ws_to_stop = ws_at_current_path
378
-
379
- # If there's no existing workspace at current path, check if there's a `workspace` dir in the current path
380
- # In that case setup the workspace
381
- if ws_to_stop is None:
382
- workspace_ws_dir_path = get_workspace_dir_path(current_path)
383
- if workspace_ws_dir_path is not None:
384
- logger.debug(f"Found workspace directory: {workspace_ws_dir_path}")
385
- logger.debug(f"Setting up a workspace at: {current_path}")
386
- ws_to_stop = setup_workspace(ws_root_path=current_path)
387
- print_info("")
388
-
389
- # If there's no workspace at current path, check if an active workspace exists
390
- if ws_to_stop is None:
391
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_active_ws_config()
392
- # If there's an active workspace, use that workspace
393
- if active_ws_config is not None:
394
- ws_to_stop = active_ws_config
395
-
396
- # If there's no workspace to stop, raise an error showing available workspaces
397
- if ws_to_stop is None:
398
- log_active_workspace_not_available()
399
- avl_ws = agno_config.available_ws
400
- if avl_ws:
401
- print_available_workspaces(avl_ws)
402
- return
403
-
404
- target_env: Optional[str] = None
405
- target_infra: Optional[str] = None
406
- target_group: Optional[str] = None
407
- target_name: Optional[str] = None
408
- target_type: Optional[str] = None
409
-
410
- # derive env:infra:name:type:group from ws_filter
411
- if resource_filter is not None:
412
- if not isinstance(resource_filter, str):
413
- raise TypeError(f"Invalid resource_filter. Expected: str, Received: {type(resource_filter)}")
414
- (
415
- target_env,
416
- target_infra,
417
- target_group,
418
- target_name,
419
- target_type,
420
- ) = parse_resource_filter(resource_filter)
421
-
422
- # derive env:infra:name:type:group from command options
423
- if target_env is None and env_filter is not None and isinstance(env_filter, str):
424
- target_env = env_filter
425
- if target_infra is None and infra_filter is not None and isinstance(infra_filter, str):
426
- target_infra = infra_filter
427
- if target_group is None and group_filter is not None and isinstance(group_filter, str):
428
- target_group = group_filter
429
- if target_name is None and name_filter is not None and isinstance(name_filter, str):
430
- target_name = name_filter
431
- if target_type is None and type_filter is not None and isinstance(type_filter, str):
432
- target_type = type_filter
433
-
434
- # derive env:infra:name:type:group from defaults
435
- if target_env is None:
436
- target_env = ws_to_stop.workspace_settings.default_env if ws_to_stop.workspace_settings else None
437
- if target_infra is None:
438
- target_infra = ws_to_stop.workspace_settings.default_infra if ws_to_stop.workspace_settings else None
439
-
440
- stop_workspace(
441
- agno_config=agno_config,
442
- ws_config=ws_to_stop,
443
- target_env=target_env,
444
- target_infra=target_infra,
445
- target_group=target_group,
446
- target_name=target_name,
447
- target_type=target_type,
448
- dry_run=dry_run,
449
- auto_confirm=auto_confirm,
450
- force=force,
451
- )
452
-
453
-
454
- @ws_cli.command(short_help="Update resources for active workspace")
455
- def patch(
456
- resource_filter: Optional[str] = typer.Argument(
457
- None,
458
- help="Resource filter. Format - ENV:INFRA:GROUP:NAME:TYPE",
459
- ),
460
- env_filter: str = typer.Option(None, "-e", "--env", metavar="", help="Filter the environment to patch."),
461
- infra_filter: Optional[str] = typer.Option(None, "-i", "--infra", metavar="", help="Filter the infra to patch."),
462
- group_filter: Optional[str] = typer.Option(
463
- None, "-g", "--group", metavar="", help="Filter resources using group name."
464
- ),
465
- name_filter: Optional[str] = typer.Option(None, "-n", "--name", metavar="", help="Filter resource using name."),
466
- type_filter: Optional[str] = typer.Option(
467
- None,
468
- "-t",
469
- "--type",
470
- metavar="",
471
- help="Filter resource using type",
472
- ),
473
- dry_run: bool = typer.Option(
474
- False,
475
- "-dr",
476
- "--dry-run",
477
- help="Print resources and exit.",
478
- ),
479
- auto_confirm: bool = typer.Option(
480
- False,
481
- "-y",
482
- "--yes",
483
- help="Skip the confirmation before patching resources.",
484
- ),
485
- print_debug_log: bool = typer.Option(
486
- False,
487
- "-d",
488
- "--debug",
489
- help="Print debug logs.",
490
- ),
491
- force: bool = typer.Option(
492
- None,
493
- "-f",
494
- "--force",
495
- help="Force",
496
- ),
497
- pull: Optional[bool] = typer.Option(
498
- None,
499
- "-p",
500
- "--pull",
501
- help="Pull images where applicable.",
502
- ),
503
- ):
504
- """\b
505
- Update resources for the active workspace.
506
- Options can be used to limit the resources to update.
507
- --env : Env (dev, stg, prd)
508
- --infra : Infra type (docker, aws)
509
- --group : Group name
510
- --name : Resource name
511
- --type : Resource type
512
- \b
513
- Options can also be provided as a RESOURCE_FILTER in the format: ENV:INFRA:GROUP:NAME:TYPE
514
- Examples:
515
- \b
516
- > `ag ws patch` -> Patch all resources
517
- """
518
- if print_debug_log:
519
- set_log_level_to_debug()
520
-
521
- from agno.cli.config import AgnoCliConfig
522
- from agno.cli.operator import initialize_agno
523
- from agno.utils.resource_filter import parse_resource_filter
524
- from agno.workspace.config import WorkspaceConfig
525
- from agno.workspace.helpers import get_workspace_dir_path
526
- from agno.workspace.operator import setup_workspace, update_workspace
527
-
528
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
529
- if not agno_config:
530
- agno_config = initialize_agno()
531
- if not agno_config:
532
- log_config_not_available_msg()
533
- return
534
-
535
- # Workspace to patch
536
- ws_to_patch: Optional[WorkspaceConfig] = None
537
-
538
- # If there is an existing workspace at current path, use that workspace
539
- current_path: Path = Path(".").resolve()
540
- ws_at_current_path: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(current_path)
541
- if ws_at_current_path is not None:
542
- logger.debug(f"Found workspace at: {ws_at_current_path.ws_root_path}")
543
- if str(ws_at_current_path.ws_root_path) != agno_config.active_ws_dir:
544
- logger.debug(f"Updating active workspace to {ws_at_current_path.ws_root_path}")
545
- agno_config.set_active_ws_dir(ws_at_current_path.ws_root_path)
546
- ws_to_patch = ws_at_current_path
547
-
548
- # If there's no existing workspace at current path, check if there's a `workspace` dir in the current path
549
- # In that case setup the workspace
550
- if ws_to_patch is None:
551
- workspace_ws_dir_path = get_workspace_dir_path(current_path)
552
- if workspace_ws_dir_path is not None:
553
- logger.debug(f"Found workspace directory: {workspace_ws_dir_path}")
554
- logger.debug(f"Setting up a workspace at: {current_path}")
555
- ws_to_patch = setup_workspace(ws_root_path=current_path)
556
- print_info("")
557
-
558
- # If there's no workspace at current path, check if an active workspace exists
559
- if ws_to_patch is None:
560
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_active_ws_config()
561
- # If there's an active workspace, use that workspace
562
- if active_ws_config is not None:
563
- ws_to_patch = active_ws_config
564
-
565
- # If there's no workspace to patch, raise an error showing available workspaces
566
- if ws_to_patch is None:
567
- log_active_workspace_not_available()
568
- avl_ws = agno_config.available_ws
569
- if avl_ws:
570
- print_available_workspaces(avl_ws)
571
- return
572
-
573
- target_env: Optional[str] = None
574
- target_infra: Optional[str] = None
575
- target_group: Optional[str] = None
576
- target_name: Optional[str] = None
577
- target_type: Optional[str] = None
578
-
579
- # derive env:infra:name:type:group from ws_filter
580
- if resource_filter is not None:
581
- if not isinstance(resource_filter, str):
582
- raise TypeError(f"Invalid resource_filter. Expected: str, Received: {type(resource_filter)}")
583
- (
584
- target_env,
585
- target_infra,
586
- target_group,
587
- target_name,
588
- target_type,
589
- ) = parse_resource_filter(resource_filter)
590
-
591
- # derive env:infra:name:type:group from command options
592
- if target_env is None and env_filter is not None and isinstance(env_filter, str):
593
- target_env = env_filter
594
- if target_infra is None and infra_filter is not None and isinstance(infra_filter, str):
595
- target_infra = infra_filter
596
- if target_group is None and group_filter is not None and isinstance(group_filter, str):
597
- target_group = group_filter
598
- if target_name is None and name_filter is not None and isinstance(name_filter, str):
599
- target_name = name_filter
600
- if target_type is None and type_filter is not None and isinstance(type_filter, str):
601
- target_type = type_filter
602
-
603
- # derive env:infra:name:type:group from defaults
604
- if target_env is None:
605
- target_env = ws_to_patch.workspace_settings.default_env if ws_to_patch.workspace_settings else None
606
- if target_infra is None:
607
- target_infra = ws_to_patch.workspace_settings.default_infra if ws_to_patch.workspace_settings else None
608
-
609
- update_workspace(
610
- agno_config=agno_config,
611
- ws_config=ws_to_patch,
612
- target_env=target_env,
613
- target_infra=target_infra,
614
- target_group=target_group,
615
- target_name=target_name,
616
- target_type=target_type,
617
- dry_run=dry_run,
618
- auto_confirm=auto_confirm,
619
- force=force,
620
- pull=pull,
621
- )
622
-
623
-
624
- @ws_cli.command(short_help="Restart resources for active workspace")
625
- def restart(
626
- resource_filter: Optional[str] = typer.Argument(
627
- None,
628
- help="Resource filter. Format - ENV:INFRA:GROUP:NAME:TYPE",
629
- ),
630
- env_filter: str = typer.Option(None, "-e", "--env", metavar="", help="Filter the environment to restart."),
631
- infra_filter: Optional[str] = typer.Option(None, "-i", "--infra", metavar="", help="Filter the infra to restart."),
632
- group_filter: Optional[str] = typer.Option(
633
- None, "-g", "--group", metavar="", help="Filter resources using group name."
634
- ),
635
- name_filter: Optional[str] = typer.Option(None, "-n", "--name", metavar="", help="Filter resource using name."),
636
- type_filter: Optional[str] = typer.Option(
637
- None,
638
- "-t",
639
- "--type",
640
- metavar="",
641
- help="Filter resource using type",
642
- ),
643
- dry_run: bool = typer.Option(
644
- False,
645
- "-dr",
646
- "--dry-run",
647
- help="Print resources and exit.",
648
- ),
649
- auto_confirm: bool = typer.Option(
650
- False,
651
- "-y",
652
- "--yes",
653
- help="Skip the confirmation before restarting resources.",
654
- ),
655
- print_debug_log: bool = typer.Option(
656
- False,
657
- "-d",
658
- "--debug",
659
- help="Print debug logs.",
660
- ),
661
- force: bool = typer.Option(
662
- None,
663
- "-f",
664
- "--force",
665
- help="Force",
666
- ),
667
- pull: Optional[bool] = typer.Option(
668
- None,
669
- "-p",
670
- "--pull",
671
- help="Pull images where applicable.",
672
- ),
673
- ):
674
- """\b
675
- Restarts the active workspace. i.e. runs `ag ws down` and then `ag ws up`.
676
-
677
- \b
678
- Examples:
679
- > `ag ws restart`
680
- """
681
- if print_debug_log:
682
- set_log_level_to_debug()
683
-
684
- from time import sleep
685
-
686
- down(
687
- resource_filter=resource_filter,
688
- env_filter=env_filter,
689
- group_filter=group_filter,
690
- infra_filter=infra_filter,
691
- name_filter=name_filter,
692
- type_filter=type_filter,
693
- dry_run=dry_run,
694
- auto_confirm=auto_confirm,
695
- print_debug_log=print_debug_log,
696
- force=force,
697
- )
698
- print_info("Sleeping for 2 seconds..")
699
- sleep(2)
700
- up(
701
- resource_filter=resource_filter,
702
- env_filter=env_filter,
703
- infra_filter=infra_filter,
704
- group_filter=group_filter,
705
- name_filter=name_filter,
706
- type_filter=type_filter,
707
- dry_run=dry_run,
708
- auto_confirm=auto_confirm,
709
- print_debug_log=print_debug_log,
710
- force=force,
711
- pull=pull,
712
- )
713
-
714
-
715
- @ws_cli.command(short_help="Prints active workspace config")
716
- def config(
717
- print_debug_log: bool = typer.Option(
718
- False,
719
- "-d",
720
- "--debug",
721
- help="Print debug logs.",
722
- ),
723
- ):
724
- """\b
725
- Prints the active workspace config
726
-
727
- \b
728
- Examples:
729
- $ `ag ws config` -> Print the active workspace config
730
- """
731
- if print_debug_log:
732
- set_log_level_to_debug()
733
-
734
- from agno.cli.config import AgnoCliConfig
735
- from agno.cli.operator import initialize_agno
736
- from agno.utils.load_env import load_env
737
- from agno.workspace.config import WorkspaceConfig
738
-
739
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
740
- if not agno_config:
741
- agno_config = initialize_agno()
742
- if not agno_config:
743
- log_config_not_available_msg()
744
- return
745
-
746
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_active_ws_config()
747
- if active_ws_config is None:
748
- log_active_workspace_not_available()
749
- avl_ws = agno_config.available_ws
750
- if avl_ws:
751
- print_available_workspaces(avl_ws)
752
- return
753
-
754
- # Load environment from .env
755
- load_env(
756
- dotenv_dir=active_ws_config.ws_root_path,
757
- )
758
- print_info(active_ws_config.model_dump_json(include={"ws_name", "ws_root_path"}, indent=2))
759
-
760
-
761
- @ws_cli.command(short_help="Delete workspace record")
762
- def delete(
763
- ws_name: Optional[str] = typer.Option(None, "-ws", help="Name of the workspace to delete"),
764
- all_workspaces: bool = typer.Option(
765
- False,
766
- "-a",
767
- "--all",
768
- help="Delete all workspaces from Agno",
769
- ),
770
- print_debug_log: bool = typer.Option(
771
- False,
772
- "-d",
773
- "--debug",
774
- help="Print debug logs.",
775
- ),
776
- ):
777
- """\b
778
- Deletes the workspace record from agno.
779
- NOTE: Does not delete any physical files.
780
-
781
- \b
782
- Examples:
783
- $ `ag ws delete` -> Delete the active workspace from Agno
784
- $ `ag ws delete -a` -> Delete all workspaces from Agno
785
- """
786
- if print_debug_log:
787
- set_log_level_to_debug()
788
-
789
- from agno.cli.config import AgnoCliConfig
790
- from agno.cli.operator import initialize_agno
791
- from agno.workspace.operator import delete_workspace
792
-
793
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
794
- if not agno_config:
795
- agno_config = initialize_agno()
796
- if not agno_config:
797
- log_config_not_available_msg()
798
- return
799
-
800
- ws_to_delete: List[Path] = []
801
- # Delete workspace by name if provided
802
- if ws_name is not None:
803
- ws_config = agno_config.get_ws_config_by_dir_name(ws_name)
804
- if ws_config is None:
805
- logger.error(f"Workspace {ws_name} not found")
806
- return
807
- ws_to_delete.append(ws_config.ws_root_path)
808
- else:
809
- # Delete all workspaces if flag is set
810
- if all_workspaces:
811
- ws_to_delete = [ws.ws_root_path for ws in agno_config.available_ws if ws.ws_root_path is not None]
812
- else:
813
- # By default, we assume this command is run for the active workspace
814
- if agno_config.active_ws_dir is not None:
815
- ws_to_delete.append(Path(agno_config.active_ws_dir))
816
-
817
- delete_workspace(agno_config, ws_to_delete)