agno 0.1.2__py3-none-any.whl → 2.3.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from os import getenv
|
|
3
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
4
|
+
|
|
5
|
+
import httpx
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from agno.models.anthropic import Claude as AnthropicClaude
|
|
9
|
+
from agno.utils.http import get_default_async_client, get_default_sync_client
|
|
10
|
+
from agno.utils.log import log_debug, log_warning
|
|
11
|
+
from agno.utils.models.claude import format_tools_for_model
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from anthropic import AnthropicVertex, AsyncAnthropicVertex
|
|
15
|
+
except ImportError as e:
|
|
16
|
+
raise ImportError("`anthropic` not installed. Please install it with `pip install anthropic`") from e
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class Claude(AnthropicClaude):
|
|
21
|
+
"""
|
|
22
|
+
A class representing Anthropic Claude model.
|
|
23
|
+
|
|
24
|
+
For more information, see: https://docs.anthropic.com/en/api/messages
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
id: str = "claude-sonnet-4@20250514"
|
|
28
|
+
name: str = "Claude"
|
|
29
|
+
provider: str = "VertexAI"
|
|
30
|
+
|
|
31
|
+
# Client parameters
|
|
32
|
+
region: Optional[str] = None
|
|
33
|
+
project_id: Optional[str] = None
|
|
34
|
+
base_url: Optional[str] = None
|
|
35
|
+
|
|
36
|
+
client: Optional[AnthropicVertex] = None # type: ignore
|
|
37
|
+
async_client: Optional[AsyncAnthropicVertex] = None # type: ignore
|
|
38
|
+
|
|
39
|
+
def __post_init__(self):
|
|
40
|
+
"""Validate model configuration after initialization"""
|
|
41
|
+
# Validate thinking support immediately at model creation
|
|
42
|
+
if self.thinking:
|
|
43
|
+
self._validate_thinking_support()
|
|
44
|
+
# Overwrite output schema support for VertexAI Claude
|
|
45
|
+
self.supports_native_structured_outputs = False
|
|
46
|
+
self.supports_json_schema_outputs = False
|
|
47
|
+
|
|
48
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
49
|
+
client_params: Dict[str, Any] = {}
|
|
50
|
+
|
|
51
|
+
# Add API key to client parameters
|
|
52
|
+
client_params["region"] = self.region or getenv("CLOUD_ML_REGION")
|
|
53
|
+
client_params["project_id"] = self.project_id or getenv("ANTHROPIC_VERTEX_PROJECT_ID")
|
|
54
|
+
client_params["base_url"] = self.base_url or getenv("ANTHROPIC_VERTEX_BASE_URL")
|
|
55
|
+
if self.timeout is not None:
|
|
56
|
+
client_params["timeout"] = self.timeout
|
|
57
|
+
|
|
58
|
+
# Add additional client parameters
|
|
59
|
+
if self.client_params is not None:
|
|
60
|
+
client_params.update(self.client_params)
|
|
61
|
+
if self.default_headers is not None:
|
|
62
|
+
client_params["default_headers"] = self.default_headers
|
|
63
|
+
return client_params
|
|
64
|
+
|
|
65
|
+
def get_client(self):
|
|
66
|
+
"""
|
|
67
|
+
Returns an instance of the Anthropic client.
|
|
68
|
+
"""
|
|
69
|
+
if self.client and not self.client.is_closed():
|
|
70
|
+
return self.client
|
|
71
|
+
|
|
72
|
+
_client_params = self._get_client_params()
|
|
73
|
+
if self.http_client:
|
|
74
|
+
if isinstance(self.http_client, httpx.Client):
|
|
75
|
+
_client_params["http_client"] = self.http_client
|
|
76
|
+
else:
|
|
77
|
+
log_warning("http_client is not an instance of httpx.Client. Using default global httpx.Client.")
|
|
78
|
+
# Use global sync client when user http_client is invalid
|
|
79
|
+
_client_params["http_client"] = get_default_sync_client()
|
|
80
|
+
else:
|
|
81
|
+
# Use global sync client when no custom http_client is provided
|
|
82
|
+
_client_params["http_client"] = get_default_sync_client()
|
|
83
|
+
self.client = AnthropicVertex(**_client_params)
|
|
84
|
+
return self.client
|
|
85
|
+
|
|
86
|
+
def get_async_client(self):
|
|
87
|
+
"""
|
|
88
|
+
Returns an instance of the async Anthropic client.
|
|
89
|
+
"""
|
|
90
|
+
if self.async_client and not self.async_client.is_closed():
|
|
91
|
+
return self.async_client
|
|
92
|
+
|
|
93
|
+
_client_params = self._get_client_params()
|
|
94
|
+
if self.http_client:
|
|
95
|
+
if isinstance(self.http_client, httpx.AsyncClient):
|
|
96
|
+
_client_params["http_client"] = self.http_client
|
|
97
|
+
else:
|
|
98
|
+
log_warning(
|
|
99
|
+
"http_client is not an instance of httpx.AsyncClient. Using default global httpx.AsyncClient."
|
|
100
|
+
)
|
|
101
|
+
# Use global async client when user http_client is invalid
|
|
102
|
+
_client_params["http_client"] = get_default_async_client()
|
|
103
|
+
else:
|
|
104
|
+
# Use global async client when no custom http_client is provided
|
|
105
|
+
_client_params["http_client"] = get_default_async_client()
|
|
106
|
+
self.async_client = AsyncAnthropicVertex(**_client_params)
|
|
107
|
+
return self.async_client
|
|
108
|
+
|
|
109
|
+
def get_request_params(
|
|
110
|
+
self,
|
|
111
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
112
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
113
|
+
) -> Dict[str, Any]:
|
|
114
|
+
"""
|
|
115
|
+
Generate keyword arguments for API requests.
|
|
116
|
+
|
|
117
|
+
Returns:
|
|
118
|
+
Dict[str, Any]: The keyword arguments for API requests.
|
|
119
|
+
"""
|
|
120
|
+
# Validate thinking support if thinking is enabled
|
|
121
|
+
if self.thinking:
|
|
122
|
+
self._validate_thinking_support()
|
|
123
|
+
|
|
124
|
+
_request_params: Dict[str, Any] = {}
|
|
125
|
+
if self.max_tokens:
|
|
126
|
+
_request_params["max_tokens"] = self.max_tokens
|
|
127
|
+
if self.thinking:
|
|
128
|
+
_request_params["thinking"] = self.thinking
|
|
129
|
+
if self.temperature:
|
|
130
|
+
_request_params["temperature"] = self.temperature
|
|
131
|
+
if self.stop_sequences:
|
|
132
|
+
_request_params["stop_sequences"] = self.stop_sequences
|
|
133
|
+
if self.top_p:
|
|
134
|
+
_request_params["top_p"] = self.top_p
|
|
135
|
+
if self.top_k:
|
|
136
|
+
_request_params["top_k"] = self.top_k
|
|
137
|
+
if self.timeout:
|
|
138
|
+
_request_params["timeout"] = self.timeout
|
|
139
|
+
|
|
140
|
+
# Build betas list - include existing betas and add new one if needed
|
|
141
|
+
betas_list = list(self.betas) if self.betas else []
|
|
142
|
+
|
|
143
|
+
# Include betas if any are present
|
|
144
|
+
if betas_list:
|
|
145
|
+
_request_params["betas"] = betas_list
|
|
146
|
+
|
|
147
|
+
if self.request_params:
|
|
148
|
+
_request_params.update(self.request_params)
|
|
149
|
+
|
|
150
|
+
if _request_params:
|
|
151
|
+
log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
|
|
152
|
+
return _request_params
|
|
153
|
+
|
|
154
|
+
def _prepare_request_kwargs(
|
|
155
|
+
self,
|
|
156
|
+
system_message: str,
|
|
157
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
158
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
159
|
+
) -> Dict[str, Any]:
|
|
160
|
+
"""
|
|
161
|
+
Prepare the request keyword arguments for the API call.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
system_message (str): The concatenated system messages.
|
|
165
|
+
tools: Optional list of tools
|
|
166
|
+
response_format: Optional response format (Pydantic model or dict)
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
Dict[str, Any]: The request keyword arguments.
|
|
170
|
+
"""
|
|
171
|
+
# Pass response_format and tools to get_request_params for beta header handling
|
|
172
|
+
request_kwargs = self.get_request_params(response_format=response_format, tools=tools).copy()
|
|
173
|
+
if system_message:
|
|
174
|
+
if self.cache_system_prompt:
|
|
175
|
+
cache_control = (
|
|
176
|
+
{"type": "ephemeral", "ttl": "1h"}
|
|
177
|
+
if self.extended_cache_time is not None and self.extended_cache_time is True
|
|
178
|
+
else {"type": "ephemeral"}
|
|
179
|
+
)
|
|
180
|
+
request_kwargs["system"] = [{"text": system_message, "type": "text", "cache_control": cache_control}]
|
|
181
|
+
else:
|
|
182
|
+
request_kwargs["system"] = [{"text": system_message, "type": "text"}]
|
|
183
|
+
|
|
184
|
+
# Format tools (this will handle strict mode)
|
|
185
|
+
if tools:
|
|
186
|
+
request_kwargs["tools"] = format_tools_for_model(tools)
|
|
187
|
+
|
|
188
|
+
if request_kwargs:
|
|
189
|
+
log_debug(f"Calling {self.provider} with request parameters: {request_kwargs}", log_level=2)
|
|
190
|
+
return request_kwargs
|
agno/models/vllm/vllm.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
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 ModelAuthenticationError
|
|
8
|
+
from agno.models.openai.like import OpenAILike
|
|
9
|
+
from agno.utils.log import log_debug
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class VLLM(OpenAILike):
|
|
14
|
+
"""
|
|
15
|
+
Class for interacting with vLLM models via OpenAI-compatible API.
|
|
16
|
+
|
|
17
|
+
Attributes:
|
|
18
|
+
id: Model identifier
|
|
19
|
+
name: API name
|
|
20
|
+
provider: API provider
|
|
21
|
+
base_url: vLLM server URL
|
|
22
|
+
temperature: Sampling temperature
|
|
23
|
+
top_p: Nucleus sampling probability
|
|
24
|
+
presence_penalty: Repetition penalty
|
|
25
|
+
top_k: Top-k sampling
|
|
26
|
+
enable_thinking: Special mode flag
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
id: str = "not-set"
|
|
30
|
+
name: str = "VLLM"
|
|
31
|
+
provider: str = "VLLM"
|
|
32
|
+
|
|
33
|
+
api_key: Optional[str] = None
|
|
34
|
+
base_url: Optional[str] = None
|
|
35
|
+
|
|
36
|
+
temperature: float = 0.7
|
|
37
|
+
top_p: float = 0.8
|
|
38
|
+
presence_penalty: float = 1.5
|
|
39
|
+
top_k: Optional[int] = None
|
|
40
|
+
enable_thinking: Optional[bool] = None
|
|
41
|
+
|
|
42
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
43
|
+
"""
|
|
44
|
+
Returns client parameters for API requests, checking for VLLM_API_KEY.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
48
|
+
"""
|
|
49
|
+
if not self.api_key:
|
|
50
|
+
self.api_key = getenv("VLLM_API_KEY")
|
|
51
|
+
if not self.api_key:
|
|
52
|
+
raise ModelAuthenticationError(
|
|
53
|
+
message="VLLM_API_KEY not set. Please set the VLLM_API_KEY environment variable.",
|
|
54
|
+
model_name=self.name,
|
|
55
|
+
)
|
|
56
|
+
if not self.base_url:
|
|
57
|
+
self.base_url = getenv("VLLM_BASE_URL", "http://localhost:8000/v1/")
|
|
58
|
+
return super()._get_client_params()
|
|
59
|
+
|
|
60
|
+
def get_request_params(
|
|
61
|
+
self,
|
|
62
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
63
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
64
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
65
|
+
**kwargs: Any,
|
|
66
|
+
) -> Dict[str, Any]:
|
|
67
|
+
request_kwargs = super().get_request_params(
|
|
68
|
+
response_format=response_format, tools=tools, tool_choice=tool_choice
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
vllm_body: Dict[str, Any] = {}
|
|
72
|
+
if self.top_k is not None:
|
|
73
|
+
vllm_body["top_k"] = self.top_k
|
|
74
|
+
if self.enable_thinking is not None:
|
|
75
|
+
vllm_body.setdefault("chat_template_kwargs", {})["enable_thinking"] = self.enable_thinking
|
|
76
|
+
|
|
77
|
+
if vllm_body:
|
|
78
|
+
existing_body = request_kwargs.get("extra_body") or {}
|
|
79
|
+
request_kwargs["extra_body"] = {**existing_body, **vllm_body}
|
|
80
|
+
|
|
81
|
+
if request_kwargs:
|
|
82
|
+
log_debug(f"Calling {self.provider} with request parameters: {request_kwargs}", log_level=2)
|
|
83
|
+
return request_kwargs
|
agno/models/xai/__init__.py
CHANGED
agno/models/xai/xai.py
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from os import getenv
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
4
4
|
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from agno.exceptions import ModelAuthenticationError
|
|
8
|
+
from agno.models.message import Citations, UrlCitation
|
|
5
9
|
from agno.models.openai.like import OpenAILike
|
|
10
|
+
from agno.models.response import ModelResponse
|
|
11
|
+
from agno.utils.log import log_debug
|
|
12
|
+
|
|
13
|
+
try:
|
|
14
|
+
from openai.types.chat.chat_completion import ChatCompletion
|
|
15
|
+
from openai.types.chat.chat_completion_chunk import ChatCompletionChunk
|
|
16
|
+
except (ImportError, ModuleNotFoundError):
|
|
17
|
+
raise ImportError("`openai` not installed. Please install using `pip install openai`")
|
|
6
18
|
|
|
7
19
|
|
|
8
20
|
@dataclass
|
|
@@ -11,16 +23,108 @@ class xAI(OpenAILike):
|
|
|
11
23
|
Class for interacting with the xAI API.
|
|
12
24
|
|
|
13
25
|
Attributes:
|
|
14
|
-
id (str): The ID of the language model.
|
|
15
|
-
name (str): The name of the API.
|
|
16
|
-
provider (str): The provider of the API.
|
|
26
|
+
id (str): The ID of the language model. Defaults to "grok-beta".
|
|
27
|
+
name (str): The name of the API. Defaults to "xAI".
|
|
28
|
+
provider (str): The provider of the API. Defaults to "xAI".
|
|
17
29
|
api_key (Optional[str]): The API key for the xAI API.
|
|
18
|
-
base_url (Optional[str]): The base URL for the xAI API.
|
|
30
|
+
base_url (Optional[str]): The base URL for the xAI API. Defaults to "https://api.x.ai/v1".
|
|
31
|
+
search_parameters (Optional[Dict[str, Any]]): Search parameters for enabling live search.
|
|
19
32
|
"""
|
|
20
33
|
|
|
21
34
|
id: str = "grok-beta"
|
|
22
35
|
name: str = "xAI"
|
|
23
36
|
provider: str = "xAI"
|
|
24
37
|
|
|
25
|
-
api_key: Optional[str] =
|
|
26
|
-
base_url:
|
|
38
|
+
api_key: Optional[str] = None
|
|
39
|
+
base_url: str = "https://api.x.ai/v1"
|
|
40
|
+
|
|
41
|
+
search_parameters: Optional[Dict[str, Any]] = None
|
|
42
|
+
|
|
43
|
+
def _get_client_params(self) -> Dict[str, Any]:
|
|
44
|
+
"""
|
|
45
|
+
Returns client parameters for API requests, checking for XAI_API_KEY.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Dict[str, Any]: A dictionary of client parameters for API requests.
|
|
49
|
+
"""
|
|
50
|
+
if not self.api_key:
|
|
51
|
+
self.api_key = getenv("XAI_API_KEY")
|
|
52
|
+
if not self.api_key:
|
|
53
|
+
raise ModelAuthenticationError(
|
|
54
|
+
message="XAI_API_KEY not set. Please set the XAI_API_KEY environment variable.",
|
|
55
|
+
model_name=self.name,
|
|
56
|
+
)
|
|
57
|
+
return super()._get_client_params()
|
|
58
|
+
|
|
59
|
+
def get_request_params(
|
|
60
|
+
self,
|
|
61
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
62
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
63
|
+
tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
|
|
64
|
+
**kwargs: Any,
|
|
65
|
+
) -> Dict[str, Any]:
|
|
66
|
+
"""
|
|
67
|
+
Returns keyword arguments for API requests, including search parameters.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
Dict[str, Any]: A dictionary of keyword arguments for API requests.
|
|
71
|
+
"""
|
|
72
|
+
request_params = super().get_request_params(
|
|
73
|
+
response_format=response_format, tools=tools, tool_choice=tool_choice
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if self.search_parameters:
|
|
77
|
+
existing_body = request_params.get("extra_body") or {}
|
|
78
|
+
existing_body.update({"search_parameters": self.search_parameters})
|
|
79
|
+
request_params["extra_body"] = existing_body
|
|
80
|
+
|
|
81
|
+
if request_params:
|
|
82
|
+
log_debug(f"Calling {self.provider} with request parameters: {request_params}", log_level=2)
|
|
83
|
+
|
|
84
|
+
return request_params
|
|
85
|
+
|
|
86
|
+
def _parse_provider_response(
|
|
87
|
+
self,
|
|
88
|
+
response: ChatCompletion,
|
|
89
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
90
|
+
) -> ModelResponse:
|
|
91
|
+
"""
|
|
92
|
+
Parse the xAI response into a ModelResponse.
|
|
93
|
+
"""
|
|
94
|
+
model_response = super()._parse_provider_response(response, response_format)
|
|
95
|
+
|
|
96
|
+
if hasattr(response, "citations") and response.citations: # type: ignore
|
|
97
|
+
citations = Citations()
|
|
98
|
+
url_citations = []
|
|
99
|
+
for citation_url in response.citations: # type: ignore
|
|
100
|
+
url_citations.append(UrlCitation(url=str(citation_url)))
|
|
101
|
+
|
|
102
|
+
citations.urls = url_citations
|
|
103
|
+
citations.raw = response.citations # type: ignore
|
|
104
|
+
model_response.citations = citations
|
|
105
|
+
|
|
106
|
+
return model_response
|
|
107
|
+
|
|
108
|
+
def _parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
|
|
109
|
+
"""
|
|
110
|
+
Parse the xAI streaming response.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
response_delta: Raw response chunk
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
ModelResponse: Parsed response data
|
|
117
|
+
"""
|
|
118
|
+
model_response = super()._parse_provider_response_delta(response_delta)
|
|
119
|
+
|
|
120
|
+
if hasattr(response_delta, "citations") and response_delta.citations: # type: ignore
|
|
121
|
+
citations = Citations()
|
|
122
|
+
url_citations = []
|
|
123
|
+
for citation_url in response_delta.citations: # type: ignore
|
|
124
|
+
url_citations.append(UrlCitation(url=str(citation_url)))
|
|
125
|
+
|
|
126
|
+
citations.urls = url_citations
|
|
127
|
+
citations.raw = response_delta.citations # type: ignore
|
|
128
|
+
model_response.citations = citations
|
|
129
|
+
|
|
130
|
+
return model_response
|
agno/os/__init__.py
ADDED