agno 2.0.2__tar.gz → 2.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agno-2.0.2 → agno-2.0.3}/PKG-INFO +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/agent/agent.py +2 -1
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/fixed.py +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/base.py +3 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/csv_reader.py +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/json_reader.py +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/markdown_reader.py +5 -5
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/s3_reader.py +0 -12
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/text_reader.py +5 -5
- {agno-2.0.2 → agno-2.0.3}/agno/models/cerebras/cerebras.py +5 -3
- {agno-2.0.2 → agno-2.0.3}/agno/models/cerebras/cerebras_openai.py +5 -3
- {agno-2.0.2 → agno-2.0.3}/agno/models/google/gemini.py +33 -11
- {agno-2.0.2 → agno-2.0.3}/agno/models/litellm/chat.py +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/models/openai/responses.py +75 -40
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/slack/router.py +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/whatsapp/router.py +2 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/router.py +60 -22
- {agno-2.0.2 → agno-2.0.3}/agno/run/agent.py +5 -2
- {agno-2.0.2 → agno-2.0.3}/agno/run/base.py +6 -3
- {agno-2.0.2 → agno-2.0.3}/agno/run/team.py +11 -3
- {agno-2.0.2 → agno-2.0.3}/agno/run/workflow.py +5 -2
- {agno-2.0.2 → agno-2.0.3}/agno/team/team.py +4 -1
- {agno-2.0.2 → agno-2.0.3}/agno/tools/mcp.py +1 -0
- agno-2.0.3/agno/tools/memory.py +391 -0
- agno-2.0.3/agno/tools/workflow.py +279 -0
- agno-2.0.3/agno/utils/audio.py +49 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/print_response/agent.py +6 -2
- {agno-2.0.2 → agno-2.0.3}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.0.2 → agno-2.0.3}/agno.egg-info/SOURCES.txt +2 -0
- {agno-2.0.2 → agno-2.0.3}/pyproject.toml +1 -1
- agno-2.0.2/agno/utils/audio.py +0 -22
- {agno-2.0.2 → agno-2.0.3}/LICENSE +0 -0
- {agno-2.0.2 → agno-2.0.3}/README.md +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/agent/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/agent.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/api.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/evals.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/os.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/routes.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/agent.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/evals.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/os.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/response.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/team.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/schemas/workflows.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/settings.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/team.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/api/workflow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/cloud/aws/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/dynamo/dynamo.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/dynamo/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/firestore/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/firestore/firestore.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/firestore/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/firestore/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/in_memory/in_memory_db.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/in_memory/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/json/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/json/json_db.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/json/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/migrations/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mongo/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mongo/mongo.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mongo/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mongo/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mysql/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mysql/mysql.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mysql/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/mysql/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/postgres/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/postgres/postgres.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/postgres/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/postgres/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/redis/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/redis/redis.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/redis/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/redis/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/schemas/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/schemas/evals.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/schemas/memory.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/schemas/metrics.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/singlestore/singlestore.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/singlestore/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/sqlite/sqlite.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/sqlite/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/db/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/debug.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/eval/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/eval/accuracy.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/eval/performance.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/eval/reliability.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/eval/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/exceptions.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/integrations/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/integrations/discord/client.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/content.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/document/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/aws_bedrock.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/knowledge.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/url_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/types.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/knowledge/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/media.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/memory/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/memory/manager.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/anthropic/claude.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/aws/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/aws/bedrock.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/aws/claude.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/azure/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/cohere/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/cohere/chat.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/defaults.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/google/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/groq/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/groq/groq.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/ibm/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/internlm/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/internlm/internlm.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/langdb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/langdb/langdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/litellm/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/message.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/meta/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/meta/llama.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/metrics.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/mistral/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/mistral/mistral.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/nebius/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/nebius/nebius.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/ollama/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/ollama/chat.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/openai/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/openai/chat.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/openai/like.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/portkey/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/portkey/portkey.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/response.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/together/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/together/together.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/vercel/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/vercel/v0.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/vllm/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/vllm/vllm.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/xai/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/models/xai/xai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/app.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/auth.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/config.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/agui/agui.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/agui/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/slack/slack.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/mcp.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/evals/evals.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/knowledge/knowledge.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/memory/memory.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/metrics/metrics.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/routers/session/session.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/schema.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/settings.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/os/utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/py.typed +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/deepseek.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/default.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/groq.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/helpers.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/ollama.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/reasoning/step.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/run/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/run/cancel.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/run/messages.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/session/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/session/agent.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/session/summary.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/session/team.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/session/workflow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/team/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/agentql.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/airflow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/api.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/apify.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/arxiv.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/aws_lambda.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/aws_ses.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/baidusearch.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/bitbucket.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/brandfetch.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/bravesearch.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/brightdata.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/browserbase.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/calcom.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/calculator.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/cartesia.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/clickup.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/confluence.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/crawl4ai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/dalle.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/daytona.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/decorator.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/desi_vocal.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/discord.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/docker.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/duckdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/duckduckgo.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/e2b.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/eleven_labs.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/email.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/evm.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/exa.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/fal.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/file.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/financial_datasets.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/firecrawl.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/function.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/giphy.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/github.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/gmail.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/google_bigquery.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/google_maps.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/googlecalendar.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/googlesearch.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/googlesheets.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/hackernews.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/jina.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/jira.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/knowledge.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/linear.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/linkup.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/local_file_system.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/lumalab.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/mem0.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/memori.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/gemini.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/groq.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/morph.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models/nebius.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/models_labs.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/moviepy_video.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/neo4j.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/newspaper.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/newspaper4k.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/openbb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/opencv.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/openweather.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/oxylabs.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/pandas.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/postgres.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/pubmed.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/python.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/reasoning.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/reddit.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/replicate.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/resend.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/scrapegraph.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/searxng.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/serpapi.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/serper.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/shell.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/slack.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/sleep.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/spider.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/sql.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/streamlit/components.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/tavily.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/telegram.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/todoist.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/tool_registry.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/toolkit.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/trafilatura.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/trello.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/twilio.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/user_control_flow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/valyu.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/visualization.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/webbrowser.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/webex.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/website.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/webtools.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/whatsapp.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/wikipedia.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/x.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/yfinance.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/youtube.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/zendesk.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/zep.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/tools/zoom.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/certs.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/code_execution.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/common.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/dttm.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/enum.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/env.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/events.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/format_str.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/functions.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/gemini.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/http.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/json_schema.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/knowledge.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/location.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/log.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/mcp.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/media.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/merge_dict.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/message.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/aws_claude.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/claude.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/cohere.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/llama.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/mistral.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/models/watsonx.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/openai.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/pickle.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/pprint.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/print_response/team.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/prompts.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/reasoning.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/response.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/response_iterator.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/safe_formatter.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/shell.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/streamlit.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/string.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/team.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/timer.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/tools.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/web.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/whatsapp.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/utils/yaml_io.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/base.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/distance.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/search.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/__init__.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/condition.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/loop.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/parallel.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/router.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/step.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/steps.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/types.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno/workflow/workflow.py +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno.egg-info/requires.txt +0 -0
- {agno-2.0.2 → agno-2.0.3}/agno.egg-info/top_level.txt +0 -0
- {agno-2.0.2 → agno-2.0.3}/setup.cfg +0 -0
|
@@ -4518,7 +4518,8 @@ class Agent:
|
|
|
4518
4518
|
session = self.get_session(session_id=session_id) # type: ignore
|
|
4519
4519
|
|
|
4520
4520
|
if session is None:
|
|
4521
|
-
|
|
4521
|
+
log_warning(f"Session {session_id} not found")
|
|
4522
|
+
return []
|
|
4522
4523
|
|
|
4523
4524
|
# Only filter by agent_id if this is part of a team
|
|
4524
4525
|
return session.get_messages_from_last_n_runs(
|
|
@@ -7,7 +7,7 @@ from agno.knowledge.document.base import Document
|
|
|
7
7
|
class FixedSizeChunking(ChunkingStrategy):
|
|
8
8
|
"""Chunking strategy that splits text into fixed-size chunks with optional overlap"""
|
|
9
9
|
|
|
10
|
-
def __init__(self, chunk_size: int =
|
|
10
|
+
def __init__(self, chunk_size: int = 5000, overlap: int = 0):
|
|
11
11
|
# overlap must be less than chunk size
|
|
12
12
|
if overlap >= chunk_size:
|
|
13
13
|
raise ValueError(f"Invalid parameters: overlap ({overlap}) must be less than chunk size ({chunk_size}).")
|
|
@@ -19,6 +19,7 @@ class Reader:
|
|
|
19
19
|
name: Optional[str] = None
|
|
20
20
|
description: Optional[str] = None
|
|
21
21
|
max_results: int = 5 # Maximum number of results to return (useful for search-based readers)
|
|
22
|
+
encoding: Optional[str] = None
|
|
22
23
|
|
|
23
24
|
def __init__(
|
|
24
25
|
self,
|
|
@@ -29,6 +30,7 @@ class Reader:
|
|
|
29
30
|
name: Optional[str] = None,
|
|
30
31
|
description: Optional[str] = None,
|
|
31
32
|
max_results: int = 5,
|
|
33
|
+
encoding: Optional[str] = None,
|
|
32
34
|
**kwargs,
|
|
33
35
|
) -> None:
|
|
34
36
|
self.chunk = chunk
|
|
@@ -40,6 +42,7 @@ class Reader:
|
|
|
40
42
|
self.name = name
|
|
41
43
|
self.description = description
|
|
42
44
|
self.max_results = max_results
|
|
45
|
+
self.encoding = encoding
|
|
43
46
|
|
|
44
47
|
def set_chunking_strategy_from_string(self, strategy_name: str, **kwargs) -> None:
|
|
45
48
|
"""Set the chunking strategy from a string name."""
|
|
@@ -47,7 +47,7 @@ class CSVReader(Reader):
|
|
|
47
47
|
if not file.exists():
|
|
48
48
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
49
49
|
logger.info(f"Reading: {file}")
|
|
50
|
-
file_content = file.open(newline="", mode="r", encoding="utf-8")
|
|
50
|
+
file_content = file.open(newline="", mode="r", encoding=self.encoding or "utf-8")
|
|
51
51
|
else:
|
|
52
52
|
logger.info(f"Reading retrieved file: {name or file.name}")
|
|
53
53
|
file.seek(0)
|
|
@@ -43,7 +43,7 @@ class JSONReader(Reader):
|
|
|
43
43
|
raise FileNotFoundError(f"Could not find file: {path}")
|
|
44
44
|
log_info(f"Reading: {path}")
|
|
45
45
|
json_name = name or path.name.split(".")[0]
|
|
46
|
-
json_contents = json.loads(path.read_text("utf-8"))
|
|
46
|
+
json_contents = json.loads(path.read_text(self.encoding or "utf-8"))
|
|
47
47
|
|
|
48
48
|
elif isinstance(path, BytesIO):
|
|
49
49
|
json_name = name or path.name.split(".")[0]
|
|
@@ -67,12 +67,12 @@ class MarkdownReader(Reader):
|
|
|
67
67
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
68
68
|
log_info(f"Reading: {file}")
|
|
69
69
|
file_name = name or file.stem
|
|
70
|
-
file_contents = file.read_text("utf-8")
|
|
70
|
+
file_contents = file.read_text(encoding=self.encoding or "utf-8")
|
|
71
71
|
else:
|
|
72
72
|
log_info(f"Reading uploaded file: {file.name}")
|
|
73
73
|
file_name = name or file.name.split(".")[0]
|
|
74
74
|
file.seek(0)
|
|
75
|
-
file_contents = file.read().decode("utf-8")
|
|
75
|
+
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
76
76
|
|
|
77
77
|
documents = [Document(name=file_name, id=str(uuid.uuid4()), content=file_contents)]
|
|
78
78
|
if self.chunk:
|
|
@@ -97,16 +97,16 @@ class MarkdownReader(Reader):
|
|
|
97
97
|
try:
|
|
98
98
|
import aiofiles
|
|
99
99
|
|
|
100
|
-
async with aiofiles.open(file, "r", encoding="utf-8") as f:
|
|
100
|
+
async with aiofiles.open(file, "r", encoding=self.encoding or "utf-8") as f:
|
|
101
101
|
file_contents = await f.read()
|
|
102
102
|
except ImportError:
|
|
103
103
|
logger.warning("aiofiles not installed, using synchronous file I/O")
|
|
104
|
-
file_contents = file.read_text("utf-8")
|
|
104
|
+
file_contents = file.read_text(self.encoding or "utf-8")
|
|
105
105
|
else:
|
|
106
106
|
log_info(f"Reading uploaded file asynchronously: {file.name}")
|
|
107
107
|
file_name = name or file.name.split(".")[0]
|
|
108
108
|
file.seek(0)
|
|
109
|
-
file_contents = file.read().decode("utf-8")
|
|
109
|
+
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
110
110
|
|
|
111
111
|
document = Document(
|
|
112
112
|
name=file_name,
|
|
@@ -74,18 +74,6 @@ class S3Reader(Reader):
|
|
|
74
74
|
obj_name = s3_object.name.split("/")[-1]
|
|
75
75
|
temporary_file = Path("storage").joinpath(obj_name)
|
|
76
76
|
s3_object.download(temporary_file)
|
|
77
|
-
|
|
78
|
-
# TODO: Before we were using textract here. Needed?
|
|
79
|
-
# s3_object.download(temporary_file)
|
|
80
|
-
# doc_content = textract.process(temporary_file)
|
|
81
|
-
# documents = [
|
|
82
|
-
# Document(
|
|
83
|
-
# name=doc_name,
|
|
84
|
-
# id=doc_name,
|
|
85
|
-
# content=doc_content.decode("utf-8"),
|
|
86
|
-
# )
|
|
87
|
-
# ]
|
|
88
|
-
|
|
89
77
|
documents = TextReader().read(file=temporary_file, name=doc_name)
|
|
90
78
|
|
|
91
79
|
temporary_file.unlink()
|
|
@@ -39,12 +39,12 @@ class TextReader(Reader):
|
|
|
39
39
|
raise FileNotFoundError(f"Could not find file: {file}")
|
|
40
40
|
log_info(f"Reading: {file}")
|
|
41
41
|
file_name = name or file.stem
|
|
42
|
-
file_contents = file.read_text("utf-8")
|
|
42
|
+
file_contents = file.read_text(self.encoding or "utf-8")
|
|
43
43
|
else:
|
|
44
44
|
file_name = name or file.name.split(".")[0]
|
|
45
45
|
log_info(f"Reading uploaded file: {file_name}")
|
|
46
46
|
file.seek(0)
|
|
47
|
-
file_contents = file.read().decode("utf-8")
|
|
47
|
+
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
48
48
|
|
|
49
49
|
documents = [
|
|
50
50
|
Document(
|
|
@@ -75,16 +75,16 @@ class TextReader(Reader):
|
|
|
75
75
|
try:
|
|
76
76
|
import aiofiles
|
|
77
77
|
|
|
78
|
-
async with aiofiles.open(file, "r", encoding="utf-8") as f:
|
|
78
|
+
async with aiofiles.open(file, "r", encoding=self.encoding or "utf-8") as f:
|
|
79
79
|
file_contents = await f.read()
|
|
80
80
|
except ImportError:
|
|
81
81
|
logger.warning("aiofiles not installed, using synchronous file I/O")
|
|
82
|
-
file_contents = file.read_text("utf-8")
|
|
82
|
+
file_contents = file.read_text(self.encoding or "utf-8")
|
|
83
83
|
else:
|
|
84
84
|
log_info(f"Reading uploaded file asynchronously: {file.name}")
|
|
85
85
|
file_name = name or file.name.split(".")[0]
|
|
86
86
|
file.seek(0)
|
|
87
|
-
file_contents = file.read().decode("utf-8")
|
|
87
|
+
file_contents = file.read().decode(self.encoding or "utf-8")
|
|
88
88
|
|
|
89
89
|
document = Document(
|
|
90
90
|
name=file_name,
|
|
@@ -45,7 +45,7 @@ class Cerebras(Model):
|
|
|
45
45
|
supports_json_schema_outputs: bool = True
|
|
46
46
|
|
|
47
47
|
# Request parameters
|
|
48
|
-
parallel_tool_calls: bool =
|
|
48
|
+
parallel_tool_calls: Optional[bool] = None
|
|
49
49
|
max_completion_tokens: Optional[int] = None
|
|
50
50
|
repetition_penalty: Optional[float] = None
|
|
51
51
|
temperature: Optional[float] = None
|
|
@@ -166,7 +166,6 @@ class Cerebras(Model):
|
|
|
166
166
|
"type": "function",
|
|
167
167
|
"function": {
|
|
168
168
|
"name": tool["function"]["name"],
|
|
169
|
-
"strict": True, # Ensure strict adherence to expected outputs
|
|
170
169
|
"description": tool["function"]["description"],
|
|
171
170
|
"parameters": tool["function"]["parameters"],
|
|
172
171
|
},
|
|
@@ -174,7 +173,10 @@ class Cerebras(Model):
|
|
|
174
173
|
for tool in tools
|
|
175
174
|
]
|
|
176
175
|
# Cerebras requires parallel_tool_calls=False for llama-4-scout-17b-16e-instruct
|
|
177
|
-
|
|
176
|
+
if self.id == "llama-4-scout-17b-16e-instruct":
|
|
177
|
+
request_params["parallel_tool_calls"] = False
|
|
178
|
+
elif self.parallel_tool_calls is not None:
|
|
179
|
+
request_params["parallel_tool_calls"] = self.parallel_tool_calls
|
|
178
180
|
|
|
179
181
|
# Handle response format for structured outputs
|
|
180
182
|
if response_format is not None:
|
|
@@ -16,7 +16,7 @@ class CerebrasOpenAI(OpenAILike):
|
|
|
16
16
|
name: str = "CerebrasOpenAI"
|
|
17
17
|
provider: str = "CerebrasOpenAI"
|
|
18
18
|
|
|
19
|
-
parallel_tool_calls: bool =
|
|
19
|
+
parallel_tool_calls: Optional[bool] = None
|
|
20
20
|
base_url: str = "https://api.cerebras.ai/v1"
|
|
21
21
|
api_key: Optional[str] = getenv("CEREBRAS_API_KEY", None)
|
|
22
22
|
|
|
@@ -44,7 +44,6 @@ class CerebrasOpenAI(OpenAILike):
|
|
|
44
44
|
"type": "function",
|
|
45
45
|
"function": {
|
|
46
46
|
"name": tool["function"]["name"],
|
|
47
|
-
"strict": True, # Ensure strict adherence to expected outputs
|
|
48
47
|
"description": tool["function"]["description"],
|
|
49
48
|
"parameters": tool["function"]["parameters"],
|
|
50
49
|
},
|
|
@@ -52,7 +51,10 @@ class CerebrasOpenAI(OpenAILike):
|
|
|
52
51
|
for tool in tools
|
|
53
52
|
]
|
|
54
53
|
# Cerebras requires parallel_tool_calls=False for llama-4-scout-17b-16e-instruct
|
|
55
|
-
|
|
54
|
+
if self.id == "llama-4-scout-17b-16e-instruct":
|
|
55
|
+
request_params["parallel_tool_calls"] = False
|
|
56
|
+
elif self.parallel_tool_calls is not None:
|
|
57
|
+
request_params["parallel_tool_calls"] = self.parallel_tool_calls
|
|
56
58
|
|
|
57
59
|
if request_params:
|
|
58
60
|
log_debug(f"Calling {self.provider} with request parameters: {request_params}", log_level=2)
|
|
@@ -87,7 +87,7 @@ class Gemini(Model):
|
|
|
87
87
|
presence_penalty: Optional[float] = None
|
|
88
88
|
frequency_penalty: Optional[float] = None
|
|
89
89
|
seed: Optional[int] = None
|
|
90
|
-
response_modalities: Optional[list[str]] = None # "
|
|
90
|
+
response_modalities: Optional[list[str]] = None # "TEXT", "IMAGE", and/or "AUDIO"
|
|
91
91
|
speech_config: Optional[dict[str, Any]] = None
|
|
92
92
|
cached_content: Optional[Any] = None
|
|
93
93
|
thinking_budget: Optional[int] = None # Thinking budget for Gemini 2.5 models
|
|
@@ -817,11 +817,21 @@ class Gemini(Model):
|
|
|
817
817
|
model_response.content += content_str
|
|
818
818
|
|
|
819
819
|
if hasattr(part, "inline_data") and part.inline_data is not None:
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
820
|
+
# Handle audio responses (for TTS models)
|
|
821
|
+
if part.inline_data.mime_type and part.inline_data.mime_type.startswith("audio/"):
|
|
822
|
+
# Store raw bytes data
|
|
823
|
+
model_response.audio = Audio(
|
|
824
|
+
id=str(uuid4()),
|
|
825
|
+
content=part.inline_data.data,
|
|
826
|
+
mime_type=part.inline_data.mime_type,
|
|
827
|
+
)
|
|
828
|
+
# Image responses
|
|
829
|
+
else:
|
|
830
|
+
if model_response.images is None:
|
|
831
|
+
model_response.images = []
|
|
832
|
+
model_response.images.append(
|
|
833
|
+
Image(id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type)
|
|
834
|
+
)
|
|
825
835
|
|
|
826
836
|
# Extract function call if present
|
|
827
837
|
if hasattr(part, "function_call") and part.function_call is not None:
|
|
@@ -929,11 +939,23 @@ class Gemini(Model):
|
|
|
929
939
|
model_response.content += text_content
|
|
930
940
|
|
|
931
941
|
if hasattr(part, "inline_data") and part.inline_data is not None:
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
942
|
+
# Audio responses
|
|
943
|
+
if part.inline_data.mime_type and part.inline_data.mime_type.startswith("audio/"):
|
|
944
|
+
# Store raw bytes audio data
|
|
945
|
+
model_response.audio = Audio(
|
|
946
|
+
id=str(uuid4()),
|
|
947
|
+
content=part.inline_data.data,
|
|
948
|
+
mime_type=part.inline_data.mime_type,
|
|
949
|
+
)
|
|
950
|
+
# Image responses
|
|
951
|
+
else:
|
|
952
|
+
if model_response.images is None:
|
|
953
|
+
model_response.images = []
|
|
954
|
+
model_response.images.append(
|
|
955
|
+
Image(
|
|
956
|
+
id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type
|
|
957
|
+
)
|
|
958
|
+
)
|
|
937
959
|
|
|
938
960
|
# Extract function call if present
|
|
939
961
|
if hasattr(part, "function_call") and part.function_call is not None:
|
|
@@ -47,7 +47,7 @@ class LiteLLM(Model):
|
|
|
47
47
|
super().__post_init__()
|
|
48
48
|
|
|
49
49
|
# Set up API key from environment variable if not already set
|
|
50
|
-
if not self.api_key:
|
|
50
|
+
if not self.client and not self.api_key:
|
|
51
51
|
self.api_key = getenv("LITELLM_API_KEY")
|
|
52
52
|
if not self.api_key:
|
|
53
53
|
# Check for other present valid keys, e.g. OPENAI_API_KEY if self.id is an OpenAI model
|
|
@@ -20,9 +20,10 @@ from agno.utils.models.schema_utils import get_response_schema_for_provider
|
|
|
20
20
|
try:
|
|
21
21
|
from openai import APIConnectionError, APIStatusError, AsyncOpenAI, OpenAI, RateLimitError
|
|
22
22
|
from openai.types.responses.response import Response
|
|
23
|
+
from openai.types.responses.response_reasoning_item import ResponseReasoningItem
|
|
23
24
|
from openai.types.responses.response_stream_event import ResponseStreamEvent
|
|
24
25
|
from openai.types.responses.response_usage import ResponseUsage
|
|
25
|
-
except
|
|
26
|
+
except ImportError as e:
|
|
26
27
|
raise ImportError("`openai` not installed. Please install using `pip install openai -U`") from e
|
|
27
28
|
|
|
28
29
|
|
|
@@ -256,23 +257,36 @@ class OpenAIResponses(Model):
|
|
|
256
257
|
|
|
257
258
|
# Handle reasoning tools for o3 and o4-mini models
|
|
258
259
|
if self._using_reasoning_model() and messages is not None:
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
if
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
previous_response_id = msg.provider_data["response_id"]
|
|
271
|
-
log_debug(f"Using previous_response_id: {previous_response_id}")
|
|
272
|
-
break
|
|
260
|
+
if self.store is False:
|
|
261
|
+
request_params["store"] = False
|
|
262
|
+
|
|
263
|
+
# Add encrypted reasoning content to include if not already present
|
|
264
|
+
include_list = request_params.get("include", []) or []
|
|
265
|
+
if "reasoning.encrypted_content" not in include_list:
|
|
266
|
+
include_list.append("reasoning.encrypted_content")
|
|
267
|
+
if request_params.get("include") is None:
|
|
268
|
+
request_params["include"] = include_list
|
|
269
|
+
elif isinstance(request_params["include"], list):
|
|
270
|
+
request_params["include"].extend(include_list)
|
|
273
271
|
|
|
274
|
-
|
|
275
|
-
request_params["
|
|
272
|
+
else:
|
|
273
|
+
request_params["store"] = True
|
|
274
|
+
|
|
275
|
+
# Check if the last assistant message has a previous_response_id to continue from
|
|
276
|
+
previous_response_id = None
|
|
277
|
+
for msg in reversed(messages):
|
|
278
|
+
if (
|
|
279
|
+
msg.role == "assistant"
|
|
280
|
+
and hasattr(msg, "provider_data")
|
|
281
|
+
and msg.provider_data
|
|
282
|
+
and "response_id" in msg.provider_data
|
|
283
|
+
):
|
|
284
|
+
previous_response_id = msg.provider_data["response_id"]
|
|
285
|
+
log_debug(f"Using previous_response_id: {previous_response_id}")
|
|
286
|
+
break
|
|
287
|
+
|
|
288
|
+
if previous_response_id:
|
|
289
|
+
request_params["previous_response_id"] = previous_response_id
|
|
276
290
|
|
|
277
291
|
# Add additional request params if provided
|
|
278
292
|
if self.request_params:
|
|
@@ -375,7 +389,7 @@ class OpenAIResponses(Model):
|
|
|
375
389
|
|
|
376
390
|
return formatted_tools
|
|
377
391
|
|
|
378
|
-
def _format_messages(self, messages: List[Message]) -> List[Dict[str, Any]]:
|
|
392
|
+
def _format_messages(self, messages: List[Message]) -> List[Union[Dict[str, Any], ResponseReasoningItem]]:
|
|
379
393
|
"""
|
|
380
394
|
Format a message into the format expected by OpenAI.
|
|
381
395
|
|
|
@@ -385,22 +399,23 @@ class OpenAIResponses(Model):
|
|
|
385
399
|
Returns:
|
|
386
400
|
Dict[str, Any]: The formatted message.
|
|
387
401
|
"""
|
|
388
|
-
formatted_messages: List[Dict[str, Any]] = []
|
|
402
|
+
formatted_messages: List[Union[Dict[str, Any], ResponseReasoningItem]] = []
|
|
389
403
|
|
|
390
404
|
if self._using_reasoning_model():
|
|
391
405
|
# Detect whether we're chaining via previous_response_id. If so, we should NOT
|
|
392
406
|
# re-send prior function_call items; the Responses API already has the state and
|
|
393
407
|
# expects only the corresponding function_call_output items.
|
|
394
408
|
previous_response_id: Optional[str] = None
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
409
|
+
if self.store is not False:
|
|
410
|
+
for msg in reversed(messages):
|
|
411
|
+
if (
|
|
412
|
+
msg.role == "assistant"
|
|
413
|
+
and hasattr(msg, "provider_data")
|
|
414
|
+
and msg.provider_data
|
|
415
|
+
and "response_id" in msg.provider_data
|
|
416
|
+
):
|
|
417
|
+
previous_response_id = msg.provider_data["response_id"]
|
|
418
|
+
break
|
|
404
419
|
|
|
405
420
|
# Build a mapping from function_call id (fc_*) → call_id (call_*) from prior assistant tool_calls
|
|
406
421
|
fc_id_to_call_id: Dict[str, str] = {}
|
|
@@ -475,6 +490,12 @@ class OpenAIResponses(Model):
|
|
|
475
490
|
content = message.content if message.content is not None else ""
|
|
476
491
|
formatted_messages.append({"role": self.role_map[message.role], "content": content})
|
|
477
492
|
|
|
493
|
+
if self.store is False and hasattr(message, "provider_data") and message.provider_data is not None:
|
|
494
|
+
if message.provider_data.get("reasoning_output") is not None:
|
|
495
|
+
reasoning_output = ResponseReasoningItem.model_validate(
|
|
496
|
+
message.provider_data["reasoning_output"]
|
|
497
|
+
)
|
|
498
|
+
formatted_messages.append(reasoning_output)
|
|
478
499
|
return formatted_messages
|
|
479
500
|
|
|
480
501
|
def invoke(
|
|
@@ -858,7 +879,7 @@ class OpenAIResponses(Model):
|
|
|
858
879
|
|
|
859
880
|
# Add role
|
|
860
881
|
model_response.role = "assistant"
|
|
861
|
-
reasoning_summary: str =
|
|
882
|
+
reasoning_summary: Optional[str] = None
|
|
862
883
|
|
|
863
884
|
for output in response.output:
|
|
864
885
|
# Add content
|
|
@@ -898,8 +919,14 @@ class OpenAIResponses(Model):
|
|
|
898
919
|
model_response.extra = model_response.extra or {}
|
|
899
920
|
model_response.extra.setdefault("tool_call_ids", []).append(output.call_id)
|
|
900
921
|
|
|
901
|
-
#
|
|
922
|
+
# Handle reasoning output items
|
|
902
923
|
elif output.type == "reasoning":
|
|
924
|
+
# Save encrypted reasoning content for ZDR mode
|
|
925
|
+
if self.store is False:
|
|
926
|
+
if model_response.provider_data is None:
|
|
927
|
+
model_response.provider_data = {}
|
|
928
|
+
model_response.provider_data["reasoning_output"] = output.model_dump(exclude_none=True)
|
|
929
|
+
|
|
903
930
|
if reasoning_summaries := getattr(output, "summary", None):
|
|
904
931
|
for summary in reasoning_summaries:
|
|
905
932
|
if isinstance(summary, dict):
|
|
@@ -1009,19 +1036,27 @@ class OpenAIResponses(Model):
|
|
|
1009
1036
|
elif stream_event.type == "response.completed":
|
|
1010
1037
|
model_response = ModelResponse()
|
|
1011
1038
|
|
|
1012
|
-
#
|
|
1013
|
-
if self.reasoning_summary is not None:
|
|
1039
|
+
# Handle reasoning output items
|
|
1040
|
+
if self.reasoning_summary is not None or self.store is False:
|
|
1014
1041
|
summary_text: str = ""
|
|
1015
1042
|
for out in getattr(stream_event.response, "output", []) or []:
|
|
1016
1043
|
if getattr(out, "type", None) == "reasoning":
|
|
1017
|
-
|
|
1018
|
-
if
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1044
|
+
# In ZDR mode (store=False), store reasoning data for next request
|
|
1045
|
+
if self.store is False and hasattr(out, "encrypted_content"):
|
|
1046
|
+
if model_response.provider_data is None:
|
|
1047
|
+
model_response.provider_data = {}
|
|
1048
|
+
# Store the complete output item
|
|
1049
|
+
model_response.provider_data["reasoning_output"] = out.model_dump(exclude_none=True)
|
|
1050
|
+
if self.reasoning_summary is not None:
|
|
1051
|
+
summaries = getattr(out, "summary", None)
|
|
1052
|
+
if summaries:
|
|
1053
|
+
for s in summaries:
|
|
1054
|
+
text_val = s.get("text") if isinstance(s, dict) else getattr(s, "text", None)
|
|
1055
|
+
if text_val:
|
|
1056
|
+
if summary_text:
|
|
1057
|
+
summary_text += "\n\n"
|
|
1058
|
+
summary_text += text_val
|
|
1059
|
+
|
|
1025
1060
|
if summary_text:
|
|
1026
1061
|
model_response.reasoning_content = summary_text
|
|
1027
1062
|
|
|
@@ -10,7 +10,7 @@ from agno.utils.log import log_info
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def attach_routes(router: APIRouter, agent: Optional[Agent] = None, team: Optional[Team] = None) -> APIRouter:
|
|
13
|
-
@router.post("/
|
|
13
|
+
@router.post("/events")
|
|
14
14
|
async def slack_events(request: Request, background_tasks: BackgroundTasks):
|
|
15
15
|
body = await request.body()
|
|
16
16
|
timestamp = request.headers.get("X-Slack-Request-Timestamp")
|
|
@@ -167,6 +167,8 @@ def attach_routes(router: APIRouter, agent: Optional[Agent] = None, team: Option
|
|
|
167
167
|
)
|
|
168
168
|
await _send_whatsapp_message(phone_number, response.content) # type: ignore
|
|
169
169
|
await _send_whatsapp_message(phone_number, response.content) # type: ignore
|
|
170
|
+
else:
|
|
171
|
+
await _send_whatsapp_message(phone_number, response.content) # type: ignore
|
|
170
172
|
|
|
171
173
|
except Exception as e:
|
|
172
174
|
log_error(f"Error processing message: {str(e)}")
|