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
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
+ }