agno 2.4.2__tar.gz → 2.4.3__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.4.2 → agno-2.4.3}/PKG-INFO +6 -4
- {agno-2.4.2 → agno-2.4.3}/README.md +1 -1
- {agno-2.4.2 → agno-2.4.3}/agno/agent/agent.py +13 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/openai.py +8 -4
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/knowledge.py +59 -6
- agno-2.4.3/agno/knowledge/reader/csv_reader.py +215 -0
- agno-2.4.3/agno/knowledge/reader/excel_reader.py +225 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/field_labeled_csv_reader.py +13 -179
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/reader_factory.py +22 -5
- agno-2.4.3/agno/knowledge/reader/utils/__init__.py +17 -0
- agno-2.4.3/agno/knowledge/reader/utils/spreadsheet.py +114 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openrouter/responses.py +2 -2
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/knowledge/knowledge.py +5 -3
- {agno-2.4.2 → agno-2.4.3}/agno/run/base.py +4 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/string.py +2 -1
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/workflow.py +8 -6
- {agno-2.4.2 → agno-2.4.3}/agno.egg-info/PKG-INFO +6 -4
- {agno-2.4.2 → agno-2.4.3}/agno.egg-info/SOURCES.txt +3 -0
- {agno-2.4.2 → agno-2.4.3}/agno.egg-info/requires.txt +5 -2
- {agno-2.4.2 → agno-2.4.3}/pyproject.toml +5 -2
- agno-2.4.2/agno/knowledge/reader/csv_reader.py +0 -383
- {agno-2.4.2 → agno-2.4.3}/LICENSE +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/agent/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/agent/remote.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/api.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/evals.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/os.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/routes.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/evals.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/os.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/response.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/schemas/workflows.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/settings.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/api/workflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/a2a/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/a2a/client.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/a2a/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/a2a/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/client/os.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/cloud/aws/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/compression/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/compression/manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/culture/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/culture/manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/dynamo/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/firestore/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/firestore/firestore.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/firestore/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/firestore/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/in_memory/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/json/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/json/json_db.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/json/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/versions/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/migrations/versions/v2_3_0.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mongo/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mongo/async_mongo.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mongo/mongo.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mongo/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mongo/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mysql/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mysql/async_mysql.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mysql/mysql.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mysql/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/mysql/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/postgres/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/postgres/async_postgres.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/postgres/postgres.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/postgres/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/postgres/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/redis/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/redis/redis.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/redis/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/redis/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/culture.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/evals.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/memory.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/schemas/metrics.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/singlestore/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/sqlite/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/models.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/db/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/debug.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/accuracy.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/agent_as_judge.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/performance.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/reliability.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/eval/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/exceptions.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/filters.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/guardrails/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/guardrails/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/guardrails/openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/guardrails/pii.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/hooks/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/hooks/decorator.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/integrations/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/integrations/discord/client.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/code.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/content.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/document/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/vllm.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/filesystem.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/protocol.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/pptx_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/remote_content/config.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/types.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/knowledge/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/config.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/curate.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/machine.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/decision_log.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/entity_memory.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/learned_knowledge.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/protocol.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/session_context.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/user_memory.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/stores/user_profile.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/learn/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/media.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/strategies/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/strategies/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/strategies/summarize.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/memory/strategies/types.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/anthropic/claude.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/aws/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/aws/bedrock.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/aws/claude.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/azure/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cohere/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cohere/chat.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/defaults.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/google/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/google/gemini.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/google/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/groq/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/groq/groq.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/ibm/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/internlm/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/internlm/internlm.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/langdb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/langdb/langdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/litellm/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/litellm/chat.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/message.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/meta/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/meta/llama.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/metrics.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/mistral/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/mistral/mistral.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/n1n/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/n1n/n1n.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nebius/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nebius/nebius.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nexus/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nexus/nexus.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/ollama/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/ollama/chat.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/ollama/responses.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openai/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openai/chat.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openai/like.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openai/open_responses.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openai/responses.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/portkey/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/portkey/portkey.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/requesty/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/requesty/requesty.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/response.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/together/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/together/together.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vercel/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vercel/v0.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vertexai/claude.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vllm/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/vllm/vllm.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/xai/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/models/xai/xai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/app.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/auth.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/config.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/managers.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/mcp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/middleware/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/middleware/jwt.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/middleware/trailing_slash.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/agents/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/agents/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/agents/schema.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/components/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/components/components.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/database.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/health.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/home.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/registry/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/registry/registry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/session/session.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/teams/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/teams/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/teams/schema.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/traces/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/traces/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/traces/traces.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/workflows/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/workflows/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/routers/workflows/schema.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/schema.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/scopes.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/settings.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/os/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/py.typed +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/anthropic.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/deepseek.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/default.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/gemini.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/groq.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/helpers.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/ollama.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/step.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/reasoning/vertexai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/registry/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/registry/registry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/remote/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/remote/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/cancel.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/cancellation_management/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/cancellation_management/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/cancellation_management/in_memory_cancellation_manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/cancellation_management/redis_cancellation_manager.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/messages.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/requirement.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/run/workflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/session/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/session/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/session/summary.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/session/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/session/workflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/agent_skills.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/errors.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/loaders/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/loaders/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/loaders/local.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/skill.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/skills/validator.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/table.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/team/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/team/remote.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/team/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/agentql.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/airflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/api.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/apify.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/arxiv.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/aws_lambda.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/aws_ses.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/baidusearch.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/bitbucket.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/brandfetch.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/bravesearch.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/brightdata.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/browserbase.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/calcom.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/calculator.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/cartesia.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/clickup.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/confluence.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/crawl4ai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/dalle.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/daytona.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/decorator.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/desi_vocal.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/discord.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/docker.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/duckdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/duckduckgo.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/e2b.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/eleven_labs.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/email.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/evm.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/exa.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/fal.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/file.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/file_generation.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/financial_datasets.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/firecrawl.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/function.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/giphy.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/github.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/gmail.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/google_bigquery.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/google_drive.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/google_maps.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/googlecalendar.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/googlesheets.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/hackernews.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/jina.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/jira.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/knowledge.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/linear.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/linkup.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/local_file_system.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/lumalab.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mcp/params.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mem0.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/memory.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/gemini.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/groq.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/morph.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models/nebius.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/models_labs.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/moviepy_video.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/nano_banana.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/neo4j.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/newspaper.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/newspaper4k.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/notion.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/openbb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/opencv.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/openweather.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/oxylabs.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/pandas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/parallel.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/postgres.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/pubmed.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/python.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/reasoning.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/reddit.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/redshift.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/replicate.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/resend.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/scrapegraph.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/searxng.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/serpapi.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/serper.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/shell.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/shopify.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/slack.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/sleep.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/spider.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/spotify.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/sql.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/streamlit/components.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/tavily.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/telegram.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/todoist.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/tool_registry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/toolkit.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/trafilatura.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/trello.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/twilio.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/user_control_flow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/valyu.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/visualization.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/webbrowser.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/webex.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/websearch.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/website.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/webtools.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/whatsapp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/wikipedia.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/workflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/x.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/yfinance.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/youtube.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/zendesk.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/zep.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tools/zoom.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tracing/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tracing/exporter.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tracing/schemas.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/tracing/setup.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/audio.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/certs.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/code_execution.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/common.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/cryptography.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/dttm.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/enum.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/env.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/events.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/format_str.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/functions.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/gemini.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/hooks.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/http.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/json_schema.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/knowledge.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/location.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/log.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/mcp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/media.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/merge_dict.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/message.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/claude.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/cohere.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/llama.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/mistral.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/models/watsonx.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/openai.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/os.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/pickle.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/pprint.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/print_response/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/print_response/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/prompts.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/reasoning.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/remote.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/response.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/response_iterator.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/safe_formatter.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/serialize.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/shell.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/streamlit.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/team.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/timer.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/tokens.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/tools.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/web.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/whatsapp.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/utils/yaml_io.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/base.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/distance.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/redis/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/redis/redisdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/search.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/__init__.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/agent.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/condition.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/loop.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/parallel.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/remote.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/router.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/step.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/steps.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno/workflow/types.py +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.4.2 → agno-2.4.3}/agno.egg-info/top_level.txt +0 -0
- {agno-2.4.2 → agno-2.4.3}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agno
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: Agno: a lightweight library for building Multi-Agent Systems
|
|
5
5
|
Author-email: Ashpreet Bedi <ashpreet@agno.com>
|
|
6
6
|
Project-URL: homepage, https://agno.com
|
|
@@ -260,8 +260,9 @@ Provides-Extra: text
|
|
|
260
260
|
Requires-Dist: aiofiles; extra == "text"
|
|
261
261
|
Provides-Extra: csv
|
|
262
262
|
Requires-Dist: aiofiles; extra == "csv"
|
|
263
|
-
|
|
264
|
-
Requires-Dist:
|
|
263
|
+
Provides-Extra: excel
|
|
264
|
+
Requires-Dist: openpyxl; extra == "excel"
|
|
265
|
+
Requires-Dist: xlrd; extra == "excel"
|
|
265
266
|
Provides-Extra: markdown
|
|
266
267
|
Requires-Dist: unstructured; extra == "markdown"
|
|
267
268
|
Requires-Dist: markdown; extra == "markdown"
|
|
@@ -376,6 +377,7 @@ Requires-Dist: agno[docx]; extra == "knowledge"
|
|
|
376
377
|
Requires-Dist: agno[pptx]; extra == "knowledge"
|
|
377
378
|
Requires-Dist: agno[text]; extra == "knowledge"
|
|
378
379
|
Requires-Dist: agno[csv]; extra == "knowledge"
|
|
380
|
+
Requires-Dist: agno[excel]; extra == "knowledge"
|
|
379
381
|
Requires-Dist: agno[markdown]; extra == "knowledge"
|
|
380
382
|
Requires-Dist: agno[chonkie]; extra == "knowledge"
|
|
381
383
|
Provides-Extra: embedders
|
|
@@ -450,7 +452,7 @@ Dynamic: license-file
|
|
|
450
452
|
<span> • </span>
|
|
451
453
|
<a href="https://community.agno.com/">Community</a>
|
|
452
454
|
<span> • </span>
|
|
453
|
-
<a href="https://
|
|
455
|
+
<a href="https://www.agno.com/discord">Discord</a>
|
|
454
456
|
</div>
|
|
455
457
|
|
|
456
458
|
## What is Agno?
|
|
@@ -5181,6 +5181,8 @@ class Agent:
|
|
|
5181
5181
|
functions: Optional[Dict[str, Function]] = None,
|
|
5182
5182
|
stream_events: bool = False,
|
|
5183
5183
|
) -> Iterator[RunOutputEvent]:
|
|
5184
|
+
from agno.run.agent import CustomEvent
|
|
5185
|
+
|
|
5184
5186
|
self.model = cast(Model, self.model)
|
|
5185
5187
|
# Execute the tool
|
|
5186
5188
|
function_call = self.model.get_function_call_to_run_from_tool_execution(tool, functions)
|
|
@@ -5222,6 +5224,10 @@ class Agent:
|
|
|
5222
5224
|
events_to_skip=self.events_to_skip, # type: ignore
|
|
5223
5225
|
store_events=self.store_events,
|
|
5224
5226
|
)
|
|
5227
|
+
# Yield CustomEvent instances from sync tool generators
|
|
5228
|
+
elif isinstance(call_result, CustomEvent):
|
|
5229
|
+
if stream_events:
|
|
5230
|
+
yield call_result # type: ignore
|
|
5225
5231
|
|
|
5226
5232
|
if len(function_call_results) > 0:
|
|
5227
5233
|
run_messages.messages.extend(function_call_results)
|
|
@@ -5246,6 +5252,8 @@ class Agent:
|
|
|
5246
5252
|
functions: Optional[Dict[str, Function]] = None,
|
|
5247
5253
|
stream_events: bool = False,
|
|
5248
5254
|
) -> AsyncIterator[RunOutputEvent]:
|
|
5255
|
+
from agno.run.agent import CustomEvent
|
|
5256
|
+
|
|
5249
5257
|
self.model = cast(Model, self.model)
|
|
5250
5258
|
|
|
5251
5259
|
# Execute the tool
|
|
@@ -5288,6 +5296,11 @@ class Agent:
|
|
|
5288
5296
|
events_to_skip=self.events_to_skip, # type: ignore
|
|
5289
5297
|
store_events=self.store_events,
|
|
5290
5298
|
)
|
|
5299
|
+
# Yield CustomEvent instances from async tool generators
|
|
5300
|
+
elif isinstance(call_result, CustomEvent):
|
|
5301
|
+
if stream_events:
|
|
5302
|
+
yield call_result # type: ignore
|
|
5303
|
+
|
|
5291
5304
|
if len(function_call_results) > 0:
|
|
5292
5305
|
run_messages.messages.extend(function_call_results)
|
|
5293
5306
|
|
|
@@ -71,7 +71,8 @@ class OpenAIEmbedder(Embedder):
|
|
|
71
71
|
}
|
|
72
72
|
if self.user is not None:
|
|
73
73
|
_request_params["user"] = self.user
|
|
74
|
-
|
|
74
|
+
# Pass dimensions for text-embedding-3 models or when using custom base_url (third-party APIs)
|
|
75
|
+
if self.id.startswith("text-embedding-3") or self.base_url is not None:
|
|
75
76
|
_request_params["dimensions"] = self.dimensions
|
|
76
77
|
if self.request_params:
|
|
77
78
|
_request_params.update(self.request_params)
|
|
@@ -106,7 +107,8 @@ class OpenAIEmbedder(Embedder):
|
|
|
106
107
|
}
|
|
107
108
|
if self.user is not None:
|
|
108
109
|
req["user"] = self.user
|
|
109
|
-
|
|
110
|
+
# Pass dimensions for text-embedding-3 models or when using custom base_url (third-party APIs)
|
|
111
|
+
if self.id.startswith("text-embedding-3") or self.base_url is not None:
|
|
110
112
|
req["dimensions"] = self.dimensions
|
|
111
113
|
if self.request_params:
|
|
112
114
|
req.update(self.request_params)
|
|
@@ -126,7 +128,8 @@ class OpenAIEmbedder(Embedder):
|
|
|
126
128
|
}
|
|
127
129
|
if self.user is not None:
|
|
128
130
|
req["user"] = self.user
|
|
129
|
-
|
|
131
|
+
# Pass dimensions for text-embedding-3 models or when using custom base_url (third-party APIs)
|
|
132
|
+
if self.id.startswith("text-embedding-3") or self.base_url is not None:
|
|
130
133
|
req["dimensions"] = self.dimensions
|
|
131
134
|
if self.request_params:
|
|
132
135
|
req.update(self.request_params)
|
|
@@ -166,7 +169,8 @@ class OpenAIEmbedder(Embedder):
|
|
|
166
169
|
}
|
|
167
170
|
if self.user is not None:
|
|
168
171
|
req["user"] = self.user
|
|
169
|
-
|
|
172
|
+
# Pass dimensions for text-embedding-3 models or when using custom base_url (third-party APIs)
|
|
173
|
+
if self.id.startswith("text-embedding-3") or self.base_url is not None:
|
|
170
174
|
req["dimensions"] = self.dimensions
|
|
171
175
|
if self.request_params:
|
|
172
176
|
req.update(self.request_params)
|
|
@@ -983,6 +983,11 @@ class Knowledge:
|
|
|
983
983
|
"""CSV reader - lazy loaded via factory."""
|
|
984
984
|
return self._get_reader("csv")
|
|
985
985
|
|
|
986
|
+
@property
|
|
987
|
+
def excel_reader(self) -> Optional[Reader]:
|
|
988
|
+
"""Excel reader - lazy loaded via factory."""
|
|
989
|
+
return self._get_reader("excel")
|
|
990
|
+
|
|
986
991
|
@property
|
|
987
992
|
def docx_reader(self) -> Optional[Reader]:
|
|
988
993
|
"""Docx reader - lazy loaded via factory."""
|
|
@@ -1123,6 +1128,8 @@ class Knowledge:
|
|
|
1123
1128
|
return self.json_reader, ""
|
|
1124
1129
|
elif file_extension == ".markdown":
|
|
1125
1130
|
return self.markdown_reader, ""
|
|
1131
|
+
elif file_extension in [".xlsx", ".xls"]:
|
|
1132
|
+
return self.excel_reader, ""
|
|
1126
1133
|
else:
|
|
1127
1134
|
return self.text_reader, ""
|
|
1128
1135
|
|
|
@@ -1153,6 +1160,8 @@ class Knowledge:
|
|
|
1153
1160
|
return self.json_reader
|
|
1154
1161
|
elif uri_lower.endswith(".markdown"):
|
|
1155
1162
|
return self.markdown_reader
|
|
1163
|
+
elif uri_lower.endswith(".xlsx") or uri_lower.endswith(".xls"):
|
|
1164
|
+
return self.excel_reader
|
|
1156
1165
|
else:
|
|
1157
1166
|
return self.text_reader
|
|
1158
1167
|
|
|
@@ -1284,6 +1293,10 @@ class Knowledge:
|
|
|
1284
1293
|
if self._should_include_file(str(path), include, exclude):
|
|
1285
1294
|
log_debug(f"Adding file {path} due to include/exclude filters")
|
|
1286
1295
|
|
|
1296
|
+
# Set name from path if not provided
|
|
1297
|
+
if not content.name:
|
|
1298
|
+
content.name = path.name
|
|
1299
|
+
|
|
1287
1300
|
await self._ainsert_contents_db(content)
|
|
1288
1301
|
if self._should_skip(content.content_hash, skip_if_exists): # type: ignore[arg-type]
|
|
1289
1302
|
content.status = ContentStatus.COMPLETED
|
|
@@ -1365,6 +1378,10 @@ class Knowledge:
|
|
|
1365
1378
|
if self._should_include_file(str(path), include, exclude):
|
|
1366
1379
|
log_debug(f"Adding file {path} due to include/exclude filters")
|
|
1367
1380
|
|
|
1381
|
+
# Set name from path if not provided
|
|
1382
|
+
if not content.name:
|
|
1383
|
+
content.name = path.name
|
|
1384
|
+
|
|
1368
1385
|
self._insert_contents_db(content)
|
|
1369
1386
|
if self._should_skip(content.content_hash, skip_if_exists): # type: ignore[arg-type]
|
|
1370
1387
|
content.status = ContentStatus.COMPLETED
|
|
@@ -1450,6 +1467,14 @@ class Knowledge:
|
|
|
1450
1467
|
if not content.url:
|
|
1451
1468
|
raise ValueError("No url provided")
|
|
1452
1469
|
|
|
1470
|
+
# Set name from URL if not provided
|
|
1471
|
+
if not content.name and content.url:
|
|
1472
|
+
from urllib.parse import urlparse
|
|
1473
|
+
|
|
1474
|
+
parsed = urlparse(content.url)
|
|
1475
|
+
url_path = Path(parsed.path)
|
|
1476
|
+
content.name = url_path.name if url_path.name else content.url
|
|
1477
|
+
|
|
1453
1478
|
# 1. Add content to contents database
|
|
1454
1479
|
await self._ainsert_contents_db(content)
|
|
1455
1480
|
if self._should_skip(content.content_hash, skip_if_exists): # type: ignore[arg-type]
|
|
@@ -1547,6 +1572,14 @@ class Knowledge:
|
|
|
1547
1572
|
if not content.url:
|
|
1548
1573
|
raise ValueError("No url provided")
|
|
1549
1574
|
|
|
1575
|
+
# Set name from URL if not provided
|
|
1576
|
+
if not content.name and content.url:
|
|
1577
|
+
from urllib.parse import urlparse
|
|
1578
|
+
|
|
1579
|
+
parsed = urlparse(content.url)
|
|
1580
|
+
url_path = Path(parsed.path)
|
|
1581
|
+
content.name = url_path.name if url_path.name else content.url
|
|
1582
|
+
|
|
1550
1583
|
# 1. Add content to contents database
|
|
1551
1584
|
self._insert_contents_db(content)
|
|
1552
1585
|
if self._should_skip(content.content_hash, skip_if_exists): # type: ignore[arg-type]
|
|
@@ -1633,6 +1666,8 @@ class Knowledge:
|
|
|
1633
1666
|
|
|
1634
1667
|
if content.name:
|
|
1635
1668
|
name = content.name
|
|
1669
|
+
elif content.file_data and content.file_data.filename:
|
|
1670
|
+
name = content.file_data.filename
|
|
1636
1671
|
elif content.file_data and content.file_data.content:
|
|
1637
1672
|
if isinstance(content.file_data.content, bytes):
|
|
1638
1673
|
name = content.file_data.content[:10].decode("utf-8", errors="ignore")
|
|
@@ -1696,9 +1731,17 @@ class Knowledge:
|
|
|
1696
1731
|
log_debug(f"Using reader: {content.reader.__class__.__name__} to read content")
|
|
1697
1732
|
reader = content.reader
|
|
1698
1733
|
else:
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1734
|
+
# Prefer filename extension over MIME type for reader selection
|
|
1735
|
+
# (browsers often send wrong MIME types for Excel files)
|
|
1736
|
+
reader_hint = content.file_data.type
|
|
1737
|
+
if content.file_data.filename:
|
|
1738
|
+
ext = Path(content.file_data.filename).suffix.lower()
|
|
1739
|
+
if ext:
|
|
1740
|
+
reader_hint = ext
|
|
1741
|
+
reader = self._select_reader(reader_hint)
|
|
1742
|
+
# Use file_data.filename for reader (preserves extension for format detection)
|
|
1743
|
+
reader_name = content.file_data.filename or content.name or f"content_{content.file_data.type}"
|
|
1744
|
+
read_documents = await reader.async_read(content_io, name=reader_name)
|
|
1702
1745
|
if not content.id:
|
|
1703
1746
|
content.id = generate_id(content.content_hash or "")
|
|
1704
1747
|
self._prepare_documents_for_insert(read_documents, content.id, metadata=content.metadata)
|
|
@@ -1730,6 +1773,8 @@ class Knowledge:
|
|
|
1730
1773
|
|
|
1731
1774
|
if content.name:
|
|
1732
1775
|
name = content.name
|
|
1776
|
+
elif content.file_data and content.file_data.filename:
|
|
1777
|
+
name = content.file_data.filename
|
|
1733
1778
|
elif content.file_data and content.file_data.content:
|
|
1734
1779
|
if isinstance(content.file_data.content, bytes):
|
|
1735
1780
|
name = content.file_data.content[:10].decode("utf-8", errors="ignore")
|
|
@@ -1793,9 +1838,17 @@ class Knowledge:
|
|
|
1793
1838
|
log_debug(f"Using reader: {content.reader.__class__.__name__} to read content")
|
|
1794
1839
|
reader = content.reader
|
|
1795
1840
|
else:
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1841
|
+
# Prefer filename extension over MIME type for reader selection
|
|
1842
|
+
# (browsers often send wrong MIME types for Excel files)
|
|
1843
|
+
reader_hint = content.file_data.type
|
|
1844
|
+
if content.file_data.filename:
|
|
1845
|
+
ext = Path(content.file_data.filename).suffix.lower()
|
|
1846
|
+
if ext:
|
|
1847
|
+
reader_hint = ext
|
|
1848
|
+
reader = self._select_reader(reader_hint)
|
|
1849
|
+
# Use file_data.filename for reader (preserves extension for format detection)
|
|
1850
|
+
reader_name = content.file_data.filename or content.name or f"content_{content.file_data.type}"
|
|
1851
|
+
read_documents = reader.read(content_io, name=reader_name)
|
|
1799
1852
|
if not content.id:
|
|
1800
1853
|
content.id = generate_id(content.content_hash or "")
|
|
1801
1854
|
self._prepare_documents_for_insert(read_documents, content.id, metadata=content.metadata)
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import csv
|
|
3
|
+
import io
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import IO, Any, List, Optional, Union
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
import aiofiles
|
|
10
|
+
except ImportError:
|
|
11
|
+
raise ImportError("`aiofiles` not installed. Please install it with `pip install aiofiles`")
|
|
12
|
+
|
|
13
|
+
from agno.knowledge.chunking.row import RowChunking
|
|
14
|
+
from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
|
|
15
|
+
from agno.knowledge.document.base import Document
|
|
16
|
+
from agno.knowledge.reader.base import Reader
|
|
17
|
+
from agno.knowledge.reader.utils import stringify_cell_value
|
|
18
|
+
from agno.knowledge.types import ContentType
|
|
19
|
+
from agno.utils.log import log_debug, log_error
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class CSVReader(Reader):
|
|
23
|
+
"""Reader for CSV files.
|
|
24
|
+
|
|
25
|
+
Converts CSV files to documents with optional chunking support.
|
|
26
|
+
For Excel files (.xlsx, .xls), use ExcelReader instead.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
chunking_strategy: Strategy for chunking documents. Default is RowChunking.
|
|
30
|
+
**kwargs: Additional arguments passed to base Reader.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
```python
|
|
34
|
+
from agno.knowledge.reader.csv_reader import CSVReader
|
|
35
|
+
|
|
36
|
+
reader = CSVReader()
|
|
37
|
+
docs = reader.read("data.csv")
|
|
38
|
+
|
|
39
|
+
# Custom delimiter
|
|
40
|
+
docs = reader.read("data.tsv", delimiter="\\t")
|
|
41
|
+
```
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = RowChunking(), **kwargs):
|
|
45
|
+
super().__init__(chunking_strategy=chunking_strategy, **kwargs)
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def get_supported_chunking_strategies(cls) -> List[ChunkingStrategyType]:
|
|
49
|
+
"""Get the list of supported chunking strategies for CSV readers."""
|
|
50
|
+
return [
|
|
51
|
+
ChunkingStrategyType.ROW_CHUNKER,
|
|
52
|
+
ChunkingStrategyType.CODE_CHUNKER,
|
|
53
|
+
ChunkingStrategyType.FIXED_SIZE_CHUNKER,
|
|
54
|
+
ChunkingStrategyType.AGENTIC_CHUNKER,
|
|
55
|
+
ChunkingStrategyType.DOCUMENT_CHUNKER,
|
|
56
|
+
ChunkingStrategyType.RECURSIVE_CHUNKER,
|
|
57
|
+
]
|
|
58
|
+
|
|
59
|
+
@classmethod
|
|
60
|
+
def get_supported_content_types(cls) -> List[ContentType]:
|
|
61
|
+
"""Get the list of supported content types."""
|
|
62
|
+
return [ContentType.CSV]
|
|
63
|
+
|
|
64
|
+
def read(
|
|
65
|
+
self, file: Union[Path, IO[Any]], delimiter: str = ",", quotechar: str = '"', name: Optional[str] = None
|
|
66
|
+
) -> List[Document]:
|
|
67
|
+
"""Read a CSV file and return a list of documents.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
file: Path to CSV file or file-like object.
|
|
71
|
+
delimiter: CSV field delimiter. Default is comma.
|
|
72
|
+
quotechar: CSV quote character. Default is double quote.
|
|
73
|
+
name: Optional name override for the document.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
List of Document objects.
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
FileNotFoundError: If the file path doesn't exist.
|
|
80
|
+
"""
|
|
81
|
+
try:
|
|
82
|
+
if isinstance(file, Path):
|
|
83
|
+
if not file.exists():
|
|
84
|
+
raise FileNotFoundError(f"Could not find file: {file}")
|
|
85
|
+
log_debug(f"Reading: {file}")
|
|
86
|
+
csv_name = name or file.stem
|
|
87
|
+
file_content: Union[io.TextIOWrapper, io.StringIO] = file.open(
|
|
88
|
+
newline="", mode="r", encoding=self.encoding or "utf-8"
|
|
89
|
+
)
|
|
90
|
+
else:
|
|
91
|
+
log_debug(f"Reading retrieved file: {getattr(file, 'name', 'BytesIO')}")
|
|
92
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
93
|
+
file.seek(0)
|
|
94
|
+
file_content = io.StringIO(file.read().decode(self.encoding or "utf-8"))
|
|
95
|
+
|
|
96
|
+
csv_lines: List[str] = []
|
|
97
|
+
with file_content as csvfile:
|
|
98
|
+
csv_reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
|
|
99
|
+
for row in csv_reader:
|
|
100
|
+
# Normalize line endings in CSV cells to preserve row integrity
|
|
101
|
+
csv_lines.append(", ".join(stringify_cell_value(cell) for cell in row))
|
|
102
|
+
|
|
103
|
+
documents = [
|
|
104
|
+
Document(
|
|
105
|
+
name=csv_name,
|
|
106
|
+
id=str(uuid4()),
|
|
107
|
+
content="\n".join(csv_lines),
|
|
108
|
+
)
|
|
109
|
+
]
|
|
110
|
+
if self.chunk:
|
|
111
|
+
chunked_documents = []
|
|
112
|
+
for document in documents:
|
|
113
|
+
chunked_documents.extend(self.chunk_document(document))
|
|
114
|
+
return chunked_documents
|
|
115
|
+
return documents
|
|
116
|
+
except FileNotFoundError:
|
|
117
|
+
raise
|
|
118
|
+
except UnicodeDecodeError as e:
|
|
119
|
+
file_desc = getattr(file, "name", str(file)) if isinstance(file, IO) else file
|
|
120
|
+
log_error(f"Encoding error reading {file_desc}: {e}. Try specifying a different encoding.")
|
|
121
|
+
return []
|
|
122
|
+
except Exception as e:
|
|
123
|
+
file_desc = getattr(file, "name", str(file)) if isinstance(file, IO) else file
|
|
124
|
+
log_error(f"Error reading {file_desc}: {e}")
|
|
125
|
+
return []
|
|
126
|
+
|
|
127
|
+
async def async_read(
|
|
128
|
+
self,
|
|
129
|
+
file: Union[Path, IO[Any]],
|
|
130
|
+
delimiter: str = ",",
|
|
131
|
+
quotechar: str = '"',
|
|
132
|
+
page_size: int = 1000,
|
|
133
|
+
name: Optional[str] = None,
|
|
134
|
+
) -> List[Document]:
|
|
135
|
+
"""Read a CSV file asynchronously, processing batches of rows concurrently.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
file: Path to CSV file or file-like object.
|
|
139
|
+
delimiter: CSV field delimiter. Default is comma.
|
|
140
|
+
quotechar: CSV quote character. Default is double quote.
|
|
141
|
+
page_size: Number of rows per page for large files.
|
|
142
|
+
name: Optional name override for the document.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
List of Document objects.
|
|
146
|
+
|
|
147
|
+
Raises:
|
|
148
|
+
FileNotFoundError: If the file path doesn't exist.
|
|
149
|
+
"""
|
|
150
|
+
try:
|
|
151
|
+
if isinstance(file, Path):
|
|
152
|
+
if not file.exists():
|
|
153
|
+
raise FileNotFoundError(f"Could not find file: {file}")
|
|
154
|
+
log_debug(f"Reading async: {file}")
|
|
155
|
+
async with aiofiles.open(file, mode="r", encoding=self.encoding or "utf-8", newline="") as file_content:
|
|
156
|
+
content = await file_content.read()
|
|
157
|
+
file_content_io = io.StringIO(content)
|
|
158
|
+
csv_name = name or file.stem
|
|
159
|
+
else:
|
|
160
|
+
log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
|
|
161
|
+
file.seek(0)
|
|
162
|
+
file_content_io = io.StringIO(file.read().decode(self.encoding or "utf-8"))
|
|
163
|
+
csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
|
|
164
|
+
|
|
165
|
+
file_content_io.seek(0)
|
|
166
|
+
csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
|
|
167
|
+
rows = list(csv_reader)
|
|
168
|
+
total_rows = len(rows)
|
|
169
|
+
|
|
170
|
+
if total_rows <= 10:
|
|
171
|
+
# Small files: single document
|
|
172
|
+
csv_content = " ".join(", ".join(stringify_cell_value(cell) for cell in row) for row in rows)
|
|
173
|
+
documents = [
|
|
174
|
+
Document(
|
|
175
|
+
name=csv_name,
|
|
176
|
+
id=str(uuid4()),
|
|
177
|
+
content=csv_content,
|
|
178
|
+
)
|
|
179
|
+
]
|
|
180
|
+
else:
|
|
181
|
+
# Large files: paginate and process in parallel
|
|
182
|
+
pages = []
|
|
183
|
+
for i in range(0, total_rows, page_size):
|
|
184
|
+
pages.append(rows[i : i + page_size])
|
|
185
|
+
|
|
186
|
+
async def _process_page(page_number: int, page_rows: List[List[str]]) -> Document:
|
|
187
|
+
"""Process a page of rows into a document."""
|
|
188
|
+
start_row = (page_number - 1) * page_size + 1
|
|
189
|
+
page_content = " ".join(", ".join(stringify_cell_value(cell) for cell in row) for row in page_rows)
|
|
190
|
+
|
|
191
|
+
return Document(
|
|
192
|
+
name=csv_name,
|
|
193
|
+
id=str(uuid4()),
|
|
194
|
+
meta_data={"page": page_number, "start_row": start_row, "rows": len(page_rows)},
|
|
195
|
+
content=page_content,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
documents = await asyncio.gather(
|
|
199
|
+
*[_process_page(page_number, page) for page_number, page in enumerate(pages, start=1)]
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
if self.chunk:
|
|
203
|
+
documents = await self.chunk_documents_async(documents)
|
|
204
|
+
|
|
205
|
+
return documents
|
|
206
|
+
except FileNotFoundError:
|
|
207
|
+
raise
|
|
208
|
+
except UnicodeDecodeError as e:
|
|
209
|
+
file_desc = getattr(file, "name", str(file)) if isinstance(file, IO) else file
|
|
210
|
+
log_error(f"Encoding error reading {file_desc}: {e}. Try specifying a different encoding.")
|
|
211
|
+
return []
|
|
212
|
+
except Exception as e:
|
|
213
|
+
file_desc = getattr(file, "name", str(file)) if isinstance(file, IO) else file
|
|
214
|
+
log_error(f"Error reading {file_desc}: {e}")
|
|
215
|
+
return []
|