agno 2.3.11__tar.gz → 2.3.12__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.11 → agno-2.3.12}/PKG-INFO +4 -1
- {agno-2.3.11 → agno-2.3.12}/agno/compression/manager.py +87 -16
- {agno-2.3.11 → agno-2.3.12}/agno/db/mongo/async_mongo.py +1 -1
- {agno-2.3.11 → agno-2.3.12}/agno/db/mongo/mongo.py +1 -1
- {agno-2.3.11 → agno-2.3.12}/agno/exceptions.py +1 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/knowledge.py +83 -20
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/csv_reader.py +2 -2
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/text_reader.py +15 -3
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/wikipedia_reader.py +33 -1
- {agno-2.3.11 → agno-2.3.12}/agno/memory/strategies/base.py +3 -4
- {agno-2.3.11 → agno-2.3.12}/agno/models/anthropic/claude.py +44 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/aws/bedrock.py +60 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/base.py +124 -30
- {agno-2.3.11 → agno-2.3.12}/agno/models/google/gemini.py +141 -23
- {agno-2.3.11 → agno-2.3.12}/agno/models/litellm/chat.py +25 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openai/responses.py +44 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/knowledge/knowledge.py +0 -1
- {agno-2.3.11 → agno-2.3.12}/agno/run/agent.py +17 -0
- agno-2.3.12/agno/run/requirement.py +181 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/print_response/agent.py +4 -4
- {agno-2.3.11 → agno-2.3.12}/agno/utils/print_response/team.py +12 -12
- agno-2.3.12/agno/utils/tokens.py +657 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/chroma/chromadb.py +6 -2
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/lancedb/lance_db.py +3 -37
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/milvus/milvus.py +6 -32
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/mongodb/mongodb.py +0 -27
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/pgvector/pgvector.py +15 -5
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/pineconedb/pineconedb.py +0 -17
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/qdrant/qdrant.py +6 -29
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/redis/redisdb.py +0 -26
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/singlestore/singlestore.py +16 -8
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/surrealdb/surrealdb.py +0 -36
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/weaviate/weaviate.py +6 -2
- {agno-2.3.11 → agno-2.3.12}/agno.egg-info/PKG-INFO +4 -1
- {agno-2.3.11 → agno-2.3.12}/agno.egg-info/requires.txt +4 -0
- {agno-2.3.11 → agno-2.3.12}/pyproject.toml +5 -1
- agno-2.3.11/agno/run/requirement.py +0 -98
- agno-2.3.11/agno/utils/tokens.py +0 -41
- {agno-2.3.11 → agno-2.3.12}/LICENSE +0 -0
- {agno-2.3.11 → agno-2.3.12}/README.md +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/agent/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/agent/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/api.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/evals.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/os.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/routes.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/evals.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/os.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/response.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/schemas/workflows.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/settings.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/api/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/cloud/aws/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/compression/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/culture/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/culture/manager.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/dynamo/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/firestore/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/firestore/firestore.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/firestore/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/firestore/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/in_memory/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/json/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/json/json_db.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/json/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/migrations/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/migrations/manager.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/migrations/versions/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/migrations/versions/v2_3_0.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mongo/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mongo/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mongo/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mysql/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mysql/async_mysql.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mysql/mysql.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mysql/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/mysql/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/postgres/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/postgres/async_postgres.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/postgres/postgres.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/postgres/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/postgres/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/redis/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/redis/redis.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/redis/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/redis/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/culture.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/evals.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/memory.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/schemas/metrics.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/singlestore/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/sqlite/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/models.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/db/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/debug.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/accuracy.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/agent_as_judge.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/performance.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/reliability.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/eval/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/filters.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/guardrails/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/guardrails/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/guardrails/openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/guardrails/pii.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/hooks/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/hooks/decorator.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/integrations/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/integrations/discord/client.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/content.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/document/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/vllm.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/pptx_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/types.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/knowledge/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/media.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/memory/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/memory/manager.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/memory/strategies/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/memory/strategies/summarize.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/memory/strategies/types.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/aws/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/aws/claude.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/azure/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cohere/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cohere/chat.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/defaults.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/google/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/google/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/groq/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/groq/groq.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/ibm/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/internlm/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/internlm/internlm.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/langdb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/langdb/langdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/litellm/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/message.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/meta/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/meta/llama.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/metrics.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/mistral/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/mistral/mistral.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nebius/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nebius/nebius.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nexus/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nexus/nexus.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/ollama/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/ollama/chat.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openai/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openai/chat.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openai/like.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/portkey/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/portkey/portkey.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/requesty/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/requesty/requesty.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/response.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/together/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/together/together.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vercel/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vercel/v0.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vertexai/claude.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vllm/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/vllm/vllm.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/xai/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/models/xai/xai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/app.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/auth.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/config.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/mcp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/middleware/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/middleware/jwt.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/agents/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/agents/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/agents/schema.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/health.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/home.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/session/session.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/teams/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/teams/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/teams/schema.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/traces/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/traces/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/traces/traces.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/workflows/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/workflows/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/routers/workflows/schema.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/schema.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/settings.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/os/utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/py.typed +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/anthropic.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/deepseek.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/default.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/gemini.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/groq.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/helpers.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/ollama.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/step.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/reasoning/vertexai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/cancel.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/messages.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/run/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/session/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/session/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/session/summary.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/session/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/session/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/table.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/team/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/team/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/agentql.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/airflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/api.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/apify.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/arxiv.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/aws_lambda.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/aws_ses.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/baidusearch.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/bitbucket.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/brandfetch.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/bravesearch.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/brightdata.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/browserbase.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/calcom.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/calculator.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/cartesia.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/clickup.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/confluence.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/crawl4ai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/dalle.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/daytona.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/decorator.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/desi_vocal.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/discord.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/docker.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/duckdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/duckduckgo.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/e2b.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/eleven_labs.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/email.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/evm.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/exa.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/fal.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/file.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/file_generation.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/financial_datasets.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/firecrawl.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/function.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/giphy.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/github.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/gmail.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/google_bigquery.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/google_drive.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/google_maps.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/googlecalendar.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/googlesheets.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/hackernews.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/jina.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/jira.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/knowledge.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/linear.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/linkup.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/local_file_system.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/lumalab.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mcp/params.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mem0.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/memory.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/gemini.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/groq.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/morph.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models/nebius.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/models_labs.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/moviepy_video.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/nano_banana.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/neo4j.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/newspaper.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/newspaper4k.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/notion.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/openbb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/opencv.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/openweather.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/oxylabs.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/pandas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/parallel.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/postgres.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/pubmed.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/python.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/reasoning.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/reddit.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/redshift.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/replicate.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/resend.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/scrapegraph.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/searxng.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/serpapi.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/serper.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/shell.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/shopify.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/slack.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/sleep.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/spider.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/spotify.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/sql.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/streamlit/components.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/tavily.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/telegram.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/todoist.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/tool_registry.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/toolkit.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/trafilatura.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/trello.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/twilio.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/user_control_flow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/valyu.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/visualization.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/webbrowser.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/webex.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/website.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/webtools.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/whatsapp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/wikipedia.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/x.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/yfinance.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/youtube.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/zendesk.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/zep.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tools/zoom.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tracing/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tracing/exporter.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tracing/schemas.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/tracing/setup.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/audio.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/certs.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/code_execution.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/common.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/dttm.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/enum.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/env.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/events.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/format_str.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/functions.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/gemini.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/hooks.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/http.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/json_schema.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/knowledge.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/location.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/log.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/mcp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/media.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/merge_dict.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/message.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/claude.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/cohere.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/llama.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/mistral.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/models/watsonx.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/openai.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/pickle.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/pprint.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/prompts.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/reasoning.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/response.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/response_iterator.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/safe_formatter.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/serialize.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/shell.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/streamlit.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/string.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/team.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/timer.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/tools.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/web.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/whatsapp.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/utils/yaml_io.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/base.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/distance.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/redis/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/search.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/__init__.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/agent.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/condition.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/loop.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/parallel.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/router.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/step.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/steps.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/types.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno/workflow/workflow.py +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno.egg-info/SOURCES.txt +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.3.11 → agno-2.3.12}/agno.egg-info/top_level.txt +0 -0
- {agno-2.3.11 → agno-2.3.12}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agno
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.12
|
|
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
|
|
@@ -102,6 +102,9 @@ Provides-Extra: openai
|
|
|
102
102
|
Requires-Dist: openai; extra == "openai"
|
|
103
103
|
Provides-Extra: portkey
|
|
104
104
|
Requires-Dist: portkey-ai; extra == "portkey"
|
|
105
|
+
Provides-Extra: tokenizers
|
|
106
|
+
Requires-Dist: tiktoken; extra == "tokenizers"
|
|
107
|
+
Requires-Dist: tokenizers; extra == "tokenizers"
|
|
105
108
|
Provides-Extra: agentql
|
|
106
109
|
Requires-Dist: agentql; extra == "agentql"
|
|
107
110
|
Provides-Extra: apify
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
from dataclasses import dataclass, field
|
|
3
3
|
from textwrap import dedent
|
|
4
|
-
from typing import Any, Dict, List, Optional
|
|
4
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
5
7
|
|
|
6
8
|
from agno.models.base import Model
|
|
7
9
|
from agno.models.message import Message
|
|
@@ -46,29 +48,56 @@ DEFAULT_COMPRESSION_PROMPT = dedent("""\
|
|
|
46
48
|
|
|
47
49
|
@dataclass
|
|
48
50
|
class CompressionManager:
|
|
49
|
-
model: Optional[Model] = None
|
|
51
|
+
model: Optional[Model] = None # model used for compression
|
|
50
52
|
compress_tool_results: bool = True
|
|
51
|
-
compress_tool_results_limit: int =
|
|
53
|
+
compress_tool_results_limit: Optional[int] = None
|
|
54
|
+
compress_token_limit: Optional[int] = None
|
|
52
55
|
compress_tool_call_instructions: Optional[str] = None
|
|
53
56
|
|
|
54
57
|
stats: Dict[str, Any] = field(default_factory=dict)
|
|
55
58
|
|
|
59
|
+
def __post_init__(self):
|
|
60
|
+
if self.compress_tool_results_limit is None and self.compress_token_limit is None:
|
|
61
|
+
self.compress_tool_results_limit = 3
|
|
62
|
+
|
|
56
63
|
def _is_tool_result_message(self, msg: Message) -> bool:
|
|
57
64
|
return msg.role == "tool"
|
|
58
65
|
|
|
59
|
-
def should_compress(
|
|
66
|
+
def should_compress(
|
|
67
|
+
self,
|
|
68
|
+
messages: List[Message],
|
|
69
|
+
tools: Optional[List] = None,
|
|
70
|
+
model: Optional[Model] = None,
|
|
71
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
72
|
+
) -> bool:
|
|
73
|
+
"""Check if tool results should be compressed.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
messages: List of messages to check.
|
|
77
|
+
tools: List of tools for token counting.
|
|
78
|
+
model: The Agent / Team model.
|
|
79
|
+
response_format: Output schema for accurate token counting.
|
|
80
|
+
"""
|
|
60
81
|
if not self.compress_tool_results:
|
|
61
82
|
return False
|
|
62
83
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
84
|
+
# Token-based threshold check
|
|
85
|
+
if self.compress_token_limit is not None and model is not None:
|
|
86
|
+
tokens = model.count_tokens(messages, tools, response_format)
|
|
87
|
+
if tokens >= self.compress_token_limit:
|
|
88
|
+
log_info(f"Token limit hit: {tokens} >= {self.compress_token_limit}")
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
# Count-based threshold check
|
|
92
|
+
if self.compress_tool_results_limit is not None:
|
|
93
|
+
uncompressed_tools_count = len(
|
|
94
|
+
[m for m in messages if self._is_tool_result_message(m) and m.compressed_content is None]
|
|
95
|
+
)
|
|
96
|
+
if uncompressed_tools_count >= self.compress_tool_results_limit:
|
|
97
|
+
log_info(f"Tool count limit hit: {uncompressed_tools_count} >= {self.compress_tool_results_limit}")
|
|
98
|
+
return True
|
|
70
99
|
|
|
71
|
-
return
|
|
100
|
+
return False
|
|
72
101
|
|
|
73
102
|
def _compress_tool_result(self, tool_result: Message) -> Optional[str]:
|
|
74
103
|
if not tool_result:
|
|
@@ -112,14 +141,53 @@ class CompressionManager:
|
|
|
112
141
|
compressed = self._compress_tool_result(tool_msg)
|
|
113
142
|
if compressed:
|
|
114
143
|
tool_msg.compressed_content = compressed
|
|
115
|
-
#
|
|
116
|
-
|
|
144
|
+
# Count actual tool results (Gemini combines multiple in one message)
|
|
145
|
+
tool_results_count = len(tool_msg.tool_calls) if tool_msg.tool_calls else 1
|
|
146
|
+
self.stats["tool_results_compressed"] = (
|
|
147
|
+
self.stats.get("tool_results_compressed", 0) + tool_results_count
|
|
148
|
+
)
|
|
117
149
|
self.stats["original_size"] = self.stats.get("original_size", 0) + original_len
|
|
118
150
|
self.stats["compressed_size"] = self.stats.get("compressed_size", 0) + len(compressed)
|
|
119
151
|
else:
|
|
120
152
|
log_warning(f"Compression failed for {tool_msg.tool_name}")
|
|
121
153
|
|
|
122
154
|
# * Async methods *#
|
|
155
|
+
async def ashould_compress(
|
|
156
|
+
self,
|
|
157
|
+
messages: List[Message],
|
|
158
|
+
tools: Optional[List] = None,
|
|
159
|
+
model: Optional[Model] = None,
|
|
160
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
161
|
+
) -> bool:
|
|
162
|
+
"""Async check if tool results should be compressed.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
messages: List of messages to check.
|
|
166
|
+
tools: List of tools for token counting.
|
|
167
|
+
model: The Agent / Team model.
|
|
168
|
+
response_format: Output schema for accurate token counting.
|
|
169
|
+
"""
|
|
170
|
+
if not self.compress_tool_results:
|
|
171
|
+
return False
|
|
172
|
+
|
|
173
|
+
# Token-based threshold check
|
|
174
|
+
if self.compress_token_limit is not None and model is not None:
|
|
175
|
+
tokens = await model.acount_tokens(messages, tools, response_format)
|
|
176
|
+
if tokens >= self.compress_token_limit:
|
|
177
|
+
log_info(f"Token limit hit: {tokens} >= {self.compress_token_limit}")
|
|
178
|
+
return True
|
|
179
|
+
|
|
180
|
+
# Count-based threshold check
|
|
181
|
+
if self.compress_tool_results_limit is not None:
|
|
182
|
+
uncompressed_tools_count = len(
|
|
183
|
+
[m for m in messages if self._is_tool_result_message(m) and m.compressed_content is None]
|
|
184
|
+
)
|
|
185
|
+
if uncompressed_tools_count >= self.compress_tool_results_limit:
|
|
186
|
+
log_info(f"Tool count limit hit: {uncompressed_tools_count} >= {self.compress_tool_results_limit}")
|
|
187
|
+
return True
|
|
188
|
+
|
|
189
|
+
return False
|
|
190
|
+
|
|
123
191
|
async def _acompress_tool_result(self, tool_result: Message) -> Optional[str]:
|
|
124
192
|
"""Async compress a single tool result"""
|
|
125
193
|
if not tool_result:
|
|
@@ -168,8 +236,11 @@ class CompressionManager:
|
|
|
168
236
|
for msg, compressed, original_len in zip(uncompressed_tools, results, original_sizes):
|
|
169
237
|
if compressed:
|
|
170
238
|
msg.compressed_content = compressed
|
|
171
|
-
#
|
|
172
|
-
|
|
239
|
+
# Count actual tool results (Gemini combines multiple in one message)
|
|
240
|
+
tool_results_count = len(msg.tool_calls) if msg.tool_calls else 1
|
|
241
|
+
self.stats["tool_results_compressed"] = (
|
|
242
|
+
self.stats.get("tool_results_compressed", 0) + tool_results_count
|
|
243
|
+
)
|
|
173
244
|
self.stats["original_size"] = self.stats.get("original_size", 0) + original_len
|
|
174
245
|
self.stats["compressed_size"] = self.stats.get("compressed_size", 0) + len(compressed)
|
|
175
246
|
else:
|
|
@@ -175,5 +175,6 @@ class OutputCheckError(Exception):
|
|
|
175
175
|
|
|
176
176
|
@dataclass
|
|
177
177
|
class RetryableModelProviderError(Exception):
|
|
178
|
+
original_error: Optional[str] = None
|
|
178
179
|
# Guidance message to retry a model invocation after an error
|
|
179
180
|
retry_guidance_message: Optional[str] = None
|
|
@@ -548,7 +548,7 @@ class Knowledge:
|
|
|
548
548
|
else:
|
|
549
549
|
return self.text_reader
|
|
550
550
|
|
|
551
|
-
def
|
|
551
|
+
def _read(
|
|
552
552
|
self,
|
|
553
553
|
reader: Reader,
|
|
554
554
|
source: Union[Path, str, BytesIO],
|
|
@@ -581,6 +581,36 @@ class Knowledge:
|
|
|
581
581
|
else:
|
|
582
582
|
return reader.read(source, name=name)
|
|
583
583
|
|
|
584
|
+
async def _read_async(
|
|
585
|
+
self,
|
|
586
|
+
reader: Reader,
|
|
587
|
+
source: Union[Path, str, BytesIO],
|
|
588
|
+
name: Optional[str] = None,
|
|
589
|
+
password: Optional[str] = None,
|
|
590
|
+
) -> List[Document]:
|
|
591
|
+
"""
|
|
592
|
+
Read content using a reader's async_read method with optional password handling.
|
|
593
|
+
|
|
594
|
+
Args:
|
|
595
|
+
reader: Reader to use
|
|
596
|
+
source: Source to read from (Path, URL string, or BytesIO)
|
|
597
|
+
name: Optional name for the document
|
|
598
|
+
password: Optional password for protected files
|
|
599
|
+
|
|
600
|
+
Returns:
|
|
601
|
+
List of documents read
|
|
602
|
+
"""
|
|
603
|
+
import inspect
|
|
604
|
+
|
|
605
|
+
read_signature = inspect.signature(reader.async_read)
|
|
606
|
+
if password and "password" in read_signature.parameters:
|
|
607
|
+
return await reader.async_read(source, name=name, password=password)
|
|
608
|
+
else:
|
|
609
|
+
if isinstance(source, BytesIO):
|
|
610
|
+
return await reader.async_read(source, name=name)
|
|
611
|
+
else:
|
|
612
|
+
return await reader.async_read(source, name=name)
|
|
613
|
+
|
|
584
614
|
def _prepare_documents_for_insert(
|
|
585
615
|
self,
|
|
586
616
|
documents: List[Document],
|
|
@@ -665,7 +695,7 @@ class Knowledge:
|
|
|
665
695
|
|
|
666
696
|
if reader:
|
|
667
697
|
password = content.auth.password if content.auth and content.auth.password else None
|
|
668
|
-
read_documents = self.
|
|
698
|
+
read_documents = await self._read_async(
|
|
669
699
|
reader, path, name=content.name or path.name, password=password
|
|
670
700
|
)
|
|
671
701
|
else:
|
|
@@ -855,7 +885,6 @@ class Knowledge:
|
|
|
855
885
|
content.status_message = f"Invalid URL: {content.url} - {str(e)}"
|
|
856
886
|
await self._aupdate_content(content)
|
|
857
887
|
log_warning(f"Invalid URL: {content.url} - {str(e)}")
|
|
858
|
-
|
|
859
888
|
# 3. Fetch and load content if file has an extension
|
|
860
889
|
url_path = Path(parsed_url.path)
|
|
861
890
|
file_extension = url_path.suffix.lower()
|
|
@@ -874,18 +903,17 @@ class Knowledge:
|
|
|
874
903
|
name = basename(parsed_url.path) or default_name
|
|
875
904
|
else:
|
|
876
905
|
reader = content.reader or self.website_reader
|
|
877
|
-
|
|
878
906
|
# 5. Read content
|
|
879
907
|
try:
|
|
880
908
|
read_documents = []
|
|
881
909
|
if reader is not None:
|
|
882
910
|
# Special handling for YouTubeReader
|
|
883
911
|
if reader.__class__.__name__ == "YouTubeReader":
|
|
884
|
-
read_documents = reader.
|
|
912
|
+
read_documents = await reader.async_read(content.url, name=name)
|
|
885
913
|
else:
|
|
886
914
|
password = content.auth.password if content.auth and content.auth.password else None
|
|
887
915
|
source = bytes_content if bytes_content else content.url
|
|
888
|
-
read_documents = self.
|
|
916
|
+
read_documents = await self._read_async(reader, source, name=name, password=password)
|
|
889
917
|
|
|
890
918
|
except Exception as e:
|
|
891
919
|
log_error(f"Error reading URL: {content.url} - {str(e)}")
|
|
@@ -983,7 +1011,7 @@ class Knowledge:
|
|
|
983
1011
|
else:
|
|
984
1012
|
password = content.auth.password if content.auth and content.auth.password else None
|
|
985
1013
|
source = bytes_content if bytes_content else content.url
|
|
986
|
-
read_documents = self.
|
|
1014
|
+
read_documents = self._read(reader, source, name=name, password=password)
|
|
987
1015
|
|
|
988
1016
|
except Exception as e:
|
|
989
1017
|
log_error(f"Error reading URL: {content.url} - {str(e)}")
|
|
@@ -1051,11 +1079,11 @@ class Knowledge:
|
|
|
1051
1079
|
|
|
1052
1080
|
if content.reader:
|
|
1053
1081
|
log_debug(f"Using reader: {content.reader.__class__.__name__} to read content")
|
|
1054
|
-
read_documents = content.reader.
|
|
1082
|
+
read_documents = await content.reader.async_read(content_io, name=name)
|
|
1055
1083
|
else:
|
|
1056
1084
|
text_reader = self.text_reader
|
|
1057
1085
|
if text_reader:
|
|
1058
|
-
read_documents = text_reader.
|
|
1086
|
+
read_documents = await text_reader.async_read(content_io, name=name)
|
|
1059
1087
|
else:
|
|
1060
1088
|
content.status = ContentStatus.FAILED
|
|
1061
1089
|
content.status_message = "Text reader not available"
|
|
@@ -1079,7 +1107,7 @@ class Knowledge:
|
|
|
1079
1107
|
else:
|
|
1080
1108
|
reader = self._select_reader(content.file_data.type)
|
|
1081
1109
|
name = content.name if content.name else f"content_{content.file_data.type}"
|
|
1082
|
-
read_documents = reader.
|
|
1110
|
+
read_documents = await reader.async_read(content_io, name=name)
|
|
1083
1111
|
if not content.id:
|
|
1084
1112
|
content.id = generate_id(content.content_hash or "")
|
|
1085
1113
|
self._prepare_documents_for_insert(read_documents, content.id, metadata=content.metadata)
|
|
@@ -1246,7 +1274,7 @@ class Knowledge:
|
|
|
1246
1274
|
await self._aupdate_content(content)
|
|
1247
1275
|
continue
|
|
1248
1276
|
|
|
1249
|
-
read_documents = content.reader.
|
|
1277
|
+
read_documents = await content.reader.async_read(topic)
|
|
1250
1278
|
if len(read_documents) > 0:
|
|
1251
1279
|
self._prepare_documents_for_insert(read_documents, content.id, calculate_sizes=True)
|
|
1252
1280
|
else:
|
|
@@ -1405,7 +1433,7 @@ class Knowledge:
|
|
|
1405
1433
|
s3_object.download(readable_content) # type: ignore
|
|
1406
1434
|
|
|
1407
1435
|
# 6. Read the content
|
|
1408
|
-
read_documents = reader.
|
|
1436
|
+
read_documents = await reader.async_read(readable_content, name=obj_name)
|
|
1409
1437
|
|
|
1410
1438
|
# 7. Prepare and insert the content in the vector database
|
|
1411
1439
|
if not content.id:
|
|
@@ -1467,7 +1495,7 @@ class Knowledge:
|
|
|
1467
1495
|
readable_content = BytesIO(gcs_object.download_as_bytes())
|
|
1468
1496
|
|
|
1469
1497
|
# 6. Read the content
|
|
1470
|
-
read_documents = reader.
|
|
1498
|
+
read_documents = await reader.async_read(readable_content, name=name)
|
|
1471
1499
|
|
|
1472
1500
|
# 7. Prepare and insert the content in the vector database
|
|
1473
1501
|
if not content.id:
|
|
@@ -1762,19 +1790,51 @@ class Knowledge:
|
|
|
1762
1790
|
def _build_content_hash(self, content: Content) -> str:
|
|
1763
1791
|
"""
|
|
1764
1792
|
Build the content hash from the content.
|
|
1793
|
+
|
|
1794
|
+
For URLs and paths, includes the name and description in the hash if provided
|
|
1795
|
+
to ensure unique content with the same URL/path but different names/descriptions
|
|
1796
|
+
get different hashes.
|
|
1797
|
+
|
|
1798
|
+
Hash format:
|
|
1799
|
+
- URL with name and description: hash("{name}:{description}:{url}")
|
|
1800
|
+
- URL with name only: hash("{name}:{url}")
|
|
1801
|
+
- URL with description only: hash("{description}:{url}")
|
|
1802
|
+
- URL without name/description: hash("{url}") (backward compatible)
|
|
1803
|
+
- Same logic applies to paths
|
|
1765
1804
|
"""
|
|
1805
|
+
hash_parts = []
|
|
1806
|
+
if content.name:
|
|
1807
|
+
hash_parts.append(content.name)
|
|
1808
|
+
if content.description:
|
|
1809
|
+
hash_parts.append(content.description)
|
|
1810
|
+
|
|
1766
1811
|
if content.path:
|
|
1767
|
-
|
|
1812
|
+
hash_parts.append(str(content.path))
|
|
1768
1813
|
elif content.url:
|
|
1769
|
-
|
|
1770
|
-
return hash
|
|
1814
|
+
hash_parts.append(content.url)
|
|
1771
1815
|
elif content.file_data and content.file_data.content:
|
|
1772
|
-
|
|
1773
|
-
|
|
1816
|
+
# For file_data, always add filename, type, size, or content for uniqueness
|
|
1817
|
+
if content.file_data.filename:
|
|
1818
|
+
hash_parts.append(content.file_data.filename)
|
|
1819
|
+
elif content.file_data.type:
|
|
1820
|
+
hash_parts.append(content.file_data.type)
|
|
1821
|
+
elif content.file_data.size is not None:
|
|
1822
|
+
hash_parts.append(str(content.file_data.size))
|
|
1823
|
+
else:
|
|
1824
|
+
# Fallback: use the content for uniqueness
|
|
1825
|
+
# Include type information to distinguish str vs bytes
|
|
1826
|
+
content_type = "str" if isinstance(content.file_data.content, str) else "bytes"
|
|
1827
|
+
content_bytes = (
|
|
1828
|
+
content.file_data.content.encode()
|
|
1829
|
+
if isinstance(content.file_data.content, str)
|
|
1830
|
+
else content.file_data.content
|
|
1831
|
+
)
|
|
1832
|
+
content_hash = hashlib.sha256(content_bytes).hexdigest()[:16] # Use first 16 chars
|
|
1833
|
+
hash_parts.append(f"{content_type}:{content_hash}")
|
|
1774
1834
|
elif content.topics and len(content.topics) > 0:
|
|
1775
1835
|
topic = content.topics[0]
|
|
1776
1836
|
reader = type(content.reader).__name__ if content.reader else "unknown"
|
|
1777
|
-
|
|
1837
|
+
hash_parts.append(f"{topic}-{reader}")
|
|
1778
1838
|
else:
|
|
1779
1839
|
# Fallback for edge cases
|
|
1780
1840
|
import random
|
|
@@ -1785,7 +1845,10 @@ class Knowledge:
|
|
|
1785
1845
|
or content.id
|
|
1786
1846
|
or ("unknown_content" + "".join(random.choices(string.ascii_lowercase + string.digits, k=6)))
|
|
1787
1847
|
)
|
|
1788
|
-
|
|
1848
|
+
hash_parts.append(fallback)
|
|
1849
|
+
|
|
1850
|
+
hash_input = ":".join(hash_parts)
|
|
1851
|
+
return hashlib.sha256(hash_input.encode()).hexdigest()
|
|
1789
1852
|
|
|
1790
1853
|
def _ensure_string_field(self, value: Any, field_name: str, default: str = "") -> str:
|
|
1791
1854
|
"""
|
|
@@ -110,9 +110,9 @@ class CSVReader(Reader):
|
|
|
110
110
|
content = await file_content.read()
|
|
111
111
|
file_content_io = io.StringIO(content)
|
|
112
112
|
else:
|
|
113
|
-
log_debug(f"Reading retrieved file async: {file
|
|
113
|
+
log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
|
|
114
114
|
file.seek(0)
|
|
115
|
-
file_content_io = io.StringIO(file.read().decode("utf-8"))
|
|
115
|
+
file_content_io = io.StringIO(file.read().decode("utf-8"))
|
|
116
116
|
|
|
117
117
|
csv_name = name or (
|
|
118
118
|
Path(file.name).stem
|
|
@@ -41,7 +41,13 @@ class TextReader(Reader):
|
|
|
41
41
|
file_name = name or file.stem
|
|
42
42
|
file_contents = file.read_text(self.encoding or "utf-8")
|
|
43
43
|
else:
|
|
44
|
-
|
|
44
|
+
# Handle BytesIO and other file-like objects that may not have a name attribute
|
|
45
|
+
if name:
|
|
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"
|
|
45
51
|
log_debug(f"Reading uploaded file: {file_name}")
|
|
46
52
|
file.seek(0)
|
|
47
53
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
@@ -81,8 +87,14 @@ class TextReader(Reader):
|
|
|
81
87
|
log_warning("aiofiles not installed, using synchronous file I/O")
|
|
82
88
|
file_contents = file.read_text(self.encoding or "utf-8")
|
|
83
89
|
else:
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
# Handle BytesIO and other file-like objects that may not have a name attribute
|
|
91
|
+
if name:
|
|
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}")
|
|
86
98
|
file.seek(0)
|
|
87
99
|
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
88
100
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import asyncio
|
|
1
2
|
from typing import List, Optional
|
|
2
3
|
|
|
3
4
|
from agno.knowledge.chunking.fixed import FixedSizeChunking
|
|
@@ -45,7 +46,38 @@ class WikipediaReader(Reader):
|
|
|
45
46
|
|
|
46
47
|
except wikipedia.exceptions.PageError:
|
|
47
48
|
summary = None
|
|
48
|
-
log_info("
|
|
49
|
+
log_info("Wikipedia Error: Page not found.")
|
|
50
|
+
|
|
51
|
+
# Only create Document if we successfully got a summary
|
|
52
|
+
if summary:
|
|
53
|
+
return [
|
|
54
|
+
Document(
|
|
55
|
+
name=topic,
|
|
56
|
+
meta_data={"topic": topic},
|
|
57
|
+
content=summary,
|
|
58
|
+
)
|
|
59
|
+
]
|
|
60
|
+
return []
|
|
61
|
+
|
|
62
|
+
async def async_read(self, topic: str) -> List[Document]:
|
|
63
|
+
"""
|
|
64
|
+
Asynchronously read content from Wikipedia.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
topic: The Wikipedia topic to read
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
A list of documents containing the Wikipedia summary
|
|
71
|
+
"""
|
|
72
|
+
log_debug(f"Async reading Wikipedia topic: {topic}")
|
|
73
|
+
summary = None
|
|
74
|
+
try:
|
|
75
|
+
# Run the synchronous wikipedia API call in a thread pool
|
|
76
|
+
summary = await asyncio.to_thread(wikipedia.summary, topic, auto_suggest=self.auto_suggest)
|
|
77
|
+
|
|
78
|
+
except wikipedia.exceptions.PageError:
|
|
79
|
+
summary = None
|
|
80
|
+
log_info("Wikipedia Error: Page not found.")
|
|
49
81
|
|
|
50
82
|
# Only create Document if we successfully got a summary
|
|
51
83
|
if summary:
|
|
@@ -3,7 +3,7 @@ from typing import List
|
|
|
3
3
|
|
|
4
4
|
from agno.db.schemas import UserMemory
|
|
5
5
|
from agno.models.base import Model
|
|
6
|
-
from agno.utils.tokens import
|
|
6
|
+
from agno.utils.tokens import count_text_tokens
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class MemoryOptimizationStrategy(ABC):
|
|
@@ -60,8 +60,7 @@ class MemoryOptimizationStrategy(ABC):
|
|
|
60
60
|
|
|
61
61
|
Args:
|
|
62
62
|
memories: List of UserMemory objects
|
|
63
|
-
|
|
64
63
|
Returns:
|
|
65
|
-
Total token count
|
|
64
|
+
Total token count
|
|
66
65
|
"""
|
|
67
|
-
return sum(count_text_tokens(
|
|
66
|
+
return sum(count_text_tokens(m.memory or "") for m in memories)
|
|
@@ -13,9 +13,11 @@ from agno.models.message import Citations, DocumentCitation, Message, UrlCitatio
|
|
|
13
13
|
from agno.models.metrics import Metrics
|
|
14
14
|
from agno.models.response import ModelResponse
|
|
15
15
|
from agno.run.agent import RunOutput
|
|
16
|
+
from agno.tools.function import Function
|
|
16
17
|
from agno.utils.http import get_default_async_client, get_default_sync_client
|
|
17
18
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
18
19
|
from agno.utils.models.claude import MCPServerConfiguration, format_messages, format_tools_for_model
|
|
20
|
+
from agno.utils.tokens import count_schema_tokens
|
|
19
21
|
|
|
20
22
|
try:
|
|
21
23
|
from anthropic import Anthropic as AnthropicClient
|
|
@@ -399,6 +401,48 @@ class Claude(Model):
|
|
|
399
401
|
self.async_client = AsyncAnthropicClient(**_client_params)
|
|
400
402
|
return self.async_client
|
|
401
403
|
|
|
404
|
+
def count_tokens(
|
|
405
|
+
self,
|
|
406
|
+
messages: List[Message],
|
|
407
|
+
tools: Optional[List[Union[Function, Dict[str, Any]]]] = None,
|
|
408
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
409
|
+
) -> int:
|
|
410
|
+
anthropic_messages, system_prompt = format_messages(messages, compress_tool_results=True)
|
|
411
|
+
anthropic_tools = None
|
|
412
|
+
if tools:
|
|
413
|
+
formatted_tools = self._format_tools(tools)
|
|
414
|
+
anthropic_tools = format_tools_for_model(formatted_tools)
|
|
415
|
+
|
|
416
|
+
kwargs: Dict[str, Any] = {"messages": anthropic_messages, "model": self.id}
|
|
417
|
+
if system_prompt:
|
|
418
|
+
kwargs["system"] = system_prompt
|
|
419
|
+
if anthropic_tools:
|
|
420
|
+
kwargs["tools"] = anthropic_tools
|
|
421
|
+
|
|
422
|
+
response = self.get_client().messages.count_tokens(**kwargs)
|
|
423
|
+
return response.input_tokens + count_schema_tokens(response_format, self.id)
|
|
424
|
+
|
|
425
|
+
async def acount_tokens(
|
|
426
|
+
self,
|
|
427
|
+
messages: List[Message],
|
|
428
|
+
tools: Optional[List[Union[Function, Dict[str, Any]]]] = None,
|
|
429
|
+
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
430
|
+
) -> int:
|
|
431
|
+
anthropic_messages, system_prompt = format_messages(messages, compress_tool_results=True)
|
|
432
|
+
anthropic_tools = None
|
|
433
|
+
if tools:
|
|
434
|
+
formatted_tools = self._format_tools(tools)
|
|
435
|
+
anthropic_tools = format_tools_for_model(formatted_tools)
|
|
436
|
+
|
|
437
|
+
kwargs: Dict[str, Any] = {"messages": anthropic_messages, "model": self.id}
|
|
438
|
+
if system_prompt:
|
|
439
|
+
kwargs["system"] = system_prompt
|
|
440
|
+
if anthropic_tools:
|
|
441
|
+
kwargs["tools"] = anthropic_tools
|
|
442
|
+
|
|
443
|
+
response = await self.get_async_client().messages.count_tokens(**kwargs)
|
|
444
|
+
return response.input_tokens + count_schema_tokens(response_format, self.id)
|
|
445
|
+
|
|
402
446
|
def get_request_params(
|
|
403
447
|
self,
|
|
404
448
|
response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
@@ -12,6 +12,7 @@ from agno.models.metrics import Metrics
|
|
|
12
12
|
from agno.models.response import ModelResponse
|
|
13
13
|
from agno.run.agent import RunOutput
|
|
14
14
|
from agno.utils.log import log_debug, log_error, log_warning
|
|
15
|
+
from agno.utils.tokens import count_schema_tokens
|
|
15
16
|
|
|
16
17
|
try:
|
|
17
18
|
from boto3 import client as AwsClient
|
|
@@ -357,6 +358,65 @@ class AwsBedrock(Model):
|
|
|
357
358
|
# TODO: Add caching: https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-call.html
|
|
358
359
|
return formatted_messages, system_message
|
|
359
360
|
|
|
361
|
+
def count_tokens(
|
|
362
|
+
self,
|
|
363
|
+
messages: List[Message],
|
|
364
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
365
|
+
output_schema: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
366
|
+
) -> int:
|
|
367
|
+
try:
|
|
368
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results=True)
|
|
369
|
+
converse_input: Dict[str, Any] = {"messages": formatted_messages}
|
|
370
|
+
if system_message:
|
|
371
|
+
converse_input["system"] = system_message
|
|
372
|
+
|
|
373
|
+
response = self.get_client().count_tokens(modelId=self.id, input={"converse": converse_input})
|
|
374
|
+
tokens = response.get("inputTokens", 0)
|
|
375
|
+
|
|
376
|
+
# Count tool tokens
|
|
377
|
+
if tools:
|
|
378
|
+
from agno.utils.tokens import count_tool_tokens
|
|
379
|
+
|
|
380
|
+
tokens += count_tool_tokens(tools, self.id)
|
|
381
|
+
|
|
382
|
+
# Count schema tokens
|
|
383
|
+
tokens += count_schema_tokens(output_schema, self.id)
|
|
384
|
+
|
|
385
|
+
return tokens
|
|
386
|
+
except Exception as e:
|
|
387
|
+
log_warning(f"Failed to count tokens via Bedrock API: {e}")
|
|
388
|
+
return super().count_tokens(messages, tools, output_schema)
|
|
389
|
+
|
|
390
|
+
async def acount_tokens(
|
|
391
|
+
self,
|
|
392
|
+
messages: List[Message],
|
|
393
|
+
tools: Optional[List[Dict[str, Any]]] = None,
|
|
394
|
+
output_schema: Optional[Union[Dict, Type[BaseModel]]] = None,
|
|
395
|
+
) -> int:
|
|
396
|
+
try:
|
|
397
|
+
formatted_messages, system_message = self._format_messages(messages, compress_tool_results=True)
|
|
398
|
+
converse_input: Dict[str, Any] = {"messages": formatted_messages}
|
|
399
|
+
if system_message:
|
|
400
|
+
converse_input["system"] = system_message
|
|
401
|
+
|
|
402
|
+
async with self.get_async_client() as client:
|
|
403
|
+
response = await client.count_tokens(modelId=self.id, input={"converse": converse_input})
|
|
404
|
+
tokens = response.get("inputTokens", 0)
|
|
405
|
+
|
|
406
|
+
# Count tool tokens
|
|
407
|
+
if tools:
|
|
408
|
+
from agno.utils.tokens import count_tool_tokens
|
|
409
|
+
|
|
410
|
+
tokens += count_tool_tokens(tools, self.id)
|
|
411
|
+
|
|
412
|
+
# Count schema tokens
|
|
413
|
+
tokens += count_schema_tokens(output_schema, self.id)
|
|
414
|
+
|
|
415
|
+
return tokens
|
|
416
|
+
except Exception as e:
|
|
417
|
+
log_warning(f"Failed to count tokens via Bedrock API: {e}")
|
|
418
|
+
return await super().acount_tokens(messages, tools, output_schema)
|
|
419
|
+
|
|
360
420
|
def invoke(
|
|
361
421
|
self,
|
|
362
422
|
messages: List[Message],
|