agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

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