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,389 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Tuple, 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.cohere import format_messages
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
from cohere import AsyncClientV2 as CohereAsyncClient
|
|
18
|
+
from cohere import ClientV2 as CohereClient
|
|
19
|
+
from cohere.v2.types.v2chat_response import V2ChatResponse
|
|
20
|
+
from cohere.v2.types.v2chat_stream_response import V2ChatStreamResponse
|
|
21
|
+
except ImportError:
|
|
22
|
+
raise ImportError("`cohere` not installed. Please install using `pip install cohere`")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass
|
|
26
|
+
class Cohere(Model):
|
|
27
|
+
"""
|
|
28
|
+
A class representing the Cohere model.
|
|
29
|
+
|
|
30
|
+
For more information, see: https://docs.cohere.com/docs/chat-api
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
id: str = "command-r-plus"
|
|
34
|
+
name: str = "cohere"
|
|
35
|
+
provider: str = "Cohere"
|
|
36
|
+
|
|
37
|
+
# -*- Request parameters
|
|
38
|
+
temperature: Optional[float] = None
|
|
39
|
+
max_tokens: Optional[int] = None
|
|
40
|
+
top_k: Optional[int] = None
|
|
41
|
+
top_p: Optional[float] = None
|
|
42
|
+
seed: Optional[int] = None
|
|
43
|
+
frequency_penalty: Optional[float] = None
|
|
44
|
+
presence_penalty: Optional[float] = None
|
|
45
|
+
logprobs: Optional[bool] = None
|
|
46
|
+
request_params: Optional[Dict[str, Any]] = None
|
|
47
|
+
strict_tools: bool = False
|
|
48
|
+
# Add chat history to the cohere messages instead of using the conversation_id
|
|
49
|
+
add_chat_history: bool = False
|
|
50
|
+
# -*- Client parameters
|
|
51
|
+
api_key: Optional[str] = None
|
|
52
|
+
client_params: Optional[Dict[str, Any]] = None
|
|
53
|
+
# -*- Provide the Cohere client manually
|
|
54
|
+
client: Optional[CohereClient] = None
|
|
55
|
+
async_client: Optional[CohereAsyncClient] = None
|
|
56
|
+
|
|
57
|
+
def get_client(self) -> CohereClient:
|
|
58
|
+
if self.client:
|
|
59
|
+
return self.client
|
|
60
|
+
|
|
61
|
+
_client_params: Dict[str, Any] = {}
|
|
62
|
+
|
|
63
|
+
self.api_key = self.api_key or getenv("CO_API_KEY")
|
|
64
|
+
if not self.api_key:
|
|
65
|
+
log_error("CO_API_KEY not set. Please set the CO_API_KEY environment variable.")
|
|
66
|
+
|
|
67
|
+
_client_params["api_key"] = self.api_key
|
|
68
|
+
|
|
69
|
+
self.client = CohereClient(**_client_params)
|
|
70
|
+
return self.client # type: ignore
|
|
71
|
+
|
|
72
|
+
def get_async_client(self) -> CohereAsyncClient:
|
|
73
|
+
if self.async_client:
|
|
74
|
+
return self.async_client
|
|
75
|
+
|
|
76
|
+
_client_params: Dict[str, Any] = {}
|
|
77
|
+
|
|
78
|
+
self.api_key = self.api_key or getenv("CO_API_KEY")
|
|
79
|
+
|
|
80
|
+
if not self.api_key:
|
|
81
|
+
log_error("CO_API_KEY not set. Please set the CO_API_KEY environment variable.")
|
|
82
|
+
|
|
83
|
+
_client_params["api_key"] = self.api_key
|
|
84
|
+
|
|
85
|
+
self.async_client = CohereAsyncClient(**_client_params)
|
|
86
|
+
return self.async_client # type: ignore
|
|
87
|
+
|
|
88
|
+
def get_request_params(
|
|
89
|
+
self,
|
|
90
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
91
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
92
|
+
) -> Dict[str, Any]:
|
|
93
|
+
_request_params: Dict[str, Any] = {}
|
|
94
|
+
if self.temperature:
|
|
95
|
+
_request_params["temperature"] = self.temperature
|
|
96
|
+
if self.max_tokens:
|
|
97
|
+
_request_params["max_tokens"] = self.max_tokens
|
|
98
|
+
if self.top_k:
|
|
99
|
+
_request_params["k"] = self.top_k
|
|
100
|
+
if self.top_p:
|
|
101
|
+
_request_params["p"] = self.top_p
|
|
102
|
+
if self.seed:
|
|
103
|
+
_request_params["seed"] = self.seed
|
|
104
|
+
if self.logprobs:
|
|
105
|
+
_request_params["logprobs"] = self.logprobs
|
|
106
|
+
if self.frequency_penalty:
|
|
107
|
+
_request_params["frequency_penalty"] = self.frequency_penalty
|
|
108
|
+
if self.presence_penalty:
|
|
109
|
+
_request_params["presence_penalty"] = self.presence_penalty
|
|
110
|
+
|
|
111
|
+
if response_format:
|
|
112
|
+
_request_params["response_format"] = response_format
|
|
113
|
+
|
|
114
|
+
# Format tools
|
|
115
|
+
if tools is not None and len(tools) > 0:
|
|
116
|
+
formatted_tools = []
|
|
117
|
+
for tool in tools:
|
|
118
|
+
if tool.get("type") == "function" and "function" in tool:
|
|
119
|
+
# Extract only the fields that Cohere supports
|
|
120
|
+
filtered_tool = {
|
|
121
|
+
"type": "function",
|
|
122
|
+
"function": {
|
|
123
|
+
"name": tool["function"]["name"],
|
|
124
|
+
"description": tool["function"]["description"],
|
|
125
|
+
"parameters": tool["function"]["parameters"],
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
formatted_tools.append(filtered_tool)
|
|
129
|
+
else:
|
|
130
|
+
# For non-function tools, pass them through as-is
|
|
131
|
+
formatted_tools.append(tool)
|
|
132
|
+
|
|
133
|
+
_request_params["tools"] = formatted_tools
|
|
134
|
+
# Fix optional parameters where the "type" is [type, null]
|
|
135
|
+
for tool in _request_params["tools"]: # type: ignore
|
|
136
|
+
if "parameters" in tool["function"] and "properties" in tool["function"]["parameters"]: # type: ignore
|
|
137
|
+
params = tool["function"]["parameters"]
|
|
138
|
+
# Cohere requires at least one required parameter, so if unset, set it to all parameters
|
|
139
|
+
if len(params.get("required", [])) == 0:
|
|
140
|
+
params["required"] = list(params["properties"].keys())
|
|
141
|
+
_request_params["strict_tools"] = self.strict_tools
|
|
142
|
+
|
|
143
|
+
if self.request_params:
|
|
144
|
+
_request_params.update(self.request_params)
|
|
145
|
+
|
|
146
|
+
if _request_params:
|
|
147
|
+
log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
|
|
148
|
+
return _request_params
|
|
149
|
+
|
|
150
|
+
def invoke(
|
|
151
|
+
self,
|
|
152
|
+
messages: List[Message],
|
|
153
|
+
assistant_message: Message,
|
|
154
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
155
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
156
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
157
|
+
run_response: Optional[RunOutput] = None,
|
|
158
|
+
) -> ModelResponse:
|
|
159
|
+
"""
|
|
160
|
+
Invoke a non-streamed chat response from the Cohere API.
|
|
161
|
+
"""
|
|
162
|
+
request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
if run_response and run_response.metrics:
|
|
166
|
+
run_response.metrics.set_time_to_first_token()
|
|
167
|
+
|
|
168
|
+
assistant_message.metrics.start_timer()
|
|
169
|
+
provider_response = self.get_client().chat(
|
|
170
|
+
model=self.id,
|
|
171
|
+
messages=format_messages(messages), # type: ignore
|
|
172
|
+
**request_kwargs,
|
|
173
|
+
) # type: ignore
|
|
174
|
+
assistant_message.metrics.stop_timer()
|
|
175
|
+
|
|
176
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format)
|
|
177
|
+
|
|
178
|
+
return model_response
|
|
179
|
+
|
|
180
|
+
except Exception as e:
|
|
181
|
+
log_error(f"Unexpected error calling Cohere API: {str(e)}")
|
|
182
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
183
|
+
|
|
184
|
+
def invoke_stream(
|
|
185
|
+
self,
|
|
186
|
+
messages: List[Message],
|
|
187
|
+
assistant_message: Message,
|
|
188
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
189
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
190
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
191
|
+
run_response: Optional[RunOutput] = None,
|
|
192
|
+
) -> Iterator[ModelResponse]:
|
|
193
|
+
"""
|
|
194
|
+
Invoke a streamed chat response from the Cohere API.
|
|
195
|
+
"""
|
|
196
|
+
request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
if run_response and run_response.metrics:
|
|
200
|
+
run_response.metrics.set_time_to_first_token()
|
|
201
|
+
|
|
202
|
+
tool_use: Dict[str, Any] = {}
|
|
203
|
+
|
|
204
|
+
assistant_message.metrics.start_timer()
|
|
205
|
+
|
|
206
|
+
for response in self.get_client().chat_stream(
|
|
207
|
+
model=self.id,
|
|
208
|
+
messages=format_messages(messages), # type: ignore
|
|
209
|
+
**request_kwargs,
|
|
210
|
+
):
|
|
211
|
+
model_response, tool_use = self._parse_provider_response_delta(response, tool_use=tool_use)
|
|
212
|
+
yield model_response
|
|
213
|
+
|
|
214
|
+
assistant_message.metrics.stop_timer()
|
|
215
|
+
|
|
216
|
+
except Exception as e:
|
|
217
|
+
log_error(f"Unexpected error calling Cohere API: {str(e)}")
|
|
218
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
219
|
+
|
|
220
|
+
async def ainvoke(
|
|
221
|
+
self,
|
|
222
|
+
messages: List[Message],
|
|
223
|
+
assistant_message: Message,
|
|
224
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
225
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
226
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
227
|
+
run_response: Optional[RunOutput] = None,
|
|
228
|
+
) -> ModelResponse:
|
|
229
|
+
"""
|
|
230
|
+
Asynchronously invoke a non-streamed chat response from the Cohere API.
|
|
231
|
+
"""
|
|
232
|
+
request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
|
|
233
|
+
|
|
234
|
+
try:
|
|
235
|
+
if run_response and run_response.metrics:
|
|
236
|
+
run_response.metrics.set_time_to_first_token()
|
|
237
|
+
|
|
238
|
+
assistant_message.metrics.start_timer()
|
|
239
|
+
provider_response = await self.get_async_client().chat(
|
|
240
|
+
model=self.id,
|
|
241
|
+
messages=format_messages(messages), # type: ignore
|
|
242
|
+
**request_kwargs,
|
|
243
|
+
)
|
|
244
|
+
assistant_message.metrics.stop_timer()
|
|
245
|
+
|
|
246
|
+
model_response = self._parse_provider_response(provider_response, response_format=response_format)
|
|
247
|
+
|
|
248
|
+
return model_response
|
|
249
|
+
|
|
250
|
+
except Exception as e:
|
|
251
|
+
log_error(f"Unexpected error calling Cohere API: {str(e)}")
|
|
252
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
253
|
+
|
|
254
|
+
async def ainvoke_stream(
|
|
255
|
+
self,
|
|
256
|
+
messages: List[Message],
|
|
257
|
+
assistant_message: Message,
|
|
258
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
259
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
260
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
261
|
+
run_response: Optional[RunOutput] = None,
|
|
262
|
+
) -> AsyncIterator[ModelResponse]:
|
|
263
|
+
"""
|
|
264
|
+
Asynchronously invoke a streamed chat response from the Cohere API.
|
|
265
|
+
"""
|
|
266
|
+
request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
|
|
267
|
+
|
|
268
|
+
try:
|
|
269
|
+
if run_response and run_response.metrics:
|
|
270
|
+
run_response.metrics.set_time_to_first_token()
|
|
271
|
+
|
|
272
|
+
tool_use: Dict[str, Any] = {}
|
|
273
|
+
|
|
274
|
+
assistant_message.metrics.start_timer()
|
|
275
|
+
|
|
276
|
+
async for response in self.get_async_client().chat_stream(
|
|
277
|
+
model=self.id,
|
|
278
|
+
messages=format_messages(messages), # type: ignore
|
|
279
|
+
**request_kwargs,
|
|
280
|
+
):
|
|
281
|
+
model_response, tool_use = self._parse_provider_response_delta(response, tool_use=tool_use)
|
|
282
|
+
yield model_response
|
|
283
|
+
|
|
284
|
+
assistant_message.metrics.stop_timer()
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
log_error(f"Unexpected error calling Cohere API: {str(e)}")
|
|
288
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
289
|
+
|
|
290
|
+
def _parse_provider_response(self, response: V2ChatResponse, **kwargs) -> ModelResponse:
|
|
291
|
+
"""
|
|
292
|
+
Parse the model provider response.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
response (V2ChatResponse): The response from the Cohere API.
|
|
296
|
+
"""
|
|
297
|
+
model_response = ModelResponse()
|
|
298
|
+
|
|
299
|
+
model_response.role = response.message.role
|
|
300
|
+
|
|
301
|
+
response_message = response.message
|
|
302
|
+
if response_message.content is not None:
|
|
303
|
+
full_content = ""
|
|
304
|
+
for item in response_message.content:
|
|
305
|
+
if hasattr(item, "text") and item.text is not None: # type: ignore
|
|
306
|
+
full_content += item.text # type: ignore
|
|
307
|
+
model_response.content = full_content
|
|
308
|
+
|
|
309
|
+
if response_message.tool_calls is not None:
|
|
310
|
+
model_response.tool_calls = [t.model_dump() for t in response_message.tool_calls]
|
|
311
|
+
|
|
312
|
+
if response.usage is not None:
|
|
313
|
+
model_response.response_usage = self._get_metrics(response.usage)
|
|
314
|
+
|
|
315
|
+
return model_response
|
|
316
|
+
|
|
317
|
+
def _parse_provider_response_delta(
|
|
318
|
+
self, response: V2ChatStreamResponse, tool_use: Dict[str, Any]
|
|
319
|
+
) -> Tuple[ModelResponse, Dict[str, Any]]: # type: ignore
|
|
320
|
+
"""
|
|
321
|
+
Parse the streaming response from the model provider into ModelResponse objects.
|
|
322
|
+
|
|
323
|
+
Args:
|
|
324
|
+
response: Raw response chunk from the model provider
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
ModelResponse: Parsed response delta
|
|
328
|
+
"""
|
|
329
|
+
model_response = ModelResponse()
|
|
330
|
+
|
|
331
|
+
# 1. Add content
|
|
332
|
+
if (
|
|
333
|
+
response.type == "content-delta"
|
|
334
|
+
and response.delta is not None
|
|
335
|
+
and response.delta.message is not None
|
|
336
|
+
and response.delta.message.content is not None
|
|
337
|
+
and response.delta.message.content.text is not None
|
|
338
|
+
):
|
|
339
|
+
model_response.content = response.delta.message.content.text
|
|
340
|
+
|
|
341
|
+
# 2. Add tool calls information
|
|
342
|
+
|
|
343
|
+
# 2.1 Add starting tool call
|
|
344
|
+
elif response.type == "tool-call-start" and response.delta is not None:
|
|
345
|
+
if response.delta.message is not None and response.delta.message.tool_calls is not None:
|
|
346
|
+
tool_use = response.delta.message.tool_calls.model_dump()
|
|
347
|
+
|
|
348
|
+
# 2.2 Add tool call delta
|
|
349
|
+
elif response.type == "tool-call-delta" and response.delta is not None:
|
|
350
|
+
if (
|
|
351
|
+
response.delta.message is not None
|
|
352
|
+
and response.delta.message.tool_calls is not None
|
|
353
|
+
and response.delta.message.tool_calls.function is not None
|
|
354
|
+
and response.delta.message.tool_calls.function.arguments is not None
|
|
355
|
+
):
|
|
356
|
+
tool_use["function"]["arguments"] += response.delta.message.tool_calls.function.arguments
|
|
357
|
+
|
|
358
|
+
# 2.3 Add ending tool call
|
|
359
|
+
elif response.type == "tool-call-end":
|
|
360
|
+
model_response.tool_calls = [tool_use]
|
|
361
|
+
|
|
362
|
+
# 3. Add metrics
|
|
363
|
+
elif (
|
|
364
|
+
response.type == "message-end"
|
|
365
|
+
and response.delta is not None
|
|
366
|
+
and response.delta.usage is not None
|
|
367
|
+
and response.delta.usage.tokens is not None
|
|
368
|
+
):
|
|
369
|
+
model_response.response_usage = self._get_metrics(response.delta.usage) # type: ignore
|
|
370
|
+
|
|
371
|
+
return model_response, tool_use
|
|
372
|
+
|
|
373
|
+
def _get_metrics(self, response_usage) -> Metrics:
|
|
374
|
+
"""
|
|
375
|
+
Parse the given Cohere usage into an Agno Metrics object.
|
|
376
|
+
|
|
377
|
+
Args:
|
|
378
|
+
response_usage: Usage data from Cohere
|
|
379
|
+
|
|
380
|
+
Returns:
|
|
381
|
+
Metrics: Parsed metrics data
|
|
382
|
+
"""
|
|
383
|
+
metrics = Metrics()
|
|
384
|
+
|
|
385
|
+
metrics.input_tokens = response_usage.tokens.input_tokens or 0
|
|
386
|
+
metrics.output_tokens = response_usage.tokens.output_tokens or 0
|
|
387
|
+
metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
|
|
388
|
+
|
|
389
|
+
return metrics
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
|
|
7
|
+
from agno.models.openai.like import OpenAILike
|
|
8
|
+
from agno.utils.log import log_debug
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class CometAPI(OpenAILike):
|
|
13
|
+
"""
|
|
14
|
+
The CometAPI class provides access to multiple AI model providers
|
|
15
|
+
(GPT, Claude, Gemini, DeepSeek, etc.) through OpenAI-compatible endpoints.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
id (str): The id of the CometAPI model to use. Default is "gpt-5-mini".
|
|
19
|
+
name (str): The name for this model. Defaults to "CometAPI".
|
|
20
|
+
api_key (str): The API key for CometAPI. Defaults to COMETAPI_KEY environment variable.
|
|
21
|
+
base_url (str): The base URL for CometAPI. Defaults to "https://api.cometapi.com/v1".
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
name: str = "CometAPI"
|
|
25
|
+
id: str = "gpt-5-mini"
|
|
26
|
+
api_key: Optional[str] = field(default_factory=lambda: getenv("COMETAPI_KEY"))
|
|
27
|
+
base_url: str = "https://api.cometapi.com/v1"
|
|
28
|
+
|
|
29
|
+
def get_available_models(self) -> List[str]:
|
|
30
|
+
"""
|
|
31
|
+
Fetch available chat models from CometAPI, filtering out non-chat models.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
List of available chat model IDs
|
|
35
|
+
"""
|
|
36
|
+
if not self.api_key:
|
|
37
|
+
log_debug("No API key provided, returning empty model list")
|
|
38
|
+
return []
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
with httpx.Client() as client:
|
|
42
|
+
response = client.get(
|
|
43
|
+
f"{self.base_url}/models",
|
|
44
|
+
headers={"Authorization": f"Bearer {self.api_key}", "Accept": "application/json"},
|
|
45
|
+
timeout=30.0,
|
|
46
|
+
)
|
|
47
|
+
response.raise_for_status()
|
|
48
|
+
|
|
49
|
+
data = response.json()
|
|
50
|
+
all_models = data.get("data", [])
|
|
51
|
+
|
|
52
|
+
log_debug(f"Found {len(all_models)} total models")
|
|
53
|
+
return sorted(all_models)
|
|
54
|
+
|
|
55
|
+
except Exception as e:
|
|
56
|
+
log_debug(f"Error fetching models from CometAPI: {e}")
|
|
57
|
+
return []
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from agno.exceptions import ModelProviderError
|
|
8
|
+
from agno.models.openai.like import OpenAILike
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class DashScope(OpenAILike):
|
|
13
|
+
"""
|
|
14
|
+
A class for interacting with Qwen models via DashScope API.
|
|
15
|
+
|
|
16
|
+
Attributes:
|
|
17
|
+
id (str): The model id. Defaults to "qwen-plus".
|
|
18
|
+
name (str): The model name. Defaults to "Qwen".
|
|
19
|
+
provider (str): The provider name. Defaults to "Qwen".
|
|
20
|
+
api_key (Optional[str]): The DashScope API key.
|
|
21
|
+
base_url (str): The base URL. Defaults to "https://dashscope-intl.aliyuncs.com/compatible-mode/v1".
|
|
22
|
+
enable_thinking (bool): Enable thinking process (DashScope native parameter). Defaults to False.
|
|
23
|
+
include_thoughts (Optional[bool]): Include thinking process in response (alternative parameter). Defaults to None.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
id: str = "qwen-plus"
|
|
27
|
+
name: str = "Qwen"
|
|
28
|
+
provider: str = "Dashscope"
|
|
29
|
+
|
|
30
|
+
api_key: Optional[str] = getenv("DASHSCOPE_API_KEY") or getenv("QWEN_API_KEY")
|
|
31
|
+
base_url: str = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
|
|
32
|
+
|
|
33
|
+
# Thinking parameters
|
|
34
|
+
enable_thinking: bool = False
|
|
35
|
+
include_thoughts: Optional[bool] = None
|
|
36
|
+
thinking_budget: Optional[int] = None
|
|
37
|
+
|
|
38
|
+
# DashScope supports structured outputs
|
|
39
|
+
supports_native_structured_outputs: bool = True
|
|
40
|
+
supports_json_schema_outputs: bool = True
|
|
41
|
+
|
|
42
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
43
|
+
if not self.api_key:
|
|
44
|
+
self.api_key = getenv("DASHSCOPE_API_KEY")
|
|
45
|
+
if not self.api_key:
|
|
46
|
+
raise ModelProviderError(
|
|
47
|
+
message="DASHSCOPE_API_KEY not set. Please set the DASHSCOPE_API_KEY environment variable.",
|
|
48
|
+
model_name=self.name,
|
|
49
|
+
model_id=self.id,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# Define base client params
|
|
53
|
+
base_params = {
|
|
54
|
+
"api_key": self.api_key,
|
|
55
|
+
"organization": self.organization,
|
|
56
|
+
"base_url": self.base_url,
|
|
57
|
+
"timeout": self.timeout,
|
|
58
|
+
"max_retries": self.max_retries,
|
|
59
|
+
"default_headers": self.default_headers,
|
|
60
|
+
"default_query": self.default_query,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Create client_params dict with non-None values
|
|
64
|
+
client_params = {k: v for k, v in base_params.items() if v is not None}
|
|
65
|
+
|
|
66
|
+
# Add additional client params if provided
|
|
67
|
+
if self.client_params:
|
|
68
|
+
client_params.update(self.client_params)
|
|
69
|
+
return client_params
|
|
70
|
+
|
|
71
|
+
def get_request_params(
|
|
72
|
+
self,
|
|
73
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
74
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
75
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
76
|
+
**kwargs: Any,
|
|
77
|
+
) -> Dict[str, Any]:
|
|
78
|
+
params = super().get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice)
|
|
79
|
+
|
|
80
|
+
if self.include_thoughts is not None:
|
|
81
|
+
self.enable_thinking = self.include_thoughts
|
|
82
|
+
|
|
83
|
+
if self.enable_thinking is not None:
|
|
84
|
+
params["extra_body"] = {
|
|
85
|
+
"enable_thinking": self.enable_thinking,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if self.thinking_budget is not None:
|
|
89
|
+
params["extra_body"]["thinking_budget"] = self.thinking_budget
|
|
90
|
+
|
|
91
|
+
return params
|
|
@@ -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 DeepInfra(OpenAILike):
|
|
10
|
+
"""
|
|
11
|
+
A class for interacting with DeepInfra models.
|
|
12
|
+
|
|
13
|
+
Attributes:
|
|
14
|
+
id (str): The model id. Defaults to "meta-llama/Llama-2-70b-chat-hf".
|
|
15
|
+
name (str): The model name. Defaults to "DeepInfra".
|
|
16
|
+
provider (str): The provider name. Defaults to "DeepInfra".
|
|
17
|
+
api_key (Optional[str]): The API key.
|
|
18
|
+
base_url (str): The base URL. Defaults to "https://api.deepinfra.com/v1/openai".
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
id: str = "meta-llama/Llama-2-70b-chat-hf"
|
|
22
|
+
name: str = "DeepInfra"
|
|
23
|
+
provider: str = "DeepInfra"
|
|
24
|
+
|
|
25
|
+
api_key: Optional[str] = field(default_factory=lambda: getenv("DEEPINFRA_API_KEY"))
|
|
26
|
+
base_url: str = "https://api.deepinfra.com/v1/openai"
|
|
27
|
+
|
|
28
|
+
supports_native_structured_outputs: bool = False
|
|
@@ -0,0 +1,61 @@
|
|
|
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 DeepSeek(OpenAILike):
|
|
11
|
+
"""
|
|
12
|
+
A class for interacting with DeepSeek models.
|
|
13
|
+
|
|
14
|
+
Attributes:
|
|
15
|
+
id (str): The model id. Defaults to "deepseek-chat".
|
|
16
|
+
name (str): The model name. Defaults to "DeepSeek".
|
|
17
|
+
provider (str): The provider name. Defaults to "DeepSeek".
|
|
18
|
+
api_key (Optional[str]): The API key.
|
|
19
|
+
base_url (str): The base URL. Defaults to "https://api.deepseek.com".
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
id: str = "deepseek-chat"
|
|
23
|
+
name: str = "DeepSeek"
|
|
24
|
+
provider: str = "DeepSeek"
|
|
25
|
+
|
|
26
|
+
api_key: Optional[str] = field(default_factory=lambda: getenv("DEEPSEEK_API_KEY"))
|
|
27
|
+
base_url: str = "https://api.deepseek.com"
|
|
28
|
+
|
|
29
|
+
# Their support for structured outputs is currently broken
|
|
30
|
+
supports_native_structured_outputs: bool = False
|
|
31
|
+
|
|
32
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
33
|
+
# Fetch API key from env if not already set
|
|
34
|
+
if not self.api_key:
|
|
35
|
+
self.api_key = getenv("DEEPSEEK_API_KEY")
|
|
36
|
+
if not self.api_key:
|
|
37
|
+
# Raise error immediately if key is missing
|
|
38
|
+
raise ModelProviderError(
|
|
39
|
+
message="DEEPSEEK_API_KEY not set. Please set the DEEPSEEK_API_KEY environment variable.",
|
|
40
|
+
model_name=self.name,
|
|
41
|
+
model_id=self.id,
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
# Define base client params
|
|
45
|
+
base_params = {
|
|
46
|
+
"api_key": self.api_key,
|
|
47
|
+
"organization": self.organization,
|
|
48
|
+
"base_url": self.base_url,
|
|
49
|
+
"timeout": self.timeout,
|
|
50
|
+
"max_retries": self.max_retries,
|
|
51
|
+
"default_headers": self.default_headers,
|
|
52
|
+
"default_query": self.default_query,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Create client_params dict with non-None values
|
|
56
|
+
client_params = {k: v for k, v in base_params.items() if v is not None}
|
|
57
|
+
|
|
58
|
+
# Add additional client params if provided
|
|
59
|
+
if self.client_params:
|
|
60
|
+
client_params.update(self.client_params)
|
|
61
|
+
return client_params
|
agno/models/defaults.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
DEFAULT_OPENAI_MODEL_ID: str = "gpt-4o"
|