agno 2.0.0rc2__py3-none-any.whl → 2.3.0__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 (331) hide show
  1. agno/agent/agent.py +6009 -2874
  2. agno/api/api.py +2 -0
  3. agno/api/os.py +1 -1
  4. agno/culture/__init__.py +3 -0
  5. agno/culture/manager.py +956 -0
  6. agno/db/async_postgres/__init__.py +3 -0
  7. agno/db/base.py +385 -6
  8. agno/db/dynamo/dynamo.py +388 -81
  9. agno/db/dynamo/schemas.py +47 -10
  10. agno/db/dynamo/utils.py +63 -4
  11. agno/db/firestore/firestore.py +435 -64
  12. agno/db/firestore/schemas.py +11 -0
  13. agno/db/firestore/utils.py +102 -4
  14. agno/db/gcs_json/gcs_json_db.py +384 -42
  15. agno/db/gcs_json/utils.py +60 -26
  16. agno/db/in_memory/in_memory_db.py +351 -66
  17. agno/db/in_memory/utils.py +60 -2
  18. agno/db/json/json_db.py +339 -48
  19. agno/db/json/utils.py +60 -26
  20. agno/db/migrations/manager.py +199 -0
  21. agno/db/migrations/v1_to_v2.py +510 -37
  22. agno/db/migrations/versions/__init__.py +0 -0
  23. agno/db/migrations/versions/v2_3_0.py +938 -0
  24. agno/db/mongo/__init__.py +15 -1
  25. agno/db/mongo/async_mongo.py +2036 -0
  26. agno/db/mongo/mongo.py +653 -76
  27. agno/db/mongo/schemas.py +13 -0
  28. agno/db/mongo/utils.py +80 -8
  29. agno/db/mysql/mysql.py +687 -25
  30. agno/db/mysql/schemas.py +61 -37
  31. agno/db/mysql/utils.py +60 -2
  32. agno/db/postgres/__init__.py +2 -1
  33. agno/db/postgres/async_postgres.py +2001 -0
  34. agno/db/postgres/postgres.py +676 -57
  35. agno/db/postgres/schemas.py +43 -18
  36. agno/db/postgres/utils.py +164 -2
  37. agno/db/redis/redis.py +344 -38
  38. agno/db/redis/schemas.py +18 -0
  39. agno/db/redis/utils.py +60 -2
  40. agno/db/schemas/__init__.py +2 -1
  41. agno/db/schemas/culture.py +120 -0
  42. agno/db/schemas/memory.py +13 -0
  43. agno/db/singlestore/schemas.py +26 -1
  44. agno/db/singlestore/singlestore.py +687 -53
  45. agno/db/singlestore/utils.py +60 -2
  46. agno/db/sqlite/__init__.py +2 -1
  47. agno/db/sqlite/async_sqlite.py +2371 -0
  48. agno/db/sqlite/schemas.py +24 -0
  49. agno/db/sqlite/sqlite.py +774 -85
  50. agno/db/sqlite/utils.py +168 -5
  51. agno/db/surrealdb/__init__.py +3 -0
  52. agno/db/surrealdb/metrics.py +292 -0
  53. agno/db/surrealdb/models.py +309 -0
  54. agno/db/surrealdb/queries.py +71 -0
  55. agno/db/surrealdb/surrealdb.py +1361 -0
  56. agno/db/surrealdb/utils.py +147 -0
  57. agno/db/utils.py +50 -22
  58. agno/eval/accuracy.py +50 -43
  59. agno/eval/performance.py +6 -3
  60. agno/eval/reliability.py +6 -3
  61. agno/eval/utils.py +33 -16
  62. agno/exceptions.py +68 -1
  63. agno/filters.py +354 -0
  64. agno/guardrails/__init__.py +6 -0
  65. agno/guardrails/base.py +19 -0
  66. agno/guardrails/openai.py +144 -0
  67. agno/guardrails/pii.py +94 -0
  68. agno/guardrails/prompt_injection.py +52 -0
  69. agno/integrations/discord/client.py +1 -0
  70. agno/knowledge/chunking/agentic.py +13 -10
  71. agno/knowledge/chunking/fixed.py +1 -1
  72. agno/knowledge/chunking/semantic.py +40 -8
  73. agno/knowledge/chunking/strategy.py +59 -15
  74. agno/knowledge/embedder/aws_bedrock.py +9 -4
  75. agno/knowledge/embedder/azure_openai.py +54 -0
  76. agno/knowledge/embedder/base.py +2 -0
  77. agno/knowledge/embedder/cohere.py +184 -5
  78. agno/knowledge/embedder/fastembed.py +1 -1
  79. agno/knowledge/embedder/google.py +79 -1
  80. agno/knowledge/embedder/huggingface.py +9 -4
  81. agno/knowledge/embedder/jina.py +63 -0
  82. agno/knowledge/embedder/mistral.py +78 -11
  83. agno/knowledge/embedder/nebius.py +1 -1
  84. agno/knowledge/embedder/ollama.py +13 -0
  85. agno/knowledge/embedder/openai.py +37 -65
  86. agno/knowledge/embedder/sentence_transformer.py +8 -4
  87. agno/knowledge/embedder/vllm.py +262 -0
  88. agno/knowledge/embedder/voyageai.py +69 -16
  89. agno/knowledge/knowledge.py +595 -187
  90. agno/knowledge/reader/base.py +9 -2
  91. agno/knowledge/reader/csv_reader.py +8 -10
  92. agno/knowledge/reader/docx_reader.py +5 -6
  93. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  94. agno/knowledge/reader/json_reader.py +6 -5
  95. agno/knowledge/reader/markdown_reader.py +13 -13
  96. agno/knowledge/reader/pdf_reader.py +43 -68
  97. agno/knowledge/reader/pptx_reader.py +101 -0
  98. agno/knowledge/reader/reader_factory.py +51 -6
  99. agno/knowledge/reader/s3_reader.py +3 -15
  100. agno/knowledge/reader/tavily_reader.py +194 -0
  101. agno/knowledge/reader/text_reader.py +13 -13
  102. agno/knowledge/reader/web_search_reader.py +2 -43
  103. agno/knowledge/reader/website_reader.py +43 -25
  104. agno/knowledge/reranker/__init__.py +3 -0
  105. agno/knowledge/types.py +9 -0
  106. agno/knowledge/utils.py +20 -0
  107. agno/media.py +339 -266
  108. agno/memory/manager.py +336 -82
  109. agno/models/aimlapi/aimlapi.py +2 -2
  110. agno/models/anthropic/claude.py +183 -37
  111. agno/models/aws/bedrock.py +52 -112
  112. agno/models/aws/claude.py +33 -1
  113. agno/models/azure/ai_foundry.py +33 -15
  114. agno/models/azure/openai_chat.py +25 -8
  115. agno/models/base.py +1011 -566
  116. agno/models/cerebras/cerebras.py +19 -13
  117. agno/models/cerebras/cerebras_openai.py +8 -5
  118. agno/models/cohere/chat.py +27 -1
  119. agno/models/cometapi/__init__.py +5 -0
  120. agno/models/cometapi/cometapi.py +57 -0
  121. agno/models/dashscope/dashscope.py +1 -0
  122. agno/models/deepinfra/deepinfra.py +2 -2
  123. agno/models/deepseek/deepseek.py +2 -2
  124. agno/models/fireworks/fireworks.py +2 -2
  125. agno/models/google/gemini.py +110 -37
  126. agno/models/groq/groq.py +28 -11
  127. agno/models/huggingface/huggingface.py +2 -1
  128. agno/models/internlm/internlm.py +2 -2
  129. agno/models/langdb/langdb.py +4 -4
  130. agno/models/litellm/chat.py +18 -1
  131. agno/models/litellm/litellm_openai.py +2 -2
  132. agno/models/llama_cpp/__init__.py +5 -0
  133. agno/models/llama_cpp/llama_cpp.py +22 -0
  134. agno/models/message.py +143 -4
  135. agno/models/meta/llama.py +27 -10
  136. agno/models/meta/llama_openai.py +5 -17
  137. agno/models/nebius/nebius.py +6 -6
  138. agno/models/nexus/__init__.py +3 -0
  139. agno/models/nexus/nexus.py +22 -0
  140. agno/models/nvidia/nvidia.py +2 -2
  141. agno/models/ollama/chat.py +60 -6
  142. agno/models/openai/chat.py +102 -43
  143. agno/models/openai/responses.py +103 -106
  144. agno/models/openrouter/openrouter.py +41 -3
  145. agno/models/perplexity/perplexity.py +4 -5
  146. agno/models/portkey/portkey.py +3 -3
  147. agno/models/requesty/__init__.py +5 -0
  148. agno/models/requesty/requesty.py +52 -0
  149. agno/models/response.py +81 -5
  150. agno/models/sambanova/sambanova.py +2 -2
  151. agno/models/siliconflow/__init__.py +5 -0
  152. agno/models/siliconflow/siliconflow.py +25 -0
  153. agno/models/together/together.py +2 -2
  154. agno/models/utils.py +254 -8
  155. agno/models/vercel/v0.py +2 -2
  156. agno/models/vertexai/__init__.py +0 -0
  157. agno/models/vertexai/claude.py +96 -0
  158. agno/models/vllm/vllm.py +1 -0
  159. agno/models/xai/xai.py +3 -2
  160. agno/os/app.py +543 -175
  161. agno/os/auth.py +24 -14
  162. agno/os/config.py +1 -0
  163. agno/os/interfaces/__init__.py +1 -0
  164. agno/os/interfaces/a2a/__init__.py +3 -0
  165. agno/os/interfaces/a2a/a2a.py +42 -0
  166. agno/os/interfaces/a2a/router.py +250 -0
  167. agno/os/interfaces/a2a/utils.py +924 -0
  168. agno/os/interfaces/agui/agui.py +23 -7
  169. agno/os/interfaces/agui/router.py +27 -3
  170. agno/os/interfaces/agui/utils.py +242 -142
  171. agno/os/interfaces/base.py +6 -2
  172. agno/os/interfaces/slack/router.py +81 -23
  173. agno/os/interfaces/slack/slack.py +29 -14
  174. agno/os/interfaces/whatsapp/router.py +11 -4
  175. agno/os/interfaces/whatsapp/whatsapp.py +14 -7
  176. agno/os/mcp.py +111 -54
  177. agno/os/middleware/__init__.py +7 -0
  178. agno/os/middleware/jwt.py +233 -0
  179. agno/os/router.py +556 -139
  180. agno/os/routers/evals/evals.py +71 -34
  181. agno/os/routers/evals/schemas.py +31 -31
  182. agno/os/routers/evals/utils.py +6 -5
  183. agno/os/routers/health.py +31 -0
  184. agno/os/routers/home.py +52 -0
  185. agno/os/routers/knowledge/knowledge.py +185 -38
  186. agno/os/routers/knowledge/schemas.py +82 -22
  187. agno/os/routers/memory/memory.py +158 -53
  188. agno/os/routers/memory/schemas.py +20 -16
  189. agno/os/routers/metrics/metrics.py +20 -8
  190. agno/os/routers/metrics/schemas.py +16 -16
  191. agno/os/routers/session/session.py +499 -38
  192. agno/os/schema.py +308 -198
  193. agno/os/utils.py +401 -41
  194. agno/reasoning/anthropic.py +80 -0
  195. agno/reasoning/azure_ai_foundry.py +2 -2
  196. agno/reasoning/deepseek.py +2 -2
  197. agno/reasoning/default.py +3 -1
  198. agno/reasoning/gemini.py +73 -0
  199. agno/reasoning/groq.py +2 -2
  200. agno/reasoning/ollama.py +2 -2
  201. agno/reasoning/openai.py +7 -2
  202. agno/reasoning/vertexai.py +76 -0
  203. agno/run/__init__.py +6 -0
  204. agno/run/agent.py +266 -112
  205. agno/run/base.py +53 -24
  206. agno/run/team.py +252 -111
  207. agno/run/workflow.py +156 -45
  208. agno/session/agent.py +105 -89
  209. agno/session/summary.py +65 -25
  210. agno/session/team.py +176 -96
  211. agno/session/workflow.py +406 -40
  212. agno/team/team.py +3854 -1692
  213. agno/tools/brightdata.py +3 -3
  214. agno/tools/cartesia.py +3 -5
  215. agno/tools/dalle.py +9 -8
  216. agno/tools/decorator.py +4 -2
  217. agno/tools/desi_vocal.py +2 -2
  218. agno/tools/duckduckgo.py +15 -11
  219. agno/tools/e2b.py +20 -13
  220. agno/tools/eleven_labs.py +26 -28
  221. agno/tools/exa.py +21 -16
  222. agno/tools/fal.py +4 -4
  223. agno/tools/file.py +153 -23
  224. agno/tools/file_generation.py +350 -0
  225. agno/tools/firecrawl.py +4 -4
  226. agno/tools/function.py +257 -37
  227. agno/tools/giphy.py +2 -2
  228. agno/tools/gmail.py +238 -14
  229. agno/tools/google_drive.py +270 -0
  230. agno/tools/googlecalendar.py +36 -8
  231. agno/tools/googlesheets.py +20 -5
  232. agno/tools/jira.py +20 -0
  233. agno/tools/knowledge.py +3 -3
  234. agno/tools/lumalab.py +3 -3
  235. agno/tools/mcp/__init__.py +10 -0
  236. agno/tools/mcp/mcp.py +331 -0
  237. agno/tools/mcp/multi_mcp.py +347 -0
  238. agno/tools/mcp/params.py +24 -0
  239. agno/tools/mcp_toolbox.py +284 -0
  240. agno/tools/mem0.py +11 -17
  241. agno/tools/memori.py +1 -53
  242. agno/tools/memory.py +419 -0
  243. agno/tools/models/azure_openai.py +2 -2
  244. agno/tools/models/gemini.py +3 -3
  245. agno/tools/models/groq.py +3 -5
  246. agno/tools/models/nebius.py +7 -7
  247. agno/tools/models_labs.py +25 -15
  248. agno/tools/notion.py +204 -0
  249. agno/tools/openai.py +4 -9
  250. agno/tools/opencv.py +3 -3
  251. agno/tools/parallel.py +314 -0
  252. agno/tools/replicate.py +7 -7
  253. agno/tools/scrapegraph.py +58 -31
  254. agno/tools/searxng.py +2 -2
  255. agno/tools/serper.py +2 -2
  256. agno/tools/slack.py +18 -3
  257. agno/tools/spider.py +2 -2
  258. agno/tools/tavily.py +146 -0
  259. agno/tools/whatsapp.py +1 -1
  260. agno/tools/workflow.py +278 -0
  261. agno/tools/yfinance.py +12 -11
  262. agno/utils/agent.py +820 -0
  263. agno/utils/audio.py +27 -0
  264. agno/utils/common.py +90 -1
  265. agno/utils/events.py +222 -7
  266. agno/utils/gemini.py +181 -23
  267. agno/utils/hooks.py +57 -0
  268. agno/utils/http.py +111 -0
  269. agno/utils/knowledge.py +12 -5
  270. agno/utils/log.py +1 -0
  271. agno/utils/mcp.py +95 -5
  272. agno/utils/media.py +188 -10
  273. agno/utils/merge_dict.py +22 -1
  274. agno/utils/message.py +60 -0
  275. agno/utils/models/claude.py +40 -11
  276. agno/utils/models/cohere.py +1 -1
  277. agno/utils/models/watsonx.py +1 -1
  278. agno/utils/openai.py +1 -1
  279. agno/utils/print_response/agent.py +105 -21
  280. agno/utils/print_response/team.py +103 -38
  281. agno/utils/print_response/workflow.py +251 -34
  282. agno/utils/reasoning.py +22 -1
  283. agno/utils/serialize.py +32 -0
  284. agno/utils/streamlit.py +16 -10
  285. agno/utils/string.py +41 -0
  286. agno/utils/team.py +98 -9
  287. agno/utils/tools.py +1 -1
  288. agno/vectordb/base.py +23 -4
  289. agno/vectordb/cassandra/cassandra.py +65 -9
  290. agno/vectordb/chroma/chromadb.py +182 -38
  291. agno/vectordb/clickhouse/clickhousedb.py +64 -11
  292. agno/vectordb/couchbase/couchbase.py +105 -10
  293. agno/vectordb/lancedb/lance_db.py +183 -135
  294. agno/vectordb/langchaindb/langchaindb.py +25 -7
  295. agno/vectordb/lightrag/lightrag.py +17 -3
  296. agno/vectordb/llamaindex/__init__.py +3 -0
  297. agno/vectordb/llamaindex/llamaindexdb.py +46 -7
  298. agno/vectordb/milvus/milvus.py +126 -9
  299. agno/vectordb/mongodb/__init__.py +7 -1
  300. agno/vectordb/mongodb/mongodb.py +112 -7
  301. agno/vectordb/pgvector/pgvector.py +142 -21
  302. agno/vectordb/pineconedb/pineconedb.py +80 -8
  303. agno/vectordb/qdrant/qdrant.py +125 -39
  304. agno/vectordb/redis/__init__.py +9 -0
  305. agno/vectordb/redis/redisdb.py +694 -0
  306. agno/vectordb/singlestore/singlestore.py +111 -25
  307. agno/vectordb/surrealdb/surrealdb.py +31 -5
  308. agno/vectordb/upstashdb/upstashdb.py +76 -8
  309. agno/vectordb/weaviate/weaviate.py +86 -15
  310. agno/workflow/__init__.py +2 -0
  311. agno/workflow/agent.py +299 -0
  312. agno/workflow/condition.py +112 -18
  313. agno/workflow/loop.py +69 -10
  314. agno/workflow/parallel.py +266 -118
  315. agno/workflow/router.py +110 -17
  316. agno/workflow/step.py +645 -136
  317. agno/workflow/steps.py +65 -6
  318. agno/workflow/types.py +71 -33
  319. agno/workflow/workflow.py +2113 -300
  320. agno-2.3.0.dist-info/METADATA +618 -0
  321. agno-2.3.0.dist-info/RECORD +577 -0
  322. agno-2.3.0.dist-info/licenses/LICENSE +201 -0
  323. agno/knowledge/reader/url_reader.py +0 -128
  324. agno/tools/googlesearch.py +0 -98
  325. agno/tools/mcp.py +0 -610
  326. agno/utils/models/aws_claude.py +0 -170
  327. agno-2.0.0rc2.dist-info/METADATA +0 -355
  328. agno-2.0.0rc2.dist-info/RECORD +0 -515
  329. agno-2.0.0rc2.dist-info/licenses/LICENSE +0 -375
  330. {agno-2.0.0rc2.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
  331. {agno-2.0.0rc2.dist-info → agno-2.3.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from os import getenv
3
3
  from typing import Optional
4
4
 
@@ -22,7 +22,7 @@ class Sambanova(OpenAILike):
22
22
  name: str = "Sambanova"
23
23
  provider: str = "Sambanova"
24
24
 
25
- api_key: Optional[str] = getenv("SAMBANOVA_API_KEY")
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("SAMBANOVA_API_KEY"))
26
26
  base_url: str = "https://api.sambanova.ai/v1"
27
27
 
28
28
  supports_native_structured_outputs: bool = False
@@ -0,0 +1,5 @@
1
+ from agno.models.siliconflow.siliconflow import Siliconflow
2
+
3
+ __all__ = [
4
+ "Siliconflow",
5
+ ]
@@ -0,0 +1,25 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Optional
4
+
5
+ from agno.models.openai.like import OpenAILike
6
+
7
+
8
+ @dataclass
9
+ class Siliconflow(OpenAILike):
10
+ """
11
+ A class for interacting with Siliconflow API.
12
+
13
+ Attributes:
14
+ id (str): The id of the Siliconflow model to use. Default is "Qwen/QwQ-32B".
15
+ name (str): The name of this chat model instance. Default is "Siliconflow".
16
+ provider (str): The provider of the model. Default is "Siliconflow".
17
+ api_key (str): The api key to authorize request to Siliconflow.
18
+ base_url (str): The base url to which the requests are sent. Defaults to "https://api.siliconflow.cn/v1".
19
+ """
20
+
21
+ id: str = "Qwen/QwQ-32B"
22
+ name: str = "Siliconflow"
23
+ provider: str = "Siliconflow"
24
+ api_key: Optional[str] = getenv("SILICONFLOW_API_KEY")
25
+ base_url: str = "https://api.siliconflow.com/v1"
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from os import getenv
3
3
  from typing import Optional
4
4
 
@@ -21,5 +21,5 @@ class Together(OpenAILike):
21
21
  id: str = "mistralai/Mixtral-8x7B-Instruct-v0.1"
22
22
  name: str = "Together"
23
23
  provider: str = "Together"
24
- api_key: Optional[str] = getenv("TOGETHER_API_KEY")
24
+ api_key: Optional[str] = field(default_factory=lambda: getenv("TOGETHER_API_KEY"))
25
25
  base_url: str = "https://api.together.xyz/v1"
agno/models/utils.py CHANGED
@@ -1,20 +1,266 @@
1
+ from typing import Optional, Union
2
+
1
3
  from agno.models.base import Model
2
4
 
3
5
 
4
- # TODO: add all supported models
5
- def get_model(model_id: str, model_provider: str) -> Model:
6
- """Return the right Agno model instance given a pair of model provider and id"""
7
- if model_provider == "openai":
8
- from agno.models.openai import OpenAIChat
6
+ def _get_model_class(model_id: str, model_provider: str) -> Model:
7
+ if model_provider == "aimlapi":
8
+ from agno.models.aimlapi import AIMLAPI
9
+
10
+ return AIMLAPI(id=model_id)
9
11
 
10
- return OpenAIChat(id=model_id)
11
12
  elif model_provider == "anthropic":
12
13
  from agno.models.anthropic import Claude
13
14
 
14
15
  return Claude(id=model_id)
15
- elif model_provider == "gemini":
16
+
17
+ elif model_provider == "aws-bedrock":
18
+ from agno.models.aws import AwsBedrock
19
+
20
+ return AwsBedrock(id=model_id)
21
+
22
+ elif model_provider == "aws-claude":
23
+ from agno.models.aws import Claude as AWSClaude
24
+
25
+ return AWSClaude(id=model_id)
26
+
27
+ elif model_provider == "azure-ai-foundry":
28
+ from agno.models.azure import AzureAIFoundry
29
+
30
+ return AzureAIFoundry(id=model_id)
31
+
32
+ elif model_provider == "azure-openai":
33
+ from agno.models.azure import AzureOpenAI
34
+
35
+ return AzureOpenAI(id=model_id)
36
+
37
+ elif model_provider == "cerebras":
38
+ from agno.models.cerebras import Cerebras
39
+
40
+ return Cerebras(id=model_id)
41
+
42
+ elif model_provider == "cerebras-openai":
43
+ from agno.models.cerebras import CerebrasOpenAI
44
+
45
+ return CerebrasOpenAI(id=model_id)
46
+
47
+ elif model_provider == "cohere":
48
+ from agno.models.cohere import Cohere
49
+
50
+ return Cohere(id=model_id)
51
+
52
+ elif model_provider == "cometapi":
53
+ from agno.models.cometapi import CometAPI
54
+
55
+ return CometAPI(id=model_id)
56
+
57
+ elif model_provider == "dashscope":
58
+ from agno.models.dashscope import DashScope
59
+
60
+ return DashScope(id=model_id)
61
+
62
+ elif model_provider == "deepinfra":
63
+ from agno.models.deepinfra import DeepInfra
64
+
65
+ return DeepInfra(id=model_id)
66
+
67
+ elif model_provider == "deepseek":
68
+ from agno.models.deepseek import DeepSeek
69
+
70
+ return DeepSeek(id=model_id)
71
+
72
+ elif model_provider == "fireworks":
73
+ from agno.models.fireworks import Fireworks
74
+
75
+ return Fireworks(id=model_id)
76
+
77
+ elif model_provider == "google":
16
78
  from agno.models.google import Gemini
17
79
 
18
80
  return Gemini(id=model_id)
81
+
82
+ elif model_provider == "groq":
83
+ from agno.models.groq import Groq
84
+
85
+ return Groq(id=model_id)
86
+
87
+ elif model_provider == "huggingface":
88
+ from agno.models.huggingface import HuggingFace
89
+
90
+ return HuggingFace(id=model_id)
91
+
92
+ elif model_provider == "ibm":
93
+ from agno.models.ibm import WatsonX
94
+
95
+ return WatsonX(id=model_id)
96
+
97
+ elif model_provider == "internlm":
98
+ from agno.models.internlm import InternLM
99
+
100
+ return InternLM(id=model_id)
101
+
102
+ elif model_provider == "langdb":
103
+ from agno.models.langdb import LangDB
104
+
105
+ return LangDB(id=model_id)
106
+
107
+ elif model_provider == "litellm":
108
+ from agno.models.litellm import LiteLLM
109
+
110
+ return LiteLLM(id=model_id)
111
+
112
+ elif model_provider == "litellm-openai":
113
+ from agno.models.litellm import LiteLLMOpenAI
114
+
115
+ return LiteLLMOpenAI(id=model_id)
116
+
117
+ elif model_provider == "llama-cpp":
118
+ from agno.models.llama_cpp import LlamaCpp
119
+
120
+ return LlamaCpp(id=model_id)
121
+
122
+ elif model_provider == "llama-openai":
123
+ from agno.models.meta import LlamaOpenAI
124
+
125
+ return LlamaOpenAI(id=model_id)
126
+
127
+ elif model_provider == "lmstudio":
128
+ from agno.models.lmstudio import LMStudio
129
+
130
+ return LMStudio(id=model_id)
131
+
132
+ elif model_provider == "meta":
133
+ from agno.models.meta import Llama
134
+
135
+ return Llama(id=model_id)
136
+
137
+ elif model_provider == "mistral":
138
+ from agno.models.mistral import MistralChat
139
+
140
+ return MistralChat(id=model_id)
141
+
142
+ elif model_provider == "nebius":
143
+ from agno.models.nebius import Nebius
144
+
145
+ return Nebius(id=model_id)
146
+
147
+ elif model_provider == "nexus":
148
+ from agno.models.nexus import Nexus
149
+
150
+ return Nexus(id=model_id)
151
+
152
+ elif model_provider == "nvidia":
153
+ from agno.models.nvidia import Nvidia
154
+
155
+ return Nvidia(id=model_id)
156
+
157
+ elif model_provider == "ollama":
158
+ from agno.models.ollama import Ollama
159
+
160
+ return Ollama(id=model_id)
161
+
162
+ elif model_provider == "openai":
163
+ from agno.models.openai import OpenAIChat
164
+
165
+ return OpenAIChat(id=model_id)
166
+
167
+ elif model_provider == "openai-responses":
168
+ from agno.models.openai import OpenAIResponses
169
+
170
+ return OpenAIResponses(id=model_id)
171
+
172
+ elif model_provider == "openrouter":
173
+ from agno.models.openrouter import OpenRouter
174
+
175
+ return OpenRouter(id=model_id)
176
+
177
+ elif model_provider == "perplexity":
178
+ from agno.models.perplexity import Perplexity
179
+
180
+ return Perplexity(id=model_id)
181
+
182
+ elif model_provider == "portkey":
183
+ from agno.models.portkey import Portkey
184
+
185
+ return Portkey(id=model_id)
186
+
187
+ elif model_provider == "requesty":
188
+ from agno.models.requesty import Requesty
189
+
190
+ return Requesty(id=model_id)
191
+
192
+ elif model_provider == "sambanova":
193
+ from agno.models.sambanova import Sambanova
194
+
195
+ return Sambanova(id=model_id)
196
+
197
+ elif model_provider == "siliconflow":
198
+ from agno.models.siliconflow import Siliconflow
199
+
200
+ return Siliconflow(id=model_id)
201
+
202
+ elif model_provider == "together":
203
+ from agno.models.together import Together
204
+
205
+ return Together(id=model_id)
206
+
207
+ elif model_provider == "vercel":
208
+ from agno.models.vercel import V0
209
+
210
+ return V0(id=model_id)
211
+
212
+ elif model_provider == "vertexai-claude":
213
+ from agno.models.vertexai.claude import Claude as VertexAIClaude
214
+
215
+ return VertexAIClaude(id=model_id)
216
+
217
+ elif model_provider == "vllm":
218
+ from agno.models.vllm import VLLM
219
+
220
+ return VLLM(id=model_id)
221
+
222
+ elif model_provider == "xai":
223
+ from agno.models.xai import xAI
224
+
225
+ return xAI(id=model_id)
226
+
227
+ else:
228
+ raise ValueError(f"Model provider '{model_provider}' is not supported.")
229
+
230
+
231
+ def _parse_model_string(model_string: str) -> Model:
232
+ if not model_string or not isinstance(model_string, str):
233
+ raise ValueError(f"Model string must be a non-empty string, got: {model_string}")
234
+
235
+ if ":" not in model_string:
236
+ raise ValueError(
237
+ f"Invalid model string format: '{model_string}'. Model strings should be in format '<provider>:<model_id>' e.g. 'openai:gpt-4o'"
238
+ )
239
+
240
+ parts = model_string.split(":", 1)
241
+ if len(parts) != 2:
242
+ raise ValueError(
243
+ f"Invalid model string format: '{model_string}'. Model strings should be in format '<provider>:<model_id>' e.g. 'openai:gpt-4o'"
244
+ )
245
+
246
+ model_provider, model_id = parts
247
+ model_provider = model_provider.strip().lower()
248
+ model_id = model_id.strip()
249
+
250
+ if not model_provider or not model_id:
251
+ raise ValueError(
252
+ f"Invalid model string format: '{model_string}'. Model strings should be in format '<provider>:<model_id>' e.g. 'openai:gpt-4o'"
253
+ )
254
+
255
+ return _get_model_class(model_id, model_provider)
256
+
257
+
258
+ def get_model(model: Union[Model, str, None]) -> Optional[Model]:
259
+ if model is None:
260
+ return None
261
+ elif isinstance(model, Model):
262
+ return model
263
+ elif isinstance(model, str):
264
+ return _parse_model_string(model)
19
265
  else:
20
- raise ValueError(f"Model provider {model_provider} not supported")
266
+ raise ValueError("Model must be a Model instance, string, or None")
agno/models/vercel/v0.py CHANGED
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from os import getenv
3
3
  from typing import Optional
4
4
 
@@ -22,5 +22,5 @@ class V0(OpenAILike):
22
22
  name: str = "v0"
23
23
  provider: str = "Vercel"
24
24
 
25
- api_key: Optional[str] = getenv("V0_API_KEY")
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("V0_API_KEY"))
26
26
  base_url: str = "https://api.v0.dev/v1/"
File without changes
@@ -0,0 +1,96 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Any, Dict, Optional
4
+
5
+ import httpx
6
+
7
+ from agno.models.anthropic import Claude as AnthropicClaude
8
+ from agno.utils.http import get_default_async_client, get_default_sync_client
9
+ from agno.utils.log import log_warning
10
+
11
+ try:
12
+ from anthropic import AnthropicVertex, AsyncAnthropicVertex
13
+ except ImportError as e:
14
+ raise ImportError("`anthropic` not installed. Please install it with `pip install anthropic`") from e
15
+
16
+
17
+ @dataclass
18
+ class Claude(AnthropicClaude):
19
+ """
20
+ A class representing Anthropic Claude model.
21
+
22
+ For more information, see: https://docs.anthropic.com/en/api/messages
23
+ """
24
+
25
+ id: str = "claude-sonnet-4@20250514"
26
+ name: str = "Claude"
27
+ provider: str = "VertexAI"
28
+
29
+ client: Optional[AnthropicVertex] = None # type: ignore
30
+ async_client: Optional[AsyncAnthropicVertex] = None # type: ignore
31
+
32
+ # Client parameters
33
+ region: Optional[str] = None
34
+ project_id: Optional[str] = None
35
+ base_url: Optional[str] = None
36
+
37
+ def _get_client_params(self) -> Dict[str, Any]:
38
+ client_params: Dict[str, Any] = {}
39
+
40
+ # Add API key to client parameters
41
+ client_params["region"] = self.region or getenv("CLOUD_ML_REGION")
42
+ client_params["project_id"] = self.project_id or getenv("ANTHROPIC_VERTEX_PROJECT_ID")
43
+ client_params["base_url"] = self.base_url or getenv("ANTHROPIC_VERTEX_BASE_URL")
44
+ if self.timeout is not None:
45
+ client_params["timeout"] = self.timeout
46
+
47
+ # Add additional client parameters
48
+ if self.client_params is not None:
49
+ client_params.update(self.client_params)
50
+ if self.default_headers is not None:
51
+ client_params["default_headers"] = self.default_headers
52
+ return client_params
53
+
54
+ def get_client(self):
55
+ """
56
+ Returns an instance of the Anthropic client.
57
+ """
58
+ if self.client and not self.client.is_closed():
59
+ return self.client
60
+
61
+ _client_params = self._get_client_params()
62
+ if self.http_client:
63
+ if isinstance(self.http_client, httpx.Client):
64
+ _client_params["http_client"] = self.http_client
65
+ else:
66
+ log_warning("http_client is not an instance of httpx.Client. Using default global httpx.Client.")
67
+ # Use global sync client when user http_client is invalid
68
+ _client_params["http_client"] = get_default_sync_client()
69
+ else:
70
+ # Use global sync client when no custom http_client is provided
71
+ _client_params["http_client"] = get_default_sync_client()
72
+ self.client = AnthropicVertex(**_client_params)
73
+ return self.client
74
+
75
+ def get_async_client(self):
76
+ """
77
+ Returns an instance of the async Anthropic client.
78
+ """
79
+ if self.async_client and not self.async_client.is_closed():
80
+ return self.async_client
81
+
82
+ _client_params = self._get_client_params()
83
+ if self.http_client:
84
+ if isinstance(self.http_client, httpx.AsyncClient):
85
+ _client_params["http_client"] = self.http_client
86
+ else:
87
+ log_warning(
88
+ "http_client is not an instance of httpx.AsyncClient. Using default global httpx.AsyncClient."
89
+ )
90
+ # Use global async client when user http_client is invalid
91
+ _client_params["http_client"] = get_default_async_client()
92
+ else:
93
+ # Use global async client when no custom http_client is provided
94
+ _client_params["http_client"] = get_default_async_client()
95
+ self.async_client = AsyncAnthropicVertex(**_client_params)
96
+ return self.async_client
agno/models/vllm/vllm.py CHANGED
@@ -57,6 +57,7 @@ class VLLM(OpenAILike):
57
57
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
58
58
  tools: Optional[List[Dict[str, Any]]] = None,
59
59
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
60
+ **kwargs: Any,
60
61
  ) -> Dict[str, Any]:
61
62
  request_kwargs = super().get_request_params(
62
63
  response_format=response_format, tools=tools, tool_choice=tool_choice
agno/models/xai/xai.py CHANGED
@@ -1,4 +1,4 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from os import getenv
3
3
  from typing import Any, Dict, List, Optional, Type, Union
4
4
 
@@ -34,7 +34,7 @@ class xAI(OpenAILike):
34
34
  name: str = "xAI"
35
35
  provider: str = "xAI"
36
36
 
37
- api_key: Optional[str] = getenv("XAI_API_KEY")
37
+ api_key: Optional[str] = field(default_factory=lambda: getenv("XAI_API_KEY"))
38
38
  base_url: str = "https://api.x.ai/v1"
39
39
 
40
40
  search_parameters: Optional[Dict[str, Any]] = None
@@ -44,6 +44,7 @@ class xAI(OpenAILike):
44
44
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
45
45
  tools: Optional[List[Dict[str, Any]]] = None,
46
46
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
47
+ **kwargs: Any,
47
48
  ) -> Dict[str, Any]:
48
49
  """
49
50
  Returns keyword arguments for API requests, including search parameters.