agno 2.2.3__tar.gz → 2.2.5__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.2.3 → agno-2.2.5}/PKG-INFO +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/agent/agent.py +26 -5
- {agno-2.2.3 → agno-2.2.5}/agno/db/dynamo/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/firestore/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/gcs_json/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/in_memory/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/json/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/mongo/async_mongo.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/mongo/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/mysql/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/postgres/async_postgres.py +8 -3
- {agno-2.2.3 → agno-2.2.5}/agno/db/postgres/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/redis/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/singlestore/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/db/sqlite/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/ollama.py +8 -0
- {agno-2.2.3 → agno-2.2.5}/agno/memory/manager.py +5 -5
- {agno-2.2.3 → agno-2.2.5}/agno/os/app.py +150 -60
- {agno-2.2.3 → agno-2.2.5}/agno/run/agent.py +27 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/team.py +27 -0
- {agno-2.2.3 → agno-2.2.5}/agno/session/agent.py +57 -17
- {agno-2.2.3 → agno-2.2.5}/agno/session/team.py +57 -18
- {agno-2.2.3 → agno-2.2.5}/agno/team/team.py +29 -9
- {agno-2.2.3 → agno-2.2.5}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.2.3 → agno-2.2.5}/pyproject.toml +1 -1
- {agno-2.2.3 → agno-2.2.5}/LICENSE +0 -0
- {agno-2.2.3 → agno-2.2.5}/README.md +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/agent/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/api.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/os.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/routes.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/os.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/response.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/team.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/schemas/workflows.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/settings.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/team.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/api/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/cloud/aws/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/culture/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/culture/manager.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/firestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/firestore/firestore.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/firestore/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/json/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/json/json_db.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/migrations/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mongo/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mongo/mongo.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mongo/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mysql/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mysql/mysql.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/mysql/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/postgres/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/postgres/postgres.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/postgres/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/redis/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/redis/redis.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/redis/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/culture.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/schemas/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/models.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/db/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/debug.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/eval/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/eval/accuracy.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/eval/performance.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/eval/reliability.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/eval/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/exceptions.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/guardrails/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/guardrails/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/guardrails/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/guardrails/pii.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/integrations/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/integrations/discord/client.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/content.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/document/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/csv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/pptx_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/types.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/knowledge/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/media.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/anthropic/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/aws/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/aws/bedrock.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/aws/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/azure/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cohere/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cohere/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/defaults.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/google/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/google/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/groq/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/groq/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/ibm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/internlm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/internlm/internlm.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/langdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/langdb/langdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/litellm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/litellm/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/message.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/meta/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/meta/llama.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/mistral/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/mistral/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nebius/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nebius/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nexus/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nexus/nexus.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/ollama/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/ollama/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openai/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openai/like.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openai/responses.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/portkey/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/portkey/portkey.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/requesty/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/requesty/requesty.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/response.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/together/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/together/together.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vercel/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vercel/v0.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vertexai/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vllm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/vllm/vllm.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/xai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/models/xai/xai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/auth.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/config.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/middleware/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/middleware/jwt.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/health.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/home.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/routers/session/session.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/schema.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/settings.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/os/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/py.typed +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/anthropic.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/deepseek.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/default.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/helpers.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/ollama.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/step.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/reasoning/vertexai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/cancel.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/messages.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/run/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/session/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/session/summary.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/session/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/team/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/agentql.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/airflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/api.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/apify.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/arxiv.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/aws_lambda.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/aws_ses.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/baidusearch.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/bitbucket.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/brandfetch.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/bravesearch.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/brightdata.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/browserbase.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/calcom.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/calculator.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/cartesia.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/clickup.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/confluence.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/crawl4ai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/dalle.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/daytona.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/decorator.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/desi_vocal.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/discord.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/docker.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/duckdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/duckduckgo.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/e2b.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/eleven_labs.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/email.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/evm.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/exa.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/fal.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/file.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/file_generation.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/financial_datasets.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/firecrawl.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/function.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/giphy.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/github.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/gmail.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/google_bigquery.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/google_drive.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/google_maps.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/googlecalendar.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/googlesearch.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/googlesheets.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/hackernews.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/jina.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/jira.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/linear.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/linkup.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/local_file_system.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/lumalab.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mcp/params.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mem0.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/memori.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/morph.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/models_labs.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/moviepy_video.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/neo4j.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/newspaper.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/newspaper4k.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/openbb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/opencv.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/openweather.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/oxylabs.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/pandas.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/postgres.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/pubmed.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/python.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/reasoning.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/reddit.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/replicate.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/resend.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/scrapegraph.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/searxng.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/serpapi.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/serper.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/shell.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/slack.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/sleep.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/spider.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/sql.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/streamlit/components.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/tavily.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/telegram.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/todoist.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/tool_registry.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/toolkit.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/trafilatura.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/trello.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/twilio.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/user_control_flow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/valyu.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/visualization.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/webbrowser.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/webex.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/website.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/webtools.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/wikipedia.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/x.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/yfinance.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/youtube.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/zendesk.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/zep.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/tools/zoom.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/audio.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/certs.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/code_execution.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/common.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/dttm.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/enum.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/env.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/events.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/format_str.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/functions.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/hooks.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/http.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/json_schema.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/location.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/log.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/media.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/merge_dict.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/message.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/llama.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/models/watsonx.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/pickle.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/pprint.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/print_response/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/print_response/team.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/prompts.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/reasoning.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/response.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/response_iterator.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/safe_formatter.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/serialize.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/shell.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/streamlit.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/string.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/team.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/timer.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/tools.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/web.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/utils/yaml_io.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/base.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/distance.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/search.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/condition.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/loop.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/parallel.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/router.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/step.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/steps.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/types.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno/workflow/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno.egg-info/SOURCES.txt +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno.egg-info/requires.txt +0 -0
- {agno-2.2.3 → agno-2.2.5}/agno.egg-info/top_level.txt +0 -0
- {agno-2.2.3 → agno-2.2.5}/setup.cfg +0 -0
|
@@ -220,7 +220,9 @@ class Agent:
|
|
|
220
220
|
# add_history_to_context=true adds messages from the chat history to the messages list sent to the Model.
|
|
221
221
|
add_history_to_context: bool = False
|
|
222
222
|
# Number of historical runs to include in the messages
|
|
223
|
-
num_history_runs: int =
|
|
223
|
+
num_history_runs: Optional[int] = None
|
|
224
|
+
# Number of historical messages to include in the messages list sent to the Model.
|
|
225
|
+
num_history_messages: Optional[int] = None
|
|
224
226
|
# Maximum number of tool calls to include from history (None = no limit)
|
|
225
227
|
max_tool_calls_from_history: Optional[int] = None
|
|
226
228
|
|
|
@@ -438,7 +440,8 @@ class Agent:
|
|
|
438
440
|
add_session_summary_to_context: Optional[bool] = None,
|
|
439
441
|
session_summary_manager: Optional[SessionSummaryManager] = None,
|
|
440
442
|
add_history_to_context: bool = False,
|
|
441
|
-
num_history_runs: int =
|
|
443
|
+
num_history_runs: Optional[int] = None,
|
|
444
|
+
num_history_messages: Optional[int] = None,
|
|
442
445
|
max_tool_calls_from_history: Optional[int] = None,
|
|
443
446
|
store_media: bool = True,
|
|
444
447
|
store_tool_messages: bool = True,
|
|
@@ -541,6 +544,15 @@ class Agent:
|
|
|
541
544
|
|
|
542
545
|
self.add_history_to_context = add_history_to_context
|
|
543
546
|
self.num_history_runs = num_history_runs
|
|
547
|
+
self.num_history_messages = num_history_messages
|
|
548
|
+
if self.num_history_messages is not None and self.num_history_runs is not None:
|
|
549
|
+
log_warning(
|
|
550
|
+
"num_history_messages and num_history_runs cannot be set at the same time. Using num_history_runs."
|
|
551
|
+
)
|
|
552
|
+
self.num_history_messages = None
|
|
553
|
+
if self.num_history_messages is None and self.num_history_runs is None:
|
|
554
|
+
self.num_history_runs = 3
|
|
555
|
+
|
|
544
556
|
self.max_tool_calls_from_history = max_tool_calls_from_history
|
|
545
557
|
|
|
546
558
|
self.store_media = store_media
|
|
@@ -5133,7 +5145,7 @@ class Agent:
|
|
|
5133
5145
|
run_messages.user_message.get_content_string() if run_messages.user_message is not None else None
|
|
5134
5146
|
)
|
|
5135
5147
|
if user_message_str is not None and user_message_str.strip() != "" and self.memory_manager is not None:
|
|
5136
|
-
log_debug("
|
|
5148
|
+
log_debug("Managing user memories")
|
|
5137
5149
|
self.memory_manager.create_user_memories( # type: ignore
|
|
5138
5150
|
message=user_message_str,
|
|
5139
5151
|
user_id=user_id,
|
|
@@ -5174,7 +5186,7 @@ class Agent:
|
|
|
5174
5186
|
run_messages.user_message.get_content_string() if run_messages.user_message is not None else None
|
|
5175
5187
|
)
|
|
5176
5188
|
if user_message_str is not None and user_message_str.strip() != "" and self.memory_manager is not None:
|
|
5177
|
-
log_debug("
|
|
5189
|
+
log_debug("Managing user memories")
|
|
5178
5190
|
await self.memory_manager.acreate_user_memories( # type: ignore
|
|
5179
5191
|
message=user_message_str,
|
|
5180
5192
|
user_id=user_id,
|
|
@@ -7461,6 +7473,7 @@ class Agent:
|
|
|
7461
7473
|
|
|
7462
7474
|
history: List[Message] = session.get_messages_from_last_n_runs(
|
|
7463
7475
|
last_n=self.num_history_runs,
|
|
7476
|
+
last_n_messages=self.num_history_messages,
|
|
7464
7477
|
skip_role=skip_role,
|
|
7465
7478
|
agent_id=self.id if self.team_id is not None else None,
|
|
7466
7479
|
)
|
|
@@ -7658,9 +7671,17 @@ class Agent:
|
|
|
7658
7671
|
if add_history_to_context:
|
|
7659
7672
|
from copy import deepcopy
|
|
7660
7673
|
|
|
7674
|
+
# Only skip messages from history when system_message_role is NOT a standard conversation role.
|
|
7675
|
+
# Standard conversation roles ("user", "assistant", "tool") should never be filtered
|
|
7676
|
+
# to preserve conversation continuity.
|
|
7677
|
+
skip_role = (
|
|
7678
|
+
self.system_message_role if self.system_message_role not in ["user", "assistant", "tool"] else None
|
|
7679
|
+
)
|
|
7680
|
+
|
|
7661
7681
|
history: List[Message] = session.get_messages_from_last_n_runs(
|
|
7662
7682
|
last_n=self.num_history_runs,
|
|
7663
|
-
|
|
7683
|
+
last_n_messages=self.num_history_messages,
|
|
7684
|
+
skip_role=skip_role,
|
|
7664
7685
|
agent_id=self.id if self.team_id is not None else None,
|
|
7665
7686
|
)
|
|
7666
7687
|
|
|
@@ -361,7 +361,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
361
361
|
token_metrics[field] += session_metrics.get(field, 0)
|
|
362
362
|
model_metrics = []
|
|
363
363
|
for model, count in model_counts.items():
|
|
364
|
-
model_id, model_provider = model.
|
|
364
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
365
365
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
366
366
|
metrics["users_count"] = len(all_user_ids)
|
|
367
367
|
current_time = int(time.time())
|
|
@@ -224,7 +224,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
224
224
|
|
|
225
225
|
model_metrics = []
|
|
226
226
|
for model, count in model_counts.items():
|
|
227
|
-
model_id, model_provider = model.
|
|
227
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
228
228
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
229
229
|
|
|
230
230
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -99,7 +99,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
99
99
|
|
|
100
100
|
model_metrics = []
|
|
101
101
|
for model, count in model_counts.items():
|
|
102
|
-
model_id, model_provider = model.
|
|
102
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
103
103
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
104
104
|
|
|
105
105
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -99,7 +99,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
99
99
|
|
|
100
100
|
model_metrics = []
|
|
101
101
|
for model, count in model_counts.items():
|
|
102
|
-
model_id, model_provider = model.
|
|
102
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
103
103
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
104
104
|
|
|
105
105
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -99,7 +99,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
99
99
|
|
|
100
100
|
model_metrics = []
|
|
101
101
|
for model, count in model_counts.items():
|
|
102
|
-
model_id, model_provider = model.
|
|
102
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
103
103
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
104
104
|
|
|
105
105
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -1089,7 +1089,7 @@ class AsyncMongoDb(AsyncBaseDb):
|
|
|
1089
1089
|
if limit is not None:
|
|
1090
1090
|
if page is not None:
|
|
1091
1091
|
pipeline.append({"$skip": (page - 1) * limit}) # type: ignore
|
|
1092
|
-
pipeline.append({"$limit": limit})
|
|
1092
|
+
pipeline.append({"$limit": limit}) # type: ignore
|
|
1093
1093
|
|
|
1094
1094
|
results = await collection.aggregate(pipeline).to_list(length=None)
|
|
1095
1095
|
|
|
@@ -117,7 +117,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
117
117
|
|
|
118
118
|
model_metrics = []
|
|
119
119
|
for model, count in model_counts.items():
|
|
120
|
-
model_id, model_provider = model.
|
|
120
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
121
121
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
122
122
|
|
|
123
123
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -226,7 +226,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
226
226
|
|
|
227
227
|
model_metrics = []
|
|
228
228
|
for model, count in model_counts.items():
|
|
229
|
-
model_id, model_provider = model.
|
|
229
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
230
230
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
231
231
|
|
|
232
232
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -37,7 +37,7 @@ except ImportError:
|
|
|
37
37
|
class AsyncPostgresDb(AsyncBaseDb):
|
|
38
38
|
def __init__(
|
|
39
39
|
self,
|
|
40
|
-
|
|
40
|
+
id: Optional[str] = None,
|
|
41
41
|
db_url: Optional[str] = None,
|
|
42
42
|
db_engine: Optional[AsyncEngine] = None,
|
|
43
43
|
db_schema: Optional[str] = None,
|
|
@@ -47,6 +47,7 @@ class AsyncPostgresDb(AsyncBaseDb):
|
|
|
47
47
|
eval_table: Optional[str] = None,
|
|
48
48
|
knowledge_table: Optional[str] = None,
|
|
49
49
|
culture_table: Optional[str] = None,
|
|
50
|
+
db_id: Optional[str] = None, # Deprecated, use id instead.
|
|
50
51
|
):
|
|
51
52
|
"""
|
|
52
53
|
Async interface for interacting with a PostgreSQL database.
|
|
@@ -57,7 +58,7 @@ class AsyncPostgresDb(AsyncBaseDb):
|
|
|
57
58
|
3. Raise an error if neither is provided
|
|
58
59
|
|
|
59
60
|
Args:
|
|
60
|
-
|
|
61
|
+
id (Optional[str]): The ID of the database.
|
|
61
62
|
db_url (Optional[str]): The database URL to connect to.
|
|
62
63
|
db_engine (Optional[AsyncEngine]): The SQLAlchemy async database engine to use.
|
|
63
64
|
db_schema (Optional[str]): The database schema to use.
|
|
@@ -67,13 +68,17 @@ class AsyncPostgresDb(AsyncBaseDb):
|
|
|
67
68
|
eval_table (Optional[str]): Name of the table to store evaluation runs data.
|
|
68
69
|
knowledge_table (Optional[str]): Name of the table to store knowledge content.
|
|
69
70
|
culture_table (Optional[str]): Name of the table to store cultural knowledge.
|
|
71
|
+
db_id: Deprecated, use id instead.
|
|
70
72
|
|
|
71
73
|
Raises:
|
|
72
74
|
ValueError: If neither db_url nor db_engine is provided.
|
|
73
75
|
ValueError: If none of the tables are provided.
|
|
74
76
|
"""
|
|
77
|
+
if db_id is not None:
|
|
78
|
+
log_warning("db_id is deprecated and will be removed in a future version, use id instead.")
|
|
79
|
+
|
|
75
80
|
super().__init__(
|
|
76
|
-
id=db_id,
|
|
81
|
+
id=id or db_id,
|
|
77
82
|
session_table=session_table,
|
|
78
83
|
memory_table=memory_table,
|
|
79
84
|
metrics_table=metrics_table,
|
|
@@ -313,7 +313,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
313
313
|
|
|
314
314
|
model_metrics = []
|
|
315
315
|
for model, count in model_counts.items():
|
|
316
|
-
model_id, model_provider = model.
|
|
316
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
317
317
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
318
318
|
|
|
319
319
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -221,7 +221,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
221
221
|
|
|
222
222
|
model_metrics = []
|
|
223
223
|
for model, count in model_counts.items():
|
|
224
|
-
model_id, model_provider = model.
|
|
224
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
225
225
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
226
226
|
|
|
227
227
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -255,7 +255,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
255
255
|
|
|
256
256
|
model_metrics = []
|
|
257
257
|
for model, count in model_counts.items():
|
|
258
|
-
model_id, model_provider = model.
|
|
258
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
259
259
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
260
260
|
|
|
261
261
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -298,7 +298,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
298
298
|
|
|
299
299
|
model_metrics = []
|
|
300
300
|
for model, count in model_counts.items():
|
|
301
|
-
model_id, model_provider = model.
|
|
301
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
302
302
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
303
303
|
|
|
304
304
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -85,6 +85,10 @@ class OllamaEmbedder(Embedder):
|
|
|
85
85
|
if self.options is not None:
|
|
86
86
|
kwargs["options"] = self.options
|
|
87
87
|
|
|
88
|
+
# Add dimensions parameter for models that support it
|
|
89
|
+
if self.dimensions is not None:
|
|
90
|
+
kwargs["dimensions"] = self.dimensions
|
|
91
|
+
|
|
88
92
|
response = self.client.embed(input=text, model=self.id, **kwargs)
|
|
89
93
|
if response and "embeddings" in response:
|
|
90
94
|
embeddings = response["embeddings"]
|
|
@@ -117,6 +121,10 @@ class OllamaEmbedder(Embedder):
|
|
|
117
121
|
if self.options is not None:
|
|
118
122
|
kwargs["options"] = self.options
|
|
119
123
|
|
|
124
|
+
# Add dimensions parameter for models that support it
|
|
125
|
+
if self.dimensions is not None:
|
|
126
|
+
kwargs["dimensions"] = self.dimensions
|
|
127
|
+
|
|
120
128
|
response = await self.aclient.embed(input=text, model=self.id, **kwargs)
|
|
121
129
|
if response and "embeddings" in response:
|
|
122
130
|
embeddings = response["embeddings"]
|
|
@@ -843,7 +843,7 @@ class MemoryManager:
|
|
|
843
843
|
team_id=team_id,
|
|
844
844
|
enable_add_memory=add_memories,
|
|
845
845
|
enable_update_memory=update_memories,
|
|
846
|
-
enable_delete_memory=
|
|
846
|
+
enable_delete_memory=True,
|
|
847
847
|
enable_clear_memory=False,
|
|
848
848
|
),
|
|
849
849
|
)
|
|
@@ -854,7 +854,7 @@ class MemoryManager:
|
|
|
854
854
|
existing_memories=existing_memories,
|
|
855
855
|
enable_update_memory=update_memories,
|
|
856
856
|
enable_add_memory=add_memories,
|
|
857
|
-
enable_delete_memory=
|
|
857
|
+
enable_delete_memory=True,
|
|
858
858
|
enable_clear_memory=False,
|
|
859
859
|
),
|
|
860
860
|
*messages,
|
|
@@ -906,7 +906,7 @@ class MemoryManager:
|
|
|
906
906
|
team_id=team_id,
|
|
907
907
|
enable_add_memory=add_memories,
|
|
908
908
|
enable_update_memory=update_memories,
|
|
909
|
-
enable_delete_memory=
|
|
909
|
+
enable_delete_memory=True,
|
|
910
910
|
enable_clear_memory=False,
|
|
911
911
|
),
|
|
912
912
|
)
|
|
@@ -920,7 +920,7 @@ class MemoryManager:
|
|
|
920
920
|
team_id=team_id,
|
|
921
921
|
enable_add_memory=add_memories,
|
|
922
922
|
enable_update_memory=update_memories,
|
|
923
|
-
enable_delete_memory=
|
|
923
|
+
enable_delete_memory=True,
|
|
924
924
|
enable_clear_memory=False,
|
|
925
925
|
),
|
|
926
926
|
)
|
|
@@ -931,7 +931,7 @@ class MemoryManager:
|
|
|
931
931
|
existing_memories=existing_memories,
|
|
932
932
|
enable_update_memory=update_memories,
|
|
933
933
|
enable_add_memory=add_memories,
|
|
934
|
-
enable_delete_memory=
|
|
934
|
+
enable_delete_memory=True,
|
|
935
935
|
enable_clear_memory=False,
|
|
936
936
|
),
|
|
937
937
|
*messages,
|
|
@@ -187,54 +187,96 @@ class AgentOS:
|
|
|
187
187
|
self.mcp_tools: List[Any] = []
|
|
188
188
|
self._mcp_app: Optional[Any] = None
|
|
189
189
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if agent.tools:
|
|
194
|
-
for tool in agent.tools:
|
|
195
|
-
# Checking if the tool is a MCPTools or MultiMCPTools instance
|
|
196
|
-
type_name = type(tool).__name__
|
|
197
|
-
if type_name in ("MCPTools", "MultiMCPTools"):
|
|
198
|
-
if tool not in self.mcp_tools:
|
|
199
|
-
self.mcp_tools.append(tool)
|
|
200
|
-
|
|
201
|
-
agent.initialize_agent()
|
|
190
|
+
self._initialize_agents()
|
|
191
|
+
self._initialize_teams()
|
|
192
|
+
self._initialize_workflows()
|
|
202
193
|
|
|
203
|
-
|
|
204
|
-
|
|
194
|
+
if self.telemetry:
|
|
195
|
+
from agno.api.os import OSLaunch, log_os_telemetry
|
|
205
196
|
|
|
206
|
-
|
|
207
|
-
for team in self.teams:
|
|
208
|
-
# Track all MCP tools recursively
|
|
209
|
-
collect_mcp_tools_from_team(team, self.mcp_tools)
|
|
197
|
+
log_os_telemetry(launch=OSLaunch(os_id=self.id, data=self._get_telemetry_data()))
|
|
210
198
|
|
|
211
|
-
|
|
199
|
+
def _add_agent_os_to_lifespan_function(self, lifespan):
|
|
200
|
+
"""
|
|
201
|
+
Inspect a lifespan function and wrap it to pass agent_os if it accepts it.
|
|
212
202
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
203
|
+
Returns:
|
|
204
|
+
A wrapped lifespan that passes agent_os if the lifespan function expects it.
|
|
205
|
+
"""
|
|
206
|
+
# Getting the actual function inside the lifespan
|
|
207
|
+
lifespan_function = lifespan
|
|
208
|
+
if hasattr(lifespan, "__wrapped__"):
|
|
209
|
+
lifespan_function = lifespan.__wrapped__
|
|
219
210
|
|
|
220
|
-
|
|
221
|
-
|
|
211
|
+
try:
|
|
212
|
+
from inspect import signature
|
|
222
213
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
collect_mcp_tools_from_workflow(workflow, self.mcp_tools)
|
|
214
|
+
# Inspecting the lifespan function signature to find its parameters
|
|
215
|
+
sig = signature(lifespan_function)
|
|
216
|
+
params = list(sig.parameters.keys())
|
|
227
217
|
|
|
228
|
-
|
|
229
|
-
|
|
218
|
+
# If the lifespan function expects the 'agent_os' parameter, add it
|
|
219
|
+
if "agent_os" in params:
|
|
220
|
+
return partial(lifespan, agent_os=self)
|
|
221
|
+
else:
|
|
222
|
+
return lifespan
|
|
230
223
|
|
|
231
|
-
|
|
232
|
-
|
|
224
|
+
except (ValueError, TypeError):
|
|
225
|
+
return lifespan
|
|
233
226
|
|
|
234
|
-
|
|
235
|
-
|
|
227
|
+
def resync(self, app: FastAPI) -> None:
|
|
228
|
+
"""Resync the AgentOS to discover, initialize and configure: agents, teams, workflows, databases and knowledge bases."""
|
|
229
|
+
self._initialize_agents()
|
|
230
|
+
self._initialize_teams()
|
|
231
|
+
self._initialize_workflows()
|
|
232
|
+
self._auto_discover_databases()
|
|
233
|
+
self._auto_discover_knowledge_instances()
|
|
234
|
+
self._reprovision_routers(app=app)
|
|
236
235
|
|
|
237
|
-
|
|
236
|
+
def _reprovision_routers(self, app: FastAPI) -> None:
|
|
237
|
+
"""Re-provision all routes for the AgentOS."""
|
|
238
|
+
updated_routers = [
|
|
239
|
+
get_session_router(dbs=self.dbs),
|
|
240
|
+
get_memory_router(dbs=self.dbs),
|
|
241
|
+
get_eval_router(dbs=self.dbs, agents=self.agents, teams=self.teams),
|
|
242
|
+
get_metrics_router(dbs=self.dbs),
|
|
243
|
+
get_knowledge_router(knowledge_instances=self.knowledge_instances),
|
|
244
|
+
]
|
|
245
|
+
|
|
246
|
+
# Clear all previously existing routes
|
|
247
|
+
app.router.routes = []
|
|
248
|
+
|
|
249
|
+
# Add the updated routes
|
|
250
|
+
for router in updated_routers:
|
|
251
|
+
self._add_router(app, router)
|
|
252
|
+
|
|
253
|
+
# Add the built-in routes
|
|
254
|
+
self._add_built_in_routes(app=app)
|
|
255
|
+
|
|
256
|
+
def _add_built_in_routes(self, app: FastAPI) -> None:
|
|
257
|
+
"""Add all AgentOSbuilt-in routes to the given app."""
|
|
258
|
+
self._add_router(app, get_base_router(self, settings=self.settings))
|
|
259
|
+
self._add_router(app, get_websocket_router(self, settings=self.settings))
|
|
260
|
+
self._add_router(app, get_health_router())
|
|
261
|
+
self._add_router(app, get_home_router(self))
|
|
262
|
+
|
|
263
|
+
# Add A2A interface if relevant
|
|
264
|
+
has_a2a_interface = False
|
|
265
|
+
for interface in self.interfaces:
|
|
266
|
+
if not has_a2a_interface and interface.__class__.__name__ == "A2A":
|
|
267
|
+
has_a2a_interface = True
|
|
268
|
+
interface_router = interface.get_router()
|
|
269
|
+
self._add_router(app, interface_router)
|
|
270
|
+
if self.a2a_interface and not has_a2a_interface:
|
|
271
|
+
from agno.os.interfaces.a2a import A2A
|
|
272
|
+
|
|
273
|
+
a2a_interface = A2A(agents=self.agents, teams=self.teams, workflows=self.workflows)
|
|
274
|
+
self.interfaces.append(a2a_interface)
|
|
275
|
+
self._add_router(app, a2a_interface.get_router())
|
|
276
|
+
|
|
277
|
+
# Add the home router if MCP server is not enabled
|
|
278
|
+
if not self.enable_mcp_server:
|
|
279
|
+
self._add_router(app, get_home_router(self))
|
|
238
280
|
|
|
239
281
|
def _make_app(self, lifespan: Optional[Any] = None) -> FastAPI:
|
|
240
282
|
# Adjust the FastAPI app lifespan to handle MCP connections if relevant
|
|
@@ -265,6 +307,63 @@ class AgentOS:
|
|
|
265
307
|
lifespan=app_lifespan,
|
|
266
308
|
)
|
|
267
309
|
|
|
310
|
+
def _initialize_agents(self) -> None:
|
|
311
|
+
"""Initialize and configure all agents for AgentOS usage."""
|
|
312
|
+
if not self.agents:
|
|
313
|
+
return
|
|
314
|
+
|
|
315
|
+
for agent in self.agents:
|
|
316
|
+
# Track all MCP tools to later handle their connection
|
|
317
|
+
if agent.tools:
|
|
318
|
+
for tool in agent.tools:
|
|
319
|
+
# Checking if the tool is a MCPTools or MultiMCPTools instance
|
|
320
|
+
type_name = type(tool).__name__
|
|
321
|
+
if type_name in ("MCPTools", "MultiMCPTools"):
|
|
322
|
+
if tool not in self.mcp_tools:
|
|
323
|
+
self.mcp_tools.append(tool)
|
|
324
|
+
|
|
325
|
+
agent.initialize_agent()
|
|
326
|
+
|
|
327
|
+
# Required for the built-in routes to work
|
|
328
|
+
agent.store_events = True
|
|
329
|
+
|
|
330
|
+
def _initialize_teams(self) -> None:
|
|
331
|
+
"""Initialize and configure all teams for AgentOS usage."""
|
|
332
|
+
if not self.teams:
|
|
333
|
+
return
|
|
334
|
+
|
|
335
|
+
for team in self.teams:
|
|
336
|
+
# Track all MCP tools recursively
|
|
337
|
+
collect_mcp_tools_from_team(team, self.mcp_tools)
|
|
338
|
+
|
|
339
|
+
team.initialize_team()
|
|
340
|
+
|
|
341
|
+
for member in team.members:
|
|
342
|
+
if isinstance(member, Agent):
|
|
343
|
+
member.team_id = None
|
|
344
|
+
member.initialize_agent()
|
|
345
|
+
elif isinstance(member, Team):
|
|
346
|
+
member.initialize_team()
|
|
347
|
+
|
|
348
|
+
# Required for the built-in routes to work
|
|
349
|
+
team.store_events = True
|
|
350
|
+
|
|
351
|
+
def _initialize_workflows(self) -> None:
|
|
352
|
+
"""Initialize and configure all workflows for AgentOS usage."""
|
|
353
|
+
if not self.workflows:
|
|
354
|
+
return
|
|
355
|
+
|
|
356
|
+
if self.workflows:
|
|
357
|
+
for workflow in self.workflows:
|
|
358
|
+
# Track MCP tools recursively in workflow members
|
|
359
|
+
collect_mcp_tools_from_workflow(workflow, self.mcp_tools)
|
|
360
|
+
|
|
361
|
+
if not workflow.id:
|
|
362
|
+
workflow.id = generate_id_from_name(workflow.name)
|
|
363
|
+
|
|
364
|
+
# Required for the built-in routes to work
|
|
365
|
+
workflow.store_events = True
|
|
366
|
+
|
|
268
367
|
def get_app(self) -> FastAPI:
|
|
269
368
|
if self.base_app:
|
|
270
369
|
fastapi_app = self.base_app
|
|
@@ -288,7 +387,9 @@ class AgentOS:
|
|
|
288
387
|
lifespans.append(self._mcp_app.lifespan)
|
|
289
388
|
|
|
290
389
|
if self.lifespan:
|
|
291
|
-
|
|
390
|
+
# Wrap the user lifespan with agent_os parameter
|
|
391
|
+
wrapped_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
392
|
+
lifespans.append(wrapped_lifespan)
|
|
292
393
|
|
|
293
394
|
# Combine lifespans and set them in the app
|
|
294
395
|
if lifespans:
|
|
@@ -304,11 +405,14 @@ class AgentOS:
|
|
|
304
405
|
|
|
305
406
|
final_lifespan = self._mcp_app.lifespan # type: ignore
|
|
306
407
|
if self.lifespan is not None:
|
|
408
|
+
# Wrap the user lifespan with agent_os parameter
|
|
409
|
+
wrapped_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
410
|
+
|
|
307
411
|
# Combine both lifespans
|
|
308
412
|
@asynccontextmanager
|
|
309
413
|
async def combined_lifespan(app: FastAPI):
|
|
310
414
|
# Run both lifespans
|
|
311
|
-
async with
|
|
415
|
+
async with wrapped_lifespan(app): # type: ignore
|
|
312
416
|
async with self._mcp_app.lifespan(app): # type: ignore
|
|
313
417
|
yield
|
|
314
418
|
|
|
@@ -316,28 +420,14 @@ class AgentOS:
|
|
|
316
420
|
|
|
317
421
|
fastapi_app = self._make_app(lifespan=final_lifespan)
|
|
318
422
|
else:
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
self._add_router(fastapi_app, get_websocket_router(self, settings=self.settings))
|
|
324
|
-
self._add_router(fastapi_app, get_health_router())
|
|
325
|
-
self._add_router(fastapi_app, get_home_router(self))
|
|
326
|
-
|
|
327
|
-
has_a2a_interface = False
|
|
328
|
-
for interface in self.interfaces:
|
|
329
|
-
if not has_a2a_interface and interface.__class__.__name__ == "A2A":
|
|
330
|
-
has_a2a_interface = True
|
|
331
|
-
interface_router = interface.get_router()
|
|
332
|
-
self._add_router(fastapi_app, interface_router)
|
|
423
|
+
# Wrap the user lifespan with agent_os parameter
|
|
424
|
+
wrapped_user_lifespan = None
|
|
425
|
+
if self.lifespan is not None:
|
|
426
|
+
wrapped_user_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
333
427
|
|
|
334
|
-
|
|
335
|
-
if self.a2a_interface and not has_a2a_interface:
|
|
336
|
-
from agno.os.interfaces.a2a import A2A
|
|
428
|
+
fastapi_app = self._make_app(lifespan=wrapped_user_lifespan)
|
|
337
429
|
|
|
338
|
-
|
|
339
|
-
self.interfaces.append(a2a_interface)
|
|
340
|
-
self._add_router(fastapi_app, a2a_interface.get_router())
|
|
430
|
+
self._add_built_in_routes(app=fastapi_app)
|
|
341
431
|
|
|
342
432
|
self._auto_discover_databases()
|
|
343
433
|
self._auto_discover_knowledge_instances()
|
|
@@ -70,12 +70,39 @@ class RunInput:
|
|
|
70
70
|
result["input_content"] = self.input_content.model_dump(exclude_none=True)
|
|
71
71
|
elif isinstance(self.input_content, Message):
|
|
72
72
|
result["input_content"] = self.input_content.to_dict()
|
|
73
|
+
|
|
74
|
+
# Handle input_content provided as a list of Message objects
|
|
73
75
|
elif (
|
|
74
76
|
isinstance(self.input_content, list)
|
|
75
77
|
and self.input_content
|
|
76
78
|
and isinstance(self.input_content[0], Message)
|
|
77
79
|
):
|
|
78
80
|
result["input_content"] = [m.to_dict() for m in self.input_content]
|
|
81
|
+
|
|
82
|
+
# Handle input_content provided as a list of dicts
|
|
83
|
+
elif (
|
|
84
|
+
isinstance(self.input_content, list) and self.input_content and isinstance(self.input_content[0], dict)
|
|
85
|
+
):
|
|
86
|
+
for content in self.input_content:
|
|
87
|
+
# Handle media input
|
|
88
|
+
if isinstance(content, dict):
|
|
89
|
+
if content.get("images"):
|
|
90
|
+
content["images"] = [
|
|
91
|
+
img.to_dict() if isinstance(img, Image) else img for img in content["images"]
|
|
92
|
+
]
|
|
93
|
+
if content.get("videos"):
|
|
94
|
+
content["videos"] = [
|
|
95
|
+
vid.to_dict() if isinstance(vid, Video) else vid for vid in content["videos"]
|
|
96
|
+
]
|
|
97
|
+
if content.get("audios"):
|
|
98
|
+
content["audios"] = [
|
|
99
|
+
aud.to_dict() if isinstance(aud, Audio) else aud for aud in content["audios"]
|
|
100
|
+
]
|
|
101
|
+
if content.get("files"):
|
|
102
|
+
content["files"] = [
|
|
103
|
+
file.to_dict() if isinstance(file, File) else file for file in content["files"]
|
|
104
|
+
]
|
|
105
|
+
result["input_content"] = self.input_content
|
|
79
106
|
else:
|
|
80
107
|
result["input_content"] = self.input_content
|
|
81
108
|
|