agno 2.2.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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -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 +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -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 +1335 -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 +1160 -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 +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
agno/tools/serper.py ADDED
@@ -0,0 +1,255 @@
1
+ import json
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ import requests
6
+
7
+ from agno.tools import Toolkit
8
+ from agno.utils.log import log_debug, log_error, log_warning
9
+
10
+
11
+ class SerperTools(Toolkit):
12
+ def __init__(
13
+ self,
14
+ api_key: Optional[str] = None,
15
+ location: str = "us",
16
+ language: str = "en",
17
+ num_results: int = 10,
18
+ date_range: Optional[str] = None,
19
+ enable_search: bool = True,
20
+ enable_search_news: bool = True,
21
+ enable_search_scholar: bool = True,
22
+ enable_scrape_webpage: bool = True,
23
+ all: bool = False,
24
+ **kwargs,
25
+ ):
26
+ """
27
+ Initialize the SerperTools.
28
+
29
+ Args:
30
+ api_key Optional[str]: The Serper API key.
31
+ location Optional[str]: The Google location code for search results.
32
+ language Optional[str]: The language code for search results.
33
+ num_results Optional[int]: The number of search results to retrieve.
34
+ date_range Optional[str]: Default date range filter for searches.
35
+ """
36
+ self.api_key = api_key or getenv("SERPER_API_KEY")
37
+ if not self.api_key:
38
+ log_debug("No Serper API key provided")
39
+
40
+ self.location = location
41
+ self.language = language
42
+ self.num_results = num_results
43
+ self.date_range = date_range
44
+
45
+ tools: List[Any] = []
46
+ if all or enable_search:
47
+ tools.append(self.search_web)
48
+ if all or enable_search_news:
49
+ tools.append(self.search_news)
50
+ if all or enable_search_scholar:
51
+ tools.append(self.search_scholar)
52
+ if all or enable_scrape_webpage:
53
+ tools.append(self.scrape_webpage)
54
+
55
+ super().__init__(name="serper_tools", tools=tools, **kwargs)
56
+
57
+ def _make_request(self, endpoint: str, params: Dict[str, Any]) -> Dict[str, Any]:
58
+ """
59
+ Makes a request to the Serper API.
60
+
61
+ Args:
62
+ endpoint (str): The API endpoint
63
+ params (Dict[str, Any]): Request parameters
64
+
65
+ Returns:
66
+ Dict[str, Any]: Search response
67
+ """
68
+ try:
69
+ if not self.api_key:
70
+ log_error("No Serper API key provided")
71
+ return {"success": False, "error": "Please provide a Serper API key"}
72
+
73
+ url = f"https://google.serper.dev/{endpoint}"
74
+ if endpoint == "scrape":
75
+ url = "https://scrape.serper.dev"
76
+
77
+ headers = {"X-API-KEY": self.api_key, "Content-Type": "application/json"}
78
+
79
+ # Add optional parameters
80
+ if self.date_range:
81
+ params["tbs"] = self.date_range
82
+ if self.location:
83
+ params["gl"] = self.location
84
+
85
+ if self.language:
86
+ params["hl"] = self.language
87
+
88
+ payload = json.dumps(params)
89
+
90
+ log_debug(f"Making request to {url} with params: {params}")
91
+ response = requests.request("POST", url, headers=headers, data=payload)
92
+ response.raise_for_status()
93
+
94
+ log_debug(f"Successfully received response from {endpoint} endpoint")
95
+ return {"success": True, "data": response.json(), "raw_response": response.text}
96
+ except Exception as e:
97
+ log_error(f"Serper API error: {str(e)}")
98
+ return {"success": False, "error": str(e)}
99
+
100
+ def search_web(
101
+ self,
102
+ query: str,
103
+ num_results: Optional[int] = None,
104
+ ) -> str:
105
+ """
106
+ Searches Google for the provided query using the Serper API.
107
+
108
+ Args:
109
+ query (str): The search query to search for on Google.
110
+ num_results (int, optional): Number of search results to retrieve.
111
+
112
+ Returns:
113
+ str: A JSON-formatted string containing the search results or an error message if the search fails.
114
+ """
115
+ try:
116
+ if not query:
117
+ return json.dumps({"error": "Please provide a query to search for"}, indent=2)
118
+
119
+ log_debug(f"Searching Google for: {query}")
120
+
121
+ params = {
122
+ "q": query,
123
+ "num": num_results or self.num_results,
124
+ }
125
+
126
+ result = self._make_request("search", params)
127
+
128
+ if result["success"]:
129
+ log_debug(f"Successfully found Google search results for query: {query}")
130
+ return result["raw_response"]
131
+ else:
132
+ log_error(f"Error searching Google for query {query}: {result['error']}")
133
+ return json.dumps({"error": result["error"]}, indent=2)
134
+
135
+ except Exception as e:
136
+ log_error(f"Unexpected error searching Google for query {query}: {e}")
137
+ return json.dumps({"error": f"An unexpected error occurred: {str(e)}"}, indent=2)
138
+
139
+ def search_news(
140
+ self,
141
+ query: str,
142
+ num_results: Optional[int] = None,
143
+ ) -> str:
144
+ """
145
+ Searches for news articles using the Serper News API.
146
+
147
+ Args:
148
+ query (str): The search query for news articles.
149
+ num_results (int, optional): Number of news results to retrieve.
150
+
151
+ Returns:
152
+ str: A JSON-formatted string containing the news search results or an error message.
153
+ """
154
+ try:
155
+ if not query:
156
+ return json.dumps({"error": "Please provide a query to search for news"}, indent=2)
157
+
158
+ log_debug(f"Searching news for: {query}")
159
+
160
+ params = {
161
+ "q": query,
162
+ "num": num_results or self.num_results,
163
+ }
164
+
165
+ result = self._make_request("news", params)
166
+
167
+ if result["success"]:
168
+ log_debug(f"Successfully found {num_results or self.num_results} news articles for query: {query}")
169
+ return result["raw_response"]
170
+ else:
171
+ log_error(f"Error searching news for query {query}: {result['error']}")
172
+ return json.dumps({"error": result["error"]}, indent=2)
173
+
174
+ except Exception as e:
175
+ log_error(f"Unexpected error searching news for query {query}: {e}")
176
+ return json.dumps({"error": f"An unexpected error occurred: {str(e)}"}, indent=2)
177
+
178
+ def search_scholar(
179
+ self,
180
+ query: str,
181
+ num_results: Optional[int] = None,
182
+ ) -> str:
183
+ """
184
+ Searches for academic papers using Google Scholar via Serper API.
185
+
186
+ Args:
187
+ query (str): The search query for academic papers.
188
+ num_results (int, optional): Number of academic papers to retrieve.
189
+
190
+ Returns:
191
+ str: A JSON-formatted string containing the scholar search results or an error message.
192
+ """
193
+ try:
194
+ if not query:
195
+ return json.dumps({"error": "Please provide a query to search for academic papers"}, indent=2)
196
+
197
+ log_debug(f"Searching scholar for: {query}")
198
+
199
+ params = {
200
+ "q": query,
201
+ "num": num_results or self.num_results,
202
+ }
203
+
204
+ result = self._make_request("scholar", params)
205
+
206
+ if result["success"]:
207
+ log_debug(f"Successfully found academic papers for query: {query}")
208
+ return result["raw_response"]
209
+ else:
210
+ log_error(f"Error searching scholar for query {query}: {result['error']}")
211
+ return json.dumps({"error": result["error"]}, indent=2)
212
+
213
+ except Exception as e:
214
+ log_error(f"Unexpected error searching scholar for query {query}: {e}")
215
+ return json.dumps({"error": f"An unexpected error occurred: {str(e)}"}, indent=2)
216
+
217
+ def scrape_webpage(
218
+ self,
219
+ url: str,
220
+ markdown: bool = False,
221
+ ) -> str:
222
+ """
223
+ Scrapes and extracts content from a webpage using the Serper scraping API.
224
+
225
+ Args:
226
+ url (str): The URL of the webpage to scrape.
227
+ markdown (bool, optional): Return content in markdown format (default: False).
228
+
229
+ Returns:
230
+ str: A JSON-formatted string containing the scraped webpage content or an error message.
231
+ """
232
+ try:
233
+ if not url:
234
+ log_warning("No URL provided to scrape")
235
+ return json.dumps({"error": "Please provide a URL to scrape"}, indent=2)
236
+
237
+ log_debug(f"Scraping webpage: {url}")
238
+
239
+ params = {
240
+ "url": url,
241
+ "includeMarkdown": markdown,
242
+ }
243
+
244
+ result = self._make_request("scrape", params)
245
+
246
+ if result["success"]:
247
+ log_debug(f"Successfully scraped webpage: {url}")
248
+ return result["raw_response"]
249
+ else:
250
+ log_error(f"Error scraping webpage {url}: {result['error']}")
251
+ return json.dumps({"error": result["error"]}, indent=2)
252
+
253
+ except Exception as e:
254
+ log_error(f"Unexpected error scraping webpage {url}: {e}")
255
+ return json.dumps({"error": f"An unexpected error occurred: {str(e)}"}, indent=2)
agno/tools/shell.py ADDED
@@ -0,0 +1,53 @@
1
+ from pathlib import Path
2
+ from typing import List, Optional, Union
3
+
4
+ from agno.tools import Toolkit
5
+ from agno.utils.log import log_debug, log_info, logger
6
+
7
+
8
+ class ShellTools(Toolkit):
9
+ def __init__(
10
+ self,
11
+ base_dir: Optional[Union[Path, str]] = None,
12
+ enable_run_shell_command: bool = True,
13
+ all: bool = False,
14
+ **kwargs,
15
+ ):
16
+ self.base_dir: Optional[Path] = None
17
+ if base_dir is not None:
18
+ self.base_dir = Path(base_dir) if isinstance(base_dir, str) else base_dir
19
+
20
+ tools = []
21
+ if all or enable_run_shell_command:
22
+ tools.append(self.run_shell_command)
23
+
24
+ super().__init__(name="shell_tools", tools=tools, **kwargs)
25
+
26
+ def run_shell_command(self, args: List[str], tail: int = 100) -> str:
27
+ """Runs a shell command and returns the output or error.
28
+
29
+ Args:
30
+ args (List[str]): The command to run as a list of strings.
31
+ tail (int): The number of lines to return from the output.
32
+
33
+ Returns:
34
+ str: The output of the command.
35
+ """
36
+ import subprocess
37
+
38
+ try:
39
+ log_info(f"Running shell command: {args}")
40
+ result = subprocess.run(
41
+ args,
42
+ capture_output=True,
43
+ text=True,
44
+ cwd=str(self.base_dir) if self.base_dir else None,
45
+ )
46
+ log_debug(f"Result: {result}")
47
+ log_debug(f"Return code: {result.returncode}")
48
+ if result.returncode != 0:
49
+ return f"Error: {result.stderr}"
50
+ return "\n".join(result.stdout.split("\n")[-tail:])
51
+ except Exception as e:
52
+ logger.warning(f"Failed to run shell command: {e}")
53
+ return f"Error: {e}"
agno/tools/slack.py ADDED
@@ -0,0 +1,136 @@
1
+ import json
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional
4
+
5
+ from agno.tools import Toolkit
6
+ from agno.utils.log import logger
7
+
8
+ try:
9
+ from slack_sdk import WebClient
10
+ from slack_sdk.errors import SlackApiError
11
+ except ImportError:
12
+ raise ImportError("Slack tools require the `slack_sdk` package. Run `pip install slack-sdk` to install it.")
13
+
14
+
15
+ class SlackTools(Toolkit):
16
+ def __init__(
17
+ self,
18
+ token: Optional[str] = None,
19
+ markdown: bool = True,
20
+ enable_send_message: bool = True,
21
+ enable_send_message_thread: bool = True,
22
+ enable_list_channels: bool = True,
23
+ enable_get_channel_history: bool = True,
24
+ all: bool = False,
25
+ **kwargs,
26
+ ):
27
+ """
28
+ Initialize the SlackTools class.
29
+ Args:
30
+ token: The Slack API token. Defaults to the SLACK_TOKEN environment variable.
31
+ markdown: Whether to enable Slack markdown formatting. Defaults to True.
32
+ enable_send_message: Whether to enable the send_message tool. Defaults to True.
33
+ enable_send_message_thread: Whether to enable the send_message_thread tool. Defaults to True.
34
+ enable_list_channels: Whether to enable the list_channels tool. Defaults to True.
35
+ enable_get_channel_history: Whether to enable the get_channel_history tool. Defaults to True.
36
+ all: Whether to enable all tools. Defaults to False.
37
+ """
38
+ self.token: Optional[str] = token or getenv("SLACK_TOKEN")
39
+ if self.token is None or self.token == "":
40
+ raise ValueError("SLACK_TOKEN is not set")
41
+ self.client = WebClient(token=self.token)
42
+ self.markdown = markdown
43
+
44
+ tools: List[Any] = []
45
+ if enable_send_message or all:
46
+ tools.append(self.send_message)
47
+ if enable_send_message_thread or all:
48
+ tools.append(self.send_message_thread)
49
+ if enable_list_channels or all:
50
+ tools.append(self.list_channels)
51
+ if enable_get_channel_history or all:
52
+ tools.append(self.get_channel_history)
53
+
54
+ super().__init__(name="slack", tools=tools, **kwargs)
55
+
56
+ def send_message(self, channel: str, text: str) -> str:
57
+ """
58
+ Send a message to a Slack channel.
59
+
60
+ Args:
61
+ channel (str): The channel ID or name to send the message to.
62
+ text (str): The text of the message to send.
63
+
64
+ Returns:
65
+ str: A JSON string containing the response from the Slack API.
66
+ """
67
+ try:
68
+ response = self.client.chat_postMessage(channel=channel, text=text, mrkdwn=self.markdown)
69
+ return json.dumps(response.data)
70
+ except SlackApiError as e:
71
+ logger.error(f"Error sending message: {e}")
72
+ return json.dumps({"error": str(e)})
73
+
74
+ def send_message_thread(self, channel: str, text: str, thread_ts: str) -> str:
75
+ """
76
+ Send a message to a Slack channel.
77
+
78
+ Args:
79
+ channel (str): The channel ID or name to send the message to.
80
+ text (str): The text of the message to send.
81
+ thread_ts (ts): The thread to reply to.
82
+
83
+ Returns:
84
+ str: A JSON string containing the response from the Slack API.
85
+ """
86
+ try:
87
+ response = self.client.chat_postMessage(
88
+ channel=channel, text=text, thread_ts=thread_ts, mrkdwn=self.markdown
89
+ )
90
+ return json.dumps(response.data)
91
+ except SlackApiError as e:
92
+ logger.error(f"Error sending message: {e}")
93
+ return json.dumps({"error": str(e)})
94
+
95
+ def list_channels(self) -> str:
96
+ """
97
+ List all channels in the Slack workspace.
98
+
99
+ Returns:
100
+ str: A JSON string containing the list of channels.
101
+ """
102
+ try:
103
+ response = self.client.conversations_list()
104
+ channels = [{"id": channel["id"], "name": channel["name"]} for channel in response["channels"]]
105
+ return json.dumps(channels)
106
+ except SlackApiError as e:
107
+ logger.error(f"Error listing channels: {e}")
108
+ return json.dumps({"error": str(e)})
109
+
110
+ def get_channel_history(self, channel: str, limit: int = 100) -> str:
111
+ """
112
+ Get the message history of a Slack channel.
113
+
114
+ Args:
115
+ channel (str): The channel ID to fetch history from.
116
+ limit (int): The maximum number of messages to fetch. Defaults to 100.
117
+
118
+ Returns:
119
+ str: A JSON string containing the channel's message history.
120
+ """
121
+ try:
122
+ response = self.client.conversations_history(channel=channel, limit=limit)
123
+ messages: List[Dict[str, Any]] = [ # type: ignore
124
+ {
125
+ "text": msg.get("text", ""),
126
+ "user": "webhook" if msg.get("subtype") == "bot_message" else msg.get("user", "unknown"),
127
+ "ts": msg.get("ts", ""),
128
+ "sub_type": msg.get("subtype", "unknown"),
129
+ "attachments": msg.get("attachments", []) if msg.get("subtype") == "bot_message" else "n/a",
130
+ }
131
+ for msg in response.get("messages", [])
132
+ ]
133
+ return json.dumps(messages)
134
+ except SlackApiError as e:
135
+ logger.error(f"Error getting channel history: {e}")
136
+ return json.dumps({"error": str(e)})
agno/tools/sleep.py ADDED
@@ -0,0 +1,20 @@
1
+ import time
2
+
3
+ from agno.tools import Toolkit
4
+ from agno.utils.log import log_info
5
+
6
+
7
+ class SleepTools(Toolkit):
8
+ def __init__(self, enable_sleep: bool = True, all: bool = False, **kwargs):
9
+ tools = []
10
+ if all or enable_sleep:
11
+ tools.append(self.sleep)
12
+
13
+ super().__init__(name="sleep", tools=tools, **kwargs)
14
+
15
+ def sleep(self, seconds: int) -> str:
16
+ """Use this function to sleep for a given number of seconds."""
17
+ log_info(f"Sleeping for {seconds} seconds")
18
+ time.sleep(seconds)
19
+ log_info(f"Awake after {seconds} seconds")
20
+ return f"Slept for {seconds} seconds"
agno/tools/spider.py ADDED
@@ -0,0 +1,116 @@
1
+ import json
2
+
3
+ try:
4
+ from spider import Spider as ExternalSpider
5
+ except ImportError:
6
+ raise ImportError("`spider-client` not installed. Please install using `pip install spider-client`")
7
+
8
+ from typing import Any, List, Optional
9
+
10
+ from agno.tools import Toolkit
11
+ from agno.utils.log import log_info, logger
12
+
13
+
14
+ class SpiderTools(Toolkit):
15
+ """
16
+ Spider is a toolkit for web searching, scraping, and crawling.
17
+
18
+ Args:
19
+ enable_search (bool): Enable web search functionality. Default is True.
20
+ enable_scrape (bool): Enable web scraping functionality. Default is True.
21
+ enable_crawl (bool): Enable web crawling functionality. Default is True.
22
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
23
+ max_results (Optional[int]): Default maximum number of results.
24
+ url (Optional[str]): Default URL for operations.
25
+ optional_params (Optional[dict]): Additional parameters for operations.
26
+ """
27
+
28
+ def __init__(
29
+ self,
30
+ max_results: Optional[int] = None,
31
+ url: Optional[str] = None,
32
+ optional_params: Optional[dict] = None,
33
+ enable_search: bool = True,
34
+ enable_scrape: bool = True,
35
+ enable_crawl: bool = True,
36
+ all: bool = False,
37
+ **kwargs,
38
+ ):
39
+ self.max_results = max_results
40
+ self.url = url
41
+ self.optional_params = optional_params or {}
42
+
43
+ tools: List[Any] = []
44
+ if enable_search or all:
45
+ tools.append(self.search_web)
46
+ if enable_scrape or all:
47
+ tools.append(self.scrape)
48
+ if enable_crawl or all:
49
+ tools.append(self.crawl)
50
+
51
+ super().__init__(name="spider", tools=tools, **kwargs)
52
+
53
+ def search_web(self, query: str, max_results: int = 5) -> str:
54
+ """Use this function to search the web.
55
+ Args:
56
+ query (str): The query to search the web with.
57
+ max_results (int, optional): The maximum number of results to return. Defaults to 5.
58
+ Returns:
59
+ The results of the search.
60
+ """
61
+ max_results = self.max_results or max_results
62
+ return self._search(query, max_results=max_results)
63
+
64
+ def scrape(self, url: str) -> str:
65
+ """Use this function to scrape the content of a webpage.
66
+ Args:
67
+ url (str): The URL of the webpage to scrape.
68
+ Returns:
69
+ Markdown of the webpage.
70
+ """
71
+ return self._scrape(url)
72
+
73
+ def crawl(self, url: str, limit: Optional[int] = None) -> str:
74
+ """Use this function to crawl the web.
75
+ Args:
76
+ url (str): The URL of the webpage to crawl.
77
+ limit (int, optional): The maximum number of pages to crawl. Defaults to 10.
78
+ Returns:
79
+ The results of the crawl.
80
+ """
81
+ return self._crawl(url, limit=limit)
82
+
83
+ def _search(self, query: str, max_results: int = 1) -> str:
84
+ app = ExternalSpider()
85
+ log_info(f"Fetching results from spider for query: {query} with max_results: {max_results}")
86
+ try:
87
+ options = {"fetch_page_content": False, "num": max_results, **self.optional_params}
88
+ results = app.search(query, options)
89
+ return json.dumps(results)
90
+ except Exception as e:
91
+ logger.error(f"Error fetching results from spider: {e}")
92
+ return f"Error fetching results from spider: {e}"
93
+
94
+ def _scrape(self, url: str) -> str:
95
+ app = ExternalSpider()
96
+ log_info(f"Fetching content from spider for url: {url}")
97
+ try:
98
+ options = {"return_format": "markdown", **self.optional_params}
99
+ results = app.scrape_url(url, options)
100
+ return json.dumps(results)
101
+ except Exception as e:
102
+ logger.error(f"Error fetching content from spider: {e}")
103
+ return f"Error fetching content from spider: {e}"
104
+
105
+ def _crawl(self, url: str, limit: Optional[int] = None) -> str:
106
+ app = ExternalSpider()
107
+ log_info(f"Fetching content from spider for url: {url}")
108
+ try:
109
+ if limit is None:
110
+ limit = 10
111
+ options = {"return_format": "markdown", "limit": limit, **self.optional_params}
112
+ results = app.crawl_url(url, options)
113
+ return json.dumps(results)
114
+ except Exception as e:
115
+ logger.error(f"Error fetching content from spider: {e}")
116
+ return f"Error fetching content from spider: {e}"