agno 0.1.2__py3-none-any.whl → 2.3.13__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 (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  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/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1791 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1312 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.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)