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
agno/eval/accuracy.py CHANGED
@@ -1,14 +1,15 @@
1
1
  from dataclasses import asdict, dataclass, field
2
2
  from os import getenv
3
3
  from textwrap import dedent
4
- from typing import TYPE_CHECKING, Callable, List, Optional, Union
4
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Union
5
5
  from uuid import uuid4
6
6
 
7
7
  from pydantic import BaseModel, Field
8
8
 
9
9
  from agno.agent import Agent
10
- from agno.api.schemas.evals import EvalType
11
- from agno.eval.utils import async_log_eval_run, log_eval_run, store_result_in_file
10
+ from agno.db.base import BaseDb
11
+ from agno.db.schemas.evals import EvalType
12
+ from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
12
13
  from agno.exceptions import EvalError
13
14
  from agno.models.base import Model
14
15
  from agno.team.team import Team
@@ -96,11 +97,18 @@ class AccuracyResult:
96
97
  title_justify="center",
97
98
  )
98
99
  summary_table.add_row("Number of Runs", f"{len(self.results)}")
99
- summary_table.add_row("Average Score", f"{self.avg_score:.2f}")
100
- summary_table.add_row("Mean Score", f"{self.mean_score:.2f}")
101
- summary_table.add_row("Minimum Score", f"{self.min_score:.2f}")
102
- summary_table.add_row("Maximum Score", f"{self.max_score:.2f}")
103
- summary_table.add_row("Standard Deviation", f"{self.std_dev_score:.2f}")
100
+
101
+ if self.avg_score is not None:
102
+ summary_table.add_row("Average Score", f"{self.avg_score:.2f}")
103
+ if self.mean_score is not None:
104
+ summary_table.add_row("Mean Score", f"{self.mean_score:.2f}")
105
+ if self.min_score is not None:
106
+ summary_table.add_row("Minimum Score", f"{self.min_score:.2f}")
107
+ if self.max_score is not None:
108
+ summary_table.add_row("Maximum Score", f"{self.max_score:.2f}")
109
+ if self.std_dev_score is not None:
110
+ summary_table.add_row("Standard Deviation", f"{self.std_dev_score:.2f}")
111
+
104
112
  console.print(summary_table)
105
113
 
106
114
  def print_results(self, console: Optional["Console"] = None):
@@ -167,8 +175,13 @@ class AccuracyEval:
167
175
  file_path_to_save_results: Optional[str] = None
168
176
  # Enable debug logs
169
177
  debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
170
- # Log the results to the Agno platform. On by default.
171
- monitoring: bool = getenv("AGNO_MONITOR", "true").lower() == "true"
178
+ # The database to store Evaluation results
179
+ db: Optional[BaseDb] = None
180
+
181
+ # Telemetry settings
182
+ # telemetry=True logs minimal telemetry for analytics
183
+ # This helps us improve our Evals and provide better support
184
+ telemetry: bool = True
172
185
 
173
186
  def get_evaluator_agent(self) -> Agent:
174
187
  """Return the evaluator agent. If not provided, build it based on the evaluator fields and default instructions."""
@@ -235,7 +248,7 @@ You are an expert judge tasked with comparing the quality of an AI Agent’s out
235
248
  {additional_guidelines}{additional_context}
236
249
  Remember: You must only compare the agent_output to the expected_output. The expected_output is correct as it was provided by the user.
237
250
  """,
238
- response_model=AccuracyAgentResponse,
251
+ output_schema=AccuracyAgentResponse,
239
252
  structured_outputs=True,
240
253
  )
241
254
 
@@ -344,9 +357,9 @@ Remember: You must only compare the agent_output to the expected_output. The exp
344
357
  live_log.update(status)
345
358
 
346
359
  if self.agent is not None:
347
- output = self.agent.run(message=eval_input).content
360
+ output = self.agent.run(input=eval_input).content
348
361
  elif self.team is not None:
349
- output = self.team.run(message=eval_input).content
362
+ output = self.team.run(input=eval_input).content
350
363
 
351
364
  if not output:
352
365
  logger.error(f"Failed to generate a valid answer on iteration {i + 1}: {output}")
@@ -398,22 +411,31 @@ Remember: You must only compare the agent_output to the expected_output. The exp
398
411
  if self.print_summary or print_summary:
399
412
  self.result.print_summary(console)
400
413
 
401
- # Log results to the Agno platform if requested
414
+ # Log results to the Agno DB if requested
402
415
  if self.agent is not None:
403
- agent_id = self.agent.agent_id
416
+ agent_id = self.agent.id
404
417
  team_id = None
405
418
  model_id = self.agent.model.id if self.agent.model is not None else None
406
419
  model_provider = self.agent.model.provider if self.agent.model is not None else None
407
- evaluated_entity_name = self.agent.name
420
+ evaluated_component_name = self.agent.name
408
421
  elif self.team is not None:
409
422
  agent_id = None
410
- team_id = self.team.team_id
423
+ team_id = self.team.id
411
424
  model_id = self.team.model.id if self.team.model is not None else None
412
425
  model_provider = self.team.model.provider if self.team.model is not None else None
413
- evaluated_entity_name = self.team.name
426
+ evaluated_component_name = self.team.name
427
+
428
+ if self.db:
429
+ log_eval_input = {
430
+ "additional_guidelines": self.additional_guidelines,
431
+ "additional_context": self.additional_context,
432
+ "num_iterations": self.num_iterations,
433
+ "expected_output": self.expected_output,
434
+ "input": self.input,
435
+ }
414
436
 
415
- if self.monitoring:
416
437
  log_eval_run(
438
+ db=self.db,
417
439
  run_id=self.eval_id, # type: ignore
418
440
  run_data=asdict(self.result),
419
441
  eval_type=EvalType.ACCURACY,
@@ -422,7 +444,19 @@ Remember: You must only compare the agent_output to the expected_output. The exp
422
444
  model_id=model_id,
423
445
  model_provider=model_provider,
424
446
  name=self.name if self.name is not None else None,
425
- evaluated_entity_name=evaluated_entity_name,
447
+ evaluated_component_name=evaluated_component_name,
448
+ eval_input=log_eval_input,
449
+ )
450
+
451
+ if self.telemetry:
452
+ from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
453
+
454
+ create_eval_run_telemetry(
455
+ eval_run=EvalRunCreate(
456
+ run_id=self.eval_id,
457
+ eval_type=EvalType.ACCURACY,
458
+ data=self._get_telemetry_data(),
459
+ ),
426
460
  )
427
461
 
428
462
  logger.debug(f"*********** Evaluation {self.eval_id} Finished ***********")
@@ -464,10 +498,10 @@ Remember: You must only compare the agent_output to the expected_output. The exp
464
498
  live_log.update(status)
465
499
 
466
500
  if self.agent is not None:
467
- response = await self.agent.arun(message=eval_input)
501
+ response = await self.agent.arun(input=eval_input)
468
502
  output = response.content
469
503
  elif self.team is not None:
470
- response = await self.team.arun(message=eval_input)
504
+ response = await self.team.arun(input=eval_input) # type: ignore
471
505
  output = response.content
472
506
 
473
507
  if not output:
@@ -520,19 +554,48 @@ Remember: You must only compare the agent_output to the expected_output. The exp
520
554
  if self.print_summary or print_summary:
521
555
  self.result.print_summary(console)
522
556
 
523
- # Log results to the Agno platform if requested
524
- if self.monitoring:
525
- await async_log_eval_run(
557
+ if self.agent is not None:
558
+ agent_id = self.agent.id
559
+ team_id = None
560
+ model_id = self.agent.model.id if self.agent.model is not None else None
561
+ model_provider = self.agent.model.provider if self.agent.model is not None else None
562
+ evaluated_component_name = self.agent.name
563
+ elif self.team is not None:
564
+ agent_id = None
565
+ team_id = self.team.id
566
+ model_id = self.team.model.id if self.team.model is not None else None
567
+ model_provider = self.team.model.provider if self.team.model is not None else None
568
+ evaluated_component_name = self.team.name
569
+
570
+ # Log results to the Agno DB if requested
571
+ if self.db:
572
+ log_eval_input = {
573
+ "additional_guidelines": self.additional_guidelines,
574
+ "additional_context": self.additional_context,
575
+ "num_iterations": self.num_iterations,
576
+ "expected_output": self.expected_output,
577
+ "input": self.input,
578
+ }
579
+ await async_log_eval(
580
+ db=self.db,
526
581
  run_id=self.eval_id, # type: ignore
527
582
  run_data=asdict(self.result),
528
583
  eval_type=EvalType.ACCURACY,
529
- agent_id=self.agent.agent_id if self.agent is not None else None,
530
- model_id=self.agent.model.id if self.agent is not None and self.agent.model is not None else None,
531
- model_provider=self.agent.model.provider
532
- if self.agent is not None and self.agent.model is not None
533
- else None,
584
+ agent_id=agent_id,
585
+ model_id=model_id,
586
+ model_provider=model_provider,
534
587
  name=self.name if self.name is not None else None,
535
- evaluated_entity_name=self.agent.name if self.agent is not None else None,
588
+ evaluated_component_name=evaluated_component_name,
589
+ team_id=team_id,
590
+ workflow_id=None,
591
+ eval_input=log_eval_input,
592
+ )
593
+
594
+ if self.telemetry:
595
+ from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
596
+
597
+ await async_create_eval_run_telemetry(
598
+ eval_run=EvalRunCreate(run_id=self.eval_id, eval_type=EvalType.ACCURACY),
536
599
  )
537
600
 
538
601
  logger.debug(f"*********** Evaluation {self.eval_id} Finished ***********")
@@ -596,28 +659,37 @@ Remember: You must only compare the agent_output to the expected_output. The exp
596
659
  eval_id=self.eval_id,
597
660
  result=self.result,
598
661
  )
599
- # Log results to the Agno platform if requested
600
- if self.monitoring:
662
+ # Log results to the Agno DB if requested
663
+ if self.db:
601
664
  if self.agent is not None:
602
- agent_id = self.agent.agent_id
665
+ agent_id = self.agent.id
603
666
  team_id = None
604
667
  model_id = self.agent.model.id if self.agent.model is not None else None
605
668
  model_provider = self.agent.model.provider if self.agent.model is not None else None
606
- evaluated_entity_name = self.agent.name
669
+ evaluated_component_name = self.agent.name
607
670
  elif self.team is not None:
608
671
  agent_id = None
609
- team_id = self.team.team_id
672
+ team_id = self.team.id
610
673
  model_id = self.team.model.id if self.team.model is not None else None
611
674
  model_provider = self.team.model.provider if self.team.model is not None else None
612
- evaluated_entity_name = self.team.name
675
+ evaluated_component_name = self.team.name
613
676
  else:
614
677
  agent_id = None
615
678
  team_id = None
616
679
  model_id = None
617
680
  model_provider = None
618
- evaluated_entity_name = None
681
+ evaluated_component_name = None
682
+
683
+ log_eval_input = {
684
+ "additional_guidelines": self.additional_guidelines,
685
+ "additional_context": self.additional_context,
686
+ "num_iterations": self.num_iterations,
687
+ "expected_output": self.expected_output,
688
+ "input": self.input,
689
+ }
619
690
 
620
691
  log_eval_run(
692
+ db=self.db,
621
693
  run_id=self.eval_id, # type: ignore
622
694
  run_data=asdict(self.result),
623
695
  eval_type=EvalType.ACCURACY,
@@ -626,7 +698,20 @@ Remember: You must only compare the agent_output to the expected_output. The exp
626
698
  team_id=team_id,
627
699
  model_id=model_id,
628
700
  model_provider=model_provider,
629
- evaluated_entity_name=evaluated_entity_name,
701
+ evaluated_component_name=evaluated_component_name,
702
+ workflow_id=None,
703
+ eval_input=log_eval_input,
704
+ )
705
+
706
+ if self.telemetry:
707
+ from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
708
+
709
+ create_eval_run_telemetry(
710
+ eval_run=EvalRunCreate(
711
+ run_id=self.eval_id,
712
+ eval_type=EvalType.ACCURACY,
713
+ data=self._get_telemetry_data(),
714
+ ),
630
715
  )
631
716
 
632
717
  logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
@@ -690,22 +775,31 @@ Remember: You must only compare the agent_output to the expected_output. The exp
690
775
  eval_id=self.eval_id,
691
776
  result=self.result,
692
777
  )
693
- # Log results to the Agno platform if requested
694
- if self.monitoring:
778
+ # Log results to the Agno DB if requested
779
+ if self.db:
695
780
  if self.agent is not None:
696
- agent_id = self.agent.agent_id
781
+ agent_id = self.agent.id
697
782
  team_id = None
698
783
  model_id = self.agent.model.id if self.agent.model is not None else None
699
784
  model_provider = self.agent.model.provider if self.agent.model is not None else None
700
- evaluated_entity_name = self.agent.name
785
+ evaluated_component_name = self.agent.name
701
786
  elif self.team is not None:
702
787
  agent_id = None
703
- team_id = self.team.team_id
788
+ team_id = self.team.id
704
789
  model_id = self.team.model.id if self.team.model is not None else None
705
790
  model_provider = self.team.model.provider if self.team.model is not None else None
706
- evaluated_entity_name = self.team.name
707
-
708
- await async_log_eval_run(
791
+ evaluated_component_name = self.team.name
792
+
793
+ log_eval_input = {
794
+ "additional_guidelines": self.additional_guidelines,
795
+ "additional_context": self.additional_context,
796
+ "num_iterations": self.num_iterations,
797
+ "expected_output": self.expected_output,
798
+ "input": self.input,
799
+ }
800
+
801
+ await async_log_eval(
802
+ db=self.db,
709
803
  run_id=self.eval_id, # type: ignore
710
804
  run_data=asdict(self.result),
711
805
  eval_type=EvalType.ACCURACY,
@@ -714,8 +808,20 @@ Remember: You must only compare the agent_output to the expected_output. The exp
714
808
  team_id=team_id,
715
809
  model_id=model_id,
716
810
  model_provider=model_provider,
717
- evaluated_entity_name=evaluated_entity_name,
811
+ evaluated_component_name=evaluated_component_name,
812
+ workflow_id=None,
813
+ eval_input=log_eval_input,
718
814
  )
719
815
 
720
816
  logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
721
817
  return self.result
818
+
819
+ def _get_telemetry_data(self) -> Dict[str, Any]:
820
+ """Get the telemetry data for the evaluation"""
821
+ return {
822
+ "agent_id": self.agent.id if self.agent else None,
823
+ "team_id": self.team.id if self.team else None,
824
+ "model_id": self.agent.model.id if self.agent and self.agent.model else None,
825
+ "model_provider": self.agent.model.provider if self.agent and self.agent.model else None,
826
+ "num_iterations": self.num_iterations,
827
+ }
agno/eval/performance.py CHANGED
@@ -3,11 +3,12 @@ import gc
3
3
  import tracemalloc
4
4
  from dataclasses import dataclass, field
5
5
  from os import getenv
6
- from typing import TYPE_CHECKING, Callable, List, Optional
6
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional
7
7
  from uuid import uuid4
8
8
 
9
- from agno.api.schemas.evals import EvalType
10
- from agno.eval.utils import async_log_eval_run, log_eval_run, store_result_in_file
9
+ from agno.db.base import BaseDb
10
+ from agno.db.schemas.evals import EvalType
11
+ from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
11
12
  from agno.utils.log import log_debug, set_log_level_to_debug, set_log_level_to_info
12
13
  from agno.utils.timer import Timer
13
14
 
@@ -195,7 +196,7 @@ class PerformanceEval:
195
196
  # Evaluation UUID
196
197
  eval_id: str = field(default_factory=lambda: str(uuid4()))
197
198
  # Number of warm-up runs (not included in final stats)
198
- warmup_runs: int = 10
199
+ warmup_runs: Optional[int] = 10
199
200
  # Number of measured iterations
200
201
  num_iterations: int = 50
201
202
  # Result of the evaluation
@@ -210,12 +211,23 @@ class PerformanceEval:
210
211
  # Number of memory allocations to track
211
212
  top_n_memory_allocations: int = 5
212
213
 
214
+ # Agent and Team information
215
+ agent_id: Optional[str] = None
216
+ team_id: Optional[str] = None
217
+ model_id: Optional[str] = None
218
+ model_provider: Optional[str] = None
219
+
213
220
  # If set, results will be saved in the given file path
214
221
  file_path_to_save_results: Optional[str] = None
215
222
  # Enable debug logs
216
223
  debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
217
- # Log the results to the Agno platform. On by default.
218
- monitoring: bool = getenv("AGNO_MONITOR", "true").lower() == "true"
224
+ # The database to store Evaluation results
225
+ db: Optional[BaseDb] = None
226
+
227
+ # Telemetry settings
228
+ # telemetry=True logs minimal telemetry for analytics
229
+ # This helps us improve our Evals and provide better support
230
+ telemetry: bool = True
219
231
 
220
232
  def _measure_time(self) -> float:
221
233
  """Measure execution time for a single run."""
@@ -495,12 +507,13 @@ class PerformanceEval:
495
507
  console = Console()
496
508
  with Live(console=console, transient=True) as live_log:
497
509
  # 1. Do optional warm-up runs.
498
- for i in range(self.warmup_runs):
499
- status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
500
- live_log.update(status)
501
- self.func() # Simply run the function without measuring
502
- self._set_log_level() # Set log level incase function changed it
503
- status.stop()
510
+ if self.warmup_runs is not None:
511
+ for i in range(self.warmup_runs):
512
+ status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
513
+ live_log.update(status)
514
+ self.func() # Simply run the function without measuring
515
+ self._set_log_level() # Set log level incase function changed it
516
+ status.stop()
504
517
 
505
518
  # 2. Measure runtime
506
519
  if self.measure_runtime:
@@ -570,13 +583,33 @@ class PerformanceEval:
570
583
  self.result.print_summary(console, measure_memory=self.measure_memory, measure_runtime=self.measure_runtime)
571
584
 
572
585
  # 7. Log results to the Agno platform if requested
573
- if self.monitoring:
586
+ if self.db:
587
+ eval_input = {
588
+ "num_iterations": self.num_iterations,
589
+ "warmup_runs": self.warmup_runs,
590
+ }
591
+
574
592
  log_eval_run(
593
+ db=self.db,
575
594
  run_id=self.eval_id, # type: ignore
576
595
  run_data=self._parse_eval_run_data(),
577
596
  eval_type=EvalType.PERFORMANCE,
578
597
  name=self.name if self.name is not None else None,
579
- evaluated_entity_name=self.func.__name__,
598
+ evaluated_component_name=self.func.__name__,
599
+ agent_id=self.agent_id,
600
+ team_id=self.team_id,
601
+ model_id=self.model_id,
602
+ model_provider=self.model_provider,
603
+ eval_input=eval_input,
604
+ )
605
+
606
+ if self.telemetry:
607
+ from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
608
+
609
+ create_eval_run_telemetry(
610
+ eval_run=EvalRunCreate(
611
+ run_id=self.eval_id, eval_type=EvalType.PERFORMANCE, data=self._get_telemetry_data()
612
+ ),
580
613
  )
581
614
 
582
615
  log_debug(f"*********** Evaluation End: {self.eval_id} ***********")
@@ -617,12 +650,13 @@ class PerformanceEval:
617
650
  console = Console()
618
651
  with Live(console=console, transient=True) as live_log:
619
652
  # 1. Do optional warm-up runs.
620
- for i in range(self.warmup_runs):
621
- status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
622
- live_log.update(status)
623
- await self.func() # Simply run the function without measuring
624
- self._set_log_level() # Set log level incase function changed it
625
- status.stop()
653
+ if self.warmup_runs is not None:
654
+ for i in range(self.warmup_runs):
655
+ status = Status(f"Warm-up run {i + 1}/{self.warmup_runs}...", spinner="dots", speed=1.0)
656
+ live_log.update(status)
657
+ await self.func() # Simply run the function without measuring
658
+ self._set_log_level() # Set log level incase function changed it
659
+ status.stop()
626
660
 
627
661
  # 2. Measure runtime
628
662
  if self.measure_runtime:
@@ -692,14 +726,45 @@ class PerformanceEval:
692
726
  self.result.print_summary(console, measure_memory=self.measure_memory, measure_runtime=self.measure_runtime)
693
727
 
694
728
  # 7. Log results to the Agno platform if requested
695
- if self.monitoring:
696
- await async_log_eval_run(
729
+ if self.db:
730
+ eval_input = {
731
+ "num_iterations": self.num_iterations,
732
+ "warmup_runs": self.warmup_runs,
733
+ }
734
+
735
+ await async_log_eval(
736
+ db=self.db,
697
737
  run_id=self.eval_id, # type: ignore
698
738
  run_data=self._parse_eval_run_data(),
699
739
  eval_type=EvalType.PERFORMANCE,
700
740
  name=self.name if self.name is not None else None,
701
- evaluated_entity_name=self.func.__name__,
741
+ evaluated_component_name=self.func.__name__,
742
+ agent_id=self.agent_id,
743
+ team_id=self.team_id,
744
+ model_id=self.model_id,
745
+ model_provider=self.model_provider,
746
+ eval_input=eval_input,
747
+ )
748
+
749
+ if self.telemetry:
750
+ from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
751
+
752
+ await async_create_eval_run_telemetry(
753
+ eval_run=EvalRunCreate(
754
+ run_id=self.eval_id, eval_type=EvalType.PERFORMANCE, data=self._get_telemetry_data()
755
+ ),
702
756
  )
703
757
 
704
758
  log_debug(f"*********** Evaluation End: {self.eval_id} ***********")
705
759
  return self.result
760
+
761
+ def _get_telemetry_data(self) -> Dict[str, Any]:
762
+ """Get the telemetry data for the evaluation"""
763
+ return {
764
+ "model_id": self.model_id,
765
+ "model_provider": self.model_provider,
766
+ "num_iterations": self.num_iterations,
767
+ "warmup_runs": self.warmup_runs,
768
+ "measure_memory": self.measure_memory,
769
+ "measure_runtime": self.measure_runtime,
770
+ }