agno 1.8.1__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.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