agno 2.0.0a1__tar.gz → 2.0.0rc1__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.0a1 → agno-2.0.0rc1}/PKG-INFO +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/agent/agent.py +390 -33
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/agent.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/evals.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/os.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/settings.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/team.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/dynamo/dynamo.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/firestore/firestore.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/in_memory/in_memory_db.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/json/json_db.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mongo/mongo.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mysql/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/postgres/postgres.py +0 -10
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/postgres/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/redis/redis.py +0 -4
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/singlestore/singlestore.py +0 -10
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/singlestore/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/sqlite/sqlite.py +0 -4
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/sqlite/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/integrations/discord/client.py +5 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/aws_bedrock.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/anthropic/claude.py +2 -49
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/message.py +7 -6
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/app.py +158 -62
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/agui/agui.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/agui/utils.py +16 -9
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/slack/slack.py +2 -3
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/whatsapp/whatsapp.py +2 -3
- agno-2.0.0rc1/agno/os/mcp.py +255 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/router.py +33 -7
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/evals/evals.py +9 -5
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/knowledge/knowledge.py +30 -7
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/memory/memory.py +17 -8
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/metrics/metrics.py +4 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/session/session.py +8 -3
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/settings.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/agent.py +87 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/cancel.py +0 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/team/team.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/function.py +65 -7
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/linear.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/gemini.py +31 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/claude.py +49 -0
- agno-2.0.0rc1/agno/utils/streamlit.py +454 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/workflow.py +8 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno.egg-info/SOURCES.txt +2 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/pyproject.toml +2 -1
- {agno-2.0.0a1 → agno-2.0.0rc1}/LICENSE +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/agent/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/api.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/routes.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/evals.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/os.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/schemas/workflows.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/api/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/cloud/aws/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/dynamo/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/firestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/firestore/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/firestore/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/in_memory/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/json/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/json/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/migrations/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mongo/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mongo/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mongo/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mysql/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mysql/mysql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/mysql/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/postgres/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/postgres/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/redis/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/redis/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/redis/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/schemas/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/schemas/evals.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/schemas/memory.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/schemas/metrics.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/db/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/debug.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/eval/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/eval/accuracy.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/eval/performance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/eval/reliability.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/eval/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/exceptions.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/integrations/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/chunking/strategy.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/content.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/document/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/arxiv_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/csv_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/docx_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/firecrawl_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/gcs_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/json_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/markdown_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/pdf_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/reader_factory.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/s3_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/text_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/url_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/web_search_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/website_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/wikipedia_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reader/youtube_reader.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/types.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/knowledge/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/media.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/memory/manager.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/aws/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/aws/bedrock.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/aws/claude.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/azure/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/cohere/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/cohere/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/defaults.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/google/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/google/gemini.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/groq/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/groq/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/ibm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/internlm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/internlm/internlm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/langdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/langdb/langdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/litellm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/litellm/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/meta/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/meta/llama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/metrics.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/mistral/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/mistral/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/nebius/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/nebius/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/ollama/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/ollama/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openai/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openai/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openai/like.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openai/responses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/portkey/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/portkey/portkey.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/together/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/together/together.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/vercel/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/vercel/v0.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/vllm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/vllm/vllm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/xai/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/models/xai/xai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/auth.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/config.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/schema.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/os/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/py.typed +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/deepseek.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/default.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/helpers.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/ollama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/reasoning/step.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/messages.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/run/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/session/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/session/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/session/summary.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/session/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/session/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/team/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/agentql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/airflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/api.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/apify.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/arxiv.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/aws_lambda.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/aws_ses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/baidusearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/bitbucket.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/brandfetch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/bravesearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/brightdata.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/browserbase.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/calcom.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/calculator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/cartesia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/clickup.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/confluence.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/crawl4ai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/dalle.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/daytona.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/decorator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/desi_vocal.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/discord.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/docker.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/duckdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/duckduckgo.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/e2b.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/eleven_labs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/email.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/evm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/exa.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/fal.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/file.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/financial_datasets.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/firecrawl.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/giphy.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/github.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/gmail.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/google_bigquery.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/google_maps.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/googlecalendar.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/googlesearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/googlesheets.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/hackernews.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/jina.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/jira.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/linkup.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/local_file_system.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/lumalab.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/mcp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/mem0.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/memori.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/gemini.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/morph.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/models_labs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/moviepy_video.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/neo4j.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/newspaper.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/newspaper4k.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/openbb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/opencv.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/openweather.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/oxylabs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/pandas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/postgres.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/pubmed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/python.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/reasoning.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/reddit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/replicate.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/resend.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/scrapegraph.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/searxng.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/serpapi.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/serper.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/shell.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/slack.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/sleep.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/spider.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/sql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/streamlit/components.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/tavily.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/telegram.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/todoist.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/tool_registry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/toolkit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/trafilatura.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/trello.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/twilio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/user_control_flow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/valyu.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/visualization.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/webbrowser.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/webex.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/website.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/webtools.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/whatsapp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/wikipedia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/x.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/yfinance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/youtube.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/zendesk.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/zep.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/tools/zoom.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/audio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/certs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/code_execution.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/common.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/dttm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/enum.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/env.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/events.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/format_str.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/functions.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/http.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/json_schema.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/location.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/log.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/mcp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/media.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/merge_dict.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/message.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/aws_claude.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/llama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/models/watsonx.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/pickle.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/pprint.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/print_response/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/print_response/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/prompts.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/reasoning.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/response_iterator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/safe_formatter.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/shell.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/string.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/timer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/tools.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/web.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/whatsapp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/utils/yaml_io.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/distance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/search.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/condition.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/loop.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/parallel.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/step.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/steps.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno/workflow/types.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno.egg-info/requires.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/agno.egg-info/top_level.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc1}/setup.cfg +0 -0
|
@@ -23,7 +23,7 @@ from typing import (
|
|
|
23
23
|
get_args,
|
|
24
24
|
overload,
|
|
25
25
|
)
|
|
26
|
-
from uuid import
|
|
26
|
+
from uuid import uuid4
|
|
27
27
|
|
|
28
28
|
from pydantic import BaseModel
|
|
29
29
|
|
|
@@ -39,6 +39,7 @@ from agno.models.response import ModelResponse, ModelResponseEvent, ToolExecutio
|
|
|
39
39
|
from agno.reasoning.step import NextAction, ReasoningStep, ReasoningSteps
|
|
40
40
|
from agno.run.agent import (
|
|
41
41
|
RunEvent,
|
|
42
|
+
RunInput,
|
|
42
43
|
RunOutput,
|
|
43
44
|
RunOutputEvent,
|
|
44
45
|
)
|
|
@@ -222,6 +223,10 @@ class Agent:
|
|
|
222
223
|
update_knowledge: bool = False
|
|
223
224
|
# Add a tool that allows the Model to get the tool call history.
|
|
224
225
|
read_tool_call_history: bool = False
|
|
226
|
+
# If False, media (images, videos, audio, files) is only available to tools and not sent to the LLM
|
|
227
|
+
send_media_to_model: bool = True
|
|
228
|
+
# If True, store media in run output
|
|
229
|
+
store_media: bool = True
|
|
225
230
|
|
|
226
231
|
# --- System message settings ---
|
|
227
232
|
# Provide the system message as a string or function
|
|
@@ -360,6 +365,7 @@ class Agent:
|
|
|
360
365
|
session_summary_manager: Optional[SessionSummaryManager] = None,
|
|
361
366
|
add_history_to_context: bool = False,
|
|
362
367
|
num_history_runs: int = 3,
|
|
368
|
+
store_media: bool = True,
|
|
363
369
|
knowledge: Optional[Knowledge] = None,
|
|
364
370
|
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
365
371
|
enable_agentic_knowledge_filters: Optional[bool] = None,
|
|
@@ -380,6 +386,7 @@ class Agent:
|
|
|
380
386
|
search_knowledge: bool = True,
|
|
381
387
|
update_knowledge: bool = False,
|
|
382
388
|
read_tool_call_history: bool = False,
|
|
389
|
+
send_media_to_model: bool = True,
|
|
383
390
|
system_message: Optional[Union[str, Callable, Message]] = None,
|
|
384
391
|
system_message_role: str = "system",
|
|
385
392
|
build_context: bool = True,
|
|
@@ -450,6 +457,8 @@ class Agent:
|
|
|
450
457
|
self.add_history_to_context = add_history_to_context
|
|
451
458
|
self.num_history_runs = num_history_runs
|
|
452
459
|
|
|
460
|
+
self.store_media = store_media
|
|
461
|
+
|
|
453
462
|
self.knowledge = knowledge
|
|
454
463
|
self.knowledge_filters = knowledge_filters
|
|
455
464
|
self.enable_agentic_knowledge_filters = enable_agentic_knowledge_filters
|
|
@@ -474,7 +483,7 @@ class Agent:
|
|
|
474
483
|
self.search_knowledge = search_knowledge
|
|
475
484
|
self.update_knowledge = update_knowledge
|
|
476
485
|
self.read_tool_call_history = read_tool_call_history
|
|
477
|
-
|
|
486
|
+
self.send_media_to_model = send_media_to_model
|
|
478
487
|
self.system_message = system_message
|
|
479
488
|
self.system_message_role = system_message_role
|
|
480
489
|
self.build_context = build_context
|
|
@@ -539,7 +548,7 @@ class Agent:
|
|
|
539
548
|
def set_id(self) -> None:
|
|
540
549
|
if self.id is None:
|
|
541
550
|
if self.name is not None:
|
|
542
|
-
self.id =
|
|
551
|
+
self.id = self.name.lower().replace(" ", "-")
|
|
543
552
|
else:
|
|
544
553
|
self.id = str(uuid4())
|
|
545
554
|
|
|
@@ -760,6 +769,11 @@ class Agent:
|
|
|
760
769
|
# 3. Update the RunOutput with the model response
|
|
761
770
|
self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
|
|
762
771
|
|
|
772
|
+
if self.store_media:
|
|
773
|
+
self._store_media(run_response, model_response)
|
|
774
|
+
else:
|
|
775
|
+
self._scrub_media_from_run_output(run_response)
|
|
776
|
+
|
|
763
777
|
# We should break out of the run function
|
|
764
778
|
if any(tool_call.is_paused for tool_call in run_response.tools or []):
|
|
765
779
|
return self._handle_agent_run_paused(
|
|
@@ -1059,6 +1073,15 @@ class Agent:
|
|
|
1059
1073
|
# Initialize the Agent
|
|
1060
1074
|
self.initialize_agent(debug_mode=debug_mode)
|
|
1061
1075
|
|
|
1076
|
+
image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
|
|
1077
|
+
images=images, videos=videos, audios=audio
|
|
1078
|
+
)
|
|
1079
|
+
|
|
1080
|
+
# Create RunInput to capture the original user input
|
|
1081
|
+
run_input = RunInput(
|
|
1082
|
+
input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
|
|
1083
|
+
)
|
|
1084
|
+
|
|
1062
1085
|
# Read existing session from database
|
|
1063
1086
|
agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
|
|
1064
1087
|
self._update_metadata(session=agent_session)
|
|
@@ -1128,6 +1151,7 @@ class Agent:
|
|
|
1128
1151
|
agent_id=self.id,
|
|
1129
1152
|
agent_name=self.name,
|
|
1130
1153
|
metadata=metadata,
|
|
1154
|
+
input=run_input,
|
|
1131
1155
|
)
|
|
1132
1156
|
|
|
1133
1157
|
run_response.model = self.model.id if self.model is not None else None
|
|
@@ -1305,6 +1329,11 @@ class Agent:
|
|
|
1305
1329
|
# 3. Update the RunOutput with the model response
|
|
1306
1330
|
self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
|
|
1307
1331
|
|
|
1332
|
+
if self.store_media:
|
|
1333
|
+
self._store_media(run_response, model_response)
|
|
1334
|
+
else:
|
|
1335
|
+
self._scrub_media_from_run_output(run_response)
|
|
1336
|
+
|
|
1308
1337
|
# We should break out of the run function
|
|
1309
1338
|
if any(tool_call.is_paused for tool_call in run_response.tools or []):
|
|
1310
1339
|
return self._handle_agent_run_paused(
|
|
@@ -1613,6 +1642,15 @@ class Agent:
|
|
|
1613
1642
|
# Initialize the Agent
|
|
1614
1643
|
self.initialize_agent(debug_mode=debug_mode)
|
|
1615
1644
|
|
|
1645
|
+
image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
|
|
1646
|
+
images=images, videos=videos, audios=audio
|
|
1647
|
+
)
|
|
1648
|
+
|
|
1649
|
+
# Create RunInput to capture the original user input
|
|
1650
|
+
run_input = RunInput(
|
|
1651
|
+
input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
|
|
1652
|
+
)
|
|
1653
|
+
|
|
1616
1654
|
# Read existing session from storage
|
|
1617
1655
|
agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
|
|
1618
1656
|
self._update_metadata(session=agent_session)
|
|
@@ -1679,6 +1717,7 @@ class Agent:
|
|
|
1679
1717
|
agent_id=self.id,
|
|
1680
1718
|
agent_name=self.name,
|
|
1681
1719
|
metadata=metadata,
|
|
1720
|
+
input=run_input,
|
|
1682
1721
|
)
|
|
1683
1722
|
|
|
1684
1723
|
run_response.model = self.model.id if self.model is not None else None
|
|
@@ -2942,6 +2981,21 @@ class Agent:
|
|
|
2942
2981
|
_t.requires_user_input = False
|
|
2943
2982
|
_t.answered = True
|
|
2944
2983
|
|
|
2984
|
+
def _store_media(self, run_response: RunOutput, model_response: ModelResponse):
|
|
2985
|
+
"""Store media from model response in run_response for persistence"""
|
|
2986
|
+
# Handle generated media fields from ModelResponse (generated media)
|
|
2987
|
+
if model_response.images is not None:
|
|
2988
|
+
for image in model_response.images:
|
|
2989
|
+
self._add_image(image, run_response) # Generated images go to run_response.images
|
|
2990
|
+
|
|
2991
|
+
if model_response.videos is not None:
|
|
2992
|
+
for video in model_response.videos:
|
|
2993
|
+
self._add_video(video, run_response) # Generated videos go to run_response.videos
|
|
2994
|
+
|
|
2995
|
+
if model_response.audios is not None:
|
|
2996
|
+
for audio in model_response.audios:
|
|
2997
|
+
self._add_audio(audio, run_response) # Generated audio go to run_response.audio
|
|
2998
|
+
|
|
2945
2999
|
def _update_run_response(self, model_response: ModelResponse, run_response: RunOutput, run_messages: RunMessages):
|
|
2946
3000
|
# Handle structured outputs
|
|
2947
3001
|
if self.output_schema is not None and model_response.parsed is not None:
|
|
@@ -2984,19 +3038,6 @@ class Agent:
|
|
|
2984
3038
|
run_response=run_response, tool_name=tool_name, tool_args=tool_args
|
|
2985
3039
|
)
|
|
2986
3040
|
|
|
2987
|
-
# Handle unified media fields from ModelResponse
|
|
2988
|
-
if model_response.images is not None:
|
|
2989
|
-
for image in model_response.images:
|
|
2990
|
-
self._add_image(image, run_response)
|
|
2991
|
-
|
|
2992
|
-
if model_response.videos is not None:
|
|
2993
|
-
for video in model_response.videos:
|
|
2994
|
-
self._add_video(video, run_response)
|
|
2995
|
-
|
|
2996
|
-
if model_response.audios is not None:
|
|
2997
|
-
for audio in model_response.audios:
|
|
2998
|
-
self._add_audio(audio, run_response)
|
|
2999
|
-
|
|
3000
3041
|
# Update the run_response audio with the model response audio
|
|
3001
3042
|
if model_response.audio is not None:
|
|
3002
3043
|
run_response.response_audio = model_response.audio
|
|
@@ -3704,6 +3745,209 @@ class Agent:
|
|
|
3704
3745
|
|
|
3705
3746
|
return agent_tools
|
|
3706
3747
|
|
|
3748
|
+
def _collect_joint_images(
|
|
3749
|
+
self,
|
|
3750
|
+
run_input: Optional[RunInput] = None,
|
|
3751
|
+
session: Optional[AgentSession] = None,
|
|
3752
|
+
) -> Optional[Sequence[Image]]:
|
|
3753
|
+
"""Collect images from input, session history, and current run response."""
|
|
3754
|
+
joint_images = []
|
|
3755
|
+
|
|
3756
|
+
# 1. Add images from current input
|
|
3757
|
+
if run_input and run_input.images:
|
|
3758
|
+
for artifact in run_input.images:
|
|
3759
|
+
try:
|
|
3760
|
+
if artifact.url:
|
|
3761
|
+
joint_images.append(Image(url=artifact.url))
|
|
3762
|
+
elif artifact.content:
|
|
3763
|
+
joint_images.append(Image(content=artifact.content))
|
|
3764
|
+
except Exception as e:
|
|
3765
|
+
log_warning(f"Error converting ImageArtifact to Image: {e}")
|
|
3766
|
+
continue
|
|
3767
|
+
log_debug(f"Added {len(run_input.images)} input images to joint list")
|
|
3768
|
+
|
|
3769
|
+
# 2. Add images from session history (from both input and generated sources)
|
|
3770
|
+
try:
|
|
3771
|
+
if session and session.runs:
|
|
3772
|
+
for historical_run in session.runs:
|
|
3773
|
+
# Add generated images from previous runs
|
|
3774
|
+
if historical_run.images:
|
|
3775
|
+
for artifact in historical_run.images:
|
|
3776
|
+
try:
|
|
3777
|
+
if artifact.url:
|
|
3778
|
+
joint_images.append(Image(url=artifact.url))
|
|
3779
|
+
elif artifact.content:
|
|
3780
|
+
joint_images.append(Image(content=artifact.content))
|
|
3781
|
+
except Exception as e:
|
|
3782
|
+
log_warning(f"Error converting historical ImageArtifact to Image: {e}")
|
|
3783
|
+
continue
|
|
3784
|
+
log_debug(
|
|
3785
|
+
f"Added {len(historical_run.images)} generated images from historical run {historical_run.run_id}"
|
|
3786
|
+
)
|
|
3787
|
+
|
|
3788
|
+
# Add input images from previous runs
|
|
3789
|
+
if historical_run.input and historical_run.input.images:
|
|
3790
|
+
for artifact in historical_run.input.images:
|
|
3791
|
+
try:
|
|
3792
|
+
if artifact.url:
|
|
3793
|
+
joint_images.append(Image(url=artifact.url))
|
|
3794
|
+
elif artifact.content:
|
|
3795
|
+
joint_images.append(Image(content=artifact.content))
|
|
3796
|
+
except Exception as e:
|
|
3797
|
+
log_warning(f"Error converting input ImageArtifact to Image: {e}")
|
|
3798
|
+
continue
|
|
3799
|
+
log_debug(
|
|
3800
|
+
f"Added {len(historical_run.input.images)} input images from historical run {historical_run.run_id}"
|
|
3801
|
+
)
|
|
3802
|
+
except Exception as e:
|
|
3803
|
+
log_debug(f"Could not access session history for images: {e}")
|
|
3804
|
+
|
|
3805
|
+
if joint_images:
|
|
3806
|
+
log_debug(f"Images Available to Model: {len(joint_images)} images")
|
|
3807
|
+
return joint_images if joint_images else None
|
|
3808
|
+
|
|
3809
|
+
def _collect_joint_videos(
|
|
3810
|
+
self,
|
|
3811
|
+
run_input: Optional[RunInput] = None,
|
|
3812
|
+
session: Optional[AgentSession] = None,
|
|
3813
|
+
) -> Optional[Sequence[Video]]:
|
|
3814
|
+
"""Collect videos from input, session history, and current run response."""
|
|
3815
|
+
joint_videos = []
|
|
3816
|
+
|
|
3817
|
+
# 1. Add videos from current input
|
|
3818
|
+
if run_input and run_input.videos:
|
|
3819
|
+
for artifact in run_input.videos:
|
|
3820
|
+
try:
|
|
3821
|
+
if artifact.url:
|
|
3822
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3823
|
+
elif artifact.content:
|
|
3824
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3825
|
+
except Exception as e:
|
|
3826
|
+
log_warning(f"Error converting VideoArtifact to Video: {e}")
|
|
3827
|
+
continue
|
|
3828
|
+
log_debug(f"Added {len(run_input.videos)} input videos to joint list")
|
|
3829
|
+
|
|
3830
|
+
# 2. Add videos from session history (from both input and generated sources)
|
|
3831
|
+
try:
|
|
3832
|
+
if session and session.runs:
|
|
3833
|
+
for historical_run in session.runs:
|
|
3834
|
+
# Add generated videos from previous runs
|
|
3835
|
+
if historical_run.videos:
|
|
3836
|
+
for artifact in historical_run.videos:
|
|
3837
|
+
try:
|
|
3838
|
+
if artifact.url:
|
|
3839
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3840
|
+
elif artifact.content:
|
|
3841
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3842
|
+
except Exception as e:
|
|
3843
|
+
log_warning(f"Error converting historical VideoArtifact to Video: {e}")
|
|
3844
|
+
continue
|
|
3845
|
+
log_debug(
|
|
3846
|
+
f"Added {len(historical_run.videos)} generated videos from historical run {historical_run.run_id}"
|
|
3847
|
+
)
|
|
3848
|
+
|
|
3849
|
+
# Add input videos from previous runs
|
|
3850
|
+
if historical_run.input and historical_run.input.videos:
|
|
3851
|
+
for artifact in historical_run.input.videos:
|
|
3852
|
+
try:
|
|
3853
|
+
if artifact.url:
|
|
3854
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3855
|
+
elif artifact.content:
|
|
3856
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3857
|
+
except Exception as e:
|
|
3858
|
+
log_warning(f"Error converting input VideoArtifact to Video: {e}")
|
|
3859
|
+
continue
|
|
3860
|
+
log_debug(
|
|
3861
|
+
f"Added {len(historical_run.input.videos)} input videos from historical run {historical_run.run_id}"
|
|
3862
|
+
)
|
|
3863
|
+
except Exception as e:
|
|
3864
|
+
log_debug(f"Could not access session history for videos: {e}")
|
|
3865
|
+
|
|
3866
|
+
if joint_videos:
|
|
3867
|
+
log_debug(f"Videos Available to Model: {len(joint_videos)} videos")
|
|
3868
|
+
return joint_videos if joint_videos else None
|
|
3869
|
+
|
|
3870
|
+
def _collect_joint_audios(
|
|
3871
|
+
self,
|
|
3872
|
+
run_input: Optional[RunInput] = None,
|
|
3873
|
+
session: Optional[AgentSession] = None,
|
|
3874
|
+
) -> Optional[Sequence[Audio]]:
|
|
3875
|
+
"""Collect audios from input, session history, and current run response."""
|
|
3876
|
+
joint_audios = []
|
|
3877
|
+
|
|
3878
|
+
# 1. Add audios from current input
|
|
3879
|
+
if run_input and run_input.audios:
|
|
3880
|
+
for artifact in run_input.audios:
|
|
3881
|
+
try:
|
|
3882
|
+
if artifact.url:
|
|
3883
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3884
|
+
elif artifact.base64_audio:
|
|
3885
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3886
|
+
except Exception as e:
|
|
3887
|
+
log_warning(f"Error converting AudioArtifact to Audio: {e}")
|
|
3888
|
+
continue
|
|
3889
|
+
log_debug(f"Added {len(run_input.audios)} input audios to joint list")
|
|
3890
|
+
|
|
3891
|
+
# 2. Add audios from session history (from both input and generated sources)
|
|
3892
|
+
try:
|
|
3893
|
+
if session and session.runs:
|
|
3894
|
+
for historical_run in session.runs:
|
|
3895
|
+
# Add generated audios from previous runs
|
|
3896
|
+
if historical_run.audio:
|
|
3897
|
+
for artifact in historical_run.audio:
|
|
3898
|
+
try:
|
|
3899
|
+
if artifact.url:
|
|
3900
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3901
|
+
elif artifact.base64_audio:
|
|
3902
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3903
|
+
except Exception as e:
|
|
3904
|
+
log_warning(f"Error converting historical AudioArtifact to Audio: {e}")
|
|
3905
|
+
continue
|
|
3906
|
+
log_debug(
|
|
3907
|
+
f"Added {len(historical_run.audio)} generated audios from historical run {historical_run.run_id}"
|
|
3908
|
+
)
|
|
3909
|
+
|
|
3910
|
+
# Add input audios from previous runs
|
|
3911
|
+
if historical_run.input and historical_run.input.audios:
|
|
3912
|
+
for artifact in historical_run.input.audios:
|
|
3913
|
+
try:
|
|
3914
|
+
if artifact.url:
|
|
3915
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3916
|
+
elif artifact.base64_audio:
|
|
3917
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3918
|
+
except Exception as e:
|
|
3919
|
+
log_warning(f"Error converting input AudioArtifact to Audio: {e}")
|
|
3920
|
+
continue
|
|
3921
|
+
log_debug(
|
|
3922
|
+
f"Added {len(historical_run.input.audios)} input audios from historical run {historical_run.run_id}"
|
|
3923
|
+
)
|
|
3924
|
+
except Exception as e:
|
|
3925
|
+
log_debug(f"Could not access session history for audios: {e}")
|
|
3926
|
+
|
|
3927
|
+
if joint_audios:
|
|
3928
|
+
log_debug(f"Audios Available to Model: {len(joint_audios)} audios")
|
|
3929
|
+
return joint_audios if joint_audios else None
|
|
3930
|
+
|
|
3931
|
+
def _collect_joint_files(
|
|
3932
|
+
self,
|
|
3933
|
+
run_input: Optional[RunInput] = None,
|
|
3934
|
+
) -> Optional[Sequence[File]]:
|
|
3935
|
+
"""Collect files from input and session history."""
|
|
3936
|
+
from agno.utils.log import log_debug
|
|
3937
|
+
|
|
3938
|
+
joint_files: List[File] = []
|
|
3939
|
+
|
|
3940
|
+
# 1. Add files from current input
|
|
3941
|
+
if run_input and run_input.files:
|
|
3942
|
+
joint_files.extend(run_input.files)
|
|
3943
|
+
|
|
3944
|
+
# TODO: Files aren't stored in session history yet and dont have a FileArtifact
|
|
3945
|
+
|
|
3946
|
+
if joint_files:
|
|
3947
|
+
log_debug(f"Files Available to Model: {len(joint_files)} files")
|
|
3948
|
+
|
|
3949
|
+
return joint_files if joint_files else None
|
|
3950
|
+
|
|
3707
3951
|
def _determine_tools_for_model(
|
|
3708
3952
|
self,
|
|
3709
3953
|
model: Model,
|
|
@@ -3802,8 +4046,27 @@ class Agent:
|
|
|
3802
4046
|
|
|
3803
4047
|
# Update the session state for the functions
|
|
3804
4048
|
if self._functions_for_model:
|
|
4049
|
+
from inspect import signature
|
|
4050
|
+
|
|
4051
|
+
# Check if any functions need media before collecting
|
|
4052
|
+
needs_media = any(
|
|
4053
|
+
any(param in signature(func.entrypoint).parameters for param in ["images", "videos", "audios", "files"])
|
|
4054
|
+
for func in self._functions_for_model.values()
|
|
4055
|
+
if func.entrypoint is not None
|
|
4056
|
+
)
|
|
4057
|
+
|
|
4058
|
+
# Only collect media if functions actually need them
|
|
4059
|
+
joint_images = self._collect_joint_images(run_response.input, session) if needs_media else None
|
|
4060
|
+
joint_files = self._collect_joint_files(run_response.input) if needs_media else None
|
|
4061
|
+
joint_audios = self._collect_joint_audios(run_response.input, session) if needs_media else None
|
|
4062
|
+
joint_videos = self._collect_joint_videos(run_response.input, session) if needs_media else None
|
|
4063
|
+
|
|
3805
4064
|
for func in self._functions_for_model.values():
|
|
3806
4065
|
func._session_state = session_state
|
|
4066
|
+
func._images = joint_images
|
|
4067
|
+
func._files = joint_files
|
|
4068
|
+
func._audios = joint_audios
|
|
4069
|
+
func._videos = joint_videos
|
|
3807
4070
|
|
|
3808
4071
|
def _model_should_return_structured_output(self):
|
|
3809
4072
|
self.model = cast(Model, self.model)
|
|
@@ -4656,10 +4919,10 @@ class Agent:
|
|
|
4656
4919
|
return Message(
|
|
4657
4920
|
role=self.user_message_role,
|
|
4658
4921
|
content=input,
|
|
4659
|
-
images=images,
|
|
4660
|
-
audio=audio,
|
|
4661
|
-
videos=videos,
|
|
4662
|
-
files=files,
|
|
4922
|
+
images=None if not self.send_media_to_model else images,
|
|
4923
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4924
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4925
|
+
files=None if not self.send_media_to_model else files,
|
|
4663
4926
|
**kwargs,
|
|
4664
4927
|
)
|
|
4665
4928
|
# 2. Build the user message for the Agent
|
|
@@ -4669,10 +4932,10 @@ class Agent:
|
|
|
4669
4932
|
return Message(
|
|
4670
4933
|
role=self.user_message_role,
|
|
4671
4934
|
content="",
|
|
4672
|
-
images=images,
|
|
4673
|
-
audio=audio,
|
|
4674
|
-
videos=videos,
|
|
4675
|
-
files=files,
|
|
4935
|
+
images=None if not self.send_media_to_model else images,
|
|
4936
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4937
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4938
|
+
files=None if not self.send_media_to_model else files,
|
|
4676
4939
|
**kwargs,
|
|
4677
4940
|
)
|
|
4678
4941
|
else:
|
|
@@ -4691,10 +4954,10 @@ class Agent:
|
|
|
4691
4954
|
return Message(
|
|
4692
4955
|
role=self.user_message_role,
|
|
4693
4956
|
content=message_content,
|
|
4694
|
-
images=images,
|
|
4695
|
-
audio=audio,
|
|
4696
|
-
videos=videos,
|
|
4697
|
-
files=files,
|
|
4957
|
+
images=None if not self.send_media_to_model else images,
|
|
4958
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4959
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4960
|
+
files=None if not self.send_media_to_model else files,
|
|
4698
4961
|
**kwargs,
|
|
4699
4962
|
)
|
|
4700
4963
|
|
|
@@ -4785,10 +5048,10 @@ class Agent:
|
|
|
4785
5048
|
return Message(
|
|
4786
5049
|
role=self.user_message_role,
|
|
4787
5050
|
content=user_msg_content,
|
|
4788
|
-
audio=audio,
|
|
4789
|
-
images=images,
|
|
4790
|
-
videos=videos,
|
|
4791
|
-
files=files,
|
|
5051
|
+
audio=None if not self.send_media_to_model else audio,
|
|
5052
|
+
images=None if not self.send_media_to_model else images,
|
|
5053
|
+
videos=None if not self.send_media_to_model else videos,
|
|
5054
|
+
files=None if not self.send_media_to_model else files,
|
|
4792
5055
|
**kwargs,
|
|
4793
5056
|
)
|
|
4794
5057
|
|
|
@@ -4836,7 +5099,7 @@ class Agent:
|
|
|
4836
5099
|
)
|
|
4837
5100
|
"""
|
|
4838
5101
|
|
|
4839
|
-
# Initialize the RunMessages object
|
|
5102
|
+
# Initialize the RunMessages object (no media here - that's in RunInput now)
|
|
4840
5103
|
run_messages = RunMessages()
|
|
4841
5104
|
|
|
4842
5105
|
# 1. Add system message to run_messages
|
|
@@ -6851,6 +7114,100 @@ class Agent:
|
|
|
6851
7114
|
|
|
6852
7115
|
return effective_filters
|
|
6853
7116
|
|
|
7117
|
+
def _scrub_media_from_run_output(self, run_response: RunOutput) -> None:
|
|
7118
|
+
"""
|
|
7119
|
+
Completely remove all media from RunOutput when store_media=False.
|
|
7120
|
+
This includes media in input, output artifacts, and all messages.
|
|
7121
|
+
"""
|
|
7122
|
+
# 1. Scrub RunInput media
|
|
7123
|
+
if run_response.input is not None:
|
|
7124
|
+
run_response.input.images = []
|
|
7125
|
+
run_response.input.videos = []
|
|
7126
|
+
run_response.input.audios = []
|
|
7127
|
+
run_response.input.files = []
|
|
7128
|
+
|
|
7129
|
+
# 2. RunOutput artifact media are skipped since we don't store them when store_media=False
|
|
7130
|
+
|
|
7131
|
+
# 3. Scrub media from all messages
|
|
7132
|
+
if run_response.messages:
|
|
7133
|
+
for message in run_response.messages:
|
|
7134
|
+
self._scrub_media_from_message(message)
|
|
7135
|
+
|
|
7136
|
+
# 4. Scrub media from additional_input messages if any
|
|
7137
|
+
if run_response.additional_input:
|
|
7138
|
+
for message in run_response.additional_input:
|
|
7139
|
+
self._scrub_media_from_message(message)
|
|
7140
|
+
|
|
7141
|
+
# 5. Scrub media from reasoning_messages if any
|
|
7142
|
+
if run_response.reasoning_messages:
|
|
7143
|
+
for message in run_response.reasoning_messages:
|
|
7144
|
+
self._scrub_media_from_message(message)
|
|
7145
|
+
|
|
7146
|
+
def _scrub_media_from_message(self, message: Message) -> None:
|
|
7147
|
+
"""Remove all media from a Message object."""
|
|
7148
|
+
# Input media
|
|
7149
|
+
message.images = None
|
|
7150
|
+
message.videos = None
|
|
7151
|
+
message.audio = None
|
|
7152
|
+
message.files = None
|
|
7153
|
+
|
|
7154
|
+
# Output media
|
|
7155
|
+
message.audio_output = None
|
|
7156
|
+
message.image_output = None
|
|
7157
|
+
message.video_output = None
|
|
7158
|
+
|
|
7159
|
+
def _convert_media_to_artifacts(
|
|
7160
|
+
self,
|
|
7161
|
+
images: Optional[Sequence[Image]] = None,
|
|
7162
|
+
videos: Optional[Sequence[Video]] = None,
|
|
7163
|
+
audios: Optional[Sequence[Audio]] = None,
|
|
7164
|
+
) -> tuple:
|
|
7165
|
+
"""Convert raw Image/Video/Audio objects to ImageArtifact/VideoArtifact/AudioArtifact objects."""
|
|
7166
|
+
from uuid import uuid4
|
|
7167
|
+
|
|
7168
|
+
from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
|
|
7169
|
+
|
|
7170
|
+
image_artifacts = None
|
|
7171
|
+
if images:
|
|
7172
|
+
image_artifacts = []
|
|
7173
|
+
for img in images:
|
|
7174
|
+
try:
|
|
7175
|
+
if img.url:
|
|
7176
|
+
image_artifacts.append(ImageArtifact(id=str(uuid4()), url=img.url))
|
|
7177
|
+
elif img.content:
|
|
7178
|
+
image_artifacts.append(ImageArtifact(id=str(uuid4()), content=img.content))
|
|
7179
|
+
except Exception as e:
|
|
7180
|
+
log_warning(f"Error creating ImageArtifact: {e}")
|
|
7181
|
+
continue
|
|
7182
|
+
|
|
7183
|
+
video_artifacts = None
|
|
7184
|
+
if videos:
|
|
7185
|
+
video_artifacts = []
|
|
7186
|
+
for vid in videos:
|
|
7187
|
+
try:
|
|
7188
|
+
if vid.url:
|
|
7189
|
+
video_artifacts.append(VideoArtifact(id=str(uuid4()), url=vid.url))
|
|
7190
|
+
elif vid.content:
|
|
7191
|
+
video_artifacts.append(VideoArtifact(id=str(uuid4()), content=vid.content))
|
|
7192
|
+
except Exception as e:
|
|
7193
|
+
log_warning(f"Error creating VideoArtifact: {e}")
|
|
7194
|
+
continue
|
|
7195
|
+
|
|
7196
|
+
audio_artifacts = None
|
|
7197
|
+
if audios:
|
|
7198
|
+
audio_artifacts = []
|
|
7199
|
+
for aud in audios:
|
|
7200
|
+
try:
|
|
7201
|
+
if aud.url:
|
|
7202
|
+
audio_artifacts.append(AudioArtifact(id=str(uuid4()), url=aud.url))
|
|
7203
|
+
elif aud.content:
|
|
7204
|
+
audio_artifacts.append(AudioArtifact(id=str(uuid4()), content=aud.content))
|
|
7205
|
+
except Exception as e:
|
|
7206
|
+
log_warning(f"Error creating AudioArtifact: {e}")
|
|
7207
|
+
continue
|
|
7208
|
+
|
|
7209
|
+
return image_artifacts, video_artifacts, audio_artifacts
|
|
7210
|
+
|
|
6854
7211
|
def cli_app(
|
|
6855
7212
|
self,
|
|
6856
7213
|
input: Optional[str] = None,
|
|
@@ -10,7 +10,7 @@ def create_agent_run(run: AgentRunCreate) -> None:
|
|
|
10
10
|
try:
|
|
11
11
|
api_client.post(
|
|
12
12
|
ApiRoutes.RUN_CREATE,
|
|
13
|
-
json=
|
|
13
|
+
json=run.model_dump(exclude_none=True),
|
|
14
14
|
)
|
|
15
15
|
except Exception as e:
|
|
16
16
|
log_debug(f"Could not create Agent run: {e}")
|
|
@@ -22,7 +22,7 @@ async def acreate_agent_run(run: AgentRunCreate) -> None:
|
|
|
22
22
|
try:
|
|
23
23
|
await api_client.post(
|
|
24
24
|
ApiRoutes.RUN_CREATE,
|
|
25
|
-
json=
|
|
25
|
+
json=run.model_dump(exclude_none=True),
|
|
26
26
|
)
|
|
27
27
|
except Exception as e:
|
|
28
28
|
log_debug(f"Could not create Agent run: {e}")
|
|
@@ -8,7 +8,7 @@ def create_eval_run_telemetry(eval_run: EvalRunCreate) -> None:
|
|
|
8
8
|
"""Telemetry recording for Eval runs"""
|
|
9
9
|
with api.Client() as api_client:
|
|
10
10
|
try:
|
|
11
|
-
api_client.post(ApiRoutes.EVAL_RUN_CREATE, json=
|
|
11
|
+
api_client.post(ApiRoutes.EVAL_RUN_CREATE, json=eval_run.model_dump(exclude_none=True))
|
|
12
12
|
except Exception as e:
|
|
13
13
|
log_debug(f"Could not create evaluation run: {e}")
|
|
14
14
|
|
|
@@ -17,6 +17,6 @@ async def async_create_eval_run_telemetry(eval_run: EvalRunCreate) -> None:
|
|
|
17
17
|
"""Telemetry recording for async Eval runs"""
|
|
18
18
|
async with api.AsyncClient() as api_client:
|
|
19
19
|
try:
|
|
20
|
-
await api_client.post(ApiRoutes.EVAL_RUN_CREATE, json=
|
|
20
|
+
await api_client.post(ApiRoutes.EVAL_RUN_CREATE, json=eval_run.model_dump(exclude_none=True))
|
|
21
21
|
except Exception as e:
|
|
22
22
|
log_debug(f"Could not create evaluation run: {e}")
|
|
@@ -10,7 +10,7 @@ def log_os_telemetry(launch: OSLaunch) -> None:
|
|
|
10
10
|
try:
|
|
11
11
|
response = api_client.post(
|
|
12
12
|
ApiRoutes.AGENT_OS_LAUNCH,
|
|
13
|
-
json=
|
|
13
|
+
json=launch.model_dump(exclude_none=True),
|
|
14
14
|
)
|
|
15
15
|
response.raise_for_status()
|
|
16
16
|
except Exception as e:
|
|
@@ -16,7 +16,7 @@ class AgnoAPISettings(BaseSettings):
|
|
|
16
16
|
api_runtime: str = "prd"
|
|
17
17
|
alpha_features: bool = False
|
|
18
18
|
|
|
19
|
-
api_url: str = "https://api.agno.com"
|
|
19
|
+
api_url: str = "https://os-api.agno.com"
|
|
20
20
|
|
|
21
21
|
model_config = SettingsConfigDict(env_prefix="AGNO_")
|
|
22
22
|
|
|
@@ -42,7 +42,7 @@ class AgnoAPISettings(BaseSettings):
|
|
|
42
42
|
elif api_runtime == "stg":
|
|
43
43
|
return "https://api-stg.agno.com"
|
|
44
44
|
else:
|
|
45
|
-
return "https://api.agno.com"
|
|
45
|
+
return "https://os-api.agno.com"
|
|
46
46
|
|
|
47
47
|
def gate_alpha_feature(self):
|
|
48
48
|
if not self.alpha_features:
|
|
@@ -10,7 +10,7 @@ def create_team_run(run: TeamRunCreate) -> None:
|
|
|
10
10
|
try:
|
|
11
11
|
response = api_client.post(
|
|
12
12
|
ApiRoutes.RUN_CREATE,
|
|
13
|
-
json=
|
|
13
|
+
json=run.model_dump(exclude_none=True),
|
|
14
14
|
)
|
|
15
15
|
response.raise_for_status()
|
|
16
16
|
except Exception as e:
|
|
@@ -23,7 +23,7 @@ async def acreate_team_run(run: TeamRunCreate) -> None:
|
|
|
23
23
|
try:
|
|
24
24
|
response = await api_client.post(
|
|
25
25
|
ApiRoutes.RUN_CREATE,
|
|
26
|
-
json=
|
|
26
|
+
json=run.model_dump(exclude_none=True),
|
|
27
27
|
)
|
|
28
28
|
response.raise_for_status()
|
|
29
29
|
except Exception as e:
|