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
@@ -0,0 +1,306 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from os import getenv
3
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
4
+ from uuid import uuid4
5
+
6
+ from agno.db.base import AsyncBaseDb, BaseDb
7
+
8
+ if TYPE_CHECKING:
9
+ from rich.console import Console
10
+
11
+ from agno.agent import RunOutput
12
+ from agno.db.schemas.evals import EvalType
13
+ from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
14
+ from agno.run.team import TeamRunOutput
15
+ from agno.utils.log import logger
16
+
17
+
18
+ @dataclass
19
+ class ReliabilityResult:
20
+ eval_status: str
21
+ failed_tool_calls: List[str]
22
+ passed_tool_calls: List[str]
23
+
24
+ def print_eval(self, console: Optional["Console"] = None):
25
+ from rich.console import Console
26
+ from rich.table import Table
27
+
28
+ if console is None:
29
+ console = Console()
30
+
31
+ results_table = Table(title="Reliability Summary", show_header=True, header_style="bold magenta")
32
+ results_table.add_row("Evaluation Status", self.eval_status)
33
+ results_table.add_row("Failed Tool Calls", str(self.failed_tool_calls))
34
+ results_table.add_row("Passed Tool Calls", str(self.passed_tool_calls))
35
+ console.print(results_table)
36
+
37
+ def assert_passed(self):
38
+ assert self.eval_status == "PASSED"
39
+
40
+
41
+ @dataclass
42
+ class ReliabilityEval:
43
+ """Evaluate the reliability of a model by checking the tool calls"""
44
+
45
+ # Evaluation name
46
+ name: Optional[str] = None
47
+ # Evaluation UUID
48
+ eval_id: str = field(default_factory=lambda: str(uuid4()))
49
+
50
+ # Agent response
51
+ agent_response: Optional[RunOutput] = None
52
+ # Team response
53
+ team_response: Optional[TeamRunOutput] = None
54
+ # Expected tool calls
55
+ expected_tool_calls: Optional[List[str]] = None
56
+ # Result of the evaluation
57
+ result: Optional[ReliabilityResult] = None
58
+
59
+ # Print detailed results
60
+ print_results: bool = False
61
+ # If set, results will be saved in the given file path
62
+ file_path_to_save_results: Optional[str] = None
63
+ # Enable debug logs
64
+ debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
65
+ # The database to store Evaluation results
66
+ db: Optional[Union[BaseDb, AsyncBaseDb]] = None
67
+
68
+ # Telemetry settings
69
+ # telemetry=True logs minimal telemetry for analytics
70
+ # This helps us improve our Evals and provide better support
71
+ telemetry: bool = True
72
+
73
+ def run(self, *, print_results: bool = False) -> Optional[ReliabilityResult]:
74
+ if isinstance(self.db, AsyncBaseDb):
75
+ raise ValueError("run() is not supported with an async DB. Please use arun() instead.")
76
+
77
+ if self.agent_response is None and self.team_response is None:
78
+ raise ValueError("You need to provide 'agent_response' or 'team_response' to run the evaluation.")
79
+
80
+ if self.agent_response is not None and self.team_response is not None:
81
+ raise ValueError(
82
+ "You need to provide only one of 'agent_response' or 'team_response' to run the evaluation."
83
+ )
84
+
85
+ from rich.console import Console
86
+ from rich.live import Live
87
+ from rich.status import Status
88
+
89
+ # Add a spinner while running the evaluations
90
+ console = Console()
91
+ with Live(console=console, transient=True) as live_log:
92
+ status = Status("Running evaluation...", spinner="dots", speed=1.0, refresh_per_second=10)
93
+ live_log.update(status)
94
+
95
+ actual_tool_calls = None
96
+ if self.agent_response is not None:
97
+ messages = self.agent_response.messages
98
+ elif self.team_response is not None:
99
+ messages = self.team_response.messages or []
100
+ for member_response in self.team_response.member_responses:
101
+ if member_response.messages is not None:
102
+ messages += member_response.messages
103
+
104
+ for message in reversed(messages): # type: ignore
105
+ if message.tool_calls:
106
+ if actual_tool_calls is None:
107
+ actual_tool_calls = message.tool_calls
108
+ else:
109
+ actual_tool_calls.append(message.tool_calls[0]) # type: ignore
110
+
111
+ failed_tool_calls = []
112
+ passed_tool_calls = []
113
+ if not actual_tool_calls:
114
+ failed_tool_calls = self.expected_tool_calls or []
115
+ else:
116
+ for tool_call in actual_tool_calls: # type: ignore
117
+ tool_name = tool_call.get("function", {}).get("name")
118
+ if not tool_name:
119
+ continue
120
+ else:
121
+ if tool_name not in self.expected_tool_calls: # type: ignore
122
+ failed_tool_calls.append(tool_call.get("function", {}).get("name"))
123
+ else:
124
+ passed_tool_calls.append(tool_call.get("function", {}).get("name"))
125
+
126
+ self.result = ReliabilityResult(
127
+ eval_status="PASSED" if len(failed_tool_calls) == 0 else "FAILED",
128
+ failed_tool_calls=failed_tool_calls,
129
+ passed_tool_calls=passed_tool_calls,
130
+ )
131
+
132
+ # Save result to file if requested
133
+ if self.file_path_to_save_results is not None and self.result is not None:
134
+ store_result_in_file(
135
+ file_path=self.file_path_to_save_results,
136
+ name=self.name,
137
+ eval_id=self.eval_id,
138
+ result=self.result,
139
+ )
140
+
141
+ # Print results if requested
142
+ if self.print_results or print_results:
143
+ self.result.print_eval(console)
144
+
145
+ # Log results to the Agno platform if requested
146
+ if self.db:
147
+ if self.agent_response is not None:
148
+ agent_id = self.agent_response.agent_id
149
+ team_id = None
150
+ model_id = self.agent_response.model
151
+ model_provider = self.agent_response.model_provider
152
+ elif self.team_response is not None:
153
+ agent_id = None
154
+ team_id = self.team_response.team_id
155
+ model_id = self.team_response.model
156
+ model_provider = self.team_response.model_provider
157
+
158
+ eval_input = {
159
+ "expected_tool_calls": self.expected_tool_calls,
160
+ }
161
+
162
+ log_eval_run(
163
+ db=self.db,
164
+ run_id=self.eval_id, # type: ignore
165
+ run_data=asdict(self.result),
166
+ eval_type=EvalType.RELIABILITY,
167
+ name=self.name if self.name is not None else None,
168
+ agent_id=agent_id,
169
+ team_id=team_id,
170
+ model_id=model_id,
171
+ model_provider=model_provider,
172
+ eval_input=eval_input,
173
+ )
174
+
175
+ if self.telemetry:
176
+ from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
177
+
178
+ create_eval_run_telemetry(
179
+ eval_run=EvalRunCreate(
180
+ run_id=self.eval_id,
181
+ eval_type=EvalType.RELIABILITY,
182
+ data=self._get_telemetry_data(),
183
+ ),
184
+ )
185
+
186
+ logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
187
+ return self.result
188
+
189
+ async def arun(self, *, print_results: bool = False) -> Optional[ReliabilityResult]:
190
+ if self.agent_response is None and self.team_response is None:
191
+ raise ValueError("You need to provide 'agent_response' or 'team_response' to run the evaluation.")
192
+
193
+ if self.agent_response is not None and self.team_response is not None:
194
+ raise ValueError(
195
+ "You need to provide only one of 'agent_response' or 'team_response' to run the evaluation."
196
+ )
197
+
198
+ from rich.console import Console
199
+ from rich.live import Live
200
+ from rich.status import Status
201
+
202
+ # Add a spinner while running the evaluations
203
+ console = Console()
204
+ with Live(console=console, transient=True) as live_log:
205
+ status = Status("Running evaluation...", spinner="dots", speed=1.0, refresh_per_second=10)
206
+ live_log.update(status)
207
+
208
+ actual_tool_calls = None
209
+ if self.agent_response is not None:
210
+ messages = self.agent_response.messages
211
+ elif self.team_response is not None:
212
+ messages = self.team_response.messages or []
213
+ for member_response in self.team_response.member_responses:
214
+ if member_response.messages is not None:
215
+ messages += member_response.messages
216
+
217
+ for message in reversed(messages): # type: ignore
218
+ if message.tool_calls:
219
+ if actual_tool_calls is None:
220
+ actual_tool_calls = message.tool_calls
221
+ else:
222
+ actual_tool_calls.append(message.tool_calls[0]) # type: ignore
223
+
224
+ failed_tool_calls = []
225
+ passed_tool_calls = []
226
+ for tool_call in actual_tool_calls: # type: ignore
227
+ tool_name = tool_call.get("function", {}).get("name")
228
+ if not tool_name:
229
+ continue
230
+ else:
231
+ if tool_name not in self.expected_tool_calls: # type: ignore
232
+ failed_tool_calls.append(tool_call.get("function", {}).get("name"))
233
+ else:
234
+ passed_tool_calls.append(tool_call.get("function", {}).get("name"))
235
+
236
+ self.result = ReliabilityResult(
237
+ eval_status="PASSED" if len(failed_tool_calls) == 0 else "FAILED",
238
+ failed_tool_calls=failed_tool_calls,
239
+ passed_tool_calls=passed_tool_calls,
240
+ )
241
+
242
+ # Save result to file if requested
243
+ if self.file_path_to_save_results is not None and self.result is not None:
244
+ store_result_in_file(
245
+ file_path=self.file_path_to_save_results,
246
+ name=self.name,
247
+ eval_id=self.eval_id,
248
+ result=self.result,
249
+ )
250
+
251
+ # Print results if requested
252
+ if self.print_results or print_results:
253
+ self.result.print_eval(console)
254
+
255
+ # Log results to the Agno platform if requested
256
+ if self.db:
257
+ if self.agent_response is not None:
258
+ agent_id = self.agent_response.agent_id
259
+ team_id = None
260
+ model_id = self.agent_response.model
261
+ model_provider = self.agent_response.model_provider
262
+ elif self.team_response is not None:
263
+ agent_id = None
264
+ team_id = self.team_response.team_id
265
+ model_id = self.team_response.model
266
+ model_provider = self.team_response.model_provider
267
+
268
+ eval_input = {
269
+ "expected_tool_calls": self.expected_tool_calls,
270
+ }
271
+
272
+ await async_log_eval(
273
+ db=self.db,
274
+ run_id=self.eval_id, # type: ignore
275
+ run_data=asdict(self.result),
276
+ eval_type=EvalType.RELIABILITY,
277
+ name=self.name if self.name is not None else None,
278
+ agent_id=agent_id,
279
+ team_id=team_id,
280
+ model_id=model_id,
281
+ model_provider=model_provider,
282
+ eval_input=eval_input,
283
+ )
284
+
285
+ if self.telemetry:
286
+ from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
287
+
288
+ await async_create_eval_run_telemetry(
289
+ eval_run=EvalRunCreate(
290
+ run_id=self.eval_id,
291
+ eval_type=EvalType.RELIABILITY,
292
+ data=self._get_telemetry_data(),
293
+ ),
294
+ )
295
+
296
+ logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
297
+ return self.result
298
+
299
+ def _get_telemetry_data(self) -> Dict[str, Any]:
300
+ """Get the telemetry data for the evaluation"""
301
+ return {
302
+ "team_id": self.team_response.team_id if self.team_response else None,
303
+ "agent_id": self.agent_response.agent_id if self.agent_response else None,
304
+ "model_id": self.agent_response.model if self.agent_response else None,
305
+ "model_provider": self.agent_response.model_provider if self.agent_response else None,
306
+ }
agno/eval/utils.py ADDED
@@ -0,0 +1,119 @@
1
+ from dataclasses import asdict
2
+ from pathlib import Path
3
+ from typing import TYPE_CHECKING, Optional, Union
4
+
5
+ from agno.db.base import AsyncBaseDb, BaseDb
6
+ from agno.db.schemas.evals import EvalRunRecord, EvalType
7
+ from agno.utils.log import log_debug, logger
8
+
9
+ if TYPE_CHECKING:
10
+ from agno.eval.accuracy import AccuracyResult
11
+ from agno.eval.performance import PerformanceResult
12
+ from agno.eval.reliability import ReliabilityResult
13
+
14
+
15
+ def log_eval_run(
16
+ db: BaseDb,
17
+ run_id: str,
18
+ run_data: dict,
19
+ eval_type: EvalType,
20
+ eval_input: dict,
21
+ agent_id: Optional[str] = None,
22
+ model_id: Optional[str] = None,
23
+ model_provider: Optional[str] = None,
24
+ name: Optional[str] = None,
25
+ evaluated_component_name: Optional[str] = None,
26
+ team_id: Optional[str] = None,
27
+ workflow_id: Optional[str] = None,
28
+ ) -> None:
29
+ """Call the API to create an evaluation run."""
30
+
31
+ try:
32
+ db.create_eval_run(
33
+ EvalRunRecord(
34
+ run_id=run_id,
35
+ eval_type=eval_type,
36
+ eval_data=run_data,
37
+ eval_input=eval_input,
38
+ agent_id=agent_id,
39
+ model_id=model_id,
40
+ model_provider=model_provider,
41
+ name=name,
42
+ evaluated_component_name=evaluated_component_name,
43
+ team_id=team_id,
44
+ workflow_id=workflow_id,
45
+ )
46
+ )
47
+ except Exception as e:
48
+ log_debug(f"Could not create agent event: {e}")
49
+
50
+
51
+ async def async_log_eval(
52
+ db: Union[BaseDb, AsyncBaseDb],
53
+ run_id: str,
54
+ run_data: dict,
55
+ eval_type: EvalType,
56
+ eval_input: dict,
57
+ agent_id: Optional[str] = None,
58
+ model_id: Optional[str] = None,
59
+ model_provider: Optional[str] = None,
60
+ name: Optional[str] = None,
61
+ evaluated_component_name: Optional[str] = None,
62
+ team_id: Optional[str] = None,
63
+ workflow_id: Optional[str] = None,
64
+ ) -> None:
65
+ """Call the API to create an evaluation run."""
66
+
67
+ try:
68
+ if isinstance(db, AsyncBaseDb):
69
+ await db.create_eval_run(
70
+ EvalRunRecord(
71
+ run_id=run_id,
72
+ eval_type=eval_type,
73
+ eval_data=run_data,
74
+ eval_input=eval_input,
75
+ agent_id=agent_id,
76
+ model_id=model_id,
77
+ model_provider=model_provider,
78
+ name=name,
79
+ evaluated_component_name=evaluated_component_name,
80
+ team_id=team_id,
81
+ workflow_id=workflow_id,
82
+ )
83
+ )
84
+ else:
85
+ db.create_eval_run(
86
+ EvalRunRecord(
87
+ run_id=run_id,
88
+ eval_type=eval_type,
89
+ eval_data=run_data,
90
+ eval_input=eval_input,
91
+ agent_id=agent_id,
92
+ model_id=model_id,
93
+ model_provider=model_provider,
94
+ name=name,
95
+ evaluated_component_name=evaluated_component_name,
96
+ team_id=team_id,
97
+ workflow_id=workflow_id,
98
+ )
99
+ )
100
+ except Exception as e:
101
+ log_debug(f"Could not create agent event: {e}")
102
+
103
+
104
+ def store_result_in_file(
105
+ file_path: str,
106
+ result: Union["AccuracyResult", "PerformanceResult", "ReliabilityResult"],
107
+ eval_id: Optional[str] = None,
108
+ name: Optional[str] = None,
109
+ ):
110
+ """Store the given result in the given file path"""
111
+ try:
112
+ import json
113
+
114
+ fn_path = Path(file_path.format(name=name, eval_id=eval_id))
115
+ if not fn_path.parent.exists():
116
+ fn_path.parent.mkdir(parents=True, exist_ok=True)
117
+ fn_path.write_text(json.dumps(asdict(result), indent=4))
118
+ except Exception as e:
119
+ logger.warning(f"Failed to save result to file: {e}")
agno/exceptions.py ADDED
@@ -0,0 +1,161 @@
1
+ from enum import Enum
2
+ from typing import Any, Dict, List, Optional, Union
3
+
4
+ from agno.models.message import Message
5
+
6
+
7
+ class AgentRunException(Exception):
8
+ def __init__(
9
+ self,
10
+ exc,
11
+ user_message: Optional[Union[str, Message]] = None,
12
+ agent_message: Optional[Union[str, Message]] = None,
13
+ messages: Optional[List[Union[dict, Message]]] = None,
14
+ stop_execution: bool = False,
15
+ ):
16
+ super().__init__(exc)
17
+ self.user_message = user_message
18
+ self.agent_message = agent_message
19
+ self.messages = messages
20
+ self.stop_execution = stop_execution
21
+ self.type = "agent_run_error"
22
+ self.error_id = "agent_run_error"
23
+
24
+
25
+ class RetryAgentRun(AgentRunException):
26
+ """Exception raised when a tool call should be retried."""
27
+
28
+ def __init__(
29
+ self,
30
+ exc,
31
+ user_message: Optional[Union[str, Message]] = None,
32
+ agent_message: Optional[Union[str, Message]] = None,
33
+ messages: Optional[List[Union[dict, Message]]] = None,
34
+ ):
35
+ super().__init__(
36
+ exc, user_message=user_message, agent_message=agent_message, messages=messages, stop_execution=False
37
+ )
38
+ self.error_id = "retry_agent_run_error"
39
+
40
+
41
+ class StopAgentRun(AgentRunException):
42
+ """Exception raised when an agent should stop executing entirely."""
43
+
44
+ def __init__(
45
+ self,
46
+ exc,
47
+ user_message: Optional[Union[str, Message]] = None,
48
+ agent_message: Optional[Union[str, Message]] = None,
49
+ messages: Optional[List[Union[dict, Message]]] = None,
50
+ ):
51
+ super().__init__(
52
+ exc, user_message=user_message, agent_message=agent_message, messages=messages, stop_execution=True
53
+ )
54
+ self.error_id = "stop_agent_run_error"
55
+
56
+
57
+ class RunCancelledException(Exception):
58
+ """Exception raised when a run is cancelled."""
59
+
60
+ def __init__(self, message: str = "Operation cancelled by user"):
61
+ super().__init__(message)
62
+ self.type = "run_cancelled_error"
63
+ self.error_id = "run_cancelled_error"
64
+
65
+
66
+ class AgnoError(Exception):
67
+ """Exception raised when an internal error occurs."""
68
+
69
+ def __init__(self, message: str, status_code: int = 500):
70
+ super().__init__(message)
71
+ self.message = message
72
+ self.status_code = status_code
73
+ self.type = "agno_error"
74
+ self.error_id = "agno_error"
75
+
76
+ def __str__(self) -> str:
77
+ return str(self.message)
78
+
79
+
80
+ class ModelProviderError(AgnoError):
81
+ """Exception raised when a model provider returns an error."""
82
+
83
+ def __init__(
84
+ self, message: str, status_code: int = 502, model_name: Optional[str] = None, model_id: Optional[str] = None
85
+ ):
86
+ super().__init__(message, status_code)
87
+ self.model_name = model_name
88
+ self.model_id = model_id
89
+
90
+ self.type = "model_provider_error"
91
+ self.error_id = "model_provider_error"
92
+
93
+
94
+ class ModelRateLimitError(ModelProviderError):
95
+ """Exception raised when a model provider returns a rate limit error."""
96
+
97
+ def __init__(
98
+ self, message: str, status_code: int = 429, model_name: Optional[str] = None, model_id: Optional[str] = None
99
+ ):
100
+ super().__init__(message, status_code, model_name, model_id)
101
+ self.error_id = "model_rate_limit_error"
102
+
103
+
104
+ class EvalError(Exception):
105
+ """Exception raised when an evaluation fails."""
106
+
107
+ pass
108
+
109
+
110
+ class CheckTrigger(Enum):
111
+ """Enum for guardrail triggers."""
112
+
113
+ OFF_TOPIC = "off_topic"
114
+ INPUT_NOT_ALLOWED = "input_not_allowed"
115
+ OUTPUT_NOT_ALLOWED = "output_not_allowed"
116
+ VALIDATION_FAILED = "validation_failed"
117
+
118
+ PROMPT_INJECTION = "prompt_injection"
119
+ PII_DETECTED = "pii_detected"
120
+
121
+
122
+ class InputCheckError(Exception):
123
+ """Exception raised when an input check fails."""
124
+
125
+ def __init__(
126
+ self,
127
+ message: str,
128
+ check_trigger: CheckTrigger = CheckTrigger.INPUT_NOT_ALLOWED,
129
+ additional_data: Optional[Dict[str, Any]] = None,
130
+ ):
131
+ super().__init__(message)
132
+ self.type = "input_check_error"
133
+ if isinstance(check_trigger, CheckTrigger):
134
+ self.error_id = check_trigger.value
135
+ else:
136
+ self.error_id = str(check_trigger)
137
+
138
+ self.message = message
139
+ self.check_trigger = check_trigger
140
+ self.additional_data = additional_data
141
+
142
+
143
+ class OutputCheckError(Exception):
144
+ """Exception raised when an output check fails."""
145
+
146
+ def __init__(
147
+ self,
148
+ message: str,
149
+ check_trigger: CheckTrigger = CheckTrigger.OUTPUT_NOT_ALLOWED,
150
+ additional_data: Optional[Dict[str, Any]] = None,
151
+ ):
152
+ super().__init__(message)
153
+ self.type = "output_check_error"
154
+ if isinstance(check_trigger, CheckTrigger):
155
+ self.error_id = check_trigger.value
156
+ else:
157
+ self.error_id = str(check_trigger)
158
+
159
+ self.message = message
160
+ self.check_trigger = check_trigger
161
+ self.additional_data = additional_data