agno 2.3.14__tar.gz → 2.3.16__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.16}/PKG-INFO +1 -1
- {agno-2.3.14 → agno-2.3.16}/agno/agent/agent.py +29 -1
- {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/manager.py +3 -3
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/csv_reader.py +10 -15
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/docx_reader.py +2 -4
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/field_labeled_csv_reader.py +12 -18
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/json_reader.py +10 -18
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/markdown_reader.py +6 -6
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/pdf_reader.py +14 -11
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/pptx_reader.py +2 -4
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/s3_reader.py +2 -11
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/text_reader.py +6 -18
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/web_search_reader.py +4 -15
- {agno-2.3.14 → agno-2.3.16}/agno/models/anthropic/claude.py +5 -3
- {agno-2.3.14 → agno-2.3.16}/agno/models/metrics.py +12 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openai/chat.py +2 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/app.py +20 -2
- {agno-2.3.14 → agno-2.3.16}/agno/os/auth.py +40 -3
- {agno-2.3.14 → agno-2.3.16}/agno/os/router.py +1 -57
- agno-2.3.16/agno/os/routers/database.py +150 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/settings.py +3 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/agent.py +10 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/base.py +19 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/team.py +10 -0
- {agno-2.3.14 → agno-2.3.16}/agno/team/team.py +10 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/toolkit.py +119 -8
- {agno-2.3.14 → agno-2.3.16}/agno/utils/events.py +30 -2
- {agno-2.3.14 → agno-2.3.16}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.3.14 → agno-2.3.16}/agno.egg-info/SOURCES.txt +1 -0
- {agno-2.3.14 → agno-2.3.16}/pyproject.toml +1 -1
- {agno-2.3.14 → agno-2.3.16}/LICENSE +0 -0
- {agno-2.3.14 → agno-2.3.16}/README.md +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/agent/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/api.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/os.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/routes.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/os.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/response.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/team.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/workflows.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/settings.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/team.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/api/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/compression/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/compression/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/culture/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/culture/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/firestore.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/json/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/json/json_db.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/json/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/versions/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/versions/v2_3_0.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/async_mongo.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/mongo.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/async_mysql.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/mysql.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/async_postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/redis/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/redis/redis.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/redis/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/redis/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/culture.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/models.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/db/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/debug.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/accuracy.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/agent_as_judge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/performance.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/reliability.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/eval/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/exceptions.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/filters.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/guardrails/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/guardrails/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/guardrails/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/guardrails/pii.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/hooks/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/hooks/decorator.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/integrations/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/integrations/discord/client.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/content.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/document/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/vllm.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/types.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/knowledge/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/media.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/summarize.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/types.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/aws/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/aws/bedrock.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/aws/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/azure/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cohere/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cohere/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/defaults.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/google/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/google/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/google/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/groq/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/groq/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/ibm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/internlm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/internlm/internlm.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/langdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/langdb/langdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/message.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/meta/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/meta/llama.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/mistral/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/mistral/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nebius/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nebius/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nexus/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nexus/nexus.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/ollama/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/ollama/chat.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openai/like.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openai/responses.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/portkey/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/portkey/portkey.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/requesty/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/requesty/requesty.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/response.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/together/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/together/together.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vercel/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vercel/v0.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vertexai/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vllm/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/vllm/vllm.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/xai/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/models/xai/xai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/config.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/middleware/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/middleware/jwt.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/health.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/home.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/session/session.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/traces.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/schema.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/scopes.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/os/utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/py.typed +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/anthropic.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/deepseek.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/default.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/helpers.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/manager.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/ollama.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/step.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/reasoning/vertexai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/cancel.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/messages.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/requirement.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/run/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/session/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/session/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/session/summary.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/session/team.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/session/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/table.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/team/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/agentql.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/airflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/api.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/apify.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/arxiv.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/aws_lambda.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/aws_ses.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/baidusearch.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/bitbucket.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/brandfetch.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/bravesearch.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/brightdata.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/browserbase.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/calcom.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/calculator.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/cartesia.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/clickup.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/confluence.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/crawl4ai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/dalle.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/daytona.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/decorator.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/desi_vocal.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/discord.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/docker.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/duckdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/duckduckgo.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/e2b.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/eleven_labs.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/email.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/evm.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/exa.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/fal.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/file.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/file_generation.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/financial_datasets.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/firecrawl.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/function.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/giphy.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/github.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/gmail.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/google_bigquery.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/google_drive.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/google_maps.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/googlecalendar.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/googlesheets.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/hackernews.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/jina.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/jira.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/linear.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/linkup.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/local_file_system.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/lumalab.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/params.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mem0.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/memory.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/groq.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/morph.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models/nebius.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/models_labs.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/moviepy_video.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/nano_banana.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/neo4j.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/newspaper.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/newspaper4k.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/notion.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/openbb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/opencv.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/openweather.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/oxylabs.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/pandas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/parallel.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/postgres.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/pubmed.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/python.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/reasoning.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/reddit.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/redshift.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/replicate.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/resend.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/scrapegraph.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/searxng.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/serpapi.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/serper.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/shell.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/shopify.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/slack.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/sleep.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/spider.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/spotify.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/sql.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/streamlit/components.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/tavily.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/telegram.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/todoist.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/tool_registry.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/trafilatura.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/trello.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/twilio.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/user_control_flow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/valyu.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/visualization.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/webbrowser.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/webex.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/website.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/webtools.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/wikipedia.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/x.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/yfinance.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/youtube.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/zendesk.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/zep.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tools/zoom.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tracing/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tracing/exporter.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tracing/schemas.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/tracing/setup.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/audio.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/certs.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/code_execution.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/common.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/cryptography.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/dttm.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/enum.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/env.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/format_str.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/functions.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/gemini.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/hooks.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/http.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/json_schema.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/knowledge.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/location.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/log.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/mcp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/media.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/merge_dict.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/message.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/claude.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/cohere.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/llama.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/mistral.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/models/watsonx.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/openai.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/pickle.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/pprint.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/team.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/prompts.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/reasoning.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/response.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/response_iterator.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/safe_formatter.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/serialize.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/shell.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/streamlit.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/string.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/team.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/timer.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/tokens.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/tools.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/web.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/whatsapp.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/utils/yaml_io.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/base.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/distance.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/redis/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/redis/redisdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/search.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/__init__.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/agent.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/condition.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/loop.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/parallel.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/router.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/step.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/steps.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/types.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno/workflow/workflow.py +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno.egg-info/requires.txt +0 -0
- {agno-2.3.14 → agno-2.3.16}/agno.egg-info/top_level.txt +0 -0
- {agno-2.3.14 → agno-2.3.16}/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
|
|
|
@@ -47,17 +47,16 @@ class CSVReader(Reader):
|
|
|
47
47
|
if not file.exists():
|
|
48
48
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
49
49
|
log_debug(f"Reading: {file}")
|
|
50
|
-
|
|
50
|
+
csv_name = name or file.stem
|
|
51
|
+
file_content: Union[io.TextIOWrapper, io.StringIO] = file.open(
|
|
52
|
+
newline="", mode="r", encoding=self.encoding or "utf-8"
|
|
53
|
+
)
|
|
51
54
|
else:
|
|
52
|
-
log_debug(f"Reading retrieved file: {name
|
|
55
|
+
log_debug(f"Reading retrieved file: {getattr(file, 'name', 'BytesIO')}")
|
|
56
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
53
57
|
file.seek(0)
|
|
54
|
-
file_content = io.StringIO(file.read().decode("utf-8"))
|
|
58
|
+
file_content = io.StringIO(file.read().decode("utf-8"))
|
|
55
59
|
|
|
56
|
-
csv_name = name or (
|
|
57
|
-
Path(file.name).stem
|
|
58
|
-
if isinstance(file, Path)
|
|
59
|
-
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
60
|
-
)
|
|
61
60
|
csv_content = ""
|
|
62
61
|
with file_content as csvfile:
|
|
63
62
|
csv_reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
|
|
@@ -109,16 +108,12 @@ class CSVReader(Reader):
|
|
|
109
108
|
async with aiofiles.open(file, mode="r", encoding="utf-8", newline="") as file_content:
|
|
110
109
|
content = await file_content.read()
|
|
111
110
|
file_content_io = io.StringIO(content)
|
|
111
|
+
csv_name = name or file.stem
|
|
112
112
|
else:
|
|
113
113
|
log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
|
|
114
114
|
file.seek(0)
|
|
115
115
|
file_content_io = io.StringIO(file.read().decode("utf-8"))
|
|
116
|
-
|
|
117
|
-
csv_name = name or (
|
|
118
|
-
Path(file.name).stem
|
|
119
|
-
if isinstance(file, Path)
|
|
120
|
-
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
121
|
-
)
|
|
116
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
122
117
|
|
|
123
118
|
file_content_io.seek(0)
|
|
124
119
|
csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
|
|
@@ -161,4 +156,4 @@ class CSVReader(Reader):
|
|
|
161
156
|
return documents
|
|
162
157
|
except Exception as e:
|
|
163
158
|
log_error(f"Error reading async: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}")
|
|
164
|
-
return []
|
|
159
|
+
return []
|
|
@@ -47,11 +47,9 @@ class DocxReader(Reader):
|
|
|
47
47
|
docx_document = DocxDocument(str(file))
|
|
48
48
|
doc_name = name or file.stem
|
|
49
49
|
else:
|
|
50
|
-
log_debug(f"Reading uploaded file: {getattr(file, 'name', '
|
|
50
|
+
log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
|
|
51
51
|
docx_document = DocxDocument(file)
|
|
52
|
-
doc_name = name or (
|
|
53
|
-
getattr(file, "name", "docx_file").split(".")[0] if hasattr(file, "name") else "docx_file"
|
|
54
|
-
)
|
|
52
|
+
doc_name = name or getattr(file, "name", "docx_file").split(".")[0]
|
|
55
53
|
|
|
56
54
|
doc_content = "\n\n".join([para.text for para in docx_document.paragraphs])
|
|
57
55
|
|
|
@@ -106,17 +106,15 @@ class FieldLabeledCSVReader(Reader):
|
|
|
106
106
|
if not file.exists():
|
|
107
107
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
108
108
|
log_debug(f"Reading: {file}")
|
|
109
|
-
|
|
109
|
+
csv_name = name or file.stem
|
|
110
|
+
file_content: Union[io.TextIOWrapper, io.StringIO] = file.open(
|
|
111
|
+
newline="", mode="r", encoding=self.encoding or "utf-8"
|
|
112
|
+
)
|
|
110
113
|
else:
|
|
111
|
-
log_debug(f"Reading retrieved file: {name
|
|
114
|
+
log_debug(f"Reading retrieved file: {getattr(file, 'name', 'BytesIO')}")
|
|
115
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
112
116
|
file.seek(0)
|
|
113
|
-
file_content = io.StringIO(file.read().decode("utf-8"))
|
|
114
|
-
|
|
115
|
-
csv_name = name or (
|
|
116
|
-
Path(file.name).stem
|
|
117
|
-
if isinstance(file, Path)
|
|
118
|
-
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
119
|
-
)
|
|
117
|
+
file_content = io.StringIO(file.read().decode("utf-8"))
|
|
120
118
|
|
|
121
119
|
documents = []
|
|
122
120
|
|
|
@@ -189,16 +187,12 @@ class FieldLabeledCSVReader(Reader):
|
|
|
189
187
|
async with aiofiles.open(file, mode="r", encoding=self.encoding or "utf-8", newline="") as file_content:
|
|
190
188
|
content = await file_content.read()
|
|
191
189
|
file_content_io = io.StringIO(content)
|
|
190
|
+
csv_name = name or file.stem
|
|
192
191
|
else:
|
|
193
|
-
log_debug(f"Reading retrieved file async: {name
|
|
192
|
+
log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
|
|
193
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
194
194
|
file.seek(0)
|
|
195
|
-
file_content_io = io.StringIO(file.read().decode("utf-8"))
|
|
196
|
-
|
|
197
|
-
csv_name = name or (
|
|
198
|
-
Path(file.name).stem
|
|
199
|
-
if isinstance(file, Path)
|
|
200
|
-
else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
|
|
201
|
-
)
|
|
195
|
+
file_content_io = io.StringIO(file.read().decode("utf-8"))
|
|
202
196
|
|
|
203
197
|
file_content_io.seek(0)
|
|
204
198
|
csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
|
|
@@ -287,4 +281,4 @@ class FieldLabeledCSVReader(Reader):
|
|
|
287
281
|
|
|
288
282
|
except Exception as e:
|
|
289
283
|
log_error(f"Error reading async: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}")
|
|
290
|
-
return []
|
|
284
|
+
return []
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
|
-
from io import BytesIO
|
|
4
3
|
from pathlib import Path
|
|
5
4
|
from typing import IO, Any, List, Optional, Union
|
|
6
5
|
from uuid import uuid4
|
|
@@ -42,17 +41,15 @@ class JSONReader(Reader):
|
|
|
42
41
|
if not path.exists():
|
|
43
42
|
raise FileNotFoundError(f"Could not find file: {path}")
|
|
44
43
|
log_debug(f"Reading: {path}")
|
|
45
|
-
json_name = name or path.
|
|
46
|
-
json_contents = json.loads(path.read_text(self.encoding or "utf-8"))
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
json_name = name or path
|
|
50
|
-
log_debug(f"Reading uploaded file: {json_name}")
|
|
44
|
+
json_name = name or path.stem
|
|
45
|
+
json_contents = json.loads(path.read_text(encoding=self.encoding or "utf-8"))
|
|
46
|
+
elif hasattr(path, "seek") and hasattr(path, "read"):
|
|
47
|
+
log_debug(f"Reading uploaded file: {getattr(path, 'name', 'BytesIO')}")
|
|
48
|
+
json_name = name or getattr(path, "name", "json_file").split(".")[0]
|
|
51
49
|
path.seek(0)
|
|
52
50
|
json_contents = json.load(path)
|
|
53
|
-
|
|
54
51
|
else:
|
|
55
|
-
raise ValueError("Unsupported file type. Must be Path or
|
|
52
|
+
raise ValueError("Unsupported file type. Must be Path or file-like object.")
|
|
56
53
|
|
|
57
54
|
if isinstance(json_contents, dict):
|
|
58
55
|
json_contents = [json_contents]
|
|
@@ -72,17 +69,12 @@ class JSONReader(Reader):
|
|
|
72
69
|
chunked_documents.extend(self.chunk_document(document))
|
|
73
70
|
return chunked_documents
|
|
74
71
|
return documents
|
|
72
|
+
except (FileNotFoundError, ValueError, json.JSONDecodeError):
|
|
73
|
+
raise
|
|
75
74
|
except Exception as e:
|
|
76
75
|
log_error(f"Error reading: {path}: {e}")
|
|
77
76
|
raise
|
|
78
77
|
|
|
79
78
|
async def async_read(self, path: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
|
|
80
|
-
"""Asynchronously read JSON files.
|
|
81
|
-
|
|
82
|
-
Args:
|
|
83
|
-
path (Union[Path, IO[Any]]): Path to a JSON file or a file-like object
|
|
84
|
-
|
|
85
|
-
Returns:
|
|
86
|
-
List[Document]: List of documents from the JSON file
|
|
87
|
-
"""
|
|
88
|
-
return await asyncio.to_thread(self.read, path, name)
|
|
79
|
+
"""Asynchronously read JSON files."""
|
|
80
|
+
return await asyncio.to_thread(self.read, path, name)
|
|
@@ -69,8 +69,8 @@ class MarkdownReader(Reader):
|
|
|
69
69
|
file_name = name or file.stem
|
|
70
70
|
file_contents = file.read_text(encoding=self.encoding or "utf-8")
|
|
71
71
|
else:
|
|
72
|
-
log_debug(f"Reading uploaded file: {file
|
|
73
|
-
file_name = name or file
|
|
72
|
+
log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
|
|
73
|
+
file_name = name or getattr(file, "name", "file").split(".")[0]
|
|
74
74
|
file.seek(0)
|
|
75
75
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
76
76
|
|
|
@@ -101,16 +101,16 @@ class MarkdownReader(Reader):
|
|
|
101
101
|
file_contents = await f.read()
|
|
102
102
|
except ImportError:
|
|
103
103
|
log_warning("aiofiles not installed, using synchronous file I/O")
|
|
104
|
-
file_contents = file.read_text(self.encoding or "utf-8")
|
|
104
|
+
file_contents = file.read_text(encoding=self.encoding or "utf-8")
|
|
105
105
|
else:
|
|
106
|
-
log_debug(f"Reading uploaded file asynchronously: {file
|
|
107
|
-
file_name = name or file
|
|
106
|
+
log_debug(f"Reading uploaded file asynchronously: {getattr(file, 'name', 'BytesIO')}")
|
|
107
|
+
file_name = name or getattr(file, "name", "file").split(".")[0]
|
|
108
108
|
file.seek(0)
|
|
109
109
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
110
110
|
|
|
111
111
|
document = Document(
|
|
112
112
|
name=file_name,
|
|
113
|
-
id=str(uuid.uuid4()),
|
|
113
|
+
id=str(uuid.uuid4()),
|
|
114
114
|
content=file_contents,
|
|
115
115
|
)
|
|
116
116
|
|
|
@@ -218,16 +218,13 @@ class BasePDFReader(Reader):
|
|
|
218
218
|
|
|
219
219
|
def _get_doc_name(self, pdf_source: Union[str, Path, IO[Any]], name: Optional[str] = None) -> str:
|
|
220
220
|
"""Determines the document name from the source or a provided name."""
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
except Exception:
|
|
229
|
-
# The original code had a bug here, it should check `name` first.
|
|
230
|
-
return name or "pdf"
|
|
221
|
+
if name:
|
|
222
|
+
return name
|
|
223
|
+
if isinstance(pdf_source, str):
|
|
224
|
+
return Path(pdf_source).stem.replace(" ", "_")
|
|
225
|
+
if isinstance(pdf_source, Path):
|
|
226
|
+
return pdf_source.stem.replace(" ", "_")
|
|
227
|
+
return getattr(pdf_source, "name", "pdf_file").split(".")[0].replace(" ", "_")
|
|
231
228
|
|
|
232
229
|
def _decrypt_pdf(self, doc_reader: DocumentReader, doc_name: str, password: Optional[str] = None) -> bool:
|
|
233
230
|
if not doc_reader.is_encrypted:
|
|
@@ -341,8 +338,14 @@ class PDFReader(BasePDFReader):
|
|
|
341
338
|
return [ContentType.PDF]
|
|
342
339
|
|
|
343
340
|
def read(
|
|
344
|
-
self,
|
|
341
|
+
self,
|
|
342
|
+
pdf: Optional[Union[str, Path, IO[Any]]] = None,
|
|
343
|
+
name: Optional[str] = None,
|
|
344
|
+
password: Optional[str] = None,
|
|
345
345
|
) -> List[Document]:
|
|
346
|
+
if pdf is None:
|
|
347
|
+
log_error("No pdf provided")
|
|
348
|
+
return []
|
|
346
349
|
doc_name = self._get_doc_name(pdf, name)
|
|
347
350
|
log_debug(f"Reading: {doc_name}")
|
|
348
351
|
|
|
@@ -47,11 +47,9 @@ class PPTXReader(Reader):
|
|
|
47
47
|
presentation = Presentation(str(file))
|
|
48
48
|
doc_name = name or file.stem
|
|
49
49
|
else:
|
|
50
|
-
log_debug(f"Reading uploaded file: {getattr(file, 'name', '
|
|
50
|
+
log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
|
|
51
51
|
presentation = Presentation(file)
|
|
52
|
-
doc_name = name or (
|
|
53
|
-
getattr(file, "name", "pptx_file").split(".")[0] if hasattr(file, "name") else "pptx_file"
|
|
54
|
-
)
|
|
52
|
+
doc_name = name or getattr(file, "name", "pptx_file").split(".")[0]
|
|
55
53
|
|
|
56
54
|
# Extract text from all slides
|
|
57
55
|
slide_texts = []
|
|
@@ -53,29 +53,20 @@ class S3Reader(Reader):
|
|
|
53
53
|
try:
|
|
54
54
|
log_debug(f"Reading S3 file: {s3_object.uri}")
|
|
55
55
|
|
|
56
|
+
doc_name = name or s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
|
|
57
|
+
|
|
56
58
|
# Read PDF files
|
|
57
59
|
if s3_object.uri.endswith(".pdf"):
|
|
58
60
|
object_resource = s3_object.get_resource()
|
|
59
61
|
object_body = object_resource.get()["Body"]
|
|
60
|
-
doc_name = (
|
|
61
|
-
s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
|
|
62
|
-
if name is None
|
|
63
|
-
else name
|
|
64
|
-
)
|
|
65
62
|
return PDFReader().read(pdf=BytesIO(object_body.read()), name=doc_name)
|
|
66
63
|
|
|
67
64
|
# Read text files
|
|
68
65
|
else:
|
|
69
|
-
doc_name = (
|
|
70
|
-
s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
|
|
71
|
-
if name is None
|
|
72
|
-
else name
|
|
73
|
-
)
|
|
74
66
|
obj_name = s3_object.name.split("/")[-1]
|
|
75
67
|
temporary_file = Path("storage").joinpath(obj_name)
|
|
76
68
|
s3_object.download(temporary_file)
|
|
77
69
|
documents = TextReader().read(file=temporary_file, name=doc_name)
|
|
78
|
-
|
|
79
70
|
temporary_file.unlink()
|
|
80
71
|
return documents
|
|
81
72
|
|
|
@@ -39,16 +39,10 @@ class TextReader(Reader):
|
|
|
39
39
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
40
40
|
log_debug(f"Reading: {file}")
|
|
41
41
|
file_name = name or file.stem
|
|
42
|
-
file_contents = file.read_text(self.encoding or "utf-8")
|
|
42
|
+
file_contents = file.read_text(encoding=self.encoding or "utf-8")
|
|
43
43
|
else:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
file_name = name
|
|
47
|
-
elif hasattr(file, "name") and file.name is not None:
|
|
48
|
-
file_name = file.name.split(".")[0]
|
|
49
|
-
else:
|
|
50
|
-
file_name = "text_file"
|
|
51
|
-
log_debug(f"Reading uploaded file: {file_name}")
|
|
44
|
+
log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
|
|
45
|
+
file_name = name or getattr(file, "name", "text_file").split(".")[0]
|
|
52
46
|
file.seek(0)
|
|
53
47
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
54
48
|
|
|
@@ -85,16 +79,10 @@ class TextReader(Reader):
|
|
|
85
79
|
file_contents = await f.read()
|
|
86
80
|
except ImportError:
|
|
87
81
|
log_warning("aiofiles not installed, using synchronous file I/O")
|
|
88
|
-
file_contents = file.read_text(self.encoding or "utf-8")
|
|
82
|
+
file_contents = file.read_text(encoding=self.encoding or "utf-8")
|
|
89
83
|
else:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
file_name = name
|
|
93
|
-
elif hasattr(file, "name") and file.name is not None:
|
|
94
|
-
file_name = file.name.split(".")[0]
|
|
95
|
-
else:
|
|
96
|
-
file_name = "text_file"
|
|
97
|
-
log_debug(f"Reading uploaded file asynchronously: {file_name}")
|
|
84
|
+
log_debug(f"Reading uploaded file asynchronously: {getattr(file, 'name', 'BytesIO')}")
|
|
85
|
+
file_name = name or getattr(file, "name", "text_file").split(".")[0]
|
|
98
86
|
file.seek(0)
|
|
99
87
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
100
88
|
|
|
@@ -263,21 +263,17 @@ class WebSearchReader(Reader):
|
|
|
263
263
|
|
|
264
264
|
log_debug(f"Starting async web search reader for query: {query}")
|
|
265
265
|
|
|
266
|
-
# Perform web search (synchronous operation)
|
|
267
266
|
search_results = self._perform_web_search(query)
|
|
268
267
|
if not search_results:
|
|
269
268
|
logger.warning(f"No search results found for query: {query}")
|
|
270
269
|
return []
|
|
271
270
|
|
|
272
|
-
# Create tasks for fetching content from each URL
|
|
273
271
|
async def fetch_url_async(result: Dict[str, str]) -> Optional[Document]:
|
|
274
272
|
url = result.get("url", "")
|
|
275
273
|
|
|
276
|
-
# Skip if URL is invalid or already visited
|
|
277
274
|
if not self._is_valid_url(url):
|
|
278
275
|
return None
|
|
279
276
|
|
|
280
|
-
# Mark URL as visited
|
|
281
277
|
self._visited_urls.add(url)
|
|
282
278
|
|
|
283
279
|
try:
|
|
@@ -292,32 +288,25 @@ class WebSearchReader(Reader):
|
|
|
292
288
|
else:
|
|
293
289
|
content = response.text
|
|
294
290
|
|
|
295
|
-
|
|
296
|
-
return document
|
|
291
|
+
return self._create_document_from_url(url, content, result)
|
|
297
292
|
|
|
298
293
|
except Exception as e:
|
|
299
294
|
logger.warning(f"Error fetching {url}: {e}")
|
|
300
295
|
return None
|
|
301
296
|
|
|
302
|
-
# Create tasks for all URLs
|
|
303
|
-
tasks = [fetch_url_async(result) for result in search_results]
|
|
304
|
-
|
|
305
|
-
# Execute all tasks concurrently with delays
|
|
306
297
|
documents = []
|
|
307
|
-
for i,
|
|
308
|
-
if i > 0:
|
|
298
|
+
for i, result in enumerate(search_results):
|
|
299
|
+
if i > 0:
|
|
309
300
|
await asyncio.sleep(self.delay_between_requests)
|
|
310
301
|
|
|
311
|
-
doc = await
|
|
302
|
+
doc = await fetch_url_async(result)
|
|
312
303
|
if doc is not None:
|
|
313
|
-
# Apply chunking if enabled
|
|
314
304
|
if self.chunk:
|
|
315
305
|
chunked_docs = await self.chunk_documents_async([doc])
|
|
316
306
|
documents.extend(chunked_docs)
|
|
317
307
|
else:
|
|
318
308
|
documents.append(doc)
|
|
319
309
|
|
|
320
|
-
# Stop if we've reached max_results
|
|
321
310
|
if len(documents) >= self.max_results:
|
|
322
311
|
break
|
|
323
312
|
|
|
@@ -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(
|