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,491 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from collections.abc import AsyncIterator
|
|
3
|
+
from dataclasses import asdict, dataclass
|
|
4
|
+
from os import getenv
|
|
5
|
+
from typing import Any, Dict, Iterator, List, Optional, Type, Union
|
|
6
|
+
|
|
7
|
+
import httpx
|
|
8
|
+
from huggingface_hub import ChatCompletionInputStreamOptions
|
|
9
|
+
from pydantic import BaseModel
|
|
10
|
+
|
|
11
|
+
from agno.exceptions import ModelProviderError
|
|
12
|
+
from agno.models.base import Model
|
|
13
|
+
from agno.models.message import Message
|
|
14
|
+
from agno.models.metrics import Metrics
|
|
15
|
+
from agno.models.response import ModelResponse
|
|
16
|
+
from agno.run.agent import RunOutput
|
|
17
|
+
from agno.utils.log import log_debug, log_error, log_warning
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
from huggingface_hub import (
|
|
21
|
+
AsyncInferenceClient,
|
|
22
|
+
ChatCompletionOutput,
|
|
23
|
+
ChatCompletionOutputMessage,
|
|
24
|
+
ChatCompletionStreamOutput,
|
|
25
|
+
ChatCompletionStreamOutputDelta,
|
|
26
|
+
ChatCompletionStreamOutputDeltaToolCall,
|
|
27
|
+
InferenceClient,
|
|
28
|
+
)
|
|
29
|
+
from huggingface_hub.errors import InferenceTimeoutError
|
|
30
|
+
except ImportError:
|
|
31
|
+
raise ImportError("`huggingface_hub` not installed. Please install using `pip install huggingface_hub`")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class HuggingFace(Model):
|
|
36
|
+
"""
|
|
37
|
+
A class for interacting with HuggingFace Hub Inference models.
|
|
38
|
+
|
|
39
|
+
For more information, see: https://huggingface.co/docs/api-inference/index
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
id: str = "meta-llama/Meta-Llama-3-8B-Instruct"
|
|
43
|
+
name: str = "HuggingFace"
|
|
44
|
+
provider: str = "HuggingFace"
|
|
45
|
+
|
|
46
|
+
# Request parameters
|
|
47
|
+
store: Optional[bool] = None
|
|
48
|
+
frequency_penalty: Optional[float] = None
|
|
49
|
+
logit_bias: Optional[Any] = None
|
|
50
|
+
logprobs: Optional[bool] = None
|
|
51
|
+
max_tokens: Optional[int] = None
|
|
52
|
+
presence_penalty: Optional[float] = None
|
|
53
|
+
seed: Optional[int] = None
|
|
54
|
+
stop: Optional[Union[str, List[str]]] = None
|
|
55
|
+
temperature: Optional[float] = None
|
|
56
|
+
top_logprobs: Optional[int] = None
|
|
57
|
+
top_p: Optional[float] = None
|
|
58
|
+
request_params: Optional[Dict[str, Any]] = None
|
|
59
|
+
|
|
60
|
+
# Client parameters
|
|
61
|
+
api_key: Optional[str] = None
|
|
62
|
+
base_url: Optional[Union[str, httpx.URL]] = None
|
|
63
|
+
timeout: Optional[float] = None
|
|
64
|
+
max_retries: Optional[int] = None
|
|
65
|
+
default_headers: Optional[Any] = None
|
|
66
|
+
default_query: Optional[Any] = None
|
|
67
|
+
client_params: Optional[Dict[str, Any]] = None
|
|
68
|
+
|
|
69
|
+
# HuggingFace Hub Inference clients
|
|
70
|
+
client: Optional[InferenceClient] = None
|
|
71
|
+
async_client: Optional[AsyncInferenceClient] = None
|
|
72
|
+
|
|
73
|
+
def get_client_params(self) -> Dict[str, Any]:
|
|
74
|
+
self.api_key = self.api_key or getenv("HF_TOKEN")
|
|
75
|
+
if not self.api_key:
|
|
76
|
+
log_error("HF_TOKEN not set. Please set the HF_TOKEN environment variable.")
|
|
77
|
+
|
|
78
|
+
_client_params: Dict[str, Any] = {}
|
|
79
|
+
if self.api_key is not None:
|
|
80
|
+
_client_params["api_key"] = self.api_key
|
|
81
|
+
if self.base_url is not None:
|
|
82
|
+
_client_params["base_url"] = self.base_url
|
|
83
|
+
if self.timeout is not None:
|
|
84
|
+
_client_params["timeout"] = self.timeout
|
|
85
|
+
if self.max_retries is not None:
|
|
86
|
+
_client_params["max_retries"] = self.max_retries
|
|
87
|
+
if self.default_headers is not None:
|
|
88
|
+
_client_params["default_headers"] = self.default_headers
|
|
89
|
+
if self.default_query is not None:
|
|
90
|
+
_client_params["default_query"] = self.default_query
|
|
91
|
+
if self.client_params is not None:
|
|
92
|
+
_client_params.update(self.client_params)
|
|
93
|
+
return _client_params
|
|
94
|
+
|
|
95
|
+
def get_client(self) -> InferenceClient:
|
|
96
|
+
"""
|
|
97
|
+
Returns an HuggingFace Inference client.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
InferenceClient: An instance of the Inference client.
|
|
101
|
+
"""
|
|
102
|
+
if self.client:
|
|
103
|
+
return self.client
|
|
104
|
+
|
|
105
|
+
_client_params: Dict[str, Any] = self.get_client_params()
|
|
106
|
+
self.client = InferenceClient(**_client_params)
|
|
107
|
+
return self.client
|
|
108
|
+
|
|
109
|
+
def get_async_client(self) -> AsyncInferenceClient:
|
|
110
|
+
"""
|
|
111
|
+
Returns an asynchronous HuggingFace Hub client.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
AsyncInferenceClient: An instance of the asynchronous HuggingFace Inference client.
|
|
115
|
+
"""
|
|
116
|
+
if self.async_client:
|
|
117
|
+
return self.async_client
|
|
118
|
+
|
|
119
|
+
_client_params: Dict[str, Any] = self.get_client_params()
|
|
120
|
+
self.async_client = AsyncInferenceClient(**_client_params)
|
|
121
|
+
return self.async_client
|
|
122
|
+
|
|
123
|
+
def get_request_params(
|
|
124
|
+
self, tools: Optional[List[Dict[str, Any]]] = None, tool_choice: Optional[Union[str, Dict[str, Any]]] = None
|
|
125
|
+
) -> Dict[str, Any]:
|
|
126
|
+
"""
|
|
127
|
+
Returns keyword arguments for inference model client requests.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
Dict[str, Any]: A dictionary of keyword arguments for inference model client requests.
|
|
131
|
+
"""
|
|
132
|
+
_request_params: Dict[str, Any] = {}
|
|
133
|
+
if self.store is not None:
|
|
134
|
+
_request_params["store"] = self.store
|
|
135
|
+
if self.frequency_penalty is not None:
|
|
136
|
+
_request_params["frequency_penalty"] = self.frequency_penalty
|
|
137
|
+
if self.logit_bias is not None:
|
|
138
|
+
_request_params["logit_bias"] = self.logit_bias
|
|
139
|
+
if self.logprobs is not None:
|
|
140
|
+
_request_params["logprobs"] = self.logprobs
|
|
141
|
+
if self.max_tokens is not None:
|
|
142
|
+
_request_params["max_tokens"] = self.max_tokens
|
|
143
|
+
if self.presence_penalty is not None:
|
|
144
|
+
_request_params["presence_penalty"] = self.presence_penalty
|
|
145
|
+
if self.seed is not None:
|
|
146
|
+
_request_params["seed"] = self.seed
|
|
147
|
+
if self.stop is not None:
|
|
148
|
+
_request_params["stop"] = self.stop
|
|
149
|
+
if self.temperature is not None:
|
|
150
|
+
_request_params["temperature"] = self.temperature
|
|
151
|
+
if self.top_logprobs is not None:
|
|
152
|
+
_request_params["top_logprobs"] = self.top_logprobs
|
|
153
|
+
if self.top_p is not None:
|
|
154
|
+
_request_params["top_p"] = self.top_p
|
|
155
|
+
if tools is not None:
|
|
156
|
+
_request_params["tools"] = tools
|
|
157
|
+
if tool_choice is None:
|
|
158
|
+
_request_params["tool_choice"] = "auto"
|
|
159
|
+
else:
|
|
160
|
+
_request_params["tool_choice"] = tool_choice
|
|
161
|
+
if self.request_params is not None:
|
|
162
|
+
_request_params.update(self.request_params)
|
|
163
|
+
|
|
164
|
+
if _request_params:
|
|
165
|
+
log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
|
|
166
|
+
return _request_params
|
|
167
|
+
|
|
168
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
169
|
+
"""
|
|
170
|
+
Convert the model to a dictionary.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Dict[str, Any]: The dictionary representation of the model.
|
|
174
|
+
"""
|
|
175
|
+
_dict = super().to_dict()
|
|
176
|
+
_dict.update(
|
|
177
|
+
{
|
|
178
|
+
"store": self.store,
|
|
179
|
+
"frequency_penalty": self.frequency_penalty,
|
|
180
|
+
"logit_bias": self.logit_bias,
|
|
181
|
+
"logprobs": self.logprobs,
|
|
182
|
+
"max_tokens": self.max_tokens,
|
|
183
|
+
"presence_penalty": self.presence_penalty,
|
|
184
|
+
"seed": self.seed,
|
|
185
|
+
"stop": self.stop,
|
|
186
|
+
"temperature": self.temperature,
|
|
187
|
+
"top_logprobs": self.top_logprobs,
|
|
188
|
+
"top_p": self.top_p,
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
cleaned_dict = {k: v for k, v in _dict.items() if v is not None}
|
|
192
|
+
return cleaned_dict
|
|
193
|
+
|
|
194
|
+
def _format_message(self, message: Message) -> Dict[str, Any]:
|
|
195
|
+
"""
|
|
196
|
+
Format a message into the format expected by HuggingFace.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
message (Message): The message to format.
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
Dict[str, Any]: The formatted message.
|
|
203
|
+
"""
|
|
204
|
+
message_dict: Dict[str, Any] = {
|
|
205
|
+
"role": message.role,
|
|
206
|
+
"content": message.content if message.content is not None else "",
|
|
207
|
+
"name": message.name or message.tool_name,
|
|
208
|
+
"tool_call_id": message.tool_call_id,
|
|
209
|
+
"tool_calls": message.tool_calls,
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
message_dict = {k: v for k, v in message_dict.items() if v is not None}
|
|
213
|
+
|
|
214
|
+
if message.tool_calls is None or len(message.tool_calls) == 0:
|
|
215
|
+
message_dict["tool_calls"] = None
|
|
216
|
+
|
|
217
|
+
if message.audio is not None and len(message.audio) > 0:
|
|
218
|
+
log_warning("Audio input is currently unsupported.")
|
|
219
|
+
|
|
220
|
+
if message.files is not None and len(message.files) > 0:
|
|
221
|
+
log_warning("File input is currently unsupported.")
|
|
222
|
+
|
|
223
|
+
if message.images is not None and len(message.images) > 0:
|
|
224
|
+
log_warning("Image input is currently unsupported.")
|
|
225
|
+
|
|
226
|
+
if message.videos is not None and len(message.videos) > 0:
|
|
227
|
+
log_warning("Video input is currently unsupported.")
|
|
228
|
+
|
|
229
|
+
return message_dict
|
|
230
|
+
|
|
231
|
+
def invoke(
|
|
232
|
+
self,
|
|
233
|
+
messages: List[Message],
|
|
234
|
+
assistant_message: Message,
|
|
235
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
236
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
237
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
238
|
+
run_response: Optional[RunOutput] = None,
|
|
239
|
+
) -> ModelResponse:
|
|
240
|
+
"""
|
|
241
|
+
Send a chat completion request to the HuggingFace Hub.
|
|
242
|
+
"""
|
|
243
|
+
try:
|
|
244
|
+
if run_response and run_response.metrics:
|
|
245
|
+
run_response.metrics.set_time_to_first_token()
|
|
246
|
+
|
|
247
|
+
assistant_message.metrics.start_timer()
|
|
248
|
+
provider_response = self.get_client().chat.completions.create(
|
|
249
|
+
model=self.id,
|
|
250
|
+
messages=[self._format_message(m) for m in messages],
|
|
251
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
252
|
+
)
|
|
253
|
+
assistant_message.metrics.stop_timer()
|
|
254
|
+
|
|
255
|
+
return self._parse_provider_response(provider_response, response_format=response_format)
|
|
256
|
+
|
|
257
|
+
except InferenceTimeoutError as e:
|
|
258
|
+
log_error(f"Error invoking HuggingFace model: {e}")
|
|
259
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
260
|
+
except Exception as e:
|
|
261
|
+
log_error(f"Unexpected error invoking HuggingFace model: {e}")
|
|
262
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
263
|
+
|
|
264
|
+
async def ainvoke(
|
|
265
|
+
self,
|
|
266
|
+
messages: List[Message],
|
|
267
|
+
assistant_message: Message,
|
|
268
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
269
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
270
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
271
|
+
run_response: Optional[RunOutput] = None,
|
|
272
|
+
) -> ModelResponse:
|
|
273
|
+
"""
|
|
274
|
+
Sends an asynchronous chat completion request to the HuggingFace Hub Inference.
|
|
275
|
+
"""
|
|
276
|
+
try:
|
|
277
|
+
if run_response and run_response.metrics:
|
|
278
|
+
run_response.metrics.set_time_to_first_token()
|
|
279
|
+
|
|
280
|
+
assistant_message.metrics.start_timer()
|
|
281
|
+
provider_response = await self.get_async_client().chat.completions.create(
|
|
282
|
+
model=self.id,
|
|
283
|
+
messages=[self._format_message(m) for m in messages],
|
|
284
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
285
|
+
)
|
|
286
|
+
assistant_message.metrics.stop_timer()
|
|
287
|
+
|
|
288
|
+
return self._parse_provider_response(provider_response, response_format=response_format)
|
|
289
|
+
|
|
290
|
+
except InferenceTimeoutError as e:
|
|
291
|
+
log_error(f"Error invoking HuggingFace model: {e}")
|
|
292
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
293
|
+
except Exception as e:
|
|
294
|
+
log_error(f"Unexpected error invoking HuggingFace model: {e}")
|
|
295
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
296
|
+
|
|
297
|
+
def invoke_stream(
|
|
298
|
+
self,
|
|
299
|
+
messages: List[Message],
|
|
300
|
+
assistant_message: Message,
|
|
301
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
302
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
303
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
304
|
+
run_response: Optional[RunOutput] = None,
|
|
305
|
+
) -> Iterator[ModelResponse]:
|
|
306
|
+
"""
|
|
307
|
+
Send a streaming chat completion request to the HuggingFace API.
|
|
308
|
+
"""
|
|
309
|
+
try:
|
|
310
|
+
if run_response and run_response.metrics:
|
|
311
|
+
run_response.metrics.set_time_to_first_token()
|
|
312
|
+
|
|
313
|
+
assistant_message.metrics.start_timer()
|
|
314
|
+
|
|
315
|
+
stream = self.get_client().chat.completions.create(
|
|
316
|
+
model=self.id,
|
|
317
|
+
messages=[self._format_message(m) for m in messages],
|
|
318
|
+
stream=True,
|
|
319
|
+
stream_options=ChatCompletionInputStreamOptions(include_usage=True), # type: ignore
|
|
320
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
for chunk in stream:
|
|
324
|
+
yield self._parse_provider_response_delta(chunk)
|
|
325
|
+
|
|
326
|
+
assistant_message.metrics.stop_timer()
|
|
327
|
+
|
|
328
|
+
except InferenceTimeoutError as e:
|
|
329
|
+
log_error(f"Error invoking HuggingFace model: {e}")
|
|
330
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
331
|
+
except Exception as e:
|
|
332
|
+
log_error(f"Unexpected error invoking HuggingFace model: {e}")
|
|
333
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
334
|
+
|
|
335
|
+
async def ainvoke_stream(
|
|
336
|
+
self,
|
|
337
|
+
messages: List[Message],
|
|
338
|
+
assistant_message: Message,
|
|
339
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
340
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
341
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
342
|
+
run_response: Optional[RunOutput] = None,
|
|
343
|
+
) -> AsyncIterator[Any]:
|
|
344
|
+
"""
|
|
345
|
+
Sends an asynchronous streaming chat completion request to the HuggingFace API.
|
|
346
|
+
"""
|
|
347
|
+
try:
|
|
348
|
+
if run_response and run_response.metrics:
|
|
349
|
+
run_response.metrics.set_time_to_first_token()
|
|
350
|
+
|
|
351
|
+
assistant_message.metrics.start_timer()
|
|
352
|
+
provider_response = await self.get_async_client().chat.completions.create(
|
|
353
|
+
model=self.id,
|
|
354
|
+
messages=[self._format_message(m) for m in messages],
|
|
355
|
+
stream=True,
|
|
356
|
+
stream_options=ChatCompletionInputStreamOptions(include_usage=True), # type: ignore
|
|
357
|
+
**self.get_request_params(tools=tools, tool_choice=tool_choice),
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
async for chunk in provider_response:
|
|
361
|
+
yield self._parse_provider_response_delta(chunk)
|
|
362
|
+
|
|
363
|
+
assistant_message.metrics.stop_timer()
|
|
364
|
+
|
|
365
|
+
except InferenceTimeoutError as e:
|
|
366
|
+
log_error(f"Error invoking HuggingFace model: {e}")
|
|
367
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
368
|
+
except Exception as e:
|
|
369
|
+
log_error(f"Unexpected error invoking HuggingFace model: {e}")
|
|
370
|
+
raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
|
|
371
|
+
|
|
372
|
+
# Override base method
|
|
373
|
+
@staticmethod
|
|
374
|
+
def parse_tool_calls(tool_calls_data: List[ChatCompletionStreamOutputDeltaToolCall]) -> List[Dict[str, Any]]:
|
|
375
|
+
"""
|
|
376
|
+
Build tool calls from streamed tool call data.
|
|
377
|
+
|
|
378
|
+
Args:
|
|
379
|
+
tool_calls_data (List[ChatCompletionStreamOutputDeltaToolCall]): The tool call data to build from.
|
|
380
|
+
|
|
381
|
+
Returns:
|
|
382
|
+
List[Dict[str, Any]]: The built tool calls.
|
|
383
|
+
"""
|
|
384
|
+
tool_calls: List[Dict[str, Any]] = []
|
|
385
|
+
for tool_call in tool_calls_data:
|
|
386
|
+
_tool_call = tool_call[0]
|
|
387
|
+
_index = _tool_call.index
|
|
388
|
+
_tool_call_id = _tool_call.id
|
|
389
|
+
_tool_call_type = _tool_call.type
|
|
390
|
+
_function_name = _tool_call.function.name if _tool_call.function else None
|
|
391
|
+
_function_arguments = _tool_call.function.arguments if _tool_call.function else None
|
|
392
|
+
|
|
393
|
+
if len(tool_calls) <= _index:
|
|
394
|
+
tool_calls.extend([{}] * (_index - len(tool_calls) + 1))
|
|
395
|
+
tool_call_entry = tool_calls[_index]
|
|
396
|
+
if not tool_call_entry:
|
|
397
|
+
tool_call_entry["id"] = _tool_call_id
|
|
398
|
+
tool_call_entry["type"] = _tool_call_type
|
|
399
|
+
tool_call_entry["function"] = {
|
|
400
|
+
"name": _function_name or "",
|
|
401
|
+
"arguments": _function_arguments or "",
|
|
402
|
+
}
|
|
403
|
+
else:
|
|
404
|
+
if _function_name:
|
|
405
|
+
tool_call_entry["function"]["name"] += _function_name
|
|
406
|
+
if _function_arguments:
|
|
407
|
+
tool_call_entry["function"]["arguments"] += _function_arguments
|
|
408
|
+
if _tool_call_id:
|
|
409
|
+
tool_call_entry["id"] = _tool_call_id
|
|
410
|
+
if _tool_call_type:
|
|
411
|
+
tool_call_entry["type"] = _tool_call_type
|
|
412
|
+
return tool_calls
|
|
413
|
+
|
|
414
|
+
def _parse_provider_response(
|
|
415
|
+
self,
|
|
416
|
+
response: ChatCompletionOutput,
|
|
417
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
418
|
+
) -> ModelResponse:
|
|
419
|
+
"""
|
|
420
|
+
Parse the provider response into a ModelResponse.
|
|
421
|
+
"""
|
|
422
|
+
model_response = ModelResponse()
|
|
423
|
+
|
|
424
|
+
response_message: ChatCompletionOutputMessage = response.choices[0].message
|
|
425
|
+
|
|
426
|
+
model_response.role = response_message.role
|
|
427
|
+
if response_message.content is not None:
|
|
428
|
+
model_response.content = response_message.content
|
|
429
|
+
|
|
430
|
+
if response_message.tool_calls is not None and len(response_message.tool_calls) > 0:
|
|
431
|
+
model_response.tool_calls = [asdict(t) for t in response_message.tool_calls]
|
|
432
|
+
for tool_call in model_response.tool_calls:
|
|
433
|
+
if isinstance(tool_call["function"]["arguments"], dict):
|
|
434
|
+
tool_call["function"]["arguments"] = json.dumps(tool_call["function"]["arguments"])
|
|
435
|
+
|
|
436
|
+
try:
|
|
437
|
+
if (
|
|
438
|
+
response_format is not None
|
|
439
|
+
and isinstance(response_format, type)
|
|
440
|
+
and issubclass(response_format, BaseModel)
|
|
441
|
+
):
|
|
442
|
+
parsed_object = response_message.parsed # type: ignore
|
|
443
|
+
if parsed_object is not None:
|
|
444
|
+
model_response.parsed = parsed_object
|
|
445
|
+
except Exception as e:
|
|
446
|
+
log_warning(f"Error retrieving structured outputs: {e}")
|
|
447
|
+
|
|
448
|
+
if response.usage is not None:
|
|
449
|
+
model_response.response_usage = self._get_metrics(response)
|
|
450
|
+
|
|
451
|
+
return model_response
|
|
452
|
+
|
|
453
|
+
def _parse_provider_response_delta(self, response_delta: ChatCompletionStreamOutput) -> ModelResponse:
|
|
454
|
+
"""
|
|
455
|
+
Parse the provider response delta into a ModelResponse.
|
|
456
|
+
"""
|
|
457
|
+
model_response = ModelResponse()
|
|
458
|
+
if response_delta.choices and len(response_delta.choices) > 0:
|
|
459
|
+
response_delta_message: ChatCompletionStreamOutputDelta = response_delta.choices[0].delta
|
|
460
|
+
|
|
461
|
+
model_response.role = response_delta_message.role
|
|
462
|
+
|
|
463
|
+
if response_delta_message.content is not None:
|
|
464
|
+
model_response.content = response_delta_message.content
|
|
465
|
+
if response_delta_message.tool_calls is not None and len(response_delta_message.tool_calls) > 0:
|
|
466
|
+
model_response.tool_calls = [response_delta_message.tool_calls] # type: ignore
|
|
467
|
+
if response_delta.usage is not None:
|
|
468
|
+
model_response.response_usage = self._get_metrics(response_delta)
|
|
469
|
+
|
|
470
|
+
return model_response
|
|
471
|
+
|
|
472
|
+
def _get_metrics(self, response: Union[ChatCompletionOutput, ChatCompletionStreamOutput]) -> Metrics:
|
|
473
|
+
"""
|
|
474
|
+
Parse the given HuggingFace-specific usage into an Agno Metrics object.
|
|
475
|
+
|
|
476
|
+
Args:
|
|
477
|
+
response: The HuggingFace response to parse.
|
|
478
|
+
|
|
479
|
+
Returns:
|
|
480
|
+
Metrics: Parsed metrics data
|
|
481
|
+
"""
|
|
482
|
+
metrics = Metrics()
|
|
483
|
+
|
|
484
|
+
if not response.usage:
|
|
485
|
+
return metrics
|
|
486
|
+
|
|
487
|
+
metrics.input_tokens = response.usage.prompt_tokens or 0
|
|
488
|
+
metrics.output_tokens = response.usage.completion_tokens or 0
|
|
489
|
+
metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
|
|
490
|
+
|
|
491
|
+
return metrics
|