agno 2.2.13__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/__init__.py +8 -0
- agno/agent/__init__.py +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -0
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
agno/run/base.py
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
from dataclasses import asdict, dataclass
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any, Dict, List, Optional, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from agno.filters import FilterExpr
|
|
8
|
+
from agno.media import Audio, Image, Video
|
|
9
|
+
from agno.models.message import Citations, Message, MessageReferences
|
|
10
|
+
from agno.models.metrics import Metrics
|
|
11
|
+
from agno.reasoning.step import ReasoningStep
|
|
12
|
+
from agno.utils.log import log_error
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class RunContext:
|
|
17
|
+
run_id: str
|
|
18
|
+
session_id: str
|
|
19
|
+
user_id: Optional[str] = None
|
|
20
|
+
|
|
21
|
+
dependencies: Optional[Dict[str, Any]] = None
|
|
22
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None
|
|
23
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
24
|
+
session_state: Optional[Dict[str, Any]] = None
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass
|
|
28
|
+
class BaseRunOutputEvent:
|
|
29
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
30
|
+
_dict = {
|
|
31
|
+
k: v
|
|
32
|
+
for k, v in asdict(self).items()
|
|
33
|
+
if v is not None
|
|
34
|
+
and k
|
|
35
|
+
not in [
|
|
36
|
+
"tools",
|
|
37
|
+
"tool",
|
|
38
|
+
"metadata",
|
|
39
|
+
"image",
|
|
40
|
+
"images",
|
|
41
|
+
"videos",
|
|
42
|
+
"audio",
|
|
43
|
+
"response_audio",
|
|
44
|
+
"citations",
|
|
45
|
+
"member_responses",
|
|
46
|
+
"reasoning_messages",
|
|
47
|
+
"reasoning_steps",
|
|
48
|
+
"references",
|
|
49
|
+
"additional_input",
|
|
50
|
+
"session_summary",
|
|
51
|
+
"metrics",
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if hasattr(self, "metadata") and self.metadata is not None:
|
|
56
|
+
_dict["metadata"] = self.metadata
|
|
57
|
+
|
|
58
|
+
if hasattr(self, "additional_input") and self.additional_input is not None:
|
|
59
|
+
_dict["additional_input"] = [m.to_dict() for m in self.additional_input]
|
|
60
|
+
|
|
61
|
+
if hasattr(self, "reasoning_messages") and self.reasoning_messages is not None:
|
|
62
|
+
_dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
|
|
63
|
+
|
|
64
|
+
if hasattr(self, "reasoning_steps") and self.reasoning_steps is not None:
|
|
65
|
+
_dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
|
|
66
|
+
|
|
67
|
+
if hasattr(self, "references") and self.references is not None:
|
|
68
|
+
_dict["references"] = [r.model_dump() for r in self.references]
|
|
69
|
+
|
|
70
|
+
if hasattr(self, "member_responses") and self.member_responses:
|
|
71
|
+
_dict["member_responses"] = [response.to_dict() for response in self.member_responses]
|
|
72
|
+
|
|
73
|
+
if hasattr(self, "images") and self.images is not None:
|
|
74
|
+
_dict["images"] = []
|
|
75
|
+
for img in self.images:
|
|
76
|
+
if isinstance(img, Image):
|
|
77
|
+
_dict["images"].append(img.to_dict())
|
|
78
|
+
else:
|
|
79
|
+
_dict["images"].append(img)
|
|
80
|
+
|
|
81
|
+
if hasattr(self, "videos") and self.videos is not None:
|
|
82
|
+
_dict["videos"] = []
|
|
83
|
+
for vid in self.videos:
|
|
84
|
+
if isinstance(vid, Video):
|
|
85
|
+
_dict["videos"].append(vid.to_dict())
|
|
86
|
+
else:
|
|
87
|
+
_dict["videos"].append(vid)
|
|
88
|
+
|
|
89
|
+
if hasattr(self, "audio") and self.audio is not None:
|
|
90
|
+
_dict["audio"] = []
|
|
91
|
+
for aud in self.audio:
|
|
92
|
+
if isinstance(aud, Audio):
|
|
93
|
+
_dict["audio"].append(aud.to_dict())
|
|
94
|
+
else:
|
|
95
|
+
_dict["audio"].append(aud)
|
|
96
|
+
|
|
97
|
+
if hasattr(self, "response_audio") and self.response_audio is not None:
|
|
98
|
+
if isinstance(self.response_audio, Audio):
|
|
99
|
+
_dict["response_audio"] = self.response_audio.to_dict()
|
|
100
|
+
else:
|
|
101
|
+
_dict["response_audio"] = self.response_audio
|
|
102
|
+
|
|
103
|
+
if hasattr(self, "citations") and self.citations is not None:
|
|
104
|
+
if isinstance(self.citations, Citations):
|
|
105
|
+
_dict["citations"] = self.citations.model_dump(exclude_none=True)
|
|
106
|
+
else:
|
|
107
|
+
_dict["citations"] = self.citations
|
|
108
|
+
|
|
109
|
+
if hasattr(self, "content") and self.content and isinstance(self.content, BaseModel):
|
|
110
|
+
_dict["content"] = self.content.model_dump(exclude_none=True)
|
|
111
|
+
|
|
112
|
+
if hasattr(self, "tools") and self.tools is not None:
|
|
113
|
+
from agno.models.response import ToolExecution
|
|
114
|
+
|
|
115
|
+
_dict["tools"] = []
|
|
116
|
+
for tool in self.tools:
|
|
117
|
+
if isinstance(tool, ToolExecution):
|
|
118
|
+
_dict["tools"].append(tool.to_dict())
|
|
119
|
+
else:
|
|
120
|
+
_dict["tools"].append(tool)
|
|
121
|
+
|
|
122
|
+
if hasattr(self, "tool") and self.tool is not None:
|
|
123
|
+
from agno.models.response import ToolExecution
|
|
124
|
+
|
|
125
|
+
if isinstance(self.tool, ToolExecution):
|
|
126
|
+
_dict["tool"] = self.tool.to_dict()
|
|
127
|
+
else:
|
|
128
|
+
_dict["tool"] = self.tool
|
|
129
|
+
|
|
130
|
+
if hasattr(self, "metrics") and self.metrics is not None:
|
|
131
|
+
_dict["metrics"] = self.metrics.to_dict()
|
|
132
|
+
|
|
133
|
+
if hasattr(self, "session_summary") and self.session_summary is not None:
|
|
134
|
+
_dict["session_summary"] = self.session_summary.to_dict()
|
|
135
|
+
|
|
136
|
+
return _dict
|
|
137
|
+
|
|
138
|
+
def to_json(self, separators=(", ", ": "), indent: Optional[int] = 2) -> str:
|
|
139
|
+
import json
|
|
140
|
+
|
|
141
|
+
from agno.utils.serialize import json_serializer
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
_dict = self.to_dict()
|
|
145
|
+
except Exception:
|
|
146
|
+
log_error("Failed to convert response event to json", exc_info=True)
|
|
147
|
+
raise
|
|
148
|
+
|
|
149
|
+
if indent is None:
|
|
150
|
+
return json.dumps(_dict, separators=separators, default=json_serializer, ensure_ascii=False)
|
|
151
|
+
else:
|
|
152
|
+
return json.dumps(_dict, indent=indent, separators=separators, default=json_serializer, ensure_ascii=False)
|
|
153
|
+
|
|
154
|
+
@classmethod
|
|
155
|
+
def from_dict(cls, data: Dict[str, Any]):
|
|
156
|
+
tool = data.pop("tool", None)
|
|
157
|
+
if tool:
|
|
158
|
+
from agno.models.response import ToolExecution
|
|
159
|
+
|
|
160
|
+
data["tool"] = ToolExecution.from_dict(tool)
|
|
161
|
+
|
|
162
|
+
images = data.pop("images", None)
|
|
163
|
+
if images:
|
|
164
|
+
data["images"] = [Image.model_validate(image) for image in images]
|
|
165
|
+
|
|
166
|
+
videos = data.pop("videos", None)
|
|
167
|
+
if videos:
|
|
168
|
+
data["videos"] = [Video.model_validate(video) for video in videos]
|
|
169
|
+
|
|
170
|
+
audio = data.pop("audio", None)
|
|
171
|
+
if audio:
|
|
172
|
+
data["audio"] = [Audio.model_validate(audio) for audio in audio]
|
|
173
|
+
|
|
174
|
+
response_audio = data.pop("response_audio", None)
|
|
175
|
+
if response_audio:
|
|
176
|
+
data["response_audio"] = Audio.model_validate(response_audio)
|
|
177
|
+
|
|
178
|
+
additional_input = data.pop("additional_input", None)
|
|
179
|
+
if additional_input is not None:
|
|
180
|
+
data["additional_input"] = [Message.model_validate(message) for message in additional_input]
|
|
181
|
+
|
|
182
|
+
reasoning_steps = data.pop("reasoning_steps", None)
|
|
183
|
+
if reasoning_steps is not None:
|
|
184
|
+
data["reasoning_steps"] = [ReasoningStep.model_validate(step) for step in reasoning_steps]
|
|
185
|
+
|
|
186
|
+
reasoning_messages = data.pop("reasoning_messages", None)
|
|
187
|
+
if reasoning_messages is not None:
|
|
188
|
+
data["reasoning_messages"] = [Message.model_validate(message) for message in reasoning_messages]
|
|
189
|
+
|
|
190
|
+
references = data.pop("references", None)
|
|
191
|
+
if references is not None:
|
|
192
|
+
data["references"] = [MessageReferences.model_validate(reference) for reference in references]
|
|
193
|
+
|
|
194
|
+
metrics = data.pop("metrics", None)
|
|
195
|
+
if metrics:
|
|
196
|
+
data["metrics"] = Metrics(**metrics)
|
|
197
|
+
|
|
198
|
+
session_summary = data.pop("session_summary", None)
|
|
199
|
+
if session_summary:
|
|
200
|
+
from agno.session.summary import SessionSummary
|
|
201
|
+
|
|
202
|
+
data["session_summary"] = SessionSummary.from_dict(session_summary)
|
|
203
|
+
|
|
204
|
+
# Filter data to only include fields that are actually defined in the target class
|
|
205
|
+
from dataclasses import fields
|
|
206
|
+
|
|
207
|
+
supported_fields = {f.name for f in fields(cls)}
|
|
208
|
+
filtered_data = {k: v for k, v in data.items() if k in supported_fields}
|
|
209
|
+
|
|
210
|
+
return cls(**filtered_data)
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def is_paused(self):
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
@property
|
|
217
|
+
def is_cancelled(self):
|
|
218
|
+
return False
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
class RunStatus(str, Enum):
|
|
222
|
+
"""State of the main run response"""
|
|
223
|
+
|
|
224
|
+
pending = "PENDING"
|
|
225
|
+
running = "RUNNING"
|
|
226
|
+
completed = "COMPLETED"
|
|
227
|
+
paused = "PAUSED"
|
|
228
|
+
cancelled = "CANCELLED"
|
|
229
|
+
error = "ERROR"
|
agno/run/cancel.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""Run cancellation management."""
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
from typing import Dict
|
|
5
|
+
|
|
6
|
+
from agno.exceptions import RunCancelledException
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunCancellationManager:
|
|
11
|
+
"""Manages cancellation state for agent runs."""
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self._cancelled_runs: Dict[str, bool] = {}
|
|
15
|
+
self._lock = threading.Lock()
|
|
16
|
+
|
|
17
|
+
def register_run(self, run_id: str) -> None:
|
|
18
|
+
"""Register a new run as not cancelled."""
|
|
19
|
+
with self._lock:
|
|
20
|
+
self._cancelled_runs[run_id] = False
|
|
21
|
+
|
|
22
|
+
def cancel_run(self, run_id: str) -> bool:
|
|
23
|
+
"""Cancel a run by marking it as cancelled.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
bool: True if run was found and cancelled, False if run not found.
|
|
27
|
+
"""
|
|
28
|
+
with self._lock:
|
|
29
|
+
if run_id in self._cancelled_runs:
|
|
30
|
+
self._cancelled_runs[run_id] = True
|
|
31
|
+
logger.info(f"Run {run_id} marked for cancellation")
|
|
32
|
+
return True
|
|
33
|
+
else:
|
|
34
|
+
logger.warning(f"Attempted to cancel unknown run {run_id}")
|
|
35
|
+
return False
|
|
36
|
+
|
|
37
|
+
def is_cancelled(self, run_id: str) -> bool:
|
|
38
|
+
"""Check if a run is cancelled."""
|
|
39
|
+
with self._lock:
|
|
40
|
+
return self._cancelled_runs.get(run_id, False)
|
|
41
|
+
|
|
42
|
+
def cleanup_run(self, run_id: str) -> None:
|
|
43
|
+
"""Remove a run from tracking (called when run completes)."""
|
|
44
|
+
with self._lock:
|
|
45
|
+
if run_id in self._cancelled_runs:
|
|
46
|
+
del self._cancelled_runs[run_id]
|
|
47
|
+
|
|
48
|
+
def raise_if_cancelled(self, run_id: str) -> None:
|
|
49
|
+
"""Check if a run should be cancelled and raise exception if so."""
|
|
50
|
+
if self.is_cancelled(run_id):
|
|
51
|
+
logger.info(f"Cancelling run {run_id}")
|
|
52
|
+
raise RunCancelledException(f"Run {run_id} was cancelled")
|
|
53
|
+
|
|
54
|
+
def get_active_runs(self) -> Dict[str, bool]:
|
|
55
|
+
"""Get all currently tracked runs and their cancellation status."""
|
|
56
|
+
with self._lock:
|
|
57
|
+
return self._cancelled_runs.copy()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# Global cancellation manager instance
|
|
61
|
+
_cancellation_manager = RunCancellationManager()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def register_run(run_id: str) -> None:
|
|
65
|
+
"""Register a new run for cancellation tracking."""
|
|
66
|
+
_cancellation_manager.register_run(run_id)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def cancel_run(run_id: str) -> bool:
|
|
70
|
+
"""Cancel a run."""
|
|
71
|
+
return _cancellation_manager.cancel_run(run_id)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def cleanup_run(run_id: str) -> None:
|
|
75
|
+
"""Clean up cancellation tracking for a completed run."""
|
|
76
|
+
_cancellation_manager.cleanup_run(run_id)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def raise_if_cancelled(run_id: str) -> None:
|
|
80
|
+
"""Check if a run should be cancelled and raise exception if so."""
|
|
81
|
+
_cancellation_manager.raise_if_cancelled(run_id)
|
agno/run/messages.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from agno.models.message import Message
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class RunMessages:
|
|
9
|
+
"""Container for messages used in an Agent run.
|
|
10
|
+
|
|
11
|
+
Attributes:
|
|
12
|
+
messages: List of all messages to send to the model
|
|
13
|
+
system_message: The system message for this run
|
|
14
|
+
user_message: The user message for this run
|
|
15
|
+
extra_messages: Extra messages added after the system and user messages
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
messages: List[Message] = field(default_factory=list)
|
|
19
|
+
system_message: Optional[Message] = None
|
|
20
|
+
user_message: Optional[Message] = None
|
|
21
|
+
extra_messages: Optional[List[Message]] = None
|
|
22
|
+
|
|
23
|
+
def get_input_messages(self) -> List[Message]:
|
|
24
|
+
"""Get the input messages for the model."""
|
|
25
|
+
input_messages = []
|
|
26
|
+
if self.system_message is not None:
|
|
27
|
+
input_messages.append(self.system_message)
|
|
28
|
+
if self.user_message is not None:
|
|
29
|
+
input_messages.append(self.user_message)
|
|
30
|
+
if self.extra_messages is not None:
|
|
31
|
+
input_messages.extend(self.extra_messages)
|
|
32
|
+
return input_messages
|