agno 1.8.1__py3-none-any.whl → 2.0.0a1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -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 +204 -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 +413 -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 +179 -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 +58 -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 +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -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/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -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 +2961 -4253
  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 +42 -22
  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 +18 -13
  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 +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  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 +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  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 +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  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 +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
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
+ }
agno/eval/reliability.py CHANGED
@@ -1,15 +1,17 @@
1
1
  from dataclasses import asdict, dataclass, field
2
2
  from os import getenv
3
- from typing import TYPE_CHECKING, List, Optional
3
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional
4
4
  from uuid import uuid4
5
5
 
6
+ from agno.db.base import BaseDb
7
+
6
8
  if TYPE_CHECKING:
7
9
  from rich.console import Console
8
10
 
9
- from agno.agent import RunResponse
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
12
- from agno.run.team import TeamRunResponse
11
+ from agno.agent import RunOutput
12
+ from agno.db.schemas.evals import EvalType
13
+ from agno.eval.utils import async_log_eval, log_eval_run, store_result_in_file
14
+ from agno.run.team import TeamRunOutput
13
15
  from agno.utils.log import logger
14
16
 
15
17
 
@@ -46,9 +48,9 @@ class ReliabilityEval:
46
48
  eval_id: str = field(default_factory=lambda: str(uuid4()))
47
49
 
48
50
  # Agent response
49
- agent_response: Optional[RunResponse] = None
51
+ agent_response: Optional[RunOutput] = None
50
52
  # Team response
51
- team_response: Optional[TeamRunResponse] = None
53
+ team_response: Optional[TeamRunOutput] = None
52
54
  # Expected tool calls
53
55
  expected_tool_calls: Optional[List[str]] = None
54
56
  # Result of the evaluation
@@ -60,8 +62,13 @@ class ReliabilityEval:
60
62
  file_path_to_save_results: Optional[str] = None
61
63
  # Enable debug logs
62
64
  debug_mode: bool = getenv("AGNO_DEBUG", "false").lower() == "true"
63
- # Log the results to the Agno platform. On by default.
64
- monitoring: bool = getenv("AGNO_MONITOR", "true").lower() == "true"
65
+ # The database to store Evaluation results
66
+ db: Optional[BaseDb] = None
67
+
68
+ # Telemetry settings
69
+ # telemetry=True logs minimal telemetry for analytics
70
+ # This helps us improve our Evals and provide better support
71
+ telemetry: bool = True
65
72
 
66
73
  def run(self, *, print_results: bool = False) -> Optional[ReliabilityResult]:
67
74
  if self.agent_response is None and self.team_response is None:
@@ -100,15 +107,18 @@ class ReliabilityEval:
100
107
 
101
108
  failed_tool_calls = []
102
109
  passed_tool_calls = []
103
- for tool_call in actual_tool_calls: # type: ignore
104
- tool_name = tool_call.get("function", {}).get("name")
105
- if not tool_name:
106
- continue
107
- else:
108
- if tool_name not in self.expected_tool_calls: # type: ignore
109
- failed_tool_calls.append(tool_call.get("function", {}).get("name"))
110
+ if not actual_tool_calls:
111
+ failed_tool_calls = self.expected_tool_calls or []
112
+ else:
113
+ for tool_call in actual_tool_calls: # type: ignore
114
+ tool_name = tool_call.get("function", {}).get("name")
115
+ if not tool_name:
116
+ continue
110
117
  else:
111
- passed_tool_calls.append(tool_call.get("function", {}).get("name"))
118
+ if tool_name not in self.expected_tool_calls: # type: ignore
119
+ failed_tool_calls.append(tool_call.get("function", {}).get("name"))
120
+ else:
121
+ passed_tool_calls.append(tool_call.get("function", {}).get("name"))
112
122
 
113
123
  self.result = ReliabilityResult(
114
124
  eval_status="PASSED" if len(failed_tool_calls) == 0 else "FAILED",
@@ -130,7 +140,7 @@ class ReliabilityEval:
130
140
  self.result.print_eval(console)
131
141
 
132
142
  # Log results to the Agno platform if requested
133
- if self.monitoring:
143
+ if self.db:
134
144
  if self.agent_response is not None:
135
145
  agent_id = self.agent_response.agent_id
136
146
  team_id = None
@@ -142,7 +152,12 @@ class ReliabilityEval:
142
152
  model_id = self.team_response.model
143
153
  model_provider = self.team_response.model_provider
144
154
 
155
+ eval_input = {
156
+ "expected_tool_calls": self.expected_tool_calls,
157
+ }
158
+
145
159
  log_eval_run(
160
+ db=self.db,
146
161
  run_id=self.eval_id, # type: ignore
147
162
  run_data=asdict(self.result),
148
163
  eval_type=EvalType.RELIABILITY,
@@ -151,6 +166,18 @@ class ReliabilityEval:
151
166
  team_id=team_id,
152
167
  model_id=model_id,
153
168
  model_provider=model_provider,
169
+ eval_input=eval_input,
170
+ )
171
+
172
+ if self.telemetry:
173
+ from agno.api.evals import EvalRunCreate, create_eval_run_telemetry
174
+
175
+ create_eval_run_telemetry(
176
+ eval_run=EvalRunCreate(
177
+ run_id=self.eval_id,
178
+ eval_type=EvalType.RELIABILITY,
179
+ data=self._get_telemetry_data(),
180
+ ),
154
181
  )
155
182
 
156
183
  logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
@@ -223,7 +250,7 @@ class ReliabilityEval:
223
250
  self.result.print_eval(console)
224
251
 
225
252
  # Log results to the Agno platform if requested
226
- if self.monitoring:
253
+ if self.db:
227
254
  if self.agent_response is not None:
228
255
  agent_id = self.agent_response.agent_id
229
256
  team_id = None
@@ -235,7 +262,12 @@ class ReliabilityEval:
235
262
  model_id = self.team_response.model
236
263
  model_provider = self.team_response.model_provider
237
264
 
238
- await async_log_eval_run(
265
+ eval_input = {
266
+ "expected_tool_calls": self.expected_tool_calls,
267
+ }
268
+
269
+ await async_log_eval(
270
+ db=self.db,
239
271
  run_id=self.eval_id, # type: ignore
240
272
  run_data=asdict(self.result),
241
273
  eval_type=EvalType.RELIABILITY,
@@ -244,7 +276,28 @@ class ReliabilityEval:
244
276
  team_id=team_id,
245
277
  model_id=model_id,
246
278
  model_provider=model_provider,
279
+ eval_input=eval_input,
280
+ )
281
+
282
+ if self.telemetry:
283
+ from agno.api.evals import EvalRunCreate, async_create_eval_run_telemetry
284
+
285
+ await async_create_eval_run_telemetry(
286
+ eval_run=EvalRunCreate(
287
+ run_id=self.eval_id,
288
+ eval_type=EvalType.RELIABILITY,
289
+ data=self._get_telemetry_data(),
290
+ ),
247
291
  )
248
292
 
249
293
  logger.debug(f"*********** Evaluation End: {self.eval_id} ***********")
250
294
  return self.result
295
+
296
+ def _get_telemetry_data(self) -> Dict[str, Any]:
297
+ """Get the telemetry data for the evaluation"""
298
+ return {
299
+ "team_id": self.team_response.team_id if self.team_response else None,
300
+ "agent_id": self.agent_response.agent_id if self.agent_response else None,
301
+ "model_id": self.agent_response.model if self.agent_response else None,
302
+ "model_provider": self.agent_response.model_provider if self.agent_response else None,
303
+ }
agno/eval/utils.py CHANGED
@@ -2,8 +2,8 @@ from dataclasses import asdict
2
2
  from pathlib import Path
3
3
  from typing import TYPE_CHECKING, Optional, Union
4
4
 
5
- from agno.api.evals import async_create_eval_run, create_eval_run
6
- from agno.api.schemas.evals import EvalRunCreate, EvalType
5
+ from agno.db.base import BaseDb
6
+ from agno.db.schemas.evals import EvalRunRecord, EvalType
7
7
  from agno.utils.log import log_debug, logger
8
8
 
9
9
  if TYPE_CHECKING:
@@ -13,61 +13,71 @@ if TYPE_CHECKING:
13
13
 
14
14
 
15
15
  def log_eval_run(
16
+ db: BaseDb,
16
17
  run_id: str,
17
18
  run_data: dict,
18
19
  eval_type: EvalType,
20
+ eval_input: dict,
19
21
  agent_id: Optional[str] = None,
20
22
  model_id: Optional[str] = None,
21
23
  model_provider: Optional[str] = None,
22
24
  name: Optional[str] = None,
23
- evaluated_entity_name: Optional[str] = None,
25
+ evaluated_component_name: Optional[str] = None,
24
26
  team_id: Optional[str] = None,
27
+ workflow_id: Optional[str] = None,
25
28
  ) -> None:
26
29
  """Call the API to create an evaluation run."""
27
30
 
28
31
  try:
29
- create_eval_run(
30
- eval_run=EvalRunCreate(
32
+ db.create_eval_run(
33
+ EvalRunRecord(
31
34
  run_id=run_id,
32
35
  eval_type=eval_type,
33
36
  eval_data=run_data,
37
+ eval_input=eval_input,
34
38
  agent_id=agent_id,
35
39
  model_id=model_id,
36
40
  model_provider=model_provider,
37
41
  name=name,
38
- evaluated_entity_name=evaluated_entity_name,
42
+ evaluated_component_name=evaluated_component_name,
39
43
  team_id=team_id,
44
+ workflow_id=workflow_id,
40
45
  )
41
46
  )
42
47
  except Exception as e:
43
48
  log_debug(f"Could not create agent event: {e}")
44
49
 
45
50
 
46
- async def async_log_eval_run(
51
+ async def async_log_eval(
52
+ db: BaseDb,
47
53
  run_id: str,
48
54
  run_data: dict,
49
55
  eval_type: EvalType,
56
+ eval_input: dict,
50
57
  agent_id: Optional[str] = None,
51
58
  model_id: Optional[str] = None,
52
59
  model_provider: Optional[str] = None,
53
60
  name: Optional[str] = None,
54
- evaluated_entity_name: Optional[str] = None,
61
+ evaluated_component_name: Optional[str] = None,
55
62
  team_id: Optional[str] = None,
63
+ workflow_id: Optional[str] = None,
56
64
  ) -> None:
57
- """Asycn call to the API to create an evaluation run."""
65
+ """Call the API to create an evaluation run."""
58
66
 
59
67
  try:
60
- await async_create_eval_run(
61
- eval_run=EvalRunCreate(
68
+ db.create_eval_run(
69
+ EvalRunRecord(
62
70
  run_id=run_id,
63
71
  eval_type=eval_type,
64
72
  eval_data=run_data,
73
+ eval_input=eval_input,
65
74
  agent_id=agent_id,
66
75
  model_id=model_id,
67
76
  model_provider=model_provider,
68
- team_id=team_id,
69
77
  name=name,
70
- evaluated_entity_name=evaluated_entity_name,
78
+ evaluated_component_name=evaluated_component_name,
79
+ team_id=team_id,
80
+ workflow_id=workflow_id,
71
81
  )
72
82
  )
73
83
  except Exception as e:
@@ -0,0 +1,3 @@
1
+ from agno.integrations.discord.client import DiscordClient
2
+
3
+ __all__ = ["DiscordClient"]
@@ -4,9 +4,9 @@ from typing import Optional, Union
4
4
 
5
5
  import requests
6
6
 
7
- from agno.agent.agent import Agent, RunResponse
7
+ from agno.agent.agent import Agent, RunOutput
8
8
  from agno.media import Audio, File, Image, Video
9
- from agno.team.team import Team, TeamRunResponse
9
+ from agno.team.team import Team, TeamRunOutput
10
10
  from agno.utils.log import log_info, log_warning
11
11
 
12
12
  try:
@@ -115,8 +115,8 @@ class DiscordClient:
115
115
  """)
116
116
  if self.agent:
117
117
  self.agent.additional_context = additional_context
118
- agent_response: RunResponse = await self.agent.arun(
119
- message_text,
118
+ agent_response: RunOutput = await self.agent.arun(
119
+ input=message_text,
120
120
  user_id=message_user_id,
121
121
  session_id=str(thread.id),
122
122
  images=[Image(url=message_image)] if message_image else None,
@@ -127,8 +127,8 @@ class DiscordClient:
127
127
  await self._handle_response_in_thread(agent_response, thread)
128
128
  elif self.team:
129
129
  self.team.additional_context = additional_context
130
- team_response: TeamRunResponse = await self.team.arun(
131
- message_text,
130
+ team_response: TeamRunOutput = await self.team.arun(
131
+ input=message_text,
132
132
  user_id=message_user_id,
133
133
  session_id=str(thread.id),
134
134
  images=[Image(url=message_image)] if message_image else None,
@@ -139,8 +139,8 @@ class DiscordClient:
139
139
  await self._handle_response_in_thread(team_response, thread)
140
140
 
141
141
  async def handle_hitl(
142
- self, run_response: RunResponse, thread: Union[discord.Thread, discord.TextChannel]
143
- ) -> RunResponse:
142
+ self, run_response: RunOutput, thread: Union[discord.Thread, discord.TextChannel]
143
+ ) -> RunOutput:
144
144
  """Handles optional Human-In-The-Loop interaction."""
145
145
  if run_response.is_paused:
146
146
  for tool in run_response.tools_requiring_confirmation:
@@ -157,9 +157,9 @@ class DiscordClient:
157
157
  return run_response
158
158
 
159
159
  async def _handle_response_in_thread(
160
- self, response: Union[RunResponse, TeamRunResponse], thread: Union[discord.TextChannel, discord.Thread]
160
+ self, response: Union[RunOutput, TeamRunOutput], thread: Union[discord.TextChannel, discord.Thread]
161
161
  ):
162
- if isinstance(response, RunResponse):
162
+ if isinstance(response, RunOutput):
163
163
  response = await self.handle_hitl(response, thread)
164
164
 
165
165
  if response.reasoning_content:
@@ -1,5 +1,5 @@
1
- from agno.knowledge.agent import AgentKnowledge
1
+ from agno.knowledge.knowledge import Knowledge
2
2
 
3
3
  __all__ = [
4
- "AgentKnowledge",
4
+ "Knowledge",
5
5
  ]
@@ -1,7 +1,7 @@
1
1
  from typing import List, Optional
2
2
 
3
- from agno.document.base import Document
4
- from agno.document.chunking.strategy import ChunkingStrategy
3
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.document.base import Document
5
5
  from agno.models.base import Model
6
6
  from agno.models.defaults import DEFAULT_OPENAI_MODEL_ID
7
7
  from agno.models.message import Message
@@ -1,7 +1,7 @@
1
1
  from typing import List
2
2
 
3
- from agno.document.base import Document
4
- from agno.document.chunking.strategy import ChunkingStrategy
3
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.document.base import Document
5
5
 
6
6
 
7
7
  class DocumentChunking(ChunkingStrategy):
@@ -1,13 +1,13 @@
1
1
  from typing import List
2
2
 
3
- from agno.document.base import Document
4
- from agno.document.chunking.strategy import ChunkingStrategy
3
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.document.base import Document
5
5
 
6
6
 
7
7
  class FixedSizeChunking(ChunkingStrategy):
8
8
  """Chunking strategy that splits text into fixed-size chunks with optional overlap"""
9
9
 
10
- def __init__(self, chunk_size: int = 5000, overlap: int = 0):
10
+ def __init__(self, chunk_size: int = 100, overlap: int = 0):
11
11
  # overlap must be less than chunk size
12
12
  if overlap >= chunk_size:
13
13
  raise ValueError(f"Invalid parameters: overlap ({overlap}) must be less than chunk size ({chunk_size}).")
@@ -8,8 +8,8 @@ try:
8
8
  except ImportError:
9
9
  raise ImportError("`unstructured` not installed. Please install it using `pip install unstructured markdown`")
10
10
 
11
- from agno.document.base import Document
12
- from agno.document.chunking.strategy import ChunkingStrategy
11
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
12
+ from agno.knowledge.document.base import Document
13
13
 
14
14
 
15
15
  class MarkdownChunking(ChunkingStrategy):
@@ -1,8 +1,8 @@
1
1
  import warnings
2
2
  from typing import List
3
3
 
4
- from agno.document.base import Document
5
- from agno.document.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
5
+ from agno.knowledge.document.base import Document
6
6
 
7
7
 
8
8
  class RecursiveChunking(ChunkingStrategy):
@@ -1,7 +1,7 @@
1
1
  from typing import List
2
2
 
3
- from agno.document.base import Document
4
- from agno.document.chunking.strategy import ChunkingStrategy
3
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.document.base import Document
5
5
 
6
6
 
7
7
  class RowChunking(ChunkingStrategy):
@@ -0,0 +1,59 @@
1
+ from typing import List, Optional
2
+
3
+ from agno.knowledge.chunking.strategy import ChunkingStrategy
4
+ from agno.knowledge.document.base import Document
5
+ from agno.knowledge.embedder.base import Embedder
6
+ from agno.knowledge.embedder.openai import OpenAIEmbedder
7
+
8
+
9
+ class SemanticChunking(ChunkingStrategy):
10
+ """Chunking strategy that splits text into semantic chunks using chonkie"""
11
+
12
+ def __init__(self, embedder: Optional[Embedder] = None, chunk_size: int = 5000, similarity_threshold: float = 0.5):
13
+ self.embedder = embedder or OpenAIEmbedder(id="text-embedding-3-small") # type: ignore
14
+ self.chunk_size = chunk_size
15
+ self.similarity_threshold = similarity_threshold
16
+ self.chunker = None # Will be initialized lazily when needed
17
+
18
+ def _initialize_chunker(self):
19
+ """Lazily initialize the chunker with chonkie dependency."""
20
+ if self.chunker is None:
21
+ try:
22
+ from chonkie import SemanticChunker
23
+ except ImportError:
24
+ raise ImportError(
25
+ "`chonkie` is required for semantic chunking. "
26
+ "Please install it using `pip install chonkie` to use SemanticChunking."
27
+ )
28
+
29
+ self.chunker = SemanticChunker(
30
+ embedding_model=self.embedder.id, # type: ignore
31
+ chunk_size=self.chunk_size,
32
+ threshold=self.similarity_threshold,
33
+ )
34
+
35
+ def chunk(self, document: Document) -> List[Document]:
36
+ """Split document into semantic chunks using chonkie"""
37
+ if not document.content:
38
+ return [document]
39
+
40
+ # Ensure chunker is initialized (will raise ImportError if chonkie is missing)
41
+ self._initialize_chunker()
42
+
43
+ # Use chonkie to split into semantic chunks
44
+ if self.chunker is None:
45
+ raise RuntimeError("Chunker failed to initialize")
46
+
47
+ chunks = self.chunker.chunk(self.clean_text(document.content))
48
+
49
+ # Convert chunks to Documents
50
+ chunked_documents: List[Document] = []
51
+ for i, chunk in enumerate(chunks, 1):
52
+ meta_data = document.meta_data.copy()
53
+ meta_data["chunk"] = i
54
+ chunk_id = f"{document.id}_{i}" if document.id else None
55
+ meta_data["chunk_size"] = len(chunk.text)
56
+
57
+ chunked_documents.append(Document(id=chunk_id, name=document.name, meta_data=meta_data, content=chunk.text))
58
+
59
+ return chunked_documents