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
@@ -1,46 +0,0 @@
1
- from io import BytesIO
2
- from typing import List
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import logger
7
-
8
- try:
9
- from agno.aws.resource.s3.object import S3Object # type: ignore
10
- except (ModuleNotFoundError, ImportError):
11
- raise ImportError("`agno-aws` not installed. Please install using `pip install agno-aws`")
12
-
13
- try:
14
- from pypdf import PdfReader as DocumentReader # noqa: F401
15
- except ImportError:
16
- raise ImportError("`pypdf` not installed. Please install it via `pip install pypdf`.")
17
-
18
-
19
- class S3PDFReader(Reader):
20
- """Reader for PDF files on S3"""
21
-
22
- def read(self, s3_object: S3Object) -> List[Document]:
23
- try:
24
- logger.info(f"Reading: {s3_object.uri}")
25
-
26
- object_resource = s3_object.get_resource()
27
- object_body = object_resource.get()["Body"]
28
- doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
29
- doc_reader = DocumentReader(BytesIO(object_body.read()))
30
- documents = [
31
- Document(
32
- name=doc_name,
33
- id=f"{doc_name}_{page_number}",
34
- meta_data={"page": page_number},
35
- content=page.extract_text(),
36
- )
37
- for page_number, page in enumerate(doc_reader.pages, start=1)
38
- ]
39
- if self.chunk:
40
- chunked_documents = []
41
- for document in documents:
42
- chunked_documents.extend(self.chunk_document(document))
43
- return chunked_documents
44
- return documents
45
- except Exception:
46
- raise
@@ -1,51 +0,0 @@
1
- from pathlib import Path
2
- from typing import List
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import logger
7
-
8
- try:
9
- from agno.aws.resource.s3.object import S3Object # type: ignore
10
- except (ModuleNotFoundError, ImportError):
11
- raise ImportError("`agno-aws` not installed. Please install using `pip install agno-aws`")
12
-
13
- try:
14
- import textract # noqa: F401
15
- except ImportError:
16
- raise ImportError("`textract` not installed. Please install it via `pip install textract`.")
17
-
18
-
19
- class S3TextReader(Reader):
20
- """Reader for text files on S3"""
21
-
22
- def read(self, s3_object: S3Object) -> List[Document]:
23
- try:
24
- logger.info(f"Reading: {s3_object.uri}")
25
-
26
- obj_name = s3_object.name.split("/")[-1]
27
- temporary_file = Path("storage").joinpath(obj_name)
28
- s3_object.download(temporary_file)
29
-
30
- logger.info(f"Parsing: {temporary_file}")
31
- doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
32
- doc_content = textract.process(temporary_file)
33
- documents = [
34
- Document(
35
- name=doc_name,
36
- id=doc_name,
37
- content=doc_content.decode("utf-8"),
38
- )
39
- ]
40
- if self.chunk:
41
- chunked_documents = []
42
- for document in documents:
43
- chunked_documents.extend(self.chunk_document(document))
44
- return chunked_documents
45
-
46
- logger.debug(f"Deleting: {temporary_file}")
47
- temporary_file.unlink()
48
- return documents
49
- except Exception as e:
50
- logger.error(f"Error reading: {s3_object.uri}: {e}")
51
- return []
@@ -1,41 +0,0 @@
1
- from pathlib import Path
2
- from typing import IO, Any, List, Union
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import logger
7
-
8
-
9
- class TextReader(Reader):
10
- """Reader for Text files"""
11
-
12
- def read(self, file: Union[Path, IO[Any]]) -> List[Document]:
13
- try:
14
- if isinstance(file, Path):
15
- if not file.exists():
16
- raise FileNotFoundError(f"Could not find file: {file}")
17
- logger.info(f"Reading: {file}")
18
- file_name = file.stem
19
- file_contents = file.read_text()
20
- else:
21
- logger.info(f"Reading uploaded file: {file.name}")
22
- file_name = file.name.split(".")[0]
23
- file.seek(0)
24
- file_contents = file.read().decode("utf-8")
25
-
26
- documents = [
27
- Document(
28
- name=file_name,
29
- id=file_name,
30
- content=file_contents,
31
- )
32
- ]
33
- if self.chunk:
34
- chunked_documents = []
35
- for document in documents:
36
- chunked_documents.extend(self.chunk_document(document))
37
- return chunked_documents
38
- return documents
39
- except Exception as e:
40
- logger.error(f"Error reading: {file}: {e}")
41
- return []
@@ -1,175 +0,0 @@
1
- import random
2
- import time
3
- from dataclasses import dataclass, field
4
- from typing import Dict, List, Set, Tuple
5
- from urllib.parse import urljoin, urlparse
6
-
7
- from agno.document.base import Document
8
- from agno.document.reader.base import Reader
9
- from agno.utils.log import logger
10
-
11
- try:
12
- from bs4 import BeautifulSoup # noqa: F401
13
- except ImportError:
14
- raise ImportError("The `bs4` package is not installed. Please install it via `pip install beautifulsoup4`.")
15
-
16
- try:
17
- import httpx
18
- except ImportError:
19
- raise ImportError("`httpx` not installed. Please install it via `pip install httpx`.")
20
-
21
-
22
- @dataclass
23
- class WebsiteReader(Reader):
24
- """Reader for Websites"""
25
-
26
- max_depth: int = 3
27
- max_links: int = 10
28
-
29
- _visited: Set[str] = field(default_factory=set)
30
- _urls_to_crawl: List[Tuple[str, int]] = field(default_factory=list)
31
-
32
- def delay(self, min_seconds=1, max_seconds=3):
33
- """
34
- Introduce a random delay.
35
-
36
- :param min_seconds: Minimum number of seconds to delay. Default is 1.
37
- :param max_seconds: Maximum number of seconds to delay. Default is 3.
38
- """
39
- sleep_time = random.uniform(min_seconds, max_seconds)
40
- time.sleep(sleep_time)
41
-
42
- def _get_primary_domain(self, url: str) -> str:
43
- """
44
- Extract primary domain from the given URL.
45
-
46
- :param url: The URL to extract the primary domain from.
47
- :return: The primary domain.
48
- """
49
- domain_parts = urlparse(url).netloc.split(".")
50
- # Return primary domain (excluding subdomains)
51
- return ".".join(domain_parts[-2:])
52
-
53
- def _extract_main_content(self, soup: BeautifulSoup) -> str:
54
- """
55
- Extracts the main content from a BeautifulSoup object.
56
-
57
- :param soup: The BeautifulSoup object to extract the main content from.
58
- :return: The main content.
59
- """
60
- # Try to find main content by specific tags or class names
61
- for tag in ["article", "main"]:
62
- element = soup.find(tag)
63
- if element:
64
- return element.get_text(strip=True, separator=" ")
65
-
66
- for class_name in ["content", "main-content", "post-content"]:
67
- element = soup.find(class_=class_name)
68
- if element:
69
- return element.get_text(strip=True, separator=" ")
70
-
71
- return ""
72
-
73
- def crawl(self, url: str, starting_depth: int = 1) -> Dict[str, str]:
74
- """
75
- Crawls a website and returns a dictionary of URLs and their corresponding content.
76
-
77
- Parameters:
78
- - url (str): The starting URL to begin the crawl.
79
- - starting_depth (int, optional): The starting depth level for the crawl. Defaults to 1.
80
-
81
- Returns:
82
- - Dict[str, str]: A dictionary where each key is a URL and the corresponding value is the main
83
- content extracted from that URL.
84
-
85
- Note:
86
- The function focuses on extracting the main content by prioritizing content inside common HTML tags
87
- like `<article>`, `<main>`, and `<div>` with class names such as "content", "main-content", etc.
88
- The crawler will also respect the `max_depth` attribute of the WebCrawler class, ensuring it does not
89
- crawl deeper than the specified depth.
90
- """
91
- num_links = 0
92
- crawler_result: Dict[str, str] = {}
93
- primary_domain = self._get_primary_domain(url)
94
- # Add starting URL with its depth to the global list
95
- self._urls_to_crawl.append((url, starting_depth))
96
- while self._urls_to_crawl:
97
- # Unpack URL and depth from the global list
98
- current_url, current_depth = self._urls_to_crawl.pop(0)
99
-
100
- # Skip if
101
- # - URL is already visited
102
- # - does not end with the primary domain,
103
- # - exceeds max depth
104
- # - exceeds max links
105
- if (
106
- current_url in self._visited
107
- or not urlparse(current_url).netloc.endswith(primary_domain)
108
- or current_depth > self.max_depth
109
- or num_links >= self.max_links
110
- ):
111
- continue
112
-
113
- self._visited.add(current_url)
114
- self.delay()
115
-
116
- try:
117
- logger.debug(f"Crawling: {current_url}")
118
- response = httpx.get(current_url, timeout=10)
119
- soup = BeautifulSoup(response.content, "html.parser")
120
-
121
- # Extract main content
122
- main_content = self._extract_main_content(soup)
123
- if main_content:
124
- crawler_result[current_url] = main_content
125
- num_links += 1
126
-
127
- # Add found URLs to the global list, with incremented depth
128
- for link in soup.find_all("a", href=True):
129
- full_url = urljoin(current_url, link["href"])
130
- parsed_url = urlparse(full_url)
131
- if parsed_url.netloc.endswith(primary_domain) and not any(
132
- parsed_url.path.endswith(ext) for ext in [".pdf", ".jpg", ".png"]
133
- ):
134
- if full_url not in self._visited and (full_url, current_depth + 1) not in self._urls_to_crawl:
135
- self._urls_to_crawl.append((full_url, current_depth + 1))
136
-
137
- except Exception as e:
138
- logger.debug(f"Failed to crawl: {current_url}: {e}")
139
- pass
140
-
141
- return crawler_result
142
-
143
- def read(self, url: str) -> List[Document]:
144
- """
145
- Reads a website and returns a list of documents.
146
-
147
- This function first converts the website into a dictionary of URLs and their corresponding content.
148
- Then iterates through the dictionary and returns chunks of content.
149
-
150
- :param url: The URL of the website to read.
151
- :return: A list of documents.
152
- """
153
-
154
- logger.debug(f"Reading: {url}")
155
- crawler_result = self.crawl(url)
156
- documents = []
157
- for crawled_url, crawled_content in crawler_result.items():
158
- if self.chunk:
159
- documents.extend(
160
- self.chunk_document(
161
- Document(
162
- name=url, id=str(crawled_url), meta_data={"url": str(crawled_url)}, content=crawled_content
163
- )
164
- )
165
- )
166
- else:
167
- documents.append(
168
- Document(
169
- name=url,
170
- id=str(crawled_url),
171
- meta_data={"url": str(crawled_url)},
172
- content=crawled_content,
173
- )
174
- )
175
- return documents
@@ -1,50 +0,0 @@
1
- from typing import List
2
-
3
- from agno.document.base import Document
4
- from agno.document.reader.base import Reader
5
- from agno.utils.log import logger
6
-
7
- try:
8
- from youtube_transcript_api import YouTubeTranscriptApi
9
- except ImportError:
10
- raise ImportError(
11
- "`youtube_transcript_api` not installed. Please install it via `pip install youtube_transcript_api`."
12
- )
13
-
14
-
15
- class YouTubeReader(Reader):
16
- """Reader for YouTube video transcripts"""
17
-
18
- def read(self, video_url: str) -> List[Document]:
19
- try:
20
- # Extract video ID from URL
21
- video_id = video_url.split("v=")[-1].split("&")[0]
22
- logger.info(f"Reading transcript for video: {video_id}")
23
-
24
- # Get transcript
25
- transcript_list = YouTubeTranscriptApi.get_transcript(video_id)
26
-
27
- # Combine transcript segments into full text
28
- transcript_text = ""
29
- for segment in transcript_list:
30
- transcript_text += f"{segment['text']} "
31
-
32
- documents = [
33
- Document(
34
- name=f"youtube_{video_id}",
35
- id=f"youtube_{video_id}",
36
- meta_data={"video_url": video_url, "video_id": video_id},
37
- content=transcript_text.strip(),
38
- )
39
- ]
40
-
41
- if self.chunk:
42
- chunked_documents = []
43
- for document in documents:
44
- chunked_documents.extend(self.chunk_document(document))
45
- return chunked_documents
46
- return documents
47
-
48
- except Exception as e:
49
- logger.error(f"Error reading transcript for {video_url}: {e}")
50
- return []
agno/embedder/__init__.py DELETED
@@ -1 +0,0 @@
1
- from agno.embedder.base import Embedder
@@ -1,86 +0,0 @@
1
- from os import getenv
2
- from typing import Any, Dict, List, Optional, Tuple
3
-
4
- from typing_extensions import Literal
5
-
6
- from agno.embedder.base import Embedder
7
- from agno.utils.log import logger
8
-
9
- try:
10
- from openai import AzureOpenAI as AzureOpenAIClient
11
- from openai.types.create_embedding_response import CreateEmbeddingResponse
12
- except ImportError:
13
- raise ImportError("`openai` not installed")
14
-
15
-
16
- class AzureOpenAIEmbedder(Embedder):
17
- id: str = "text-embedding-3-small" # This has to match the model that you deployed at the provided URL
18
-
19
- dimensions: int = 1536
20
- encoding_format: Literal["float", "base64"] = "float"
21
- user: Optional[str] = None
22
- api_key: Optional[str] = getenv("AZURE_EMBEDDER_OPENAI_API_KEY")
23
- api_version: str = getenv("AZURE_EMBEDDER_OPENAI_API_VERSION", "2024-10-21")
24
- azure_endpoint: Optional[str] = getenv("AZURE_EMBEDDER_OPENAI_ENDPOINT")
25
- azure_deployment: Optional[str] = getenv("AZURE_EMBEDDER_DEPLOYMENT")
26
- base_url: Optional[str] = None
27
- azure_ad_token: Optional[str] = None
28
- azure_ad_token_provider: Optional[Any] = None
29
- organization: Optional[str] = None
30
- request_params: Optional[Dict[str, Any]] = None
31
- client_params: Optional[Dict[str, Any]] = None
32
- openai_client: Optional[AzureOpenAIClient] = None
33
-
34
- @property
35
- def client(self) -> AzureOpenAIClient:
36
- if self.openai_client:
37
- return self.openai_client
38
-
39
- _client_params: Dict[str, Any] = {}
40
- if self.api_key:
41
- _client_params["api_key"] = self.api_key
42
- if self.api_version:
43
- _client_params["api_version"] = self.api_version
44
- if self.organization:
45
- _client_params["organization"] = self.organization
46
- if self.azure_endpoint:
47
- _client_params["azure_endpoint"] = self.azure_endpoint
48
- if self.azure_deployment:
49
- _client_params["azure_deployment"] = self.azure_deployment
50
- if self.base_url:
51
- _client_params["base_url"] = self.base_url
52
- if self.azure_ad_token:
53
- _client_params["azure_ad_token"] = self.azure_ad_token
54
- if self.azure_ad_token_provider:
55
- _client_params["azure_ad_token_provider"] = self.azure_ad_token_provider
56
- return AzureOpenAIClient(**_client_params)
57
-
58
- def _response(self, text: str) -> CreateEmbeddingResponse:
59
- _request_params: Dict[str, Any] = {
60
- "input": text,
61
- "model": self.id,
62
- "encoding_format": self.encoding_format,
63
- }
64
- if self.user is not None:
65
- _request_params["user"] = self.user
66
- if self.id.startswith("text-embedding-3"):
67
- _request_params["dimensions"] = self.dimensions
68
- if self.request_params:
69
- _request_params.update(self.request_params)
70
-
71
- return self.client.embeddings.create(**_request_params)
72
-
73
- def get_embedding(self, text: str) -> List[float]:
74
- response: CreateEmbeddingResponse = self._response(text=text)
75
- try:
76
- return response.data[0].embedding
77
- except Exception as e:
78
- logger.warning(e)
79
- return []
80
-
81
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
82
- response: CreateEmbeddingResponse = self._response(text=text)
83
-
84
- embedding = response.data[0].embedding
85
- usage = response.usage
86
- return embedding, usage.model_dump()
agno/embedder/cohere.py DELETED
@@ -1,72 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Any, Dict, List, Optional, Tuple, Union
3
-
4
- from agno.embedder.base import Embedder
5
- from agno.utils.log import logger
6
-
7
- try:
8
- from cohere import Client as CohereClient
9
- from cohere.types.embed_response import EmbeddingsByTypeEmbedResponse, EmbeddingsFloatsEmbedResponse
10
- except ImportError:
11
- raise ImportError("`cohere` not installed. Please install using `pip install cohere`.")
12
-
13
-
14
- @dataclass
15
- class CohereEmbedder(Embedder):
16
- id: str = "embed-english-v3.0"
17
- input_type: str = "search_query"
18
- embedding_types: Optional[List[str]] = None
19
- api_key: Optional[str] = None
20
- request_params: Optional[Dict[str, Any]] = None
21
- client_params: Optional[Dict[str, Any]] = None
22
- cohere_client: Optional[CohereClient] = None
23
-
24
- @property
25
- def client(self) -> CohereClient:
26
- if self.cohere_client:
27
- return self.cohere_client
28
- client_params: Dict[str, Any] = {}
29
- if self.api_key:
30
- client_params["api_key"] = self.api_key
31
- return CohereClient(**client_params)
32
-
33
- def response(self, text: str) -> Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse]:
34
- request_params: Dict[str, Any] = {}
35
-
36
- if self.id:
37
- request_params["model"] = self.id
38
- if self.input_type:
39
- request_params["input_type"] = self.input_type
40
- if self.embedding_types:
41
- request_params["embedding_types"] = self.embedding_types
42
- if self.request_params:
43
- request_params.update(self.request_params)
44
- return self.client.embed(texts=[text], **request_params)
45
-
46
- def get_embedding(self, text: str) -> List[float]:
47
- response: Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse] = self.response(text=text)
48
- try:
49
- if isinstance(response, EmbeddingsFloatsEmbedResponse):
50
- return response.embeddings[0]
51
- elif isinstance(response, EmbeddingsByTypeEmbedResponse):
52
- return response.embeddings.float_[0] if response.embeddings.float_ else []
53
- else:
54
- logger.warning("No embeddings found")
55
- return []
56
- except Exception as e:
57
- logger.warning(e)
58
- return []
59
-
60
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict[str, Any]]]:
61
- response: Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse] = self.response(text=text)
62
-
63
- embedding: List[float] = []
64
- if isinstance(response, EmbeddingsFloatsEmbedResponse):
65
- embedding = response.embeddings[0]
66
- elif isinstance(response, EmbeddingsByTypeEmbedResponse):
67
- embedding = response.embeddings.float_[0] if response.embeddings.float_ else []
68
-
69
- usage = response.meta.billed_units if response.meta else None
70
- if usage:
71
- return embedding, usage.model_dump()
72
- return embedding, None
@@ -1,37 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Dict, List, Optional, Tuple
3
-
4
- from agno.embedder.base import Embedder
5
- from agno.utils.log import logger
6
-
7
- try:
8
- from fastembed import TextEmbedding # type: ignore
9
-
10
- except ImportError:
11
- raise ImportError("fastembed not installed, use pip install fastembed")
12
-
13
-
14
- @dataclass
15
- class FastEmbedEmbedder(Embedder):
16
- """Using BAAI/bge-small-en-v1.5 model, more models available: https://qdrant.github.io/fastembed/examples/Supported_Models/"""
17
-
18
- id: str = "BAAI/bge-small-en-v1.5"
19
- dimensions: int = 384
20
-
21
- def get_embedding(self, text: str) -> List[float]:
22
- model = TextEmbedding(model_name=self.id)
23
- embeddings = model.embed(text)
24
- embedding_list = list(embeddings)
25
-
26
- try:
27
- return embedding_list
28
- except Exception as e:
29
- logger.warning(e)
30
- return []
31
-
32
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
33
- embedding = self.get_embedding(text=text)
34
- # Currently, FastEmbed does not provide usage information
35
- usage = None
36
-
37
- return embedding, usage
agno/embedder/google.py DELETED
@@ -1,73 +0,0 @@
1
- from dataclasses import dataclass
2
- from os import getenv
3
- from types import ModuleType
4
- from typing import Any, Dict, List, Optional, Tuple, Union
5
-
6
- from agno.embedder.base import Embedder
7
- from agno.utils.log import logger
8
-
9
- try:
10
- import google.generativeai as genai
11
- from google.generativeai.types.text_types import BatchEmbeddingDict, EmbeddingDict
12
- except ImportError:
13
- logger.error("`google-generativeai` not installed. Please install it using `pip install google-generativeai`")
14
- raise
15
-
16
-
17
- @dataclass
18
- class GeminiEmbedder(Embedder):
19
- id: str = "models/text-embedding-004"
20
- task_type: str = "RETRIEVAL_QUERY"
21
- title: Optional[str] = None
22
- dimensions: Optional[int] = 768
23
- api_key: Optional[str] = None
24
- request_params: Optional[Dict[str, Any]] = None
25
- client_params: Optional[Dict[str, Any]] = None
26
- gemini_client: Optional[ModuleType] = None
27
-
28
- @property
29
- def client(self):
30
- if self.gemini_client:
31
- return self.gemini_client
32
- _client_params: Dict[str, Any] = {}
33
-
34
- self.api_key = self.api_key or getenv("GOOGLE_API_KEY")
35
- if not self.api_key:
36
- logger.error("GOOGLE_API_KEY not set. Please set the GOOGLE_API_KEY environment variable.")
37
-
38
- if self.api_key:
39
- _client_params["api_key"] = self.api_key
40
- if self.client_params:
41
- _client_params.update(self.client_params)
42
- self.gemini_client = genai
43
- self.gemini_client.configure(**_client_params) # type: ignore
44
- return self.gemini_client
45
-
46
- def _response(self, text: str) -> Union[EmbeddingDict, BatchEmbeddingDict]:
47
- _request_params: Dict[str, Any] = {
48
- "content": text,
49
- "model": self.id,
50
- "output_dimensionality": self.dimensions,
51
- "task_type": self.task_type,
52
- "title": self.title,
53
- }
54
- if self.request_params:
55
- _request_params.update(self.request_params)
56
- return self.client.embed_content(**_request_params)
57
-
58
- def get_embedding(self, text: str) -> List[float]:
59
- response = self._response(text=text)
60
- try:
61
- return response.get("embedding", [])
62
- except Exception as e:
63
- logger.warning(e)
64
- return []
65
-
66
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
67
- response = self._response(text=text)
68
- usage = None
69
- try:
70
- return response.get("embedding", []), usage
71
- except Exception as e:
72
- logger.warning(e)
73
- return [], usage