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,355 +0,0 @@
1
- import json
2
- from hashlib import md5
3
- from typing import Any, Dict, List, Optional
4
-
5
- try:
6
- from sqlalchemy.dialects import mysql
7
- from sqlalchemy.engine import Engine, create_engine
8
- from sqlalchemy.inspection import inspect
9
- from sqlalchemy.orm import Session, sessionmaker
10
- from sqlalchemy.schema import Column, MetaData, Table
11
- from sqlalchemy.sql.expression import func, select, text
12
- from sqlalchemy.types import DateTime
13
- except ImportError:
14
- raise ImportError("`sqlalchemy` not installed")
15
-
16
-
17
- from agno.document import Document
18
- from agno.embedder import Embedder
19
- from agno.embedder.openai import OpenAIEmbedder
20
- from agno.reranker.base import Reranker
21
- from agno.utils.log import logger
22
- from agno.vectordb.base import VectorDb
23
- from agno.vectordb.distance import Distance
24
-
25
-
26
- class S2VectorDb(VectorDb):
27
- def __init__(
28
- self,
29
- collection: str,
30
- schema: Optional[str] = "ai",
31
- db_url: Optional[str] = None,
32
- db_engine: Optional[Engine] = None,
33
- embedder: Embedder = OpenAIEmbedder(),
34
- distance: Distance = Distance.cosine,
35
- reranker: Optional[Reranker] = None,
36
- ):
37
- _engine: Optional[Engine] = db_engine
38
- if _engine is None and db_url is not None:
39
- _engine = create_engine(db_url)
40
-
41
- if _engine is None:
42
- raise ValueError("Must provide either db_url or db_engine")
43
-
44
- self.collection: str = collection
45
- self.schema: Optional[str] = schema
46
- self.db_url: Optional[str] = db_url
47
- self.db_engine: Engine = _engine
48
- self.metadata: MetaData = MetaData(schema=self.schema)
49
- self.embedder: Embedder = embedder
50
- self.dimensions: Optional[int] = self.embedder.dimensions
51
- self.distance: Distance = distance
52
- self.Session: sessionmaker[Session] = sessionmaker(bind=self.db_engine)
53
- self.table: Table = self.get_table()
54
- self.reranker: Optional[Reranker] = reranker
55
-
56
- def get_table(self) -> Table:
57
- """
58
- Define the table structure.
59
-
60
- Returns:
61
- Table: SQLAlchemy Table object.
62
- """
63
- return Table(
64
- self.collection,
65
- self.metadata,
66
- Column("id", mysql.TEXT),
67
- Column("name", mysql.TEXT),
68
- Column("meta_data", mysql.TEXT),
69
- Column("content", mysql.TEXT),
70
- Column("embedding", mysql.BLOB), # Use BLOB for storing vector embeddings
71
- Column("usage", mysql.TEXT),
72
- Column("created_at", DateTime(timezone=True), server_default=text("now()")),
73
- Column("updated_at", DateTime(timezone=True), onupdate=text("now()")),
74
- Column("content_hash", mysql.TEXT),
75
- extend_existing=True,
76
- )
77
-
78
- def table_exists(self) -> bool:
79
- """
80
- Check if the table exists.
81
-
82
- Returns:
83
- bool: True if the table exists, False otherwise.
84
- """
85
- logger.debug(f"Checking if table exists: {self.table.name}")
86
- try:
87
- return inspect(self.db_engine).has_table(self.table.name, schema=self.schema)
88
- except Exception as e:
89
- logger.error(e)
90
- return False
91
-
92
- def create(self) -> None:
93
- """
94
- Create the table if it does not exist.
95
- """
96
- if not self.table_exists():
97
- # with self.Session() as sess:
98
- # with sess.begin():
99
- # if self.schema is not None:
100
- # logger.debug(f"Creating schema: {self.schema}")
101
- # sess.execute(text(f"CREATE DATABASE IF NOT EXISTS {self.schema};"))
102
- logger.info(f"Creating table: {self.collection}")
103
- self.table.create(self.db_engine)
104
-
105
- def doc_exists(self, document: Document) -> bool:
106
- """
107
- Validating if the document exists or not
108
-
109
- Args:
110
- document (Document): Document to validate
111
- """
112
- columns = [self.table.c.name, self.table.c.content_hash]
113
- with self.Session.begin() as sess:
114
- cleaned_content = document.content.replace("\x00", "\ufffd")
115
- stmt = select(*columns).where(self.table.c.content_hash == md5(cleaned_content.encode()).hexdigest())
116
- result = sess.execute(stmt).first()
117
- return result is not None
118
-
119
- def name_exists(self, name: str) -> bool:
120
- """
121
- Validate if a row with this name exists or not
122
-
123
- Args:
124
- name (str): Name to check
125
- """
126
- with self.Session.begin() as sess:
127
- stmt = select(self.table.c.name).where(self.table.c.name == name)
128
- result = sess.execute(stmt).first()
129
- return result is not None
130
-
131
- def id_exists(self, id: str) -> bool:
132
- """
133
- Validate if a row with this id exists or not
134
-
135
- Args:
136
- id (str): Id to check
137
- """
138
- with self.Session.begin() as sess:
139
- stmt = select(self.table.c.id).where(self.table.c.id == id)
140
- result = sess.execute(stmt).first()
141
- return result is not None
142
-
143
- def insert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None, batch_size: int = 10) -> None:
144
- """
145
- Insert documents into the table.
146
-
147
- Args:
148
- documents (List[Document]): List of documents to insert.
149
- filters (Optional[Dict[str, Any]]): Optional filters for the insert.
150
- batch_size (int): Number of documents to insert in each batch.
151
- """
152
- with self.Session.begin() as sess:
153
- counter = 0
154
- for document in documents:
155
- document.embed(embedder=self.embedder)
156
- cleaned_content = document.content.replace("\x00", "\ufffd")
157
- content_hash = md5(cleaned_content.encode()).hexdigest()
158
- _id = document.id or content_hash
159
-
160
- meta_data_json = json.dumps(document.meta_data)
161
- usage_json = json.dumps(document.usage)
162
- embedding_json = json.dumps(document.embedding)
163
- json_array_pack = text("JSON_ARRAY_PACK(:embedding)").bindparams(embedding=embedding_json)
164
-
165
- stmt = mysql.insert(self.table).values(
166
- id=_id,
167
- name=document.name,
168
- meta_data=meta_data_json,
169
- content=cleaned_content,
170
- embedding=json_array_pack,
171
- usage=usage_json,
172
- content_hash=content_hash,
173
- )
174
- sess.execute(stmt)
175
- counter += 1
176
- logger.debug(f"Inserted document: {document.name} ({document.meta_data})")
177
-
178
- # Commit all documents
179
- sess.commit()
180
- logger.debug(f"Committed {counter} documents")
181
-
182
- def upsert_available(self) -> bool:
183
- return False
184
-
185
- def upsert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None, batch_size: int = 20) -> None:
186
- """
187
- Upsert documents into the database.
188
-
189
- Args:
190
- documents (List[Document]): List of documents to upsert
191
- filters (Optional[Dict[str, Any]]): Optional filters for upserting documents
192
- batch_size (int): Batch size for upserting documents
193
- """
194
- with self.Session.begin() as sess:
195
- counter = 0
196
- for document in documents:
197
- document.embed(embedder=self.embedder)
198
- cleaned_content = document.content.replace("\x00", "\ufffd")
199
- content_hash = md5(cleaned_content.encode()).hexdigest()
200
- _id = document.id or content_hash
201
-
202
- meta_data_json = json.dumps(document.meta_data)
203
- usage_json = json.dumps(document.usage)
204
- embedding_json = json.dumps(document.embedding)
205
- json_array_pack = text("JSON_ARRAY_PACK(:embedding)").bindparams(embedding=embedding_json)
206
-
207
- stmt = mysql.insert(self.table).values(
208
- id=_id,
209
- name=document.name,
210
- meta_data=meta_data_json,
211
- content=cleaned_content,
212
- embedding=json_array_pack,
213
- usage=usage_json,
214
- content_hash=content_hash,
215
- )
216
- sess.execute(stmt)
217
- counter += 1
218
- logger.debug(f"Inserted document: {document.id} | {document.name} | {document.meta_data}")
219
-
220
- # Commit all remaining documents
221
- sess.commit()
222
- logger.debug(f"Committed {counter} documents")
223
-
224
- def search(self, query: str, limit: int = 5, filters: Optional[Dict[str, Any]] = None) -> List[Document]:
225
- """
226
- Search for documents based on a query and optional filters.
227
-
228
- Args:
229
- query (str): The search query.
230
- limit (int): The maximum number of results to return.
231
- filters (Optional[Dict[str, Any]]): Optional filters for the search.
232
-
233
- Returns:
234
- List[Document]: List of documents that match the query.
235
- """
236
- query_embedding = self.embedder.get_embedding(query)
237
- if query_embedding is None:
238
- logger.error(f"Error getting embedding for Query: {query}")
239
- return []
240
-
241
- columns = [
242
- self.table.c.name,
243
- self.table.c.meta_data,
244
- self.table.c.content,
245
- func.json_array_unpack(self.table.c.embedding).label(
246
- "embedding"
247
- ), # Unpack embedding here # self.table.c.embedding,
248
- self.table.c.usage,
249
- ]
250
-
251
- stmt = select(*columns)
252
-
253
- if filters is not None:
254
- for key, value in filters.items():
255
- if hasattr(self.table.c, key):
256
- stmt = stmt.where(getattr(self.table.c, key) == value)
257
-
258
- if self.distance == Distance.l2:
259
- stmt = stmt.order_by(self.table.c.embedding.max_inner_product(query_embedding))
260
- if self.distance == Distance.cosine:
261
- embedding_json = json.dumps(query_embedding)
262
- dot_product_expr = func.dot_product(self.table.c.embedding, text("JSON_ARRAY_PACK(:embedding)"))
263
- stmt = stmt.order_by(dot_product_expr.desc())
264
- stmt = stmt.params(embedding=embedding_json)
265
- # stmt = stmt.order_by(self.table.c.embedding.cosine_distance(query_embedding))
266
- if self.distance == Distance.max_inner_product:
267
- stmt = stmt.order_by(self.table.c.embedding.max_inner_product(query_embedding))
268
-
269
- stmt = stmt.limit(limit=limit)
270
- logger.debug(f"Query: {stmt}")
271
-
272
- # Get neighbors
273
- # This will only work if embedding column is created with `vector` data type.
274
- with self.Session.begin() as sess:
275
- neighbors = sess.execute(stmt).fetchall() or []
276
- # if self.index is not None:
277
- # if isinstance(self.index, Ivfflat):
278
- # # Assuming 'nprobe' is a relevant parameter to be set for the session
279
- # # Update the session settings based on the Ivfflat index configuration
280
- # sess.execute(text(f"SET SESSION nprobe = {self.index.nprobe}"))
281
- # elif isinstance(self.index, HNSWFlat):
282
- # # Assuming 'ef_search' is a relevant parameter to be set for the session
283
- # # Update the session settings based on the HNSW index configuration
284
- # sess.execute(text(f"SET SESSION ef_search = {self.index.ef_search}"))
285
-
286
- # Build search results
287
- search_results: List[Document] = []
288
- for neighbor in neighbors:
289
- meta_data_dict = json.loads(neighbor.meta_data) if neighbor.meta_data else {}
290
- usage_dict = json.loads(neighbor.usage) if neighbor.usage else {}
291
- # Convert the embedding mysql.TEXT back into a list
292
- embedding_list = json.loads(neighbor.embedding) if neighbor.embedding else []
293
-
294
- search_results.append(
295
- Document(
296
- name=neighbor.name,
297
- meta_data=meta_data_dict,
298
- content=neighbor.content,
299
- embedder=self.embedder,
300
- embedding=embedding_list,
301
- usage=usage_dict,
302
- )
303
- )
304
-
305
- if self.reranker:
306
- search_results = self.reranker.rerank(query=query, documents=search_results)
307
-
308
- return search_results
309
-
310
- def drop(self) -> None:
311
- """
312
- Delete the table.
313
- """
314
- if self.table_exists():
315
- logger.debug(f"Deleting table: {self.collection}")
316
- self.table.drop(self.db_engine)
317
-
318
- def exists(self) -> bool:
319
- """
320
- Check if the table exists.
321
-
322
- Returns:
323
- bool: True if the table exists, False otherwise.
324
- """
325
- return self.table_exists()
326
-
327
- def get_count(self) -> int:
328
- """
329
- Get the count of rows in the table.
330
-
331
- Returns:
332
- int: The count of rows.
333
- """
334
- with self.Session.begin() as sess:
335
- stmt = select(func.count(self.table.c.name)).select_from(self.table)
336
- result = sess.execute(stmt).scalar()
337
- if result is not None:
338
- return int(result)
339
- return 0
340
-
341
- def optimize(self) -> None:
342
- pass
343
-
344
- def delete(self) -> bool:
345
- """
346
- Clear all rows from the table.
347
-
348
- Returns:
349
- bool: True if the table was cleared, False otherwise.
350
- """
351
- logger.info(f"Deleting table: {self.collection}")
352
- with self.Session.begin() as sess:
353
- stmt = self.table.delete()
354
- sess.execute(stmt)
355
- return True
File without changes
agno/workspace/config.py DELETED
@@ -1,325 +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.api.schemas.team import TeamSchema
7
- from agno.api.schemas.workspace import WorkspaceSchema
8
- from agno.infra.base import InfraBase
9
- from agno.infra.resources import InfraResources
10
- from agno.utils.log import logger
11
- from agno.workspace.settings import WorkspaceSettings
12
-
13
- # List of directories to ignore when loading the workspace
14
- ignored_dirs = ["ignore", "test", "tests", "config"]
15
-
16
-
17
- class WorkspaceConfig(BaseModel):
18
- """The WorkspaceConfig holds the configuration for an Agno workspace."""
19
-
20
- # Root directory of the workspace.
21
- ws_root_path: Path
22
- # WorkspaceSchema: This field indicates that the workspace is synced with the api
23
- ws_schema: Optional[WorkspaceSchema] = None
24
- # The Team for this workspace
25
- ws_team: Optional[TeamSchema] = None
26
- # The API key for this workspace
27
- ws_api_key: Optional[str] = None
28
-
29
- # Path to the "workspace" directory inside the workspace root
30
- _workspace_dir_path: Optional[Path] = None
31
- # WorkspaceSettings
32
- _workspace_settings: Optional[WorkspaceSettings] = None
33
-
34
- model_config = ConfigDict(arbitrary_types_allowed=True)
35
-
36
- def to_dict(self) -> dict:
37
- return self.model_dump(include={"ws_root_path", "ws_schema", "ws_team", "ws_api_key"})
38
-
39
- @property
40
- def workspace_dir_path(self) -> Optional[Path]:
41
- if self._workspace_dir_path is None:
42
- if self.ws_root_path is not None:
43
- from agno.workspace.helpers import get_workspace_dir_path
44
-
45
- self._workspace_dir_path = get_workspace_dir_path(self.ws_root_path)
46
- return self._workspace_dir_path
47
-
48
- def validate_workspace_settings(self, obj: Any) -> bool:
49
- if not isinstance(obj, WorkspaceSettings):
50
- raise Exception("WorkspaceSettings must be of type WorkspaceSettings")
51
-
52
- if self.ws_root_path is not None and obj.ws_root is not None:
53
- if obj.ws_root != self.ws_root_path:
54
- raise Exception(f"WorkspaceSettings.ws_root ({obj.ws_root}) must match {self.ws_root_path}")
55
- return True
56
-
57
- @property
58
- def workspace_settings(self) -> Optional[WorkspaceSettings]:
59
- if self._workspace_settings is not None:
60
- return self._workspace_settings
61
-
62
- ws_settings_file: Optional[Path] = None
63
- if self.workspace_dir_path is not None:
64
- _ws_settings_file = self.workspace_dir_path.joinpath("settings.py")
65
- if _ws_settings_file.exists() and _ws_settings_file.is_file():
66
- ws_settings_file = _ws_settings_file
67
- if ws_settings_file is None:
68
- logger.debug("workspace_settings file not found")
69
- return None
70
-
71
- logger.debug(f"Loading workspace_settings from {ws_settings_file}")
72
- try:
73
- from agno.utils.py_io import get_python_objects_from_module
74
-
75
- python_objects = get_python_objects_from_module(ws_settings_file)
76
- for obj_name, obj in python_objects.items():
77
- if isinstance(obj, WorkspaceSettings):
78
- if self.validate_workspace_settings(obj):
79
- self._workspace_settings = obj
80
- if self.ws_schema is not None and self._workspace_settings is not None:
81
- self._workspace_settings.ws_schema = self.ws_schema
82
- logger.debug("Added WorkspaceSchema to WorkspaceSettings")
83
- except Exception:
84
- logger.warning(f"Error in {ws_settings_file}")
85
- raise
86
- return self._workspace_settings
87
-
88
- def set_local_env(self) -> None:
89
- from os import environ
90
-
91
- from agno.constants import (
92
- AWS_REGION_ENV_VAR,
93
- WORKSPACE_DIR_ENV_VAR,
94
- WORKSPACE_ID_ENV_VAR,
95
- WORKSPACE_NAME_ENV_VAR,
96
- WORKSPACE_ROOT_ENV_VAR,
97
- )
98
-
99
- if self.ws_root_path is not None:
100
- environ[WORKSPACE_ROOT_ENV_VAR] = str(self.ws_root_path)
101
-
102
- workspace_dir_path: Optional[Path] = self.workspace_dir_path
103
- if workspace_dir_path is not None:
104
- environ[WORKSPACE_DIR_ENV_VAR] = str(workspace_dir_path)
105
-
106
- if self.workspace_settings is not None:
107
- environ[WORKSPACE_NAME_ENV_VAR] = str(self.workspace_settings.ws_name)
108
-
109
- if self.ws_schema is not None and self.ws_schema.id_workspace is not None:
110
- environ[WORKSPACE_ID_ENV_VAR] = str(self.ws_schema.id_workspace)
111
-
112
- if (
113
- environ.get(AWS_REGION_ENV_VAR) is None
114
- and self.workspace_settings is not None
115
- and self.workspace_settings.aws_region is not None
116
- ):
117
- environ[AWS_REGION_ENV_VAR] = self.workspace_settings.aws_region
118
-
119
- def get_resources(
120
- self,
121
- env: Optional[str] = None,
122
- infra: Optional[str] = None,
123
- order: str = "create",
124
- ) -> List[InfraResources]:
125
- if self.ws_root_path is None:
126
- logger.warning("WorkspaceConfig.ws_root_path is None")
127
- return []
128
-
129
- from sys import path as sys_path
130
-
131
- from agno.utils.load_env import load_env
132
- from agno.utils.py_io import get_python_objects_from_module
133
-
134
- logger.debug("**--> Loading WorkspaceConfig")
135
- logger.debug(f"Loading .env from {self.ws_root_path}")
136
- load_env(dotenv_dir=self.ws_root_path)
137
-
138
- # NOTE: When loading a workspace, relative imports or package imports do not work.
139
- # This is a known problem in python
140
- # eg: https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944
141
- # To make them work, we add workspace_root to sys.path so is treated as a module
142
- logger.debug(f"Adding {self.ws_root_path} to path")
143
- sys_path.insert(0, str(self.ws_root_path))
144
-
145
- workspace_dir_path: Optional[Path] = self.workspace_dir_path
146
- if workspace_dir_path is not None:
147
- logger.debug(f"--^^-- Loading workspace from: {workspace_dir_path}")
148
- # Create a dict of objects in the workspace directory
149
- workspace_objects: Dict[str, InfraResources] = {}
150
- resource_files = workspace_dir_path.rglob("*.py")
151
- for resource_file in resource_files:
152
- if resource_file.name == "__init__.py":
153
- continue
154
-
155
- resource_file_parts = resource_file.parts
156
- workspace_dir_path_parts = workspace_dir_path.parts
157
- resource_file_parts_after_ws = resource_file_parts[len(workspace_dir_path_parts) :]
158
- # Check if file in ignored directory
159
- if any([ignored_dir in resource_file_parts_after_ws for ignored_dir in ignored_dirs]):
160
- logger.debug(f"Skipping file in ignored directory: {resource_file}")
161
- continue
162
- logger.debug(f"Reading file: {resource_file}")
163
- try:
164
- python_objects = get_python_objects_from_module(resource_file)
165
- # logger.debug(f"python_objects: {python_objects}")
166
- for obj_name, obj in python_objects.items():
167
- if isinstance(obj, WorkspaceSettings):
168
- logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
169
- if self.validate_workspace_settings(obj):
170
- self._workspace_settings = obj
171
- if self.ws_schema is not None and self._workspace_settings is not None:
172
- self._workspace_settings.ws_schema = self.ws_schema
173
- logger.debug("Added WorkspaceSchema to WorkspaceSettings")
174
- elif isinstance(obj, InfraResources):
175
- logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
176
- if not obj.enabled:
177
- logger.debug(f"Skipping {obj_name}: disabled")
178
- continue
179
- workspace_objects[obj_name] = obj
180
- except Exception:
181
- logger.warning(f"Error in {resource_file}")
182
- raise
183
- logger.debug(f"workspace_objects: {workspace_objects}")
184
- logger.debug("**--> WorkspaceConfig loaded")
185
- logger.debug(f"Removing {self.ws_root_path} from path")
186
- sys_path.remove(str(self.ws_root_path))
187
-
188
- # Filter resources by infra
189
- filtered_ws_objects_by_infra_type: Dict[str, InfraResources] = {}
190
- logger.debug(f"Filtering resources for env: {env} | infra: {infra} | order: {order}")
191
- if infra is None:
192
- filtered_ws_objects_by_infra_type = workspace_objects
193
- else:
194
- for resource_name, resource in workspace_objects.items():
195
- if resource.infra == infra:
196
- filtered_ws_objects_by_infra_type[resource_name] = resource
197
-
198
- # Filter resources by env
199
- filtered_infra_objects_by_env: Dict[str, InfraResources] = {}
200
- if env is None:
201
- filtered_infra_objects_by_env = filtered_ws_objects_by_infra_type
202
- else:
203
- for resource_name, resource in filtered_ws_objects_by_infra_type.items():
204
- if resource.env == env:
205
- filtered_infra_objects_by_env[resource_name] = resource
206
-
207
- # Updated resources with the workspace settings
208
- # Create a temporary workspace settings object if it does not exist
209
- if self._workspace_settings is None:
210
- self._workspace_settings = WorkspaceSettings(
211
- ws_root=self.ws_root_path,
212
- ws_name=self.ws_root_path.stem,
213
- )
214
- logger.debug(f"Created WorkspaceSettings: {self._workspace_settings}")
215
- # Update the resources with the workspace settings
216
- if self._workspace_settings is not None:
217
- for resource_name, resource in filtered_infra_objects_by_env.items():
218
- logger.debug(f"Setting workspace settings for {resource.__class__.__name__}")
219
- resource.set_workspace_settings(self._workspace_settings)
220
-
221
- # Create a list of InfraResources from the filtered resources
222
- infra_resources_list: List[InfraResources] = []
223
- for resource_name, resource in filtered_infra_objects_by_env.items():
224
- # If the resource is an InfraResources object, add it to the list
225
- if isinstance(resource, InfraResources):
226
- infra_resources_list.append(resource)
227
-
228
- return infra_resources_list
229
-
230
- @staticmethod
231
- def get_resources_from_file(
232
- resource_file: Path,
233
- env: Optional[str] = None,
234
- infra: Optional[str] = None,
235
- order: str = "create",
236
- ) -> List[InfraResources]:
237
- if not resource_file.exists():
238
- raise FileNotFoundError(f"File {resource_file} does not exist")
239
- if not resource_file.is_file():
240
- raise ValueError(f"Path {resource_file} is not a file")
241
- if not resource_file.suffix == ".py":
242
- raise ValueError(f"File {resource_file} is not a python file")
243
-
244
- from sys import path as sys_path
245
-
246
- from agno.utils.load_env import load_env
247
- from agno.utils.py_io import get_python_objects_from_module
248
-
249
- resource_file_parent_dir = resource_file.parent.resolve()
250
- logger.debug(f"Loading .env from {resource_file_parent_dir}")
251
- load_env(dotenv_dir=resource_file_parent_dir)
252
-
253
- temporary_ws_config = WorkspaceConfig(ws_root_path=resource_file_parent_dir)
254
-
255
- # NOTE: When loading a directory, relative imports or package imports do not work.
256
- # This is a known problem in python
257
- # eg: https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944
258
- # To make them work, we add the resource_file_parent_dir to sys.path so it can be treated as a module
259
- logger.debug(f"Adding {resource_file_parent_dir} to path")
260
- sys_path.insert(0, str(resource_file_parent_dir))
261
-
262
- logger.debug(f"**--> Reading Infra resources from {resource_file}")
263
-
264
- # Get all infra resources from the file
265
- infra_objects: Dict[str, InfraBase] = {}
266
- try:
267
- # Get all python objects from the file
268
- python_objects = get_python_objects_from_module(resource_file)
269
- # Filter out the objects that are subclasses of InfraBase
270
- for obj_name, obj in python_objects.items():
271
- if isinstance(obj, InfraBase):
272
- logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
273
- if not obj.enabled:
274
- logger.debug(f"Skipping {obj_name}: disabled")
275
- continue
276
- infra_objects[obj_name] = obj
277
- except Exception:
278
- logger.error(f"Error reading: {resource_file}")
279
- raise
280
-
281
- # Filter resources by infra
282
- filtered_infra_objects_by_infra_type: Dict[str, InfraBase] = {}
283
- logger.debug(f"Filtering resources for env: {env} | infra: {infra} | order: {order}")
284
- if infra is None:
285
- filtered_infra_objects_by_infra_type = infra_objects
286
- else:
287
- for resource_name, resource in infra_objects.items():
288
- if resource.infra == infra:
289
- filtered_infra_objects_by_infra_type[resource_name] = resource
290
-
291
- # Filter resources by env
292
- filtered_infra_objects_by_env: Dict[str, InfraBase] = {}
293
- if env is None:
294
- filtered_infra_objects_by_env = filtered_infra_objects_by_infra_type
295
- else:
296
- for resource_name, resource in filtered_infra_objects_by_infra_type.items():
297
- if resource.env == env:
298
- filtered_infra_objects_by_env[resource_name] = resource
299
-
300
- # Updated resources with the workspace settings
301
- # Create a temporary workspace settings object if it does not exist
302
- if temporary_ws_config._workspace_settings is None:
303
- temporary_ws_config._workspace_settings = WorkspaceSettings(
304
- ws_root=temporary_ws_config.ws_root_path,
305
- ws_name=temporary_ws_config.ws_root_path.stem,
306
- )
307
- # Update the resources with the workspace settings
308
- if temporary_ws_config._workspace_settings is not None:
309
- for resource_name, resource in filtered_infra_objects_by_env.items():
310
- logger.debug(f"Setting workspace settings for {resource.__class__.__name__}")
311
- resource.set_workspace_settings(temporary_ws_config._workspace_settings)
312
-
313
- # Create a list of InfraResources from the filtered resources
314
- infra_resources_list: List[InfraResources] = []
315
- for resource_name, resource in filtered_infra_objects_by_env.items():
316
- # If the resource is an InfraResources object, add it to the list
317
- if isinstance(resource, InfraResources):
318
- infra_resources_list.append(resource)
319
- # Otherwise, get the InfraResources object from the resource
320
- else:
321
- _infra_resources = resource.get_infra_resources()
322
- if _infra_resources is not None and isinstance(_infra_resources, InfraResources):
323
- infra_resources_list.append(_infra_resources)
324
-
325
- return infra_resources_list
agno/workspace/enums.py DELETED
@@ -1,6 +0,0 @@
1
- from enum import Enum
2
-
3
-
4
- class WorkspaceStarterTemplate(str, Enum):
5
- agent_app = "agent-app"
6
- agent_api = "agent-api"