agno 1.8.0__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 (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  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/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +54 -41
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.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)