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
agno/knowledge/s3/base.py DELETED
@@ -1,60 +0,0 @@
1
- from typing import Iterator, List, Optional
2
-
3
- from agno.aws.resource.s3.bucket import S3Bucket # type: ignore
4
- from agno.aws.resource.s3.object import S3Object # type: ignore
5
- from agno.document import Document
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class S3KnowledgeBase(AgentKnowledge):
10
- # Provide either bucket or bucket_name
11
- bucket: Optional[S3Bucket] = None
12
- bucket_name: Optional[str] = None
13
-
14
- # Provide either object or key
15
- key: Optional[str] = None
16
- object: Optional[S3Object] = None
17
-
18
- # Filter objects by prefix
19
- # Ignored if object or key is provided
20
- prefix: Optional[str] = None
21
-
22
- @property
23
- def document_lists(self) -> Iterator[List[Document]]:
24
- raise NotImplementedError
25
-
26
- @property
27
- def s3_objects(self) -> List[S3Object]:
28
- """Iterate over PDFs in a s3 bucket and yield lists of documents.
29
- Each object yielded by the iterator is a list of documents.
30
-
31
- Returns:
32
- Iterator[List[Document]]: Iterator yielding list of documents
33
- """
34
-
35
- s3_objects_to_read: List[S3Object] = []
36
-
37
- if self.bucket is None and self.bucket_name is None:
38
- raise ValueError("No bucket or bucket_name provided")
39
-
40
- if self.bucket is not None and self.bucket_name is not None:
41
- raise ValueError("Provide either bucket or bucket_name")
42
-
43
- if self.object is not None and self.key is not None:
44
- raise ValueError("Provide either object or key")
45
-
46
- if self.bucket_name is not None:
47
- self.bucket = S3Bucket(name=self.bucket_name)
48
-
49
- if self.bucket is not None:
50
- if self.key is not None:
51
- _object = S3Object(bucket_name=self.bucket.name, name=self.key)
52
- s3_objects_to_read.append(_object)
53
- elif self.object is not None:
54
- s3_objects_to_read.append(self.object)
55
- elif self.prefix is not None:
56
- s3_objects_to_read.extend(self.bucket.get_objects(prefix=self.prefix))
57
- else:
58
- s3_objects_to_read.extend(self.bucket.get_objects())
59
-
60
- return s3_objects_to_read
agno/knowledge/s3/pdf.py DELETED
@@ -1,21 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.s3.pdf_reader import S3PDFReader
5
- from agno.knowledge.s3.base import S3KnowledgeBase
6
-
7
-
8
- class S3PDFKnowledgeBase(S3KnowledgeBase):
9
- reader: S3PDFReader = S3PDFReader()
10
-
11
- @property
12
- def document_lists(self) -> Iterator[List[Document]]:
13
- """Iterate over PDFs in a s3 bucket and yield lists of documents.
14
- Each object yielded by the iterator is a list of documents.
15
-
16
- Returns:
17
- Iterator[List[Document]]: Iterator yielding list of documents
18
- """
19
- for s3_object in self.s3_objects:
20
- if s3_object.name.endswith(".pdf"):
21
- yield self.reader.read(s3_object=s3_object)
agno/knowledge/s3/text.py DELETED
@@ -1,23 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.s3.text_reader import S3TextReader
5
- from agno.knowledge.s3.base import S3KnowledgeBase
6
-
7
-
8
- class S3TextKnowledgeBase(S3KnowledgeBase):
9
- formats: List[str] = [".doc", ".docx"]
10
- reader: S3TextReader = S3TextReader()
11
-
12
- @property
13
- def document_lists(self) -> Iterator[List[Document]]:
14
- """Iterate over text files in a s3 bucket and yield lists of documents.
15
- Each object yielded by the iterator is a list of documents.
16
-
17
- Returns:
18
- Iterator[List[Document]]: Iterator yielding list of documents
19
- """
20
-
21
- for s3_object in self.s3_objects:
22
- if s3_object.name.endswith(tuple(self.formats)):
23
- yield self.reader.read(s3_object=s3_object)
agno/knowledge/text.py DELETED
@@ -1,30 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List, Union
3
-
4
- from agno.document import Document
5
- from agno.document.reader.text_reader import TextReader
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class TextKnowledgeBase(AgentKnowledge):
10
- path: Union[str, Path]
11
- formats: List[str] = [".txt"]
12
- reader: TextReader = TextReader()
13
-
14
- @property
15
- def document_lists(self) -> Iterator[List[Document]]:
16
- """Iterate over text files and yield lists of documents.
17
- Each object yielded by the iterator is a list of documents.
18
-
19
- Returns:
20
- Iterator[List[Document]]: Iterator yielding list of documents
21
- """
22
-
23
- _file_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
24
-
25
- if _file_path.exists() and _file_path.is_dir():
26
- for _file in _file_path.glob("**/*"):
27
- if _file.suffix in self.formats:
28
- yield self.reader.read(file=_file)
29
- elif _file_path.exists() and _file_path.is_file() and _file_path.suffix in self.formats:
30
- yield self.reader.read(file=_file_path)
agno/knowledge/website.py DELETED
@@ -1,88 +0,0 @@
1
- from typing import Any, Dict, Iterator, List, Optional
2
-
3
- from pydantic import model_validator
4
-
5
- from agno.document import Document
6
- from agno.document.reader.website_reader import WebsiteReader
7
- from agno.knowledge.agent import AgentKnowledge
8
- from agno.utils.log import logger
9
-
10
-
11
- class WebsiteKnowledgeBase(AgentKnowledge):
12
- urls: List[str] = []
13
- reader: Optional[WebsiteReader] = None
14
-
15
- # WebsiteReader parameters
16
- max_depth: int = 3
17
- max_links: int = 10
18
-
19
- @model_validator(mode="after")
20
- def set_reader(self) -> "WebsiteKnowledgeBase":
21
- if self.reader is None:
22
- self.reader = WebsiteReader(max_depth=self.max_depth, max_links=self.max_links)
23
- return self
24
-
25
- @property
26
- def document_lists(self) -> Iterator[List[Document]]:
27
- """Iterate over urls and yield lists of documents.
28
- Each object yielded by the iterator is a list of documents.
29
-
30
- Returns:
31
- Iterator[List[Document]]: Iterator yielding list of documents
32
- """
33
- if self.reader is not None:
34
- for _url in self.urls:
35
- yield self.reader.read(url=_url)
36
-
37
- def load(
38
- self,
39
- recreate: bool = False,
40
- upsert: bool = True,
41
- skip_existing: bool = True,
42
- filters: Optional[Dict[str, Any]] = None,
43
- ) -> None:
44
- """Load the website contents to the vector db"""
45
-
46
- if self.vector_db is None:
47
- logger.warning("No vector db provided")
48
- return
49
-
50
- if self.reader is None:
51
- logger.warning("No reader provided")
52
- return
53
-
54
- if recreate:
55
- logger.debug("Dropping collection")
56
- self.vector_db.drop()
57
-
58
- logger.debug("Creating collection")
59
- self.vector_db.create()
60
-
61
- logger.info("Loading knowledge base")
62
- num_documents = 0
63
-
64
- # Given that the crawler needs to parse the URL before existence can be checked
65
- # We check if the website url exists in the vector db if recreate is False
66
- urls_to_read = self.urls.copy()
67
- if not recreate:
68
- for url in urls_to_read:
69
- logger.debug(f"Checking if {url} exists in the vector db")
70
- if self.vector_db.name_exists(name=url):
71
- logger.debug(f"Skipping {url} as it exists in the vector db")
72
- urls_to_read.remove(url)
73
-
74
- for url in urls_to_read:
75
- document_list = self.reader.read(url=url)
76
- # Filter out documents which already exist in the vector db
77
- if not recreate:
78
- document_list = [document for document in document_list if not self.vector_db.doc_exists(document)]
79
- if upsert and self.vector_db.upsert_available():
80
- self.vector_db.upsert(documents=document_list, filters=filters)
81
- else:
82
- self.vector_db.insert(documents=document_list, filters=filters)
83
- num_documents += len(document_list)
84
- logger.info(f"Loaded {num_documents} documents to knowledge base")
85
-
86
- if self.optimize_on is not None and num_documents > self.optimize_on:
87
- logger.debug("Optimizing Vector DB")
88
- self.vector_db.optimize()
@@ -1,31 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
-
6
- try:
7
- import wikipedia # noqa: F401
8
- except ImportError:
9
- raise ImportError("The `wikipedia` package is not installed. Please install it via `pip install wikipedia`.")
10
-
11
-
12
- class WikipediaKnowledgeBase(AgentKnowledge):
13
- topics: List[str] = []
14
-
15
- @property
16
- def document_lists(self) -> Iterator[List[Document]]:
17
- """Iterate over urls and yield lists of documents.
18
- Each object yielded by the iterator is a list of documents.
19
-
20
- Returns:
21
- Iterator[List[Document]]: Iterator yielding list of documents
22
- """
23
-
24
- for topic in self.topics:
25
- yield [
26
- Document(
27
- name=topic,
28
- meta_data={"topic": topic},
29
- content=wikipedia.summary(topic),
30
- )
31
- ]
agno/knowledge/youtube.py DELETED
@@ -1,22 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.youtube_reader import YouTubeReader
5
- from agno.knowledge.agent import AgentKnowledge
6
-
7
-
8
- class YouTubeKnowledgeBase(AgentKnowledge):
9
- urls: List[str] = []
10
- reader: YouTubeReader = YouTubeReader()
11
-
12
- @property
13
- def document_lists(self) -> Iterator[List[Document]]:
14
- """Iterate over YouTube URLs and yield lists of documents.
15
- Each object yielded by the iterator is a list of documents.
16
-
17
- Returns:
18
- Iterator[List[Document]]: Iterator yielding list of documents
19
- """
20
-
21
- for url in self.urls:
22
- yield self.reader.read(video_url=url)
agno/memory/agent.py DELETED
@@ -1,392 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from enum import Enum
4
- from typing import Any, Dict, List, Optional, Tuple
5
-
6
- from pydantic import BaseModel, ConfigDict
7
-
8
- from agno.memory.classifier import MemoryClassifier
9
- from agno.memory.db import MemoryDb
10
- from agno.memory.manager import MemoryManager
11
- from agno.memory.memory import Memory
12
- from agno.memory.summarizer import MemorySummarizer
13
- from agno.memory.summary import SessionSummary
14
- from agno.models.message import Message
15
- from agno.run.response import RunResponse
16
- from agno.utils.log import logger
17
-
18
-
19
- class AgentRun(BaseModel):
20
- message: Optional[Message] = None
21
- messages: Optional[List[Message]] = None
22
- response: Optional[RunResponse] = None
23
-
24
- model_config = ConfigDict(arbitrary_types_allowed=True)
25
-
26
-
27
- class MemoryRetrieval(str, Enum):
28
- last_n = "last_n"
29
- first_n = "first_n"
30
- semantic = "semantic"
31
-
32
-
33
- class AgentMemory(BaseModel):
34
- # Runs between the user and agent
35
- runs: List[AgentRun] = []
36
- # List of messages sent to the model
37
- messages: List[Message] = []
38
- update_system_message_on_change: bool = False
39
-
40
- # Summary of the session
41
- summary: Optional[SessionSummary] = None
42
- # Create and store session summaries
43
- create_session_summary: bool = False
44
- # Update session summaries after each run
45
- update_session_summary_after_run: bool = True
46
- # Summarizer to generate session summaries
47
- summarizer: Optional[MemorySummarizer] = None
48
-
49
- # Create and store personalized memories for this user
50
- create_user_memories: bool = False
51
- # Update memories for the user after each run
52
- update_user_memories_after_run: bool = True
53
-
54
- # MemoryDb to store personalized memories
55
- db: Optional[MemoryDb] = None
56
- # User ID for the personalized memories
57
- user_id: Optional[str] = None
58
- retrieval: MemoryRetrieval = MemoryRetrieval.last_n
59
- memories: Optional[List[Memory]] = None
60
- num_memories: Optional[int] = None
61
- classifier: Optional[MemoryClassifier] = None
62
- manager: Optional[MemoryManager] = None
63
-
64
- # True when memory is being updated
65
- updating_memory: bool = False
66
-
67
- model_config = ConfigDict(arbitrary_types_allowed=True)
68
-
69
- def to_dict(self) -> Dict[str, Any]:
70
- _memory_dict = self.model_dump(
71
- exclude_none=True,
72
- include={
73
- "runs",
74
- "messages",
75
- "update_system_message_on_change",
76
- "create_session_summary",
77
- "update_session_summary_after_run",
78
- "create_user_memories",
79
- "update_user_memories_after_run",
80
- "user_id",
81
- "num_memories",
82
- },
83
- )
84
- # Add summary if it exists
85
- if self.summary is not None:
86
- _memory_dict["summary"] = self.summary.to_dict()
87
- # Add memories if they exist
88
- if self.memories is not None:
89
- _memory_dict["memories"] = [memory.to_dict() for memory in self.memories]
90
- return _memory_dict
91
-
92
- def add_run(self, agent_run: AgentRun) -> None:
93
- """Adds an AgentRun to the runs list."""
94
- self.runs.append(agent_run)
95
- logger.debug("Added AgentRun to AgentMemory")
96
-
97
- def add_system_message(self, message: Message, system_message_role: str = "system") -> None:
98
- """Add the system messages to the messages list"""
99
- # If this is the first run in the session, add the system message to the messages list
100
- if len(self.messages) == 0:
101
- if message is not None:
102
- self.messages.append(message)
103
- # If there are messages in the memory, check if the system message is already in the memory
104
- # If it is not, add the system message to the messages list
105
- # If it is, update the system message if content has changed and update_system_message_on_change is True
106
- else:
107
- system_message_index = next((i for i, m in enumerate(self.messages) if m.role == system_message_role), None)
108
- # Update the system message in memory if content has changed
109
- if system_message_index is not None:
110
- if (
111
- self.messages[system_message_index].content != message.content
112
- and self.update_system_message_on_change
113
- ):
114
- logger.info("Updating system message in memory with new content")
115
- self.messages[system_message_index] = message
116
- else:
117
- # Add the system message to the messages list
118
- self.messages.insert(0, message)
119
-
120
- def add_message(self, message: Message) -> None:
121
- """Add a Message to the messages list."""
122
- self.messages.append(message)
123
- logger.debug("Added Message to AgentMemory")
124
-
125
- def add_messages(self, messages: List[Message]) -> None:
126
- """Add a list of messages to the messages list."""
127
- self.messages.extend(messages)
128
- logger.debug(f"Added {len(messages)} Messages to AgentMemory")
129
-
130
- def get_messages(self) -> List[Dict[str, Any]]:
131
- """Returns the messages list as a list of dictionaries."""
132
- return [message.model_dump() for message in self.messages]
133
-
134
- def get_messages_from_last_n_runs(
135
- self, last_n: Optional[int] = None, skip_role: Optional[str] = None
136
- ) -> List[Message]:
137
- """Returns the messages from the last_n runs
138
-
139
- Args:
140
- last_n: The number of runs to return from the end of the conversation.
141
- skip_role: Skip messages with this role.
142
-
143
- Returns:
144
- A list of Messages in the last_n runs.
145
- """
146
- if last_n is None:
147
- logger.debug("Getting messages from all previous runs")
148
- messages_from_all_history = []
149
- for prev_run in self.runs:
150
- if prev_run.response and prev_run.response.messages:
151
- if skip_role:
152
- prev_run_messages = [m for m in prev_run.response.messages if m.role != skip_role]
153
- else:
154
- prev_run_messages = prev_run.response.messages
155
- messages_from_all_history.extend(prev_run_messages)
156
- logger.debug(f"Messages from previous runs: {len(messages_from_all_history)}")
157
- return messages_from_all_history
158
-
159
- logger.debug(f"Getting messages from last {last_n} runs")
160
- messages_from_last_n_history = []
161
- for prev_run in self.runs[-last_n:]:
162
- if prev_run.response and prev_run.response.messages:
163
- if skip_role:
164
- prev_run_messages = [m for m in prev_run.response.messages if m.role != skip_role]
165
- else:
166
- prev_run_messages = prev_run.response.messages
167
- messages_from_last_n_history.extend(prev_run_messages)
168
- logger.debug(f"Messages from last {last_n} runs: {len(messages_from_last_n_history)}")
169
- return messages_from_last_n_history
170
-
171
- def get_message_pairs(
172
- self, user_role: str = "user", assistant_role: Optional[List[str]] = None
173
- ) -> List[Tuple[Message, Message]]:
174
- """Returns a list of tuples of (user message, assistant response)."""
175
-
176
- if assistant_role is None:
177
- assistant_role = ["assistant", "model", "CHATBOT"]
178
-
179
- runs_as_message_pairs: List[Tuple[Message, Message]] = []
180
- for run in self.runs:
181
- if run.response and run.response.messages:
182
- user_messages_from_run = None
183
- assistant_messages_from_run = None
184
-
185
- # Start from the beginning to look for the user message
186
- for message in run.response.messages:
187
- if message.role == user_role:
188
- user_messages_from_run = message
189
- break
190
-
191
- # Start from the end to look for the assistant response
192
- for message in run.response.messages[::-1]:
193
- if message.role in assistant_role:
194
- assistant_messages_from_run = message
195
- break
196
-
197
- if user_messages_from_run and assistant_messages_from_run:
198
- runs_as_message_pairs.append((user_messages_from_run, assistant_messages_from_run))
199
- return runs_as_message_pairs
200
-
201
- def get_tool_calls(self, num_calls: Optional[int] = None) -> List[Dict[str, Any]]:
202
- """Returns a list of tool calls from the messages"""
203
-
204
- tool_calls = []
205
- for message in self.messages[::-1]:
206
- if message.tool_calls:
207
- for tool_call in message.tool_calls:
208
- tool_calls.append(tool_call)
209
- if num_calls and len(tool_calls) >= num_calls:
210
- return tool_calls
211
- return tool_calls
212
-
213
- def load_user_memories(self) -> None:
214
- """Load memories from memory db for this user."""
215
-
216
- if self.db is None:
217
- return
218
-
219
- try:
220
- if self.retrieval in (MemoryRetrieval.last_n, MemoryRetrieval.first_n):
221
- memory_rows = self.db.read_memories(
222
- user_id=self.user_id,
223
- limit=self.num_memories,
224
- sort="asc" if self.retrieval == MemoryRetrieval.first_n else "desc",
225
- )
226
- else:
227
- raise NotImplementedError("Semantic retrieval not yet supported.")
228
- except Exception as e:
229
- logger.debug(f"Error reading memory: {e}")
230
- return
231
-
232
- # Clear the existing memories
233
- self.memories = []
234
-
235
- # No memories to load
236
- if memory_rows is None or len(memory_rows) == 0:
237
- return
238
-
239
- for row in memory_rows:
240
- try:
241
- self.memories.append(Memory.model_validate(row.memory))
242
- except Exception as e:
243
- logger.warning(f"Error loading memory: {e}")
244
- continue
245
-
246
- def should_update_memory(self, input: str) -> bool:
247
- """Determines if a message should be added to the memory db."""
248
- from agno.memory.classifier import MemoryClassifier
249
-
250
- if self.classifier is None:
251
- self.classifier = MemoryClassifier()
252
-
253
- self.classifier.existing_memories = self.memories
254
- classifier_response = self.classifier.run(input)
255
- if classifier_response == "yes":
256
- return True
257
- return False
258
-
259
- async def ashould_update_memory(self, input: str) -> bool:
260
- """Determines if a message should be added to the memory db."""
261
- from agno.memory.classifier import MemoryClassifier
262
-
263
- if self.classifier is None:
264
- self.classifier = MemoryClassifier()
265
-
266
- self.classifier.existing_memories = self.memories
267
- classifier_response = await self.classifier.arun(input)
268
- if classifier_response == "yes":
269
- return True
270
- return False
271
-
272
- def update_memory(self, input: str, force: bool = False) -> Optional[str]:
273
- """Creates a memory from a message and adds it to the memory db."""
274
- from agno.memory.manager import MemoryManager
275
-
276
- if input is None or not isinstance(input, str):
277
- return "Invalid message content"
278
-
279
- if self.db is None:
280
- logger.warning("MemoryDb not provided.")
281
- return "Please provide a db to store memories"
282
-
283
- self.updating_memory = True
284
-
285
- # Check if this user message should be added to long term memory
286
- should_update_memory = force or self.should_update_memory(input=input)
287
- logger.debug(f"Update memory: {should_update_memory}")
288
-
289
- if not should_update_memory:
290
- logger.debug("Memory update not required")
291
- return "Memory update not required"
292
-
293
- if self.manager is None:
294
- self.manager = MemoryManager(user_id=self.user_id, db=self.db)
295
-
296
- else:
297
- self.manager.db = self.db
298
- self.manager.user_id = self.user_id
299
-
300
- response = self.manager.run(input)
301
- self.load_user_memories()
302
- self.updating_memory = False
303
- return response
304
-
305
- async def aupdate_memory(self, input: str, force: bool = False) -> Optional[str]:
306
- """Creates a memory from a message and adds it to the memory db."""
307
- from agno.memory.manager import MemoryManager
308
-
309
- if input is None or not isinstance(input, str):
310
- return "Invalid message content"
311
-
312
- if self.db is None:
313
- logger.warning("MemoryDb not provided.")
314
- return "Please provide a db to store memories"
315
-
316
- self.updating_memory = True
317
-
318
- # Check if this user message should be added to long term memory
319
- should_update_memory = force or await self.ashould_update_memory(input=input)
320
- logger.debug(f"Async update memory: {should_update_memory}")
321
-
322
- if not should_update_memory:
323
- logger.debug("Memory update not required")
324
- return "Memory update not required"
325
-
326
- if self.manager is None:
327
- self.manager = MemoryManager(user_id=self.user_id, db=self.db)
328
-
329
- else:
330
- self.manager.db = self.db
331
- self.manager.user_id = self.user_id
332
-
333
- response = await self.manager.arun(input)
334
- self.load_user_memories()
335
- self.updating_memory = False
336
- return response
337
-
338
- def update_summary(self) -> Optional[SessionSummary]:
339
- """Creates a summary of the session"""
340
- from agno.memory.summarizer import MemorySummarizer
341
-
342
- self.updating_memory = True
343
-
344
- if self.summarizer is None:
345
- self.summarizer = MemorySummarizer()
346
-
347
- self.summary = self.summarizer.run(self.get_message_pairs())
348
- self.updating_memory = False
349
- return self.summary
350
-
351
- async def aupdate_summary(self) -> Optional[SessionSummary]:
352
- """Creates a summary of the session"""
353
- from agno.memory.summarizer import MemorySummarizer
354
-
355
- self.updating_memory = True
356
-
357
- if self.summarizer is None:
358
- self.summarizer = MemorySummarizer()
359
-
360
- self.summary = await self.summarizer.arun(self.get_message_pairs())
361
- self.updating_memory = False
362
- return self.summary
363
-
364
- def clear(self) -> None:
365
- """Clear the AgentMemory"""
366
-
367
- self.runs = []
368
- self.messages = []
369
- self.summary = None
370
- self.memories = None
371
-
372
- def deep_copy(self) -> "AgentMemory":
373
- from copy import deepcopy
374
-
375
- # Create a shallow copy of the object
376
- copied_obj = self.__class__(**self.to_dict())
377
-
378
- # Manually deepcopy fields that are known to be safe
379
- for field_name, field_value in self.__dict__.items():
380
- if field_name not in ["db", "classifier", "manager", "summarizer"]:
381
- try:
382
- setattr(copied_obj, field_name, deepcopy(field_value))
383
- except Exception as e:
384
- logger.warning(f"Failed to deepcopy field: {field_name} - {e}")
385
- setattr(copied_obj, field_name, field_value)
386
-
387
- copied_obj.db = self.db
388
- copied_obj.classifier = self.classifier
389
- copied_obj.manager = self.manager
390
- copied_obj.summarizer = self.summarizer
391
-
392
- return copied_obj