agno 2.2.3__tar.gz → 2.2.4__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.4}/PKG-INFO +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/agent/agent.py +26 -5
- {agno-2.2.3 → agno-2.2.4}/agno/db/dynamo/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/firestore/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/gcs_json/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/in_memory/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/json/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/mongo/async_mongo.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/mongo/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/mysql/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/postgres/async_postgres.py +8 -3
- {agno-2.2.3 → agno-2.2.4}/agno/db/postgres/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/redis/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/singlestore/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/db/sqlite/utils.py +1 -1
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/ollama.py +8 -0
- {agno-2.2.3 → agno-2.2.4}/agno/memory/manager.py +5 -5
- {agno-2.2.3 → agno-2.2.4}/agno/os/app.py +105 -42
- {agno-2.2.3 → agno-2.2.4}/agno/run/agent.py +27 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/team.py +27 -0
- {agno-2.2.3 → agno-2.2.4}/agno/session/agent.py +57 -17
- {agno-2.2.3 → agno-2.2.4}/agno/session/team.py +57 -18
- {agno-2.2.3 → agno-2.2.4}/agno/team/team.py +29 -9
- {agno-2.2.3 → agno-2.2.4}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.2.3 → agno-2.2.4}/pyproject.toml +1 -1
- {agno-2.2.3 → agno-2.2.4}/LICENSE +0 -0
- {agno-2.2.3 → agno-2.2.4}/README.md +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/agent/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/api.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/os.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/routes.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/os.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/response.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/team.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/schemas/workflows.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/settings.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/team.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/api/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/cloud/aws/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/culture/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/culture/manager.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/async_postgres/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/firestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/firestore/firestore.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/firestore/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/json/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/json/json_db.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/migrations/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mongo/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mongo/mongo.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mongo/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mysql/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mysql/mysql.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/mysql/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/postgres/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/postgres/postgres.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/postgres/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/redis/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/redis/redis.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/redis/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/culture.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/schemas/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/sqlite/async_sqlite.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/models.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/queries.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/surrealdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/surrealdb/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/db/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/debug.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/eval/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/eval/accuracy.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/eval/performance.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/eval/reliability.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/eval/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/exceptions.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/guardrails/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/guardrails/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/guardrails/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/guardrails/pii.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/guardrails/prompt_injection.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/integrations/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/integrations/discord/client.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/content.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/document/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/csv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/pptx_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/tavily_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/types.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/knowledge/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/media.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/anthropic/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/aws/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/aws/bedrock.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/aws/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/azure/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cohere/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cohere/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cometapi/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/cometapi/cometapi.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/defaults.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/google/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/google/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/groq/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/groq/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/ibm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/internlm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/internlm/internlm.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/langdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/langdb/langdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/litellm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/litellm/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/message.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/meta/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/meta/llama.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/mistral/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/mistral/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nebius/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nebius/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nexus/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nexus/nexus.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/ollama/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/ollama/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openai/chat.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openai/like.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openai/responses.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/portkey/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/portkey/portkey.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/requesty/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/requesty/requesty.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/response.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/together/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/together/together.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vercel/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vercel/v0.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vertexai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vertexai/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vllm/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/vllm/vllm.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/xai/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/models/xai/xai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/auth.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/config.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/a2a/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/a2a/a2a.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/a2a/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/a2a/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/middleware/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/middleware/jwt.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/health.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/home.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/routers/session/session.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/schema.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/settings.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/os/utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/py.typed +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/anthropic.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/deepseek.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/default.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/helpers.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/ollama.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/step.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/reasoning/vertexai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/cancel.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/messages.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/run/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/session/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/session/summary.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/session/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/team/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/agentql.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/airflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/api.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/apify.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/arxiv.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/aws_lambda.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/aws_ses.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/baidusearch.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/bitbucket.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/brandfetch.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/bravesearch.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/brightdata.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/browserbase.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/calcom.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/calculator.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/cartesia.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/clickup.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/confluence.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/crawl4ai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/dalle.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/daytona.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/decorator.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/desi_vocal.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/discord.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/docker.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/duckdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/duckduckgo.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/e2b.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/eleven_labs.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/email.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/evm.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/exa.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/fal.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/file.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/file_generation.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/financial_datasets.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/firecrawl.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/function.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/giphy.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/github.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/gmail.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/google_bigquery.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/google_drive.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/google_maps.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/googlecalendar.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/googlesearch.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/googlesheets.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/hackernews.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/jina.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/jira.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/linear.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/linkup.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/local_file_system.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/lumalab.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mcp/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mcp/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mcp/multi_mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mcp/params.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mcp_toolbox.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mem0.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/memori.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/memory.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/groq.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/morph.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models/nebius.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/models_labs.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/moviepy_video.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/neo4j.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/newspaper.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/newspaper4k.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/openbb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/opencv.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/openweather.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/oxylabs.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/pandas.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/postgres.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/pubmed.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/python.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/reasoning.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/reddit.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/replicate.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/resend.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/scrapegraph.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/searxng.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/serpapi.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/serper.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/shell.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/slack.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/sleep.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/spider.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/sql.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/streamlit/components.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/tavily.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/telegram.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/todoist.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/tool_registry.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/toolkit.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/trafilatura.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/trello.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/twilio.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/user_control_flow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/valyu.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/visualization.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/webbrowser.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/webex.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/website.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/webtools.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/wikipedia.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/x.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/yfinance.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/youtube.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/zendesk.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/zep.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/tools/zoom.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/audio.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/certs.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/code_execution.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/common.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/dttm.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/enum.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/env.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/events.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/format_str.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/functions.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/gemini.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/hooks.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/http.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/json_schema.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/knowledge.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/location.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/log.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/mcp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/media.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/merge_dict.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/message.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/claude.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/cohere.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/llama.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/mistral.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/models/watsonx.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/openai.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/pickle.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/pprint.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/print_response/agent.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/print_response/team.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/prompts.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/reasoning.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/response.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/response_iterator.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/safe_formatter.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/serialize.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/shell.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/streamlit.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/string.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/team.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/timer.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/tools.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/web.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/whatsapp.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/utils/yaml_io.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/base.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/distance.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/search.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/__init__.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/condition.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/loop.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/parallel.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/router.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/step.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/steps.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/types.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno/workflow/workflow.py +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno.egg-info/SOURCES.txt +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno.egg-info/requires.txt +0 -0
- {agno-2.2.3 → agno-2.2.4}/agno.egg-info/top_level.txt +0 -0
- {agno-2.2.3 → agno-2.2.4}/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,50 @@ 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
|
-
|
|
205
|
-
|
|
206
|
-
if self.teams:
|
|
207
|
-
for team in self.teams:
|
|
208
|
-
# Track all MCP tools recursively
|
|
209
|
-
collect_mcp_tools_from_team(team, self.mcp_tools)
|
|
194
|
+
if self.telemetry:
|
|
195
|
+
from agno.api.os import OSLaunch, log_os_telemetry
|
|
210
196
|
|
|
211
|
-
|
|
197
|
+
log_os_telemetry(launch=OSLaunch(os_id=self.id, data=self._get_telemetry_data()))
|
|
212
198
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
member.initialize_agent()
|
|
217
|
-
elif isinstance(member, Team):
|
|
218
|
-
member.initialize_team()
|
|
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.
|
|
219
202
|
|
|
220
|
-
|
|
221
|
-
|
|
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__
|
|
222
210
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
# Track MCP tools recursively in workflow members
|
|
226
|
-
collect_mcp_tools_from_workflow(workflow, self.mcp_tools)
|
|
211
|
+
try:
|
|
212
|
+
from inspect import signature
|
|
227
213
|
|
|
228
|
-
|
|
229
|
-
|
|
214
|
+
# Inspecting the lifespan function signature to find its parameters
|
|
215
|
+
sig = signature(lifespan_function)
|
|
216
|
+
params = list(sig.parameters.keys())
|
|
230
217
|
|
|
231
|
-
|
|
232
|
-
|
|
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
|
|
233
223
|
|
|
234
|
-
|
|
235
|
-
|
|
224
|
+
except (ValueError, TypeError):
|
|
225
|
+
return lifespan
|
|
236
226
|
|
|
237
|
-
|
|
227
|
+
def resync(self) -> 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()
|
|
238
234
|
|
|
239
235
|
def _make_app(self, lifespan: Optional[Any] = None) -> FastAPI:
|
|
240
236
|
# Adjust the FastAPI app lifespan to handle MCP connections if relevant
|
|
@@ -265,6 +261,63 @@ class AgentOS:
|
|
|
265
261
|
lifespan=app_lifespan,
|
|
266
262
|
)
|
|
267
263
|
|
|
264
|
+
def _initialize_agents(self) -> None:
|
|
265
|
+
"""Initialize and configure all agents for AgentOS usage."""
|
|
266
|
+
if not self.agents:
|
|
267
|
+
return
|
|
268
|
+
|
|
269
|
+
for agent in self.agents:
|
|
270
|
+
# Track all MCP tools to later handle their connection
|
|
271
|
+
if agent.tools:
|
|
272
|
+
for tool in agent.tools:
|
|
273
|
+
# Checking if the tool is a MCPTools or MultiMCPTools instance
|
|
274
|
+
type_name = type(tool).__name__
|
|
275
|
+
if type_name in ("MCPTools", "MultiMCPTools"):
|
|
276
|
+
if tool not in self.mcp_tools:
|
|
277
|
+
self.mcp_tools.append(tool)
|
|
278
|
+
|
|
279
|
+
agent.initialize_agent()
|
|
280
|
+
|
|
281
|
+
# Required for the built-in routes to work
|
|
282
|
+
agent.store_events = True
|
|
283
|
+
|
|
284
|
+
def _initialize_teams(self) -> None:
|
|
285
|
+
"""Initialize and configure all teams for AgentOS usage."""
|
|
286
|
+
if not self.teams:
|
|
287
|
+
return
|
|
288
|
+
|
|
289
|
+
for team in self.teams:
|
|
290
|
+
# Track all MCP tools recursively
|
|
291
|
+
collect_mcp_tools_from_team(team, self.mcp_tools)
|
|
292
|
+
|
|
293
|
+
team.initialize_team()
|
|
294
|
+
|
|
295
|
+
for member in team.members:
|
|
296
|
+
if isinstance(member, Agent):
|
|
297
|
+
member.team_id = None
|
|
298
|
+
member.initialize_agent()
|
|
299
|
+
elif isinstance(member, Team):
|
|
300
|
+
member.initialize_team()
|
|
301
|
+
|
|
302
|
+
# Required for the built-in routes to work
|
|
303
|
+
team.store_events = True
|
|
304
|
+
|
|
305
|
+
def _initialize_workflows(self) -> None:
|
|
306
|
+
"""Initialize and configure all workflows for AgentOS usage."""
|
|
307
|
+
if not self.workflows:
|
|
308
|
+
return
|
|
309
|
+
|
|
310
|
+
if self.workflows:
|
|
311
|
+
for workflow in self.workflows:
|
|
312
|
+
# Track MCP tools recursively in workflow members
|
|
313
|
+
collect_mcp_tools_from_workflow(workflow, self.mcp_tools)
|
|
314
|
+
|
|
315
|
+
if not workflow.id:
|
|
316
|
+
workflow.id = generate_id_from_name(workflow.name)
|
|
317
|
+
|
|
318
|
+
# Required for the built-in routes to work
|
|
319
|
+
workflow.store_events = True
|
|
320
|
+
|
|
268
321
|
def get_app(self) -> FastAPI:
|
|
269
322
|
if self.base_app:
|
|
270
323
|
fastapi_app = self.base_app
|
|
@@ -288,7 +341,9 @@ class AgentOS:
|
|
|
288
341
|
lifespans.append(self._mcp_app.lifespan)
|
|
289
342
|
|
|
290
343
|
if self.lifespan:
|
|
291
|
-
|
|
344
|
+
# Wrap the user lifespan with agent_os parameter
|
|
345
|
+
wrapped_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
346
|
+
lifespans.append(wrapped_lifespan)
|
|
292
347
|
|
|
293
348
|
# Combine lifespans and set them in the app
|
|
294
349
|
if lifespans:
|
|
@@ -304,11 +359,14 @@ class AgentOS:
|
|
|
304
359
|
|
|
305
360
|
final_lifespan = self._mcp_app.lifespan # type: ignore
|
|
306
361
|
if self.lifespan is not None:
|
|
362
|
+
# Wrap the user lifespan with agent_os parameter
|
|
363
|
+
wrapped_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
364
|
+
|
|
307
365
|
# Combine both lifespans
|
|
308
366
|
@asynccontextmanager
|
|
309
367
|
async def combined_lifespan(app: FastAPI):
|
|
310
368
|
# Run both lifespans
|
|
311
|
-
async with
|
|
369
|
+
async with wrapped_lifespan(app): # type: ignore
|
|
312
370
|
async with self._mcp_app.lifespan(app): # type: ignore
|
|
313
371
|
yield
|
|
314
372
|
|
|
@@ -316,7 +374,12 @@ class AgentOS:
|
|
|
316
374
|
|
|
317
375
|
fastapi_app = self._make_app(lifespan=final_lifespan)
|
|
318
376
|
else:
|
|
319
|
-
|
|
377
|
+
# Wrap the user lifespan with agent_os parameter
|
|
378
|
+
wrapped_user_lifespan = None
|
|
379
|
+
if self.lifespan is not None:
|
|
380
|
+
wrapped_user_lifespan = self._add_agent_os_to_lifespan_function(self.lifespan)
|
|
381
|
+
|
|
382
|
+
fastapi_app = self._make_app(lifespan=wrapped_user_lifespan)
|
|
320
383
|
|
|
321
384
|
# Add routes
|
|
322
385
|
self._add_router(fastapi_app, get_base_router(self, settings=self.settings))
|
|
@@ -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
|
|
|
@@ -66,12 +66,39 @@ class TeamRunInput:
|
|
|
66
66
|
result["input_content"] = self.input_content.model_dump(exclude_none=True)
|
|
67
67
|
elif isinstance(self.input_content, Message):
|
|
68
68
|
result["input_content"] = self.input_content.to_dict()
|
|
69
|
+
|
|
70
|
+
# Handle input_content provided as a list of Message objects
|
|
69
71
|
elif (
|
|
70
72
|
isinstance(self.input_content, list)
|
|
71
73
|
and self.input_content
|
|
72
74
|
and isinstance(self.input_content[0], Message)
|
|
73
75
|
):
|
|
74
76
|
result["input_content"] = [m.to_dict() for m in self.input_content]
|
|
77
|
+
|
|
78
|
+
# Handle input_content provided as a list of dicts
|
|
79
|
+
elif (
|
|
80
|
+
isinstance(self.input_content, list) and self.input_content and isinstance(self.input_content[0], dict)
|
|
81
|
+
):
|
|
82
|
+
for content in self.input_content:
|
|
83
|
+
# Handle media input
|
|
84
|
+
if isinstance(content, dict):
|
|
85
|
+
if content.get("images"):
|
|
86
|
+
content["images"] = [
|
|
87
|
+
img.to_dict() if isinstance(img, Image) else img for img in content["images"]
|
|
88
|
+
]
|
|
89
|
+
if content.get("videos"):
|
|
90
|
+
content["videos"] = [
|
|
91
|
+
vid.to_dict() if isinstance(vid, Video) else vid for vid in content["videos"]
|
|
92
|
+
]
|
|
93
|
+
if content.get("audios"):
|
|
94
|
+
content["audios"] = [
|
|
95
|
+
aud.to_dict() if isinstance(aud, Audio) else aud for aud in content["audios"]
|
|
96
|
+
]
|
|
97
|
+
if content.get("files"):
|
|
98
|
+
content["files"] = [
|
|
99
|
+
file.to_dict() if isinstance(file, File) else file for file in content["files"]
|
|
100
|
+
]
|
|
101
|
+
result["input_content"] = self.input_content
|
|
75
102
|
else:
|
|
76
103
|
result["input_content"] = self.input_content
|
|
77
104
|
|