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.
- agno/agent/agent.py +6009 -2874
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +385 -6
- agno/db/dynamo/dynamo.py +388 -81
- agno/db/dynamo/schemas.py +47 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +435 -64
- agno/db/firestore/schemas.py +11 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +384 -42
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +351 -66
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +339 -48
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +510 -37
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +15 -1
- agno/db/mongo/async_mongo.py +2036 -0
- agno/db/mongo/mongo.py +653 -76
- agno/db/mongo/schemas.py +13 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/mysql.py +687 -25
- agno/db/mysql/schemas.py +61 -37
- agno/db/mysql/utils.py +60 -2
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2001 -0
- agno/db/postgres/postgres.py +676 -57
- agno/db/postgres/schemas.py +43 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +344 -38
- agno/db/redis/schemas.py +18 -0
- agno/db/redis/utils.py +60 -2
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/memory.py +13 -0
- agno/db/singlestore/schemas.py +26 -1
- agno/db/singlestore/singlestore.py +687 -53
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2371 -0
- agno/db/sqlite/schemas.py +24 -0
- agno/db/sqlite/sqlite.py +774 -85
- agno/db/sqlite/utils.py +168 -5
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1361 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +50 -22
- agno/eval/accuracy.py +50 -43
- agno/eval/performance.py +6 -3
- agno/eval/reliability.py +6 -3
- agno/eval/utils.py +33 -16
- agno/exceptions.py +68 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/discord/client.py +1 -0
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +1 -1
- agno/knowledge/chunking/semantic.py +40 -8
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/aws_bedrock.py +9 -4
- agno/knowledge/embedder/azure_openai.py +54 -0
- agno/knowledge/embedder/base.py +2 -0
- agno/knowledge/embedder/cohere.py +184 -5
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/google.py +79 -1
- agno/knowledge/embedder/huggingface.py +9 -4
- agno/knowledge/embedder/jina.py +63 -0
- agno/knowledge/embedder/mistral.py +78 -11
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +13 -0
- agno/knowledge/embedder/openai.py +37 -65
- agno/knowledge/embedder/sentence_transformer.py +8 -4
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +69 -16
- agno/knowledge/knowledge.py +595 -187
- agno/knowledge/reader/base.py +9 -2
- agno/knowledge/reader/csv_reader.py +8 -10
- agno/knowledge/reader/docx_reader.py +5 -6
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/json_reader.py +6 -5
- agno/knowledge/reader/markdown_reader.py +13 -13
- agno/knowledge/reader/pdf_reader.py +43 -68
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +51 -6
- agno/knowledge/reader/s3_reader.py +3 -15
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +13 -13
- agno/knowledge/reader/web_search_reader.py +2 -43
- agno/knowledge/reader/website_reader.py +43 -25
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/types.py +9 -0
- agno/knowledge/utils.py +20 -0
- agno/media.py +339 -266
- agno/memory/manager.py +336 -82
- agno/models/aimlapi/aimlapi.py +2 -2
- agno/models/anthropic/claude.py +183 -37
- agno/models/aws/bedrock.py +52 -112
- agno/models/aws/claude.py +33 -1
- agno/models/azure/ai_foundry.py +33 -15
- agno/models/azure/openai_chat.py +25 -8
- agno/models/base.py +1011 -566
- agno/models/cerebras/cerebras.py +19 -13
- agno/models/cerebras/cerebras_openai.py +8 -5
- agno/models/cohere/chat.py +27 -1
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/dashscope.py +1 -0
- agno/models/deepinfra/deepinfra.py +2 -2
- agno/models/deepseek/deepseek.py +2 -2
- agno/models/fireworks/fireworks.py +2 -2
- agno/models/google/gemini.py +110 -37
- agno/models/groq/groq.py +28 -11
- agno/models/huggingface/huggingface.py +2 -1
- agno/models/internlm/internlm.py +2 -2
- agno/models/langdb/langdb.py +4 -4
- agno/models/litellm/chat.py +18 -1
- agno/models/litellm/litellm_openai.py +2 -2
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/message.py +143 -4
- agno/models/meta/llama.py +27 -10
- agno/models/meta/llama_openai.py +5 -17
- agno/models/nebius/nebius.py +6 -6
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/nvidia.py +2 -2
- agno/models/ollama/chat.py +60 -6
- agno/models/openai/chat.py +102 -43
- agno/models/openai/responses.py +103 -106
- agno/models/openrouter/openrouter.py +41 -3
- agno/models/perplexity/perplexity.py +4 -5
- agno/models/portkey/portkey.py +3 -3
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +81 -5
- agno/models/sambanova/sambanova.py +2 -2
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/together.py +2 -2
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +2 -2
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +96 -0
- agno/models/vllm/vllm.py +1 -0
- agno/models/xai/xai.py +3 -2
- agno/os/app.py +543 -175
- agno/os/auth.py +24 -14
- agno/os/config.py +1 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/agui.py +23 -7
- agno/os/interfaces/agui/router.py +27 -3
- agno/os/interfaces/agui/utils.py +242 -142
- agno/os/interfaces/base.py +6 -2
- agno/os/interfaces/slack/router.py +81 -23
- agno/os/interfaces/slack/slack.py +29 -14
- agno/os/interfaces/whatsapp/router.py +11 -4
- agno/os/interfaces/whatsapp/whatsapp.py +14 -7
- agno/os/mcp.py +111 -54
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +556 -139
- agno/os/routers/evals/evals.py +71 -34
- agno/os/routers/evals/schemas.py +31 -31
- agno/os/routers/evals/utils.py +6 -5
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/knowledge.py +185 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +158 -53
- agno/os/routers/memory/schemas.py +20 -16
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +499 -38
- agno/os/schema.py +308 -198
- agno/os/utils.py +401 -41
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +2 -2
- agno/reasoning/deepseek.py +2 -2
- agno/reasoning/default.py +3 -1
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +2 -2
- agno/reasoning/ollama.py +2 -2
- agno/reasoning/openai.py +7 -2
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +266 -112
- agno/run/base.py +53 -24
- agno/run/team.py +252 -111
- agno/run/workflow.py +156 -45
- agno/session/agent.py +105 -89
- agno/session/summary.py +65 -25
- agno/session/team.py +176 -96
- agno/session/workflow.py +406 -40
- agno/team/team.py +3854 -1692
- agno/tools/brightdata.py +3 -3
- agno/tools/cartesia.py +3 -5
- agno/tools/dalle.py +9 -8
- agno/tools/decorator.py +4 -2
- agno/tools/desi_vocal.py +2 -2
- agno/tools/duckduckgo.py +15 -11
- agno/tools/e2b.py +20 -13
- agno/tools/eleven_labs.py +26 -28
- agno/tools/exa.py +21 -16
- agno/tools/fal.py +4 -4
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +350 -0
- agno/tools/firecrawl.py +4 -4
- agno/tools/function.py +257 -37
- agno/tools/giphy.py +2 -2
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +270 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- agno/tools/knowledge.py +3 -3
- agno/tools/lumalab.py +3 -3
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +11 -17
- agno/tools/memori.py +1 -53
- agno/tools/memory.py +419 -0
- agno/tools/models/azure_openai.py +2 -2
- agno/tools/models/gemini.py +3 -3
- agno/tools/models/groq.py +3 -5
- agno/tools/models/nebius.py +7 -7
- agno/tools/models_labs.py +25 -15
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +4 -9
- agno/tools/opencv.py +3 -3
- agno/tools/parallel.py +314 -0
- agno/tools/replicate.py +7 -7
- agno/tools/scrapegraph.py +58 -31
- agno/tools/searxng.py +2 -2
- agno/tools/serper.py +2 -2
- agno/tools/slack.py +18 -3
- agno/tools/spider.py +2 -2
- agno/tools/tavily.py +146 -0
- agno/tools/whatsapp.py +1 -1
- agno/tools/workflow.py +278 -0
- agno/tools/yfinance.py +12 -11
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +27 -0
- agno/utils/common.py +90 -1
- agno/utils/events.py +222 -7
- agno/utils/gemini.py +181 -23
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +111 -0
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +95 -5
- agno/utils/media.py +188 -10
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +60 -0
- agno/utils/models/claude.py +40 -11
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/print_response/agent.py +105 -21
- agno/utils/print_response/team.py +103 -38
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/reasoning.py +22 -1
- agno/utils/serialize.py +32 -0
- agno/utils/streamlit.py +16 -10
- agno/utils/string.py +41 -0
- agno/utils/team.py +98 -9
- agno/utils/tools.py +1 -1
- agno/vectordb/base.py +23 -4
- agno/vectordb/cassandra/cassandra.py +65 -9
- agno/vectordb/chroma/chromadb.py +182 -38
- agno/vectordb/clickhouse/clickhousedb.py +64 -11
- agno/vectordb/couchbase/couchbase.py +105 -10
- agno/vectordb/lancedb/lance_db.py +183 -135
- agno/vectordb/langchaindb/langchaindb.py +25 -7
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +46 -7
- agno/vectordb/milvus/milvus.py +126 -9
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +112 -7
- agno/vectordb/pgvector/pgvector.py +142 -21
- agno/vectordb/pineconedb/pineconedb.py +80 -8
- agno/vectordb/qdrant/qdrant.py +125 -39
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/singlestore/singlestore.py +111 -25
- agno/vectordb/surrealdb/surrealdb.py +31 -5
- agno/vectordb/upstashdb/upstashdb.py +76 -8
- agno/vectordb/weaviate/weaviate.py +86 -15
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +112 -18
- agno/workflow/loop.py +69 -10
- agno/workflow/parallel.py +266 -118
- agno/workflow/router.py +110 -17
- agno/workflow/step.py +645 -136
- agno/workflow/steps.py +65 -6
- agno/workflow/types.py +71 -33
- agno/workflow/workflow.py +2113 -300
- agno-2.3.0.dist-info/METADATA +618 -0
- agno-2.3.0.dist-info/RECORD +577 -0
- agno-2.3.0.dist-info/licenses/LICENSE +201 -0
- agno/knowledge/reader/url_reader.py +0 -128
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -610
- agno/utils/models/aws_claude.py +0 -170
- agno-2.0.0rc2.dist-info/METADATA +0 -355
- agno-2.0.0rc2.dist-info/RECORD +0 -515
- agno-2.0.0rc2.dist-info/licenses/LICENSE +0 -375
- {agno-2.0.0rc2.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
- {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,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"
|
agno/models/together/together.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
|
|
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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(
|
|
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.
|