agno 2.0.7__tar.gz → 2.0.8__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.0.7 → agno-2.0.8}/PKG-INFO +1 -1
- {agno-2.0.7 → agno-2.0.8}/agno/agent/agent.py +81 -49
- {agno-2.0.7 → agno-2.0.8}/agno/db/migrations/v1_to_v2.py +140 -11
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/sentence_transformer.py +3 -3
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/knowledge.py +152 -31
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/types.py +8 -0
- agno-2.0.8/agno/models/cometapi/__init__.py +5 -0
- agno-2.0.8/agno/models/cometapi/cometapi.py +57 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/google/gemini.py +4 -8
- {agno-2.0.7 → agno-2.0.8}/agno/models/ollama/chat.py +24 -1
- {agno-2.0.7 → agno-2.0.8}/agno/models/openai/chat.py +2 -7
- {agno-2.0.7 → agno-2.0.8}/agno/models/openai/responses.py +21 -17
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/agui.py +2 -2
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/utils.py +81 -18
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/slack.py +2 -2
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/whatsapp.py +2 -2
- {agno-2.0.7 → agno-2.0.8}/agno/os/utils.py +8 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/default.py +3 -1
- {agno-2.0.7 → agno-2.0.8}/agno/session/agent.py +8 -5
- {agno-2.0.7 → agno-2.0.8}/agno/session/team.py +14 -10
- {agno-2.0.7 → agno-2.0.8}/agno/team/team.py +218 -104
- {agno-2.0.7 → agno-2.0.8}/agno/tools/function.py +43 -4
- {agno-2.0.7 → agno-2.0.8}/agno/tools/mcp.py +60 -37
- {agno-2.0.7 → agno-2.0.8}/agno/utils/gemini.py +147 -19
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/claude.py +9 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/agent.py +16 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/team.py +16 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/base.py +2 -2
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/langchaindb/langchaindb.py +5 -7
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/llamaindex/llamaindexdb.py +25 -6
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/workflow.py +31 -15
- {agno-2.0.7 → agno-2.0.8}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.0.7 → agno-2.0.8}/agno.egg-info/SOURCES.txt +2 -0
- {agno-2.0.7 → agno-2.0.8}/pyproject.toml +1 -1
- {agno-2.0.7 → agno-2.0.8}/LICENSE +0 -0
- {agno-2.0.7 → agno-2.0.8}/README.md +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/agent/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/agent.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/api.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/evals.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/os.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/routes.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/agent.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/evals.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/os.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/response.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/team.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/workflows.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/settings.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/team.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/api/workflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/firestore.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/json/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/json/json_db.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/json/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/migrations/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/mongo.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/mysql.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/postgres.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/redis/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/redis/redis.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/redis/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/redis/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/evals.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/memory.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/metrics.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/db/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/debug.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/eval/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/eval/accuracy.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/eval/performance.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/eval/reliability.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/eval/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/exceptions.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/integrations/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/integrations/discord/client.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/content.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/document/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/csv_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/knowledge/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/media.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/memory/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/memory/manager.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/anthropic/claude.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/aws/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/aws/bedrock.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/aws/claude.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/azure/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/cohere/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/cohere/chat.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/defaults.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/google/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/groq/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/groq/groq.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/ibm/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/internlm/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/internlm/internlm.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/langdb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/langdb/langdb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/chat.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/llama_cpp/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/llama_cpp/llama_cpp.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/message.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/meta/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/meta/llama.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/metrics.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/mistral/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/mistral/mistral.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nebius/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nebius/nebius.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nexus/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nexus/nexus.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/ollama/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/openai/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/openai/like.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/portkey/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/portkey/portkey.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/response.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/siliconflow/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/siliconflow/siliconflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/together/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/together/together.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/vercel/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/vercel/v0.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/vllm/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/vllm/vllm.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/xai/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/models/xai/xai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/app.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/auth.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/config.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/mcp.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/router.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/health.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/home.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/routers/session/session.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/schema.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/os/settings.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/py.typed +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/deepseek.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/groq.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/helpers.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/ollama.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/reasoning/step.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/agent.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/base.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/cancel.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/messages.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/team.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/run/workflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/session/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/session/summary.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/session/workflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/team/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/agentql.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/airflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/api.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/apify.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/arxiv.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/aws_lambda.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/aws_ses.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/baidusearch.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/bitbucket.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/brandfetch.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/bravesearch.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/brightdata.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/browserbase.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/calcom.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/calculator.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/cartesia.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/clickup.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/confluence.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/crawl4ai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/dalle.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/daytona.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/decorator.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/desi_vocal.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/discord.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/docker.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/duckdb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/duckduckgo.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/e2b.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/eleven_labs.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/email.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/evm.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/exa.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/fal.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/file.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/file_generation.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/financial_datasets.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/firecrawl.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/giphy.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/github.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/gmail.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/google_bigquery.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/google_maps.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/googlecalendar.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/googlesearch.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/googlesheets.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/hackernews.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/jina.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/jira.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/knowledge.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/linear.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/linkup.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/local_file_system.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/lumalab.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/mem0.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/memori.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/memory.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/gemini.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/groq.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/morph.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models/nebius.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/models_labs.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/moviepy_video.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/neo4j.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/newspaper.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/newspaper4k.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/openbb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/opencv.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/openweather.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/oxylabs.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/pandas.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/postgres.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/pubmed.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/python.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/reasoning.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/reddit.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/replicate.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/resend.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/scrapegraph.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/searxng.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/serpapi.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/serper.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/shell.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/slack.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/sleep.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/spider.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/sql.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/streamlit/components.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/tavily.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/telegram.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/todoist.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/tool_registry.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/toolkit.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/trafilatura.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/trello.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/twilio.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/user_control_flow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/valyu.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/visualization.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/webbrowser.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/webex.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/website.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/webtools.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/whatsapp.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/wikipedia.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/workflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/x.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/yfinance.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/youtube.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/zendesk.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/zep.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/tools/zoom.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/audio.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/certs.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/code_execution.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/common.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/dttm.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/enum.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/env.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/events.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/format_str.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/functions.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/http.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/json_schema.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/knowledge.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/location.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/log.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/mcp.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/media.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/merge_dict.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/message.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/aws_claude.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/cohere.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/llama.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/mistral.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/models/watsonx.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/openai.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/pickle.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/pprint.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/prompts.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/reasoning.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/response.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/response_iterator.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/safe_formatter.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/shell.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/streamlit.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/string.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/team.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/timer.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/tools.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/web.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/whatsapp.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/utils/yaml_io.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/distance.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/search.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/__init__.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/condition.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/loop.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/parallel.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/router.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/step.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/steps.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno/workflow/types.py +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno.egg-info/requires.txt +0 -0
- {agno-2.0.7 → agno-2.0.8}/agno.egg-info/top_level.txt +0 -0
- {agno-2.0.7 → agno-2.0.8}/setup.cfg +0 -0
|
@@ -30,6 +30,7 @@ from pydantic import BaseModel
|
|
|
30
30
|
from agno.db.base import BaseDb, SessionType, UserMemory
|
|
31
31
|
from agno.exceptions import ModelProviderError, RunCancelledException, StopAgentRun
|
|
32
32
|
from agno.knowledge.knowledge import Knowledge
|
|
33
|
+
from agno.knowledge.types import KnowledgeFilter
|
|
33
34
|
from agno.media import Audio, File, Image, Video
|
|
34
35
|
from agno.memory import MemoryManager
|
|
35
36
|
from agno.models.base import Model
|
|
@@ -455,6 +456,11 @@ class Agent:
|
|
|
455
456
|
self.add_history_to_context = add_history_to_context
|
|
456
457
|
self.num_history_runs = num_history_runs
|
|
457
458
|
|
|
459
|
+
if add_history_to_context and not db:
|
|
460
|
+
log_warning(
|
|
461
|
+
"add_history_to_context is True, but no database has been assigned to the agent. History will not be added to the context."
|
|
462
|
+
)
|
|
463
|
+
|
|
458
464
|
self.store_media = store_media
|
|
459
465
|
|
|
460
466
|
self.knowledge = knowledge
|
|
@@ -711,6 +717,14 @@ class Agent:
|
|
|
711
717
|
# Determine the session_state
|
|
712
718
|
if session_state is None:
|
|
713
719
|
session_state = self.session_state or {}
|
|
720
|
+
else:
|
|
721
|
+
# If run session_state is provided, merge agent defaults under it
|
|
722
|
+
# This ensures run state takes precedence over agent defaults
|
|
723
|
+
if self.session_state:
|
|
724
|
+
base_state = self.session_state.copy()
|
|
725
|
+
merge_dictionaries(base_state, session_state)
|
|
726
|
+
session_state.clear()
|
|
727
|
+
session_state.update(base_state)
|
|
714
728
|
|
|
715
729
|
if user_id is not None:
|
|
716
730
|
session_state["current_user_id"] = user_id
|
|
@@ -1177,6 +1191,7 @@ class Agent:
|
|
|
1177
1191
|
run_response=run_response,
|
|
1178
1192
|
session=agent_session,
|
|
1179
1193
|
session_state=session_state,
|
|
1194
|
+
dependencies=run_dependencies,
|
|
1180
1195
|
user_id=user_id,
|
|
1181
1196
|
async_mode=False,
|
|
1182
1197
|
knowledge_filters=effective_filters,
|
|
@@ -1809,6 +1824,7 @@ class Agent:
|
|
|
1809
1824
|
run_response=run_response,
|
|
1810
1825
|
session=agent_session,
|
|
1811
1826
|
session_state=session_state,
|
|
1827
|
+
dependencies=run_dependencies,
|
|
1812
1828
|
user_id=user_id,
|
|
1813
1829
|
async_mode=True,
|
|
1814
1830
|
knowledge_filters=effective_filters,
|
|
@@ -3345,6 +3361,7 @@ class Agent:
|
|
|
3345
3361
|
run_response.content = model_response.content
|
|
3346
3362
|
run_response.content_type = "str"
|
|
3347
3363
|
|
|
3364
|
+
# Process reasoning content
|
|
3348
3365
|
if model_response_event.reasoning_content is not None:
|
|
3349
3366
|
model_response.reasoning_content = (
|
|
3350
3367
|
model_response.reasoning_content or ""
|
|
@@ -3358,12 +3375,12 @@ class Agent:
|
|
|
3358
3375
|
model_response.reasoning_content += model_response_event.redacted_reasoning_content
|
|
3359
3376
|
run_response.reasoning_content = model_response.reasoning_content
|
|
3360
3377
|
|
|
3378
|
+
# Handle provider data (one chunk)
|
|
3361
3379
|
if model_response_event.provider_data is not None:
|
|
3362
|
-
|
|
3363
|
-
run_response.model_provider_data = model_response.provider_data
|
|
3380
|
+
run_response.model_provider_data = model_response_event.provider_data
|
|
3364
3381
|
|
|
3382
|
+
# Handle citations (one chunk)
|
|
3365
3383
|
if model_response_event.citations is not None:
|
|
3366
|
-
# We get citations in one chunk
|
|
3367
3384
|
run_response.citations = model_response_event.citations
|
|
3368
3385
|
|
|
3369
3386
|
# Only yield if we have content to show
|
|
@@ -3790,29 +3807,21 @@ class Agent:
|
|
|
3790
3807
|
|
|
3791
3808
|
# If any of the tools has "agent" as parameter, set _rebuild_tools to True
|
|
3792
3809
|
for tool in agent_tools:
|
|
3810
|
+
param_names = {"agent", "session_state", "team", "images", "videos", "audios", "files"}
|
|
3811
|
+
|
|
3793
3812
|
if isinstance(tool, Function):
|
|
3794
|
-
if
|
|
3795
|
-
self._rebuild_tools = True
|
|
3796
|
-
break
|
|
3797
|
-
if "team" in tool.parameters:
|
|
3813
|
+
if param_names & set(tool.parameters):
|
|
3798
3814
|
self._rebuild_tools = True
|
|
3799
3815
|
break
|
|
3800
|
-
|
|
3816
|
+
elif isinstance(tool, Toolkit):
|
|
3801
3817
|
for func in tool.functions.values():
|
|
3802
|
-
if
|
|
3818
|
+
if param_names & set(func.parameters):
|
|
3803
3819
|
self._rebuild_tools = True
|
|
3804
3820
|
break
|
|
3805
|
-
|
|
3806
|
-
self._rebuild_tools = True
|
|
3807
|
-
break
|
|
3808
|
-
if callable(tool):
|
|
3821
|
+
elif callable(tool):
|
|
3809
3822
|
from inspect import signature
|
|
3810
3823
|
|
|
3811
|
-
|
|
3812
|
-
if "agent" in sig.parameters:
|
|
3813
|
-
self._rebuild_tools = True
|
|
3814
|
-
break
|
|
3815
|
-
if "team" in sig.parameters:
|
|
3824
|
+
if param_names & set(signature(tool).parameters):
|
|
3816
3825
|
self._rebuild_tools = True
|
|
3817
3826
|
break
|
|
3818
3827
|
|
|
@@ -4007,6 +4016,7 @@ class Agent:
|
|
|
4007
4016
|
run_response: RunOutput,
|
|
4008
4017
|
session: AgentSession,
|
|
4009
4018
|
session_state: Optional[Dict[str, Any]] = None,
|
|
4019
|
+
dependencies: Optional[Dict[str, Any]] = None,
|
|
4010
4020
|
user_id: Optional[str] = None,
|
|
4011
4021
|
async_mode: bool = False,
|
|
4012
4022
|
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
@@ -4116,6 +4126,7 @@ class Agent:
|
|
|
4116
4126
|
|
|
4117
4127
|
for func in self._functions_for_model.values():
|
|
4118
4128
|
func._session_state = session_state
|
|
4129
|
+
func._dependencies = dependencies
|
|
4119
4130
|
func._images = joint_images
|
|
4120
4131
|
func._files = joint_files
|
|
4121
4132
|
func._audios = joint_audios
|
|
@@ -4244,7 +4255,8 @@ class Agent:
|
|
|
4244
4255
|
def _update_session_state(self, session: AgentSession, session_state: Dict[str, Any]):
|
|
4245
4256
|
"""Load the existing Agent from an AgentSession (from the database)"""
|
|
4246
4257
|
|
|
4247
|
-
# Get the session_state from the database and
|
|
4258
|
+
# Get the session_state from the database and merge with proper precedence
|
|
4259
|
+
# At this point session_state contains: agent_defaults + run_params
|
|
4248
4260
|
if session.session_data is not None and "session_state" in session.session_data:
|
|
4249
4261
|
session_state_from_db = session.session_data.get("session_state")
|
|
4250
4262
|
|
|
@@ -4253,10 +4265,11 @@ class Agent:
|
|
|
4253
4265
|
and isinstance(session_state_from_db, dict)
|
|
4254
4266
|
and len(session_state_from_db) > 0
|
|
4255
4267
|
):
|
|
4256
|
-
# This
|
|
4257
|
-
|
|
4258
|
-
merge_dictionaries(
|
|
4259
|
-
session_state
|
|
4268
|
+
# This preserves precedence: run_params > db_state > agent_defaults
|
|
4269
|
+
merged_state = session_state_from_db.copy()
|
|
4270
|
+
merge_dictionaries(merged_state, session_state)
|
|
4271
|
+
session_state.clear()
|
|
4272
|
+
session_state.update(merged_state)
|
|
4260
4273
|
|
|
4261
4274
|
# Update the session_state in the session
|
|
4262
4275
|
if session.session_data is not None:
|
|
@@ -4933,7 +4946,7 @@ class Agent:
|
|
|
4933
4946
|
system_message_content += f"{get_response_model_format_prompt(self.output_schema)}"
|
|
4934
4947
|
|
|
4935
4948
|
# 3.3.15 Add the session state to the system message
|
|
4936
|
-
if
|
|
4949
|
+
if add_session_state_to_context and session_state is not None:
|
|
4937
4950
|
system_message_content += self._get_formatted_session_state_for_system_message(session_state)
|
|
4938
4951
|
|
|
4939
4952
|
# Return the system message
|
|
@@ -5204,9 +5217,16 @@ class Agent:
|
|
|
5204
5217
|
if add_history_to_context:
|
|
5205
5218
|
from copy import deepcopy
|
|
5206
5219
|
|
|
5220
|
+
# Only skip messages from history when system_message_role is NOT a standard conversation role.
|
|
5221
|
+
# Standard conversation roles ("user", "assistant", "tool") should never be filtered
|
|
5222
|
+
# to preserve conversation continuity.
|
|
5223
|
+
skip_role = (
|
|
5224
|
+
self.system_message_role if self.system_message_role not in ["user", "assistant", "tool"] else None
|
|
5225
|
+
)
|
|
5226
|
+
|
|
5207
5227
|
history: List[Message] = session.get_messages_from_last_n_runs(
|
|
5208
5228
|
last_n=self.num_history_runs,
|
|
5209
|
-
skip_role=
|
|
5229
|
+
skip_role=skip_role,
|
|
5210
5230
|
agent_id=self.id if self.team_id is not None else None,
|
|
5211
5231
|
)
|
|
5212
5232
|
|
|
@@ -5924,6 +5944,7 @@ class Agent:
|
|
|
5924
5944
|
min_steps=self.reasoning_min_steps,
|
|
5925
5945
|
max_steps=self.reasoning_max_steps,
|
|
5926
5946
|
tools=self.tools,
|
|
5947
|
+
tool_call_limit=self.tool_call_limit,
|
|
5927
5948
|
use_json_mode=self.use_json_mode,
|
|
5928
5949
|
telemetry=self.telemetry,
|
|
5929
5950
|
debug_mode=self.debug_mode,
|
|
@@ -6149,6 +6170,7 @@ class Agent:
|
|
|
6149
6170
|
min_steps=self.reasoning_min_steps,
|
|
6150
6171
|
max_steps=self.reasoning_max_steps,
|
|
6151
6172
|
tools=self.tools,
|
|
6173
|
+
tool_call_limit=self.tool_call_limit,
|
|
6152
6174
|
use_json_mode=self.use_json_mode,
|
|
6153
6175
|
telemetry=self.telemetry,
|
|
6154
6176
|
debug_mode=self.debug_mode,
|
|
@@ -6720,17 +6742,18 @@ class Agent:
|
|
|
6720
6742
|
) -> Function:
|
|
6721
6743
|
"""Factory function to create a search_knowledge_base function with filters."""
|
|
6722
6744
|
|
|
6723
|
-
def search_knowledge_base(query: str, filters: Optional[
|
|
6745
|
+
def search_knowledge_base(query: str, filters: Optional[List[KnowledgeFilter]] = None) -> str:
|
|
6724
6746
|
"""Use this function to search the knowledge base for information about a query.
|
|
6725
6747
|
|
|
6726
6748
|
Args:
|
|
6727
6749
|
query: The query to search for.
|
|
6728
|
-
filters: The filters to apply to the search. This is a
|
|
6750
|
+
filters (optional): The filters to apply to the search. This is a list of KnowledgeFilter objects.
|
|
6729
6751
|
|
|
6730
6752
|
Returns:
|
|
6731
6753
|
str: A string containing the response from the knowledge base.
|
|
6732
6754
|
"""
|
|
6733
|
-
|
|
6755
|
+
filters_dict = {filt.key: filt.value for filt in filters} if filters else None
|
|
6756
|
+
search_filters = get_agentic_or_user_search_filters(filters_dict, knowledge_filters)
|
|
6734
6757
|
|
|
6735
6758
|
# Get the relevant documents from the knowledge base, passing filters
|
|
6736
6759
|
retrieval_timer = Timer()
|
|
@@ -6753,17 +6776,18 @@ class Agent:
|
|
|
6753
6776
|
return "No documents found"
|
|
6754
6777
|
return self._convert_documents_to_string(docs_from_knowledge)
|
|
6755
6778
|
|
|
6756
|
-
async def asearch_knowledge_base(query: str, filters: Optional[
|
|
6779
|
+
async def asearch_knowledge_base(query: str, filters: Optional[List[KnowledgeFilter]] = None) -> str:
|
|
6757
6780
|
"""Use this function to search the knowledge base for information about a query asynchronously.
|
|
6758
6781
|
|
|
6759
6782
|
Args:
|
|
6760
6783
|
query: The query to search for.
|
|
6761
|
-
filters: The filters to apply to the search. This is a
|
|
6784
|
+
filters (optional): The filters to apply to the search. This is a list of KnowledgeFilter objects.
|
|
6762
6785
|
|
|
6763
6786
|
Returns:
|
|
6764
6787
|
str: A string containing the response from the knowledge base.
|
|
6765
6788
|
"""
|
|
6766
|
-
|
|
6789
|
+
filters_dict = {filt.key: filt.value for filt in filters} if filters else None
|
|
6790
|
+
search_filters = get_agentic_or_user_search_filters(filters_dict, knowledge_filters)
|
|
6767
6791
|
|
|
6768
6792
|
retrieval_timer = Timer()
|
|
6769
6793
|
retrieval_timer.start()
|
|
@@ -6894,21 +6918,21 @@ class Agent:
|
|
|
6894
6918
|
stream: Optional[bool] = None,
|
|
6895
6919
|
stream_intermediate_steps: Optional[bool] = None,
|
|
6896
6920
|
markdown: Optional[bool] = None,
|
|
6921
|
+
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
6922
|
+
add_history_to_context: Optional[bool] = None,
|
|
6923
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
6924
|
+
dependencies: Optional[Dict[str, Any]] = None,
|
|
6925
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
6926
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
6927
|
+
debug_mode: Optional[bool] = None,
|
|
6897
6928
|
show_message: bool = True,
|
|
6898
6929
|
show_reasoning: bool = True,
|
|
6899
6930
|
show_full_reasoning: bool = False,
|
|
6900
6931
|
console: Optional[Any] = None,
|
|
6901
6932
|
# Add tags to include in markdown content
|
|
6902
6933
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
6903
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
6904
|
-
add_history_to_context: Optional[bool] = None,
|
|
6905
|
-
dependencies: Optional[Dict[str, Any]] = None,
|
|
6906
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
6907
|
-
debug_mode: Optional[bool] = None,
|
|
6908
6934
|
**kwargs: Any,
|
|
6909
6935
|
) -> None:
|
|
6910
|
-
add_history = add_history_to_context if add_history_to_context is not None else self.add_history_to_context
|
|
6911
|
-
|
|
6912
6936
|
if not tags_to_include_in_markdown:
|
|
6913
6937
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
6914
6938
|
|
|
@@ -6945,8 +6969,10 @@ class Agent:
|
|
|
6945
6969
|
show_full_reasoning=show_full_reasoning,
|
|
6946
6970
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
6947
6971
|
console=console,
|
|
6948
|
-
add_history_to_context=
|
|
6972
|
+
add_history_to_context=add_history_to_context,
|
|
6949
6973
|
dependencies=dependencies,
|
|
6974
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
6975
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
6950
6976
|
metadata=metadata,
|
|
6951
6977
|
**kwargs,
|
|
6952
6978
|
)
|
|
@@ -6971,8 +6997,10 @@ class Agent:
|
|
|
6971
6997
|
show_full_reasoning=show_full_reasoning,
|
|
6972
6998
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
6973
6999
|
console=console,
|
|
6974
|
-
add_history_to_context=
|
|
7000
|
+
add_history_to_context=add_history_to_context,
|
|
6975
7001
|
dependencies=dependencies,
|
|
7002
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
7003
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
6976
7004
|
metadata=metadata,
|
|
6977
7005
|
**kwargs,
|
|
6978
7006
|
)
|
|
@@ -6991,21 +7019,21 @@ class Agent:
|
|
|
6991
7019
|
stream: Optional[bool] = None,
|
|
6992
7020
|
stream_intermediate_steps: Optional[bool] = None,
|
|
6993
7021
|
markdown: Optional[bool] = None,
|
|
7022
|
+
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
7023
|
+
add_history_to_context: Optional[bool] = None,
|
|
7024
|
+
dependencies: Optional[Dict[str, Any]] = None,
|
|
7025
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
7026
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
7027
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
7028
|
+
debug_mode: Optional[bool] = None,
|
|
6994
7029
|
show_message: bool = True,
|
|
6995
7030
|
show_reasoning: bool = True,
|
|
6996
7031
|
show_full_reasoning: bool = False,
|
|
6997
7032
|
console: Optional[Any] = None,
|
|
6998
7033
|
# Add tags to include in markdown content
|
|
6999
7034
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
7000
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
7001
|
-
add_history_to_context: Optional[bool] = None,
|
|
7002
|
-
dependencies: Optional[Dict[str, Any]] = None,
|
|
7003
|
-
metadata: Optional[Dict[str, Any]] = None,
|
|
7004
|
-
debug_mode: Optional[bool] = None,
|
|
7005
7035
|
**kwargs: Any,
|
|
7006
7036
|
) -> None:
|
|
7007
|
-
add_history = add_history_to_context if add_history_to_context is not None else self.add_history_to_context
|
|
7008
|
-
|
|
7009
7037
|
if not tags_to_include_in_markdown:
|
|
7010
7038
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
7011
7039
|
|
|
@@ -7041,8 +7069,10 @@ class Agent:
|
|
|
7041
7069
|
show_full_reasoning=show_full_reasoning,
|
|
7042
7070
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
7043
7071
|
console=console,
|
|
7044
|
-
add_history_to_context=
|
|
7072
|
+
add_history_to_context=add_history_to_context,
|
|
7045
7073
|
dependencies=dependencies,
|
|
7074
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
7075
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
7046
7076
|
metadata=metadata,
|
|
7047
7077
|
**kwargs,
|
|
7048
7078
|
)
|
|
@@ -7066,8 +7096,10 @@ class Agent:
|
|
|
7066
7096
|
show_full_reasoning=show_full_reasoning,
|
|
7067
7097
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
7068
7098
|
console=console,
|
|
7069
|
-
add_history_to_context=
|
|
7099
|
+
add_history_to_context=add_history_to_context,
|
|
7070
7100
|
dependencies=dependencies,
|
|
7101
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
7102
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
7071
7103
|
metadata=metadata,
|
|
7072
7104
|
**kwargs,
|
|
7073
7105
|
)
|
|
@@ -47,10 +47,10 @@ def convert_v1_metrics_to_v2(metrics_dict: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def convert_any_metrics_in_data(data: Any) -> Any:
|
|
50
|
-
"""Recursively find and convert any metrics dictionaries
|
|
50
|
+
"""Recursively find and convert any metrics dictionaries and handle v1 to v2 field conversion."""
|
|
51
51
|
if isinstance(data, dict):
|
|
52
|
-
# First
|
|
53
|
-
data =
|
|
52
|
+
# First apply v1 to v2 field conversion (handles extra_data extraction, thinking/reasoning_content consolidation, etc.)
|
|
53
|
+
data = convert_v1_fields_to_v2(data)
|
|
54
54
|
|
|
55
55
|
# Check if this looks like a metrics dictionary
|
|
56
56
|
if _is_metrics_dict(data):
|
|
@@ -114,11 +114,11 @@ def _is_metrics_dict(data: Dict[str, Any]) -> bool:
|
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
def convert_session_data_comprehensively(session_data: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
|
|
117
|
-
"""Comprehensively convert
|
|
117
|
+
"""Comprehensively convert session data from v1 to v2 format, including metrics conversion and field mapping."""
|
|
118
118
|
if not session_data:
|
|
119
119
|
return session_data
|
|
120
120
|
|
|
121
|
-
# Use the recursive converter to
|
|
121
|
+
# Use the recursive converter to handle all v1 to v2 conversions (metrics, field mapping, extra_data extraction, etc.)
|
|
122
122
|
return convert_any_metrics_in_data(session_data)
|
|
123
123
|
|
|
124
124
|
|
|
@@ -145,21 +145,150 @@ def safe_get_runs_from_memory(memory_data: Any) -> Any:
|
|
|
145
145
|
return None
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
def
|
|
149
|
-
"""
|
|
148
|
+
def convert_v1_media_to_v2(media_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
149
|
+
"""Convert v1 media objects to v2 format."""
|
|
150
|
+
if not isinstance(media_data, dict):
|
|
151
|
+
return media_data
|
|
152
|
+
|
|
153
|
+
# Create a copy to avoid modifying the original
|
|
154
|
+
v2_media = media_data.copy()
|
|
155
|
+
|
|
156
|
+
# Add id if missing (required in v2)
|
|
157
|
+
if "id" not in v2_media or v2_media["id"] is None:
|
|
158
|
+
from uuid import uuid4
|
|
159
|
+
|
|
160
|
+
v2_media["id"] = str(uuid4())
|
|
161
|
+
|
|
162
|
+
# Handle VideoArtifact → Video conversion
|
|
163
|
+
if "eta" in v2_media or "length" in v2_media:
|
|
164
|
+
# Convert length to duration if it's numeric
|
|
165
|
+
length = v2_media.pop("length", None)
|
|
166
|
+
if length and isinstance(length, (int, float)):
|
|
167
|
+
v2_media["duration"] = length
|
|
168
|
+
elif length and isinstance(length, str):
|
|
169
|
+
try:
|
|
170
|
+
v2_media["duration"] = float(length)
|
|
171
|
+
except ValueError:
|
|
172
|
+
pass # Keep as is if not convertible
|
|
173
|
+
|
|
174
|
+
# Handle AudioArtifact → Audio conversion
|
|
175
|
+
if "base64_audio" in v2_media:
|
|
176
|
+
# Map base64_audio to content
|
|
177
|
+
base64_audio = v2_media.pop("base64_audio", None)
|
|
178
|
+
if base64_audio:
|
|
179
|
+
v2_media["content"] = base64_audio
|
|
180
|
+
|
|
181
|
+
# Handle AudioResponse content conversion (base64 string to bytes if needed)
|
|
182
|
+
if "transcript" in v2_media and "content" in v2_media:
|
|
183
|
+
content = v2_media.get("content")
|
|
184
|
+
if content and isinstance(content, str):
|
|
185
|
+
# Try to decode base64 content to bytes for v2
|
|
186
|
+
try:
|
|
187
|
+
import base64
|
|
188
|
+
|
|
189
|
+
v2_media["content"] = base64.b64decode(content)
|
|
190
|
+
except Exception:
|
|
191
|
+
# If not valid base64, keep as string
|
|
192
|
+
pass
|
|
193
|
+
|
|
194
|
+
# Ensure format and mime_type are set appropriately
|
|
195
|
+
if "format" in v2_media and "mime_type" not in v2_media:
|
|
196
|
+
format_val = v2_media["format"]
|
|
197
|
+
if format_val:
|
|
198
|
+
# Set mime_type based on format for common types
|
|
199
|
+
mime_type_map = {
|
|
200
|
+
"mp4": "video/mp4",
|
|
201
|
+
"mov": "video/quicktime",
|
|
202
|
+
"avi": "video/x-msvideo",
|
|
203
|
+
"webm": "video/webm",
|
|
204
|
+
"mp3": "audio/mpeg",
|
|
205
|
+
"wav": "audio/wav",
|
|
206
|
+
"ogg": "audio/ogg",
|
|
207
|
+
"png": "image/png",
|
|
208
|
+
"jpg": "image/jpeg",
|
|
209
|
+
"jpeg": "image/jpeg",
|
|
210
|
+
"gif": "image/gif",
|
|
211
|
+
"webp": "image/webp",
|
|
212
|
+
}
|
|
213
|
+
if format_val.lower() in mime_type_map:
|
|
214
|
+
v2_media["mime_type"] = mime_type_map[format_val.lower()]
|
|
215
|
+
|
|
216
|
+
return v2_media
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def convert_v1_fields_to_v2(data: Dict[str, Any]) -> Dict[str, Any]:
|
|
220
|
+
"""Convert v1 fields to v2 format with proper field mapping and extraction."""
|
|
150
221
|
if not isinstance(data, dict):
|
|
151
222
|
return data
|
|
152
223
|
|
|
153
|
-
#
|
|
224
|
+
# Create a copy to avoid modifying the original
|
|
225
|
+
v2_data = data.copy()
|
|
226
|
+
|
|
227
|
+
# Fields that should be completely ignored/removed in v2
|
|
154
228
|
deprecated_fields = {
|
|
155
229
|
"team_session_id", # RunOutput v1 field, removed in v2
|
|
156
230
|
"formatted_tool_calls", # RunOutput v1 field, removed in v2
|
|
231
|
+
"event", # Remove event field
|
|
232
|
+
"events", # Remove events field
|
|
157
233
|
# Add other deprecated fields here as needed
|
|
158
234
|
}
|
|
159
235
|
|
|
160
|
-
#
|
|
161
|
-
|
|
162
|
-
|
|
236
|
+
# Extract and map fields from extra_data before removing it
|
|
237
|
+
extra_data = v2_data.get("extra_data")
|
|
238
|
+
if extra_data and isinstance(extra_data, dict):
|
|
239
|
+
# Map extra_data fields to their v2 locations
|
|
240
|
+
if "add_messages" in extra_data:
|
|
241
|
+
v2_data["additional_input"] = extra_data["add_messages"]
|
|
242
|
+
if "references" in extra_data:
|
|
243
|
+
v2_data["references"] = extra_data["references"]
|
|
244
|
+
if "reasoning_steps" in extra_data:
|
|
245
|
+
v2_data["reasoning_steps"] = extra_data["reasoning_steps"]
|
|
246
|
+
if "reasoning_content" in extra_data:
|
|
247
|
+
# reasoning_content from extra_data also goes to reasoning_content
|
|
248
|
+
v2_data["reasoning_content"] = extra_data["reasoning_content"]
|
|
249
|
+
if "reasoning_messages" in extra_data:
|
|
250
|
+
v2_data["reasoning_messages"] = extra_data["reasoning_messages"]
|
|
251
|
+
|
|
252
|
+
# Handle thinking and reasoning_content consolidation
|
|
253
|
+
# Both thinking and reasoning_content from v1 should become reasoning_content in v2
|
|
254
|
+
thinking = v2_data.get("thinking")
|
|
255
|
+
reasoning_content = v2_data.get("reasoning_content")
|
|
256
|
+
|
|
257
|
+
# Consolidate thinking and reasoning_content into reasoning_content
|
|
258
|
+
if thinking and reasoning_content:
|
|
259
|
+
# Both exist, combine them (thinking first, then reasoning_content)
|
|
260
|
+
v2_data["reasoning_content"] = f"{thinking}\n{reasoning_content}"
|
|
261
|
+
elif thinking and not reasoning_content:
|
|
262
|
+
# Only thinking exists, move it to reasoning_content
|
|
263
|
+
v2_data["reasoning_content"] = thinking
|
|
264
|
+
# If only reasoning_content exists, keep it as is
|
|
265
|
+
|
|
266
|
+
# Remove thinking field since it's now consolidated into reasoning_content
|
|
267
|
+
if "thinking" in v2_data:
|
|
268
|
+
del v2_data["thinking"]
|
|
269
|
+
|
|
270
|
+
# Handle media object conversions
|
|
271
|
+
media_fields = ["images", "videos", "audio", "response_audio"]
|
|
272
|
+
for field in media_fields:
|
|
273
|
+
if field in v2_data and v2_data[field]:
|
|
274
|
+
if isinstance(v2_data[field], list):
|
|
275
|
+
# Handle list of media objects
|
|
276
|
+
v2_data[field] = [
|
|
277
|
+
convert_v1_media_to_v2(item) if isinstance(item, dict) else item for item in v2_data[field]
|
|
278
|
+
]
|
|
279
|
+
elif isinstance(v2_data[field], dict):
|
|
280
|
+
# Handle single media object
|
|
281
|
+
v2_data[field] = convert_v1_media_to_v2(v2_data[field])
|
|
282
|
+
|
|
283
|
+
# Remove extra_data after extraction
|
|
284
|
+
if "extra_data" in v2_data:
|
|
285
|
+
del v2_data["extra_data"]
|
|
286
|
+
|
|
287
|
+
# Remove other deprecated fields
|
|
288
|
+
for field in deprecated_fields:
|
|
289
|
+
v2_data.pop(field, None)
|
|
290
|
+
|
|
291
|
+
return v2_data
|
|
163
292
|
|
|
164
293
|
|
|
165
294
|
def migrate(
|
|
@@ -27,9 +27,9 @@ class SentenceTransformerEmbedder(Embedder):
|
|
|
27
27
|
|
|
28
28
|
def get_embedding(self, text: Union[str, List[str]]) -> List[float]:
|
|
29
29
|
if not self.sentence_transformer_client:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
self.sentence_transformer_client = SentenceTransformer(model_name_or_path=self.id)
|
|
31
|
+
|
|
32
|
+
model = self.sentence_transformer_client
|
|
33
33
|
embedding = model.encode(text, prompt=self.prompt, normalize_embeddings=self.normalize_embeddings)
|
|
34
34
|
try:
|
|
35
35
|
if isinstance(embedding, np.ndarray):
|