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
agno/models/vertexai/gemini.py
DELETED
|
@@ -1,595 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from dataclasses import dataclass, field
|
|
3
|
-
from typing import Any, Callable, Dict, Iterator, List, Optional, Union
|
|
4
|
-
|
|
5
|
-
from agno.models.base import Metrics, Model
|
|
6
|
-
from agno.models.message import Message
|
|
7
|
-
from agno.models.response import ModelResponse, ModelResponseEvent
|
|
8
|
-
from agno.tools import Function, Toolkit
|
|
9
|
-
from agno.utils.log import logger
|
|
10
|
-
|
|
11
|
-
try:
|
|
12
|
-
from vertexai.generative_models import (
|
|
13
|
-
Candidate,
|
|
14
|
-
Content,
|
|
15
|
-
FunctionDeclaration,
|
|
16
|
-
GenerationResponse,
|
|
17
|
-
GenerativeModel,
|
|
18
|
-
Part,
|
|
19
|
-
)
|
|
20
|
-
from vertexai.generative_models import (
|
|
21
|
-
Tool as GeminiTool,
|
|
22
|
-
)
|
|
23
|
-
except (ModuleNotFoundError, ImportError):
|
|
24
|
-
raise ImportError(
|
|
25
|
-
"`google-cloud-aiplatform` not installed. Please install using `pip install google-cloud-aiplatform`"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@dataclass
|
|
30
|
-
class MessageData:
|
|
31
|
-
response_content: str = ""
|
|
32
|
-
response_block: Content = None
|
|
33
|
-
response_candidates: Optional[List[Candidate]] = None
|
|
34
|
-
response_role: Optional[str] = None
|
|
35
|
-
response_parts: Optional[List] = None
|
|
36
|
-
response_tool_calls: List[Dict[str, Any]] = field(default_factory=list)
|
|
37
|
-
response_usage: Optional[Dict[str, Any]] = None
|
|
38
|
-
response_tool_call_block: Content = None
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@dataclass
|
|
42
|
-
class Gemini(Model):
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
Class for interacting with the VertexAI Gemini API.
|
|
46
|
-
|
|
47
|
-
Attributes:
|
|
48
|
-
|
|
49
|
-
name (str): The name of the API. Default is "Gemini".
|
|
50
|
-
model (str): The model name. Default is "gemini-1.5-flash-002".
|
|
51
|
-
provider (str): The provider of the API. Default is "VertexAI".
|
|
52
|
-
generation_config (Optional[Any]): The generation configuration.
|
|
53
|
-
safety_settings (Optional[Any]): The safety settings.
|
|
54
|
-
generative_model_request_params (Optional[Dict[str, Any]]): The generative model request parameters.
|
|
55
|
-
function_declarations (Optional[List[FunctionDeclaration]]): The function declarations.
|
|
56
|
-
client (Optional[GenerativeModel]): The GenerativeModel client.
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
id: str = "gemini-2.0-flash-exp"
|
|
60
|
-
name: str = "Gemini"
|
|
61
|
-
provider: str = "VertexAI"
|
|
62
|
-
|
|
63
|
-
# Request parameters
|
|
64
|
-
generation_config: Optional[Any] = None
|
|
65
|
-
safety_settings: Optional[Any] = None
|
|
66
|
-
generative_model_request_params: Optional[Dict[str, Any]] = None
|
|
67
|
-
function_declarations: Optional[List[FunctionDeclaration]] = None
|
|
68
|
-
|
|
69
|
-
# Gemini client
|
|
70
|
-
client: Optional[GenerativeModel] = None
|
|
71
|
-
|
|
72
|
-
def get_client(self) -> GenerativeModel:
|
|
73
|
-
"""
|
|
74
|
-
Returns a GenerativeModel client.
|
|
75
|
-
|
|
76
|
-
Returns:
|
|
77
|
-
GenerativeModel: GenerativeModel client.
|
|
78
|
-
"""
|
|
79
|
-
if self.client is None:
|
|
80
|
-
self.client = GenerativeModel(model_name=self.id, **self.request_kwargs)
|
|
81
|
-
return self.client
|
|
82
|
-
|
|
83
|
-
@property
|
|
84
|
-
def request_kwargs(self) -> Dict[str, Any]:
|
|
85
|
-
"""
|
|
86
|
-
Returns the request parameters for the generative model.
|
|
87
|
-
|
|
88
|
-
Returns:
|
|
89
|
-
Dict[str, Any]: Request parameters for the generative model.
|
|
90
|
-
"""
|
|
91
|
-
_request_params: Dict[str, Any] = {}
|
|
92
|
-
if self.generation_config:
|
|
93
|
-
_request_params["generation_config"] = self.generation_config
|
|
94
|
-
if self.safety_settings:
|
|
95
|
-
_request_params["safety_settings"] = self.safety_settings
|
|
96
|
-
if self.generative_model_request_params:
|
|
97
|
-
_request_params.update(self.generative_model_request_params)
|
|
98
|
-
if self.function_declarations:
|
|
99
|
-
_request_params["tools"] = [GeminiTool(function_declarations=self.function_declarations)]
|
|
100
|
-
return _request_params
|
|
101
|
-
|
|
102
|
-
def format_messages(self, messages: List[Message]) -> List[Content]:
|
|
103
|
-
"""
|
|
104
|
-
Converts a list of Message objects to Gemini-compatible Content objects.
|
|
105
|
-
|
|
106
|
-
Args:
|
|
107
|
-
messages: List of Message objects containing various types of content
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
List of Content objects formatted for Gemini's API
|
|
111
|
-
"""
|
|
112
|
-
formatted_messages: List[Content] = []
|
|
113
|
-
|
|
114
|
-
for msg in messages:
|
|
115
|
-
if hasattr(msg, "response_tool_call_block") and msg.response_tool_call_block is not None:
|
|
116
|
-
formatted_messages.append(Content(role=msg.role, parts=msg.response_tool_call_block.parts))
|
|
117
|
-
else:
|
|
118
|
-
if isinstance(msg.content, str) and msg.content:
|
|
119
|
-
parts = [Part.from_text(msg.content)]
|
|
120
|
-
elif isinstance(msg.content, list):
|
|
121
|
-
parts = [Part.from_text(part) for part in msg.content if isinstance(part, str)]
|
|
122
|
-
else:
|
|
123
|
-
parts = []
|
|
124
|
-
role = "model" if msg.role in ["system", "developer"] else "user" if msg.role == "tool" else msg.role
|
|
125
|
-
|
|
126
|
-
if parts:
|
|
127
|
-
formatted_messages.append(Content(role=role, parts=parts))
|
|
128
|
-
return formatted_messages
|
|
129
|
-
|
|
130
|
-
def format_functions(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
131
|
-
"""
|
|
132
|
-
Converts function parameters to a Gemini-compatible format.
|
|
133
|
-
|
|
134
|
-
Args:
|
|
135
|
-
params (Dict[str, Any]): The original parameter's dictionary.
|
|
136
|
-
|
|
137
|
-
Returns:
|
|
138
|
-
Dict[str, Any]: The converted parameters dictionary compatible with Gemini.
|
|
139
|
-
"""
|
|
140
|
-
formatted_params = {}
|
|
141
|
-
for key, value in params.items():
|
|
142
|
-
if key == "properties" and isinstance(value, dict):
|
|
143
|
-
converted_properties = {}
|
|
144
|
-
for prop_key, prop_value in value.items():
|
|
145
|
-
property_type = prop_value.get("type")
|
|
146
|
-
if isinstance(property_type, list):
|
|
147
|
-
# Create a copy to avoid modifying the original list
|
|
148
|
-
non_null_types = [t for t in property_type if t != "null"]
|
|
149
|
-
if non_null_types:
|
|
150
|
-
# Use the first non-null type
|
|
151
|
-
converted_type = non_null_types[0]
|
|
152
|
-
else:
|
|
153
|
-
# Default type if all types are 'null'
|
|
154
|
-
converted_type = "string"
|
|
155
|
-
else:
|
|
156
|
-
converted_type = property_type
|
|
157
|
-
|
|
158
|
-
converted_properties[prop_key] = {"type": converted_type}
|
|
159
|
-
formatted_params[key] = converted_properties
|
|
160
|
-
else:
|
|
161
|
-
formatted_params[key] = value
|
|
162
|
-
return formatted_params
|
|
163
|
-
|
|
164
|
-
def add_tool(
|
|
165
|
-
self,
|
|
166
|
-
tool: Union[Toolkit, Callable, Dict, Function],
|
|
167
|
-
strict: bool = False,
|
|
168
|
-
agent: Optional[Any] = None,
|
|
169
|
-
) -> None:
|
|
170
|
-
"""
|
|
171
|
-
Adds tools to the model.
|
|
172
|
-
|
|
173
|
-
Args:
|
|
174
|
-
tool: The tool to add. Can be a Tool, Toolkit, Callable, dict, or Function.
|
|
175
|
-
strict: If True, raise an error if the tool is not a Toolkit or Callable.
|
|
176
|
-
agent: The agent to use for the tool.
|
|
177
|
-
"""
|
|
178
|
-
if self.function_declarations is None:
|
|
179
|
-
self.function_declarations = []
|
|
180
|
-
|
|
181
|
-
# If the tool is a Tool or Dict, log a warning.
|
|
182
|
-
if isinstance(tool, Dict):
|
|
183
|
-
logger.warning("Tool of type 'dict' is not yet supported by Gemini.")
|
|
184
|
-
|
|
185
|
-
# If the tool is a Callable or Toolkit, add its functions to the Model
|
|
186
|
-
elif callable(tool) or isinstance(tool, Toolkit) or isinstance(tool, Function):
|
|
187
|
-
if self._functions is None:
|
|
188
|
-
self._functions: Dict[str, Any] = {}
|
|
189
|
-
|
|
190
|
-
if isinstance(tool, Toolkit):
|
|
191
|
-
# For each function in the toolkit, process entrypoint and add to self.tools
|
|
192
|
-
for name, func in tool.functions.items():
|
|
193
|
-
# If the function does not exist in self._functions, add to self.tools
|
|
194
|
-
if name not in self._functions:
|
|
195
|
-
func._agent = agent
|
|
196
|
-
func.process_entrypoint()
|
|
197
|
-
self._functions[name] = func
|
|
198
|
-
function_declaration = FunctionDeclaration(
|
|
199
|
-
name=func.name,
|
|
200
|
-
description=func.description,
|
|
201
|
-
parameters=self.format_functions(func.parameters),
|
|
202
|
-
)
|
|
203
|
-
self.function_declarations.append(function_declaration)
|
|
204
|
-
logger.debug(f"Function {name} from {tool.name} added to model.")
|
|
205
|
-
|
|
206
|
-
elif isinstance(tool, Function):
|
|
207
|
-
if tool.name not in self._functions:
|
|
208
|
-
tool._agent = agent
|
|
209
|
-
tool.process_entrypoint()
|
|
210
|
-
self._functions[tool.name] = tool
|
|
211
|
-
function_declaration = FunctionDeclaration(
|
|
212
|
-
name=tool.name,
|
|
213
|
-
description=tool.description,
|
|
214
|
-
parameters=self.format_functions(tool.parameters),
|
|
215
|
-
)
|
|
216
|
-
self.function_declarations.append(function_declaration)
|
|
217
|
-
logger.debug(f"Function {tool.name} added to model.")
|
|
218
|
-
|
|
219
|
-
elif callable(tool):
|
|
220
|
-
try:
|
|
221
|
-
function_name = tool.__name__
|
|
222
|
-
if function_name not in self._functions:
|
|
223
|
-
func = Function.from_callable(tool)
|
|
224
|
-
self._functions[func.name] = func
|
|
225
|
-
function_declaration = FunctionDeclaration(
|
|
226
|
-
name=func.name,
|
|
227
|
-
description=func.description,
|
|
228
|
-
parameters=self.format_functions(func.parameters),
|
|
229
|
-
)
|
|
230
|
-
self.function_declarations.append(function_declaration)
|
|
231
|
-
logger.debug(f"Function '{func.name}' added to model.")
|
|
232
|
-
except Exception as e:
|
|
233
|
-
logger.warning(f"Could not add function {tool}: {e}")
|
|
234
|
-
|
|
235
|
-
def invoke(self, messages: List[Message]) -> GenerationResponse:
|
|
236
|
-
"""
|
|
237
|
-
Send a generate content request to VertexAI and return the response.
|
|
238
|
-
|
|
239
|
-
Args:
|
|
240
|
-
messages: List of Message objects containing various types of content
|
|
241
|
-
|
|
242
|
-
Returns:
|
|
243
|
-
GenerationResponse object containing the response content
|
|
244
|
-
"""
|
|
245
|
-
return self.get_client().generate_content(contents=self.format_messages(messages))
|
|
246
|
-
|
|
247
|
-
def invoke_stream(self, messages: List[Message]) -> Iterator[GenerationResponse]:
|
|
248
|
-
"""
|
|
249
|
-
Send a generate content request to VertexAI and return the response.
|
|
250
|
-
|
|
251
|
-
Args:
|
|
252
|
-
messages: List of Message objects containing various types of content
|
|
253
|
-
|
|
254
|
-
Returns:
|
|
255
|
-
Iterator[GenerationResponse] object containing the response content
|
|
256
|
-
"""
|
|
257
|
-
yield from self.get_client().generate_content(
|
|
258
|
-
contents=self.format_messages(messages),
|
|
259
|
-
stream=True,
|
|
260
|
-
)
|
|
261
|
-
|
|
262
|
-
def update_usage_metrics(
|
|
263
|
-
self,
|
|
264
|
-
assistant_message: Message,
|
|
265
|
-
metrics: Metrics,
|
|
266
|
-
usage: Optional[Dict[str, Any]] = None,
|
|
267
|
-
) -> None:
|
|
268
|
-
"""
|
|
269
|
-
Update usage metrics for the assistant message.
|
|
270
|
-
|
|
271
|
-
Args:
|
|
272
|
-
assistant_message: Message object containing the response content
|
|
273
|
-
metrics: Metrics object containing the usage metrics
|
|
274
|
-
usage: Dict[str, Any] object containing the usage metrics
|
|
275
|
-
"""
|
|
276
|
-
if usage:
|
|
277
|
-
metrics.input_tokens = usage.prompt_token_count or 0 # type: ignore
|
|
278
|
-
metrics.output_tokens = usage.candidates_token_count or 0 # type: ignore
|
|
279
|
-
metrics.total_tokens = usage.total_token_count or 0 # type: ignore
|
|
280
|
-
|
|
281
|
-
self._update_model_metrics(metrics_for_run=metrics)
|
|
282
|
-
self._update_assistant_message_metrics(assistant_message=assistant_message, metrics_for_run=metrics)
|
|
283
|
-
|
|
284
|
-
def create_assistant_message(self, response: GenerationResponse, metrics: Metrics) -> Message:
|
|
285
|
-
"""
|
|
286
|
-
Create an assistant message from the GenerationResponse.
|
|
287
|
-
|
|
288
|
-
Args:
|
|
289
|
-
response: GenerationResponse object containing the response content
|
|
290
|
-
metrics: Metrics object containing the usage metrics
|
|
291
|
-
|
|
292
|
-
Returns:
|
|
293
|
-
Message object containing the assistant message
|
|
294
|
-
"""
|
|
295
|
-
message_data = MessageData()
|
|
296
|
-
|
|
297
|
-
message_data.response_candidates = response.candidates
|
|
298
|
-
message_data.response_block = response.candidates[0].content
|
|
299
|
-
message_data.response_role = message_data.response_block.role
|
|
300
|
-
message_data.response_parts = message_data.response_block.parts
|
|
301
|
-
message_data.response_usage = response.usage_metadata
|
|
302
|
-
|
|
303
|
-
# -*- Parse response
|
|
304
|
-
if message_data.response_parts is not None:
|
|
305
|
-
for part in message_data.response_parts:
|
|
306
|
-
part_dict = type(part).to_dict(part)
|
|
307
|
-
|
|
308
|
-
# Extract text if present
|
|
309
|
-
if "text" in part_dict:
|
|
310
|
-
message_data.response_content = part_dict.get("text")
|
|
311
|
-
|
|
312
|
-
# Parse function calls
|
|
313
|
-
if "function_call" in part_dict:
|
|
314
|
-
message_data.response_tool_call_block = response.candidates[0].content
|
|
315
|
-
message_data.response_tool_calls.append(
|
|
316
|
-
{
|
|
317
|
-
"type": "function",
|
|
318
|
-
"function": {
|
|
319
|
-
"name": part_dict.get("function_call").get("name"),
|
|
320
|
-
"arguments": json.dumps(part_dict.get("function_call").get("args")),
|
|
321
|
-
},
|
|
322
|
-
}
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
# -*- Create assistant message
|
|
326
|
-
assistant_message = Message(
|
|
327
|
-
role=message_data.response_role or "model",
|
|
328
|
-
content=message_data.response_content,
|
|
329
|
-
response_tool_call_block=message_data.response_tool_call_block,
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
# -*- Update assistant message if tool calls are present
|
|
333
|
-
if len(message_data.response_tool_calls) > 0:
|
|
334
|
-
assistant_message.tool_calls = message_data.response_tool_calls
|
|
335
|
-
|
|
336
|
-
# -*- Update usage metrics
|
|
337
|
-
self.update_usage_metrics(
|
|
338
|
-
assistant_message=assistant_message, metrics=metrics, usage=message_data.response_usage
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
return assistant_message
|
|
342
|
-
|
|
343
|
-
def format_function_call_results(
|
|
344
|
-
self,
|
|
345
|
-
function_call_results: List[Message],
|
|
346
|
-
messages: List[Message],
|
|
347
|
-
):
|
|
348
|
-
"""
|
|
349
|
-
Processes the results of function calls and appends them to messages.
|
|
350
|
-
|
|
351
|
-
Args:
|
|
352
|
-
function_call_results (List[Message]): The results from running function calls.
|
|
353
|
-
messages (List[Message]): The list of conversation messages.
|
|
354
|
-
"""
|
|
355
|
-
if function_call_results:
|
|
356
|
-
contents, parts = zip(
|
|
357
|
-
*[
|
|
358
|
-
(
|
|
359
|
-
result.content,
|
|
360
|
-
Part.from_function_response(name=result.tool_name, response={"content": result.content}),
|
|
361
|
-
)
|
|
362
|
-
for result in function_call_results
|
|
363
|
-
]
|
|
364
|
-
)
|
|
365
|
-
|
|
366
|
-
messages.append(Message(role="tool", content=contents))
|
|
367
|
-
|
|
368
|
-
def handle_tool_calls(self, assistant_message: Message, messages: List[Message], model_response: ModelResponse):
|
|
369
|
-
"""
|
|
370
|
-
Handle tool calls in the assistant message.
|
|
371
|
-
|
|
372
|
-
Args:
|
|
373
|
-
assistant_message (Message): The assistant message.
|
|
374
|
-
messages (List[Message]): A list of messages.
|
|
375
|
-
model_response (ModelResponse): The model response.
|
|
376
|
-
|
|
377
|
-
Returns:
|
|
378
|
-
Optional[ModelResponse]: The updated model response.
|
|
379
|
-
"""
|
|
380
|
-
if assistant_message.tool_calls:
|
|
381
|
-
if model_response.tool_calls is None:
|
|
382
|
-
model_response.tool_calls = []
|
|
383
|
-
|
|
384
|
-
model_response.content = assistant_message.get_content_string() or ""
|
|
385
|
-
function_calls_to_run = self._get_function_calls_to_run(
|
|
386
|
-
assistant_message, messages, error_response_role="tool"
|
|
387
|
-
)
|
|
388
|
-
|
|
389
|
-
if self.show_tool_calls:
|
|
390
|
-
if len(function_calls_to_run) == 1:
|
|
391
|
-
model_response.content += f"\n - Running: {function_calls_to_run[0].get_call_str()}\n\n"
|
|
392
|
-
elif len(function_calls_to_run) > 1:
|
|
393
|
-
model_response.content += "\nRunning:"
|
|
394
|
-
for _f in function_calls_to_run:
|
|
395
|
-
model_response.content += f"\n - {_f.get_call_str()}"
|
|
396
|
-
model_response.content += "\n\n"
|
|
397
|
-
|
|
398
|
-
function_call_results: List[Message] = []
|
|
399
|
-
for function_call_response in self.run_function_calls(
|
|
400
|
-
function_calls=function_calls_to_run,
|
|
401
|
-
function_call_results=function_call_results,
|
|
402
|
-
):
|
|
403
|
-
if (
|
|
404
|
-
function_call_response.event == ModelResponseEvent.tool_call_completed.value
|
|
405
|
-
and function_call_response.tool_calls is not None
|
|
406
|
-
):
|
|
407
|
-
model_response.tool_calls.extend(function_call_response.tool_calls)
|
|
408
|
-
|
|
409
|
-
self.format_function_call_results(function_call_results, messages)
|
|
410
|
-
|
|
411
|
-
return model_response
|
|
412
|
-
return None
|
|
413
|
-
|
|
414
|
-
def response(self, messages: List[Message]) -> ModelResponse:
|
|
415
|
-
"""
|
|
416
|
-
Send a generate content request to VertexAI and return the response.
|
|
417
|
-
|
|
418
|
-
Args:
|
|
419
|
-
messages: List of Message objects containing various types of content
|
|
420
|
-
|
|
421
|
-
Returns:
|
|
422
|
-
ModelResponse object containing the response content
|
|
423
|
-
"""
|
|
424
|
-
logger.debug("---------- VertexAI Response Start ----------")
|
|
425
|
-
self._log_messages(messages)
|
|
426
|
-
model_response = ModelResponse()
|
|
427
|
-
metrics = Metrics()
|
|
428
|
-
|
|
429
|
-
metrics.start_response_timer()
|
|
430
|
-
response: GenerationResponse = self.invoke(messages=messages)
|
|
431
|
-
metrics.stop_response_timer()
|
|
432
|
-
|
|
433
|
-
# -*- Create assistant message
|
|
434
|
-
assistant_message = self.create_assistant_message(response=response, metrics=metrics)
|
|
435
|
-
messages.append(assistant_message)
|
|
436
|
-
|
|
437
|
-
# -*- Log response and metrics
|
|
438
|
-
assistant_message.log()
|
|
439
|
-
metrics.log()
|
|
440
|
-
|
|
441
|
-
# -*- Handle tool calls
|
|
442
|
-
if self.handle_tool_calls(assistant_message, messages, model_response):
|
|
443
|
-
response_after_tool_calls = self.response(messages=messages)
|
|
444
|
-
if response_after_tool_calls.content is not None:
|
|
445
|
-
if model_response.content is None:
|
|
446
|
-
model_response.content = ""
|
|
447
|
-
model_response.content += response_after_tool_calls.content
|
|
448
|
-
return model_response
|
|
449
|
-
|
|
450
|
-
# -*- Update model response
|
|
451
|
-
if assistant_message.content is not None:
|
|
452
|
-
model_response.content = assistant_message.get_content_string()
|
|
453
|
-
|
|
454
|
-
# -*- Remove tool call blocks and tool call results from messages
|
|
455
|
-
for m in messages:
|
|
456
|
-
if hasattr(m, "response_tool_call_block"):
|
|
457
|
-
m.response_tool_call_block = None
|
|
458
|
-
if hasattr(m, "tool_call_result"):
|
|
459
|
-
m.tool_call_result = None
|
|
460
|
-
|
|
461
|
-
logger.debug("---------- VertexAI Response End ----------")
|
|
462
|
-
return model_response
|
|
463
|
-
|
|
464
|
-
def handle_stream_tool_calls(self, assistant_message: Message, messages: List[Message]):
|
|
465
|
-
"""
|
|
466
|
-
Parse and run function calls and append the results to messages.
|
|
467
|
-
|
|
468
|
-
Args:
|
|
469
|
-
assistant_message (Message): The assistant message containing tool calls.
|
|
470
|
-
messages (List[Message]): The list of conversation messages.
|
|
471
|
-
|
|
472
|
-
Yields:
|
|
473
|
-
Iterator[ModelResponse]: Yields model responses during function execution.
|
|
474
|
-
"""
|
|
475
|
-
if assistant_message.tool_calls:
|
|
476
|
-
function_calls_to_run = self._get_function_calls_to_run(
|
|
477
|
-
assistant_message, messages, error_response_role="tool"
|
|
478
|
-
)
|
|
479
|
-
|
|
480
|
-
if self.show_tool_calls:
|
|
481
|
-
if len(function_calls_to_run) == 1:
|
|
482
|
-
yield ModelResponse(content=f"\n - Running: {function_calls_to_run[0].get_call_str()}\n\n")
|
|
483
|
-
elif len(function_calls_to_run) > 1:
|
|
484
|
-
yield ModelResponse(content="\nRunning:")
|
|
485
|
-
for _f in function_calls_to_run:
|
|
486
|
-
yield ModelResponse(content=f"\n - {_f.get_call_str()}")
|
|
487
|
-
yield ModelResponse(content="\n\n")
|
|
488
|
-
|
|
489
|
-
function_call_results: List[Message] = []
|
|
490
|
-
for intermediate_model_response in self.run_function_calls(
|
|
491
|
-
function_calls=function_calls_to_run, function_call_results=function_call_results
|
|
492
|
-
):
|
|
493
|
-
yield intermediate_model_response
|
|
494
|
-
|
|
495
|
-
self.format_function_call_results(function_call_results, messages)
|
|
496
|
-
|
|
497
|
-
def response_stream(self, messages: List[Message]) -> Iterator[ModelResponse]:
|
|
498
|
-
"""
|
|
499
|
-
Send a generate content request to VertexAI and return the response.
|
|
500
|
-
|
|
501
|
-
Args:
|
|
502
|
-
messages: List of Message objects containing various types of content
|
|
503
|
-
|
|
504
|
-
Yields:
|
|
505
|
-
Iterator[ModelResponse]: Yields model responses during function execution
|
|
506
|
-
"""
|
|
507
|
-
logger.debug("---------- VertexAI Response Start ----------")
|
|
508
|
-
self._log_messages(messages)
|
|
509
|
-
message_data = MessageData()
|
|
510
|
-
metrics = Metrics()
|
|
511
|
-
|
|
512
|
-
metrics.start_response_timer()
|
|
513
|
-
for response in self.invoke_stream(messages=messages):
|
|
514
|
-
# -*- Parse response
|
|
515
|
-
message_data.response_block = response.candidates[0].content
|
|
516
|
-
if message_data.response_block is not None:
|
|
517
|
-
metrics.time_to_first_token = metrics.response_timer.elapsed
|
|
518
|
-
message_data.response_role = message_data.response_block.role
|
|
519
|
-
if message_data.response_block.parts:
|
|
520
|
-
message_data.response_parts = message_data.response_block.parts
|
|
521
|
-
|
|
522
|
-
if message_data.response_parts is not None:
|
|
523
|
-
for part in message_data.response_parts:
|
|
524
|
-
part_dict = type(part).to_dict(part)
|
|
525
|
-
|
|
526
|
-
# -*- Yield text if present
|
|
527
|
-
if "text" in part_dict:
|
|
528
|
-
text = part_dict.get("text")
|
|
529
|
-
yield ModelResponse(content=text)
|
|
530
|
-
message_data.response_content += text
|
|
531
|
-
|
|
532
|
-
# -*- Skip function calls if there are no parts
|
|
533
|
-
if not message_data.response_block.parts and message_data.response_parts:
|
|
534
|
-
continue
|
|
535
|
-
# -*- Parse function calls
|
|
536
|
-
if "function_call" in part_dict:
|
|
537
|
-
message_data.response_tool_call_block = response.candidates[0].content
|
|
538
|
-
message_data.response_tool_calls.append(
|
|
539
|
-
{
|
|
540
|
-
"type": "function",
|
|
541
|
-
"function": {
|
|
542
|
-
"name": part_dict.get("function_call").get("name"),
|
|
543
|
-
"arguments": json.dumps(part_dict.get("function_call").get("args")),
|
|
544
|
-
},
|
|
545
|
-
}
|
|
546
|
-
)
|
|
547
|
-
message_data.response_usage = response.usage_metadata
|
|
548
|
-
|
|
549
|
-
metrics.stop_response_timer()
|
|
550
|
-
|
|
551
|
-
# -*- Create assistant message
|
|
552
|
-
assistant_message = Message(
|
|
553
|
-
role=message_data.response_role or "assistant",
|
|
554
|
-
content=message_data.response_content,
|
|
555
|
-
response_tool_call_block=message_data.response_tool_call_block,
|
|
556
|
-
)
|
|
557
|
-
|
|
558
|
-
# -*- Update assistant message if tool calls are present
|
|
559
|
-
if len(message_data.response_tool_calls) > 0:
|
|
560
|
-
assistant_message.tool_calls = message_data.response_tool_calls
|
|
561
|
-
|
|
562
|
-
self.update_usage_metrics(
|
|
563
|
-
assistant_message=assistant_message, metrics=metrics, usage=message_data.response_usage
|
|
564
|
-
)
|
|
565
|
-
|
|
566
|
-
# -*- Add assistant message to messages
|
|
567
|
-
messages.append(assistant_message)
|
|
568
|
-
|
|
569
|
-
# -*- Log response and metrics
|
|
570
|
-
assistant_message.log()
|
|
571
|
-
metrics.log()
|
|
572
|
-
|
|
573
|
-
if assistant_message.tool_calls is not None and len(assistant_message.tool_calls) > 0:
|
|
574
|
-
yield from self.handle_stream_tool_calls(assistant_message, messages)
|
|
575
|
-
yield from self.response_stream(messages=messages)
|
|
576
|
-
|
|
577
|
-
# -*- Remove tool call blocks and tool call results from messages
|
|
578
|
-
for m in messages:
|
|
579
|
-
if hasattr(m, "response_tool_call_block"):
|
|
580
|
-
m.response_tool_call_block = None
|
|
581
|
-
if hasattr(m, "tool_call_result"):
|
|
582
|
-
m.tool_call_result = None
|
|
583
|
-
logger.debug("---------- VertexAI Response End ----------")
|
|
584
|
-
|
|
585
|
-
async def ainvoke(self, *args, **kwargs) -> Any:
|
|
586
|
-
raise NotImplementedError(f"Async not supported on {self.name}.")
|
|
587
|
-
|
|
588
|
-
async def ainvoke_stream(self, *args, **kwargs) -> Any:
|
|
589
|
-
raise NotImplementedError(f"Async not supported on {self.name}.")
|
|
590
|
-
|
|
591
|
-
async def aresponse(self, messages: List[Message]) -> ModelResponse:
|
|
592
|
-
raise NotImplementedError(f"Async not supported on {self.name}.")
|
|
593
|
-
|
|
594
|
-
async def aresponse_stream(self, messages: List[Message]) -> ModelResponse:
|
|
595
|
-
raise NotImplementedError(f"Async not supported on {self.name}.")
|
agno/playground/__init__.py
DELETED