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/media.py ADDED
@@ -0,0 +1,462 @@
1
+ from pathlib import Path
2
+ from typing import Any, Dict, List, Optional, Tuple, Union
3
+ from uuid import uuid4
4
+
5
+ from pydantic import BaseModel, field_validator, model_validator
6
+
7
+
8
+ class Image(BaseModel):
9
+ """Unified Image class for all use cases (input, output, artifacts)"""
10
+
11
+ # Core content fields (exactly one required)
12
+ url: Optional[str] = None # Remote location
13
+ filepath: Optional[Union[Path, str]] = None # Local file path
14
+ content: Optional[bytes] = None # Raw image bytes (standardized to bytes)
15
+
16
+ # Metadata fields
17
+ id: Optional[str] = None # For tracking/referencing
18
+ format: Optional[str] = None # E.g. 'png', 'jpeg', 'webp', 'gif'
19
+ mime_type: Optional[str] = None # E.g. 'image/png', 'image/jpeg'
20
+
21
+ # Input-specific fields
22
+ detail: Optional[str] = (
23
+ None # low, medium, high or auto (per OpenAI spec https://platform.openai.com/docs/guides/vision?lang=node#low-or-high-fidelity-image-understanding)
24
+ )
25
+
26
+ # Output-specific fields (from tools/LLMs)
27
+ original_prompt: Optional[str] = None # Original generation prompt
28
+ revised_prompt: Optional[str] = None # Revised generation prompt
29
+ alt_text: Optional[str] = None # Alt text description
30
+
31
+ @model_validator(mode="before")
32
+ def validate_and_normalize_content(cls, data: Any):
33
+ """Ensure exactly one content source and normalize to bytes"""
34
+ if isinstance(data, dict):
35
+ url = data.get("url")
36
+ filepath = data.get("filepath")
37
+ content = data.get("content")
38
+
39
+ # Count non-None sources
40
+ sources = [x for x in [url, filepath, content] if x is not None]
41
+ if len(sources) == 0:
42
+ raise ValueError("One of 'url', 'filepath', or 'content' must be provided")
43
+ elif len(sources) > 1:
44
+ raise ValueError("Only one of 'url', 'filepath', or 'content' should be provided")
45
+
46
+ # Auto-generate ID if not provided
47
+ if data.get("id") is None:
48
+ data["id"] = str(uuid4())
49
+
50
+ return data
51
+
52
+ def get_content_bytes(self) -> Optional[bytes]:
53
+ """Get image content as raw bytes, loading from URL/file if needed"""
54
+ if self.content:
55
+ return self.content
56
+ elif self.url:
57
+ import httpx
58
+
59
+ return httpx.get(self.url).content
60
+ elif self.filepath:
61
+ with open(self.filepath, "rb") as f:
62
+ return f.read()
63
+ return None
64
+
65
+ def to_base64(self) -> Optional[str]:
66
+ """Convert content to base64 string for transmission/storage"""
67
+ content_bytes = self.get_content_bytes()
68
+ if content_bytes:
69
+ import base64
70
+
71
+ return base64.b64encode(content_bytes).decode("utf-8")
72
+ return None
73
+
74
+ @classmethod
75
+ def from_base64(
76
+ cls,
77
+ base64_content: str,
78
+ id: Optional[str] = None,
79
+ mime_type: Optional[str] = None,
80
+ format: Optional[str] = None,
81
+ **kwargs,
82
+ ) -> "Image":
83
+ """Create Image from base64 content"""
84
+ import base64
85
+
86
+ try:
87
+ content_bytes = base64.b64decode(base64_content)
88
+ except Exception:
89
+ content_bytes = base64_content.encode("utf-8")
90
+
91
+ return cls(content=content_bytes, id=id or str(uuid4()), mime_type=mime_type, format=format, **kwargs)
92
+
93
+ def to_dict(self, include_base64_content: bool = True) -> Dict[str, Any]:
94
+ """Convert to dict, optionally including base64-encoded content"""
95
+ result = {
96
+ "id": self.id,
97
+ "url": self.url,
98
+ "filepath": str(self.filepath) if self.filepath else None,
99
+ "format": self.format,
100
+ "mime_type": self.mime_type,
101
+ "detail": self.detail,
102
+ "original_prompt": self.original_prompt,
103
+ "revised_prompt": self.revised_prompt,
104
+ "alt_text": self.alt_text,
105
+ }
106
+
107
+ if include_base64_content and self.content:
108
+ result["content"] = self.to_base64()
109
+
110
+ return {k: v for k, v in result.items() if v is not None}
111
+
112
+
113
+ class Audio(BaseModel):
114
+ """Unified Audio class for all use cases (input, output, artifacts)"""
115
+
116
+ # Core content fields (exactly one required)
117
+ url: Optional[str] = None
118
+ filepath: Optional[Union[Path, str]] = None
119
+ content: Optional[bytes] = None # Raw audio bytes (standardized to bytes)
120
+
121
+ # Metadata fields
122
+ id: Optional[str] = None
123
+ format: Optional[str] = None # E.g. 'mp3', 'wav', 'ogg'
124
+ mime_type: Optional[str] = None # E.g. 'audio/mpeg', 'audio/wav'
125
+
126
+ # Audio-specific metadata
127
+ duration: Optional[float] = None # Duration in seconds
128
+ sample_rate: Optional[int] = 24000 # Sample rate in Hz
129
+ channels: Optional[int] = 1 # Number of audio channels
130
+
131
+ # Output-specific fields (from LLMs)
132
+ transcript: Optional[str] = None # Text transcript of audio
133
+ expires_at: Optional[int] = None # Expiration timestamp for temporary URLs
134
+
135
+ @model_validator(mode="before")
136
+ def validate_and_normalize_content(cls, data: Any):
137
+ """Ensure exactly one content source and normalize to bytes"""
138
+ if isinstance(data, dict):
139
+ url = data.get("url")
140
+ filepath = data.get("filepath")
141
+ content = data.get("content")
142
+
143
+ sources = [x for x in [url, filepath, content] if x is not None]
144
+ if len(sources) == 0:
145
+ raise ValueError("One of 'url', 'filepath', or 'content' must be provided")
146
+ elif len(sources) > 1:
147
+ raise ValueError("Only one of 'url', 'filepath', or 'content' should be provided")
148
+
149
+ if data.get("id") is None:
150
+ data["id"] = str(uuid4())
151
+
152
+ return data
153
+
154
+ def get_content_bytes(self) -> Optional[bytes]:
155
+ """Get audio content as raw bytes"""
156
+ if self.content:
157
+ return self.content
158
+ elif self.url:
159
+ import httpx
160
+
161
+ return httpx.get(self.url).content
162
+ elif self.filepath:
163
+ with open(self.filepath, "rb") as f:
164
+ return f.read()
165
+ return None
166
+
167
+ def to_base64(self) -> Optional[str]:
168
+ """Convert content to base64 string"""
169
+ content_bytes = self.get_content_bytes()
170
+ if content_bytes:
171
+ import base64
172
+
173
+ return base64.b64encode(content_bytes).decode("utf-8")
174
+ return None
175
+
176
+ @classmethod
177
+ def from_base64(
178
+ cls,
179
+ base64_content: str,
180
+ id: Optional[str] = None,
181
+ mime_type: Optional[str] = None,
182
+ transcript: Optional[str] = None,
183
+ expires_at: Optional[int] = None,
184
+ sample_rate: Optional[int] = 24000,
185
+ channels: Optional[int] = 1,
186
+ **kwargs,
187
+ ) -> "Audio":
188
+ """Create Audio from base64 content (useful for API responses)"""
189
+ import base64
190
+
191
+ try:
192
+ content_bytes = base64.b64decode(base64_content)
193
+ except Exception:
194
+ # If not valid base64, encode as UTF-8 bytes
195
+ content_bytes = base64_content.encode("utf-8")
196
+
197
+ return cls(
198
+ content=content_bytes,
199
+ id=id or str(uuid4()),
200
+ mime_type=mime_type,
201
+ transcript=transcript,
202
+ expires_at=expires_at,
203
+ sample_rate=sample_rate,
204
+ channels=channels,
205
+ **kwargs,
206
+ )
207
+
208
+ def to_dict(self, include_base64_content: bool = True) -> Dict[str, Any]:
209
+ """Convert to dict, optionally including base64-encoded content"""
210
+ result = {
211
+ "id": self.id,
212
+ "url": self.url,
213
+ "filepath": str(self.filepath) if self.filepath else None,
214
+ "format": self.format,
215
+ "mime_type": self.mime_type,
216
+ "duration": self.duration,
217
+ "sample_rate": self.sample_rate,
218
+ "channels": self.channels,
219
+ "transcript": self.transcript,
220
+ "expires_at": self.expires_at,
221
+ }
222
+
223
+ if include_base64_content and self.content:
224
+ result["content"] = self.to_base64()
225
+
226
+ return {k: v for k, v in result.items() if v is not None}
227
+
228
+
229
+ class Video(BaseModel):
230
+ """Unified Video class for all use cases (input, output, artifacts)"""
231
+
232
+ # Core content fields (exactly one required)
233
+ url: Optional[str] = None
234
+ filepath: Optional[Union[Path, str]] = None
235
+ content: Optional[bytes] = None # Raw video bytes (standardized to bytes)
236
+
237
+ # Metadata fields
238
+ id: Optional[str] = None
239
+ format: Optional[str] = None # E.g. 'mp4', 'mov', 'avi', 'webm'
240
+ mime_type: Optional[str] = None # E.g. 'video/mp4', 'video/quicktime'
241
+
242
+ # Video-specific metadata
243
+ duration: Optional[float] = None # Duration in seconds
244
+ width: Optional[int] = None # Video width in pixels
245
+ height: Optional[int] = None # Video height in pixels
246
+ fps: Optional[float] = None # Frames per second
247
+
248
+ # Output-specific fields (from tools)
249
+ eta: Optional[str] = None # Estimated time for generation
250
+ original_prompt: Optional[str] = None
251
+ revised_prompt: Optional[str] = None
252
+
253
+ @model_validator(mode="before")
254
+ def validate_and_normalize_content(cls, data: Any):
255
+ """Ensure exactly one content source and normalize to bytes"""
256
+ if isinstance(data, dict):
257
+ url = data.get("url")
258
+ filepath = data.get("filepath")
259
+ content = data.get("content")
260
+
261
+ sources = [x for x in [url, filepath, content] if x is not None]
262
+ if len(sources) == 0:
263
+ raise ValueError("One of 'url', 'filepath', or 'content' must be provided")
264
+ elif len(sources) > 1:
265
+ raise ValueError("Only one of 'url', 'filepath', or 'content' should be provided")
266
+
267
+ if data.get("id") is None:
268
+ data["id"] = str(uuid4())
269
+
270
+ return data
271
+
272
+ def get_content_bytes(self) -> Optional[bytes]:
273
+ """Get video content as raw bytes"""
274
+ if self.content:
275
+ return self.content
276
+ elif self.url:
277
+ import httpx
278
+
279
+ return httpx.get(self.url).content
280
+ elif self.filepath:
281
+ with open(self.filepath, "rb") as f:
282
+ return f.read()
283
+ return None
284
+
285
+ def to_base64(self) -> Optional[str]:
286
+ """Convert content to base64 string"""
287
+ content_bytes = self.get_content_bytes()
288
+ if content_bytes:
289
+ import base64
290
+
291
+ return base64.b64encode(content_bytes).decode("utf-8")
292
+ return None
293
+
294
+ @classmethod
295
+ def from_base64(
296
+ cls,
297
+ base64_content: str,
298
+ id: Optional[str] = None,
299
+ mime_type: Optional[str] = None,
300
+ format: Optional[str] = None,
301
+ **kwargs,
302
+ ) -> "Video":
303
+ """Create Image from base64 content"""
304
+ import base64
305
+
306
+ try:
307
+ content_bytes = base64.b64decode(base64_content)
308
+ except Exception:
309
+ content_bytes = base64_content.encode("utf-8")
310
+
311
+ return cls(content=content_bytes, id=id or str(uuid4()), mime_type=mime_type, format=format, **kwargs)
312
+
313
+ def to_dict(self, include_base64_content: bool = True) -> Dict[str, Any]:
314
+ """Convert to dict, optionally including base64-encoded content"""
315
+ result = {
316
+ "id": self.id,
317
+ "url": self.url,
318
+ "filepath": str(self.filepath) if self.filepath else None,
319
+ "format": self.format,
320
+ "mime_type": self.mime_type,
321
+ "duration": self.duration,
322
+ "width": self.width,
323
+ "height": self.height,
324
+ "fps": self.fps,
325
+ "eta": self.eta,
326
+ "original_prompt": self.original_prompt,
327
+ "revised_prompt": self.revised_prompt,
328
+ }
329
+
330
+ if include_base64_content and self.content:
331
+ result["content"] = self.to_base64()
332
+
333
+ return {k: v for k, v in result.items() if v is not None}
334
+
335
+
336
+ class File(BaseModel):
337
+ id: Optional[str] = None
338
+ url: Optional[str] = None
339
+ filepath: Optional[Union[Path, str]] = None
340
+ # Raw bytes content of a file
341
+ content: Optional[Any] = None
342
+ mime_type: Optional[str] = None
343
+
344
+ file_type: Optional[str] = None
345
+ filename: Optional[str] = None
346
+ size: Optional[int] = None
347
+ # External file object (e.g. GeminiFile, must be a valid object as expected by the model you are using)
348
+ external: Optional[Any] = None
349
+ format: Optional[str] = None # E.g. `pdf`, `txt`, `csv`, `xml`, etc.
350
+ name: Optional[str] = None # Name of the file, mandatory for AWS Bedrock document input
351
+
352
+ @model_validator(mode="before")
353
+ @classmethod
354
+ def check_at_least_one_source(cls, data):
355
+ """Ensure at least one of url, filepath, or content is provided."""
356
+ if isinstance(data, dict) and not any(data.get(field) for field in ["url", "filepath", "content", "external"]):
357
+ raise ValueError("At least one of url, filepath, content or external must be provided")
358
+ return data
359
+
360
+ @field_validator("mime_type")
361
+ @classmethod
362
+ def validate_mime_type(cls, v):
363
+ """Validate that the mime_type is one of the allowed types."""
364
+ if v is not None and v not in cls.valid_mime_types():
365
+ raise ValueError(f"Invalid MIME type: {v}. Must be one of: {cls.valid_mime_types()}")
366
+ return v
367
+
368
+ @classmethod
369
+ def valid_mime_types(cls) -> List[str]:
370
+ return [
371
+ "application/pdf",
372
+ "application/json",
373
+ "application/x-javascript",
374
+ "application/json",
375
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
376
+ "text/javascript",
377
+ "application/x-python",
378
+ "text/x-python",
379
+ "text/plain",
380
+ "text/html",
381
+ "text/css",
382
+ "text/md",
383
+ "text/csv",
384
+ "text/xml",
385
+ "text/rtf",
386
+ ]
387
+
388
+ @classmethod
389
+ def from_base64(
390
+ cls,
391
+ base64_content: str,
392
+ id: Optional[str] = None,
393
+ mime_type: Optional[str] = None,
394
+ filename: Optional[str] = None,
395
+ name: Optional[str] = None,
396
+ format: Optional[str] = None,
397
+ ) -> "File":
398
+ """Create File from base64 encoded content"""
399
+ import base64
400
+
401
+ content_bytes = base64.b64decode(base64_content)
402
+ return cls(
403
+ content=content_bytes,
404
+ id=id,
405
+ mime_type=mime_type,
406
+ filename=filename,
407
+ name=name,
408
+ format=format,
409
+ )
410
+
411
+ @property
412
+ def file_url_content(self) -> Optional[Tuple[bytes, str]]:
413
+ import httpx
414
+
415
+ if self.url:
416
+ response = httpx.get(self.url)
417
+ content = response.content
418
+ mime_type = response.headers.get("Content-Type", "").split(";")[0]
419
+ return content, mime_type
420
+ else:
421
+ return None
422
+
423
+ def _normalise_content(self) -> Optional[Union[str, bytes]]:
424
+ if self.content is None:
425
+ return None
426
+ content_normalised: Union[str, bytes] = self.content
427
+ if content_normalised and isinstance(content_normalised, bytes):
428
+ from base64 import b64encode
429
+
430
+ try:
431
+ if self.mime_type and self.mime_type.startswith("text/"):
432
+ content_normalised = content_normalised.decode("utf-8")
433
+ else:
434
+ content_normalised = b64encode(content_normalised).decode("utf-8")
435
+ except UnicodeDecodeError:
436
+ if isinstance(self.content, bytes):
437
+ content_normalised = b64encode(self.content).decode("utf-8")
438
+ except Exception:
439
+ try:
440
+ if isinstance(self.content, bytes):
441
+ content_normalised = b64encode(self.content).decode("utf-8")
442
+ except Exception:
443
+ pass
444
+ return content_normalised
445
+
446
+ def to_dict(self) -> Dict[str, Any]:
447
+ content_normalised = self._normalise_content()
448
+
449
+ response_dict = {
450
+ "id": self.id,
451
+ "url": self.url,
452
+ "filepath": str(self.filepath) if self.filepath else None,
453
+ "content": content_normalised,
454
+ "mime_type": self.mime_type,
455
+ "file_type": self.file_type,
456
+ "filename": self.filename,
457
+ "size": self.size,
458
+ "external": self.external,
459
+ "format": self.format,
460
+ "name": self.name,
461
+ }
462
+ return {k: v for k, v in response_dict.items() if v is not None}
@@ -0,0 +1,3 @@
1
+ from agno.memory.manager import MemoryManager, UserMemory
2
+
3
+ __all__ = ["MemoryManager", "UserMemory"]