agno 0.1.2__py3-none-any.whl → 2.3.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1791 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1312 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
@@ -1,359 +0,0 @@
1
- import time
2
- from pathlib import Path
3
- from typing import List, Optional
4
-
5
- try:
6
- from sqlalchemy.dialects import sqlite
7
- from sqlalchemy.engine import Engine, create_engine
8
- from sqlalchemy.inspection import inspect
9
- from sqlalchemy.orm import Session, sessionmaker
10
- from sqlalchemy.schema import Column, MetaData, Table
11
- from sqlalchemy.sql.expression import select
12
- from sqlalchemy.types import String
13
- except ImportError:
14
- raise ImportError("`sqlalchemy` not installed. Please install it using `pip install sqlalchemy`")
15
-
16
- from agno.storage.workflow.base import WorkflowStorage
17
- from agno.storage.workflow.session import WorkflowSession
18
- from agno.utils.log import logger
19
-
20
-
21
- class SqliteWorkflowStorage(WorkflowStorage):
22
- def __init__(
23
- self,
24
- table_name: str,
25
- db_url: Optional[str] = None,
26
- db_file: Optional[str] = None,
27
- db_engine: Optional[Engine] = None,
28
- schema_version: int = 1,
29
- auto_upgrade_schema: bool = False,
30
- ):
31
- """
32
- This class provides workflow storage using a sqlite database.
33
-
34
- The following order is used to determine the database connection:
35
- 1. Use the db_engine if provided
36
- 2. Use the db_url
37
- 3. Use the db_file
38
- 4. Create a new in-memory database
39
-
40
- Args:
41
- table_name: The name of the table to store Workflow sessions.
42
- db_url: The database URL to connect to.
43
- db_file: The database file to connect to.
44
- db_engine: The SQLAlchemy database engine to use.
45
- """
46
- _engine: Optional[Engine] = db_engine
47
- if _engine is None and db_url is not None:
48
- _engine = create_engine(db_url)
49
- elif _engine is None and db_file is not None:
50
- # Use the db_file to create the engine
51
- db_path = Path(db_file).resolve()
52
- # Ensure the directory exists
53
- db_path.parent.mkdir(parents=True, exist_ok=True)
54
- _engine = create_engine(f"sqlite:///{db_path}")
55
- else:
56
- _engine = create_engine("sqlite://")
57
-
58
- if _engine is None:
59
- raise ValueError("Must provide either db_url, db_file or db_engine")
60
-
61
- # Database attributes
62
- self.table_name: str = table_name
63
- self.db_url: Optional[str] = db_url
64
- self.db_engine: Engine = _engine
65
- self.metadata: MetaData = MetaData()
66
- self.inspector = inspect(self.db_engine)
67
-
68
- # Table schema version
69
- self.schema_version: int = schema_version
70
- # Automatically upgrade schema if True
71
- self.auto_upgrade_schema: bool = auto_upgrade_schema
72
-
73
- # Database session
74
- self.Session: sessionmaker[Session] = sessionmaker(bind=self.db_engine)
75
- # Database table for storage
76
- self.table: Table = self.get_table()
77
-
78
- def get_table_v1(self) -> Table:
79
- """
80
- Define the table schema for version 1.
81
-
82
- Returns:
83
- Table: SQLAlchemy Table object representing the schema.
84
- """
85
- return Table(
86
- self.table_name,
87
- self.metadata,
88
- # Session UUID: Primary Key
89
- Column("session_id", String, primary_key=True),
90
- # ID of the workflow that this session is associated with
91
- Column("workflow_id", String),
92
- # ID of the user interacting with this workflow
93
- Column("user_id", String),
94
- # Workflow Memory
95
- Column("memory", sqlite.JSON),
96
- # Workflow Data
97
- Column("workflow_data", sqlite.JSON),
98
- # Session Data
99
- Column("session_data", sqlite.JSON),
100
- # Extra Data
101
- Column("extra_data", sqlite.JSON),
102
- # The Unix timestamp of when this session was created.
103
- Column("created_at", sqlite.INTEGER, default=lambda: int(time.time())),
104
- # The Unix timestamp of when this session was last updated.
105
- Column("updated_at", sqlite.INTEGER, onupdate=lambda: int(time.time())),
106
- extend_existing=True,
107
- sqlite_autoincrement=True,
108
- )
109
-
110
- def get_table(self) -> Table:
111
- """
112
- Get the table schema based on the schema version.
113
-
114
- Returns:
115
- Table: SQLAlchemy Table object for the current schema version.
116
-
117
- Raises:
118
- ValueError: If an unsupported schema version is specified.
119
- """
120
- if self.schema_version == 1:
121
- return self.get_table_v1()
122
- else:
123
- raise ValueError(f"Unsupported schema version: {self.schema_version}")
124
-
125
- def table_exists(self) -> bool:
126
- """
127
- Check if the table exists in the database.
128
-
129
- Returns:
130
- bool: True if the table exists, False otherwise.
131
- """
132
- logger.debug(f"Checking if table exists: {self.table.name}")
133
- try:
134
- return self.inspector.has_table(self.table.name)
135
- except Exception as e:
136
- logger.error(f"Error checking if table exists: {e}")
137
- return False
138
-
139
- def create(self) -> None:
140
- """
141
- Create the table if it doesn't exist.
142
- """
143
- if not self.table_exists():
144
- logger.debug(f"Creating table: {self.table.name}")
145
- self.table.create(self.db_engine, checkfirst=True)
146
-
147
- def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[WorkflowSession]:
148
- """
149
- Read a WorkflowSession from the database.
150
-
151
- Args:
152
- session_id (str): The ID of the session to read.
153
- user_id (Optional[str]): The ID of the user associated with the session.
154
-
155
- Returns:
156
- Optional[WorkflowSession]: The WorkflowSession object if found, None otherwise.
157
- """
158
- try:
159
- with self.Session() as sess:
160
- stmt = select(self.table).where(self.table.c.session_id == session_id)
161
- if user_id:
162
- stmt = stmt.where(self.table.c.user_id == user_id)
163
- result = sess.execute(stmt).fetchone()
164
- return WorkflowSession.from_dict(result._mapping) if result is not None else None # type: ignore
165
- except Exception as e:
166
- logger.debug(f"Exception reading from table: {e}")
167
- logger.debug(f"Table does not exist: {self.table.name}")
168
- logger.debug("Creating table for future transactions")
169
- self.create()
170
- return None
171
-
172
- def get_all_session_ids(self, user_id: Optional[str] = None, workflow_id: Optional[str] = None) -> List[str]:
173
- """
174
- Get all session IDs, optionally filtered by user_id and/or workflow_id.
175
-
176
- Args:
177
- user_id (Optional[str]): The ID of the user to filter by.
178
- workflow_id (Optional[str]): The ID of the workflow to filter by.
179
-
180
- Returns:
181
- List[str]: List of session IDs matching the criteria.
182
- """
183
- try:
184
- with self.Session() as sess, sess.begin():
185
- # get all session_ids
186
- stmt = select(self.table.c.session_id)
187
- if user_id is not None and user_id != "":
188
- stmt = stmt.where(self.table.c.user_id == user_id)
189
- if workflow_id is not None:
190
- stmt = stmt.where(self.table.c.workflow_id == workflow_id)
191
- # order by created_at desc
192
- stmt = stmt.order_by(self.table.c.created_at.desc())
193
- # execute query
194
- rows = sess.execute(stmt).fetchall()
195
- return [row[0] for row in rows] if rows is not None else []
196
- except Exception as e:
197
- logger.debug(f"Exception reading from table: {e}")
198
- logger.debug(f"Table does not exist: {self.table.name}")
199
- logger.debug("Creating table for future transactions")
200
- self.create()
201
- return []
202
-
203
- def get_all_sessions(
204
- self, user_id: Optional[str] = None, workflow_id: Optional[str] = None
205
- ) -> List[WorkflowSession]:
206
- """
207
- Get all sessions, optionally filtered by user_id and/or workflow_id.
208
-
209
- Args:
210
- user_id (Optional[str]): The ID of the user to filter by.
211
- workflow_id (Optional[str]): The ID of the workflow to filter by.
212
-
213
- Returns:
214
- List[WorkflowSession]: List of AgentSession objects matching the criteria.
215
- """
216
- try:
217
- with self.Session() as sess, sess.begin():
218
- # get all sessions
219
- stmt = select(self.table)
220
- if user_id is not None and user_id != "":
221
- stmt = stmt.where(self.table.c.user_id == user_id)
222
- if workflow_id is not None:
223
- stmt = stmt.where(self.table.c.workflow_id == workflow_id)
224
- # order by created_at desc
225
- stmt = stmt.order_by(self.table.c.created_at.desc())
226
- # execute query
227
- rows = sess.execute(stmt).fetchall()
228
- return [WorkflowSession.from_dict(row._mapping) for row in rows] if rows is not None else [] # type: ignore
229
- except Exception as e:
230
- logger.debug(f"Exception reading from table: {e}")
231
- logger.debug(f"Table does not exist: {self.table.name}")
232
- logger.debug("Creating table for future transactions")
233
- self.create()
234
- return []
235
-
236
- def upsert(self, session: WorkflowSession, create_and_retry: bool = True) -> Optional[WorkflowSession]:
237
- """
238
- Insert or update a WorkflowSession in the database.
239
-
240
- Args:
241
- session (WorkflowSession): The WorkflowSession object to upsert.
242
- create_and_retry (bool): Retry upsert if table does not exist.
243
-
244
- Returns:
245
- Optional[WorkflowSession]: The upserted WorkflowSession object.
246
- """
247
- try:
248
- with self.Session() as sess, sess.begin():
249
- # Create an insert statement
250
- stmt = sqlite.insert(self.table).values(
251
- session_id=session.session_id,
252
- workflow_id=session.workflow_id,
253
- user_id=session.user_id,
254
- memory=session.memory,
255
- workflow_data=session.workflow_data,
256
- session_data=session.session_data,
257
- extra_data=session.extra_data,
258
- )
259
-
260
- # Define the upsert if the session_id already exists
261
- # See: https://docs.sqlalchemy.org/en/20/dialects/sqlite.html#insert-on-conflict-upsert
262
- stmt = stmt.on_conflict_do_update(
263
- index_elements=["session_id"],
264
- set_=dict(
265
- workflow_id=session.workflow_id,
266
- user_id=session.user_id,
267
- memory=session.memory,
268
- workflow_data=session.workflow_data,
269
- session_data=session.session_data,
270
- extra_data=session.extra_data,
271
- updated_at=int(time.time()),
272
- ), # The updated value for each column
273
- )
274
-
275
- sess.execute(stmt)
276
- except Exception as e:
277
- logger.debug(f"Exception upserting into table: {e}")
278
- if create_and_retry and not self.table_exists():
279
- logger.debug(f"Table does not exist: {self.table.name}")
280
- logger.debug("Creating table and retrying upsert")
281
- self.create()
282
- return self.upsert(session, create_and_retry=False)
283
- return None
284
- return self.read(session_id=session.session_id)
285
-
286
- def delete_session(self, session_id: Optional[str] = None):
287
- """
288
- Delete a workflow session from the database.
289
-
290
- Args:
291
- session_id (Optional[str]): The ID of the session to delete.
292
-
293
- Raises:
294
- ValueError: If session_id is not provided.
295
- """
296
- if session_id is None:
297
- logger.warning("No session_id provided for deletion.")
298
- return
299
-
300
- try:
301
- with self.Session() as sess, sess.begin():
302
- # Delete the session with the given session_id
303
- delete_stmt = self.table.delete().where(self.table.c.session_id == session_id)
304
- result = sess.execute(delete_stmt)
305
- if result.rowcount == 0:
306
- logger.debug(f"No session found with session_id: {session_id}")
307
- else:
308
- logger.debug(f"Successfully deleted session with session_id: {session_id}")
309
- except Exception as e:
310
- logger.error(f"Error deleting session: {e}")
311
-
312
- def drop(self) -> None:
313
- """
314
- Drop the table from the database if it exists.
315
- """
316
- if self.table_exists():
317
- logger.debug(f"Deleting table: {self.table_name}")
318
- self.table.drop(self.db_engine)
319
-
320
- def upgrade_schema(self) -> None:
321
- """
322
- Upgrade the schema of the workflow storage table.
323
- This method is currently a placeholder and does not perform any actions.
324
- """
325
- pass
326
-
327
- def __deepcopy__(self, memo):
328
- """
329
- Create a deep copy of the SqliteWorkflowStorage instance, handling unpickleable attributes.
330
-
331
- Args:
332
- memo (dict): A dictionary of objects already copied during the current copying pass.
333
-
334
- Returns:
335
- SqliteWorkflowStorage: A deep-copied instance of SqliteWorkflowStorage.
336
- """
337
- from copy import deepcopy
338
-
339
- # Create a new instance without calling __init__
340
- cls = self.__class__
341
- copied_obj = cls.__new__(cls)
342
- memo[id(self)] = copied_obj
343
-
344
- # Deep copy attributes
345
- for k, v in self.__dict__.items():
346
- if k in {"metadata", "table", "inspector"}:
347
- continue
348
- # Reuse db_engine and Session without copying
349
- elif k in {"db_engine", "Session"}:
350
- setattr(copied_obj, k, v)
351
- else:
352
- setattr(copied_obj, k, deepcopy(v, memo))
353
-
354
- # Recreate metadata and table for the copied instance
355
- copied_obj.metadata = MetaData()
356
- copied_obj.inspector = inspect(copied_obj.db_engine)
357
- copied_obj.table = copied_obj.get_table()
358
-
359
- return copied_obj
@@ -1,88 +0,0 @@
1
- import json
2
- from typing import Any, Dict, List, Optional
3
-
4
- from agno.tools import Toolkit
5
- from agno.utils.log import logger
6
-
7
- try:
8
- from googlesearch import search
9
- except ImportError:
10
- raise ImportError("`googlesearch-python` not installed. Please install using `pip install googlesearch-python`")
11
-
12
- try:
13
- from pycountry import pycountry
14
- except ImportError:
15
- raise ImportError("`pycountry` not installed. Please install using `pip install pycountry`")
16
-
17
-
18
- class GoogleSearch(Toolkit):
19
- """
20
- GoogleSearch is a Python library for searching Google easily.
21
- It uses requests and BeautifulSoup4 to scrape Google.
22
-
23
- Args:
24
- fixed_max_results (Optional[int]): A fixed number of maximum results.
25
- fixed_language (Optional[str]): Language of the search results.
26
- headers (Optional[Any]): Custom headers for the request.
27
- proxy (Optional[str]): Proxy settings for the request.
28
- timeout (Optional[int]): Timeout for the request, default is 10 seconds.
29
- """
30
-
31
- def __init__(
32
- self,
33
- fixed_max_results: Optional[int] = None,
34
- fixed_language: Optional[str] = None,
35
- headers: Optional[Any] = None,
36
- proxy: Optional[str] = None,
37
- timeout: Optional[int] = 10,
38
- ):
39
- super().__init__(name="googlesearch")
40
-
41
- self.fixed_max_results: Optional[int] = fixed_max_results
42
- self.fixed_language: Optional[str] = fixed_language
43
- self.headers: Optional[Any] = headers
44
- self.proxy: Optional[str] = proxy
45
- self.timeout: Optional[int] = timeout
46
-
47
- self.register(self.google_search)
48
-
49
- def google_search(self, query: str, max_results: int = 5, language: str = "en") -> str:
50
- """
51
- Use this function to search Google for a specified query.
52
-
53
- Args:
54
- query (str): The query to search for.
55
- max_results (int, optional): The maximum number of results to return. Default is 5.
56
- language (str, optional): The language of the search results. Default is "en".
57
-
58
- Returns:
59
- str: A JSON formatted string containing the search results.
60
- """
61
- max_results = self.fixed_max_results or max_results
62
- language = self.fixed_language or language
63
-
64
- # Resolve language to ISO 639-1 code if needed
65
- if len(language) != 2:
66
- _language = pycountry.languages.lookup(language)
67
- if _language:
68
- language = _language.alpha_2
69
- else:
70
- language = "en"
71
-
72
- logger.debug(f"Searching Google [{language}] for: {query}")
73
-
74
- # Perform Google search using the googlesearch-python package
75
- results = list(search(query, num_results=max_results, lang=language, proxy=self.proxy, advanced=True))
76
-
77
- # Collect the search results
78
- res: List[Dict[str, str]] = []
79
- for result in results:
80
- res.append(
81
- {
82
- "title": result.title,
83
- "url": result.url,
84
- "description": result.description,
85
- }
86
- )
87
-
88
- return json.dumps(res, indent=2)
agno/utils/defaults.py DELETED
@@ -1,57 +0,0 @@
1
- # Don't import anything which may lead to circular imports
2
-
3
-
4
- def get_default_ns_name(app_name: str) -> str:
5
- return "{}-ns".format(app_name)
6
-
7
-
8
- def get_default_ctx_name(app_name: str) -> str:
9
- return "{}-ctx".format(app_name)
10
-
11
-
12
- def get_default_sa_name(app_name: str) -> str:
13
- return "{}-sa".format(app_name)
14
-
15
-
16
- def get_default_cr_name(app_name: str) -> str:
17
- return "{}-cr".format(app_name)
18
-
19
-
20
- def get_default_crb_name(app_name: str) -> str:
21
- return "{}-crb".format(app_name)
22
-
23
-
24
- def get_default_pod_name(app_name: str) -> str:
25
- return "{}-pod".format(app_name)
26
-
27
-
28
- def get_default_container_name(app_name: str) -> str:
29
- return "{}-container".format(app_name)
30
-
31
-
32
- def get_default_service_name(app_name: str) -> str:
33
- return "{}-svc".format(app_name)
34
-
35
-
36
- def get_default_ingress_name(app_name: str) -> str:
37
- return "{}-ingress".format(app_name)
38
-
39
-
40
- def get_default_deploy_name(app_name: str) -> str:
41
- return "{}-deploy".format(app_name)
42
-
43
-
44
- def get_default_configmap_name(app_name: str) -> str:
45
- return "{}-cm".format(app_name)
46
-
47
-
48
- def get_default_secret_name(app_name: str) -> str:
49
- return "{}-secret".format(app_name)
50
-
51
-
52
- def get_default_volume_name(app_name: str) -> str:
53
- return "{}-volume".format(app_name)
54
-
55
-
56
- def get_default_pvc_name(app_name: str) -> str:
57
- return "{}-pvc".format(app_name)
agno/utils/filesystem.py DELETED
@@ -1,39 +0,0 @@
1
- from pathlib import Path
2
-
3
-
4
- def rmdir_recursive(dir_path: Path) -> bool:
5
- """Deletes dir_path recursively, including all files and dirs in that directory
6
- Returns True if dir deleted successfully.
7
- """
8
-
9
- if not dir_path.exists():
10
- return True
11
-
12
- if dir_path.is_dir():
13
- from shutil import rmtree
14
-
15
- rmtree(path=dir_path, ignore_errors=True)
16
- elif dir_path.is_file():
17
- dir_path.unlink(missing_ok=True)
18
-
19
- return True if not dir_path.exists() else False
20
-
21
-
22
- def delete_files_in_dir(dir: Path) -> None:
23
- """Deletes all files in a directory, but doesn't delete the directory"""
24
-
25
- for item in dir.iterdir():
26
- if item.is_dir():
27
- rmdir_recursive(item)
28
- else:
29
- item.unlink()
30
-
31
-
32
- def delete_from_fs(path_to_del: Path) -> bool:
33
- if not path_to_del.exists():
34
- return True
35
- if path_to_del.is_dir():
36
- return rmdir_recursive(path_to_del)
37
- else:
38
- path_to_del.unlink()
39
- return True if not path_to_del.exists() else False
agno/utils/git.py DELETED
@@ -1,52 +0,0 @@
1
- from pathlib import Path
2
- from typing import Optional
3
-
4
- import git
5
-
6
- from agno.utils.log import logger
7
-
8
-
9
- def get_remote_origin_for_dir(
10
- ws_root_path: Optional[Path],
11
- ) -> Optional[str]:
12
- """Returns the remote origin for a directory"""
13
-
14
- if ws_root_path is None or not ws_root_path.exists() or not ws_root_path.is_dir():
15
- return None
16
-
17
- _remote_origin: Optional[git.Remote] = None
18
- try:
19
- _git_repo: git.Repo = git.Repo(path=ws_root_path)
20
- _remote_origin = _git_repo.remote("origin")
21
- except (git.InvalidGitRepositoryError, ValueError):
22
- return None
23
- except git.NoSuchPathError:
24
- return None
25
-
26
- if _remote_origin is None:
27
- return None
28
-
29
- # TODO: Figure out multiple urls for origin and how to only get the fetch url
30
- # _remote_origin.urls returns a generator
31
- _remote_origin_url: Optional[str] = None
32
- for _remote_url in _remote_origin.urls:
33
- _remote_origin_url = _remote_url
34
- break
35
- return _remote_origin_url
36
-
37
-
38
- class GitCloneProgress(git.RemoteProgress):
39
- # https://gitpython.readthedocs.io/en/stable/reference.html#module-git.remote
40
- # def line_dropped(self, line):
41
- # print("line dropped: {}".format(line))
42
-
43
- def update(self, op_code, cur_count, max_count=None, message=""):
44
- if op_code == 5:
45
- logger.debug("Starting copy")
46
- if op_code == 10:
47
- logger.debug("Copy complete")
48
- # logger.debug(f"op_code: {op_code}")
49
- # logger.debug(f"cur_count: {cur_count}")
50
- # logger.debug(f"max_count: {max_count}")
51
- # logger.debug(f"message: {message}")
52
- # print(self._cur_line)
agno/utils/json_io.py DELETED
@@ -1,30 +0,0 @@
1
- import json
2
- from datetime import date, datetime
3
- from pathlib import Path
4
- from typing import Dict, List, Optional, Union
5
-
6
- from agno.utils.log import logger
7
-
8
-
9
- class CustomJSONEncoder(json.JSONEncoder):
10
- def default(self, o):
11
- if isinstance(o, datetime) or isinstance(o, date):
12
- return o.isoformat()
13
-
14
- if isinstance(o, Path):
15
- return str(o)
16
-
17
- return json.JSONEncoder.default(self, o)
18
-
19
-
20
- def read_json_file(file_path: Optional[Path]) -> Optional[Union[Dict, List]]:
21
- if file_path is not None and file_path.exists() and file_path.is_file():
22
- # logger.debug(f"Reading {file_path}")
23
- return json.loads(file_path.read_text())
24
- return None
25
-
26
-
27
- def write_json_file(file_path: Optional[Path], data: Optional[Union[Dict, List]], **kwargs) -> None:
28
- if file_path is not None and data is not None:
29
- logger.debug(f"Writing {file_path}")
30
- file_path.write_text(json.dumps(data, cls=CustomJSONEncoder, indent=4, **kwargs))
agno/utils/load_env.py DELETED
@@ -1,19 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, Optional
3
-
4
-
5
- def load_env(env: Optional[Dict[str, str]] = None, dotenv_dir: Optional[Path] = None) -> None:
6
- from os import environ
7
-
8
- if dotenv_dir is not None:
9
- dotenv_file = dotenv_dir.joinpath(".env")
10
- if dotenv_file is not None and dotenv_file.exists() and dotenv_file.is_file():
11
- from dotenv.main import dotenv_values
12
-
13
- dotenv_dict: Dict[str, Optional[str]] = dotenv_values(dotenv_file)
14
- for key, value in dotenv_dict.items():
15
- if value is not None:
16
- environ[key] = value
17
-
18
- if env is not None:
19
- environ.update(env)
agno/utils/py_io.py DELETED
@@ -1,19 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, Optional
3
-
4
-
5
- def get_python_objects_from_module(module_path: Path) -> Dict:
6
- """Returns a dictionary of python objects from a module"""
7
- import importlib.util
8
- from importlib.machinery import ModuleSpec
9
-
10
- # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly
11
- # Create a ModuleSpec
12
- module_spec: Optional[ModuleSpec] = importlib.util.spec_from_file_location("module", module_path)
13
- # Using the ModuleSpec create a module
14
- if module_spec:
15
- module = importlib.util.module_from_spec(module_spec)
16
- module_spec.loader.exec_module(module) # type: ignore
17
- return module.__dict__
18
- else:
19
- return {}
agno/utils/pyproject.py DELETED
@@ -1,18 +0,0 @@
1
- from pathlib import Path
2
- from typing import Dict, Optional
3
-
4
- from agno.utils.log import logger
5
-
6
-
7
- def read_pyproject_agno(pyproject_file: Path) -> Optional[Dict]:
8
- logger.debug(f"Reading {pyproject_file}")
9
- try:
10
- import tomli
11
-
12
- pyproject_dict = tomli.loads(pyproject_file.read_text())
13
- agno_conf = pyproject_dict.get("tool", {}).get("agno", None)
14
- if agno_conf is not None and isinstance(agno_conf, dict):
15
- return agno_conf
16
- except Exception as e:
17
- logger.error(f"Could not read {pyproject_file}: {e}")
18
- return None