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
@@ -1,758 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, List, Optional, cast
3
-
4
- from rich.prompt import Prompt
5
-
6
- from agno.api.schemas.team import TeamIdentifier, TeamSchema
7
- from agno.api.schemas.workspace import (
8
- WorkspaceCreate,
9
- WorkspaceEvent,
10
- WorkspaceSchema,
11
- WorkspaceUpdate,
12
- )
13
- from agno.api.workspace import log_workspace_event
14
- from agno.cli.config import AgnoCliConfig
15
- from agno.cli.console import (
16
- console,
17
- log_config_not_available_msg,
18
- print_heading,
19
- print_info,
20
- print_subheading,
21
- )
22
- from agno.infra.resources import InfraResources
23
- from agno.utils.common import str_to_int
24
- from agno.utils.log import logger
25
- from agno.workspace.config import WorkspaceConfig
26
- from agno.workspace.enums import WorkspaceStarterTemplate
27
-
28
- TEMPLATE_TO_NAME_MAP: Dict[WorkspaceStarterTemplate, str] = {
29
- WorkspaceStarterTemplate.agent_app: "agent-app",
30
- WorkspaceStarterTemplate.agent_api: "agent-api",
31
- }
32
- TEMPLATE_TO_REPO_MAP: Dict[WorkspaceStarterTemplate, str] = {
33
- WorkspaceStarterTemplate.agent_app: "https://github.com/phidatahq/agent-app.git",
34
- WorkspaceStarterTemplate.agent_api: "https://github.com/phidatahq/agent-api.git",
35
- }
36
-
37
-
38
- def create_workspace(
39
- name: Optional[str] = None, template: Optional[str] = None, url: Optional[str] = None
40
- ) -> Optional[WorkspaceConfig]:
41
- """Creates a new workspace and returns the WorkspaceConfig.
42
-
43
- This function clones a template or url on the users machine at the path:
44
- cwd/name
45
- """
46
- from shutil import copytree
47
-
48
- import git
49
-
50
- from agno.cli.operator import initialize_agno
51
- from agno.utils.filesystem import rmdir_recursive
52
- from agno.utils.git import GitCloneProgress
53
- from agno.workspace.helpers import get_workspace_dir_path
54
-
55
- current_dir: Path = Path(".").resolve()
56
-
57
- # Initialize Agno before creating a workspace
58
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
59
- if not agno_config:
60
- agno_config = initialize_agno()
61
- if not agno_config:
62
- log_config_not_available_msg()
63
- return None
64
- agno_config = cast(AgnoCliConfig, agno_config)
65
-
66
- ws_dir_name: Optional[str] = name
67
- repo_to_clone: Optional[str] = url
68
- ws_template = WorkspaceStarterTemplate.agent_app
69
- templates = list(WorkspaceStarterTemplate.__members__.values())
70
-
71
- if repo_to_clone is None:
72
- # Get repo_to_clone from template
73
- if template is None:
74
- # Get starter template from the user if template is not provided
75
- # Display available starter templates and ask user to select one
76
- print_info("Select starter template or press Enter for default (agent-app)")
77
- for template_id, template_name in enumerate(templates, start=1):
78
- print_info(" [b][{}][/b] {}".format(template_id, WorkspaceStarterTemplate(template_name).value))
79
-
80
- # Get starter template from the user
81
- template_choices = [str(idx) for idx, _ in enumerate(templates, start=1)]
82
- template_inp_raw = Prompt.ask("Template Number", choices=template_choices, default="1", show_choices=False)
83
- # Convert input to int
84
- template_inp = str_to_int(template_inp_raw)
85
-
86
- if template_inp is not None:
87
- template_inp_idx = template_inp - 1
88
- ws_template = WorkspaceStarterTemplate(templates[template_inp_idx])
89
- elif template.lower() in WorkspaceStarterTemplate.__members__.values():
90
- ws_template = WorkspaceStarterTemplate(template)
91
- else:
92
- raise Exception(f"{template} is not a supported template, please choose from: {templates}")
93
-
94
- logger.debug(f"Selected Template: {ws_template.value}")
95
- repo_to_clone = TEMPLATE_TO_REPO_MAP.get(ws_template)
96
-
97
- if ws_dir_name is None:
98
- default_ws_name = "agent-app"
99
- if url is not None:
100
- # Get default_ws_name from url
101
- default_ws_name = url.split("/")[-1].split(".")[0]
102
- else:
103
- # Get default_ws_name from template
104
- default_ws_name = TEMPLATE_TO_NAME_MAP.get(ws_template, "agent-app")
105
- logger.debug(f"Asking for ws name with default: {default_ws_name}")
106
- # Ask user for workspace name if not provided
107
- ws_dir_name = Prompt.ask("Workspace Name", default=default_ws_name, console=console)
108
-
109
- if ws_dir_name is None:
110
- logger.error("Workspace name is required")
111
- return None
112
- if repo_to_clone is None:
113
- logger.error("URL or Template is required")
114
- return None
115
-
116
- # Check if we can create the workspace in the current dir
117
- ws_root_path: Path = current_dir.joinpath(ws_dir_name)
118
- if ws_root_path.exists():
119
- logger.error(f"Directory {ws_root_path} exists, please delete directory or choose another name for workspace")
120
- return None
121
-
122
- print_info(f"Creating {str(ws_root_path)}")
123
- logger.debug("Cloning: {}".format(repo_to_clone))
124
- try:
125
- _cloned_git_repo: git.Repo = git.Repo.clone_from(
126
- repo_to_clone,
127
- str(ws_root_path),
128
- progress=GitCloneProgress(), # type: ignore
129
- )
130
- except Exception as e:
131
- logger.error(e)
132
- return None
133
-
134
- # Remove existing .git folder
135
- _dot_git_folder = ws_root_path.joinpath(".git")
136
- _dot_git_exists = _dot_git_folder.exists()
137
- if _dot_git_exists:
138
- logger.debug(f"Deleting {_dot_git_folder}")
139
- try:
140
- _dot_git_exists = not rmdir_recursive(_dot_git_folder)
141
- except Exception as e:
142
- logger.warning(f"Failed to delete {_dot_git_folder}: {e}")
143
- logger.info("Please delete the .git folder manually")
144
- pass
145
-
146
- agno_config.add_new_ws_to_config(ws_root_path=ws_root_path)
147
-
148
- try:
149
- # workspace_dir_path is the path to the ws_root/workspace dir
150
- workspace_dir_path: Path = get_workspace_dir_path(ws_root_path)
151
- workspace_secrets_dir = workspace_dir_path.joinpath("secrets").resolve()
152
- workspace_example_secrets_dir = workspace_dir_path.joinpath("example_secrets").resolve()
153
-
154
- print_info(f"Creating {str(workspace_secrets_dir)}")
155
- copytree(
156
- str(workspace_example_secrets_dir),
157
- str(workspace_secrets_dir),
158
- )
159
- except Exception as e:
160
- logger.warning(f"Could not create workspace/secrets: {e}")
161
- logger.warning("Please manually copy workspace/example_secrets to workspace/secrets")
162
-
163
- print_info(f"Your new workspace is available at {str(ws_root_path)}\n")
164
- return setup_workspace(ws_root_path=ws_root_path)
165
-
166
-
167
- def setup_workspace(ws_root_path: Path) -> Optional[WorkspaceConfig]:
168
- """Setup an Agno workspace at `ws_root_path` and return the WorkspaceConfig
169
-
170
- 1. Pre-requisites
171
- 1.1 Check ws_root_path exists and is a directory
172
- 1.2 Create AgnoCliConfig if needed
173
- 1.3 Create a WorkspaceConfig if needed
174
- 1.4 Get the workspace name
175
- 1.5 Get the git remote origin url
176
- 1.6 Create anon user if needed
177
-
178
- 2. Create or update WorkspaceSchema
179
- 2.1 Check if a ws_schema exists for this workspace, meaning this workspace has a record in agno-api
180
- 2.2 Create WorkspaceSchema if it doesn't exist
181
- 2.3 Update WorkspaceSchema if git_url is updated
182
- """
183
- from rich.live import Live
184
- from rich.status import Status
185
-
186
- from agno.cli.operator import initialize_agno
187
- from agno.utils.git import get_remote_origin_for_dir
188
- from agno.workspace.helpers import get_workspace_dir_path
189
-
190
- print_heading("Setting up workspace\n")
191
-
192
- ######################################################
193
- ## 1. Pre-requisites
194
- ######################################################
195
- # 1.1 Check ws_root_path exists and is a directory
196
- ws_is_valid: bool = ws_root_path is not None and ws_root_path.exists() and ws_root_path.is_dir()
197
- if not ws_is_valid:
198
- logger.error("Invalid directory: {}".format(ws_root_path))
199
- return None
200
-
201
- # 1.2 Create AgnoCliConfig if needed
202
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
203
- if not agno_config:
204
- agno_config = initialize_agno()
205
- if not agno_config:
206
- log_config_not_available_msg()
207
- return None
208
-
209
- # 1.3 Create a WorkspaceConfig if needed
210
- logger.debug(f"Checking for a workspace at {ws_root_path}")
211
- ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(ws_root_path)
212
- if ws_config is None:
213
- # There's no record of this workspace, reasons:
214
- # - The user is setting up a new workspace
215
- # - The user ran `ag init -r` which erased existing workspaces
216
- logger.debug(f"Could not find a workspace at: {ws_root_path}")
217
-
218
- # Check if the workspace contains a `workspace` dir
219
- workspace_ws_dir_path = get_workspace_dir_path(ws_root_path)
220
- logger.debug(f"Found the `workspace` configuration at: {workspace_ws_dir_path}")
221
- ws_config = agno_config.create_or_update_ws_config(ws_root_path=ws_root_path, set_as_active=True)
222
- if ws_config is None:
223
- logger.error(f"Failed to create WorkspaceConfig for {ws_root_path}")
224
- return None
225
- else:
226
- logger.debug(f"Found workspace at {ws_root_path}")
227
-
228
- # 1.4 Get the workspace name
229
- workspace_name = ws_root_path.stem.replace(" ", "-").replace("_", "-").lower()
230
- logger.debug(f"Workspace name: {workspace_name}")
231
-
232
- # 1.5 Get the git remote origin url
233
- git_remote_origin_url: Optional[str] = get_remote_origin_for_dir(ws_root_path)
234
- logger.debug("Git origin: {}".format(git_remote_origin_url))
235
-
236
- # 1.6 Create anon user if the user is not logged in
237
- if agno_config.user is None:
238
- from agno.api.user import create_anon_user
239
-
240
- logger.debug("Creating anon user")
241
- with Live(transient=True) as live_log:
242
- status = Status("Creating user...", spinner="aesthetic", speed=2.0, refresh_per_second=10)
243
- live_log.update(status)
244
- anon_user = create_anon_user()
245
- status.stop()
246
- if anon_user is not None:
247
- agno_config.user = anon_user
248
-
249
- ######################################################
250
- ## 2. Create or update WorkspaceSchema
251
- ######################################################
252
- # 2.1 Check if a ws_schema exists for this workspace, meaning this workspace has a record in agno-api
253
- ws_schema: Optional[WorkspaceSchema] = ws_config.ws_schema if ws_config is not None else None
254
- if agno_config.user is not None:
255
- # 2.2 Create WorkspaceSchema if it doesn't exist
256
- if ws_schema is None or ws_schema.id_workspace is None:
257
- from agno.api.team import get_teams_for_user
258
- from agno.api.workspace import create_workspace_for_user
259
-
260
- # If ws_schema is None, this is a NEW WORKSPACE.
261
- # We make a call to the api to create a new ws_schema
262
- logger.debug("Creating ws_schema")
263
- logger.debug(f"Getting teams for user: {agno_config.user.email}")
264
- teams: Optional[List[TeamSchema]] = None
265
- selected_team: Optional[TeamSchema] = None
266
- team_identifier: Optional[TeamIdentifier] = None
267
- with Live(transient=True) as live_log:
268
- status = Status(
269
- "Checking for available teams...", spinner="aesthetic", speed=2.0, refresh_per_second=10
270
- )
271
- live_log.update(status)
272
- teams = get_teams_for_user(agno_config.user)
273
- status.stop()
274
- if teams is not None and len(teams) > 0:
275
- logger.debug(f"The user has {len(teams)} available teams. Checking if they want to use one of them")
276
- print_info("Which account would you like to create this workspace in?")
277
- print_info(" [b][1][/b] Personal (default)")
278
- for team_idx, team_schema in enumerate(teams, start=2):
279
- print_info(" [b][{}][/b] {}".format(team_idx, team_schema.name))
280
-
281
- account_choices = ["1"] + [str(idx) for idx, _ in enumerate(teams, start=2)]
282
- account_inp_raw = Prompt.ask("Account Number", choices=account_choices, default="1", show_choices=False)
283
- account_inp = str_to_int(account_inp_raw)
284
-
285
- if account_inp is not None:
286
- if account_inp == 1:
287
- print_info("Creating workspace in your personal account")
288
- else:
289
- selected_team = teams[account_inp - 2]
290
- print_info(f"Creating workspace in {selected_team.name}")
291
- team_identifier = TeamIdentifier(id_team=selected_team.id_team, team_url=selected_team.url)
292
-
293
- with Live(transient=True) as live_log:
294
- status = Status("Creating workspace...", spinner="aesthetic", speed=2.0, refresh_per_second=10)
295
- live_log.update(status)
296
- ws_schema = create_workspace_for_user(
297
- user=agno_config.user,
298
- workspace=WorkspaceCreate(
299
- ws_name=workspace_name,
300
- git_url=git_remote_origin_url,
301
- ),
302
- team=team_identifier,
303
- )
304
- status.stop()
305
-
306
- logger.debug(f"Workspace created: {workspace_name}")
307
- if selected_team is not None:
308
- logger.debug(f"Selected team: {selected_team.name}")
309
- ws_config = agno_config.create_or_update_ws_config(
310
- ws_root_path=ws_root_path, ws_schema=ws_schema, ws_team=selected_team, set_as_active=True
311
- )
312
-
313
- # 2.3 Update WorkspaceSchema if git_url is updated
314
- if git_remote_origin_url is not None and ws_schema is not None and ws_schema.git_url != git_remote_origin_url:
315
- from agno.api.workspace import update_workspace_for_team, update_workspace_for_user
316
-
317
- logger.debug("Updating workspace")
318
- logger.debug(f"Existing git_url: {ws_schema.git_url}")
319
- logger.debug(f"New git_url: {git_remote_origin_url}")
320
-
321
- if ws_config is not None and ws_config.ws_team is not None:
322
- updated_workspace_schema = update_workspace_for_team(
323
- user=agno_config.user,
324
- workspace=WorkspaceUpdate(
325
- id_workspace=ws_schema.id_workspace,
326
- git_url=git_remote_origin_url,
327
- ),
328
- team=TeamIdentifier(id_team=ws_config.ws_team.id_team, team_url=ws_config.ws_team.url),
329
- )
330
- else:
331
- updated_workspace_schema = update_workspace_for_user(
332
- user=agno_config.user,
333
- workspace=WorkspaceUpdate(
334
- id_workspace=ws_schema.id_workspace,
335
- git_url=git_remote_origin_url,
336
- ),
337
- )
338
- if updated_workspace_schema is not None:
339
- # Update the ws_schema for this workspace.
340
- ws_config = agno_config.create_or_update_ws_config(
341
- ws_root_path=ws_root_path, ws_schema=updated_workspace_schema, set_as_active=True
342
- )
343
- else:
344
- logger.debug("Failed to update workspace. Please setup again")
345
-
346
- if ws_config is not None:
347
- # logger.debug("Workspace Config: {}".format(ws_config.model_dump_json(indent=2)))
348
- print_subheading("Setup complete! Next steps:")
349
- print_info("1. Start workspace:")
350
- print_info("\tag ws up")
351
- print_info("2. Stop workspace:")
352
- print_info("\tag ws down")
353
-
354
- if ws_config.ws_schema is not None and agno_config.user is not None:
355
- log_workspace_event(
356
- user=agno_config.user,
357
- workspace_event=WorkspaceEvent(
358
- id_workspace=ws_config.ws_schema.id_workspace,
359
- event_type="setup",
360
- event_status="success",
361
- event_data={"workspace_root_path": str(ws_root_path)},
362
- ),
363
- )
364
- return ws_config
365
- else:
366
- print_info("Workspace setup unsuccessful. Please try again.")
367
- return None
368
- ######################################################
369
- ## End Workspace setup
370
- ######################################################
371
-
372
-
373
- def start_workspace(
374
- agno_config: AgnoCliConfig,
375
- ws_config: WorkspaceConfig,
376
- target_env: Optional[str] = None,
377
- target_infra: Optional[str] = None,
378
- target_group: Optional[str] = None,
379
- target_name: Optional[str] = None,
380
- target_type: Optional[str] = None,
381
- dry_run: Optional[bool] = False,
382
- auto_confirm: Optional[bool] = False,
383
- force: Optional[bool] = None,
384
- pull: Optional[bool] = False,
385
- ) -> None:
386
- """Start an Agno Workspace. This is called from `ag ws up`"""
387
- if ws_config is None:
388
- logger.error("WorkspaceConfig invalid")
389
- return
390
-
391
- print_heading("Starting workspace: {}".format(str(ws_config.ws_root_path.stem)))
392
- logger.debug(f"\ttarget_env : {target_env}")
393
- logger.debug(f"\ttarget_infra : {target_infra}")
394
- logger.debug(f"\ttarget_group : {target_group}")
395
- logger.debug(f"\ttarget_name : {target_name}")
396
- logger.debug(f"\ttarget_type : {target_type}")
397
- logger.debug(f"\tdry_run : {dry_run}")
398
- logger.debug(f"\tauto_confirm : {auto_confirm}")
399
- logger.debug(f"\tforce : {force}")
400
- logger.debug(f"\tpull : {pull}")
401
-
402
- # Set the local environment variables before processing configs
403
- ws_config.set_local_env()
404
-
405
- # Get resource groups to deploy
406
- resource_groups_to_create: List[InfraResources] = ws_config.get_resources(
407
- env=target_env,
408
- infra=target_infra,
409
- order="create",
410
- )
411
-
412
- # Track number of resource groups created
413
- num_rgs_created = 0
414
- num_rgs_to_create = len(resource_groups_to_create)
415
- # Track number of resources created
416
- num_resources_created = 0
417
- num_resources_to_create = 0
418
-
419
- if num_rgs_to_create == 0:
420
- print_info("No resources to create")
421
- return
422
-
423
- logger.debug(f"Deploying {num_rgs_to_create} resource groups")
424
- for rg in resource_groups_to_create:
425
- _num_resources_created, _num_resources_to_create = rg.create_resources(
426
- group_filter=target_group,
427
- name_filter=target_name,
428
- type_filter=target_type,
429
- dry_run=dry_run,
430
- auto_confirm=auto_confirm,
431
- force=force,
432
- pull=pull,
433
- )
434
- if _num_resources_created > 0:
435
- num_rgs_created += 1
436
- num_resources_created += _num_resources_created
437
- num_resources_to_create += _num_resources_to_create
438
- logger.debug(f"Deployed {num_resources_created} resources in {num_rgs_created} resource groups")
439
-
440
- if dry_run:
441
- return
442
-
443
- if num_resources_created == 0:
444
- return
445
-
446
- print_heading(f"\n--**-- ResourceGroups deployed: {num_rgs_created}/{num_rgs_to_create}\n")
447
-
448
- workspace_event_status = "in_progress"
449
- if num_resources_created == num_resources_to_create:
450
- workspace_event_status = "success"
451
- else:
452
- logger.error("Some resources failed to create, please check logs")
453
- workspace_event_status = "failed"
454
-
455
- if (
456
- agno_config.user is not None
457
- and ws_config.ws_schema is not None
458
- and ws_config.ws_schema.id_workspace is not None
459
- ):
460
- # Log workspace start event
461
- log_workspace_event(
462
- user=agno_config.user,
463
- workspace_event=WorkspaceEvent(
464
- id_workspace=ws_config.ws_schema.id_workspace,
465
- event_type="start",
466
- event_status=workspace_event_status,
467
- event_data={
468
- "target_env": target_env,
469
- "target_infra": target_infra,
470
- "target_group": target_group,
471
- "target_name": target_name,
472
- "target_type": target_type,
473
- "dry_run": dry_run,
474
- "auto_confirm": auto_confirm,
475
- "force": force,
476
- },
477
- ),
478
- )
479
-
480
-
481
- def stop_workspace(
482
- agno_config: AgnoCliConfig,
483
- ws_config: WorkspaceConfig,
484
- target_env: Optional[str] = None,
485
- target_infra: Optional[str] = None,
486
- target_group: Optional[str] = None,
487
- target_name: Optional[str] = None,
488
- target_type: Optional[str] = None,
489
- dry_run: Optional[bool] = False,
490
- auto_confirm: Optional[bool] = False,
491
- force: Optional[bool] = None,
492
- ) -> None:
493
- """Stop an Agno Workspace. This is called from `ag ws down`"""
494
- if ws_config is None:
495
- logger.error("WorkspaceConfig invalid")
496
- return
497
-
498
- print_heading("Stopping workspace: {}".format(str(ws_config.ws_root_path.stem)))
499
- logger.debug(f"\ttarget_env : {target_env}")
500
- logger.debug(f"\ttarget_infra : {target_infra}")
501
- logger.debug(f"\ttarget_group : {target_group}")
502
- logger.debug(f"\ttarget_name : {target_name}")
503
- logger.debug(f"\ttarget_type : {target_type}")
504
- logger.debug(f"\tdry_run : {dry_run}")
505
- logger.debug(f"\tauto_confirm : {auto_confirm}")
506
- logger.debug(f"\tforce : {force}")
507
-
508
- # Set the local environment variables before processing configs
509
- ws_config.set_local_env()
510
-
511
- # Get resource groups to delete
512
- resource_groups_to_delete: List[InfraResources] = ws_config.get_resources(
513
- env=target_env,
514
- infra=target_infra,
515
- order="delete",
516
- )
517
-
518
- # Track number of resource groups deleted
519
- num_rgs_deleted = 0
520
- num_rgs_to_delete = len(resource_groups_to_delete)
521
- # Track number of resources deleted
522
- num_resources_deleted = 0
523
- num_resources_to_delete = 0
524
-
525
- if num_rgs_to_delete == 0:
526
- print_info("No resources to delete")
527
- return
528
-
529
- logger.debug(f"Deleting {num_rgs_to_delete} resource groups")
530
- for rg in resource_groups_to_delete:
531
- _num_resources_deleted, _num_resources_to_delete = rg.delete_resources(
532
- group_filter=target_group,
533
- name_filter=target_name,
534
- type_filter=target_type,
535
- dry_run=dry_run,
536
- auto_confirm=auto_confirm,
537
- force=force,
538
- )
539
- if _num_resources_deleted > 0:
540
- num_rgs_deleted += 1
541
- num_resources_deleted += _num_resources_deleted
542
- num_resources_to_delete += _num_resources_to_delete
543
- logger.debug(f"Deleted {num_resources_deleted} resources in {num_rgs_deleted} resource groups")
544
-
545
- if dry_run:
546
- return
547
-
548
- if num_resources_deleted == 0:
549
- return
550
-
551
- print_heading(f"\n--**-- ResourceGroups deleted: {num_rgs_deleted}/{num_rgs_to_delete}\n")
552
-
553
- workspace_event_status = "in_progress"
554
- if num_resources_to_delete == num_resources_deleted:
555
- workspace_event_status = "success"
556
- else:
557
- logger.error("Some resources failed to delete, please check logs")
558
- workspace_event_status = "failed"
559
-
560
- if (
561
- agno_config.user is not None
562
- and ws_config.ws_schema is not None
563
- and ws_config.ws_schema.id_workspace is not None
564
- ):
565
- # Log workspace stop event
566
- log_workspace_event(
567
- user=agno_config.user,
568
- workspace_event=WorkspaceEvent(
569
- id_workspace=ws_config.ws_schema.id_workspace,
570
- event_type="stop",
571
- event_status=workspace_event_status,
572
- event_data={
573
- "target_env": target_env,
574
- "target_infra": target_infra,
575
- "target_group": target_group,
576
- "target_name": target_name,
577
- "target_type": target_type,
578
- "dry_run": dry_run,
579
- "auto_confirm": auto_confirm,
580
- "force": force,
581
- },
582
- ),
583
- )
584
-
585
-
586
- def update_workspace(
587
- agno_config: AgnoCliConfig,
588
- ws_config: WorkspaceConfig,
589
- target_env: Optional[str] = None,
590
- target_infra: Optional[str] = None,
591
- target_group: Optional[str] = None,
592
- target_name: Optional[str] = None,
593
- target_type: Optional[str] = None,
594
- dry_run: Optional[bool] = False,
595
- auto_confirm: Optional[bool] = False,
596
- force: Optional[bool] = None,
597
- pull: Optional[bool] = False,
598
- ) -> None:
599
- """Update an Agno Workspace. This is called from `ag ws patch`"""
600
- if ws_config is None:
601
- logger.error("WorkspaceConfig invalid")
602
- return
603
-
604
- print_heading("Updating workspace: {}".format(str(ws_config.ws_root_path.stem)))
605
- logger.debug(f"\ttarget_env : {target_env}")
606
- logger.debug(f"\ttarget_infra : {target_infra}")
607
- logger.debug(f"\ttarget_group : {target_group}")
608
- logger.debug(f"\ttarget_name : {target_name}")
609
- logger.debug(f"\ttarget_type : {target_type}")
610
- logger.debug(f"\tdry_run : {dry_run}")
611
- logger.debug(f"\tauto_confirm : {auto_confirm}")
612
- logger.debug(f"\tforce : {force}")
613
- logger.debug(f"\tpull : {pull}")
614
-
615
- # Set the local environment variables before processing configs
616
- ws_config.set_local_env()
617
-
618
- # Get resource groups to update
619
- resource_groups_to_update: List[InfraResources] = ws_config.get_resources(
620
- env=target_env,
621
- infra=target_infra,
622
- order="create",
623
- )
624
- # Track number of resource groups updated
625
- num_rgs_updated = 0
626
- num_rgs_to_update = len(resource_groups_to_update)
627
- # Track number of resources updated
628
- num_resources_updated = 0
629
- num_resources_to_update = 0
630
-
631
- if num_rgs_to_update == 0:
632
- print_info("No resources to update")
633
- return
634
-
635
- logger.debug(f"Updating {num_rgs_to_update} resource groups")
636
- for rg in resource_groups_to_update:
637
- _num_resources_updated, _num_resources_to_update = rg.update_resources(
638
- group_filter=target_group,
639
- name_filter=target_name,
640
- type_filter=target_type,
641
- dry_run=dry_run,
642
- auto_confirm=auto_confirm,
643
- force=force,
644
- pull=pull,
645
- )
646
- if _num_resources_updated > 0:
647
- num_rgs_updated += 1
648
- num_resources_updated += _num_resources_updated
649
- num_resources_to_update += _num_resources_to_update
650
- logger.debug(f"Updated {num_resources_updated} resources in {num_rgs_updated} resource groups")
651
-
652
- if dry_run:
653
- return
654
-
655
- if num_resources_updated == 0:
656
- return
657
-
658
- print_heading(f"\n--**-- ResourceGroups updated: {num_rgs_updated}/{num_rgs_to_update}\n")
659
-
660
- workspace_event_status = "in_progress"
661
- if num_resources_updated == num_resources_to_update:
662
- workspace_event_status = "success"
663
- else:
664
- logger.error("Some resources failed to update, please check logs")
665
- workspace_event_status = "failed"
666
-
667
- if (
668
- agno_config.user is not None
669
- and ws_config.ws_schema is not None
670
- and ws_config.ws_schema.id_workspace is not None
671
- ):
672
- # Log workspace start event
673
- log_workspace_event(
674
- user=agno_config.user,
675
- workspace_event=WorkspaceEvent(
676
- id_workspace=ws_config.ws_schema.id_workspace,
677
- event_type="update",
678
- event_status=workspace_event_status,
679
- event_data={
680
- "target_env": target_env,
681
- "target_infra": target_infra,
682
- "target_group": target_group,
683
- "target_name": target_name,
684
- "target_type": target_type,
685
- "dry_run": dry_run,
686
- "auto_confirm": auto_confirm,
687
- "force": force,
688
- },
689
- ),
690
- )
691
-
692
-
693
- def delete_workspace(agno_config: AgnoCliConfig, ws_to_delete: Optional[List[Path]]) -> None:
694
- if ws_to_delete is None or len(ws_to_delete) == 0:
695
- print_heading("No workspaces to delete")
696
- return
697
-
698
- for ws_root in ws_to_delete:
699
- agno_config.delete_ws(ws_root_path=ws_root)
700
-
701
-
702
- def set_workspace_as_active(ws_dir_name: Optional[str]) -> None:
703
- from agno.cli.operator import initialize_agno
704
-
705
- ######################################################
706
- ## 1. Validate Pre-requisites
707
- ######################################################
708
- ######################################################
709
- # 1.1 Check AgnoCliConfig is valid
710
- ######################################################
711
- agno_config: Optional[AgnoCliConfig] = AgnoCliConfig.from_saved_config()
712
- if not agno_config:
713
- agno_config = initialize_agno()
714
- if not agno_config:
715
- log_config_not_available_msg()
716
- return
717
-
718
- ######################################################
719
- # 1.2 Check ws_root_path is valid
720
- ######################################################
721
- # By default, we assume this command is run from the workspace directory
722
- ws_root_path: Optional[Path] = None
723
- if ws_dir_name is None:
724
- # If the user does not provide a ws_name, that implies `ag set` is ran from
725
- # the workspace directory.
726
- ws_root_path = Path(".").resolve()
727
- else:
728
- # If the user provides a workspace name manually, we find the dir for that ws
729
- ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_dir_name(ws_dir_name)
730
- if ws_config is None:
731
- logger.error(f"Could not find workspace {ws_dir_name}")
732
- return
733
- ws_root_path = ws_config.ws_root_path
734
-
735
- ws_dir_is_valid: bool = ws_root_path is not None and ws_root_path.exists() and ws_root_path.is_dir()
736
- if not ws_dir_is_valid:
737
- logger.error("Invalid workspace directory: {}".format(ws_root_path))
738
- return
739
-
740
- ######################################################
741
- # 1.3 Validate WorkspaceConfig is available i.e. a workspace is available at this directory
742
- ######################################################
743
- logger.debug(f"Checking for a workspace at path: {ws_root_path}")
744
- active_ws_config: Optional[WorkspaceConfig] = agno_config.get_ws_config_by_path(ws_root_path)
745
- if active_ws_config is None:
746
- # This happens when the workspace is not yet setup
747
- print_info(f"Could not find a workspace at path: {ws_root_path}")
748
- # TODO: setup automatically for the user
749
- print_info("If this workspace has not been setup, please run `ag ws setup` from the workspace directory")
750
- return
751
-
752
- ######################################################
753
- ## 2. Set workspace as active
754
- ######################################################
755
- print_heading(f"Setting workspace {active_ws_config.ws_root_path.stem} as active")
756
- agno_config.set_active_ws_dir(active_ws_config.ws_root_path)
757
- print_info("Active workspace updated")
758
- return