agno 2.2.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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -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 +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -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 +1335 -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 +1160 -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 +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
agno/utils/whatsapp.py ADDED
@@ -0,0 +1,305 @@
1
+ import os
2
+ from typing import Optional, Union
3
+
4
+ import httpx
5
+ import requests
6
+
7
+ from agno.utils.log import log_debug, log_error
8
+
9
+
10
+ def get_access_token() -> str:
11
+ access_token = os.getenv("WHATSAPP_ACCESS_TOKEN")
12
+ if not access_token:
13
+ raise ValueError("WHATSAPP_ACCESS_TOKEN is not set")
14
+ return access_token
15
+
16
+
17
+ def get_phone_number_id() -> str:
18
+ phone_number_id = os.getenv("WHATSAPP_PHONE_NUMBER_ID")
19
+ if not phone_number_id:
20
+ raise ValueError("WHATSAPP_PHONE_NUMBER_ID is not set")
21
+ return phone_number_id
22
+
23
+
24
+ def get_media(media_id: str) -> Union[dict, bytes]:
25
+ """
26
+ Sends a GET request to the Facebook Graph API to retrieve media information.
27
+
28
+ Args:
29
+ media_id (str): The ID of the media to retrieve.
30
+ """
31
+ url = f"https://graph.facebook.com/v22.0/{media_id}"
32
+
33
+ access_token = get_access_token()
34
+
35
+ headers = {"Authorization": f"Bearer {access_token}"}
36
+ try:
37
+ response = requests.get(url, headers=headers)
38
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
39
+ data = response.json()
40
+
41
+ media_url = data.get("url")
42
+ except requests.exceptions.RequestException as e:
43
+ return {"error": str(e)}
44
+
45
+ try:
46
+ response = requests.get(media_url, headers=headers)
47
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
48
+ data = response.content
49
+ return data
50
+ except requests.exceptions.RequestException as e:
51
+ return {"error": str(e)}
52
+
53
+
54
+ async def get_media_async(media_id: str) -> Union[dict, bytes]:
55
+ """
56
+ Sends a GET request to the Facebook Graph API to retrieve media information.
57
+
58
+ Args:
59
+ media_id (str): The ID of the media to retrieve.
60
+ """
61
+ url = f"https://graph.facebook.com/v22.0/{media_id}"
62
+
63
+ access_token = get_access_token()
64
+
65
+ headers = {"Authorization": f"Bearer {access_token}"}
66
+ try:
67
+ async with httpx.AsyncClient() as client:
68
+ response = await client.get(url, headers=headers)
69
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
70
+ data = response.json()
71
+
72
+ media_url = data.get("url")
73
+ except httpx.HTTPStatusError as e:
74
+ return {"error": str(e)}
75
+
76
+ try:
77
+ async with httpx.AsyncClient() as client:
78
+ response = await client.get(media_url, headers=headers)
79
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
80
+ data = response.content
81
+ return data
82
+ except httpx.HTTPStatusError as e:
83
+ return {"error": str(e)}
84
+
85
+
86
+ def upload_media(media_data: bytes, mime_type: str, filename: str = "file"):
87
+ """
88
+ Sends a POST request to the Facebook Graph API to upload media for WhatsApp.
89
+
90
+ Args:
91
+ media_data: Bytes buffer containing the file data
92
+ mime_type (str): The MIME type of the file
93
+ filename (str): The name to use for the file in the upload. Defaults to "file"
94
+ """
95
+ phone_number_id = get_phone_number_id()
96
+
97
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/media"
98
+
99
+ access_token = get_access_token()
100
+
101
+ headers = {"Authorization": f"Bearer {access_token}"}
102
+
103
+ data = {"messaging_product": "whatsapp", "type": mime_type}
104
+ try:
105
+ from io import BytesIO
106
+
107
+ file_data = BytesIO(media_data)
108
+ files = {"file": (filename, file_data, mime_type)}
109
+
110
+ response = requests.post(url, headers=headers, data=data, files=files)
111
+ response.raise_for_status() # Raise an error for bad responses
112
+ json_resp = response.json()
113
+ media_id = json_resp.get("id")
114
+ if not media_id:
115
+ return {"error": "Media ID not found in response", "response": json_resp}
116
+ return media_id
117
+ except requests.exceptions.RequestException as e:
118
+ return {"error": str(e)}
119
+ except Exception as e:
120
+ return {"error": str(e)}
121
+
122
+
123
+ async def upload_media_async(media_data: bytes, mime_type: str, filename: str = "file"):
124
+ """
125
+ Sends a POST request to the Facebook Graph API to upload media for WhatsApp.
126
+
127
+ Args:
128
+ media_data: Bytes buffer containing the file data
129
+ mime_type (str): The MIME type of the file
130
+ filename (str): The name to use for the file in the upload. Defaults to "file"
131
+ """
132
+ phone_number_id = get_phone_number_id()
133
+
134
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/media"
135
+
136
+ access_token = get_access_token()
137
+
138
+ headers = {"Authorization": f"Bearer {access_token}"}
139
+
140
+ data = {"messaging_product": "whatsapp", "type": mime_type}
141
+ try:
142
+ from io import BytesIO
143
+
144
+ file_data = BytesIO(media_data)
145
+ files = {"file": (filename, file_data, mime_type)}
146
+
147
+ async with httpx.AsyncClient() as client:
148
+ response = await client.post(url, headers=headers, data=data, files=files)
149
+ response.raise_for_status() # Raise an error for bad responses
150
+ json_resp = response.json()
151
+ media_id = json_resp.get("id")
152
+ if not media_id:
153
+ return {"error": "Media ID not found in response", "response": json_resp}
154
+ return media_id
155
+ except httpx.HTTPStatusError as e:
156
+ return {"error": str(e)}
157
+ except Exception as e:
158
+ return {"error": str(e)}
159
+
160
+
161
+ async def send_image_message_async(
162
+ media_id: str,
163
+ recipient: str,
164
+ text: Optional[str] = None,
165
+ ):
166
+ """Send an image message to a WhatsApp user (asynchronous version).
167
+
168
+ Args:
169
+ media_id: The media id for the image to send
170
+ recipient: Recipient's WhatsApp ID or phone number (e.g., "+1234567890").
171
+ text: Caption for the image
172
+
173
+ Returns:
174
+ Success message with message ID
175
+ """
176
+ log_debug(f"Sending WhatsApp image to {recipient}: {text}")
177
+ phone_number_id = get_phone_number_id()
178
+
179
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/messages"
180
+
181
+ access_token = get_access_token()
182
+
183
+ headers = {"Authorization": f"Bearer {access_token}"}
184
+
185
+ data = {
186
+ "messaging_product": "whatsapp",
187
+ "recipient_type": "individual",
188
+ "to": recipient,
189
+ "type": "image",
190
+ "image": {"id": media_id, "caption": text},
191
+ }
192
+
193
+ try:
194
+ async with httpx.AsyncClient() as client:
195
+ import json
196
+
197
+ log_debug(f"Request data: {json.dumps(data, indent=2)}")
198
+ response = await client.post(url, headers=headers, json=data)
199
+ response.raise_for_status()
200
+ log_debug(f"Response: {response.text}")
201
+
202
+ except httpx.HTTPStatusError as e:
203
+ log_error(f"Failed to send WhatsApp image message: {e}")
204
+ log_error(f"Error response: {e.response.text if hasattr(e, 'response') else 'No response text'}")
205
+ raise
206
+ except Exception as e:
207
+ log_error(f"Unexpected error sending WhatsApp image message: {str(e)}")
208
+ raise
209
+
210
+
211
+ def send_image_message(
212
+ media_id: str,
213
+ recipient: str,
214
+ text: Optional[str] = None,
215
+ ):
216
+ """Send an image message to a WhatsApp user (synchronous version).
217
+
218
+ Args:
219
+ image: The media id for the image to send
220
+ recipient: Recipient's WhatsApp ID or phone number (e.g., "+1234567890").
221
+ text: Caption for the image
222
+
223
+ Returns:
224
+ Success message with message ID
225
+ """
226
+ log_debug(f"Sending WhatsApp image to {recipient}: {text}")
227
+ phone_number_id = get_phone_number_id()
228
+
229
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/messages"
230
+
231
+ access_token = get_access_token()
232
+
233
+ headers = {"Authorization": f"Bearer {access_token}"}
234
+
235
+ data = {
236
+ "messaging_product": "whatsapp",
237
+ "recipient_type": "individual",
238
+ "to": recipient,
239
+ "type": "image",
240
+ "image": {"id": media_id, "caption": text},
241
+ }
242
+
243
+ try:
244
+ import json
245
+
246
+ log_debug(f"Request data: {json.dumps(data, indent=2)}")
247
+ response = requests.post(url, headers=headers, json=data)
248
+ response.raise_for_status()
249
+ log_debug(f"Response: {response.text}")
250
+ except requests.exceptions.RequestException as e:
251
+ log_error(f"Failed to send WhatsApp image message: {e}")
252
+ log_error(f"Error response: {e.response.text if hasattr(e, 'response') else 'No response text'}") # type: ignore
253
+ raise
254
+ except Exception as e:
255
+ log_error(f"Unexpected error sending WhatsApp image message: {str(e)}")
256
+ raise
257
+
258
+
259
+ def typing_indicator(message_id: Optional[str] = None):
260
+ if not message_id:
261
+ return
262
+
263
+ phone_number_id = get_phone_number_id()
264
+
265
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/messages"
266
+
267
+ access_token = get_access_token()
268
+
269
+ headers = {"Authorization": f"Bearer {access_token}"}
270
+ data = {
271
+ "messaging_product": "whatsapp",
272
+ "status": "read",
273
+ "message_id": f"{message_id}",
274
+ "typing_indicator": {"type": "text"},
275
+ }
276
+ try:
277
+ response = requests.post(url, headers=headers, data=data)
278
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
279
+ except requests.exceptions.RequestException as e:
280
+ return {"error": str(e)}
281
+
282
+
283
+ async def typing_indicator_async(message_id: Optional[str] = None):
284
+ if not message_id:
285
+ return
286
+
287
+ phone_number_id = get_phone_number_id()
288
+
289
+ url = f"https://graph.facebook.com/v22.0/{phone_number_id}/messages"
290
+
291
+ access_token = get_access_token()
292
+
293
+ headers = {"Authorization": f"Bearer {access_token}"}
294
+ data = {
295
+ "messaging_product": "whatsapp",
296
+ "status": "read",
297
+ "message_id": f"{message_id}",
298
+ "typing_indicator": {"type": "text"},
299
+ }
300
+ try:
301
+ async with httpx.AsyncClient() as client:
302
+ response = await client.post(url, headers=headers, data=data)
303
+ response.raise_for_status() # Raise an HTTPError for bad responses (4xx and 5xx)
304
+ except httpx.HTTPStatusError as e:
305
+ return {"error": str(e)}
agno/utils/yaml_io.py ADDED
@@ -0,0 +1,25 @@
1
+ from pathlib import Path
2
+ from typing import Any, Dict, Optional
3
+
4
+ from agno.utils.log import log_debug, logger
5
+
6
+
7
+ def read_yaml_file(file_path: Optional[Path]) -> Optional[Dict[str, Any]]:
8
+ if file_path is not None and file_path.exists() and file_path.is_file():
9
+ import yaml
10
+
11
+ log_debug(f"Reading {file_path}")
12
+ data_from_file = yaml.safe_load(file_path.read_text())
13
+ if data_from_file is not None and isinstance(data_from_file, dict):
14
+ return data_from_file
15
+ else:
16
+ logger.error(f"Invalid file: {file_path}")
17
+ return None
18
+
19
+
20
+ def write_yaml_file(file_path: Optional[Path], data: Optional[Dict[str, Any]], **kwargs) -> None:
21
+ if file_path is not None and data is not None:
22
+ import yaml
23
+
24
+ log_debug(f"Writing {file_path}")
25
+ file_path.write_text(yaml.safe_dump(data, **kwargs))
@@ -0,0 +1,3 @@
1
+ from agno.vectordb.base import VectorDb
2
+
3
+ __all__ = ["VectorDb"]
agno/vectordb/base.py ADDED
@@ -0,0 +1,127 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Any, Dict, List, Optional
3
+
4
+ from agno.knowledge.document import Document
5
+ from agno.utils.string import generate_id
6
+
7
+
8
+ class VectorDb(ABC):
9
+ """Base class for Vector Databases"""
10
+
11
+ def __init__(self, *, id: Optional[str] = None, name: Optional[str] = None, description: Optional[str] = None):
12
+ """Initialize base VectorDb.
13
+
14
+ Args:
15
+ id: Optional custom ID. If not provided, an id will be generated.
16
+ name: Optional name for the vector database.
17
+ description: Optional description for the vector database.
18
+ """
19
+ if name is None:
20
+ name = self.__class__.__name__
21
+
22
+ self.name = name
23
+ self.description = description
24
+ # Last resort fallback to generate id from name if ID not specified
25
+ self.id = id if id else generate_id(name)
26
+
27
+ @abstractmethod
28
+ def create(self) -> None:
29
+ raise NotImplementedError
30
+
31
+ @abstractmethod
32
+ async def async_create(self) -> None:
33
+ raise NotImplementedError
34
+
35
+ @abstractmethod
36
+ def name_exists(self, name: str) -> bool:
37
+ raise NotImplementedError
38
+
39
+ @abstractmethod
40
+ def async_name_exists(self, name: str) -> bool:
41
+ raise NotImplementedError
42
+
43
+ @abstractmethod
44
+ def id_exists(self, id: str) -> bool:
45
+ raise NotImplementedError
46
+
47
+ @abstractmethod
48
+ def content_hash_exists(self, content_hash: str) -> bool:
49
+ raise NotImplementedError
50
+
51
+ @abstractmethod
52
+ def insert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
53
+ raise NotImplementedError
54
+
55
+ @abstractmethod
56
+ async def async_insert(
57
+ self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None
58
+ ) -> None:
59
+ raise NotImplementedError
60
+
61
+ def upsert_available(self) -> bool:
62
+ return False
63
+
64
+ @abstractmethod
65
+ def upsert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
66
+ raise NotImplementedError
67
+
68
+ @abstractmethod
69
+ async def async_upsert(
70
+ self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None
71
+ ) -> None:
72
+ raise NotImplementedError
73
+
74
+ @abstractmethod
75
+ def search(self, query: str, limit: int = 5, filters: Optional[Any] = None) -> List[Document]:
76
+ raise NotImplementedError
77
+
78
+ @abstractmethod
79
+ async def async_search(self, query: str, limit: int = 5, filters: Optional[Any] = None) -> List[Document]:
80
+ raise NotImplementedError
81
+
82
+ @abstractmethod
83
+ def drop(self) -> None:
84
+ raise NotImplementedError
85
+
86
+ @abstractmethod
87
+ async def async_drop(self) -> None:
88
+ raise NotImplementedError
89
+
90
+ @abstractmethod
91
+ def exists(self) -> bool:
92
+ raise NotImplementedError
93
+
94
+ @abstractmethod
95
+ async def async_exists(self) -> bool:
96
+ raise NotImplementedError
97
+
98
+ def optimize(self) -> None:
99
+ raise NotImplementedError
100
+
101
+ @abstractmethod
102
+ def delete(self) -> bool:
103
+ raise NotImplementedError
104
+
105
+ @abstractmethod
106
+ def delete_by_id(self, id: str) -> bool:
107
+ raise NotImplementedError
108
+
109
+ @abstractmethod
110
+ def delete_by_name(self, name: str) -> bool:
111
+ raise NotImplementedError
112
+
113
+ @abstractmethod
114
+ def delete_by_metadata(self, metadata: Dict[str, Any]) -> bool:
115
+ raise NotImplementedError
116
+
117
+ @abstractmethod
118
+ def update_metadata(self, content_id: str, metadata: Dict[str, Any]) -> None:
119
+ raise NotImplementedError
120
+
121
+ @abstractmethod
122
+ def delete_by_content_id(self, content_id: str) -> bool:
123
+ raise NotImplementedError
124
+
125
+ @abstractmethod
126
+ def get_supported_search_types(self) -> List[str]:
127
+ raise NotImplementedError
@@ -0,0 +1,5 @@
1
+ from agno.vectordb.cassandra.cassandra import Cassandra
2
+
3
+ __all__ = [
4
+ "Cassandra",
5
+ ]