agno 2.2.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 +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- 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/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 +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -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 +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -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 +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- 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 +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- 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/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- 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/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -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 +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -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 +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- 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 +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -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 +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -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/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -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 +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -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 +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -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/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -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 +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- 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 +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- 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/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- 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 +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- 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 +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -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 +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -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/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- 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 +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -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 +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from agno.exceptions import ModelProviderError
|
|
8
|
+
from agno.models.base import Model
|
|
9
|
+
from agno.models.message import Message
|
|
10
|
+
from agno.models.metrics import Metrics
|
|
11
|
+
from agno.models.response import ModelResponse
|
|
12
|
+
from agno.run.agent import RunOutput
|
|
13
|
+
from agno.utils.log import log_debug, log_error
|
|
14
|
+
from agno.utils.models.mistral import format_messages
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
from mistralai import CompletionEvent
|
|
18
|
+
from mistralai import Mistral as MistralClient
|
|
19
|
+
from mistralai.extra import response_format_from_pydantic_model
|
|
20
|
+
from mistralai.extra.struct_chat import ParsedChatCompletionResponse
|
|
21
|
+
from mistralai.models import (
|
|
22
|
+
AssistantMessage,
|
|
23
|
+
HTTPValidationError,
|
|
24
|
+
SDKError,
|
|
25
|
+
SystemMessage,
|
|
26
|
+
ToolMessage,
|
|
27
|
+
UserMessage,
|
|
28
|
+
)
|
|
29
|
+
from mistralai.models.chatcompletionresponse import (
|
|
30
|
+
ChatCompletionResponse,
|
|
31
|
+
)
|
|
32
|
+
from mistralai.models.deltamessage import DeltaMessage
|
|
33
|
+
from mistralai.types.basemodel import Unset
|
|
34
|
+
|
|
35
|
+
MistralMessage = Union[UserMessage, AssistantMessage, SystemMessage, ToolMessage]
|
|
36
|
+
|
|
37
|
+
except ImportError:
|
|
38
|
+
raise ImportError("`mistralai` not installed. Please install using `pip install mistralai`")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
class MistralChat(Model):
|
|
43
|
+
"""
|
|
44
|
+
MistralChat is a model that uses the Mistral API to generate responses to messages.
|
|
45
|
+
|
|
46
|
+
For more information, see the Mistral API documentation: https://docs.mistral.ai/capabilities/completion/
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
id: str = "mistral-large-latest"
|
|
50
|
+
name: str = "MistralChat"
|
|
51
|
+
provider: str = "Mistral"
|
|
52
|
+
|
|
53
|
+
supports_native_structured_outputs: bool = True
|
|
54
|
+
|
|
55
|
+
# -*- Request parameters
|
|
56
|
+
temperature: Optional[float] = None
|
|
57
|
+
max_tokens: Optional[int] = None
|
|
58
|
+
top_p: Optional[float] = None
|
|
59
|
+
random_seed: Optional[int] = None
|
|
60
|
+
safe_mode: bool = False
|
|
61
|
+
safe_prompt: bool = False
|
|
62
|
+
request_params: Optional[Dict[str, Any]] = None
|
|
63
|
+
# -*- Client parameters
|
|
64
|
+
api_key: Optional[str] = None
|
|
65
|
+
endpoint: Optional[str] = None
|
|
66
|
+
max_retries: Optional[int] = None
|
|
67
|
+
timeout: Optional[int] = None
|
|
68
|
+
client_params: Optional[Dict[str, Any]] = None
|
|
69
|
+
# -*- Provide the Mistral Client manually
|
|
70
|
+
mistral_client: Optional[MistralClient] = None
|
|
71
|
+
|
|
72
|
+
def get_client(self) -> MistralClient:
|
|
73
|
+
"""
|
|
74
|
+
Get the Mistral client.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
MistralClient: The Mistral client instance.
|
|
78
|
+
"""
|
|
79
|
+
if self.mistral_client:
|
|
80
|
+
return self.mistral_client
|
|
81
|
+
|
|
82
|
+
_client_params = self._get_client_params()
|
|
83
|
+
self.mistral_client = MistralClient(**_client_params)
|
|
84
|
+
return self.mistral_client
|
|
85
|
+
|
|
86
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
87
|
+
"""
|
|
88
|
+
Get the client parameters for initializing Mistral clients.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
Dict[str, Any]: The client parameters.
|
|
92
|
+
"""
|
|
93
|
+
client_params: Dict[str, Any] = {}
|
|
94
|
+
|
|
95
|
+
self.api_key = self.api_key or getenv("MISTRAL_API_KEY")
|
|
96
|
+
if not self.api_key:
|
|
97
|
+
log_error("MISTRAL_API_KEY not set. Please set the MISTRAL_API_KEY environment variable.")
|
|
98
|
+
|
|
99
|
+
client_params.update(
|
|
100
|
+
{
|
|
101
|
+
"api_key": self.api_key,
|
|
102
|
+
"endpoint": self.endpoint,
|
|
103
|
+
"max_retries": self.max_retries,
|
|
104
|
+
"timeout": self.timeout,
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
if self.client_params is not None:
|
|
109
|
+
client_params.update(self.client_params)
|
|
110
|
+
|
|
111
|
+
# Remove None values
|
|
112
|
+
return {k: v for k, v in client_params.items() if v is not None}
|
|
113
|
+
|
|
114
|
+
def get_request_params(
|
|
115
|
+
self, tools: Optional[List[Dict[str, Any]]] = None, tool_choice: Optional[Union[str, Dict[str, Any]]] = None
|
|
116
|
+
) -> Dict[str, Any]:
|
|
117
|
+
"""
|
|
118
|
+
Get the API kwargs for the Mistral model.
|
|
119
|
+
|
|
120
|
+
Returns:
|
|
121
|
+
Dict[str, Any]: The API kwargs.
|
|
122
|
+
"""
|
|
123
|
+
_request_params: Dict[str, Any] = {}
|
|
124
|
+
if self.temperature:
|
|
125
|
+
_request_params["temperature"] = self.temperature
|
|
126
|
+
if self.max_tokens:
|
|
127
|
+
_request_params["max_tokens"] = self.max_tokens
|
|
128
|
+
if self.top_p:
|
|
129
|
+
_request_params["top_p"] = self.top_p
|
|
130
|
+
if self.random_seed:
|
|
131
|
+
_request_params["random_seed"] = self.random_seed
|
|
132
|
+
if self.safe_mode:
|
|
133
|
+
_request_params["safe_mode"] = self.safe_mode
|
|
134
|
+
if self.safe_prompt:
|
|
135
|
+
_request_params["safe_prompt"] = self.safe_prompt
|
|
136
|
+
if tools:
|
|
137
|
+
_request_params["tools"] = tools
|
|
138
|
+
if tool_choice is None:
|
|
139
|
+
_request_params["tool_choice"] = "auto"
|
|
140
|
+
else:
|
|
141
|
+
_request_params["tool_choice"] = tool_choice
|
|
142
|
+
if self.request_params:
|
|
143
|
+
_request_params.update(self.request_params)
|
|
144
|
+
|
|
145
|
+
if _request_params:
|
|
146
|
+
log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
|
|
147
|
+
return _request_params
|
|
148
|
+
|
|
149
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
150
|
+
"""
|
|
151
|
+
Convert the model to a dictionary.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Dict[str, Any]: The dictionary representation of the model.
|
|
155
|
+
"""
|
|
156
|
+
_dict = super().to_dict()
|
|
157
|
+
_dict.update(
|
|
158
|
+
{
|
|
159
|
+
"temperature": self.temperature,
|
|
160
|
+
"max_tokens": self.max_tokens,
|
|
161
|
+
"random_seed": self.random_seed,
|
|
162
|
+
"safe_mode": self.safe_mode,
|
|
163
|
+
"safe_prompt": self.safe_prompt,
|
|
164
|
+
}
|
|
165
|
+
)
|
|
166
|
+
cleaned_dict = {k: v for k, v in _dict.items() if v is not None}
|
|
167
|
+
return cleaned_dict
|
|
168
|
+
|
|
169
|
+
def invoke(
|
|
170
|
+
self,
|
|
171
|
+
messages: List[Message],
|
|
172
|
+
assistant_message: Message,
|
|
173
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
174
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
175
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
176
|
+
run_response: Optional[RunOutput] = None,
|
|
177
|
+
) -> ModelResponse:
|
|
178
|
+
"""
|
|
179
|
+
Send a chat completion request to the Mistral model.
|
|
180
|
+
"""
|
|
181
|
+
mistral_messages = format_messages(messages)
|
|
182
|
+
try:
|
|
183
|
+
response: Union[ChatCompletionResponse, ParsedChatCompletionResponse]
|
|
184
|
+
if (
|
|
185
|
+
response_format is not None
|
|
186
|
+
and isinstance(response_format, type)
|
|
187
|
+
and issubclass(response_format, BaseModel)
|
|
188
|
+
):
|
|
189
|
+
if run_response and run_response.metrics:
|
|
190
|
+
run_response.metrics.set_time_to_first_token()
|
|
191
|
+
|
|
192
|
+
assistant_message.metrics.start_timer()
|
|
193
|
+
|
|
194
|
+
response = self.get_client().chat.complete(
|
|
195
|
+
model=self.id,
|
|
196
|
+
messages=mistral_messages,
|
|
197
|
+
response_format=response_format_from_pydantic_model(response_format),
|
|
198
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
199
|
+
)
|
|
200
|
+
else:
|
|
201
|
+
if run_response and run_response.metrics:
|
|
202
|
+
run_response.metrics.set_time_to_first_token()
|
|
203
|
+
|
|
204
|
+
assistant_message.metrics.start_timer()
|
|
205
|
+
response = self.get_client().chat.complete(
|
|
206
|
+
model=self.id,
|
|
207
|
+
messages=mistral_messages,
|
|
208
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
assistant_message.metrics.stop_timer()
|
|
212
|
+
|
|
213
|
+
model_response = self._parse_provider_response(response, response_format=response_format)
|
|
214
|
+
|
|
215
|
+
return model_response
|
|
216
|
+
|
|
217
|
+
except HTTPValidationError as e:
|
|
218
|
+
log_error(f"HTTPValidationError from Mistral: {e}")
|
|
219
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
220
|
+
except SDKError as e:
|
|
221
|
+
log_error(f"SDKError from Mistral: {e}")
|
|
222
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
223
|
+
|
|
224
|
+
def invoke_stream(
|
|
225
|
+
self,
|
|
226
|
+
messages: List[Message],
|
|
227
|
+
assistant_message: Message,
|
|
228
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
229
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
230
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
231
|
+
run_response: Optional[RunOutput] = None,
|
|
232
|
+
) -> Iterator[ModelResponse]:
|
|
233
|
+
"""
|
|
234
|
+
Stream the response from the Mistral model.
|
|
235
|
+
"""
|
|
236
|
+
mistral_messages = format_messages(messages)
|
|
237
|
+
|
|
238
|
+
if run_response and run_response.metrics:
|
|
239
|
+
run_response.metrics.set_time_to_first_token()
|
|
240
|
+
|
|
241
|
+
assistant_message.metrics.start_timer()
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
for chunk in self.get_client().chat.stream(
|
|
245
|
+
model=self.id,
|
|
246
|
+
messages=mistral_messages,
|
|
247
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
248
|
+
):
|
|
249
|
+
yield self._parse_provider_response_delta(chunk)
|
|
250
|
+
|
|
251
|
+
assistant_message.metrics.stop_timer()
|
|
252
|
+
|
|
253
|
+
except HTTPValidationError as e:
|
|
254
|
+
log_error(f"HTTPValidationError from Mistral: {e}")
|
|
255
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
256
|
+
except SDKError as e:
|
|
257
|
+
log_error(f"SDKError from Mistral: {e}")
|
|
258
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
259
|
+
|
|
260
|
+
async def ainvoke(
|
|
261
|
+
self,
|
|
262
|
+
messages: List[Message],
|
|
263
|
+
assistant_message: Message,
|
|
264
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
265
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
266
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
267
|
+
run_response: Optional[RunOutput] = None,
|
|
268
|
+
) -> ModelResponse:
|
|
269
|
+
"""
|
|
270
|
+
Send an asynchronous chat completion request to the Mistral API.
|
|
271
|
+
"""
|
|
272
|
+
mistral_messages = format_messages(messages)
|
|
273
|
+
try:
|
|
274
|
+
response: Union[ChatCompletionResponse, ParsedChatCompletionResponse]
|
|
275
|
+
if (
|
|
276
|
+
response_format is not None
|
|
277
|
+
and isinstance(response_format, type)
|
|
278
|
+
and issubclass(response_format, BaseModel)
|
|
279
|
+
):
|
|
280
|
+
if run_response and run_response.metrics:
|
|
281
|
+
run_response.metrics.set_time_to_first_token()
|
|
282
|
+
assistant_message.metrics.start_timer()
|
|
283
|
+
response = await self.get_client().chat.complete_async(
|
|
284
|
+
model=self.id,
|
|
285
|
+
messages=mistral_messages,
|
|
286
|
+
response_format=response_format_from_pydantic_model(response_format),
|
|
287
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
288
|
+
)
|
|
289
|
+
else:
|
|
290
|
+
if run_response and run_response.metrics:
|
|
291
|
+
run_response.metrics.set_time_to_first_token()
|
|
292
|
+
assistant_message.metrics.start_timer()
|
|
293
|
+
response = await self.get_client().chat.complete_async(
|
|
294
|
+
model=self.id,
|
|
295
|
+
messages=mistral_messages,
|
|
296
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
assistant_message.metrics.stop_timer()
|
|
300
|
+
|
|
301
|
+
model_response = self._parse_provider_response(response, response_format=response_format)
|
|
302
|
+
|
|
303
|
+
return model_response
|
|
304
|
+
except HTTPValidationError as e:
|
|
305
|
+
log_error(f"HTTPValidationError from Mistral: {e}")
|
|
306
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
307
|
+
except SDKError as e:
|
|
308
|
+
log_error(f"SDKError from Mistral: {e}")
|
|
309
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
310
|
+
|
|
311
|
+
async def ainvoke_stream(
|
|
312
|
+
self,
|
|
313
|
+
messages: List[Message],
|
|
314
|
+
assistant_message: Message,
|
|
315
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
316
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
317
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
318
|
+
run_response: Optional[RunOutput] = None,
|
|
319
|
+
) -> AsyncIterator[ModelResponse]:
|
|
320
|
+
"""
|
|
321
|
+
Stream an asynchronous response from the Mistral API.
|
|
322
|
+
"""
|
|
323
|
+
mistral_messages = format_messages(messages)
|
|
324
|
+
try:
|
|
325
|
+
if run_response and run_response.metrics:
|
|
326
|
+
run_response.metrics.set_time_to_first_token()
|
|
327
|
+
|
|
328
|
+
assistant_message.metrics.start_timer()
|
|
329
|
+
|
|
330
|
+
async for chunk in await self.get_client().chat.stream_async(
|
|
331
|
+
model=self.id,
|
|
332
|
+
messages=mistral_messages,
|
|
333
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
334
|
+
):
|
|
335
|
+
yield self._parse_provider_response_delta(chunk)
|
|
336
|
+
|
|
337
|
+
assistant_message.metrics.stop_timer()
|
|
338
|
+
|
|
339
|
+
except HTTPValidationError as e:
|
|
340
|
+
log_error(f"HTTPValidationError from Mistral: {e}")
|
|
341
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
342
|
+
except SDKError as e:
|
|
343
|
+
log_error(f"SDKError from Mistral: {e}")
|
|
344
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
345
|
+
|
|
346
|
+
def _parse_provider_response(self, response: ChatCompletionResponse, **kwargs) -> ModelResponse:
|
|
347
|
+
"""
|
|
348
|
+
Parse the response from the Mistral model.
|
|
349
|
+
|
|
350
|
+
Args:
|
|
351
|
+
response (ChatCompletionResponse): The response from the model.
|
|
352
|
+
"""
|
|
353
|
+
model_response = ModelResponse()
|
|
354
|
+
if response.choices is not None and len(response.choices) > 0:
|
|
355
|
+
response_message: AssistantMessage = response.choices[0].message
|
|
356
|
+
|
|
357
|
+
# -*- Set content
|
|
358
|
+
model_response.content = response_message.content # type: ignore
|
|
359
|
+
|
|
360
|
+
# -*- Set role
|
|
361
|
+
model_response.role = response_message.role
|
|
362
|
+
|
|
363
|
+
# -*- Set tool calls
|
|
364
|
+
if isinstance(response_message.tool_calls, list) and len(response_message.tool_calls) > 0:
|
|
365
|
+
model_response.tool_calls = []
|
|
366
|
+
for tool_call in response_message.tool_calls:
|
|
367
|
+
model_response.tool_calls.append(
|
|
368
|
+
{
|
|
369
|
+
"id": tool_call.id,
|
|
370
|
+
"type": "function",
|
|
371
|
+
"function": tool_call.function.model_dump(),
|
|
372
|
+
}
|
|
373
|
+
)
|
|
374
|
+
|
|
375
|
+
if response.usage is not None:
|
|
376
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
377
|
+
|
|
378
|
+
return model_response
|
|
379
|
+
|
|
380
|
+
def _parse_provider_response_delta(self, response_delta: CompletionEvent) -> ModelResponse:
|
|
381
|
+
"""
|
|
382
|
+
Parse the response delta from the Mistral model.
|
|
383
|
+
"""
|
|
384
|
+
model_response = ModelResponse()
|
|
385
|
+
|
|
386
|
+
delta_message: DeltaMessage = response_delta.data.choices[0].delta
|
|
387
|
+
if delta_message.role is not None and not isinstance(delta_message.role, Unset):
|
|
388
|
+
model_response.role = delta_message.role # type: ignore
|
|
389
|
+
|
|
390
|
+
if (
|
|
391
|
+
delta_message.content is not None
|
|
392
|
+
and not isinstance(delta_message.content, Unset)
|
|
393
|
+
and isinstance(delta_message.content, str)
|
|
394
|
+
):
|
|
395
|
+
model_response.content = delta_message.content
|
|
396
|
+
|
|
397
|
+
if delta_message.tool_calls is not None:
|
|
398
|
+
model_response.tool_calls = []
|
|
399
|
+
for tool_call in delta_message.tool_calls:
|
|
400
|
+
model_response.tool_calls.append(
|
|
401
|
+
{
|
|
402
|
+
"id": tool_call.id, # type: ignore
|
|
403
|
+
"type": "function",
|
|
404
|
+
"function": {
|
|
405
|
+
"name": tool_call.function.name, # type: ignore
|
|
406
|
+
"arguments": tool_call.function.arguments, # type: ignore
|
|
407
|
+
},
|
|
408
|
+
}
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
if response_delta.data.usage is not None:
|
|
412
|
+
model_response.response_usage = self._get_metrics(response_delta.data.usage)
|
|
413
|
+
|
|
414
|
+
return model_response
|
|
415
|
+
|
|
416
|
+
def _get_metrics(self, response_usage: Any) -> Metrics:
|
|
417
|
+
"""
|
|
418
|
+
Parse the given Mistral usage into an Agno Metrics object.
|
|
419
|
+
|
|
420
|
+
Args:
|
|
421
|
+
response_usage: Usage data from Mistral
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
Metrics: Parsed metrics data
|
|
425
|
+
"""
|
|
426
|
+
metrics = Metrics()
|
|
427
|
+
|
|
428
|
+
metrics.input_tokens = response_usage.prompt_tokens or 0
|
|
429
|
+
metrics.output_tokens = response_usage.completion_tokens or 0
|
|
430
|
+
metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
|
|
431
|
+
|
|
432
|
+
return metrics
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
from agno.exceptions import ModelProviderError
|
|
6
|
+
from agno.models.openai.like import OpenAILike
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class Nebius(OpenAILike):
|
|
11
|
+
"""
|
|
12
|
+
A class for interacting with Nebius AI Studio models.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
id (str): The model id. Defaults to "Qwen/Qwen3-235B-A22B"".
|
|
16
|
+
name (str): The model name. Defaults to "Nebius".
|
|
17
|
+
provider (str): The provider name. Defaults to "Nebius".
|
|
18
|
+
api_key (Optional[str]): The API key.
|
|
19
|
+
base_url (str): The base URL. Defaults to "https://api.studio.nebius.com/v1".
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: str = "Qwen/Qwen3-4B-fast" # Default model for chat
|
|
23
|
+
name: str = "Nebius"
|
|
24
|
+
provider: str = "Nebius"
|
|
25
|
+
|
|
26
|
+
api_key: Optional[str] = field(default_factory=lambda: getenv("NEBIUS_API_KEY"))
|
|
27
|
+
base_url: str = "https://api.studio.nebius.com/v1/"
|
|
28
|
+
|
|
29
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
30
|
+
if not self.api_key:
|
|
31
|
+
raise ModelProviderError(
|
|
32
|
+
message="NEBIUS_API_KEY not set. Please set the NEBIUS_API_KEY environment variable.",
|
|
33
|
+
model_name=self.name,
|
|
34
|
+
model_id=self.id,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
# Define base client params
|
|
38
|
+
base_params = {
|
|
39
|
+
"api_key": self.api_key,
|
|
40
|
+
"organization": self.organization,
|
|
41
|
+
"base_url": self.base_url,
|
|
42
|
+
"timeout": self.timeout,
|
|
43
|
+
"max_retries": self.max_retries,
|
|
44
|
+
"default_headers": self.default_headers,
|
|
45
|
+
"default_query": self.default_query,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Create client_params dict with non-None values
|
|
49
|
+
client_params = {k: v for k, v in base_params.items() if v is not None}
|
|
50
|
+
|
|
51
|
+
# Add additional client params if provided
|
|
52
|
+
if self.client_params:
|
|
53
|
+
client_params.update(self.client_params)
|
|
54
|
+
return client_params
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from agno.models.openai.like import OpenAILike
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class Nexus(OpenAILike):
|
|
8
|
+
"""
|
|
9
|
+
A class for interacting with LLMs using Nexus.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
id (str): The id of the Nexus model to use. Default is "openai/gpt-4".
|
|
13
|
+
name (str): The name of this chat model instance. Default is "Nexus"
|
|
14
|
+
provider (str): The provider of the model. Default is "Nexus".
|
|
15
|
+
base_url (str): The base url to which the requests are sent.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
id: str = "openai/gpt-4"
|
|
19
|
+
name: str = "Nexus"
|
|
20
|
+
provider: str = "Nexus"
|
|
21
|
+
|
|
22
|
+
base_url: str = "http://localhost:8000/llm/v1/"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
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 Nvidia(OpenAILike):
|
|
10
|
+
"""
|
|
11
|
+
A class for interacting with Nvidia models.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
id (str): The id of the Nvidia model to use. Default is "nvidia/llama-3.1-nemotron-70b-instruct".
|
|
15
|
+
name (str): The name of this chat model instance. Default is "Nvidia"
|
|
16
|
+
provider (str): The provider of the model. Default is "Nvidia".
|
|
17
|
+
api_key (str): The api key to authorize request to Nvidia.
|
|
18
|
+
base_url (str): The base url to which the requests are sent.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
id: str = "meta/llama-3.3-70b-instruct"
|
|
22
|
+
name: str = "Nvidia"
|
|
23
|
+
provider: str = "Nvidia"
|
|
24
|
+
|
|
25
|
+
api_key: Optional[str] = field(default_factory=lambda: getenv("NVIDIA_API_KEY"))
|
|
26
|
+
base_url: str = "https://integrate.api.nvidia.com/v1"
|
|
27
|
+
|
|
28
|
+
supports_native_structured_outputs: bool = False
|