agno 2.3.15__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.15 → agno-2.3.16}/PKG-INFO +1 -1
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/csv_reader.py +10 -15
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/docx_reader.py +2 -4
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/field_labeled_csv_reader.py +12 -18
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/json_reader.py +10 -18
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/markdown_reader.py +6 -6
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/pdf_reader.py +14 -11
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/pptx_reader.py +2 -4
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/s3_reader.py +2 -11
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/text_reader.py +6 -18
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/web_search_reader.py +4 -15
- {agno-2.3.15 → agno-2.3.16}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.3.15 → agno-2.3.16}/pyproject.toml +1 -1
- {agno-2.3.15 → agno-2.3.16}/LICENSE +0 -0
- {agno-2.3.15 → agno-2.3.16}/README.md +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/agent/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/agent/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/api.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/evals.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/os.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/routes.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/evals.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/os.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/response.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/schemas/workflows.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/settings.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/api/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/cloud/aws/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/compression/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/compression/manager.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/culture/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/culture/manager.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/dynamo/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/firestore/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/firestore/firestore.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/firestore/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/firestore/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/in_memory/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/json/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/json/json_db.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/json/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/migrations/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/migrations/manager.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/migrations/versions/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/migrations/versions/v2_3_0.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mongo/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mongo/async_mongo.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mongo/mongo.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mongo/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mongo/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mysql/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mysql/async_mysql.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mysql/mysql.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mysql/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/mysql/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/postgres/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/postgres/async_postgres.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/postgres/postgres.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/postgres/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/postgres/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/redis/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/redis/redis.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/redis/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/redis/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/culture.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/evals.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/memory.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/schemas/metrics.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/singlestore/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/sqlite/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/models.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/db/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/debug.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/accuracy.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/agent_as_judge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/performance.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/reliability.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/eval/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/exceptions.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/filters.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/guardrails/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/guardrails/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/guardrails/openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/guardrails/pii.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/hooks/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/hooks/decorator.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/integrations/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/integrations/discord/client.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/content.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/document/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/vllm.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/knowledge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/types.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/knowledge/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/media.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/manager.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/strategies/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/strategies/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/strategies/summarize.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/memory/strategies/types.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/anthropic/claude.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/aws/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/aws/bedrock.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/aws/claude.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/azure/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cohere/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cohere/chat.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/defaults.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/google/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/google/gemini.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/google/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/groq/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/groq/groq.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/ibm/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/internlm/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/internlm/internlm.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/langdb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/langdb/langdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/litellm/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/litellm/chat.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/message.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/meta/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/meta/llama.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/metrics.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/mistral/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/mistral/mistral.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nebius/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nebius/nebius.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nexus/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nexus/nexus.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/ollama/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/ollama/chat.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openai/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openai/chat.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openai/like.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openai/responses.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/portkey/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/portkey/portkey.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/requesty/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/requesty/requesty.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/response.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/together/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/together/together.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vercel/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vercel/v0.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vertexai/claude.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vllm/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/vllm/vllm.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/xai/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/models/xai/xai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/app.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/auth.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/config.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/mcp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/middleware/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/middleware/jwt.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/agents/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/agents/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/agents/schema.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/database.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/health.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/home.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/session/session.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/teams/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/teams/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/teams/schema.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/traces/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/traces/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/traces/traces.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/workflows/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/workflows/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/routers/workflows/schema.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/schema.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/scopes.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/settings.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/os/utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/py.typed +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/anthropic.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/deepseek.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/default.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/gemini.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/groq.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/helpers.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/manager.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/ollama.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/step.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/reasoning/vertexai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/cancel.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/messages.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/requirement.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/run/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/session/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/session/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/session/summary.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/session/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/session/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/table.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/team/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/team/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/agentql.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/airflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/api.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/apify.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/arxiv.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/aws_lambda.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/aws_ses.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/baidusearch.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/bitbucket.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/brandfetch.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/bravesearch.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/brightdata.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/browserbase.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/calcom.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/calculator.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/cartesia.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/clickup.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/confluence.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/crawl4ai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/dalle.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/daytona.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/decorator.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/desi_vocal.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/discord.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/docker.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/duckdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/duckduckgo.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/e2b.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/eleven_labs.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/email.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/evm.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/exa.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/fal.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/file.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/file_generation.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/financial_datasets.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/firecrawl.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/function.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/giphy.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/github.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/gmail.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/google_bigquery.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/google_drive.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/google_maps.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/googlecalendar.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/googlesheets.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/hackernews.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/jina.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/jira.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/knowledge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/linear.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/linkup.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/local_file_system.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/lumalab.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mcp/params.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mem0.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/memory.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/gemini.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/groq.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/morph.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models/nebius.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/models_labs.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/moviepy_video.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/nano_banana.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/neo4j.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/newspaper.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/newspaper4k.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/notion.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/openbb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/opencv.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/openweather.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/oxylabs.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/pandas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/parallel.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/postgres.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/pubmed.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/python.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/reasoning.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/reddit.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/redshift.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/replicate.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/resend.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/scrapegraph.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/searxng.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/serpapi.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/serper.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/shell.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/shopify.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/slack.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/sleep.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/spider.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/spotify.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/sql.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/streamlit/components.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/tavily.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/telegram.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/todoist.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/tool_registry.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/toolkit.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/trafilatura.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/trello.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/twilio.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/user_control_flow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/valyu.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/visualization.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/webbrowser.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/webex.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/website.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/webtools.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/whatsapp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/wikipedia.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/x.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/yfinance.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/youtube.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/zendesk.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/zep.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tools/zoom.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tracing/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tracing/exporter.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tracing/schemas.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/tracing/setup.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/audio.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/certs.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/code_execution.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/common.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/cryptography.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/dttm.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/enum.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/env.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/events.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/format_str.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/functions.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/gemini.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/hooks.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/http.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/json_schema.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/knowledge.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/location.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/log.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/mcp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/media.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/merge_dict.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/message.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/claude.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/cohere.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/llama.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/mistral.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/models/watsonx.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/openai.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/pickle.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/pprint.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/print_response/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/print_response/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/prompts.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/reasoning.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/response.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/response_iterator.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/safe_formatter.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/serialize.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/shell.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/streamlit.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/string.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/team.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/timer.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/tokens.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/tools.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/web.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/whatsapp.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/utils/yaml_io.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/base.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/distance.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/redis/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/redis/redisdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/search.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/__init__.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/agent.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/condition.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/loop.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/parallel.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/router.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/step.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/steps.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/types.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno/workflow/workflow.py +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno.egg-info/SOURCES.txt +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno.egg-info/requires.txt +0 -0
- {agno-2.3.15 → agno-2.3.16}/agno.egg-info/top_level.txt +0 -0
- {agno-2.3.15 → agno-2.3.16}/setup.cfg +0 -0
|
@@ -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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|