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,405 +0,0 @@
1
- import json
2
- from dataclasses import asdict
3
- from io import BytesIO
4
- from typing import Generator, List, Optional, cast
5
-
6
- from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
7
- from fastapi.responses import JSONResponse, StreamingResponse
8
-
9
- from agno.agent.agent import Agent, RunResponse
10
- from agno.media import Image
11
- from agno.playground.operator import (
12
- format_tools,
13
- get_agent_by_id,
14
- get_session_title,
15
- get_session_title_from_workflow_session,
16
- get_workflow_by_id,
17
- )
18
- from agno.playground.schemas import (
19
- AgentGetResponse,
20
- AgentModel,
21
- AgentRenameRequest,
22
- AgentSessionsResponse,
23
- WorkflowGetResponse,
24
- WorkflowRenameRequest,
25
- WorkflowRunRequest,
26
- WorkflowSessionResponse,
27
- WorkflowsGetResponse,
28
- )
29
- from agno.storage.agent.session import AgentSession
30
- from agno.storage.workflow.session import WorkflowSession
31
- from agno.utils.log import logger
32
- from agno.workflow.workflow import Workflow
33
-
34
-
35
- def get_sync_playground_router(
36
- agents: Optional[List[Agent]] = None, workflows: Optional[List[Workflow]] = None
37
- ) -> APIRouter:
38
- playground_router = APIRouter(prefix="/playground", tags=["Playground"])
39
- if agents is None and workflows is None:
40
- raise ValueError("Either agents or workflows must be provided.")
41
-
42
- @playground_router.get("/status")
43
- def playground_status():
44
- return {"playground": "available"}
45
-
46
- @playground_router.get("/agents", response_model=List[AgentGetResponse])
47
- def get_agents():
48
- agent_list: List[AgentGetResponse] = []
49
- if agents is None:
50
- return agent_list
51
-
52
- for agent in agents:
53
- agent_tools = agent.get_tools()
54
- formatted_tools = format_tools(agent_tools)
55
-
56
- name = agent.model.name or agent.model.__class__.__name__ if agent.model else None
57
- provider = agent.model.provider or agent.model.__class__.__name__ if agent.model else None
58
- model_id = agent.model.id if agent.model else None
59
-
60
- if provider and model_id:
61
- provider = f"{provider} {model_id}"
62
- elif name and model_id:
63
- provider = f"{name} {model_id}"
64
- elif model_id:
65
- provider = model_id
66
- else:
67
- provider = ""
68
-
69
- agent_list.append(
70
- AgentGetResponse(
71
- agent_id=agent.agent_id,
72
- name=agent.name,
73
- model=AgentModel(
74
- name=name,
75
- model=model_id,
76
- provider=provider,
77
- ),
78
- add_context=agent.add_context,
79
- tools=formatted_tools,
80
- memory={"name": agent.memory.db.__class__.__name__} if agent.memory and agent.memory.db else None,
81
- storage={"name": agent.storage.__class__.__name__} if agent.storage else None,
82
- knowledge={"name": agent.knowledge.__class__.__name__} if agent.knowledge else None,
83
- description=agent.description,
84
- instructions=agent.instructions,
85
- )
86
- )
87
-
88
- return agent_list
89
-
90
- def chat_response_streamer(agent: Agent, message: str, images: Optional[List[Image]] = None) -> Generator:
91
- run_response = agent.run(message=message, images=images, stream=True, stream_intermediate_steps=True)
92
- for run_response_chunk in run_response:
93
- run_response_chunk = cast(RunResponse, run_response_chunk)
94
- yield run_response_chunk.to_json()
95
-
96
- def process_image(file: UploadFile) -> Image:
97
- content = file.file.read()
98
-
99
- return Image(content=content)
100
-
101
- @playground_router.post("/agents/{agent_id}/runs")
102
- def create_agent_run(
103
- agent_id: str,
104
- message: str = Form(...),
105
- stream: bool = Form(True),
106
- monitor: bool = Form(False),
107
- session_id: Optional[str] = Form(None),
108
- user_id: Optional[str] = Form(None),
109
- files: Optional[List[UploadFile]] = File(None),
110
- image: Optional[UploadFile] = File(None),
111
- ):
112
- logger.debug(f"AgentRunRequest: {message} {agent_id} {stream} {monitor} {session_id} {user_id} {files}")
113
- agent = get_agent_by_id(agent_id, agents)
114
- if agent is None:
115
- raise HTTPException(status_code=404, detail="Agent not found")
116
-
117
- if files:
118
- if agent.knowledge is None:
119
- raise HTTPException(status_code=404, detail="KnowledgeBase not found")
120
-
121
- if session_id is not None:
122
- logger.debug(f"Continuing session: {session_id}")
123
- else:
124
- logger.debug("Creating new session")
125
-
126
- # Create a new instance of this agent
127
- new_agent_instance = agent.deep_copy(update={"session_id": session_id})
128
- new_agent_instance.session_name = None
129
-
130
- if user_id is not None:
131
- new_agent_instance.user_id = user_id
132
-
133
- if monitor:
134
- new_agent_instance.monitoring = True
135
- else:
136
- new_agent_instance.monitoring = False
137
-
138
- base64_image: Optional[Image] = None
139
- if image:
140
- base64_image = process_image(image)
141
-
142
- if files:
143
- for file in files:
144
- if file.content_type == "application/pdf":
145
- from agno.document.reader.pdf_reader import PDFReader
146
-
147
- contents = file.file.read()
148
- pdf_file = BytesIO(contents)
149
- pdf_file.name = file.filename
150
- file_content = PDFReader().read(pdf_file)
151
- if agent.knowledge is not None:
152
- agent.knowledge.load_documents(file_content)
153
- elif file.content_type == "text/csv":
154
- from agno.document.reader.csv_reader import CSVReader
155
-
156
- contents = file.file.read()
157
- csv_file = BytesIO(contents)
158
- csv_file.name = file.filename
159
- file_content = CSVReader().read(csv_file)
160
- if agent.knowledge is not None:
161
- agent.knowledge.load_documents(file_content)
162
- elif file.content_type == "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
163
- from agno.document.reader.docx_reader import DocxReader
164
-
165
- contents = file.file.read()
166
- docx_file = BytesIO(contents)
167
- docx_file.name = file.filename
168
- file_content = DocxReader().read(docx_file)
169
- if agent.knowledge is not None:
170
- agent.knowledge.load_documents(file_content)
171
- elif file.content_type == "text/plain":
172
- from agno.document.reader.text_reader import TextReader
173
-
174
- contents = file.file.read()
175
- text_file = BytesIO(contents)
176
- text_file.name = file.filename
177
- file_content = TextReader().read(text_file)
178
- if agent.knowledge is not None:
179
- agent.knowledge.load_documents(file_content)
180
- else:
181
- raise HTTPException(status_code=400, detail="Unsupported file type")
182
-
183
- if stream:
184
- return StreamingResponse(
185
- chat_response_streamer(new_agent_instance, message, images=[base64_image] if base64_image else None),
186
- media_type="text/event-stream",
187
- )
188
- else:
189
- run_response = cast(
190
- RunResponse,
191
- new_agent_instance.run(
192
- message,
193
- images=[base64_image] if base64_image else None,
194
- stream=False,
195
- ),
196
- )
197
- return run_response
198
-
199
- @playground_router.get("/agents/{agent_id}/sessions")
200
- def get_user_agent_sessions(agent_id: str, user_id: str = Query(..., min_length=1)):
201
- logger.debug(f"AgentSessionsRequest: {agent_id} {user_id}")
202
- agent = get_agent_by_id(agent_id, agents)
203
- if agent is None:
204
- return JSONResponse(status_code=404, content="Agent not found.")
205
-
206
- if agent.storage is None:
207
- return JSONResponse(status_code=404, content="Agent does not have storage enabled.")
208
-
209
- agent_sessions: List[AgentSessionsResponse] = []
210
- all_agent_sessions: List[AgentSession] = agent.storage.get_all_sessions(user_id=user_id)
211
- for session in all_agent_sessions:
212
- title = get_session_title(session)
213
- agent_sessions.append(
214
- AgentSessionsResponse(
215
- title=title,
216
- session_id=session.session_id,
217
- session_name=session.session_data.get("session_name") if session.session_data else None,
218
- created_at=session.created_at,
219
- )
220
- )
221
- return agent_sessions
222
-
223
- @playground_router.get("/agents/{agent_id}/sessions/{session_id}")
224
- def get_user_agent_session(agent_id: str, session_id: str, user_id: str = Query(..., min_length=1)):
225
- logger.debug(f"AgentSessionsRequest: {agent_id} {user_id} {session_id}")
226
- agent = get_agent_by_id(agent_id, agents)
227
- if agent is None:
228
- return JSONResponse(status_code=404, content="Agent not found.")
229
-
230
- if agent.storage is None:
231
- return JSONResponse(status_code=404, content="Agent does not have storage enabled.")
232
-
233
- agent_session: Optional[AgentSession] = agent.storage.read(session_id)
234
- if agent_session is None:
235
- return JSONResponse(status_code=404, content="Session not found.")
236
-
237
- return agent_session
238
-
239
- @playground_router.post("/agents/{agent_id}/sessions/{session_id}/rename")
240
- def rename_agent_session(agent_id: str, session_id: str, body: AgentRenameRequest):
241
- agent = get_agent_by_id(agent_id, agents)
242
- if agent is None:
243
- return JSONResponse(status_code=404, content=f"couldn't find agent with {agent_id}")
244
-
245
- if agent.storage is None:
246
- return JSONResponse(status_code=404, content="Agent does not have storage enabled.")
247
-
248
- all_agent_sessions: List[AgentSession] = agent.storage.get_all_sessions(user_id=body.user_id)
249
- for session in all_agent_sessions:
250
- if session.session_id == session_id:
251
- agent.session_id = session_id
252
- agent.rename_session(body.name)
253
- return JSONResponse(content={"message": f"successfully renamed agent {agent.name}"})
254
-
255
- return JSONResponse(status_code=404, content="Session not found.")
256
-
257
- @playground_router.delete("/agents/{agent_id}/sessions/{session_id}")
258
- def delete_agent_session(agent_id: str, session_id: str, user_id: str = Query(..., min_length=1)):
259
- agent = get_agent_by_id(agent_id, agents)
260
- if agent is None:
261
- return JSONResponse(status_code=404, content="Agent not found.")
262
-
263
- if agent.storage is None:
264
- return JSONResponse(status_code=404, content="Agent does not have storage enabled.")
265
-
266
- all_agent_sessions: List[AgentSession] = agent.storage.get_all_sessions(user_id=user_id)
267
- for session in all_agent_sessions:
268
- if session.session_id == session_id:
269
- agent.delete_session(session_id)
270
- return JSONResponse(content={"message": f"successfully deleted agent {agent.name}"})
271
-
272
- return JSONResponse(status_code=404, content="Session not found.")
273
-
274
- @playground_router.get("/workflows", response_model=List[WorkflowsGetResponse])
275
- def get_workflows():
276
- if workflows is None:
277
- return []
278
-
279
- return [
280
- WorkflowsGetResponse(
281
- workflow_id=str(workflow.workflow_id),
282
- name=workflow.name,
283
- description=workflow.description,
284
- )
285
- for workflow in workflows
286
- ]
287
-
288
- @playground_router.get("/workflows/{workflow_id}", response_model=WorkflowGetResponse)
289
- def get_workflow(workflow_id: str):
290
- workflow = get_workflow_by_id(workflow_id, workflows)
291
- if workflow is None:
292
- raise HTTPException(status_code=404, detail="Workflow not found")
293
-
294
- return WorkflowGetResponse(
295
- workflow_id=workflow.workflow_id,
296
- name=workflow.name,
297
- description=workflow.description,
298
- parameters=workflow._run_parameters or {},
299
- storage=workflow.storage.__class__.__name__ if workflow.storage else None,
300
- )
301
-
302
- @playground_router.post("/workflows/{workflow_id}/runs")
303
- def create_workflow_run(workflow_id: str, body: WorkflowRunRequest):
304
- # Retrieve the workflow by ID
305
- workflow = get_workflow_by_id(workflow_id, workflows)
306
- if workflow is None:
307
- raise HTTPException(status_code=404, detail="Workflow not found")
308
-
309
- # Create a new instance of this workflow
310
- new_workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
311
- new_workflow_instance.user_id = body.user_id
312
- new_workflow_instance.session_name = None
313
-
314
- # Return based on the response type
315
- try:
316
- if new_workflow_instance._run_return_type == "RunResponse":
317
- # Return as a normal response
318
- return new_workflow_instance.run(**body.input)
319
- else:
320
- # Return as a streaming response
321
- return StreamingResponse(
322
- (json.dumps(asdict(result)) for result in new_workflow_instance.run(**body.input)),
323
- media_type="text/event-stream",
324
- )
325
- except Exception as e:
326
- # Handle unexpected runtime errors
327
- raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
328
-
329
- @playground_router.get("/workflows/{workflow_id}/sessions", response_model=List[WorkflowSessionResponse])
330
- def get_all_workflow_sessions(workflow_id: str, user_id: str = Query(..., min_length=1)):
331
- # Retrieve the workflow by ID
332
- workflow = get_workflow_by_id(workflow_id, workflows)
333
- if not workflow:
334
- raise HTTPException(status_code=404, detail="Workflow not found")
335
-
336
- # Ensure storage is enabled for the workflow
337
- if not workflow.storage:
338
- raise HTTPException(status_code=404, detail="Workflow does not have storage enabled")
339
-
340
- # Retrieve all sessions for the given workflow and user
341
- try:
342
- all_workflow_sessions: List[WorkflowSession] = workflow.storage.get_all_sessions(
343
- user_id=user_id, workflow_id=workflow_id
344
- )
345
- except Exception as e:
346
- raise HTTPException(status_code=500, detail=f"Error retrieving sessions: {str(e)}")
347
-
348
- # Return the sessions
349
- return [
350
- WorkflowSessionResponse(
351
- title=get_session_title_from_workflow_session(session),
352
- session_id=session.session_id,
353
- session_name=session.session_data.get("session_name") if session.session_data else None,
354
- created_at=session.created_at,
355
- )
356
- for session in all_workflow_sessions
357
- ]
358
-
359
- @playground_router.get("/workflows/{workflow_id}/sessions/{session_id}", response_model=WorkflowSession)
360
- def get_workflow_session(workflow_id: str, session_id: str, user_id: str = Query(..., min_length=1)):
361
- # Retrieve the workflow by ID
362
- workflow = get_workflow_by_id(workflow_id, workflows)
363
- if not workflow:
364
- raise HTTPException(status_code=404, detail="Workflow not found")
365
-
366
- # Ensure storage is enabled for the workflow
367
- if not workflow.storage:
368
- raise HTTPException(status_code=404, detail="Workflow does not have storage enabled")
369
-
370
- # Retrieve the specific session
371
- try:
372
- workflow_session: Optional[WorkflowSession] = workflow.storage.read(session_id, user_id)
373
- except Exception as e:
374
- raise HTTPException(status_code=500, detail=f"Error retrieving session: {str(e)}")
375
-
376
- if not workflow_session:
377
- raise HTTPException(status_code=404, detail="Session not found")
378
-
379
- # Return the session
380
- return workflow_session
381
-
382
- @playground_router.post("/workflows/{workflow_id}/sessions/{session_id}/rename")
383
- def rename_workflow_session(
384
- workflow_id: str,
385
- session_id: str,
386
- body: WorkflowRenameRequest,
387
- ):
388
- workflow = get_workflow_by_id(workflow_id, workflows)
389
- if workflow is None:
390
- raise HTTPException(status_code=404, detail="Workflow not found")
391
-
392
- workflow.session_id = session_id
393
- workflow.rename_session(body.name)
394
- return JSONResponse(content={"message": f"successfully renamed workflow {workflow.name}"})
395
-
396
- @playground_router.delete("/workflows/{workflow_id}/sessions/{session_id}")
397
- def delete_workflow_session(workflow_id: str, session_id: str):
398
- workflow = get_workflow_by_id(workflow_id, workflows)
399
- if workflow is None:
400
- raise HTTPException(status_code=404, detail="Workflow not found")
401
-
402
- workflow.delete_session(session_id)
403
- return JSONResponse(content={"message": f"successfully deleted workflow {workflow.name}"})
404
-
405
- return playground_router
agno/reasoning/agent.py DELETED
@@ -1,68 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Callable, Dict, List, Optional, Union
4
-
5
- from agno.models.base import Model
6
- from agno.reasoning.step import ReasoningSteps
7
- from agno.tools.function import Function
8
- from agno.tools.toolkit import Toolkit
9
-
10
-
11
- def get_reasoning_agent(
12
- reasoning_model: Model,
13
- min_steps: int,
14
- max_steps: int,
15
- tools: Optional[List[Union[Toolkit, Callable, Function, Dict]]] = None,
16
- structured_outputs: bool = False,
17
- monitoring: bool = False,
18
- ) -> Optional["Agent"]: # type: ignore # noqa: F821
19
- from agno.agent import Agent
20
-
21
- return Agent(
22
- model=reasoning_model,
23
- description="You are a meticulous and thoughtful assistant that solves a problem by thinking through it step-by-step.",
24
- instructions=[
25
- "First - Carefully analyze the task by spelling it out loud.",
26
- "Then, break down the problem by thinking through it step by step and develop multiple strategies to solve the problem."
27
- "Then, examine the users intent develop a step by step plan to solve the problem.",
28
- "Work through your plan step-by-step, executing any tools as needed. For each step, provide:\n"
29
- " 1. Title: A clear, concise title that encapsulates the step's main focus or objective.\n"
30
- " 2. Action: Describe the action you will take in the first person (e.g., 'I will...').\n"
31
- " 3. Result: Execute the action by running any necessary tools or providing an answer. Summarize the outcome.\n"
32
- " 4. Reasoning: Explain the logic behind this step in the first person, including:\n"
33
- " - Necessity: Why this action is necessary.\n"
34
- " - Considerations: Key considerations and potential challenges.\n"
35
- " - Progression: How it builds upon previous steps (if applicable).\n"
36
- " - Assumptions: Any assumptions made and their justifications.\n"
37
- " 5. Next Action: Decide on the next step:\n"
38
- " - continue: If more steps are needed to reach an answer.\n"
39
- " - validate: If you have reached an answer and should validate the result.\n"
40
- " - final_answer: If the answer is validated and is the final answer.\n"
41
- " Note: you must always validate the answer before providing the final answer.\n"
42
- " 6. Confidence score: A score from 0.0 to 1.0 reflecting your certainty about the action and its outcome.",
43
- "Handling Next Actions:\n"
44
- " - If next_action is continue, proceed to the next step in your analysis.\n"
45
- " - If next_action is validate, validate the result and provide the final answer.\n"
46
- " - If next_action is final_answer, stop reasoning.",
47
- "Remember - If next_action is validate, you must validate your result\n"
48
- " - Ensure the answer resolves the original request.\n"
49
- " - Validate your result using any necessary tools or methods.\n"
50
- " - If there is another method to solve the task, use that to validate the result.\n"
51
- "Ensure your analysis is:\n"
52
- " - Complete: Validate results and run all necessary tools.\n"
53
- " - Comprehensive: Consider multiple angles and potential outcomes.\n"
54
- " - Logical: Ensure each step coherently follows from the previous one.\n"
55
- " - Actionable: Provide clear, implementable steps or solutions.\n"
56
- " - Insightful: Offer unique perspectives or innovative approaches when appropriate.",
57
- "Additional Guidelines:\n"
58
- " - Remember to run any tools you need to solve the problem.\n"
59
- f" - Take at least {min_steps} steps to solve the problem.\n"
60
- " - If you have all the information you need, provide the final answer.\n"
61
- " - IMPORTANT: IF AT ANY TIME THE RESULT IS WRONG, RESET AND START OVER.",
62
- ],
63
- tools=tools,
64
- show_tool_calls=False,
65
- response_model=ReasoningSteps,
66
- structured_outputs=structured_outputs,
67
- monitoring=monitoring,
68
- )
agno/run/response.py DELETED
@@ -1,112 +0,0 @@
1
- from dataclasses import asdict, dataclass, field
2
- from enum import Enum
3
- from time import time
4
- from typing import Any, Dict, List, Optional
5
-
6
- from pydantic import BaseModel
7
-
8
- from agno.media import AudioArtifact, AudioOutput, ImageArtifact, VideoArtifact
9
- from agno.models.message import Message, MessageReferences
10
- from agno.reasoning.step import ReasoningStep
11
-
12
-
13
- class RunEvent(str, Enum):
14
- """Events that can be sent by the run() functions"""
15
-
16
- run_started = "RunStarted"
17
- run_response = "RunResponse"
18
- run_completed = "RunCompleted"
19
- tool_call_started = "ToolCallStarted"
20
- tool_call_completed = "ToolCallCompleted"
21
- reasoning_started = "ReasoningStarted"
22
- reasoning_step = "ReasoningStep"
23
- reasoning_completed = "ReasoningCompleted"
24
- updating_memory = "UpdatingMemory"
25
- workflow_started = "WorkflowStarted"
26
- workflow_completed = "WorkflowCompleted"
27
-
28
-
29
- @dataclass
30
- class RunResponseExtraData:
31
- references: Optional[List[MessageReferences]] = None
32
- add_messages: Optional[List[Message]] = None
33
- history: Optional[List[Message]] = None
34
- reasoning_steps: Optional[List[ReasoningStep]] = None
35
- reasoning_messages: Optional[List[Message]] = None
36
-
37
- def to_dict(self) -> Dict[str, Any]:
38
- _dict = {}
39
- if self.add_messages is not None:
40
- _dict["add_messages"] = [m.to_dict() for m in self.add_messages]
41
- if self.history is not None:
42
- _dict["history"] = [m.to_dict() for m in self.history]
43
- if self.reasoning_messages is not None:
44
- _dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
45
- if self.reasoning_steps is not None:
46
- _dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
47
- if self.references is not None:
48
- _dict["references"] = [r.model_dump() for r in self.references]
49
- return _dict
50
-
51
-
52
- @dataclass
53
- class RunResponse:
54
- """Response returned by Agent.run() or Workflow.run() functions"""
55
-
56
- content: Optional[Any] = None
57
- content_type: str = "str"
58
- event: str = RunEvent.run_response.value
59
- messages: Optional[List[Message]] = None
60
- metrics: Optional[Dict[str, Any]] = None
61
- model: Optional[str] = None
62
- run_id: Optional[str] = None
63
- agent_id: Optional[str] = None
64
- session_id: Optional[str] = None
65
- workflow_id: Optional[str] = None
66
- tools: Optional[List[Dict[str, Any]]] = None
67
- images: Optional[List[ImageArtifact]] = None # Images attached to the response
68
- videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
69
- audio: Optional[List[AudioArtifact]] = None # AudioArtifact attached to the response
70
- response_audio: Optional[AudioOutput] = None # Model audio response
71
- extra_data: Optional[RunResponseExtraData] = None
72
- created_at: int = field(default_factory=lambda: int(time()))
73
-
74
- def to_dict(self) -> Dict[str, Any]:
75
- _dict = {k: v for k, v in asdict(self).items() if v is not None and k != "messages"}
76
- if self.messages is not None:
77
- _dict["messages"] = [m.to_dict() for m in self.messages]
78
-
79
- if self.extra_data is not None:
80
- _dict["extra_data"] = self.extra_data.to_dict()
81
-
82
- if self.images is not None:
83
- _dict["images"] = [img.model_dump() for img in self.images]
84
-
85
- if self.videos is not None:
86
- _dict["videos"] = [vid.model_dump() for vid in self.videos]
87
-
88
- if self.audio is not None:
89
- _dict["audio"] = [aud.model_dump() for aud in self.audio]
90
-
91
- if isinstance(self.content, BaseModel):
92
- _dict["content"] = self.content.model_dump(exclude_none=True)
93
- return _dict
94
-
95
- def to_json(self) -> str:
96
- import json
97
-
98
- _dict = self.to_dict()
99
-
100
- return json.dumps(_dict, indent=2)
101
-
102
- def get_content_as_string(self, **kwargs) -> str:
103
- import json
104
-
105
- from pydantic import BaseModel
106
-
107
- if isinstance(self.content, str):
108
- return self.content
109
- elif isinstance(self.content, BaseModel):
110
- return self.content.model_dump_json(exclude_none=True, **kwargs)
111
- else:
112
- return json.dumps(self.content, **kwargs)
File without changes
@@ -1,38 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from typing import List, Optional
3
-
4
- from agno.storage.agent.session import AgentSession
5
-
6
-
7
- class AgentStorage(ABC):
8
- @abstractmethod
9
- def create(self) -> None:
10
- raise NotImplementedError
11
-
12
- @abstractmethod
13
- def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[AgentSession]:
14
- raise NotImplementedError
15
-
16
- @abstractmethod
17
- def get_all_session_ids(self, user_id: Optional[str] = None, agent_id: Optional[str] = None) -> List[str]:
18
- raise NotImplementedError
19
-
20
- @abstractmethod
21
- def get_all_sessions(self, user_id: Optional[str] = None, agent_id: Optional[str] = None) -> List[AgentSession]:
22
- raise NotImplementedError
23
-
24
- @abstractmethod
25
- def upsert(self, session: AgentSession) -> Optional[AgentSession]:
26
- raise NotImplementedError
27
-
28
- @abstractmethod
29
- def delete_session(self, session_id: Optional[str] = None):
30
- raise NotImplementedError
31
-
32
- @abstractmethod
33
- def drop(self) -> None:
34
- raise NotImplementedError
35
-
36
- @abstractmethod
37
- def upgrade_schema(self) -> None:
38
- raise NotImplementedError