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.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -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/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -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 +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- 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 +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
|
@@ -1,26 +1,45 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
4
|
|
|
5
|
+
from agno.exceptions import ModelAuthenticationError
|
|
5
6
|
from agno.models.openai.like import OpenAILike
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
@dataclass
|
|
9
10
|
class Sambanova(OpenAILike):
|
|
10
11
|
"""
|
|
11
|
-
A class for interacting with Sambanova
|
|
12
|
+
A class for interacting with Sambanova API.
|
|
12
13
|
|
|
13
14
|
Attributes:
|
|
14
15
|
id (str): The id of the Sambanova model to use. Default is "Meta-Llama-3.1-8B-Instruct".
|
|
15
16
|
name (str): The name of this chat model instance. Default is "Sambanova"
|
|
16
17
|
provider (str): The provider of the model. Default is "Sambanova".
|
|
17
18
|
api_key (str): The api key to authorize request to Sambanova.
|
|
18
|
-
base_url (str): The base url to which the requests are sent.
|
|
19
|
+
base_url (str): The base url to which the requests are sent. Defaults to "https://api.sambanova.ai/v1".
|
|
19
20
|
"""
|
|
20
21
|
|
|
21
22
|
id: str = "Meta-Llama-3.1-8B-Instruct"
|
|
22
23
|
name: str = "Sambanova"
|
|
23
24
|
provider: str = "Sambanova"
|
|
24
25
|
|
|
25
|
-
api_key: Optional[str] =
|
|
26
|
+
api_key: Optional[str] = None
|
|
26
27
|
base_url: str = "https://api.sambanova.ai/v1"
|
|
28
|
+
|
|
29
|
+
supports_native_structured_outputs: bool = False
|
|
30
|
+
|
|
31
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
32
|
+
"""
|
|
33
|
+
Returns client parameters for API requests, checking for SAMBANOVA_API_KEY.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
37
|
+
"""
|
|
38
|
+
if not self.api_key:
|
|
39
|
+
self.api_key = getenv("SAMBANOVA_API_KEY")
|
|
40
|
+
if not self.api_key:
|
|
41
|
+
raise ModelAuthenticationError(
|
|
42
|
+
message="SAMBANOVA_API_KEY not set. Please set the SAMBANOVA_API_KEY environment variable.",
|
|
43
|
+
model_name=self.name,
|
|
44
|
+
)
|
|
45
|
+
return super()._get_client_params()
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
from agno.exceptions import ModelAuthenticationError
|
|
6
|
+
from agno.models.openai.like import OpenAILike
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class Siliconflow(OpenAILike):
|
|
11
|
+
"""
|
|
12
|
+
A class for interacting with Siliconflow API.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
id (str): The id of the Siliconflow model to use. Default is "Qwen/QwQ-32B".
|
|
16
|
+
name (str): The name of this chat model instance. Default is "Siliconflow".
|
|
17
|
+
provider (str): The provider of the model. Default is "Siliconflow".
|
|
18
|
+
api_key (str): The api key to authorize request to Siliconflow.
|
|
19
|
+
base_url (str): The base url to which the requests are sent. Defaults to "https://api.siliconflow.cn/v1".
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: str = "Qwen/QwQ-32B"
|
|
23
|
+
name: str = "Siliconflow"
|
|
24
|
+
provider: str = "Siliconflow"
|
|
25
|
+
api_key: Optional[str] = None
|
|
26
|
+
base_url: str = "https://api.siliconflow.com/v1"
|
|
27
|
+
|
|
28
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
29
|
+
"""
|
|
30
|
+
Returns client parameters for API requests, checking for SILICONFLOW_API_KEY.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
34
|
+
"""
|
|
35
|
+
if not self.api_key:
|
|
36
|
+
self.api_key = getenv("SILICONFLOW_API_KEY")
|
|
37
|
+
if not self.api_key:
|
|
38
|
+
raise ModelAuthenticationError(
|
|
39
|
+
message="SILICONFLOW_API_KEY not set. Please set the SILICONFLOW_API_KEY environment variable.",
|
|
40
|
+
model_name=self.name,
|
|
41
|
+
)
|
|
42
|
+
return super()._get_client_params()
|
agno/models/together/__init__.py
CHANGED
agno/models/together/together.py
CHANGED
|
@@ -1,185 +1,42 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from dataclasses import dataclass
|
|
3
2
|
from os import getenv
|
|
4
|
-
from typing import Any, Dict,
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
5
4
|
|
|
6
|
-
from agno.
|
|
7
|
-
from agno.models.openai.chat import Metrics, StreamData
|
|
5
|
+
from agno.exceptions import ModelAuthenticationError
|
|
8
6
|
from agno.models.openai.like import OpenAILike
|
|
9
|
-
from agno.models.response import ModelResponse
|
|
10
|
-
from agno.tools.function import FunctionCall
|
|
11
|
-
from agno.utils.log import logger
|
|
12
|
-
from agno.utils.tools import get_function_call_for_tool_call
|
|
13
|
-
|
|
14
|
-
try:
|
|
15
|
-
from openai.types.chat.chat_completion_chunk import (
|
|
16
|
-
ChoiceDelta,
|
|
17
|
-
ChoiceDeltaToolCall,
|
|
18
|
-
)
|
|
19
|
-
from openai.types.completion_usage import CompletionUsage
|
|
20
|
-
except ImportError:
|
|
21
|
-
logger.error("`openai` not installed")
|
|
22
|
-
raise
|
|
23
7
|
|
|
24
8
|
|
|
25
9
|
@dataclass
|
|
26
10
|
class Together(OpenAILike):
|
|
27
11
|
"""
|
|
28
|
-
A class for interacting with Together
|
|
12
|
+
A class for interacting with Together API.
|
|
29
13
|
|
|
30
14
|
Attributes:
|
|
31
15
|
id (str): The id of the Together model to use. Default is "mistralai/Mixtral-8x7B-Instruct-v0.1".
|
|
32
16
|
name (str): The name of this chat model instance. Default is "Together"
|
|
33
17
|
provider (str): The provider of the model. Default is "Together".
|
|
34
18
|
api_key (str): The api key to authorize request to Together.
|
|
35
|
-
base_url (str): The base url to which the requests are sent.
|
|
19
|
+
base_url (str): The base url to which the requests are sent. Defaults to "https://api.together.xyz/v1".
|
|
36
20
|
"""
|
|
37
21
|
|
|
38
22
|
id: str = "mistralai/Mixtral-8x7B-Instruct-v0.1"
|
|
39
23
|
name: str = "Together"
|
|
40
|
-
provider: str = "Together
|
|
41
|
-
api_key: Optional[str] =
|
|
24
|
+
provider: str = "Together"
|
|
25
|
+
api_key: Optional[str] = None
|
|
42
26
|
base_url: str = "https://api.together.xyz/v1"
|
|
43
|
-
monkey_patch: bool = False
|
|
44
|
-
|
|
45
|
-
def response_stream(self, messages: List[Message]) -> Iterator[ModelResponse]:
|
|
46
|
-
if not self.monkey_patch:
|
|
47
|
-
yield from super().response_stream(messages)
|
|
48
|
-
return
|
|
49
|
-
|
|
50
|
-
logger.debug("---------- Together Response Start ----------")
|
|
51
|
-
# -*- Log messages for debugging
|
|
52
|
-
self._log_messages(messages)
|
|
53
|
-
|
|
54
|
-
stream_data: StreamData = StreamData()
|
|
55
|
-
metrics: Metrics = Metrics()
|
|
56
|
-
assistant_message_content = ""
|
|
57
|
-
response_is_tool_call = False
|
|
58
|
-
|
|
59
|
-
# -*- Generate response
|
|
60
|
-
metrics.start_response_timer()
|
|
61
|
-
for response in self.invoke_stream(messages=messages):
|
|
62
|
-
if len(response.choices) > 0:
|
|
63
|
-
metrics.completion_tokens += 1
|
|
64
|
-
if metrics.completion_tokens == 1:
|
|
65
|
-
metrics.time_to_first_token = metrics.response_timer.elapsed
|
|
66
|
-
|
|
67
|
-
response_delta: ChoiceDelta = response.choices[0].delta
|
|
68
|
-
response_content: Optional[str] = response_delta.content
|
|
69
|
-
response_tool_calls: Optional[List[ChoiceDeltaToolCall]] = response_delta.tool_calls
|
|
70
|
-
|
|
71
|
-
if response_content is not None:
|
|
72
|
-
stream_data.response_content += response_content
|
|
73
|
-
yield ModelResponse(content=response_content)
|
|
74
|
-
|
|
75
|
-
if response_tool_calls is not None:
|
|
76
|
-
if stream_data.response_tool_calls is None:
|
|
77
|
-
stream_data.response_tool_calls = []
|
|
78
|
-
stream_data.response_tool_calls.extend(response_tool_calls)
|
|
79
|
-
|
|
80
|
-
if response.usage:
|
|
81
|
-
response_usage: Optional[CompletionUsage] = response.usage
|
|
82
|
-
if response_usage:
|
|
83
|
-
metrics.input_tokens = response_usage.prompt_tokens
|
|
84
|
-
metrics.prompt_tokens = response_usage.prompt_tokens
|
|
85
|
-
metrics.output_tokens = response_usage.completion_tokens
|
|
86
|
-
metrics.completion_tokens = response_usage.completion_tokens
|
|
87
|
-
metrics.total_tokens = response_usage.total_tokens
|
|
88
|
-
metrics.stop_response_timer()
|
|
89
|
-
logger.debug(f"Time to generate response: {metrics.response_timer.elapsed:.4f}s")
|
|
90
|
-
|
|
91
|
-
# -*- Create assistant message
|
|
92
|
-
assistant_message = Message(
|
|
93
|
-
role="assistant",
|
|
94
|
-
content=assistant_message_content,
|
|
95
|
-
)
|
|
96
|
-
# -*- Check if the response is a tool call
|
|
97
|
-
try:
|
|
98
|
-
if response_is_tool_call and assistant_message_content != "":
|
|
99
|
-
_tool_call_content = assistant_message_content.strip()
|
|
100
|
-
_tool_call_list = json.loads(_tool_call_content)
|
|
101
|
-
if isinstance(_tool_call_list, list):
|
|
102
|
-
# Build tool calls
|
|
103
|
-
_tool_calls: List[Dict[str, Any]] = []
|
|
104
|
-
logger.debug(f"Building tool calls from {_tool_call_list}")
|
|
105
|
-
for _tool_call in _tool_call_list:
|
|
106
|
-
tool_call_name = _tool_call.get("name")
|
|
107
|
-
tool_call_args = _tool_call.get("arguments")
|
|
108
|
-
_function_def = {"name": tool_call_name}
|
|
109
|
-
if tool_call_args is not None:
|
|
110
|
-
_function_def["arguments"] = json.dumps(tool_call_args)
|
|
111
|
-
_tool_calls.append(
|
|
112
|
-
{
|
|
113
|
-
"type": "function",
|
|
114
|
-
"function": _function_def,
|
|
115
|
-
}
|
|
116
|
-
)
|
|
117
|
-
assistant_message.tool_calls = _tool_calls
|
|
118
|
-
except Exception:
|
|
119
|
-
logger.warning(f"Could not parse tool calls from response: {assistant_message_content}")
|
|
120
|
-
pass
|
|
121
|
-
|
|
122
|
-
# -*- Update usage metrics
|
|
123
|
-
# Add response time to metrics
|
|
124
|
-
assistant_message.metrics["time"] = metrics.response_timer.elapsed
|
|
125
|
-
if "response_times" not in self.metrics:
|
|
126
|
-
self.metrics["response_times"] = []
|
|
127
|
-
self.metrics["response_times"].append(metrics.response_timer.elapsed)
|
|
128
|
-
|
|
129
|
-
# Add token usage to metrics
|
|
130
|
-
logger.debug(f"Estimated completion tokens: {metrics.completion_tokens}")
|
|
131
|
-
assistant_message.metrics["completion_tokens"] = metrics.completion_tokens
|
|
132
|
-
if "completion_tokens" not in self.metrics:
|
|
133
|
-
self.metrics["completion_tokens"] = metrics.completion_tokens
|
|
134
|
-
else:
|
|
135
|
-
self.metrics["completion_tokens"] += metrics.completion_tokens
|
|
136
|
-
|
|
137
|
-
# -*- Add assistant message to messages
|
|
138
|
-
messages.append(assistant_message)
|
|
139
|
-
assistant_message.log()
|
|
140
|
-
metrics.log()
|
|
141
|
-
|
|
142
|
-
# -*- Parse and run tool calls
|
|
143
|
-
if assistant_message.tool_calls is not None and len(assistant_message.tool_calls) > 0:
|
|
144
|
-
tool_role: str = "tool"
|
|
145
|
-
function_calls_to_run: List[FunctionCall] = []
|
|
146
|
-
function_call_results: List[Message] = []
|
|
147
|
-
for tool_call in assistant_message.tool_calls:
|
|
148
|
-
_tool_call_id = tool_call.get("id")
|
|
149
|
-
_function_call = get_function_call_for_tool_call(tool_call, self._functions)
|
|
150
|
-
if _function_call is None:
|
|
151
|
-
messages.append(
|
|
152
|
-
Message(
|
|
153
|
-
role=tool_role,
|
|
154
|
-
tool_call_id=_tool_call_id,
|
|
155
|
-
content="Could not find function to call.",
|
|
156
|
-
)
|
|
157
|
-
)
|
|
158
|
-
continue
|
|
159
|
-
if _function_call.error is not None:
|
|
160
|
-
messages.append(
|
|
161
|
-
Message(
|
|
162
|
-
role=tool_role,
|
|
163
|
-
tool_call_id=_tool_call_id,
|
|
164
|
-
content=_function_call.error,
|
|
165
|
-
)
|
|
166
|
-
)
|
|
167
|
-
continue
|
|
168
|
-
function_calls_to_run.append(_function_call)
|
|
169
|
-
|
|
170
|
-
if self.show_tool_calls:
|
|
171
|
-
yield ModelResponse(content="\nRunning:")
|
|
172
|
-
for _f in function_calls_to_run:
|
|
173
|
-
yield ModelResponse(content=f"\n - {_f.get_call_str()}")
|
|
174
|
-
yield ModelResponse(content="\n\n")
|
|
175
|
-
|
|
176
|
-
for intermediate_model_response in self.run_function_calls(
|
|
177
|
-
function_calls=function_calls_to_run, function_call_results=function_call_results, tool_role=tool_role
|
|
178
|
-
):
|
|
179
|
-
yield intermediate_model_response
|
|
180
27
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
28
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
29
|
+
"""
|
|
30
|
+
Returns client parameters for API requests, checking for TOGETHER_API_KEY.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
34
|
+
"""
|
|
35
|
+
if not self.api_key:
|
|
36
|
+
self.api_key = getenv("TOGETHER_API_KEY")
|
|
37
|
+
if not self.api_key:
|
|
38
|
+
raise ModelAuthenticationError(
|
|
39
|
+
message="TOGETHER_API_KEY not set. Please set the TOGETHER_API_KEY environment variable.",
|
|
40
|
+
model_name=self.name,
|
|
41
|
+
)
|
|
42
|
+
return super()._get_client_params()
|
agno/models/utils.py
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
from typing import Optional, Union
|
|
2
|
+
|
|
3
|
+
from agno.models.base import Model
|
|
4
|
+
|
|
5
|
+
|
|
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)
|
|
11
|
+
|
|
12
|
+
elif model_provider == "anthropic":
|
|
13
|
+
from agno.models.anthropic import Claude
|
|
14
|
+
|
|
15
|
+
return Claude(id=model_id)
|
|
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":
|
|
78
|
+
from agno.models.google import Gemini
|
|
79
|
+
|
|
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)
|
|
265
|
+
else:
|
|
266
|
+
raise ValueError("Model must be a Model instance, string, or None")
|
agno/models/vercel/v0.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
from agno.exceptions import ModelAuthenticationError
|
|
6
|
+
from agno.models.openai.like import OpenAILike
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class V0(OpenAILike):
|
|
11
|
+
"""
|
|
12
|
+
Class for interacting with the v0 API.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
id (str): The ID of the language model. Defaults to "v0-1.0-md".
|
|
16
|
+
name (str): The name of the API. Defaults to "v0".
|
|
17
|
+
provider (str): The provider of the API. Defaults to "v0".
|
|
18
|
+
api_key (Optional[str]): The API key for the v0 API.
|
|
19
|
+
base_url (Optional[str]): The base URL for the v0 API. Defaults to "https://v0.dev/chat/settings/keys".
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: str = "v0-1.0-md"
|
|
23
|
+
name: str = "v0"
|
|
24
|
+
provider: str = "Vercel"
|
|
25
|
+
|
|
26
|
+
api_key: Optional[str] = None
|
|
27
|
+
base_url: str = "https://api.v0.dev/v1/"
|
|
28
|
+
|
|
29
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
30
|
+
"""
|
|
31
|
+
Returns client parameters for API requests, checking for V0_API_KEY.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
35
|
+
"""
|
|
36
|
+
if not self.api_key:
|
|
37
|
+
self.api_key = getenv("V0_API_KEY")
|
|
38
|
+
if not self.api_key:
|
|
39
|
+
raise ModelAuthenticationError(
|
|
40
|
+
message="V0_API_KEY not set. Please set the V0_API_KEY environment variable.",
|
|
41
|
+
model_name=self.name,
|
|
42
|
+
)
|
|
43
|
+
return super()._get_client_params()
|
agno/models/vertexai/__init__.py
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.models.vertexai.gemini import Gemini
|