agno 2.0.0a1__tar.gz → 2.0.0rc2__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.0rc2}/PKG-INFO +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/agent/agent.py +416 -41
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/agent.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/evals.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/os.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/settings.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/team.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/dynamo.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/firestore.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/in_memory_db.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/json_db.py +0 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/mongo.py +8 -9
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/postgres.py +0 -10
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/redis.py +0 -4
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/singlestore.py +0 -10
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/sqlite.py +0 -4
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/utils.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/accuracy.py +12 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/discord/client.py +5 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/strategy.py +14 -14
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/aws_bedrock.py +2 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/knowledge.py +156 -120
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/arxiv_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/csv_reader.py +6 -77
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/docx_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/firecrawl_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/json_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/markdown_reader.py +31 -9
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/pdf_reader.py +10 -123
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/reader_factory.py +65 -72
- agno-2.0.0rc2/agno/knowledge/reader/s3_reader.py +101 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/text_reader.py +5 -5
- agno-2.0.0rc2/agno/knowledge/reader/url_reader.py +128 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/web_search_reader.py +6 -29
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/website_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/wikipedia_reader.py +5 -5
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/youtube_reader.py +6 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/utils.py +10 -10
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/anthropic/claude.py +2 -49
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/bedrock.py +3 -7
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/base.py +37 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/message.py +7 -6
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/app.py +168 -64
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/agui.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/utils.py +16 -9
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/slack.py +2 -3
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/whatsapp.py +2 -3
- agno-2.0.0rc2/agno/os/mcp.py +235 -0
- agno-2.0.0rc2/agno/os/router.py +1400 -0
- agno-2.0.0rc2/agno/os/routers/evals/evals.py +393 -0
- agno-2.0.0rc2/agno/os/routers/knowledge/knowledge.py +850 -0
- agno-2.0.0rc2/agno/os/routers/memory/memory.py +410 -0
- agno-2.0.0rc2/agno/os/routers/metrics/metrics.py +178 -0
- agno-2.0.0rc2/agno/os/routers/session/session.py +536 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/schema.py +55 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/settings.py +0 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/agent.py +96 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/cancel.py +0 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/team.py +93 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/workflow.py +25 -12
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/team/team.py +863 -1053
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/function.py +65 -7
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/linear.py +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mcp.py +1 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/gemini.py +31 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/log.py +52 -2
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/mcp.py +55 -3
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/claude.py +41 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/team.py +177 -73
- agno-2.0.0rc2/agno/utils/streamlit.py +481 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/workflow.py +17 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/PKG-INFO +1 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/SOURCES.txt +2 -1
- {agno-2.0.0a1 → agno-2.0.0rc2}/pyproject.toml +2 -1
- agno-2.0.0a1/agno/knowledge/reader/gcs_reader.py +0 -67
- agno-2.0.0a1/agno/knowledge/reader/s3_reader.py +0 -171
- agno-2.0.0a1/agno/knowledge/reader/url_reader.py +0 -84
- agno-2.0.0a1/agno/os/router.py +0 -843
- agno-2.0.0a1/agno/os/routers/evals/evals.py +0 -204
- agno-2.0.0a1/agno/os/routers/knowledge/knowledge.py +0 -413
- agno-2.0.0a1/agno/os/routers/memory/memory.py +0 -179
- agno-2.0.0a1/agno/os/routers/metrics/metrics.py +0 -58
- agno-2.0.0a1/agno/os/routers/session/session.py +0 -163
- {agno-2.0.0a1 → agno-2.0.0rc2}/LICENSE +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/agent/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/api.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/routes.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/evals.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/os.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/workflows.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/api_client.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/bucket.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/object.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/gcs_json_db.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/migrations/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/migrations/v1_to_v2.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/mysql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/evals.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/memory.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/metrics.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/debug.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/performance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/reliability.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/exceptions.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/discord/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/agentic.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/document.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/fixed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/markdown.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/recursive.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/row.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/semantic.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/content.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/document/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/document/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/azure_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/fastembed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/fireworks.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/google.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/huggingface.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/jina.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/langdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/ollama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/sentence_transformer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/together.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/voyageai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/remote_content/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/remote_content/remote_content.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/infinity.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/sentence_transformer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/types.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/media.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/memory/manager.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aimlapi/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/anthropic/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/claude.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/openai_chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cohere/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cohere/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/dashscope/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/dashscope/dashscope.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepinfra/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepseek/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepseek/deepseek.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/defaults.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/fireworks/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/fireworks/fireworks.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/google/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/google/gemini.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/groq/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/groq/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/huggingface/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/huggingface/huggingface.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ibm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ibm/watsonx.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/internlm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/internlm/internlm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/langdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/langdb/langdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/lmstudio/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/llama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/llama_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/metrics.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/mistral/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/mistral/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nebius/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nebius/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nvidia/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nvidia/nvidia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ollama/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ollama/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/chat.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/like.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/responses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openrouter/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openrouter/openrouter.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/perplexity/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/perplexity/perplexity.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/portkey/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/portkey/portkey.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/sambanova/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/sambanova/sambanova.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/together/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/together/together.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vercel/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vercel/v0.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vllm/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vllm/vllm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/xai/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/xai/xai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/auth.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/config.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/security.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/security.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/knowledge/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/knowledge/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/memory/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/memory/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/metrics/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/metrics/schemas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/session/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/py.typed +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/deepseek.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/default.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/helpers.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/ollama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/step.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/messages.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/summary.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/team/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/agentql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/airflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/api.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/apify.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/arxiv.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/aws_lambda.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/aws_ses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/baidusearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/bitbucket.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/brandfetch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/bravesearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/brightdata.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/browserbase.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/calcom.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/calculator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/cartesia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/clickup.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/confluence.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/crawl4ai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/csv_toolkit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/dalle.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/daytona.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/decorator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/desi_vocal.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/discord.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/docker.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/duckdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/duckduckgo.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/e2b.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/eleven_labs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/email.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/evm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/exa.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/fal.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/file.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/financial_datasets.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/firecrawl.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/giphy.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/github.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/gmail.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/google_bigquery.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/google_maps.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlecalendar.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlesearch.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlesheets.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/hackernews.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/jina.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/jira.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/linkup.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/local_file_system.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/lumalab.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mem0.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/memori.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mlx_transcribe.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/azure_openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/gemini.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/groq.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/morph.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/nebius.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models_labs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/moviepy_video.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/neo4j.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/newspaper.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/newspaper4k.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openbb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/opencv.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openweather.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/oxylabs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/pandas.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/postgres.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/pubmed.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/python.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/reasoning.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/reddit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/replicate.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/resend.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/scrapegraph.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/searxng.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/serpapi.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/serper.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/shell.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/slack.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/sleep.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/spider.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/sql.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/streamlit/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/streamlit/components.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/tavily.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/telegram.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/todoist.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/tool_registry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/toolkit.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/trafilatura.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/trello.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/twilio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/user_control_flow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/valyu.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/visualization.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webbrowser.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webex.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/website.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webtools.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/whatsapp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/wikipedia.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/x.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/yfinance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/youtube.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zendesk.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zep.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zoom.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/audio.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/certs.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/code_execution.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/common.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/dttm.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/enum.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/env.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/events.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/format_str.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/functions.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/http.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/json_schema.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/knowledge.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/location.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/media.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/merge_dict.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/message.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/ai_foundry.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/aws_claude.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/cohere.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/llama.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/mistral.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/openai_responses.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/schema_utils.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/watsonx.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/openai.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/pickle.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/pprint.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/agent.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/workflow.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/prompts.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/reasoning.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/response.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/response_iterator.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/safe_formatter.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/shell.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/string.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/team.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/timer.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/tools.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/web.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/whatsapp.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/yaml_io.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/base.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/distance.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/langchaindb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lightrag/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lightrag/lightrag.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/search.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/index.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/__init__.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/condition.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/loop.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/parallel.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/router.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/step.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/steps.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/types.py +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/dependency_links.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/requires.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/top_level.txt +0 -0
- {agno-2.0.0a1 → agno-2.0.0rc2}/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
|
)
|
|
@@ -128,10 +129,10 @@ class Agent:
|
|
|
128
129
|
session_id: Optional[str] = None
|
|
129
130
|
# Default session state (stored in the database to persist across runs)
|
|
130
131
|
session_state: Optional[Dict[str, Any]] = None
|
|
131
|
-
#
|
|
132
|
-
enable_agentic_state: bool = False
|
|
133
|
-
# If True, add the session state to the user prompt
|
|
132
|
+
# Set to True to add the session_state to the context
|
|
134
133
|
add_session_state_to_context: bool = False
|
|
134
|
+
# Set to True to give the agent tools to update the session_state dynamically
|
|
135
|
+
enable_agentic_state: bool = False
|
|
135
136
|
# If True, cache the current Agent session in memory for faster access
|
|
136
137
|
cache_session: bool = False
|
|
137
138
|
|
|
@@ -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
|
|
@@ -316,8 +321,6 @@ class Agent:
|
|
|
316
321
|
# --- If this Agent is part of a workflow ---
|
|
317
322
|
# Optional workflow ID. Indicates this agent is part of a workflow.
|
|
318
323
|
workflow_id: Optional[str] = None
|
|
319
|
-
# Set when this agent is part of a workflow.
|
|
320
|
-
workflow_session_id: Optional[str] = None
|
|
321
324
|
|
|
322
325
|
# Metadata stored with this agent
|
|
323
326
|
metadata: Optional[Dict[str, Any]] = None
|
|
@@ -340,7 +343,6 @@ class Agent:
|
|
|
340
343
|
id: Optional[str] = None,
|
|
341
344
|
introduction: Optional[str] = None,
|
|
342
345
|
user_id: Optional[str] = None,
|
|
343
|
-
app_id: Optional[str] = None,
|
|
344
346
|
session_id: Optional[str] = None,
|
|
345
347
|
session_state: Optional[Dict[str, Any]] = None,
|
|
346
348
|
add_session_state_to_context: bool = False,
|
|
@@ -360,6 +362,7 @@ class Agent:
|
|
|
360
362
|
session_summary_manager: Optional[SessionSummaryManager] = None,
|
|
361
363
|
add_history_to_context: bool = False,
|
|
362
364
|
num_history_runs: int = 3,
|
|
365
|
+
store_media: bool = True,
|
|
363
366
|
knowledge: Optional[Knowledge] = None,
|
|
364
367
|
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
365
368
|
enable_agentic_knowledge_filters: Optional[bool] = None,
|
|
@@ -380,6 +383,7 @@ class Agent:
|
|
|
380
383
|
search_knowledge: bool = True,
|
|
381
384
|
update_knowledge: bool = False,
|
|
382
385
|
read_tool_call_history: bool = False,
|
|
386
|
+
send_media_to_model: bool = True,
|
|
383
387
|
system_message: Optional[Union[str, Callable, Message]] = None,
|
|
384
388
|
system_message_role: str = "system",
|
|
385
389
|
build_context: bool = True,
|
|
@@ -422,7 +426,6 @@ class Agent:
|
|
|
422
426
|
self.id = id
|
|
423
427
|
self.introduction = introduction
|
|
424
428
|
self.user_id = user_id
|
|
425
|
-
self.app_id = app_id
|
|
426
429
|
|
|
427
430
|
self.session_id = session_id
|
|
428
431
|
self.session_state = session_state
|
|
@@ -450,6 +453,8 @@ class Agent:
|
|
|
450
453
|
self.add_history_to_context = add_history_to_context
|
|
451
454
|
self.num_history_runs = num_history_runs
|
|
452
455
|
|
|
456
|
+
self.store_media = store_media
|
|
457
|
+
|
|
453
458
|
self.knowledge = knowledge
|
|
454
459
|
self.knowledge_filters = knowledge_filters
|
|
455
460
|
self.enable_agentic_knowledge_filters = enable_agentic_knowledge_filters
|
|
@@ -474,7 +479,7 @@ class Agent:
|
|
|
474
479
|
self.search_knowledge = search_knowledge
|
|
475
480
|
self.update_knowledge = update_knowledge
|
|
476
481
|
self.read_tool_call_history = read_tool_call_history
|
|
477
|
-
|
|
482
|
+
self.send_media_to_model = send_media_to_model
|
|
478
483
|
self.system_message = system_message
|
|
479
484
|
self.system_message_role = system_message_role
|
|
480
485
|
self.build_context = build_context
|
|
@@ -539,7 +544,7 @@ class Agent:
|
|
|
539
544
|
def set_id(self) -> None:
|
|
540
545
|
if self.id is None:
|
|
541
546
|
if self.name is not None:
|
|
542
|
-
self.id =
|
|
547
|
+
self.id = self.name.lower().replace(" ", "-")
|
|
543
548
|
else:
|
|
544
549
|
self.id = str(uuid4())
|
|
545
550
|
|
|
@@ -584,6 +589,15 @@ class Agent:
|
|
|
584
589
|
if isinstance(input, Message):
|
|
585
590
|
input = input.content # type: ignore
|
|
586
591
|
|
|
592
|
+
# If input is a string, convert it to a dict
|
|
593
|
+
if isinstance(input, str):
|
|
594
|
+
import json
|
|
595
|
+
|
|
596
|
+
try:
|
|
597
|
+
input = json.loads(input)
|
|
598
|
+
except Exception as e:
|
|
599
|
+
raise ValueError(f"Failed to parse input. Is it a valid JSON string?: {e}")
|
|
600
|
+
|
|
587
601
|
# Case 1: Message is already a BaseModel instance
|
|
588
602
|
if isinstance(input, BaseModel):
|
|
589
603
|
if isinstance(input, self.input_schema):
|
|
@@ -760,6 +774,11 @@ class Agent:
|
|
|
760
774
|
# 3. Update the RunOutput with the model response
|
|
761
775
|
self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
|
|
762
776
|
|
|
777
|
+
if self.store_media:
|
|
778
|
+
self._store_media(run_response, model_response)
|
|
779
|
+
else:
|
|
780
|
+
self._scrub_media_from_run_output(run_response)
|
|
781
|
+
|
|
763
782
|
# We should break out of the run function
|
|
764
783
|
if any(tool_call.is_paused for tool_call in run_response.tools or []):
|
|
765
784
|
return self._handle_agent_run_paused(
|
|
@@ -1059,6 +1078,15 @@ class Agent:
|
|
|
1059
1078
|
# Initialize the Agent
|
|
1060
1079
|
self.initialize_agent(debug_mode=debug_mode)
|
|
1061
1080
|
|
|
1081
|
+
image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
|
|
1082
|
+
images=images, videos=videos, audios=audio
|
|
1083
|
+
)
|
|
1084
|
+
|
|
1085
|
+
# Create RunInput to capture the original user input
|
|
1086
|
+
run_input = RunInput(
|
|
1087
|
+
input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
|
|
1088
|
+
)
|
|
1089
|
+
|
|
1062
1090
|
# Read existing session from database
|
|
1063
1091
|
agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
|
|
1064
1092
|
self._update_metadata(session=agent_session)
|
|
@@ -1128,6 +1156,7 @@ class Agent:
|
|
|
1128
1156
|
agent_id=self.id,
|
|
1129
1157
|
agent_name=self.name,
|
|
1130
1158
|
metadata=metadata,
|
|
1159
|
+
input=run_input,
|
|
1131
1160
|
)
|
|
1132
1161
|
|
|
1133
1162
|
run_response.model = self.model.id if self.model is not None else None
|
|
@@ -1305,6 +1334,11 @@ class Agent:
|
|
|
1305
1334
|
# 3. Update the RunOutput with the model response
|
|
1306
1335
|
self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
|
|
1307
1336
|
|
|
1337
|
+
if self.store_media:
|
|
1338
|
+
self._store_media(run_response, model_response)
|
|
1339
|
+
else:
|
|
1340
|
+
self._scrub_media_from_run_output(run_response)
|
|
1341
|
+
|
|
1308
1342
|
# We should break out of the run function
|
|
1309
1343
|
if any(tool_call.is_paused for tool_call in run_response.tools or []):
|
|
1310
1344
|
return self._handle_agent_run_paused(
|
|
@@ -1613,6 +1647,15 @@ class Agent:
|
|
|
1613
1647
|
# Initialize the Agent
|
|
1614
1648
|
self.initialize_agent(debug_mode=debug_mode)
|
|
1615
1649
|
|
|
1650
|
+
image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
|
|
1651
|
+
images=images, videos=videos, audios=audio
|
|
1652
|
+
)
|
|
1653
|
+
|
|
1654
|
+
# Create RunInput to capture the original user input
|
|
1655
|
+
run_input = RunInput(
|
|
1656
|
+
input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
|
|
1657
|
+
)
|
|
1658
|
+
|
|
1616
1659
|
# Read existing session from storage
|
|
1617
1660
|
agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
|
|
1618
1661
|
self._update_metadata(session=agent_session)
|
|
@@ -1679,6 +1722,7 @@ class Agent:
|
|
|
1679
1722
|
agent_id=self.id,
|
|
1680
1723
|
agent_name=self.name,
|
|
1681
1724
|
metadata=metadata,
|
|
1725
|
+
input=run_input,
|
|
1682
1726
|
)
|
|
1683
1727
|
|
|
1684
1728
|
run_response.model = self.model.id if self.model is not None else None
|
|
@@ -2942,6 +2986,21 @@ class Agent:
|
|
|
2942
2986
|
_t.requires_user_input = False
|
|
2943
2987
|
_t.answered = True
|
|
2944
2988
|
|
|
2989
|
+
def _store_media(self, run_response: RunOutput, model_response: ModelResponse):
|
|
2990
|
+
"""Store media from model response in run_response for persistence"""
|
|
2991
|
+
# Handle generated media fields from ModelResponse (generated media)
|
|
2992
|
+
if model_response.images is not None:
|
|
2993
|
+
for image in model_response.images:
|
|
2994
|
+
self._add_image(image, run_response) # Generated images go to run_response.images
|
|
2995
|
+
|
|
2996
|
+
if model_response.videos is not None:
|
|
2997
|
+
for video in model_response.videos:
|
|
2998
|
+
self._add_video(video, run_response) # Generated videos go to run_response.videos
|
|
2999
|
+
|
|
3000
|
+
if model_response.audios is not None:
|
|
3001
|
+
for audio in model_response.audios:
|
|
3002
|
+
self._add_audio(audio, run_response) # Generated audio go to run_response.audio
|
|
3003
|
+
|
|
2945
3004
|
def _update_run_response(self, model_response: ModelResponse, run_response: RunOutput, run_messages: RunMessages):
|
|
2946
3005
|
# Handle structured outputs
|
|
2947
3006
|
if self.output_schema is not None and model_response.parsed is not None:
|
|
@@ -2984,19 +3043,6 @@ class Agent:
|
|
|
2984
3043
|
run_response=run_response, tool_name=tool_name, tool_args=tool_args
|
|
2985
3044
|
)
|
|
2986
3045
|
|
|
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
3046
|
# Update the run_response audio with the model response audio
|
|
3001
3047
|
if model_response.audio is not None:
|
|
3002
3048
|
run_response.response_audio = model_response.audio
|
|
@@ -3190,6 +3236,12 @@ class Agent:
|
|
|
3190
3236
|
if isinstance(model_response_event, tuple(get_args(RunOutputEvent))) or isinstance(
|
|
3191
3237
|
model_response_event, tuple(get_args(TeamRunOutputEvent))
|
|
3192
3238
|
):
|
|
3239
|
+
if model_response_event.event == RunEvent.custom_event: # type: ignore
|
|
3240
|
+
model_response_event.agent_id = self.id # type: ignore
|
|
3241
|
+
model_response_event.agent_name = self.name # type: ignore
|
|
3242
|
+
model_response_event.session_id = session.session_id # type: ignore
|
|
3243
|
+
model_response_event.run_id = run_response.run_id # type: ignore
|
|
3244
|
+
|
|
3193
3245
|
# We just bubble the event up
|
|
3194
3246
|
yield self._handle_event(model_response_event, run_response) # type: ignore
|
|
3195
3247
|
else:
|
|
@@ -3704,6 +3756,209 @@ class Agent:
|
|
|
3704
3756
|
|
|
3705
3757
|
return agent_tools
|
|
3706
3758
|
|
|
3759
|
+
def _collect_joint_images(
|
|
3760
|
+
self,
|
|
3761
|
+
run_input: Optional[RunInput] = None,
|
|
3762
|
+
session: Optional[AgentSession] = None,
|
|
3763
|
+
) -> Optional[Sequence[Image]]:
|
|
3764
|
+
"""Collect images from input, session history, and current run response."""
|
|
3765
|
+
joint_images = []
|
|
3766
|
+
|
|
3767
|
+
# 1. Add images from current input
|
|
3768
|
+
if run_input and run_input.images:
|
|
3769
|
+
for artifact in run_input.images:
|
|
3770
|
+
try:
|
|
3771
|
+
if artifact.url:
|
|
3772
|
+
joint_images.append(Image(url=artifact.url))
|
|
3773
|
+
elif artifact.content:
|
|
3774
|
+
joint_images.append(Image(content=artifact.content))
|
|
3775
|
+
except Exception as e:
|
|
3776
|
+
log_warning(f"Error converting ImageArtifact to Image: {e}")
|
|
3777
|
+
continue
|
|
3778
|
+
log_debug(f"Added {len(run_input.images)} input images to joint list")
|
|
3779
|
+
|
|
3780
|
+
# 2. Add images from session history (from both input and generated sources)
|
|
3781
|
+
try:
|
|
3782
|
+
if session and session.runs:
|
|
3783
|
+
for historical_run in session.runs:
|
|
3784
|
+
# Add generated images from previous runs
|
|
3785
|
+
if historical_run.images:
|
|
3786
|
+
for artifact in historical_run.images:
|
|
3787
|
+
try:
|
|
3788
|
+
if artifact.url:
|
|
3789
|
+
joint_images.append(Image(url=artifact.url))
|
|
3790
|
+
elif artifact.content:
|
|
3791
|
+
joint_images.append(Image(content=artifact.content))
|
|
3792
|
+
except Exception as e:
|
|
3793
|
+
log_warning(f"Error converting historical ImageArtifact to Image: {e}")
|
|
3794
|
+
continue
|
|
3795
|
+
log_debug(
|
|
3796
|
+
f"Added {len(historical_run.images)} generated images from historical run {historical_run.run_id}"
|
|
3797
|
+
)
|
|
3798
|
+
|
|
3799
|
+
# Add input images from previous runs
|
|
3800
|
+
if historical_run.input and historical_run.input.images:
|
|
3801
|
+
for artifact in historical_run.input.images:
|
|
3802
|
+
try:
|
|
3803
|
+
if artifact.url:
|
|
3804
|
+
joint_images.append(Image(url=artifact.url))
|
|
3805
|
+
elif artifact.content:
|
|
3806
|
+
joint_images.append(Image(content=artifact.content))
|
|
3807
|
+
except Exception as e:
|
|
3808
|
+
log_warning(f"Error converting input ImageArtifact to Image: {e}")
|
|
3809
|
+
continue
|
|
3810
|
+
log_debug(
|
|
3811
|
+
f"Added {len(historical_run.input.images)} input images from historical run {historical_run.run_id}"
|
|
3812
|
+
)
|
|
3813
|
+
except Exception as e:
|
|
3814
|
+
log_debug(f"Could not access session history for images: {e}")
|
|
3815
|
+
|
|
3816
|
+
if joint_images:
|
|
3817
|
+
log_debug(f"Images Available to Model: {len(joint_images)} images")
|
|
3818
|
+
return joint_images if joint_images else None
|
|
3819
|
+
|
|
3820
|
+
def _collect_joint_videos(
|
|
3821
|
+
self,
|
|
3822
|
+
run_input: Optional[RunInput] = None,
|
|
3823
|
+
session: Optional[AgentSession] = None,
|
|
3824
|
+
) -> Optional[Sequence[Video]]:
|
|
3825
|
+
"""Collect videos from input, session history, and current run response."""
|
|
3826
|
+
joint_videos = []
|
|
3827
|
+
|
|
3828
|
+
# 1. Add videos from current input
|
|
3829
|
+
if run_input and run_input.videos:
|
|
3830
|
+
for artifact in run_input.videos:
|
|
3831
|
+
try:
|
|
3832
|
+
if artifact.url:
|
|
3833
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3834
|
+
elif artifact.content:
|
|
3835
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3836
|
+
except Exception as e:
|
|
3837
|
+
log_warning(f"Error converting VideoArtifact to Video: {e}")
|
|
3838
|
+
continue
|
|
3839
|
+
log_debug(f"Added {len(run_input.videos)} input videos to joint list")
|
|
3840
|
+
|
|
3841
|
+
# 2. Add videos from session history (from both input and generated sources)
|
|
3842
|
+
try:
|
|
3843
|
+
if session and session.runs:
|
|
3844
|
+
for historical_run in session.runs:
|
|
3845
|
+
# Add generated videos from previous runs
|
|
3846
|
+
if historical_run.videos:
|
|
3847
|
+
for artifact in historical_run.videos:
|
|
3848
|
+
try:
|
|
3849
|
+
if artifact.url:
|
|
3850
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3851
|
+
elif artifact.content:
|
|
3852
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3853
|
+
except Exception as e:
|
|
3854
|
+
log_warning(f"Error converting historical VideoArtifact to Video: {e}")
|
|
3855
|
+
continue
|
|
3856
|
+
log_debug(
|
|
3857
|
+
f"Added {len(historical_run.videos)} generated videos from historical run {historical_run.run_id}"
|
|
3858
|
+
)
|
|
3859
|
+
|
|
3860
|
+
# Add input videos from previous runs
|
|
3861
|
+
if historical_run.input and historical_run.input.videos:
|
|
3862
|
+
for artifact in historical_run.input.videos:
|
|
3863
|
+
try:
|
|
3864
|
+
if artifact.url:
|
|
3865
|
+
joint_videos.append(Video(url=artifact.url))
|
|
3866
|
+
elif artifact.content:
|
|
3867
|
+
joint_videos.append(Video(content=artifact.content))
|
|
3868
|
+
except Exception as e:
|
|
3869
|
+
log_warning(f"Error converting input VideoArtifact to Video: {e}")
|
|
3870
|
+
continue
|
|
3871
|
+
log_debug(
|
|
3872
|
+
f"Added {len(historical_run.input.videos)} input videos from historical run {historical_run.run_id}"
|
|
3873
|
+
)
|
|
3874
|
+
except Exception as e:
|
|
3875
|
+
log_debug(f"Could not access session history for videos: {e}")
|
|
3876
|
+
|
|
3877
|
+
if joint_videos:
|
|
3878
|
+
log_debug(f"Videos Available to Model: {len(joint_videos)} videos")
|
|
3879
|
+
return joint_videos if joint_videos else None
|
|
3880
|
+
|
|
3881
|
+
def _collect_joint_audios(
|
|
3882
|
+
self,
|
|
3883
|
+
run_input: Optional[RunInput] = None,
|
|
3884
|
+
session: Optional[AgentSession] = None,
|
|
3885
|
+
) -> Optional[Sequence[Audio]]:
|
|
3886
|
+
"""Collect audios from input, session history, and current run response."""
|
|
3887
|
+
joint_audios = []
|
|
3888
|
+
|
|
3889
|
+
# 1. Add audios from current input
|
|
3890
|
+
if run_input and run_input.audios:
|
|
3891
|
+
for artifact in run_input.audios:
|
|
3892
|
+
try:
|
|
3893
|
+
if artifact.url:
|
|
3894
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3895
|
+
elif artifact.base64_audio:
|
|
3896
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3897
|
+
except Exception as e:
|
|
3898
|
+
log_warning(f"Error converting AudioArtifact to Audio: {e}")
|
|
3899
|
+
continue
|
|
3900
|
+
log_debug(f"Added {len(run_input.audios)} input audios to joint list")
|
|
3901
|
+
|
|
3902
|
+
# 2. Add audios from session history (from both input and generated sources)
|
|
3903
|
+
try:
|
|
3904
|
+
if session and session.runs:
|
|
3905
|
+
for historical_run in session.runs:
|
|
3906
|
+
# Add generated audios from previous runs
|
|
3907
|
+
if historical_run.audio:
|
|
3908
|
+
for artifact in historical_run.audio:
|
|
3909
|
+
try:
|
|
3910
|
+
if artifact.url:
|
|
3911
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3912
|
+
elif artifact.base64_audio:
|
|
3913
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3914
|
+
except Exception as e:
|
|
3915
|
+
log_warning(f"Error converting historical AudioArtifact to Audio: {e}")
|
|
3916
|
+
continue
|
|
3917
|
+
log_debug(
|
|
3918
|
+
f"Added {len(historical_run.audio)} generated audios from historical run {historical_run.run_id}"
|
|
3919
|
+
)
|
|
3920
|
+
|
|
3921
|
+
# Add input audios from previous runs
|
|
3922
|
+
if historical_run.input and historical_run.input.audios:
|
|
3923
|
+
for artifact in historical_run.input.audios:
|
|
3924
|
+
try:
|
|
3925
|
+
if artifact.url:
|
|
3926
|
+
joint_audios.append(Audio(url=artifact.url))
|
|
3927
|
+
elif artifact.base64_audio:
|
|
3928
|
+
joint_audios.append(Audio(content=artifact.base64_audio))
|
|
3929
|
+
except Exception as e:
|
|
3930
|
+
log_warning(f"Error converting input AudioArtifact to Audio: {e}")
|
|
3931
|
+
continue
|
|
3932
|
+
log_debug(
|
|
3933
|
+
f"Added {len(historical_run.input.audios)} input audios from historical run {historical_run.run_id}"
|
|
3934
|
+
)
|
|
3935
|
+
except Exception as e:
|
|
3936
|
+
log_debug(f"Could not access session history for audios: {e}")
|
|
3937
|
+
|
|
3938
|
+
if joint_audios:
|
|
3939
|
+
log_debug(f"Audios Available to Model: {len(joint_audios)} audios")
|
|
3940
|
+
return joint_audios if joint_audios else None
|
|
3941
|
+
|
|
3942
|
+
def _collect_joint_files(
|
|
3943
|
+
self,
|
|
3944
|
+
run_input: Optional[RunInput] = None,
|
|
3945
|
+
) -> Optional[Sequence[File]]:
|
|
3946
|
+
"""Collect files from input and session history."""
|
|
3947
|
+
from agno.utils.log import log_debug
|
|
3948
|
+
|
|
3949
|
+
joint_files: List[File] = []
|
|
3950
|
+
|
|
3951
|
+
# 1. Add files from current input
|
|
3952
|
+
if run_input and run_input.files:
|
|
3953
|
+
joint_files.extend(run_input.files)
|
|
3954
|
+
|
|
3955
|
+
# TODO: Files aren't stored in session history yet and dont have a FileArtifact
|
|
3956
|
+
|
|
3957
|
+
if joint_files:
|
|
3958
|
+
log_debug(f"Files Available to Model: {len(joint_files)} files")
|
|
3959
|
+
|
|
3960
|
+
return joint_files if joint_files else None
|
|
3961
|
+
|
|
3707
3962
|
def _determine_tools_for_model(
|
|
3708
3963
|
self,
|
|
3709
3964
|
model: Model,
|
|
@@ -3802,8 +4057,27 @@ class Agent:
|
|
|
3802
4057
|
|
|
3803
4058
|
# Update the session state for the functions
|
|
3804
4059
|
if self._functions_for_model:
|
|
4060
|
+
from inspect import signature
|
|
4061
|
+
|
|
4062
|
+
# Check if any functions need media before collecting
|
|
4063
|
+
needs_media = any(
|
|
4064
|
+
any(param in signature(func.entrypoint).parameters for param in ["images", "videos", "audios", "files"])
|
|
4065
|
+
for func in self._functions_for_model.values()
|
|
4066
|
+
if func.entrypoint is not None
|
|
4067
|
+
)
|
|
4068
|
+
|
|
4069
|
+
# Only collect media if functions actually need them
|
|
4070
|
+
joint_images = self._collect_joint_images(run_response.input, session) if needs_media else None
|
|
4071
|
+
joint_files = self._collect_joint_files(run_response.input) if needs_media else None
|
|
4072
|
+
joint_audios = self._collect_joint_audios(run_response.input, session) if needs_media else None
|
|
4073
|
+
joint_videos = self._collect_joint_videos(run_response.input, session) if needs_media else None
|
|
4074
|
+
|
|
3805
4075
|
for func in self._functions_for_model.values():
|
|
3806
4076
|
func._session_state = session_state
|
|
4077
|
+
func._images = joint_images
|
|
4078
|
+
func._files = joint_files
|
|
4079
|
+
func._audios = joint_audios
|
|
4080
|
+
func._videos = joint_videos
|
|
3807
4081
|
|
|
3808
4082
|
def _model_should_return_structured_output(self):
|
|
3809
4083
|
self.model = cast(Model, self.model)
|
|
@@ -4102,7 +4376,7 @@ class Agent:
|
|
|
4102
4376
|
|
|
4103
4377
|
return agent_session
|
|
4104
4378
|
|
|
4105
|
-
|
|
4379
|
+
log_debug(f"AgentSession {session_id_to_load} not found in db")
|
|
4106
4380
|
return None
|
|
4107
4381
|
|
|
4108
4382
|
def save_session(self, session: AgentSession) -> None:
|
|
@@ -4656,10 +4930,10 @@ class Agent:
|
|
|
4656
4930
|
return Message(
|
|
4657
4931
|
role=self.user_message_role,
|
|
4658
4932
|
content=input,
|
|
4659
|
-
images=images,
|
|
4660
|
-
audio=audio,
|
|
4661
|
-
videos=videos,
|
|
4662
|
-
files=files,
|
|
4933
|
+
images=None if not self.send_media_to_model else images,
|
|
4934
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4935
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4936
|
+
files=None if not self.send_media_to_model else files,
|
|
4663
4937
|
**kwargs,
|
|
4664
4938
|
)
|
|
4665
4939
|
# 2. Build the user message for the Agent
|
|
@@ -4669,10 +4943,10 @@ class Agent:
|
|
|
4669
4943
|
return Message(
|
|
4670
4944
|
role=self.user_message_role,
|
|
4671
4945
|
content="",
|
|
4672
|
-
images=images,
|
|
4673
|
-
audio=audio,
|
|
4674
|
-
videos=videos,
|
|
4675
|
-
files=files,
|
|
4946
|
+
images=None if not self.send_media_to_model else images,
|
|
4947
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4948
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4949
|
+
files=None if not self.send_media_to_model else files,
|
|
4676
4950
|
**kwargs,
|
|
4677
4951
|
)
|
|
4678
4952
|
else:
|
|
@@ -4691,10 +4965,10 @@ class Agent:
|
|
|
4691
4965
|
return Message(
|
|
4692
4966
|
role=self.user_message_role,
|
|
4693
4967
|
content=message_content,
|
|
4694
|
-
images=images,
|
|
4695
|
-
audio=audio,
|
|
4696
|
-
videos=videos,
|
|
4697
|
-
files=files,
|
|
4968
|
+
images=None if not self.send_media_to_model else images,
|
|
4969
|
+
audio=None if not self.send_media_to_model else audio,
|
|
4970
|
+
videos=None if not self.send_media_to_model else videos,
|
|
4971
|
+
files=None if not self.send_media_to_model else files,
|
|
4698
4972
|
**kwargs,
|
|
4699
4973
|
)
|
|
4700
4974
|
|
|
@@ -4785,10 +5059,10 @@ class Agent:
|
|
|
4785
5059
|
return Message(
|
|
4786
5060
|
role=self.user_message_role,
|
|
4787
5061
|
content=user_msg_content,
|
|
4788
|
-
audio=audio,
|
|
4789
|
-
images=images,
|
|
4790
|
-
videos=videos,
|
|
4791
|
-
files=files,
|
|
5062
|
+
audio=None if not self.send_media_to_model else audio,
|
|
5063
|
+
images=None if not self.send_media_to_model else images,
|
|
5064
|
+
videos=None if not self.send_media_to_model else videos,
|
|
5065
|
+
files=None if not self.send_media_to_model else files,
|
|
4792
5066
|
**kwargs,
|
|
4793
5067
|
)
|
|
4794
5068
|
|
|
@@ -4836,7 +5110,7 @@ class Agent:
|
|
|
4836
5110
|
)
|
|
4837
5111
|
"""
|
|
4838
5112
|
|
|
4839
|
-
# Initialize the RunMessages object
|
|
5113
|
+
# Initialize the RunMessages object (no media here - that's in RunInput now)
|
|
4840
5114
|
run_messages = RunMessages()
|
|
4841
5115
|
|
|
4842
5116
|
# 1. Add system message to run_messages
|
|
@@ -6578,6 +6852,7 @@ class Agent:
|
|
|
6578
6852
|
|
|
6579
6853
|
if self.output_schema is not None:
|
|
6580
6854
|
markdown = False
|
|
6855
|
+
markdown = False
|
|
6581
6856
|
|
|
6582
6857
|
if stream is None:
|
|
6583
6858
|
stream = self.stream or False
|
|
@@ -6851,6 +7126,106 @@ class Agent:
|
|
|
6851
7126
|
|
|
6852
7127
|
return effective_filters
|
|
6853
7128
|
|
|
7129
|
+
def _scrub_media_from_run_output(self, run_response: RunOutput) -> None:
|
|
7130
|
+
"""
|
|
7131
|
+
Completely remove all media from RunOutput when store_media=False.
|
|
7132
|
+
This includes media in input, output artifacts, and all messages.
|
|
7133
|
+
"""
|
|
7134
|
+
# 1. Scrub RunInput media
|
|
7135
|
+
if run_response.input is not None:
|
|
7136
|
+
run_response.input.images = []
|
|
7137
|
+
run_response.input.videos = []
|
|
7138
|
+
run_response.input.audios = []
|
|
7139
|
+
run_response.input.files = []
|
|
7140
|
+
|
|
7141
|
+
# 2. RunOutput artifact media are skipped since we don't store them when store_media=False
|
|
7142
|
+
|
|
7143
|
+
# 3. Scrub media from all messages
|
|
7144
|
+
if run_response.messages:
|
|
7145
|
+
for message in run_response.messages:
|
|
7146
|
+
self._scrub_media_from_message(message)
|
|
7147
|
+
|
|
7148
|
+
# 4. Scrub media from additional_input messages if any
|
|
7149
|
+
if run_response.additional_input:
|
|
7150
|
+
for message in run_response.additional_input:
|
|
7151
|
+
self._scrub_media_from_message(message)
|
|
7152
|
+
|
|
7153
|
+
# 5. Scrub media from reasoning_messages if any
|
|
7154
|
+
if run_response.reasoning_messages:
|
|
7155
|
+
for message in run_response.reasoning_messages:
|
|
7156
|
+
self._scrub_media_from_message(message)
|
|
7157
|
+
|
|
7158
|
+
def _scrub_media_from_message(self, message: Message) -> None:
|
|
7159
|
+
"""Remove all media from a Message object."""
|
|
7160
|
+
# Input media
|
|
7161
|
+
message.images = None
|
|
7162
|
+
message.videos = None
|
|
7163
|
+
message.audio = None
|
|
7164
|
+
message.files = None
|
|
7165
|
+
|
|
7166
|
+
# Output media
|
|
7167
|
+
message.audio_output = None
|
|
7168
|
+
message.image_output = None
|
|
7169
|
+
message.video_output = None
|
|
7170
|
+
|
|
7171
|
+
def _convert_media_to_artifacts(
|
|
7172
|
+
self,
|
|
7173
|
+
images: Optional[Sequence[Image]] = None,
|
|
7174
|
+
videos: Optional[Sequence[Video]] = None,
|
|
7175
|
+
audios: Optional[Sequence[Audio]] = None,
|
|
7176
|
+
) -> tuple:
|
|
7177
|
+
"""Convert raw Image/Video/Audio objects to ImageArtifact/VideoArtifact/AudioArtifact objects."""
|
|
7178
|
+
from uuid import uuid4
|
|
7179
|
+
|
|
7180
|
+
from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
|
|
7181
|
+
|
|
7182
|
+
image_artifacts = None
|
|
7183
|
+
if images:
|
|
7184
|
+
image_artifacts = []
|
|
7185
|
+
for img in images:
|
|
7186
|
+
try:
|
|
7187
|
+
artifact_id = img.id if hasattr(img, "id") and img.id else str(uuid4())
|
|
7188
|
+
|
|
7189
|
+
if img.url:
|
|
7190
|
+
image_artifacts.append(ImageArtifact(id=artifact_id, url=img.url))
|
|
7191
|
+
elif img.content:
|
|
7192
|
+
image_artifacts.append(ImageArtifact(id=artifact_id, content=img.content))
|
|
7193
|
+
except Exception as e:
|
|
7194
|
+
log_warning(f"Error creating ImageArtifact: {e}")
|
|
7195
|
+
continue
|
|
7196
|
+
|
|
7197
|
+
video_artifacts = None
|
|
7198
|
+
if videos:
|
|
7199
|
+
video_artifacts = []
|
|
7200
|
+
for vid in videos:
|
|
7201
|
+
try:
|
|
7202
|
+
artifact_id = vid.id if hasattr(vid, "id") and vid.id else str(uuid4())
|
|
7203
|
+
|
|
7204
|
+
if vid.url:
|
|
7205
|
+
video_artifacts.append(VideoArtifact(id=artifact_id, url=vid.url))
|
|
7206
|
+
elif vid.content:
|
|
7207
|
+
video_artifacts.append(VideoArtifact(id=artifact_id, content=vid.content))
|
|
7208
|
+
except Exception as e:
|
|
7209
|
+
log_warning(f"Error creating VideoArtifact: {e}")
|
|
7210
|
+
continue
|
|
7211
|
+
|
|
7212
|
+
audio_artifacts = None
|
|
7213
|
+
if audios:
|
|
7214
|
+
audio_artifacts = []
|
|
7215
|
+
for aud in audios:
|
|
7216
|
+
try:
|
|
7217
|
+
artifact_id = aud.id if hasattr(aud, "id") and aud.id else str(uuid4())
|
|
7218
|
+
|
|
7219
|
+
if aud.url:
|
|
7220
|
+
audio_artifacts.append(AudioArtifact(id=artifact_id, url=aud.url))
|
|
7221
|
+
elif aud.content:
|
|
7222
|
+
audio_artifacts.append(AudioArtifact(id=artifact_id, content=aud.content))
|
|
7223
|
+
except Exception as e:
|
|
7224
|
+
log_warning(f"Error creating AudioArtifact: {e}")
|
|
7225
|
+
continue
|
|
7226
|
+
|
|
7227
|
+
return image_artifacts, video_artifacts, audio_artifacts
|
|
7228
|
+
|
|
6854
7229
|
def cli_app(
|
|
6855
7230
|
self,
|
|
6856
7231
|
input: Optional[str] = None,
|