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,595 +0,0 @@
1
- import json
2
- from dataclasses import dataclass, field
3
- from typing import Any, Callable, Dict, Iterator, List, Optional, Union
4
-
5
- from agno.models.base import Metrics, Model
6
- from agno.models.message import Message
7
- from agno.models.response import ModelResponse, ModelResponseEvent
8
- from agno.tools import Function, Toolkit
9
- from agno.utils.log import logger
10
-
11
- try:
12
- from vertexai.generative_models import (
13
- Candidate,
14
- Content,
15
- FunctionDeclaration,
16
- GenerationResponse,
17
- GenerativeModel,
18
- Part,
19
- )
20
- from vertexai.generative_models import (
21
- Tool as GeminiTool,
22
- )
23
- except (ModuleNotFoundError, ImportError):
24
- raise ImportError(
25
- "`google-cloud-aiplatform` not installed. Please install using `pip install google-cloud-aiplatform`"
26
- )
27
-
28
-
29
- @dataclass
30
- class MessageData:
31
- response_content: str = ""
32
- response_block: Content = None
33
- response_candidates: Optional[List[Candidate]] = None
34
- response_role: Optional[str] = None
35
- response_parts: Optional[List] = None
36
- response_tool_calls: List[Dict[str, Any]] = field(default_factory=list)
37
- response_usage: Optional[Dict[str, Any]] = None
38
- response_tool_call_block: Content = None
39
-
40
-
41
- @dataclass
42
- class Gemini(Model):
43
- """
44
-
45
- Class for interacting with the VertexAI Gemini API.
46
-
47
- Attributes:
48
-
49
- name (str): The name of the API. Default is "Gemini".
50
- model (str): The model name. Default is "gemini-1.5-flash-002".
51
- provider (str): The provider of the API. Default is "VertexAI".
52
- generation_config (Optional[Any]): The generation configuration.
53
- safety_settings (Optional[Any]): The safety settings.
54
- generative_model_request_params (Optional[Dict[str, Any]]): The generative model request parameters.
55
- function_declarations (Optional[List[FunctionDeclaration]]): The function declarations.
56
- client (Optional[GenerativeModel]): The GenerativeModel client.
57
- """
58
-
59
- id: str = "gemini-2.0-flash-exp"
60
- name: str = "Gemini"
61
- provider: str = "VertexAI"
62
-
63
- # Request parameters
64
- generation_config: Optional[Any] = None
65
- safety_settings: Optional[Any] = None
66
- generative_model_request_params: Optional[Dict[str, Any]] = None
67
- function_declarations: Optional[List[FunctionDeclaration]] = None
68
-
69
- # Gemini client
70
- client: Optional[GenerativeModel] = None
71
-
72
- def get_client(self) -> GenerativeModel:
73
- """
74
- Returns a GenerativeModel client.
75
-
76
- Returns:
77
- GenerativeModel: GenerativeModel client.
78
- """
79
- if self.client is None:
80
- self.client = GenerativeModel(model_name=self.id, **self.request_kwargs)
81
- return self.client
82
-
83
- @property
84
- def request_kwargs(self) -> Dict[str, Any]:
85
- """
86
- Returns the request parameters for the generative model.
87
-
88
- Returns:
89
- Dict[str, Any]: Request parameters for the generative model.
90
- """
91
- _request_params: Dict[str, Any] = {}
92
- if self.generation_config:
93
- _request_params["generation_config"] = self.generation_config
94
- if self.safety_settings:
95
- _request_params["safety_settings"] = self.safety_settings
96
- if self.generative_model_request_params:
97
- _request_params.update(self.generative_model_request_params)
98
- if self.function_declarations:
99
- _request_params["tools"] = [GeminiTool(function_declarations=self.function_declarations)]
100
- return _request_params
101
-
102
- def format_messages(self, messages: List[Message]) -> List[Content]:
103
- """
104
- Converts a list of Message objects to Gemini-compatible Content objects.
105
-
106
- Args:
107
- messages: List of Message objects containing various types of content
108
-
109
- Returns:
110
- List of Content objects formatted for Gemini's API
111
- """
112
- formatted_messages: List[Content] = []
113
-
114
- for msg in messages:
115
- if hasattr(msg, "response_tool_call_block") and msg.response_tool_call_block is not None:
116
- formatted_messages.append(Content(role=msg.role, parts=msg.response_tool_call_block.parts))
117
- else:
118
- if isinstance(msg.content, str) and msg.content:
119
- parts = [Part.from_text(msg.content)]
120
- elif isinstance(msg.content, list):
121
- parts = [Part.from_text(part) for part in msg.content if isinstance(part, str)]
122
- else:
123
- parts = []
124
- role = "model" if msg.role in ["system", "developer"] else "user" if msg.role == "tool" else msg.role
125
-
126
- if parts:
127
- formatted_messages.append(Content(role=role, parts=parts))
128
- return formatted_messages
129
-
130
- def format_functions(self, params: Dict[str, Any]) -> Dict[str, Any]:
131
- """
132
- Converts function parameters to a Gemini-compatible format.
133
-
134
- Args:
135
- params (Dict[str, Any]): The original parameter's dictionary.
136
-
137
- Returns:
138
- Dict[str, Any]: The converted parameters dictionary compatible with Gemini.
139
- """
140
- formatted_params = {}
141
- for key, value in params.items():
142
- if key == "properties" and isinstance(value, dict):
143
- converted_properties = {}
144
- for prop_key, prop_value in value.items():
145
- property_type = prop_value.get("type")
146
- if isinstance(property_type, list):
147
- # Create a copy to avoid modifying the original list
148
- non_null_types = [t for t in property_type if t != "null"]
149
- if non_null_types:
150
- # Use the first non-null type
151
- converted_type = non_null_types[0]
152
- else:
153
- # Default type if all types are 'null'
154
- converted_type = "string"
155
- else:
156
- converted_type = property_type
157
-
158
- converted_properties[prop_key] = {"type": converted_type}
159
- formatted_params[key] = converted_properties
160
- else:
161
- formatted_params[key] = value
162
- return formatted_params
163
-
164
- def add_tool(
165
- self,
166
- tool: Union[Toolkit, Callable, Dict, Function],
167
- strict: bool = False,
168
- agent: Optional[Any] = None,
169
- ) -> None:
170
- """
171
- Adds tools to the model.
172
-
173
- Args:
174
- tool: The tool to add. Can be a Tool, Toolkit, Callable, dict, or Function.
175
- strict: If True, raise an error if the tool is not a Toolkit or Callable.
176
- agent: The agent to use for the tool.
177
- """
178
- if self.function_declarations is None:
179
- self.function_declarations = []
180
-
181
- # If the tool is a Tool or Dict, log a warning.
182
- if isinstance(tool, Dict):
183
- logger.warning("Tool of type 'dict' is not yet supported by Gemini.")
184
-
185
- # If the tool is a Callable or Toolkit, add its functions to the Model
186
- elif callable(tool) or isinstance(tool, Toolkit) or isinstance(tool, Function):
187
- if self._functions is None:
188
- self._functions: Dict[str, Any] = {}
189
-
190
- if isinstance(tool, Toolkit):
191
- # For each function in the toolkit, process entrypoint and add to self.tools
192
- for name, func in tool.functions.items():
193
- # If the function does not exist in self._functions, add to self.tools
194
- if name not in self._functions:
195
- func._agent = agent
196
- func.process_entrypoint()
197
- self._functions[name] = func
198
- function_declaration = FunctionDeclaration(
199
- name=func.name,
200
- description=func.description,
201
- parameters=self.format_functions(func.parameters),
202
- )
203
- self.function_declarations.append(function_declaration)
204
- logger.debug(f"Function {name} from {tool.name} added to model.")
205
-
206
- elif isinstance(tool, Function):
207
- if tool.name not in self._functions:
208
- tool._agent = agent
209
- tool.process_entrypoint()
210
- self._functions[tool.name] = tool
211
- function_declaration = FunctionDeclaration(
212
- name=tool.name,
213
- description=tool.description,
214
- parameters=self.format_functions(tool.parameters),
215
- )
216
- self.function_declarations.append(function_declaration)
217
- logger.debug(f"Function {tool.name} added to model.")
218
-
219
- elif callable(tool):
220
- try:
221
- function_name = tool.__name__
222
- if function_name not in self._functions:
223
- func = Function.from_callable(tool)
224
- self._functions[func.name] = func
225
- function_declaration = FunctionDeclaration(
226
- name=func.name,
227
- description=func.description,
228
- parameters=self.format_functions(func.parameters),
229
- )
230
- self.function_declarations.append(function_declaration)
231
- logger.debug(f"Function '{func.name}' added to model.")
232
- except Exception as e:
233
- logger.warning(f"Could not add function {tool}: {e}")
234
-
235
- def invoke(self, messages: List[Message]) -> GenerationResponse:
236
- """
237
- Send a generate content request to VertexAI and return the response.
238
-
239
- Args:
240
- messages: List of Message objects containing various types of content
241
-
242
- Returns:
243
- GenerationResponse object containing the response content
244
- """
245
- return self.get_client().generate_content(contents=self.format_messages(messages))
246
-
247
- def invoke_stream(self, messages: List[Message]) -> Iterator[GenerationResponse]:
248
- """
249
- Send a generate content request to VertexAI and return the response.
250
-
251
- Args:
252
- messages: List of Message objects containing various types of content
253
-
254
- Returns:
255
- Iterator[GenerationResponse] object containing the response content
256
- """
257
- yield from self.get_client().generate_content(
258
- contents=self.format_messages(messages),
259
- stream=True,
260
- )
261
-
262
- def update_usage_metrics(
263
- self,
264
- assistant_message: Message,
265
- metrics: Metrics,
266
- usage: Optional[Dict[str, Any]] = None,
267
- ) -> None:
268
- """
269
- Update usage metrics for the assistant message.
270
-
271
- Args:
272
- assistant_message: Message object containing the response content
273
- metrics: Metrics object containing the usage metrics
274
- usage: Dict[str, Any] object containing the usage metrics
275
- """
276
- if usage:
277
- metrics.input_tokens = usage.prompt_token_count or 0 # type: ignore
278
- metrics.output_tokens = usage.candidates_token_count or 0 # type: ignore
279
- metrics.total_tokens = usage.total_token_count or 0 # type: ignore
280
-
281
- self._update_model_metrics(metrics_for_run=metrics)
282
- self._update_assistant_message_metrics(assistant_message=assistant_message, metrics_for_run=metrics)
283
-
284
- def create_assistant_message(self, response: GenerationResponse, metrics: Metrics) -> Message:
285
- """
286
- Create an assistant message from the GenerationResponse.
287
-
288
- Args:
289
- response: GenerationResponse object containing the response content
290
- metrics: Metrics object containing the usage metrics
291
-
292
- Returns:
293
- Message object containing the assistant message
294
- """
295
- message_data = MessageData()
296
-
297
- message_data.response_candidates = response.candidates
298
- message_data.response_block = response.candidates[0].content
299
- message_data.response_role = message_data.response_block.role
300
- message_data.response_parts = message_data.response_block.parts
301
- message_data.response_usage = response.usage_metadata
302
-
303
- # -*- Parse response
304
- if message_data.response_parts is not None:
305
- for part in message_data.response_parts:
306
- part_dict = type(part).to_dict(part)
307
-
308
- # Extract text if present
309
- if "text" in part_dict:
310
- message_data.response_content = part_dict.get("text")
311
-
312
- # Parse function calls
313
- if "function_call" in part_dict:
314
- message_data.response_tool_call_block = response.candidates[0].content
315
- message_data.response_tool_calls.append(
316
- {
317
- "type": "function",
318
- "function": {
319
- "name": part_dict.get("function_call").get("name"),
320
- "arguments": json.dumps(part_dict.get("function_call").get("args")),
321
- },
322
- }
323
- )
324
-
325
- # -*- Create assistant message
326
- assistant_message = Message(
327
- role=message_data.response_role or "model",
328
- content=message_data.response_content,
329
- response_tool_call_block=message_data.response_tool_call_block,
330
- )
331
-
332
- # -*- Update assistant message if tool calls are present
333
- if len(message_data.response_tool_calls) > 0:
334
- assistant_message.tool_calls = message_data.response_tool_calls
335
-
336
- # -*- Update usage metrics
337
- self.update_usage_metrics(
338
- assistant_message=assistant_message, metrics=metrics, usage=message_data.response_usage
339
- )
340
-
341
- return assistant_message
342
-
343
- def format_function_call_results(
344
- self,
345
- function_call_results: List[Message],
346
- messages: List[Message],
347
- ):
348
- """
349
- Processes the results of function calls and appends them to messages.
350
-
351
- Args:
352
- function_call_results (List[Message]): The results from running function calls.
353
- messages (List[Message]): The list of conversation messages.
354
- """
355
- if function_call_results:
356
- contents, parts = zip(
357
- *[
358
- (
359
- result.content,
360
- Part.from_function_response(name=result.tool_name, response={"content": result.content}),
361
- )
362
- for result in function_call_results
363
- ]
364
- )
365
-
366
- messages.append(Message(role="tool", content=contents))
367
-
368
- def handle_tool_calls(self, assistant_message: Message, messages: List[Message], model_response: ModelResponse):
369
- """
370
- Handle tool calls in the assistant message.
371
-
372
- Args:
373
- assistant_message (Message): The assistant message.
374
- messages (List[Message]): A list of messages.
375
- model_response (ModelResponse): The model response.
376
-
377
- Returns:
378
- Optional[ModelResponse]: The updated model response.
379
- """
380
- if assistant_message.tool_calls:
381
- if model_response.tool_calls is None:
382
- model_response.tool_calls = []
383
-
384
- model_response.content = assistant_message.get_content_string() or ""
385
- function_calls_to_run = self._get_function_calls_to_run(
386
- assistant_message, messages, error_response_role="tool"
387
- )
388
-
389
- if self.show_tool_calls:
390
- if len(function_calls_to_run) == 1:
391
- model_response.content += f"\n - Running: {function_calls_to_run[0].get_call_str()}\n\n"
392
- elif len(function_calls_to_run) > 1:
393
- model_response.content += "\nRunning:"
394
- for _f in function_calls_to_run:
395
- model_response.content += f"\n - {_f.get_call_str()}"
396
- model_response.content += "\n\n"
397
-
398
- function_call_results: List[Message] = []
399
- for function_call_response in self.run_function_calls(
400
- function_calls=function_calls_to_run,
401
- function_call_results=function_call_results,
402
- ):
403
- if (
404
- function_call_response.event == ModelResponseEvent.tool_call_completed.value
405
- and function_call_response.tool_calls is not None
406
- ):
407
- model_response.tool_calls.extend(function_call_response.tool_calls)
408
-
409
- self.format_function_call_results(function_call_results, messages)
410
-
411
- return model_response
412
- return None
413
-
414
- def response(self, messages: List[Message]) -> ModelResponse:
415
- """
416
- Send a generate content request to VertexAI and return the response.
417
-
418
- Args:
419
- messages: List of Message objects containing various types of content
420
-
421
- Returns:
422
- ModelResponse object containing the response content
423
- """
424
- logger.debug("---------- VertexAI Response Start ----------")
425
- self._log_messages(messages)
426
- model_response = ModelResponse()
427
- metrics = Metrics()
428
-
429
- metrics.start_response_timer()
430
- response: GenerationResponse = self.invoke(messages=messages)
431
- metrics.stop_response_timer()
432
-
433
- # -*- Create assistant message
434
- assistant_message = self.create_assistant_message(response=response, metrics=metrics)
435
- messages.append(assistant_message)
436
-
437
- # -*- Log response and metrics
438
- assistant_message.log()
439
- metrics.log()
440
-
441
- # -*- Handle tool calls
442
- if self.handle_tool_calls(assistant_message, messages, model_response):
443
- response_after_tool_calls = self.response(messages=messages)
444
- if response_after_tool_calls.content is not None:
445
- if model_response.content is None:
446
- model_response.content = ""
447
- model_response.content += response_after_tool_calls.content
448
- return model_response
449
-
450
- # -*- Update model response
451
- if assistant_message.content is not None:
452
- model_response.content = assistant_message.get_content_string()
453
-
454
- # -*- Remove tool call blocks and tool call results from messages
455
- for m in messages:
456
- if hasattr(m, "response_tool_call_block"):
457
- m.response_tool_call_block = None
458
- if hasattr(m, "tool_call_result"):
459
- m.tool_call_result = None
460
-
461
- logger.debug("---------- VertexAI Response End ----------")
462
- return model_response
463
-
464
- def handle_stream_tool_calls(self, assistant_message: Message, messages: List[Message]):
465
- """
466
- Parse and run function calls and append the results to messages.
467
-
468
- Args:
469
- assistant_message (Message): The assistant message containing tool calls.
470
- messages (List[Message]): The list of conversation messages.
471
-
472
- Yields:
473
- Iterator[ModelResponse]: Yields model responses during function execution.
474
- """
475
- if assistant_message.tool_calls:
476
- function_calls_to_run = self._get_function_calls_to_run(
477
- assistant_message, messages, error_response_role="tool"
478
- )
479
-
480
- if self.show_tool_calls:
481
- if len(function_calls_to_run) == 1:
482
- yield ModelResponse(content=f"\n - Running: {function_calls_to_run[0].get_call_str()}\n\n")
483
- elif len(function_calls_to_run) > 1:
484
- yield ModelResponse(content="\nRunning:")
485
- for _f in function_calls_to_run:
486
- yield ModelResponse(content=f"\n - {_f.get_call_str()}")
487
- yield ModelResponse(content="\n\n")
488
-
489
- function_call_results: List[Message] = []
490
- for intermediate_model_response in self.run_function_calls(
491
- function_calls=function_calls_to_run, function_call_results=function_call_results
492
- ):
493
- yield intermediate_model_response
494
-
495
- self.format_function_call_results(function_call_results, messages)
496
-
497
- def response_stream(self, messages: List[Message]) -> Iterator[ModelResponse]:
498
- """
499
- Send a generate content request to VertexAI and return the response.
500
-
501
- Args:
502
- messages: List of Message objects containing various types of content
503
-
504
- Yields:
505
- Iterator[ModelResponse]: Yields model responses during function execution
506
- """
507
- logger.debug("---------- VertexAI Response Start ----------")
508
- self._log_messages(messages)
509
- message_data = MessageData()
510
- metrics = Metrics()
511
-
512
- metrics.start_response_timer()
513
- for response in self.invoke_stream(messages=messages):
514
- # -*- Parse response
515
- message_data.response_block = response.candidates[0].content
516
- if message_data.response_block is not None:
517
- metrics.time_to_first_token = metrics.response_timer.elapsed
518
- message_data.response_role = message_data.response_block.role
519
- if message_data.response_block.parts:
520
- message_data.response_parts = message_data.response_block.parts
521
-
522
- if message_data.response_parts is not None:
523
- for part in message_data.response_parts:
524
- part_dict = type(part).to_dict(part)
525
-
526
- # -*- Yield text if present
527
- if "text" in part_dict:
528
- text = part_dict.get("text")
529
- yield ModelResponse(content=text)
530
- message_data.response_content += text
531
-
532
- # -*- Skip function calls if there are no parts
533
- if not message_data.response_block.parts and message_data.response_parts:
534
- continue
535
- # -*- Parse function calls
536
- if "function_call" in part_dict:
537
- message_data.response_tool_call_block = response.candidates[0].content
538
- message_data.response_tool_calls.append(
539
- {
540
- "type": "function",
541
- "function": {
542
- "name": part_dict.get("function_call").get("name"),
543
- "arguments": json.dumps(part_dict.get("function_call").get("args")),
544
- },
545
- }
546
- )
547
- message_data.response_usage = response.usage_metadata
548
-
549
- metrics.stop_response_timer()
550
-
551
- # -*- Create assistant message
552
- assistant_message = Message(
553
- role=message_data.response_role or "assistant",
554
- content=message_data.response_content,
555
- response_tool_call_block=message_data.response_tool_call_block,
556
- )
557
-
558
- # -*- Update assistant message if tool calls are present
559
- if len(message_data.response_tool_calls) > 0:
560
- assistant_message.tool_calls = message_data.response_tool_calls
561
-
562
- self.update_usage_metrics(
563
- assistant_message=assistant_message, metrics=metrics, usage=message_data.response_usage
564
- )
565
-
566
- # -*- Add assistant message to messages
567
- messages.append(assistant_message)
568
-
569
- # -*- Log response and metrics
570
- assistant_message.log()
571
- metrics.log()
572
-
573
- if assistant_message.tool_calls is not None and len(assistant_message.tool_calls) > 0:
574
- yield from self.handle_stream_tool_calls(assistant_message, messages)
575
- yield from self.response_stream(messages=messages)
576
-
577
- # -*- Remove tool call blocks and tool call results from messages
578
- for m in messages:
579
- if hasattr(m, "response_tool_call_block"):
580
- m.response_tool_call_block = None
581
- if hasattr(m, "tool_call_result"):
582
- m.tool_call_result = None
583
- logger.debug("---------- VertexAI Response End ----------")
584
-
585
- async def ainvoke(self, *args, **kwargs) -> Any:
586
- raise NotImplementedError(f"Async not supported on {self.name}.")
587
-
588
- async def ainvoke_stream(self, *args, **kwargs) -> Any:
589
- raise NotImplementedError(f"Async not supported on {self.name}.")
590
-
591
- async def aresponse(self, messages: List[Message]) -> ModelResponse:
592
- raise NotImplementedError(f"Async not supported on {self.name}.")
593
-
594
- async def aresponse_stream(self, messages: List[Message]) -> ModelResponse:
595
- raise NotImplementedError(f"Async not supported on {self.name}.")
@@ -1,3 +0,0 @@
1
- from agno.playground.deploy import deploy_playground_app
2
- from agno.playground.playground import Playground, PlaygroundSettings
3
- from agno.playground.serve import serve_playground_app