agno 1.8.2__py3-none-any.whl → 2.0.0__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 (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,3 @@
1
+ from agno.os.routers.session.session import get_session_router
2
+
3
+ __all__ = ["get_session_router"]
@@ -0,0 +1,3 @@
1
+ from agno.os.routers.evals.evals import get_eval_router
2
+
3
+ __all__ = ["get_eval_router"]
@@ -0,0 +1,393 @@
1
+ import logging
2
+ from copy import deepcopy
3
+ from typing import List, Optional
4
+
5
+ from fastapi import APIRouter, Depends, HTTPException, Query
6
+
7
+ from agno.agent.agent import Agent
8
+ from agno.db.base import BaseDb
9
+ from agno.db.schemas.evals import EvalFilterType, EvalType
10
+ from agno.models.utils import get_model
11
+ from agno.os.auth import get_authentication_dependency
12
+ from agno.os.routers.evals.schemas import (
13
+ DeleteEvalRunsRequest,
14
+ EvalRunInput,
15
+ EvalSchema,
16
+ UpdateEvalRunRequest,
17
+ )
18
+ from agno.os.routers.evals.utils import run_accuracy_eval, run_performance_eval, run_reliability_eval
19
+ from agno.os.schema import (
20
+ BadRequestResponse,
21
+ InternalServerErrorResponse,
22
+ NotFoundResponse,
23
+ PaginatedResponse,
24
+ PaginationInfo,
25
+ SortOrder,
26
+ UnauthenticatedResponse,
27
+ ValidationErrorResponse,
28
+ )
29
+ from agno.os.settings import AgnoAPISettings
30
+ from agno.os.utils import get_agent_by_id, get_db, get_team_by_id
31
+ from agno.team.team import Team
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ def get_eval_router(
37
+ dbs: dict[str, BaseDb],
38
+ agents: Optional[List[Agent]] = None,
39
+ teams: Optional[List[Team]] = None,
40
+ settings: AgnoAPISettings = AgnoAPISettings(),
41
+ ) -> APIRouter:
42
+ """Create eval router with comprehensive OpenAPI documentation for agent/team evaluation endpoints."""
43
+ router = APIRouter(
44
+ dependencies=[Depends(get_authentication_dependency(settings))],
45
+ tags=["Evals"],
46
+ responses={
47
+ 400: {"description": "Bad Request", "model": BadRequestResponse},
48
+ 401: {"description": "Unauthorized", "model": UnauthenticatedResponse},
49
+ 404: {"description": "Not Found", "model": NotFoundResponse},
50
+ 422: {"description": "Validation Error", "model": ValidationErrorResponse},
51
+ 500: {"description": "Internal Server Error", "model": InternalServerErrorResponse},
52
+ },
53
+ )
54
+ return attach_routes(router=router, dbs=dbs, agents=agents, teams=teams)
55
+
56
+
57
+ def attach_routes(
58
+ router: APIRouter, dbs: dict[str, BaseDb], agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None
59
+ ) -> APIRouter:
60
+ @router.get(
61
+ "/eval-runs",
62
+ response_model=PaginatedResponse[EvalSchema],
63
+ status_code=200,
64
+ operation_id="get_eval_runs",
65
+ summary="List Evaluation Runs",
66
+ description=(
67
+ "Retrieve paginated evaluation runs with filtering and sorting options. "
68
+ "Filter by agent, team, workflow, model, or evaluation type."
69
+ ),
70
+ responses={
71
+ 200: {
72
+ "description": "Evaluation runs retrieved successfully",
73
+ "content": {
74
+ "application/json": {
75
+ "example": {
76
+ "data": [
77
+ {
78
+ "id": "a03fa2f4-900d-482d-afe0-470d4cd8d1f4",
79
+ "agent_id": "basic-agent",
80
+ "model_id": "gpt-4o",
81
+ "model_provider": "OpenAI",
82
+ "team_id": None,
83
+ "workflow_id": None,
84
+ "name": "Test ",
85
+ "evaluated_component_name": None,
86
+ "eval_type": "reliability",
87
+ "eval_data": {
88
+ "eval_status": "PASSED",
89
+ "failed_tool_calls": [],
90
+ "passed_tool_calls": ["multiply"],
91
+ },
92
+ "eval_input": {"expected_tool_calls": ["multiply"]},
93
+ "created_at": "2025-08-27T15:41:59Z",
94
+ "updated_at": "2025-08-27T15:41:59Z",
95
+ }
96
+ ]
97
+ }
98
+ }
99
+ },
100
+ }
101
+ },
102
+ )
103
+ async def get_eval_runs(
104
+ agent_id: Optional[str] = Query(default=None, description="Agent ID"),
105
+ team_id: Optional[str] = Query(default=None, description="Team ID"),
106
+ workflow_id: Optional[str] = Query(default=None, description="Workflow ID"),
107
+ model_id: Optional[str] = Query(default=None, description="Model ID"),
108
+ filter_type: Optional[EvalFilterType] = Query(default=None, description="Filter type", alias="type"),
109
+ eval_types: Optional[List[EvalType]] = Depends(parse_eval_types_filter),
110
+ limit: Optional[int] = Query(default=20, description="Number of eval runs to return"),
111
+ page: Optional[int] = Query(default=1, description="Page number"),
112
+ sort_by: Optional[str] = Query(default="created_at", description="Field to sort by"),
113
+ sort_order: Optional[SortOrder] = Query(default="desc", description="Sort order (asc or desc)"),
114
+ db_id: Optional[str] = Query(default=None, description="The ID of the database to use"),
115
+ ) -> PaginatedResponse[EvalSchema]:
116
+ db = get_db(dbs, db_id)
117
+ eval_runs, total_count = db.get_eval_runs(
118
+ limit=limit,
119
+ page=page,
120
+ sort_by=sort_by,
121
+ sort_order=sort_order,
122
+ agent_id=agent_id,
123
+ team_id=team_id,
124
+ workflow_id=workflow_id,
125
+ model_id=model_id,
126
+ eval_type=eval_types,
127
+ filter_type=filter_type,
128
+ deserialize=False,
129
+ )
130
+
131
+ return PaginatedResponse(
132
+ data=[EvalSchema.from_dict(eval_run) for eval_run in eval_runs], # type: ignore
133
+ meta=PaginationInfo(
134
+ page=page,
135
+ limit=limit,
136
+ total_count=total_count, # type: ignore
137
+ total_pages=(total_count + limit - 1) // limit if limit is not None and limit > 0 else 0, # type: ignore
138
+ ),
139
+ )
140
+
141
+ @router.get(
142
+ "/eval-runs/{eval_run_id}",
143
+ response_model=EvalSchema,
144
+ status_code=200,
145
+ operation_id="get_eval_run",
146
+ summary="Get Evaluation Run",
147
+ description="Retrieve detailed results and metrics for a specific evaluation run.",
148
+ responses={
149
+ 200: {
150
+ "description": "Evaluation run details retrieved successfully",
151
+ "content": {
152
+ "application/json": {
153
+ "example": {
154
+ "id": "a03fa2f4-900d-482d-afe0-470d4cd8d1f4",
155
+ "agent_id": "basic-agent",
156
+ "model_id": "gpt-4o",
157
+ "model_provider": "OpenAI",
158
+ "team_id": None,
159
+ "workflow_id": None,
160
+ "name": "Test ",
161
+ "evaluated_component_name": None,
162
+ "eval_type": "reliability",
163
+ "eval_data": {
164
+ "eval_status": "PASSED",
165
+ "failed_tool_calls": [],
166
+ "passed_tool_calls": ["multiply"],
167
+ },
168
+ "eval_input": {"expected_tool_calls": ["multiply"]},
169
+ "created_at": "2025-08-27T15:41:59Z",
170
+ "updated_at": "2025-08-27T15:41:59Z",
171
+ }
172
+ }
173
+ },
174
+ },
175
+ 404: {"description": "Evaluation run not found", "model": NotFoundResponse},
176
+ },
177
+ )
178
+ async def get_eval_run(
179
+ eval_run_id: str,
180
+ db_id: Optional[str] = Query(default=None, description="The ID of the database to use"),
181
+ ) -> EvalSchema:
182
+ db = get_db(dbs, db_id)
183
+ eval_run = db.get_eval_run(eval_run_id=eval_run_id, deserialize=False)
184
+ if not eval_run:
185
+ raise HTTPException(status_code=404, detail=f"Eval run with id '{eval_run_id}' not found")
186
+
187
+ return EvalSchema.from_dict(eval_run) # type: ignore
188
+
189
+ @router.delete(
190
+ "/eval-runs",
191
+ status_code=204,
192
+ operation_id="delete_eval_runs",
193
+ summary="Delete Evaluation Runs",
194
+ description="Delete multiple evaluation runs by their IDs. This action cannot be undone.",
195
+ responses={
196
+ 204: {},
197
+ 500: {"description": "Failed to delete evaluation runs", "model": InternalServerErrorResponse},
198
+ },
199
+ )
200
+ async def delete_eval_runs(
201
+ request: DeleteEvalRunsRequest,
202
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for deletion"),
203
+ ) -> None:
204
+ try:
205
+ db = get_db(dbs, db_id)
206
+ db.delete_eval_runs(eval_run_ids=request.eval_run_ids)
207
+ except Exception as e:
208
+ raise HTTPException(status_code=500, detail=f"Failed to delete eval runs: {e}")
209
+
210
+ @router.patch(
211
+ "/eval-runs/{eval_run_id}",
212
+ response_model=EvalSchema,
213
+ status_code=200,
214
+ operation_id="update_eval_run",
215
+ summary="Update Evaluation Run",
216
+ description="Update the name or other properties of an existing evaluation run.",
217
+ responses={
218
+ 200: {
219
+ "description": "Evaluation run updated successfully",
220
+ "content": {
221
+ "application/json": {
222
+ "example": {
223
+ "id": "a03fa2f4-900d-482d-afe0-470d4cd8d1f4",
224
+ "agent_id": "basic-agent",
225
+ "model_id": "gpt-4o",
226
+ "model_provider": "OpenAI",
227
+ "team_id": None,
228
+ "workflow_id": None,
229
+ "name": "Test ",
230
+ "evaluated_component_name": None,
231
+ "eval_type": "reliability",
232
+ "eval_data": {
233
+ "eval_status": "PASSED",
234
+ "failed_tool_calls": [],
235
+ "passed_tool_calls": ["multiply"],
236
+ },
237
+ "eval_input": {"expected_tool_calls": ["multiply"]},
238
+ "created_at": "2025-08-27T15:41:59Z",
239
+ "updated_at": "2025-08-27T15:41:59Z",
240
+ }
241
+ }
242
+ },
243
+ },
244
+ 404: {"description": "Evaluation run not found", "model": NotFoundResponse},
245
+ 500: {"description": "Failed to update evaluation run", "model": InternalServerErrorResponse},
246
+ },
247
+ )
248
+ async def update_eval_run(
249
+ eval_run_id: str,
250
+ request: UpdateEvalRunRequest,
251
+ db_id: Optional[str] = Query(default=None, description="The ID of the database to use"),
252
+ ) -> EvalSchema:
253
+ try:
254
+ db = get_db(dbs, db_id)
255
+ eval_run = db.rename_eval_run(eval_run_id=eval_run_id, name=request.name, deserialize=False)
256
+ except Exception as e:
257
+ raise HTTPException(status_code=500, detail=f"Failed to rename eval run: {e}")
258
+
259
+ if not eval_run:
260
+ raise HTTPException(status_code=404, detail=f"Eval run with id '{eval_run_id}' not found")
261
+
262
+ return EvalSchema.from_dict(eval_run) # type: ignore
263
+
264
+ @router.post(
265
+ "/eval-runs",
266
+ response_model=EvalSchema,
267
+ status_code=200,
268
+ operation_id="run_eval",
269
+ summary="Execute Evaluation",
270
+ description=(
271
+ "Run evaluation tests on agents or teams. Supports accuracy, performance, and reliability evaluations. "
272
+ "Requires either agent_id or team_id, but not both."
273
+ ),
274
+ responses={
275
+ 200: {
276
+ "description": "Evaluation executed successfully",
277
+ "content": {
278
+ "application/json": {
279
+ "example": {
280
+ "id": "f2b2d72f-e9e2-4f0e-8810-0a7e1ff58614",
281
+ "agent_id": "basic-agent",
282
+ "model_id": "gpt-4o",
283
+ "model_provider": "OpenAI",
284
+ "team_id": None,
285
+ "workflow_id": None,
286
+ "name": None,
287
+ "evaluated_component_name": None,
288
+ "eval_type": "reliability",
289
+ "eval_data": {
290
+ "eval_status": "PASSED",
291
+ "failed_tool_calls": [],
292
+ "passed_tool_calls": ["multiply"],
293
+ },
294
+ "created_at": "2025-08-27T15:41:59Z",
295
+ "updated_at": "2025-08-27T15:41:59Z",
296
+ }
297
+ }
298
+ },
299
+ },
300
+ 400: {"description": "Invalid request - provide either agent_id or team_id", "model": BadRequestResponse},
301
+ 404: {"description": "Agent or team not found", "model": NotFoundResponse},
302
+ },
303
+ )
304
+ async def run_eval(
305
+ eval_run_input: EvalRunInput,
306
+ db_id: Optional[str] = Query(default=None, description="Database ID to use for evaluation"),
307
+ ) -> Optional[EvalSchema]:
308
+ db = get_db(dbs, db_id)
309
+
310
+ if eval_run_input.agent_id and eval_run_input.team_id:
311
+ raise HTTPException(status_code=400, detail="Only one of agent_id or team_id must be provided")
312
+
313
+ if eval_run_input.agent_id:
314
+ agent = get_agent_by_id(agent_id=eval_run_input.agent_id, agents=agents)
315
+ if not agent:
316
+ raise HTTPException(status_code=404, detail=f"Agent with id '{eval_run_input.agent_id}' not found")
317
+
318
+ default_model = None
319
+ if (
320
+ hasattr(agent, "model")
321
+ and agent.model is not None
322
+ and eval_run_input.model_id is not None
323
+ and eval_run_input.model_provider is not None
324
+ ):
325
+ default_model = deepcopy(agent.model)
326
+ if eval_run_input.model_id != agent.model.id or eval_run_input.model_provider != agent.model.provider:
327
+ model = get_model(
328
+ model_id=eval_run_input.model_id.lower(),
329
+ model_provider=eval_run_input.model_provider.lower(),
330
+ )
331
+ agent.model = model
332
+
333
+ team = None
334
+
335
+ elif eval_run_input.team_id:
336
+ team = get_team_by_id(team_id=eval_run_input.team_id, teams=teams)
337
+ if not team:
338
+ raise HTTPException(status_code=404, detail=f"Team with id '{eval_run_input.team_id}' not found")
339
+
340
+ default_model = None
341
+ if (
342
+ hasattr(team, "model")
343
+ and team.model is not None
344
+ and eval_run_input.model_id is not None
345
+ and eval_run_input.model_provider is not None
346
+ ):
347
+ default_model = deepcopy(team.model)
348
+ if eval_run_input.model_id != team.model.id or eval_run_input.model_provider != team.model.provider:
349
+ model = get_model(
350
+ model_id=eval_run_input.model_id.lower(),
351
+ model_provider=eval_run_input.model_provider.lower(),
352
+ )
353
+ team.model = model
354
+
355
+ agent = None
356
+
357
+ else:
358
+ raise HTTPException(status_code=400, detail="One of agent_id or team_id must be provided")
359
+
360
+ # Run the evaluation
361
+ if eval_run_input.eval_type == EvalType.ACCURACY:
362
+ return await run_accuracy_eval(
363
+ eval_run_input=eval_run_input, db=db, agent=agent, team=team, default_model=default_model
364
+ )
365
+
366
+ elif eval_run_input.eval_type == EvalType.PERFORMANCE:
367
+ return await run_performance_eval(
368
+ eval_run_input=eval_run_input, db=db, agent=agent, team=team, default_model=default_model
369
+ )
370
+
371
+ else:
372
+ return await run_reliability_eval(
373
+ eval_run_input=eval_run_input, db=db, agent=agent, team=team, default_model=default_model
374
+ )
375
+
376
+ return router
377
+
378
+
379
+ def parse_eval_types_filter(
380
+ eval_types: Optional[str] = Query(
381
+ default=None,
382
+ description="Comma-separated eval types (accuracy,performance,reliability)",
383
+ example="accuracy,performance",
384
+ ),
385
+ ) -> Optional[List[EvalType]]:
386
+ """Parse comma-separated eval types into EvalType enums for filtering evaluation runs."""
387
+ if not eval_types:
388
+ return None
389
+ try:
390
+ return [EvalType(item.strip()) for item in eval_types.split(",")]
391
+ except ValueError as e:
392
+ valid_types = ", ".join([t.value for t in EvalType])
393
+ raise HTTPException(status_code=422, detail=f"Invalid eval_type: {e}. Valid types: {valid_types}")
@@ -0,0 +1,142 @@
1
+ from dataclasses import asdict
2
+ from datetime import datetime, timezone
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.db.schemas.evals import EvalType
8
+ from agno.eval import AccuracyResult, PerformanceResult, ReliabilityResult
9
+ from agno.eval.accuracy import AccuracyEval
10
+ from agno.eval.performance import PerformanceEval
11
+ from agno.eval.reliability import ReliabilityEval
12
+
13
+
14
+ class EvalRunInput(BaseModel):
15
+ agent_id: Optional[str] = None
16
+ team_id: Optional[str] = None
17
+
18
+ model_id: Optional[str] = None
19
+ model_provider: Optional[str] = None
20
+ eval_type: EvalType
21
+ input: str
22
+ additional_guidelines: Optional[str] = None
23
+ additional_context: Optional[str] = None
24
+ num_iterations: Optional[int] = 1
25
+ name: Optional[str] = None
26
+
27
+ # Accuracy eval specific fields
28
+ expected_output: Optional[str] = None
29
+
30
+ # Performance eval specific fields
31
+ warmup_runs: Optional[int] = 0
32
+
33
+ # Reliability eval specific fields
34
+ expected_tool_calls: Optional[List[str]] = None
35
+
36
+
37
+ class EvalSchema(BaseModel):
38
+ id: str
39
+
40
+ agent_id: Optional[str] = None
41
+ model_id: Optional[str] = None
42
+ model_provider: Optional[str] = None
43
+ team_id: Optional[str] = None
44
+ workflow_id: Optional[str] = None
45
+ name: Optional[str] = None
46
+ evaluated_component_name: Optional[str] = None
47
+ eval_type: EvalType
48
+ eval_data: Dict[str, Any]
49
+ eval_input: Optional[Dict[str, Any]] = None
50
+ created_at: Optional[datetime] = None
51
+ updated_at: Optional[datetime] = None
52
+
53
+ @classmethod
54
+ def from_dict(cls, eval_run: Dict[str, Any]) -> "EvalSchema":
55
+ return cls(
56
+ id=eval_run["run_id"],
57
+ name=eval_run.get("name"),
58
+ agent_id=eval_run.get("agent_id"),
59
+ model_id=eval_run.get("model_id"),
60
+ model_provider=eval_run.get("model_provider"),
61
+ team_id=eval_run.get("team_id"),
62
+ workflow_id=eval_run.get("workflow_id"),
63
+ evaluated_component_name=eval_run.get("evaluated_component_name"),
64
+ eval_type=eval_run["eval_type"],
65
+ eval_data=eval_run["eval_data"],
66
+ eval_input=eval_run.get("eval_input"),
67
+ created_at=datetime.fromtimestamp(eval_run["created_at"], tz=timezone.utc),
68
+ updated_at=datetime.fromtimestamp(eval_run["updated_at"], tz=timezone.utc),
69
+ )
70
+
71
+ @classmethod
72
+ def from_accuracy_eval(cls, accuracy_eval: AccuracyEval, result: AccuracyResult) -> "EvalSchema":
73
+ model_provider = (
74
+ accuracy_eval.agent.model.provider
75
+ if accuracy_eval.agent and accuracy_eval.agent.model
76
+ else accuracy_eval.team.model.provider
77
+ if accuracy_eval.team and accuracy_eval.team.model
78
+ else None
79
+ )
80
+ return cls(
81
+ id=accuracy_eval.eval_id,
82
+ name=accuracy_eval.name,
83
+ agent_id=accuracy_eval.agent.id if accuracy_eval.agent else None,
84
+ team_id=accuracy_eval.team.id if accuracy_eval.team else None,
85
+ workflow_id=None,
86
+ model_id=accuracy_eval.agent.model.id if accuracy_eval.agent else accuracy_eval.team.model.id, # type: ignore
87
+ model_provider=model_provider,
88
+ eval_type=EvalType.ACCURACY,
89
+ eval_data=asdict(result),
90
+ )
91
+
92
+ @classmethod
93
+ def from_performance_eval(
94
+ cls,
95
+ performance_eval: PerformanceEval,
96
+ result: PerformanceResult,
97
+ model_id: Optional[str] = None,
98
+ model_provider: Optional[str] = None,
99
+ agent_id: Optional[str] = None,
100
+ team_id: Optional[str] = None,
101
+ ) -> "EvalSchema":
102
+ return cls(
103
+ id=performance_eval.eval_id,
104
+ name=performance_eval.name,
105
+ agent_id=agent_id,
106
+ team_id=team_id,
107
+ workflow_id=None,
108
+ model_id=model_id,
109
+ model_provider=model_provider,
110
+ eval_type=EvalType.PERFORMANCE,
111
+ eval_data=asdict(result),
112
+ )
113
+
114
+ @classmethod
115
+ def from_reliability_eval(
116
+ cls,
117
+ reliability_eval: ReliabilityEval,
118
+ result: ReliabilityResult,
119
+ model_id: Optional[str] = None,
120
+ model_provider: Optional[str] = None,
121
+ agent_id: Optional[str] = None,
122
+ team_id: Optional[str] = None,
123
+ ) -> "EvalSchema":
124
+ return cls(
125
+ id=reliability_eval.eval_id,
126
+ name=reliability_eval.name,
127
+ agent_id=agent_id,
128
+ team_id=team_id,
129
+ workflow_id=None,
130
+ model_id=model_id,
131
+ model_provider=model_provider,
132
+ eval_type=EvalType.RELIABILITY,
133
+ eval_data=asdict(result),
134
+ )
135
+
136
+
137
+ class DeleteEvalRunsRequest(BaseModel):
138
+ eval_run_ids: List[str]
139
+
140
+
141
+ class UpdateEvalRunRequest(BaseModel):
142
+ name: str