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

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