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/infra/app.py DELETED
@@ -1,240 +0,0 @@
1
- from typing import Any, Dict, List, Optional, Union
2
-
3
- from pydantic import Field, field_validator
4
- from pydantic_core.core_schema import ValidationInfo
5
-
6
- from agno.infra.base import InfraBase
7
- from agno.infra.context import ContainerContext
8
- from agno.infra.resource import InfraResource
9
- from agno.utils.log import logger
10
-
11
-
12
- class InfraApp(InfraBase):
13
- """Base class for Infrastructure Apps."""
14
-
15
- # -*- App Name (required)
16
- name: str
17
-
18
- # -*- Image Configuration
19
- # Image can be provided as a DockerImage object
20
- image: Optional[Any] = None
21
- # OR as image_name:image_tag str
22
- image_str: Optional[str] = None
23
- # OR as image_name and image_tag
24
- image_name: Optional[str] = None
25
- image_tag: Optional[str] = None
26
- # Entrypoint for the container
27
- entrypoint: Optional[Union[str, List[str]]] = None
28
- # Command for the container
29
- command: Optional[Union[str, List[str]]] = None
30
-
31
- # -*- Python Configuration
32
- # Install python dependencies using a requirements.txt file
33
- install_requirements: bool = False
34
- # Path to the requirements.txt file relative to the workspace_root
35
- requirements_file: str = "requirements.txt"
36
- # Set the PYTHONPATH env var
37
- set_python_path: bool = True
38
- # Manually provide the PYTHONPATH.
39
- # If None, PYTHONPATH is set to workspace_root
40
- python_path: Optional[str] = None
41
- # Add paths to the PYTHONPATH env var
42
- # If python_path is provided, this value is ignored
43
- add_python_paths: Optional[List[str]] = None
44
-
45
- # -*- App Ports
46
- # Open a container port if open_port=True
47
- open_port: bool = False
48
- # If open_port=True, port_number is used to set the
49
- # container_port if container_port is None and host_port if host_port is None
50
- port_number: int = 80
51
- # Port number on the Container to open
52
- # Preferred over port_number if both are set
53
- container_port: Optional[int] = Field(None, validate_default=True)
54
- # Port name for the opened port
55
- container_port_name: str = "http"
56
- # Port number on the Host to map to the Container port
57
- # Preferred over port_number if both are set
58
- host_port: Optional[int] = Field(None, validate_default=True)
59
-
60
- # -*- Extra Resources created "before" the App resources
61
- resources: Optional[List[InfraResource]] = None
62
-
63
- # -*- Other args
64
- print_env_on_load: bool = False
65
-
66
- # -*- App specific args. Not to be set by the user.
67
- # Container Environment that can be set by subclasses
68
- # which is used as a starting point for building the container_env
69
- # Any variables set in container_env will be overridden by values
70
- # in the env_vars dict or env_file
71
- container_env: Optional[Dict[str, Any]] = None
72
- # Variable used to cache the container context
73
- container_context: Optional[ContainerContext] = None
74
-
75
- # -*- Cached Data
76
- cached_resources: Optional[List[Any]] = None
77
-
78
- @field_validator("container_port", mode="before")
79
- def set_container_port(cls, v, info: ValidationInfo):
80
- port_number = info.data.get("port_number")
81
- if v is None and port_number is not None:
82
- v = port_number
83
- return v
84
-
85
- @field_validator("host_port", mode="before")
86
- def set_host_port(cls, v, info: ValidationInfo):
87
- port_number = info.data.get("port_number")
88
- if v is None and port_number is not None:
89
- v = port_number
90
- return v
91
-
92
- def get_app_name(self) -> str:
93
- return self.name
94
-
95
- def get_image_str(self) -> str:
96
- if self.image:
97
- return f"{self.image.name}:{self.image.tag}"
98
- elif self.image_str:
99
- return self.image_str
100
- elif self.image_name and self.image_tag:
101
- return f"{self.image_name}:{self.image_tag}"
102
- elif self.image_name:
103
- return f"{self.image_name}:latest"
104
- else:
105
- return ""
106
-
107
- def build_resources(self, build_context: Any) -> Optional[Any]:
108
- logger.debug(f"@build_resource_group not defined for {self.get_app_name()}")
109
- return None
110
-
111
- def get_dependencies(self) -> Optional[List[InfraResource]]:
112
- return (
113
- [dep for dep in self.depends_on if isinstance(dep, InfraResource)] if self.depends_on is not None else None
114
- )
115
-
116
- def add_app_properties_to_resources(self, resources: List[InfraResource]) -> List[InfraResource]:
117
- updated_resources = []
118
- app_properties = self.model_dump(exclude_defaults=True)
119
- app_group = self.get_group_name()
120
- app_output_dir = self.get_app_name()
121
-
122
- app_skip_create = app_properties.get("skip_create")
123
- app_skip_read = app_properties.get("skip_read")
124
- app_skip_update = app_properties.get("skip_update")
125
- app_skip_delete = app_properties.get("skip_delete")
126
- app_recreate_on_update = app_properties.get("recreate_on_update")
127
- app_use_cache = app_properties.get("use_cache")
128
- app_force = app_properties.get("force")
129
- app_debug_mode = app_properties.get("debug_mode")
130
- app_wait_for_create = app_properties.get("wait_for_create")
131
- app_wait_for_update = app_properties.get("wait_for_update")
132
- app_wait_for_delete = app_properties.get("wait_for_delete")
133
- app_save_output = app_properties.get("save_output")
134
-
135
- for resource in resources:
136
- resource_properties = resource.model_dump(exclude_defaults=True)
137
- resource_skip_create = resource_properties.get("skip_create")
138
- resource_skip_read = resource_properties.get("skip_read")
139
- resource_skip_update = resource_properties.get("skip_update")
140
- resource_skip_delete = resource_properties.get("skip_delete")
141
- resource_recreate_on_update = resource_properties.get("recreate_on_update")
142
- resource_use_cache = resource_properties.get("use_cache")
143
- resource_force = resource_properties.get("force")
144
- resource_debug_mode = resource_properties.get("debug_mode")
145
- resource_wait_for_create = resource_properties.get("wait_for_create")
146
- resource_wait_for_update = resource_properties.get("wait_for_update")
147
- resource_wait_for_delete = resource_properties.get("wait_for_delete")
148
- resource_save_output = resource_properties.get("save_output")
149
-
150
- # If skip_create on resource is not set, use app level skip_create (if set on app)
151
- if resource_skip_create is None and app_skip_create is not None:
152
- resource.skip_create = app_skip_create
153
- # If skip_read on resource is not set, use app level skip_read (if set on app)
154
- if resource_skip_read is None and app_skip_read is not None:
155
- resource.skip_read = app_skip_read
156
- # If skip_update on resource is not set, use app level skip_update (if set on app)
157
- if resource_skip_update is None and app_skip_update is not None:
158
- resource.skip_update = app_skip_update
159
- # If skip_delete on resource is not set, use app level skip_delete (if set on app)
160
- if resource_skip_delete is None and app_skip_delete is not None:
161
- resource.skip_delete = app_skip_delete
162
- # If recreate_on_update on resource is not set, use app level recreate_on_update (if set on app)
163
- if resource_recreate_on_update is None and app_recreate_on_update is not None:
164
- resource.recreate_on_update = app_recreate_on_update
165
- # If use_cache on resource is not set, use app level use_cache (if set on app)
166
- if resource_use_cache is None and app_use_cache is not None:
167
- resource.use_cache = app_use_cache
168
- # If force on resource is not set, use app level force (if set on app)
169
- if resource_force is None and app_force is not None:
170
- resource.force = app_force
171
- # If debug_mode on resource is not set, use app level debug_mode (if set on app)
172
- if resource_debug_mode is None and app_debug_mode is not None:
173
- resource.debug_mode = app_debug_mode
174
- # If wait_for_create on resource is not set, use app level wait_for_create (if set on app)
175
- if resource_wait_for_create is None and app_wait_for_create is not None:
176
- resource.wait_for_create = app_wait_for_create
177
- # If wait_for_update on resource is not set, use app level wait_for_update (if set on app)
178
- if resource_wait_for_update is None and app_wait_for_update is not None:
179
- resource.wait_for_update = app_wait_for_update
180
- # If wait_for_delete on resource is not set, use app level wait_for_delete (if set on app)
181
- if resource_wait_for_delete is None and app_wait_for_delete is not None:
182
- resource.wait_for_delete = app_wait_for_delete
183
- # If save_output on resource is not set, use app level save_output (if set on app)
184
- if resource_save_output is None and app_save_output is not None:
185
- resource.save_output = app_save_output
186
- # If workspace_settings on resource is not set, use app level workspace_settings (if set on app)
187
- if resource.workspace_settings is None and self.workspace_settings is not None:
188
- resource.set_workspace_settings(self.workspace_settings)
189
- # If group on resource is not set, use app level group (if set on app)
190
- if resource.group is None and app_group is not None:
191
- resource.group = app_group
192
-
193
- # Always set output_dir on resource to app level output_dir
194
- resource.output_dir = app_output_dir
195
-
196
- app_dependencies = self.get_dependencies()
197
- if app_dependencies is not None:
198
- if resource.depends_on is None:
199
- resource.depends_on = app_dependencies
200
- else:
201
- resource.depends_on.extend(app_dependencies)
202
-
203
- updated_resources.append(resource)
204
- return updated_resources
205
-
206
- def get_resources(self, build_context: Any) -> List[InfraResource]:
207
- if self.cached_resources is not None and len(self.cached_resources) > 0:
208
- return self.cached_resources
209
-
210
- base_resources = self.resources or []
211
- app_resources = self.build_resources(build_context)
212
- if app_resources is not None:
213
- base_resources.extend(app_resources)
214
-
215
- self.cached_resources = self.add_app_properties_to_resources(base_resources)
216
- # logger.debug(f"Resources: {self.cached_resources}")
217
- return self.cached_resources
218
-
219
- def matches_filters(self, group_filter: Optional[str] = None) -> bool:
220
- if group_filter is not None:
221
- group_name = self.get_group_name()
222
- logger.debug(f"{self.get_app_name()}: Checking {group_filter} in {group_name}")
223
- if group_name is None or group_filter not in group_name:
224
- return False
225
- return True
226
-
227
- def should_create(self, group_filter: Optional[str] = None) -> bool:
228
- if not self.enabled or self.skip_create:
229
- return False
230
- return self.matches_filters(group_filter)
231
-
232
- def should_delete(self, group_filter: Optional[str] = None) -> bool:
233
- if not self.enabled or self.skip_delete:
234
- return False
235
- return self.matches_filters(group_filter)
236
-
237
- def should_update(self, group_filter: Optional[str] = None) -> bool:
238
- if not self.enabled or self.skip_update:
239
- return False
240
- return self.matches_filters(group_filter)
agno/infra/base.py DELETED
@@ -1,144 +0,0 @@
1
- from pathlib import Path
2
- from typing import Any, Dict, List, Optional
3
-
4
- from pydantic import BaseModel, ConfigDict
5
-
6
- from agno.workspace.settings import WorkspaceSettings
7
-
8
-
9
- class InfraBase(BaseModel):
10
- """Base class for all InfraResource, InfraApp and InfraResources objects."""
11
-
12
- # Name of the infrastructure resource
13
- name: Optional[str] = None
14
- # Group for the infrastructure resource
15
- # Used for filtering infrastructure resources by group
16
- group: Optional[str] = None
17
- # Environment filter for this resource
18
- env: Optional[str] = None
19
- # Infrastructure filter for this resource
20
- infra: Optional[str] = None
21
- # Whether this resource is enabled
22
- enabled: bool = True
23
-
24
- # Resource Control
25
- skip_create: bool = False
26
- skip_read: bool = False
27
- skip_update: bool = False
28
- skip_delete: bool = False
29
- recreate_on_update: bool = False
30
- # Skip create if resource with the same name is active
31
- use_cache: bool = True
32
- # Force create/update/delete even if a resource with the same name is active
33
- force: Optional[bool] = None
34
-
35
- # Wait for resource to be created, updated or deleted
36
- wait_for_create: bool = True
37
- wait_for_update: bool = True
38
- wait_for_delete: bool = True
39
- waiter_delay: int = 30
40
- waiter_max_attempts: int = 50
41
-
42
- # Environment Variables for the resource (if applicable)
43
- # Add env variables to resource where applicable
44
- env_vars: Optional[Dict[str, Any]] = None
45
- # Read env from a file in yaml format
46
- env_file: Optional[Path] = None
47
- # Add secret variables to resource where applicable
48
- # secrets_dict: Optional[Dict[str, Any]] = None
49
- # Read secrets from a file in yaml format
50
- secrets_file: Optional[Path] = None
51
- # Read secret variables from AWS Secrets
52
- aws_secrets: Optional[Any] = None
53
-
54
- # Debug Mode
55
- debug_mode: bool = False
56
-
57
- # Store resource to output directory
58
- # If True, save resource output to json files
59
- save_output: bool = False
60
- # The directory for the input files in the workspace directory
61
- input_dir: Optional[str] = None
62
- # The directory for the output files in the workspace directory
63
- output_dir: Optional[str] = None
64
-
65
- # Dependencies for the resource
66
- depends_on: Optional[List[Any]] = None
67
-
68
- # Workspace Settings
69
- workspace_settings: Optional[WorkspaceSettings] = None
70
-
71
- # Cached Data
72
- cached_workspace_dir: Optional[Path] = None
73
- cached_env_file_data: Optional[Dict[str, Any]] = None
74
- cached_secret_file_data: Optional[Dict[str, Any]] = None
75
-
76
- model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
77
-
78
- def get_group_name(self) -> Optional[str]:
79
- return self.group or self.name
80
-
81
- @property
82
- def workspace_root(self) -> Optional[Path]:
83
- return self.workspace_settings.ws_root if self.workspace_settings is not None else None
84
-
85
- @property
86
- def workspace_name(self) -> Optional[str]:
87
- return self.workspace_settings.ws_name if self.workspace_settings is not None else None
88
-
89
- @property
90
- def workspace_dir(self) -> Optional[Path]:
91
- if self.cached_workspace_dir is not None:
92
- return self.cached_workspace_dir
93
-
94
- if self.workspace_root is not None:
95
- from agno.workspace.helpers import get_workspace_dir_path
96
-
97
- workspace_dir = get_workspace_dir_path(self.workspace_root)
98
- if workspace_dir is not None:
99
- self.cached_workspace_dir = workspace_dir
100
- return workspace_dir
101
- return None
102
-
103
- def set_workspace_settings(self, workspace_settings: Optional[WorkspaceSettings] = None) -> None:
104
- if workspace_settings is not None:
105
- self.workspace_settings = workspace_settings
106
-
107
- def get_env_file_data(self) -> Optional[Dict[str, Any]]:
108
- if self.cached_env_file_data is None:
109
- from agno.utils.yaml_io import read_yaml_file
110
-
111
- self.cached_env_file_data = read_yaml_file(file_path=self.env_file)
112
- return self.cached_env_file_data
113
-
114
- def get_secret_file_data(self) -> Optional[Dict[str, Any]]:
115
- if self.cached_secret_file_data is None:
116
- from agno.utils.yaml_io import read_yaml_file
117
-
118
- self.cached_secret_file_data = read_yaml_file(file_path=self.secrets_file)
119
- return self.cached_secret_file_data
120
-
121
- def get_secret_from_file(self, secret_name: str) -> Optional[str]:
122
- secret_file_data = self.get_secret_file_data()
123
- if secret_file_data is not None:
124
- return secret_file_data.get(secret_name)
125
- return None
126
-
127
- def get_infra_resources(self) -> Optional[Any]:
128
- """This method returns an InfraResources object for this resource"""
129
- raise NotImplementedError("get_infra_resources method not implemented")
130
-
131
- def set_aws_env_vars(self, env_dict: Dict[str, str], aws_region: Optional[str] = None) -> None:
132
- from agno.constants import (
133
- AWS_DEFAULT_REGION_ENV_VAR,
134
- AWS_REGION_ENV_VAR,
135
- )
136
-
137
- if aws_region is not None:
138
- # logger.debug(f"Setting AWS Region to {aws_region}")
139
- env_dict[AWS_REGION_ENV_VAR] = aws_region
140
- env_dict[AWS_DEFAULT_REGION_ENV_VAR] = aws_region
141
- elif self.workspace_settings is not None and self.workspace_settings.aws_region is not None:
142
- # logger.debug(f"Setting AWS Region to {aws_region} using workspace_settings")
143
- env_dict[AWS_REGION_ENV_VAR] = self.workspace_settings.aws_region
144
- env_dict[AWS_DEFAULT_REGION_ENV_VAR] = self.workspace_settings.aws_region
agno/infra/context.py DELETED
@@ -1,20 +0,0 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel
4
-
5
- from agno.api.schemas.workspace import WorkspaceSchema
6
-
7
-
8
- class ContainerContext(BaseModel):
9
- """ContainerContext is a context object passed when creating containers."""
10
-
11
- # Workspace name
12
- workspace_name: str
13
- # Workspace schema from the API
14
- workspace_schema: Optional[WorkspaceSchema] = None
15
- # Path to the workspace directory inside the container
16
- workspace_root: str
17
- # Path to the workspace parent directory inside the container
18
- workspace_parent: str
19
- # Path to the requirements.txt file relative to the workspace_root
20
- requirements_file: Optional[str] = None
agno/infra/db_app.py DELETED
@@ -1,52 +0,0 @@
1
- from typing import Optional
2
-
3
- from agno.infra.app import ContainerContext, InfraApp, InfraResource # noqa: F401
4
-
5
-
6
- class DbApp(InfraApp):
7
- db_user: Optional[str] = None
8
- db_password: Optional[str] = None
9
- db_database: Optional[str] = None
10
- db_driver: Optional[str] = None
11
-
12
- def get_db_user(self) -> Optional[str]:
13
- return self.db_user or self.get_secret_from_file("DB_USER")
14
-
15
- def get_db_password(self) -> Optional[str]:
16
- return self.db_password or self.get_secret_from_file("DB_PASSWORD")
17
-
18
- def get_db_database(self) -> Optional[str]:
19
- return self.db_database or self.get_secret_from_file("DB_DATABASE")
20
-
21
- def get_db_driver(self) -> Optional[str]:
22
- return self.db_driver or self.get_secret_from_file("DB_DRIVER")
23
-
24
- def get_db_host(self) -> Optional[str]:
25
- raise NotImplementedError
26
-
27
- def get_db_port(self) -> Optional[int]:
28
- raise NotImplementedError
29
-
30
- def get_db_connection(self) -> Optional[str]:
31
- user = self.get_db_user()
32
- password = self.get_db_password()
33
- database = self.get_db_database()
34
- driver = self.get_db_driver()
35
- host = self.get_db_host()
36
- port = self.get_db_port()
37
- return f"{driver}://{user}:{password}@{host}:{port}/{database}"
38
-
39
- def get_db_host_local(self) -> Optional[str]:
40
- return "localhost"
41
-
42
- def get_db_port_local(self) -> Optional[int]:
43
- return self.host_port
44
-
45
- def get_db_connection_local(self) -> Optional[str]:
46
- user = self.get_db_user()
47
- password = self.get_db_password()
48
- database = self.get_db_database()
49
- driver = self.get_db_driver()
50
- host = self.get_db_host_local()
51
- port = self.get_db_port_local()
52
- return f"{driver}://{user}:{password}@{host}:{port}/{database}"
agno/infra/resource.py DELETED
@@ -1,205 +0,0 @@
1
- from pathlib import Path
2
- from typing import Any, Dict, List, Optional
3
-
4
- from agno.infra.base import InfraBase
5
- from agno.utils.log import logger
6
-
7
-
8
- class InfraResource(InfraBase):
9
- """Base class for Infrastructure Resources."""
10
-
11
- # Resource name (required)
12
- name: str
13
- # Resource type
14
- resource_type: Optional[str] = None
15
- # List of resource types to match for filtering
16
- resource_type_list: Optional[List[str]] = None
17
-
18
- # -*- Cached Data
19
- active_resource: Optional[Any] = None
20
- resource_created: bool = False
21
- resource_updated: bool = False
22
- resource_deleted: bool = False
23
-
24
- def read(self, client: Any) -> bool:
25
- raise NotImplementedError
26
-
27
- def is_active(self, client: Any) -> bool:
28
- raise NotImplementedError
29
-
30
- def create(self, client: Any) -> bool:
31
- raise NotImplementedError
32
-
33
- def update(self, client: Any) -> bool:
34
- raise NotImplementedError
35
-
36
- def delete(self, client: Any) -> bool:
37
- raise NotImplementedError
38
-
39
- def get_resource_name(self) -> str:
40
- return self.name or self.__class__.__name__
41
-
42
- def get_resource_type(self) -> str:
43
- if self.resource_type is None:
44
- return self.__class__.__name__
45
- return self.resource_type
46
-
47
- def get_resource_type_list(self) -> List[str]:
48
- if self.resource_type_list is None:
49
- return [self.get_resource_type().lower()]
50
-
51
- type_list: List[str] = [resource_type.lower() for resource_type in self.resource_type_list]
52
- if self.get_resource_type() not in type_list:
53
- type_list.append(self.get_resource_type().lower())
54
- return type_list
55
-
56
- def get_input_file_path(self) -> Optional[Path]:
57
- workspace_dir: Optional[Path] = self.workspace_dir
58
- if workspace_dir is None:
59
- from agno.workspace.helpers import get_workspace_dir_from_env
60
-
61
- workspace_dir = get_workspace_dir_from_env()
62
- if workspace_dir is not None:
63
- resource_name: str = self.get_resource_name()
64
- if resource_name is not None:
65
- input_file_name = f"{resource_name}.yaml"
66
- input_dir_path = workspace_dir
67
- if self.input_dir is not None:
68
- input_dir_path = input_dir_path.joinpath(self.input_dir)
69
- else:
70
- input_dir_path = input_dir_path.joinpath("input")
71
- if self.env is not None:
72
- input_dir_path = input_dir_path.joinpath(self.env)
73
- if self.group is not None:
74
- input_dir_path = input_dir_path.joinpath(self.group)
75
- if self.get_resource_type() is not None:
76
- input_dir_path = input_dir_path.joinpath(self.get_resource_type().lower())
77
- return input_dir_path.joinpath(input_file_name)
78
- return None
79
-
80
- def get_output_file_path(self) -> Optional[Path]:
81
- workspace_dir: Optional[Path] = self.workspace_dir
82
- if workspace_dir is None:
83
- from agno.workspace.helpers import get_workspace_dir_from_env
84
-
85
- workspace_dir = get_workspace_dir_from_env()
86
- if workspace_dir is not None:
87
- resource_name: str = self.get_resource_name()
88
- if resource_name is not None:
89
- output_file_name = f"{resource_name}.yaml"
90
- output_dir_path = workspace_dir
91
- output_dir_path = output_dir_path.joinpath("output")
92
- if self.env is not None:
93
- output_dir_path = output_dir_path.joinpath(self.env)
94
- if self.output_dir is not None:
95
- output_dir_path = output_dir_path.joinpath(self.output_dir)
96
- elif self.get_resource_type() is not None:
97
- output_dir_path = output_dir_path.joinpath(self.get_resource_type().lower())
98
- return output_dir_path.joinpath(output_file_name)
99
- return None
100
-
101
- def save_output_file(self) -> bool:
102
- output_file_path: Optional[Path] = self.get_output_file_path()
103
- if output_file_path is not None:
104
- try:
105
- from agno.utils.yaml_io import write_yaml_file
106
-
107
- if not output_file_path.exists():
108
- output_file_path.parent.mkdir(parents=True, exist_ok=True)
109
- output_file_path.touch(exist_ok=True)
110
- write_yaml_file(output_file_path, self.active_resource)
111
- logger.info(f"Resource saved to: {str(output_file_path)}")
112
- return True
113
- except Exception as e:
114
- logger.error(f"Could not write {self.get_resource_name()} to file: {e}")
115
- return False
116
-
117
- def read_resource_from_file(self) -> Optional[Dict[str, Any]]:
118
- output_file_path: Optional[Path] = self.get_output_file_path()
119
- if output_file_path is not None:
120
- try:
121
- from agno.utils.yaml_io import read_yaml_file
122
-
123
- if output_file_path.exists() and output_file_path.is_file():
124
- data_from_file = read_yaml_file(output_file_path)
125
- if data_from_file is not None and isinstance(data_from_file, dict):
126
- return data_from_file
127
- else:
128
- logger.warning(f"Could not read {self.get_resource_name()} from {output_file_path}")
129
- except Exception as e:
130
- logger.error(f"Could not read {self.get_resource_name()} from file: {e}")
131
- return None
132
-
133
- def delete_output_file(self) -> bool:
134
- output_file_path: Optional[Path] = self.get_output_file_path()
135
- if output_file_path is not None:
136
- try:
137
- if output_file_path.exists() and output_file_path.is_file():
138
- output_file_path.unlink()
139
- logger.debug(f"Output file deleted: {str(output_file_path)}")
140
- return True
141
- except Exception as e:
142
- logger.error(f"Could not delete output file: {e}")
143
- return False
144
-
145
- def matches_filters(
146
- self,
147
- group_filter: Optional[str] = None,
148
- name_filter: Optional[str] = None,
149
- type_filter: Optional[str] = None,
150
- ) -> bool:
151
- if group_filter is not None:
152
- group_name = self.get_group_name()
153
- logger.debug(f"{self.get_resource_name()}: Checking {group_filter} in {group_name}")
154
- if group_name is None or group_filter not in group_name:
155
- return False
156
- if name_filter is not None:
157
- resource_name = self.get_resource_name()
158
- logger.debug(f"{self.get_resource_name()}: Checking {name_filter} in {resource_name}")
159
- if resource_name is None or name_filter not in resource_name:
160
- return False
161
- if type_filter is not None:
162
- resource_type_list = self.get_resource_type_list()
163
- logger.debug(f"{self.get_resource_name()}: Checking {type_filter.lower()} in {resource_type_list}")
164
- if resource_type_list is None or type_filter.lower() not in resource_type_list:
165
- return False
166
- return True
167
-
168
- def should_create(
169
- self,
170
- group_filter: Optional[str] = None,
171
- name_filter: Optional[str] = None,
172
- type_filter: Optional[str] = None,
173
- ) -> bool:
174
- if not self.enabled or self.skip_create:
175
- return False
176
- return self.matches_filters(group_filter, name_filter, type_filter)
177
-
178
- def should_delete(
179
- self,
180
- group_filter: Optional[str] = None,
181
- name_filter: Optional[str] = None,
182
- type_filter: Optional[str] = None,
183
- ) -> bool:
184
- if not self.enabled or self.skip_delete:
185
- return False
186
- return self.matches_filters(group_filter, name_filter, type_filter)
187
-
188
- def should_update(
189
- self,
190
- group_filter: Optional[str] = None,
191
- name_filter: Optional[str] = None,
192
- type_filter: Optional[str] = None,
193
- ) -> bool:
194
- if not self.enabled or self.skip_update:
195
- return False
196
- return self.matches_filters(group_filter, name_filter, type_filter)
197
-
198
- def __hash__(self):
199
- return hash(f"{self.get_resource_type()}:{self.get_resource_name()}")
200
-
201
- def __eq__(self, other):
202
- if isinstance(other, InfraResource):
203
- if other.get_resource_type() == self.get_resource_type():
204
- return self.get_resource_name() == other.get_resource_name()
205
- return False