agno 2.3.14__tar.gz → 2.3.15__tar.gz
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-2.3.14 → agno-2.3.15}/PKG-INFO +1 -1
- {agno-2.3.14 → agno-2.3.15}/agno/agent/agent.py +29 -1
- {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/manager.py +3 -3
- {agno-2.3.14 → agno-2.3.15}/agno/models/anthropic/claude.py +5 -3
- {agno-2.3.14 → agno-2.3.15}/agno/models/metrics.py +12 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openai/chat.py +2 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/app.py +20 -2
- {agno-2.3.14 → agno-2.3.15}/agno/os/auth.py +40 -3
- {agno-2.3.14 → agno-2.3.15}/agno/os/router.py +1 -57
- agno-2.3.15/agno/os/routers/database.py +150 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/settings.py +3 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/agent.py +10 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/base.py +19 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/team.py +10 -0
- {agno-2.3.14 → agno-2.3.15}/agno/team/team.py +10 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/toolkit.py +119 -8
- {agno-2.3.14 → agno-2.3.15}/agno/utils/events.py +30 -2
- {agno-2.3.14 → agno-2.3.15}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.3.14 → agno-2.3.15}/agno.egg-info/SOURCES.txt +1 -0
- {agno-2.3.14 → agno-2.3.15}/pyproject.toml +1 -1
- {agno-2.3.14 → agno-2.3.15}/LICENSE +0 -0
- {agno-2.3.14 → agno-2.3.15}/README.md +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/agent/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/api.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/os.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/routes.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/os.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/response.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/team.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/workflows.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/settings.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/team.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/api/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/compression/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/compression/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/culture/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/culture/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/firestore.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/json/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/json/json_db.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/json/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/versions/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/versions/v2_3_0.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/async_mongo.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/mongo.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/async_mysql.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/mysql.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/async_postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/redis/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/redis/redis.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/redis/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/redis/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/culture.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/models.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/db/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/debug.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/accuracy.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/agent_as_judge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/performance.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/reliability.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/eval/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/exceptions.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/filters.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/guardrails/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/guardrails/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/guardrails/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/guardrails/pii.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/hooks/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/hooks/decorator.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/integrations/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/integrations/discord/client.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/content.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/document/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/vllm.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/csv_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/pptx_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/types.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/knowledge/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/media.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/summarize.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/types.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/aws/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/aws/bedrock.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/aws/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/azure/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cohere/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cohere/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/defaults.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/google/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/google/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/google/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/groq/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/groq/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/ibm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/internlm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/internlm/internlm.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/langdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/langdb/langdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/message.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/meta/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/meta/llama.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/mistral/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/mistral/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nebius/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nebius/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nexus/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nexus/nexus.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/ollama/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/ollama/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openai/like.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openai/responses.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/portkey/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/portkey/portkey.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/requesty/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/requesty/requesty.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/response.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/together/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/together/together.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vercel/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vercel/v0.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vertexai/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vllm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/vllm/vllm.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/xai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/models/xai/xai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/config.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/middleware/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/middleware/jwt.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/health.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/home.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/session/session.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/traces.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/scopes.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/os/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/py.typed +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/anthropic.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/deepseek.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/default.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/helpers.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/ollama.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/step.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/reasoning/vertexai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/cancel.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/messages.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/requirement.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/run/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/session/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/session/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/session/summary.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/session/team.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/session/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/table.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/team/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/agentql.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/airflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/api.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/apify.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/arxiv.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/aws_lambda.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/aws_ses.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/baidusearch.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/bitbucket.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/brandfetch.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/bravesearch.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/brightdata.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/browserbase.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/calcom.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/calculator.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/cartesia.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/clickup.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/confluence.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/crawl4ai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/dalle.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/daytona.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/decorator.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/desi_vocal.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/discord.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/docker.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/duckdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/duckduckgo.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/e2b.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/eleven_labs.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/email.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/evm.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/exa.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/fal.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/file.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/file_generation.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/financial_datasets.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/firecrawl.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/function.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/giphy.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/github.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/gmail.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/google_bigquery.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/google_drive.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/google_maps.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/googlecalendar.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/googlesheets.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/hackernews.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/jina.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/jira.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/linear.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/linkup.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/local_file_system.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/lumalab.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/params.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mem0.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/morph.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/models_labs.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/moviepy_video.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/nano_banana.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/neo4j.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/newspaper.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/newspaper4k.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/notion.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/openbb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/opencv.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/openweather.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/oxylabs.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/pandas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/parallel.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/pubmed.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/python.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/reasoning.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/reddit.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/redshift.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/replicate.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/resend.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/scrapegraph.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/searxng.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/serpapi.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/serper.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/shell.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/shopify.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/slack.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/sleep.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/spider.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/spotify.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/sql.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/streamlit/components.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/tavily.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/telegram.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/todoist.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/tool_registry.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/trafilatura.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/trello.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/twilio.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/user_control_flow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/valyu.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/visualization.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/webbrowser.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/webex.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/website.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/webtools.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/wikipedia.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/x.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/yfinance.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/youtube.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/zendesk.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/zep.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tools/zoom.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tracing/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tracing/exporter.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tracing/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/tracing/setup.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/audio.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/certs.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/code_execution.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/common.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/cryptography.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/dttm.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/enum.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/env.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/format_str.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/functions.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/hooks.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/http.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/json_schema.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/location.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/log.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/media.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/merge_dict.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/message.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/llama.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/models/watsonx.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/pickle.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/pprint.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/team.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/prompts.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/reasoning.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/response.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/response_iterator.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/safe_formatter.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/serialize.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/shell.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/streamlit.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/string.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/team.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/timer.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/tokens.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/tools.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/web.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/utils/yaml_io.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/base.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/distance.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/redis/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/redis/redisdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/search.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/condition.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/loop.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/parallel.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/router.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/step.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/steps.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/types.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno/workflow/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno.egg-info/requires.txt +0 -0
- {agno-2.3.14 → agno-2.3.15}/agno.egg-info/top_level.txt +0 -0
- {agno-2.3.14 → agno-2.3.15}/setup.cfg +0 -0
|
@@ -131,6 +131,7 @@ from agno.utils.events import (
|
|
|
131
131
|
create_session_summary_completed_event,
|
|
132
132
|
create_session_summary_started_event,
|
|
133
133
|
create_tool_call_completed_event,
|
|
134
|
+
create_tool_call_error_event,
|
|
134
135
|
create_tool_call_started_event,
|
|
135
136
|
handle_event,
|
|
136
137
|
)
|
|
@@ -2304,7 +2305,7 @@ class Agent:
|
|
|
2304
2305
|
cultural_knowledge_task = None
|
|
2305
2306
|
|
|
2306
2307
|
# 1. Read or create session. Reads from the database if provided.
|
|
2307
|
-
agent_session = self.
|
|
2308
|
+
agent_session = await self._aread_or_create_session(session_id=session_id, user_id=user_id)
|
|
2308
2309
|
|
|
2309
2310
|
# Set up retry logic
|
|
2310
2311
|
num_attempts = self.retries + 1
|
|
@@ -4946,6 +4947,15 @@ class Agent:
|
|
|
4946
4947
|
events_to_skip=self.events_to_skip, # type: ignore
|
|
4947
4948
|
store_events=self.store_events,
|
|
4948
4949
|
)
|
|
4950
|
+
if tool.tool_call_error:
|
|
4951
|
+
yield handle_event( # type: ignore
|
|
4952
|
+
create_tool_call_error_event(
|
|
4953
|
+
from_run_response=run_response, tool=tool, error=str(tool.result)
|
|
4954
|
+
),
|
|
4955
|
+
run_response,
|
|
4956
|
+
events_to_skip=self.events_to_skip, # type: ignore
|
|
4957
|
+
store_events=self.store_events,
|
|
4958
|
+
)
|
|
4949
4959
|
|
|
4950
4960
|
if len(function_call_results) > 0:
|
|
4951
4961
|
run_messages.messages.extend(function_call_results)
|
|
@@ -5003,6 +5013,15 @@ class Agent:
|
|
|
5003
5013
|
events_to_skip=self.events_to_skip, # type: ignore
|
|
5004
5014
|
store_events=self.store_events,
|
|
5005
5015
|
)
|
|
5016
|
+
if tool.tool_call_error:
|
|
5017
|
+
yield handle_event( # type: ignore
|
|
5018
|
+
create_tool_call_error_event(
|
|
5019
|
+
from_run_response=run_response, tool=tool, error=str(tool.result)
|
|
5020
|
+
),
|
|
5021
|
+
run_response,
|
|
5022
|
+
events_to_skip=self.events_to_skip, # type: ignore
|
|
5023
|
+
store_events=self.store_events,
|
|
5024
|
+
)
|
|
5006
5025
|
if len(function_call_results) > 0:
|
|
5007
5026
|
run_messages.messages.extend(function_call_results)
|
|
5008
5027
|
|
|
@@ -5756,6 +5775,15 @@ class Agent:
|
|
|
5756
5775
|
events_to_skip=self.events_to_skip, # type: ignore
|
|
5757
5776
|
store_events=self.store_events,
|
|
5758
5777
|
)
|
|
5778
|
+
if tool_call.tool_call_error:
|
|
5779
|
+
yield handle_event( # type: ignore
|
|
5780
|
+
create_tool_call_error_event(
|
|
5781
|
+
from_run_response=run_response, tool=tool_call, error=str(tool_call.result)
|
|
5782
|
+
),
|
|
5783
|
+
run_response,
|
|
5784
|
+
events_to_skip=self.events_to_skip, # type: ignore
|
|
5785
|
+
store_events=self.store_events,
|
|
5786
|
+
)
|
|
5759
5787
|
|
|
5760
5788
|
if stream_events:
|
|
5761
5789
|
if reasoning_step is not None:
|
|
@@ -66,13 +66,13 @@ class MigrationManager:
|
|
|
66
66
|
current_version = packaging_version.parse(self.db.get_latest_schema_version(table_name))
|
|
67
67
|
|
|
68
68
|
if current_version is None:
|
|
69
|
-
|
|
69
|
+
log_info(f"Skipping migration: No version found for table {table_name}.")
|
|
70
70
|
continue
|
|
71
71
|
|
|
72
72
|
# If the target version is less or equal to the current version, no migrations needed
|
|
73
73
|
if _target_version <= current_version and not force:
|
|
74
|
-
|
|
75
|
-
f"Skipping
|
|
74
|
+
log_info(
|
|
75
|
+
f"Skipping migration: the version of table '{table_name}' ({current_version}) is less or equal to the target version ({_target_version})."
|
|
76
76
|
)
|
|
77
77
|
continue
|
|
78
78
|
|
|
@@ -102,8 +102,8 @@ class Claude(Model):
|
|
|
102
102
|
# Claude Sonnet 4.x family (versions before 4.5)
|
|
103
103
|
"claude-sonnet-4-20250514",
|
|
104
104
|
"claude-sonnet-4",
|
|
105
|
-
# Claude Opus 4.x family (versions before 4.1)
|
|
106
|
-
# (Add any Opus 4.x models released before 4.1 if they exist)
|
|
105
|
+
# Claude Opus 4.x family (versions before 4.1 and 4.5)
|
|
106
|
+
# (Add any Opus 4.x models released before 4.1/4.5 if they exist)
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
id: str = "claude-sonnet-4-5-20250929"
|
|
@@ -191,7 +191,9 @@ class Claude(Model):
|
|
|
191
191
|
return False
|
|
192
192
|
if self.id.startswith("claude-sonnet-4-") and not self.id.startswith("claude-sonnet-4-5"):
|
|
193
193
|
return False
|
|
194
|
-
if self.id.startswith("claude-opus-4-") and not
|
|
194
|
+
if self.id.startswith("claude-opus-4-") and not (
|
|
195
|
+
self.id.startswith("claude-opus-4-1") or self.id.startswith("claude-opus-4-5")
|
|
196
|
+
):
|
|
195
197
|
return False
|
|
196
198
|
|
|
197
199
|
return True
|
|
@@ -13,6 +13,10 @@ class Metrics:
|
|
|
13
13
|
output_tokens: int = 0
|
|
14
14
|
total_tokens: int = 0
|
|
15
15
|
|
|
16
|
+
# Cost of the run
|
|
17
|
+
# Currently only supported by some providers
|
|
18
|
+
cost: Optional[float] = None
|
|
19
|
+
|
|
16
20
|
# Audio token usage
|
|
17
21
|
audio_input_tokens: int = 0
|
|
18
22
|
audio_output_tokens: int = 0
|
|
@@ -43,6 +47,7 @@ class Metrics:
|
|
|
43
47
|
metrics_dict = asdict(self)
|
|
44
48
|
# Remove the timer util if present
|
|
45
49
|
metrics_dict.pop("timer", None)
|
|
50
|
+
# Remove any None, 0, or empty dict values
|
|
46
51
|
metrics_dict = {
|
|
47
52
|
k: v
|
|
48
53
|
for k, v in metrics_dict.items()
|
|
@@ -65,6 +70,13 @@ class Metrics:
|
|
|
65
70
|
reasoning_tokens=self.reasoning_tokens + other.reasoning_tokens,
|
|
66
71
|
)
|
|
67
72
|
|
|
73
|
+
if self.cost is not None and other.cost is not None:
|
|
74
|
+
result.cost = self.cost + other.cost
|
|
75
|
+
elif self.cost is not None:
|
|
76
|
+
result.cost = self.cost
|
|
77
|
+
elif other.cost is not None:
|
|
78
|
+
result.cost = other.cost
|
|
79
|
+
|
|
68
80
|
# Handle provider_metrics
|
|
69
81
|
if self.provider_metrics or other.provider_metrics:
|
|
70
82
|
result.provider_metrics = {}
|
|
@@ -945,4 +945,6 @@ class OpenAIChat(Model):
|
|
|
945
945
|
metrics.audio_output_tokens = completion_tokens_details.audio_tokens or 0
|
|
946
946
|
metrics.reasoning_tokens = completion_tokens_details.reasoning_tokens or 0
|
|
947
947
|
|
|
948
|
+
metrics.cost = getattr(response_usage, "cost", None)
|
|
949
|
+
|
|
948
950
|
return metrics
|
|
@@ -34,6 +34,7 @@ from agno.os.config import (
|
|
|
34
34
|
from agno.os.interfaces.base import BaseInterface
|
|
35
35
|
from agno.os.router import get_base_router
|
|
36
36
|
from agno.os.routers.agents import get_agent_router
|
|
37
|
+
from agno.os.routers.database import get_database_router
|
|
37
38
|
from agno.os.routers.evals import get_eval_router
|
|
38
39
|
from agno.os.routers.health import get_health_router
|
|
39
40
|
from agno.os.routers.home import get_home_router
|
|
@@ -574,6 +575,7 @@ class AgentOS:
|
|
|
574
575
|
get_metrics_router(dbs=self.dbs),
|
|
575
576
|
get_knowledge_router(knowledge_instances=self.knowledge_instances),
|
|
576
577
|
get_traces_router(dbs=self.dbs),
|
|
578
|
+
get_database_router(self, settings=self.settings),
|
|
577
579
|
]
|
|
578
580
|
|
|
579
581
|
for router in routers:
|
|
@@ -614,6 +616,18 @@ class AgentOS:
|
|
|
614
616
|
|
|
615
617
|
# Add JWT middleware if authorization is enabled
|
|
616
618
|
if self.authorization:
|
|
619
|
+
# Set authorization_enabled flag on settings so security key validation is skipped
|
|
620
|
+
self.settings.authorization_enabled = True
|
|
621
|
+
|
|
622
|
+
jwt_configured = bool(getenv("JWT_VERIFICATION_KEY") or getenv("JWT_JWKS_FILE"))
|
|
623
|
+
security_key_set = bool(self.settings.os_security_key)
|
|
624
|
+
if jwt_configured and security_key_set:
|
|
625
|
+
log_warning(
|
|
626
|
+
"Both JWT configuration (JWT_VERIFICATION_KEY or JWT_JWKS_FILE) and OS_SECURITY_KEY are set. "
|
|
627
|
+
"With authorization=True, only JWT authorization will be used. "
|
|
628
|
+
"Consider removing OS_SECURITY_KEY from your environment."
|
|
629
|
+
)
|
|
630
|
+
|
|
617
631
|
self._add_jwt_middleware(fastapi_app)
|
|
618
632
|
|
|
619
633
|
return fastapi_app
|
|
@@ -1033,8 +1047,12 @@ class AgentOS:
|
|
|
1033
1047
|
Align.center(f"[bold cyan]{public_endpoint}[/bold cyan]"),
|
|
1034
1048
|
Align.center(f"\n\n[bold dark_orange]OS running on:[/bold dark_orange] http://{host}:{port}"),
|
|
1035
1049
|
]
|
|
1036
|
-
if
|
|
1037
|
-
panel_group.append(
|
|
1050
|
+
if self.authorization:
|
|
1051
|
+
panel_group.append(
|
|
1052
|
+
Align.center("\n\n[bold chartreuse3]:lock: JWT Authorization Enabled[/bold chartreuse3]")
|
|
1053
|
+
)
|
|
1054
|
+
elif bool(self.settings.os_security_key):
|
|
1055
|
+
panel_group.append(Align.center("\n\n[bold chartreuse3]:lock: Security Key Enabled[/bold chartreuse3]"))
|
|
1038
1056
|
|
|
1039
1057
|
console = Console()
|
|
1040
1058
|
console.print(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from os import getenv
|
|
1
2
|
from typing import List, Set
|
|
2
3
|
|
|
3
4
|
from fastapi import Depends, HTTPException, Request
|
|
@@ -10,18 +11,43 @@ from agno.os.settings import AgnoAPISettings
|
|
|
10
11
|
security = HTTPBearer(auto_error=False)
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
def _is_jwt_configured() -> bool:
|
|
15
|
+
"""Check if JWT authentication is configured via environment variables.
|
|
16
|
+
|
|
17
|
+
This covers cases where JWT middleware is set up manually (not via authorization=True).
|
|
18
|
+
"""
|
|
19
|
+
return bool(getenv("JWT_VERIFICATION_KEY") or getenv("JWT_JWKS_FILE"))
|
|
20
|
+
|
|
21
|
+
|
|
13
22
|
def get_authentication_dependency(settings: AgnoAPISettings):
|
|
14
23
|
"""
|
|
15
24
|
Create an authentication dependency function for FastAPI routes.
|
|
16
25
|
|
|
26
|
+
This handles security key authentication (OS_SECURITY_KEY).
|
|
27
|
+
When JWT authorization is enabled (via authorization=True, JWT environment variables,
|
|
28
|
+
or manually added JWT middleware), this dependency is skipped as JWT middleware
|
|
29
|
+
handles authentication.
|
|
30
|
+
|
|
17
31
|
Args:
|
|
18
|
-
settings: The API settings containing the security key
|
|
32
|
+
settings: The API settings containing the security key and authorization flag
|
|
19
33
|
|
|
20
34
|
Returns:
|
|
21
35
|
A dependency function that can be used with FastAPI's Depends()
|
|
22
36
|
"""
|
|
23
37
|
|
|
24
|
-
async def auth_dependency(credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
|
|
38
|
+
async def auth_dependency(request: Request, credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
|
|
39
|
+
# If JWT authorization is enabled via settings (authorization=True on AgentOS)
|
|
40
|
+
if settings and settings.authorization_enabled:
|
|
41
|
+
return True
|
|
42
|
+
|
|
43
|
+
# Check if JWT middleware has already handled authentication
|
|
44
|
+
if getattr(request.state, "authenticated", False):
|
|
45
|
+
return True
|
|
46
|
+
|
|
47
|
+
# Also skip if JWT is configured via environment variables
|
|
48
|
+
if _is_jwt_configured():
|
|
49
|
+
return True
|
|
50
|
+
|
|
25
51
|
# If no security key is set, skip authentication entirely
|
|
26
52
|
if not settings or not settings.os_security_key:
|
|
27
53
|
return True
|
|
@@ -45,13 +71,24 @@ def validate_websocket_token(token: str, settings: AgnoAPISettings) -> bool:
|
|
|
45
71
|
"""
|
|
46
72
|
Validate a bearer token for WebSocket authentication (legacy os_security_key method).
|
|
47
73
|
|
|
74
|
+
When JWT authorization is enabled (via authorization=True or JWT environment variables),
|
|
75
|
+
this validation is skipped as JWT middleware handles authentication.
|
|
76
|
+
|
|
48
77
|
Args:
|
|
49
78
|
token: The bearer token to validate
|
|
50
|
-
settings: The API settings containing the security key
|
|
79
|
+
settings: The API settings containing the security key and authorization flag
|
|
51
80
|
|
|
52
81
|
Returns:
|
|
53
82
|
True if the token is valid or authentication is disabled, False otherwise
|
|
54
83
|
"""
|
|
84
|
+
# If JWT authorization is enabled, skip security key validation
|
|
85
|
+
if settings and settings.authorization_enabled:
|
|
86
|
+
return True
|
|
87
|
+
|
|
88
|
+
# Also skip if JWT is configured via environment variables (manual JWT middleware setup)
|
|
89
|
+
if _is_jwt_configured():
|
|
90
|
+
return True
|
|
91
|
+
|
|
55
92
|
# If no security key is set, skip authentication entirely
|
|
56
93
|
if not settings or not settings.os_security_key:
|
|
57
94
|
return True
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
from typing import TYPE_CHECKING, List,
|
|
1
|
+
from typing import TYPE_CHECKING, List, Union, cast
|
|
2
2
|
|
|
3
3
|
from fastapi import (
|
|
4
4
|
APIRouter,
|
|
5
5
|
Depends,
|
|
6
|
-
HTTPException,
|
|
7
6
|
)
|
|
8
|
-
from fastapi.responses import JSONResponse
|
|
9
|
-
from packaging import version
|
|
10
7
|
|
|
11
8
|
from agno.agent.agent import Agent
|
|
12
|
-
from agno.db.base import AsyncBaseDb
|
|
13
|
-
from agno.db.migrations.manager import MigrationManager
|
|
14
9
|
from agno.os.auth import get_authentication_dependency
|
|
15
10
|
from agno.os.schema import (
|
|
16
11
|
AgentSummaryResponse,
|
|
@@ -26,9 +21,6 @@ from agno.os.schema import (
|
|
|
26
21
|
WorkflowSummaryResponse,
|
|
27
22
|
)
|
|
28
23
|
from agno.os.settings import AgnoAPISettings
|
|
29
|
-
from agno.os.utils import (
|
|
30
|
-
get_db,
|
|
31
|
-
)
|
|
32
24
|
from agno.team.team import Team
|
|
33
25
|
|
|
34
26
|
if TYPE_CHECKING:
|
|
@@ -207,52 +199,4 @@ def get_base_router(
|
|
|
207
199
|
|
|
208
200
|
return list(unique_models.values())
|
|
209
201
|
|
|
210
|
-
# -- Database Migration routes ---
|
|
211
|
-
@router.post(
|
|
212
|
-
"/databases/{db_id}/migrate",
|
|
213
|
-
tags=["Database"],
|
|
214
|
-
operation_id="migrate_database",
|
|
215
|
-
summary="Migrate Database",
|
|
216
|
-
description=(
|
|
217
|
-
"Migrate the given database schema to the given target version. "
|
|
218
|
-
"If a target version is not provided, the database will be migrated to the latest version. "
|
|
219
|
-
),
|
|
220
|
-
responses={
|
|
221
|
-
200: {
|
|
222
|
-
"description": "Database migrated successfully",
|
|
223
|
-
"content": {
|
|
224
|
-
"application/json": {
|
|
225
|
-
"example": {"message": "Database migrated successfully to version 3.0.0"},
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
404: {"description": "Database not found", "model": NotFoundResponse},
|
|
230
|
-
500: {"description": "Failed to migrate database", "model": InternalServerErrorResponse},
|
|
231
|
-
},
|
|
232
|
-
)
|
|
233
|
-
async def migrate_database(db_id: str, target_version: Optional[str] = None):
|
|
234
|
-
db = await get_db(os.dbs, db_id)
|
|
235
|
-
if not db:
|
|
236
|
-
raise HTTPException(status_code=404, detail="Database not found")
|
|
237
|
-
|
|
238
|
-
if target_version:
|
|
239
|
-
# Use the session table as proxy for the database schema version
|
|
240
|
-
if isinstance(db, AsyncBaseDb):
|
|
241
|
-
current_version = await db.get_latest_schema_version(db.session_table_name)
|
|
242
|
-
else:
|
|
243
|
-
current_version = db.get_latest_schema_version(db.session_table_name)
|
|
244
|
-
|
|
245
|
-
if version.parse(target_version) > version.parse(current_version): # type: ignore
|
|
246
|
-
MigrationManager(db).up(target_version) # type: ignore
|
|
247
|
-
else:
|
|
248
|
-
MigrationManager(db).down(target_version) # type: ignore
|
|
249
|
-
|
|
250
|
-
# If the target version is not provided, migrate to the latest version
|
|
251
|
-
else:
|
|
252
|
-
MigrationManager(db).up() # type: ignore
|
|
253
|
-
|
|
254
|
-
return JSONResponse(
|
|
255
|
-
content={"message": f"Database migrated successfully to version {target_version}"}, status_code=200
|
|
256
|
-
)
|
|
257
|
-
|
|
258
202
|
return router
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Optional
|
|
2
|
+
|
|
3
|
+
from fastapi import (
|
|
4
|
+
APIRouter,
|
|
5
|
+
Depends,
|
|
6
|
+
HTTPException,
|
|
7
|
+
)
|
|
8
|
+
from fastapi.responses import JSONResponse
|
|
9
|
+
from packaging import version
|
|
10
|
+
|
|
11
|
+
from agno.db.base import AsyncBaseDb
|
|
12
|
+
from agno.db.migrations.manager import MigrationManager
|
|
13
|
+
from agno.os.auth import get_authentication_dependency
|
|
14
|
+
from agno.os.schema import (
|
|
15
|
+
BadRequestResponse,
|
|
16
|
+
InternalServerErrorResponse,
|
|
17
|
+
NotFoundResponse,
|
|
18
|
+
UnauthenticatedResponse,
|
|
19
|
+
ValidationErrorResponse,
|
|
20
|
+
)
|
|
21
|
+
from agno.os.settings import AgnoAPISettings
|
|
22
|
+
from agno.os.utils import (
|
|
23
|
+
get_db,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from agno.os.app import AgentOS
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_database_router(
|
|
31
|
+
os: "AgentOS",
|
|
32
|
+
settings: AgnoAPISettings = AgnoAPISettings(),
|
|
33
|
+
) -> APIRouter:
|
|
34
|
+
"""Create the database router with comprehensive OpenAPI documentation."""
|
|
35
|
+
router = APIRouter(
|
|
36
|
+
dependencies=[Depends(get_authentication_dependency(settings))],
|
|
37
|
+
responses={
|
|
38
|
+
400: {"description": "Bad Request", "model": BadRequestResponse},
|
|
39
|
+
401: {"description": "Unauthorized", "model": UnauthenticatedResponse},
|
|
40
|
+
404: {"description": "Not Found", "model": NotFoundResponse},
|
|
41
|
+
422: {"description": "Validation Error", "model": ValidationErrorResponse},
|
|
42
|
+
500: {"description": "Internal Server Error", "model": InternalServerErrorResponse},
|
|
43
|
+
},
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
async def _migrate_single_db(db, target_version: Optional[str] = None) -> None:
|
|
47
|
+
"""Migrate a single database."""
|
|
48
|
+
if target_version:
|
|
49
|
+
# Use the session table as proxy for the database schema version
|
|
50
|
+
if isinstance(db, AsyncBaseDb):
|
|
51
|
+
current_version = await db.get_latest_schema_version(db.session_table_name)
|
|
52
|
+
else:
|
|
53
|
+
current_version = db.get_latest_schema_version(db.session_table_name)
|
|
54
|
+
|
|
55
|
+
if version.parse(target_version) > version.parse(current_version): # type: ignore
|
|
56
|
+
await MigrationManager(db).up(target_version) # type: ignore
|
|
57
|
+
else:
|
|
58
|
+
await MigrationManager(db).down(target_version) # type: ignore
|
|
59
|
+
else:
|
|
60
|
+
# If the target version is not provided, migrate to the latest version
|
|
61
|
+
await MigrationManager(db).up() # type: ignore
|
|
62
|
+
|
|
63
|
+
@router.post(
|
|
64
|
+
"/databases/all/migrate",
|
|
65
|
+
tags=["Database"],
|
|
66
|
+
operation_id="migrate_all_databases",
|
|
67
|
+
summary="Migrate All Databases",
|
|
68
|
+
description=(
|
|
69
|
+
"Migrate all database schemas to the given target version. "
|
|
70
|
+
"If a target version is not provided, all databases will be migrated to the latest version."
|
|
71
|
+
),
|
|
72
|
+
responses={
|
|
73
|
+
200: {
|
|
74
|
+
"description": "All databases migrated successfully",
|
|
75
|
+
"content": {
|
|
76
|
+
"application/json": {
|
|
77
|
+
"example": {"message": "All databases migrated successfully to version 3.0.0"},
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
500: {"description": "Failed to migrate databases", "model": InternalServerErrorResponse},
|
|
82
|
+
},
|
|
83
|
+
)
|
|
84
|
+
async def migrate_all_databases(target_version: Optional[str] = None):
|
|
85
|
+
"""Migrate all databases."""
|
|
86
|
+
all_dbs = {db.id: db for db_id, dbs in os.dbs.items() for db in dbs}
|
|
87
|
+
failed_dbs: dict[str, str] = {}
|
|
88
|
+
|
|
89
|
+
for db_id, db in all_dbs.items():
|
|
90
|
+
try:
|
|
91
|
+
await _migrate_single_db(db, target_version)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
failed_dbs[db_id] = str(e)
|
|
94
|
+
|
|
95
|
+
version_msg = f"version {target_version}" if target_version else "latest version"
|
|
96
|
+
migrated_count = len(all_dbs) - len(failed_dbs)
|
|
97
|
+
|
|
98
|
+
if failed_dbs:
|
|
99
|
+
return JSONResponse(
|
|
100
|
+
content={
|
|
101
|
+
"message": f"Migrated {migrated_count}/{len(all_dbs)} databases to {version_msg}",
|
|
102
|
+
"failed": failed_dbs,
|
|
103
|
+
},
|
|
104
|
+
status_code=207, # Multi-Status
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return JSONResponse(
|
|
108
|
+
content={"message": f"All databases migrated successfully to {version_msg}"}, status_code=200
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
@router.post(
|
|
112
|
+
"/databases/{db_id}/migrate",
|
|
113
|
+
tags=["Database"],
|
|
114
|
+
operation_id="migrate_database",
|
|
115
|
+
summary="Migrate Database",
|
|
116
|
+
description=(
|
|
117
|
+
"Migrate the given database schema to the given target version. "
|
|
118
|
+
"If a target version is not provided, the database will be migrated to the latest version."
|
|
119
|
+
),
|
|
120
|
+
responses={
|
|
121
|
+
200: {
|
|
122
|
+
"description": "Database migrated successfully",
|
|
123
|
+
"content": {
|
|
124
|
+
"application/json": {
|
|
125
|
+
"example": {"message": "Database migrated successfully to version 3.0.0"},
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
404: {"description": "Database not found", "model": NotFoundResponse},
|
|
130
|
+
500: {"description": "Failed to migrate database", "model": InternalServerErrorResponse},
|
|
131
|
+
},
|
|
132
|
+
)
|
|
133
|
+
async def migrate_database(db_id: str, target_version: Optional[str] = None):
|
|
134
|
+
db = await get_db(os.dbs, db_id)
|
|
135
|
+
if not db:
|
|
136
|
+
raise HTTPException(status_code=404, detail="Database not found")
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
await _migrate_single_db(db, target_version)
|
|
140
|
+
|
|
141
|
+
version_msg = f"version {target_version}" if target_version else "latest version"
|
|
142
|
+
return JSONResponse(
|
|
143
|
+
content={"message": f"Database migrated successfully to {version_msg}"}, status_code=200
|
|
144
|
+
)
|
|
145
|
+
except HTTPException:
|
|
146
|
+
raise
|
|
147
|
+
except Exception as e:
|
|
148
|
+
raise HTTPException(status_code=500, detail=f"Failed to migrate database: {str(e)}")
|
|
149
|
+
|
|
150
|
+
return router
|
|
@@ -20,6 +20,9 @@ class AgnoAPISettings(BaseSettings):
|
|
|
20
20
|
# Authentication settings
|
|
21
21
|
os_security_key: Optional[str] = Field(default=None, description="Bearer token for API authentication")
|
|
22
22
|
|
|
23
|
+
# Authorization flag - when True, JWT middleware handles auth and security key validation is skipped
|
|
24
|
+
authorization_enabled: bool = Field(default=False, description="Whether JWT authorization is enabled")
|
|
25
|
+
|
|
23
26
|
# Cors origin list to allow requests from.
|
|
24
27
|
# This list is set using the set_cors_origin_list validator
|
|
25
28
|
cors_origin_list: Optional[List[str]] = Field(default=None, validate_default=True)
|
|
@@ -153,6 +153,7 @@ class RunEvent(str, Enum):
|
|
|
153
153
|
|
|
154
154
|
tool_call_started = "ToolCallStarted"
|
|
155
155
|
tool_call_completed = "ToolCallCompleted"
|
|
156
|
+
tool_call_error = "ToolCallError"
|
|
156
157
|
|
|
157
158
|
reasoning_started = "ReasoningStarted"
|
|
158
159
|
reasoning_step = "ReasoningStep"
|
|
@@ -405,6 +406,13 @@ class ToolCallCompletedEvent(BaseAgentRunEvent):
|
|
|
405
406
|
audio: Optional[List[Audio]] = None # Audio produced by the tool call
|
|
406
407
|
|
|
407
408
|
|
|
409
|
+
@dataclass
|
|
410
|
+
class ToolCallErrorEvent(BaseAgentRunEvent):
|
|
411
|
+
event: str = RunEvent.tool_call_error.value
|
|
412
|
+
tool: Optional[ToolExecution] = None
|
|
413
|
+
error: Optional[str] = None
|
|
414
|
+
|
|
415
|
+
|
|
408
416
|
@dataclass
|
|
409
417
|
class ParserModelResponseStartedEvent(BaseAgentRunEvent):
|
|
410
418
|
event: str = RunEvent.parser_model_response_started.value
|
|
@@ -459,6 +467,7 @@ RunOutputEvent = Union[
|
|
|
459
467
|
SessionSummaryCompletedEvent,
|
|
460
468
|
ToolCallStartedEvent,
|
|
461
469
|
ToolCallCompletedEvent,
|
|
470
|
+
ToolCallErrorEvent,
|
|
462
471
|
ParserModelResponseStartedEvent,
|
|
463
472
|
ParserModelResponseCompletedEvent,
|
|
464
473
|
OutputModelResponseStartedEvent,
|
|
@@ -492,6 +501,7 @@ RUN_EVENT_TYPE_REGISTRY = {
|
|
|
492
501
|
RunEvent.session_summary_completed.value: SessionSummaryCompletedEvent,
|
|
493
502
|
RunEvent.tool_call_started.value: ToolCallStartedEvent,
|
|
494
503
|
RunEvent.tool_call_completed.value: ToolCallCompletedEvent,
|
|
504
|
+
RunEvent.tool_call_error.value: ToolCallErrorEvent,
|
|
495
505
|
RunEvent.parser_model_response_started.value: ParserModelResponseStartedEvent,
|
|
496
506
|
RunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
|
|
497
507
|
RunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
|
|
@@ -51,6 +51,7 @@ class BaseRunOutputEvent:
|
|
|
51
51
|
"session_summary",
|
|
52
52
|
"metrics",
|
|
53
53
|
"run_input",
|
|
54
|
+
"requirements",
|
|
54
55
|
]
|
|
55
56
|
}
|
|
56
57
|
|
|
@@ -138,6 +139,9 @@ class BaseRunOutputEvent:
|
|
|
138
139
|
if hasattr(self, "run_input") and self.run_input is not None:
|
|
139
140
|
_dict["run_input"] = self.run_input.to_dict()
|
|
140
141
|
|
|
142
|
+
if hasattr(self, "requirements") and self.requirements is not None:
|
|
143
|
+
_dict["requirements"] = [req.to_dict() if hasattr(req, "to_dict") else req for req in self.requirements]
|
|
144
|
+
|
|
141
145
|
return _dict
|
|
142
146
|
|
|
143
147
|
def to_json(self, separators=(", ", ": "), indent: Optional[int] = 2) -> str:
|
|
@@ -219,6 +223,21 @@ class BaseRunOutputEvent:
|
|
|
219
223
|
|
|
220
224
|
data["run_input"] = RunInput.from_dict(run_input)
|
|
221
225
|
|
|
226
|
+
# Handle requirements
|
|
227
|
+
|
|
228
|
+
# Handle requirements
|
|
229
|
+
requirements_data = data.pop("requirements", None)
|
|
230
|
+
if requirements_data is not None:
|
|
231
|
+
from agno.run.requirement import RunRequirement
|
|
232
|
+
|
|
233
|
+
requirements_list: List[RunRequirement] = []
|
|
234
|
+
for item in requirements_data:
|
|
235
|
+
if isinstance(item, RunRequirement):
|
|
236
|
+
requirements_list.append(item)
|
|
237
|
+
elif isinstance(item, dict):
|
|
238
|
+
requirements_list.append(RunRequirement.from_dict(item))
|
|
239
|
+
data["requirements"] = requirements_list if requirements_list else None
|
|
240
|
+
|
|
222
241
|
# Filter data to only include fields that are actually defined in the target class
|
|
223
242
|
from dataclasses import fields
|
|
224
243
|
|
|
@@ -146,6 +146,7 @@ class TeamRunEvent(str, Enum):
|
|
|
146
146
|
|
|
147
147
|
tool_call_started = "TeamToolCallStarted"
|
|
148
148
|
tool_call_completed = "TeamToolCallCompleted"
|
|
149
|
+
tool_call_error = "TeamToolCallError"
|
|
149
150
|
|
|
150
151
|
reasoning_started = "TeamReasoningStarted"
|
|
151
152
|
reasoning_step = "TeamReasoningStep"
|
|
@@ -378,6 +379,13 @@ class ToolCallCompletedEvent(BaseTeamRunEvent):
|
|
|
378
379
|
audio: Optional[List[Audio]] = None # Audio produced by the tool call
|
|
379
380
|
|
|
380
381
|
|
|
382
|
+
@dataclass
|
|
383
|
+
class ToolCallErrorEvent(BaseTeamRunEvent):
|
|
384
|
+
event: str = TeamRunEvent.tool_call_error.value
|
|
385
|
+
tool: Optional[ToolExecution] = None
|
|
386
|
+
error: Optional[str] = None
|
|
387
|
+
|
|
388
|
+
|
|
381
389
|
@dataclass
|
|
382
390
|
class ParserModelResponseStartedEvent(BaseTeamRunEvent):
|
|
383
391
|
event: str = TeamRunEvent.parser_model_response_started.value
|
|
@@ -428,6 +436,7 @@ TeamRunOutputEvent = Union[
|
|
|
428
436
|
SessionSummaryCompletedEvent,
|
|
429
437
|
ToolCallStartedEvent,
|
|
430
438
|
ToolCallCompletedEvent,
|
|
439
|
+
ToolCallErrorEvent,
|
|
431
440
|
ParserModelResponseStartedEvent,
|
|
432
441
|
ParserModelResponseCompletedEvent,
|
|
433
442
|
OutputModelResponseStartedEvent,
|
|
@@ -458,6 +467,7 @@ TEAM_RUN_EVENT_TYPE_REGISTRY = {
|
|
|
458
467
|
TeamRunEvent.session_summary_completed.value: SessionSummaryCompletedEvent,
|
|
459
468
|
TeamRunEvent.tool_call_started.value: ToolCallStartedEvent,
|
|
460
469
|
TeamRunEvent.tool_call_completed.value: ToolCallCompletedEvent,
|
|
470
|
+
TeamRunEvent.tool_call_error.value: ToolCallErrorEvent,
|
|
461
471
|
TeamRunEvent.parser_model_response_started.value: ParserModelResponseStartedEvent,
|
|
462
472
|
TeamRunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
|
|
463
473
|
TeamRunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
|
|
@@ -129,6 +129,7 @@ from agno.utils.events import (
|
|
|
129
129
|
create_team_session_summary_completed_event,
|
|
130
130
|
create_team_session_summary_started_event,
|
|
131
131
|
create_team_tool_call_completed_event,
|
|
132
|
+
create_team_tool_call_error_event,
|
|
132
133
|
create_team_tool_call_started_event,
|
|
133
134
|
handle_event,
|
|
134
135
|
)
|
|
@@ -3831,6 +3832,15 @@ class Team:
|
|
|
3831
3832
|
events_to_skip=self.events_to_skip,
|
|
3832
3833
|
store_events=self.store_events,
|
|
3833
3834
|
)
|
|
3835
|
+
if tool_call.tool_call_error:
|
|
3836
|
+
yield handle_event( # type: ignore
|
|
3837
|
+
create_team_tool_call_error_event(
|
|
3838
|
+
from_run_response=run_response, tool=tool_call, error=str(tool_call.result)
|
|
3839
|
+
),
|
|
3840
|
+
run_response,
|
|
3841
|
+
events_to_skip=self.events_to_skip,
|
|
3842
|
+
store_events=self.store_events,
|
|
3843
|
+
)
|
|
3834
3844
|
|
|
3835
3845
|
if stream_events:
|
|
3836
3846
|
if reasoning_step is not None:
|