agno 0.1.2__py3-none-any.whl → 2.3.13__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 (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  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/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1791 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1312 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,88 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional, Union
3
+
4
+ from agno.cloud.aws.s3.bucket import S3Bucket
5
+ from agno.cloud.aws.s3.object import S3Object
6
+
7
+
8
+ @dataclass
9
+ class S3Content:
10
+ def __init__(
11
+ self,
12
+ bucket_name: Optional[str] = None,
13
+ bucket: Optional[S3Bucket] = None,
14
+ key: Optional[str] = None,
15
+ object: Optional[S3Object] = None,
16
+ prefix: Optional[str] = None,
17
+ ):
18
+ self.bucket_name = bucket_name
19
+ self.bucket = bucket
20
+ self.key = key
21
+ self.object = object
22
+ self.prefix = prefix
23
+
24
+ if bucket_name is None and bucket is None:
25
+ raise ValueError("Either bucket_name or bucket must be provided")
26
+ if key is None and object is None:
27
+ raise ValueError("Either key or object must be provided")
28
+ if bucket_name is not None and bucket is not None:
29
+ raise ValueError("Either bucket_name or bucket must be provided, not both")
30
+ if key is not None and object is not None:
31
+ raise ValueError("Either key or object must be provided, not both")
32
+
33
+ if self.bucket_name is not None:
34
+ self.bucket = S3Bucket(name=self.bucket_name)
35
+
36
+ def get_config(self):
37
+ return {
38
+ "bucket_name": self.bucket_name,
39
+ "bucket": self.bucket,
40
+ "key": self.key,
41
+ "object": self.object,
42
+ "prefix": self.prefix,
43
+ }
44
+
45
+
46
+ @dataclass
47
+ class GCSContent:
48
+ def __init__(
49
+ self,
50
+ bucket=None, # Type hint removed to avoid import issues
51
+ bucket_name: Optional[str] = None,
52
+ blob_name: Optional[str] = None,
53
+ prefix: Optional[str] = None,
54
+ ):
55
+ # Import Google Cloud Storage only when actually needed
56
+ try:
57
+ from google.cloud import storage # type: ignore
58
+ except ImportError:
59
+ raise ImportError(
60
+ "The `google-cloud-storage` package is not installed. Please install it via `pip install google-cloud-storage`."
61
+ )
62
+
63
+ self.bucket = bucket
64
+ self.bucket_name = bucket_name
65
+ self.blob_name = blob_name
66
+ self.prefix = prefix
67
+
68
+ if self.bucket is None and self.bucket_name is None:
69
+ raise ValueError("No bucket or bucket_name provided")
70
+ if self.bucket is not None and self.bucket_name is not None:
71
+ raise ValueError("Provide either bucket or bucket_name")
72
+ if self.blob_name is None and self.prefix is None:
73
+ raise ValueError("Either blob_name or prefix must be provided")
74
+
75
+ if self.bucket is None:
76
+ client = storage.Client()
77
+ self.bucket = client.bucket(self.bucket_name)
78
+
79
+ def get_config(self):
80
+ return {
81
+ "bucket": self.bucket,
82
+ "bucket_name": self.bucket_name,
83
+ "blob_name": self.blob_name,
84
+ "prefix": self.prefix,
85
+ }
86
+
87
+
88
+ RemoteContent = Union[S3Content, GCSContent]
@@ -0,0 +1,3 @@
1
+ from agno.knowledge.reranker.base import Reranker
2
+
3
+ __all__ = ["Reranker"]
@@ -2,7 +2,7 @@ from typing import List
2
2
 
3
3
  from pydantic import BaseModel, ConfigDict
4
4
 
5
- from agno.document import Document
5
+ from agno.knowledge.document import Document
6
6
 
7
7
 
8
8
  class Reranker(BaseModel):
@@ -1,7 +1,7 @@
1
1
  from typing import Any, Dict, List, Optional
2
2
 
3
- from agno.document import Document
4
- from agno.reranker.base import Reranker
3
+ from agno.knowledge.document import Document
4
+ from agno.knowledge.reranker.base import Reranker
5
5
  from agno.utils.log import logger
6
6
 
7
7
  try:
@@ -0,0 +1,195 @@
1
+ from typing import Any, List, Optional
2
+ from urllib.parse import urlparse
3
+
4
+ from agno.knowledge.document import Document
5
+ from agno.knowledge.reranker.base import Reranker
6
+ from agno.utils.log import logger
7
+
8
+ try:
9
+ from infinity_client import AuthenticatedClient, Client
10
+ from infinity_client.api.default import rerank
11
+ from infinity_client.models import RerankInput
12
+ except ImportError:
13
+ raise ImportError("infinity_client not installed, please run `pip install infinity_client`")
14
+
15
+
16
+ class InfinityReranker(Reranker):
17
+ model: str = "BAAI/bge-reranker-base"
18
+ host: str = "localhost"
19
+ port: int = 7997
20
+ url: Optional[str] = None
21
+ top_n: Optional[int] = None
22
+ api_key: Optional[str] = None
23
+ verify_ssl: bool = True
24
+ _client: Optional[Any] = None
25
+
26
+ def __init__(self, **kwargs):
27
+ super().__init__(**kwargs)
28
+ if self.url:
29
+ self._parse_url()
30
+
31
+ def _parse_url(self):
32
+ """Parse URL to extract host, port and path"""
33
+ if self.url:
34
+ parsed = urlparse(self.url)
35
+ if parsed.hostname:
36
+ self.host = parsed.hostname
37
+ if parsed.port:
38
+ self.port = parsed.port
39
+ # If no port specified in URL, keep default port
40
+
41
+ @property
42
+ def base_url(self) -> str:
43
+ """Construct the base URL for the Infinity server"""
44
+ return f"http://{self.host}:{self.port}"
45
+
46
+ @property
47
+ def client(self) -> Any:
48
+ """Get or create the infinity client"""
49
+ if self._client:
50
+ return self._client
51
+
52
+ base_url = self.base_url
53
+
54
+ if self.api_key:
55
+ self._client = AuthenticatedClient(base_url=base_url, token=self.api_key, verify_ssl=self.verify_ssl)
56
+ else:
57
+ self._client = Client(base_url=base_url, verify_ssl=self.verify_ssl)
58
+
59
+ return self._client
60
+
61
+ def _rerank(self, query: str, documents: List[Document]) -> List[Document]:
62
+ # Validate input documents and top_n
63
+ if not documents:
64
+ return []
65
+
66
+ top_n = self.top_n
67
+ if top_n and not (0 < top_n):
68
+ logger.warning(f"top_n should be a positive integer, got {self.top_n}, setting top_n to None")
69
+ top_n = None
70
+
71
+ compressed_docs: list[Document] = []
72
+
73
+ try:
74
+ # Prepare the request body for Infinity reranking
75
+ rerank_input = {
76
+ "model": self.model,
77
+ "query": query,
78
+ "documents": [doc.content for doc in documents],
79
+ "return_documents": False, # We only need scores, we already have documents
80
+ }
81
+
82
+ # Add top_n to payload if specified
83
+ if top_n:
84
+ rerank_input["top_n"] = top_n
85
+
86
+ # Create the input object
87
+ body = RerankInput.from_dict(rerank_input)
88
+
89
+ # Make request to Infinity rerank endpoint using the client
90
+ with self.client as client:
91
+ result = rerank.sync(client=client, body=body)
92
+
93
+ if result is None:
94
+ logger.error("Rerank request returned None")
95
+ return documents
96
+
97
+ # Process the response
98
+ # Infinity returns results with index and relevance_score
99
+ if hasattr(result, "results") and result.results:
100
+ for item in result.results:
101
+ doc_index = item.index
102
+ relevance_score = item.relevance_score
103
+
104
+ if doc_index < len(documents):
105
+ doc = documents[doc_index]
106
+ doc.reranking_score = relevance_score
107
+ compressed_docs.append(doc)
108
+
109
+ # Order by relevance score
110
+ compressed_docs.sort(
111
+ key=lambda x: x.reranking_score if x.reranking_score is not None else float("-inf"),
112
+ reverse=True,
113
+ )
114
+
115
+ # Limit to top_n if specified and not already limited by the API
116
+ if top_n and len(compressed_docs) > top_n:
117
+ compressed_docs = compressed_docs[:top_n]
118
+
119
+ except Exception as e:
120
+ logger.error(f"Error connecting to Infinity server at {self.base_url}: {e}")
121
+ return documents
122
+
123
+ return compressed_docs
124
+
125
+ def rerank(self, query: str, documents: List[Document]) -> List[Document]:
126
+ try:
127
+ return self._rerank(query=query, documents=documents)
128
+ except Exception as e:
129
+ logger.error(f"Error reranking documents: {e}. Returning original documents")
130
+ return documents
131
+
132
+ async def arerank(self, query: str, documents: List[Document]) -> List[Document]:
133
+ """Async version of rerank"""
134
+ # Validate input documents and top_n
135
+ if not documents:
136
+ return []
137
+
138
+ top_n = self.top_n
139
+ if top_n and not (0 < top_n):
140
+ logger.warning(f"top_n should be a positive integer, got {self.top_n}, setting top_n to None")
141
+ top_n = None
142
+
143
+ compressed_docs: list[Document] = []
144
+
145
+ try:
146
+ # Prepare the request body for Infinity reranking
147
+ rerank_input = {
148
+ "model": self.model,
149
+ "query": query,
150
+ "documents": [doc.content for doc in documents],
151
+ "return_documents": False, # We only need scores, we already have documents
152
+ }
153
+
154
+ # Add top_n to payload if specified
155
+ if top_n:
156
+ rerank_input["top_n"] = top_n
157
+
158
+ # Create the input object
159
+ body = RerankInput.from_dict(rerank_input)
160
+
161
+ # Make async request to Infinity rerank endpoint using the client
162
+ async with self.client as client:
163
+ result = await rerank.asyncio(client=client, body=body)
164
+
165
+ if result is None:
166
+ logger.error("Async rerank request returned None")
167
+ return documents
168
+
169
+ # Process the response
170
+ # Infinity returns results with index and relevance_score
171
+ if hasattr(result, "results") and result.results:
172
+ for item in result.results:
173
+ doc_index = item.index
174
+ relevance_score = item.relevance_score
175
+
176
+ if doc_index < len(documents):
177
+ doc = documents[doc_index]
178
+ doc.reranking_score = relevance_score
179
+ compressed_docs.append(doc)
180
+
181
+ # Order by relevance score
182
+ compressed_docs.sort(
183
+ key=lambda x: x.reranking_score if x.reranking_score is not None else float("-inf"),
184
+ reverse=True,
185
+ )
186
+
187
+ # Limit to top_n if specified and not already limited by the API
188
+ if top_n and len(compressed_docs) > top_n:
189
+ compressed_docs = compressed_docs[:top_n]
190
+
191
+ except Exception as e:
192
+ logger.error(f"Error connecting to Infinity server at {self.base_url}: {e}")
193
+ return documents
194
+
195
+ return compressed_docs
@@ -0,0 +1,54 @@
1
+ from typing import Any, Dict, List, Optional
2
+
3
+ from agno.knowledge.document import Document
4
+ from agno.knowledge.reranker.base import Reranker
5
+ from agno.utils.log import logger
6
+
7
+ try:
8
+ from sentence_transformers import CrossEncoder
9
+ except ImportError:
10
+ raise ImportError("`sentence-transformers` not installed, please run `pip install sentence-transformers`")
11
+
12
+
13
+ class SentenceTransformerReranker(Reranker):
14
+ model: str = "BAAI/bge-reranker-v2-m3"
15
+ model_kwargs: Optional[Dict[str, Any]] = None
16
+ top_n: Optional[int] = None
17
+
18
+ def _rerank(self, query: str, documents: List[Document]) -> List[Document]:
19
+ if not documents:
20
+ return []
21
+
22
+ sentence_transformer_client = CrossEncoder(model_name_or_path=self.model, model_kwargs=self.model_kwargs)
23
+
24
+ top_n = self.top_n
25
+ if top_n and not (0 < top_n):
26
+ logger.warning(f"top_n should be a positive integer, got {self.top_n}, setting top_n to None")
27
+ top_n = None
28
+
29
+ compressed_docs: list[Document] = []
30
+
31
+ sentence_pairs = [[query, doc.content] for doc in documents]
32
+
33
+ scores = sentence_transformer_client.predict(sentence_pairs).tolist()
34
+ for index, score in enumerate(scores):
35
+ doc = documents[index]
36
+ doc.reranking_score = score
37
+ compressed_docs.append(doc)
38
+
39
+ compressed_docs.sort(
40
+ key=lambda x: x.reranking_score if x.reranking_score is not None else float("-inf"),
41
+ reverse=True,
42
+ )
43
+
44
+ if top_n:
45
+ compressed_docs = compressed_docs[:top_n]
46
+
47
+ return compressed_docs
48
+
49
+ def rerank(self, query: str, documents: List[Document]) -> List[Document]:
50
+ try:
51
+ return self._rerank(query=query, documents=documents)
52
+ except Exception as e:
53
+ logger.error(f"Error reranking documents: {e}. Returning original documents")
54
+ return documents
@@ -0,0 +1,39 @@
1
+ from enum import Enum
2
+ from typing import Any
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ class ContentType(str, Enum):
8
+ """Enum for content types supported by knowledge readers."""
9
+
10
+ # Generic types
11
+ FILE = "file"
12
+ URL = "url"
13
+ TEXT = "text"
14
+ TOPIC = "topic"
15
+ YOUTUBE = "youtube"
16
+
17
+ # Document file extensions
18
+ PDF = ".pdf"
19
+ TXT = ".txt"
20
+ MARKDOWN = ".md"
21
+ DOCX = ".docx"
22
+ DOC = ".doc"
23
+ PPTX = ".pptx"
24
+ JSON = ".json"
25
+
26
+ # Spreadsheet file extensions
27
+ CSV = ".csv"
28
+ XLSX = ".xlsx"
29
+ XLS = ".xls"
30
+
31
+
32
+ def get_content_type_enum(content_type_str: str) -> ContentType:
33
+ """Convert a content type string to ContentType enum."""
34
+ return ContentType(content_type_str)
35
+
36
+
37
+ class KnowledgeFilter(BaseModel):
38
+ key: str
39
+ value: Any
@@ -0,0 +1,234 @@
1
+ from typing import Any, Dict, List, Optional
2
+
3
+ from agno.knowledge.reader.base import Reader
4
+ from agno.knowledge.reader.reader_factory import ReaderFactory
5
+ from agno.knowledge.types import ContentType
6
+ from agno.utils.log import log_debug
7
+
8
+
9
+ def _get_chunker_class(strategy_type):
10
+ """Get the chunker class for a given strategy type without instantiation."""
11
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
12
+
13
+ # Map strategy types to their corresponding classes
14
+ strategy_class_mapping = {
15
+ ChunkingStrategyType.AGENTIC_CHUNKER: lambda: _import_class(
16
+ "agno.knowledge.chunking.agentic", "AgenticChunking"
17
+ ),
18
+ ChunkingStrategyType.DOCUMENT_CHUNKER: lambda: _import_class(
19
+ "agno.knowledge.chunking.document", "DocumentChunking"
20
+ ),
21
+ ChunkingStrategyType.RECURSIVE_CHUNKER: lambda: _import_class(
22
+ "agno.knowledge.chunking.recursive", "RecursiveChunking"
23
+ ),
24
+ ChunkingStrategyType.SEMANTIC_CHUNKER: lambda: _import_class(
25
+ "agno.knowledge.chunking.semantic", "SemanticChunking"
26
+ ),
27
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER: lambda: _import_class(
28
+ "agno.knowledge.chunking.fixed", "FixedSizeChunking"
29
+ ),
30
+ ChunkingStrategyType.ROW_CHUNKER: lambda: _import_class("agno.knowledge.chunking.row", "RowChunking"),
31
+ ChunkingStrategyType.MARKDOWN_CHUNKER: lambda: _import_class(
32
+ "agno.knowledge.chunking.markdown", "MarkdownChunking"
33
+ ),
34
+ }
35
+
36
+ if strategy_type not in strategy_class_mapping:
37
+ raise ValueError(f"Unknown strategy type: {strategy_type}")
38
+
39
+ return strategy_class_mapping[strategy_type]()
40
+
41
+
42
+ def _import_class(module_name: str, class_name: str):
43
+ """Dynamically import a class from a module."""
44
+ import importlib
45
+
46
+ module = importlib.import_module(module_name)
47
+ return getattr(module, class_name)
48
+
49
+
50
+ def get_reader_info(reader_key: str) -> Dict:
51
+ """Get information about a reader without instantiating it."""
52
+ # Try to create the reader to get its info, but don't cache it
53
+ try:
54
+ reader_factory_method = ReaderFactory._get_reader_method(reader_key)
55
+
56
+ # Create an instance to get the class, then call class methods
57
+ reader_instance = reader_factory_method()
58
+ reader_class = reader_instance.__class__
59
+
60
+ supported_strategies = reader_class.get_supported_chunking_strategies()
61
+ supported_content_types = reader_class.get_supported_content_types()
62
+
63
+ return {
64
+ "id": reader_key,
65
+ "name": "".join(word.capitalize() for word in reader_key.split("_")) + "Reader",
66
+ "description": reader_instance.description,
67
+ "chunking_strategies": [
68
+ strategy.value for strategy in supported_strategies
69
+ ], # Convert enums to string values
70
+ "content_types": [ct.value for ct in supported_content_types], # Convert enums to string values
71
+ }
72
+ except ImportError as e:
73
+ # Skip readers with missing dependencies
74
+ raise ValueError(f"Reader '{reader_key}' has missing dependencies: {str(e)}")
75
+ except Exception as e:
76
+ raise ValueError(f"Unknown reader: {reader_key}. Error: {str(e)}")
77
+
78
+
79
+ def get_reader_info_from_instance(reader: Reader, reader_id: str) -> Dict:
80
+ """Get information about a reader instance."""
81
+ try:
82
+ reader_class = reader.__class__
83
+ supported_strategies = reader_class.get_supported_chunking_strategies()
84
+ supported_content_types = reader_class.get_supported_content_types()
85
+
86
+ return {
87
+ "id": reader_id,
88
+ "name": getattr(reader, "name", reader_class.__name__),
89
+ "description": getattr(reader, "description", f"Custom {reader_class.__name__}"),
90
+ "chunking_strategies": [strategy.value for strategy in supported_strategies],
91
+ "content_types": [ct.value for ct in supported_content_types],
92
+ }
93
+ except Exception as e:
94
+ raise ValueError(f"Failed to get info for reader '{reader_id}': {str(e)}")
95
+
96
+
97
+ def get_all_readers_info(knowledge_instance: Optional[Any] = None) -> List[Dict]:
98
+ """Get information about all available readers, including custom readers from a Knowledge instance.
99
+
100
+ Args:
101
+ knowledge_instance: Optional Knowledge instance to include custom readers from.
102
+
103
+ Returns:
104
+ List of reader info dictionaries.
105
+ """
106
+ readers_info = []
107
+ keys = ReaderFactory.get_all_reader_keys()
108
+ for key in keys:
109
+ try:
110
+ reader_info = get_reader_info(key)
111
+ readers_info.append(reader_info)
112
+ except ValueError as e:
113
+ # Skip readers with missing dependencies or other issues
114
+ # Log the error but don't fail the entire request
115
+ log_debug(f"Skipping reader '{key}': {e}")
116
+ continue
117
+
118
+ # Add custom readers from knowledge instance if provided
119
+ if knowledge_instance is not None:
120
+ custom_readers = knowledge_instance.get_readers()
121
+ if isinstance(custom_readers, dict):
122
+ for reader_id, reader in custom_readers.items():
123
+ try:
124
+ reader_info = get_reader_info_from_instance(reader, reader_id)
125
+ # Only add if not already present (custom readers take precedence)
126
+ if not any(r["id"] == reader_id for r in readers_info):
127
+ readers_info.append(reader_info)
128
+ except ValueError as e:
129
+ log_debug(f"Skipping custom reader '{reader_id}': {e}")
130
+ continue
131
+
132
+ return readers_info
133
+
134
+
135
+ def get_content_types_to_readers_mapping(knowledge_instance: Optional[Any] = None) -> Dict[str, List[str]]:
136
+ """Get mapping of content types to list of reader IDs that support them.
137
+
138
+ Args:
139
+ knowledge_instance: Optional Knowledge instance to include custom readers from.
140
+
141
+ Returns:
142
+ Dictionary mapping content type strings (ContentType enum values) to list of reader IDs.
143
+ """
144
+ content_type_mapping: Dict[str, List[str]] = {}
145
+ readers_info = get_all_readers_info(knowledge_instance)
146
+ for reader_info in readers_info:
147
+ reader_id = reader_info["id"]
148
+ content_types = reader_info.get("content_types", [])
149
+
150
+ for content_type in content_types:
151
+ if content_type not in content_type_mapping:
152
+ content_type_mapping[content_type] = []
153
+ # Avoid duplicates
154
+ if reader_id not in content_type_mapping[content_type]:
155
+ content_type_mapping[content_type].append(reader_id)
156
+
157
+ return content_type_mapping
158
+
159
+
160
+ def get_chunker_info(chunker_key: str) -> Dict:
161
+ """Get information about a chunker without instantiating it."""
162
+ try:
163
+ # Use chunking strategies directly
164
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
165
+
166
+ try:
167
+ # Use the chunker key directly as the strategy type value
168
+ strategy_type = ChunkingStrategyType.from_string(chunker_key)
169
+
170
+ # Get class directly without instantiation
171
+ chunker_class = _get_chunker_class(strategy_type)
172
+
173
+ # Extract class information
174
+ class_name = chunker_class.__name__
175
+ docstring = chunker_class.__doc__ or f"{class_name} chunking strategy"
176
+
177
+ # Check class __init__ signature for chunk_size and overlap parameters
178
+ metadata = {}
179
+ import inspect
180
+
181
+ try:
182
+ sig = inspect.signature(chunker_class.__init__)
183
+ param_names = set(sig.parameters.keys())
184
+
185
+ # If class has chunk_size or max_chunk_size parameter, set default chunk_size
186
+ if "chunk_size" in param_names or "max_chunk_size" in param_names:
187
+ metadata["chunk_size"] = 5000
188
+
189
+ # If class has overlap parameter, set default overlap
190
+ if "overlap" in param_names:
191
+ metadata["chunk_overlap"] = 0
192
+ except Exception:
193
+ # If we can't inspect, skip metadata
194
+ pass
195
+
196
+ return {
197
+ "key": chunker_key,
198
+ "class_name": class_name,
199
+ "name": chunker_key,
200
+ "description": docstring.strip(),
201
+ "strategy_type": strategy_type.value,
202
+ "metadata": metadata,
203
+ }
204
+ except ValueError:
205
+ raise ValueError(f"Unknown chunker key: {chunker_key}")
206
+
207
+ except ImportError as e:
208
+ # Skip chunkers with missing dependencies
209
+ raise ValueError(f"Chunker '{chunker_key}' has missing dependencies: {str(e)}")
210
+ except Exception as e:
211
+ raise ValueError(f"Unknown chunker: {chunker_key}. Error: {str(e)}")
212
+
213
+
214
+ def get_all_content_types() -> List[ContentType]:
215
+ """Get all available content types as ContentType enums."""
216
+ return list(ContentType)
217
+
218
+
219
+ def get_all_chunkers_info() -> List[Dict]:
220
+ """Get information about all available chunkers."""
221
+ chunkers_info = []
222
+
223
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
224
+
225
+ keys = [strategy_type.value for strategy_type in ChunkingStrategyType]
226
+
227
+ for key in keys:
228
+ try:
229
+ chunker_info = get_chunker_info(key)
230
+ chunkers_info.append(chunker_info)
231
+ except ValueError as e:
232
+ log_debug(f"Skipping chunker '{key}': {e}")
233
+ continue
234
+ return chunkers_info