agno 1.7.6__tar.gz → 1.7.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agno-1.7.6 → agno-1.7.8}/PKG-INFO +8 -6
- {agno-1.7.6 → agno-1.7.8}/agno/agent/agent.py +224 -37
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/app.py +3 -2
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/youtube_reader.py +8 -4
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/openai.py +5 -1
- {agno-1.7.6 → agno-1.7.8}/agno/models/anthropic/claude.py +10 -2
- {agno-1.7.6 → agno-1.7.8}/agno/models/base.py +4 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/google/gemini.py +26 -6
- {agno-1.7.6 → agno-1.7.8}/agno/models/litellm/chat.py +26 -4
- {agno-1.7.6 → agno-1.7.8}/agno/models/message.py +7 -2
- {agno-1.7.6 → agno-1.7.8}/agno/models/openai/chat.py +3 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/openai/responses.py +6 -5
- {agno-1.7.6 → agno-1.7.8}/agno/run/response.py +31 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/team.py +17 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/gcs_json.py +1 -1
- {agno-1.7.6 → agno-1.7.8}/agno/storage/json.py +2 -1
- {agno-1.7.6 → agno-1.7.8}/agno/storage/mysql.py +1 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/postgres.py +4 -3
- {agno-1.7.6 → agno-1.7.8}/agno/storage/redis.py +1 -1
- {agno-1.7.6 → agno-1.7.8}/agno/storage/yaml.py +1 -1
- {agno-1.7.6 → agno-1.7.8}/agno/team/team.py +438 -244
- {agno-1.7.6 → agno-1.7.8}/agno/tools/function.py +21 -11
- agno-1.7.8/agno/tools/googlecalendar.py +646 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/googlesheets.py +6 -1
- {agno-1.7.6 → agno-1.7.8}/agno/tools/jina.py +13 -6
- {agno-1.7.6 → agno-1.7.8}/agno/tools/mcp.py +178 -23
- agno-1.7.8/agno/tools/models/morph.py +186 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/postgres.py +31 -26
- {agno-1.7.6 → agno-1.7.8}/agno/tools/zep.py +21 -32
- {agno-1.7.6 → agno-1.7.8}/agno/utils/events.py +50 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/claude.py +1 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/response.py +3 -1
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/workflow.py +6 -6
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/PKG-INFO +8 -6
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/SOURCES.txt +1 -0
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/requires.txt +8 -5
- {agno-1.7.6 → agno-1.7.8}/pyproject.toml +7 -6
- agno-1.7.6/agno/tools/googlecalendar.py +0 -200
- {agno-1.7.6 → agno-1.7.8}/LICENSE +0 -0
- {agno-1.7.6 → agno-1.7.8}/README.md +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/agent/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/agent/metrics.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/agent.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/api.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/evals.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/playground.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/routes.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/agent.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/evals.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/playground.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/response.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/team.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/user.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/workflows.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/schemas/workspace.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/team.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/user.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/workflows.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/api/workspace.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/agui/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/agui/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/agui/async_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/agui/sync_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/agui/utils.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/discord/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/discord/client.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/fastapi/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/fastapi/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/fastapi/async_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/fastapi/sync_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/async_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/deploy.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/operator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/schemas.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/serve.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/settings.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/sync_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/playground/utils.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/settings.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/slack/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/slack/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/slack/async_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/slack/security.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/slack/sync_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/utils.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/whatsapp/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/whatsapp/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/whatsapp/async_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/whatsapp/security.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/app/whatsapp/sync_router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/auth_server.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/config.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/console.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/credentials.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/entrypoint.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/operator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/settings.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/ws/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/cli/ws/ws_cli.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/constants.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/debug.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/agentic.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/document.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/fixed.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/markdown.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/recursive.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/row.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/semantic.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/chunking/strategy.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/arxiv_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/csv_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/docx_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/firecrawl_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/gcs/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/gcs/pdf_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/json_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/markdown_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/pdf_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/s3/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/s3/pdf_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/s3/text_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/text_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/url_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/document/reader/website_reader.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/aws_bedrock.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/azure_openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/cohere.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/fastembed.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/fireworks.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/google.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/huggingface.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/jina.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/langdb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/mistral.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/nebius.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/ollama.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/sentence_transformer.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/together.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/embedder/voyageai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/eval/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/eval/accuracy.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/eval/performance.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/eval/reliability.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/eval/utils.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/exceptions.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/file/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/file/file.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/file/local/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/file/local/csv.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/file/local/txt.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/context.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/db_app.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/resource.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/infra/resources.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/agent.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/arxiv.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/combined.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/csv.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/csv_url.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/document.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/docx.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/firecrawl.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/gcs/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/gcs/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/gcs/pdf.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/json.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/langchain.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/light_rag.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/llamaindex.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/markdown.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/pdf.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/pdf_bytes.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/pdf_url.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/s3/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/s3/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/s3/pdf.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/s3/text.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/text.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/url.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/website.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/wikipedia.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/knowledge/youtube.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/media.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/agent.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/classifier.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/db/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/db/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/db/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/db/postgres.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/db/sqlite.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/manager.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/memory.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/row.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/summarizer.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/summary.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/team.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/firestore.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/postgres.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/redis.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/schema.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/db/sqlite.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/manager.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/memory.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/schema.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/v2/summarizer.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/memory/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/aimlapi/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/anthropic/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/aws/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/aws/bedrock.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/aws/claude.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/azure/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/azure/ai_foundry.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/azure/openai_chat.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/cerebras/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/cerebras/cerebras.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/cohere/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/cohere/chat.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/deepinfra/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/deepseek/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/deepseek/deepseek.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/defaults.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/fireworks/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/fireworks/fireworks.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/google/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/groq/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/groq/groq.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/huggingface/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/huggingface/huggingface.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/ibm/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/ibm/watsonx.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/internlm/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/internlm/internlm.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/langdb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/langdb/langdb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/litellm/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/lmstudio/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/meta/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/meta/llama.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/meta/llama_openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/mistral/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/mistral/mistral.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/nebius/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/nebius/nebius.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/nvidia/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/nvidia/nvidia.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/ollama/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/ollama/chat.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/ollama/tools.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/openai/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/openai/like.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/openrouter/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/openrouter/openrouter.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/perplexity/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/perplexity/perplexity.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/portkey/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/portkey/portkey.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/response.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/sambanova/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/sambanova/sambanova.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/together/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/together/together.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/vercel/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/vercel/v0.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/vllm/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/vllm/vllm.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/xai/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/models/xai/xai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/playground/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/playground/deploy.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/playground/playground.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/playground/serve.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/playground/settings.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/py.typed +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/deepseek.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/default.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/groq.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/helpers.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/ollama.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reasoning/step.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reranker/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reranker/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reranker/cohere.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reranker/infinity.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/reranker/sentence_transformer.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/messages.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/v2/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/v2/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/run/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/dynamodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/json.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/postgres.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/singlestore.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/sqlite.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/agent/yaml.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/dynamodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/firestore.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/agent.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/team.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/v2/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/v2/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/session/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/singlestore.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/sqlite.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/workflow/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/workflow/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/workflow/postgres.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/storage/workflow/sqlite.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/team/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/agentql.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/airflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/api.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/apify.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/arxiv.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/aws_lambda.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/aws_ses.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/baidusearch.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/bitbucket.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/bravesearch.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/brightdata.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/browserbase.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/calcom.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/calculator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/cartesia.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/clickup_tool.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/confluence.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/crawl4ai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/csv_toolkit.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/dalle.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/daytona.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/decorator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/desi_vocal.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/discord.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/docker.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/duckdb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/duckduckgo.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/e2b.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/eleven_labs.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/email.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/evm.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/exa.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/fal.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/file.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/financial_datasets.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/firecrawl.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/giphy.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/github.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/gmail.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/google_bigquery.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/google_maps.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/googlesearch.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/hackernews.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/jira.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/knowledge.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/linear.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/linkup.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/local_file_system.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/lumalab.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/mem0.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/mlx_transcribe.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models/azure_openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models/gemini.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models/groq.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models/nebius.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/models_labs.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/moviepy_video.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/newspaper.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/newspaper4k.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/openbb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/opencv.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/openweather.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/oxylabs.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/pandas.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/pubmed.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/python.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/reasoning.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/reddit.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/replicate.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/resend.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/scrapegraph.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/searxng.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/serpapi.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/serper.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/shell.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/slack.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/sleep.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/spider.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/sql.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/streamlit/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/streamlit/components.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/tavily.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/telegram.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/thinking.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/todoist.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/tool_registry.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/toolkit.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/trello.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/twilio.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/user_control_flow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/valyu.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/visualization.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/webbrowser.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/webex.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/website.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/webtools.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/whatsapp.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/wikipedia.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/x.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/yfinance.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/youtube.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/zendesk.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/tools/zoom.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/audio.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/certs.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/code_execution.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/common.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/defaults.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/dttm.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/enum.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/env.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/filesystem.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/format_str.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/functions.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/gemini.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/git.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/http.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/json_io.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/json_schema.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/load_env.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/location.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/log.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/mcp.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/media.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/merge_dict.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/message.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/ai_foundry.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/aws_claude.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/cohere.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/llama.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/mistral.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/openai_responses.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/schema_utils.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/models/watsonx.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/openai.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/pickle.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/pprint.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/prompts.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/py_io.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/pyproject.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/resource_filter.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/response_iterator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/safe_formatter.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/shell.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/string.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/timer.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/tools.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/web.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/whatsapp.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/utils/yaml_io.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/base.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/cassandra/index.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/distance.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/pgvector/index.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/search.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/singlestore/index.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/surrealdb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/surrealdb/surrealdb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/weaviate/index.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/condition.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/loop.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/parallel.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/router.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/step.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/steps.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/v2/types.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workflow/workflow.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/__init__.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/config.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/enums.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/helpers.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/operator.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno/workspace/settings.py +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/dependency_links.txt +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/entry_points.txt +0 -0
- {agno-1.7.6 → agno-1.7.8}/agno.egg-info/top_level.txt +0 -0
- {agno-1.7.6 → agno-1.7.8}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agno
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.8
|
|
4
4
|
Summary: Agno: a lightweight library for building Multi-Agent Systems
|
|
5
5
|
Author-email: Ashpreet Bedi <ashpreet@agno.com>
|
|
6
6
|
License: Copyright (c) Agno, Inc.
|
|
@@ -421,7 +421,6 @@ Requires-Dist: types-pyyaml; extra == "dev"
|
|
|
421
421
|
Requires-Dist: types-aiofiles; extra == "dev"
|
|
422
422
|
Requires-Dist: fastapi; extra == "dev"
|
|
423
423
|
Requires-Dist: uvicorn; extra == "dev"
|
|
424
|
-
Requires-Dist: arxiv; extra == "dev"
|
|
425
424
|
Provides-Extra: integration-tests
|
|
426
425
|
Requires-Dist: exa_py; extra == "integration-tests"
|
|
427
426
|
Requires-Dist: duckduckgo-search; extra == "integration-tests"
|
|
@@ -481,6 +480,8 @@ Provides-Extra: agentql
|
|
|
481
480
|
Requires-Dist: agentql; extra == "agentql"
|
|
482
481
|
Provides-Extra: apify
|
|
483
482
|
Requires-Dist: apify-client; extra == "apify"
|
|
483
|
+
Provides-Extra: arxiv
|
|
484
|
+
Requires-Dist: arxiv; extra == "arxiv"
|
|
484
485
|
Provides-Extra: brave
|
|
485
486
|
Requires-Dist: brave-search; extra == "brave"
|
|
486
487
|
Provides-Extra: browserbase
|
|
@@ -528,8 +529,9 @@ Requires-Dist: newspaper4k; extra == "newspaper"
|
|
|
528
529
|
Requires-Dist: lxml_html_clean; extra == "newspaper"
|
|
529
530
|
Provides-Extra: opencv
|
|
530
531
|
Requires-Dist: opencv-python; extra == "opencv"
|
|
531
|
-
Provides-Extra:
|
|
532
|
-
Requires-Dist:
|
|
532
|
+
Provides-Extra: psycopg
|
|
533
|
+
Requires-Dist: psycopg-binary; extra == "psycopg"
|
|
534
|
+
Requires-Dist: psycopg; extra == "psycopg"
|
|
533
535
|
Provides-Extra: todoist
|
|
534
536
|
Requires-Dist: todoist-api-python; extra == "todoist"
|
|
535
537
|
Provides-Extra: valyu
|
|
@@ -550,7 +552,6 @@ Provides-Extra: sql
|
|
|
550
552
|
Requires-Dist: sqlalchemy; extra == "sql"
|
|
551
553
|
Provides-Extra: postgres
|
|
552
554
|
Requires-Dist: psycopg-binary; extra == "postgres"
|
|
553
|
-
Requires-Dist: psycopg; extra == "postgres"
|
|
554
555
|
Provides-Extra: sqlite
|
|
555
556
|
Requires-Dist: sqlalchemy; extra == "sqlite"
|
|
556
557
|
Provides-Extra: gcs
|
|
@@ -632,6 +633,7 @@ Requires-Dist: agno[openai]; extra == "models"
|
|
|
632
633
|
Requires-Dist: agno[portkey]; extra == "models"
|
|
633
634
|
Provides-Extra: tools
|
|
634
635
|
Requires-Dist: agno[apify]; extra == "tools"
|
|
636
|
+
Requires-Dist: agno[arxiv]; extra == "tools"
|
|
635
637
|
Requires-Dist: agno[brave]; extra == "tools"
|
|
636
638
|
Requires-Dist: agno[exa]; extra == "tools"
|
|
637
639
|
Requires-Dist: agno[cartesia]; extra == "tools"
|
|
@@ -660,7 +662,7 @@ Requires-Dist: agno[oxylabs]; extra == "tools"
|
|
|
660
662
|
Requires-Dist: agno[zep]; extra == "tools"
|
|
661
663
|
Requires-Dist: agno[mem0]; extra == "tools"
|
|
662
664
|
Requires-Dist: agno[google_bigquery]; extra == "tools"
|
|
663
|
-
Requires-Dist: agno[
|
|
665
|
+
Requires-Dist: agno[psycopg]; extra == "tools"
|
|
664
666
|
Provides-Extra: storage
|
|
665
667
|
Requires-Dist: agno[sql]; extra == "storage"
|
|
666
668
|
Requires-Dist: agno[postgres]; extra == "storage"
|
|
@@ -274,6 +274,10 @@ class Agent:
|
|
|
274
274
|
parser_model: Optional[Model] = None
|
|
275
275
|
# Provide a prompt for the parser model
|
|
276
276
|
parser_model_prompt: Optional[str] = None
|
|
277
|
+
# Provide an output model to structure the response from the main model
|
|
278
|
+
output_model: Optional[Model] = None
|
|
279
|
+
# Provide a prompt for the output model
|
|
280
|
+
output_model_prompt: Optional[str] = None
|
|
277
281
|
# If True, the response from the Model is converted into the response_model
|
|
278
282
|
# Otherwise, the response is returned as a JSON string
|
|
279
283
|
parse_response: bool = True
|
|
@@ -414,6 +418,8 @@ class Agent:
|
|
|
414
418
|
parser_model_prompt: Optional[str] = None,
|
|
415
419
|
response_model: Optional[Type[BaseModel]] = None,
|
|
416
420
|
parse_response: bool = True,
|
|
421
|
+
output_model: Optional[Model] = None,
|
|
422
|
+
output_model_prompt: Optional[str] = None,
|
|
417
423
|
structured_outputs: Optional[bool] = None,
|
|
418
424
|
use_json_mode: bool = False,
|
|
419
425
|
save_response_to_file: Optional[str] = None,
|
|
@@ -517,6 +523,8 @@ class Agent:
|
|
|
517
523
|
self.parser_model_prompt = parser_model_prompt
|
|
518
524
|
self.response_model = response_model
|
|
519
525
|
self.parse_response = parse_response
|
|
526
|
+
self.output_model = output_model
|
|
527
|
+
self.output_model_prompt = output_model_prompt
|
|
520
528
|
|
|
521
529
|
self.structured_outputs = structured_outputs
|
|
522
530
|
|
|
@@ -713,15 +721,6 @@ class Agent:
|
|
|
713
721
|
if self.workflow_session_state is not None:
|
|
714
722
|
self.workflow_session_state["current_user_id"] = user_id
|
|
715
723
|
|
|
716
|
-
def _reset_session_state(self) -> None:
|
|
717
|
-
"""Reset the session state for the agent."""
|
|
718
|
-
if self.team_session_state is not None:
|
|
719
|
-
self.team_session_state.pop("current_session_id", None)
|
|
720
|
-
self.team_session_state.pop("current_user_id", None)
|
|
721
|
-
if self.session_state is not None:
|
|
722
|
-
self.session_state.pop("current_session_id", None)
|
|
723
|
-
self.session_state.pop("current_user_id", None)
|
|
724
|
-
|
|
725
724
|
def _initialize_session(
|
|
726
725
|
self,
|
|
727
726
|
session_id: Optional[str] = None,
|
|
@@ -800,6 +799,8 @@ class Agent:
|
|
|
800
799
|
tool_call_limit=self.tool_call_limit,
|
|
801
800
|
response_format=response_format,
|
|
802
801
|
)
|
|
802
|
+
# If an output model is provided, generate output using the output model
|
|
803
|
+
self._generate_response_with_output_model(model_response, run_messages)
|
|
803
804
|
|
|
804
805
|
# If a parser model is provided, structure the response separately
|
|
805
806
|
self._parse_response_with_parser_model(model_response, run_messages)
|
|
@@ -883,13 +884,33 @@ class Agent:
|
|
|
883
884
|
index_of_last_user_message = len(run_messages.messages)
|
|
884
885
|
|
|
885
886
|
# 2. Process model response
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
887
|
+
if self.output_model is None:
|
|
888
|
+
for event in self._handle_model_response_stream(
|
|
889
|
+
run_response=run_response,
|
|
890
|
+
run_messages=run_messages,
|
|
891
|
+
response_format=response_format,
|
|
892
|
+
stream_intermediate_steps=stream_intermediate_steps,
|
|
893
|
+
):
|
|
894
|
+
yield event
|
|
895
|
+
else:
|
|
896
|
+
from agno.utils.events import RunResponseContentEvent
|
|
897
|
+
|
|
898
|
+
for event in self._handle_model_response_stream(
|
|
899
|
+
run_response=run_response,
|
|
900
|
+
run_messages=run_messages,
|
|
901
|
+
response_format=response_format,
|
|
902
|
+
stream_intermediate_steps=stream_intermediate_steps,
|
|
903
|
+
):
|
|
904
|
+
if isinstance(event, RunResponseContentEvent):
|
|
905
|
+
if stream_intermediate_steps:
|
|
906
|
+
yield event
|
|
907
|
+
else:
|
|
908
|
+
yield event
|
|
909
|
+
|
|
910
|
+
# If an output model is provided, generate output using the output model
|
|
911
|
+
yield from self._generate_response_with_output_model_stream(
|
|
912
|
+
run_response=run_response, run_messages=run_messages
|
|
913
|
+
)
|
|
893
914
|
|
|
894
915
|
# If a parser model is provided, structure the response separately
|
|
895
916
|
yield from self._parse_response_with_parser_model_stream(
|
|
@@ -1162,8 +1183,6 @@ class Agent:
|
|
|
1162
1183
|
)
|
|
1163
1184
|
else:
|
|
1164
1185
|
return self.run_response
|
|
1165
|
-
finally:
|
|
1166
|
-
self._reset_session_state()
|
|
1167
1186
|
|
|
1168
1187
|
# If we get here, all retries failed
|
|
1169
1188
|
if last_exception is not None:
|
|
@@ -1219,6 +1238,9 @@ class Agent:
|
|
|
1219
1238
|
response_format=response_format,
|
|
1220
1239
|
)
|
|
1221
1240
|
|
|
1241
|
+
# If an output model is provided, generate output using the output model
|
|
1242
|
+
await self._agenerate_response_with_output_model(model_response=model_response, run_messages=run_messages)
|
|
1243
|
+
|
|
1222
1244
|
# If a parser model is provided, structure the response separately
|
|
1223
1245
|
await self._aparse_response_with_parser_model(model_response=model_response, run_messages=run_messages)
|
|
1224
1246
|
|
|
@@ -1300,13 +1322,36 @@ class Agent:
|
|
|
1300
1322
|
index_of_last_user_message = len(run_messages.messages)
|
|
1301
1323
|
|
|
1302
1324
|
# 2. Generate a response from the Model
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1325
|
+
if self.output_model is None:
|
|
1326
|
+
async for event in self._ahandle_model_response_stream(
|
|
1327
|
+
run_response=run_response,
|
|
1328
|
+
run_messages=run_messages,
|
|
1329
|
+
response_format=response_format,
|
|
1330
|
+
stream_intermediate_steps=stream_intermediate_steps,
|
|
1331
|
+
):
|
|
1332
|
+
yield event
|
|
1333
|
+
else:
|
|
1334
|
+
from agno.utils.events import RunResponseContentEvent
|
|
1335
|
+
|
|
1336
|
+
async for event in self._ahandle_model_response_stream(
|
|
1337
|
+
run_response=run_response,
|
|
1338
|
+
run_messages=run_messages,
|
|
1339
|
+
response_format=response_format,
|
|
1340
|
+
stream_intermediate_steps=stream_intermediate_steps,
|
|
1341
|
+
):
|
|
1342
|
+
if isinstance(event, RunResponseContentEvent):
|
|
1343
|
+
if stream_intermediate_steps:
|
|
1344
|
+
yield event
|
|
1345
|
+
else:
|
|
1346
|
+
yield event
|
|
1347
|
+
|
|
1348
|
+
# If an output model is provided, generate output using the output model
|
|
1349
|
+
async for event in self._agenerate_response_with_output_model_stream(
|
|
1350
|
+
run_response=run_response,
|
|
1351
|
+
run_messages=run_messages,
|
|
1352
|
+
stream_intermediate_steps=stream_intermediate_steps,
|
|
1353
|
+
):
|
|
1354
|
+
yield event
|
|
1310
1355
|
|
|
1311
1356
|
# If a parser model is provided, structure the response separately
|
|
1312
1357
|
async for event in self._aparse_response_with_parser_model_stream(
|
|
@@ -1540,8 +1585,6 @@ class Agent:
|
|
|
1540
1585
|
)
|
|
1541
1586
|
else:
|
|
1542
1587
|
return self.run_response
|
|
1543
|
-
finally:
|
|
1544
|
-
self._reset_session_state()
|
|
1545
1588
|
|
|
1546
1589
|
# If we get here, all retries failed
|
|
1547
1590
|
if last_exception is not None:
|
|
@@ -1797,8 +1840,6 @@ class Agent:
|
|
|
1797
1840
|
return self.create_run_response(
|
|
1798
1841
|
run_state=RunStatus.cancelled, content="Operation cancelled by user", run_response=run_response
|
|
1799
1842
|
)
|
|
1800
|
-
finally:
|
|
1801
|
-
self._reset_session_state()
|
|
1802
1843
|
|
|
1803
1844
|
# If we get here, all retries failed
|
|
1804
1845
|
if last_exception is not None:
|
|
@@ -2196,8 +2237,6 @@ class Agent:
|
|
|
2196
2237
|
return self.create_run_response(
|
|
2197
2238
|
run_state=RunStatus.cancelled, content="Operation cancelled by user", run_response=run_response
|
|
2198
2239
|
)
|
|
2199
|
-
finally:
|
|
2200
|
-
self._reset_session_state()
|
|
2201
2240
|
|
|
2202
2241
|
# If we get here, all retries failed
|
|
2203
2242
|
if last_exception is not None:
|
|
@@ -3172,6 +3211,12 @@ class Agent:
|
|
|
3172
3211
|
model_response.thinking = (model_response.thinking or "") + model_response_event.thinking
|
|
3173
3212
|
run_response.thinking = model_response.thinking
|
|
3174
3213
|
|
|
3214
|
+
if model_response_event.reasoning_content is not None:
|
|
3215
|
+
model_response.reasoning_content = (
|
|
3216
|
+
model_response.reasoning_content or ""
|
|
3217
|
+
) + model_response_event.reasoning_content
|
|
3218
|
+
run_response.reasoning_content = model_response.reasoning_content
|
|
3219
|
+
|
|
3175
3220
|
if model_response_event.redacted_thinking is not None:
|
|
3176
3221
|
model_response.redacted_thinking = (
|
|
3177
3222
|
model_response.redacted_thinking or ""
|
|
@@ -3197,6 +3242,7 @@ class Agent:
|
|
|
3197
3242
|
elif (
|
|
3198
3243
|
model_response_event.content is not None
|
|
3199
3244
|
or model_response_event.thinking is not None
|
|
3245
|
+
or model_response_event.reasoning_content is not None
|
|
3200
3246
|
or model_response_event.redacted_thinking is not None
|
|
3201
3247
|
or model_response_event.citations is not None
|
|
3202
3248
|
):
|
|
@@ -3205,6 +3251,7 @@ class Agent:
|
|
|
3205
3251
|
from_run_response=run_response,
|
|
3206
3252
|
content=model_response_event.content,
|
|
3207
3253
|
thinking=model_response_event.thinking,
|
|
3254
|
+
reasoning_content=model_response_event.reasoning_content,
|
|
3208
3255
|
redacted_thinking=model_response_event.redacted_thinking,
|
|
3209
3256
|
citations=model_response_event.citations,
|
|
3210
3257
|
),
|
|
@@ -5051,6 +5098,24 @@ class Agent:
|
|
|
5051
5098
|
Message(role="user", content=run_response.content),
|
|
5052
5099
|
]
|
|
5053
5100
|
|
|
5101
|
+
def get_messages_for_output_model(self, messages: List[Message]) -> List[Message]:
|
|
5102
|
+
"""Get the messages for the output model."""
|
|
5103
|
+
|
|
5104
|
+
if self.output_model_prompt is not None:
|
|
5105
|
+
system_message_exists = False
|
|
5106
|
+
for message in messages:
|
|
5107
|
+
if message.role == "system":
|
|
5108
|
+
system_message_exists = True
|
|
5109
|
+
message.content = self.output_model_prompt
|
|
5110
|
+
break
|
|
5111
|
+
if not system_message_exists:
|
|
5112
|
+
messages.insert(0, Message(role="system", content=self.output_model_prompt))
|
|
5113
|
+
|
|
5114
|
+
# Remove the last assistant message from the messages list
|
|
5115
|
+
messages.pop(-1)
|
|
5116
|
+
|
|
5117
|
+
return messages
|
|
5118
|
+
|
|
5054
5119
|
def get_session_summary(self, session_id: Optional[str] = None, user_id: Optional[str] = None):
|
|
5055
5120
|
"""Get the session summary for the given session ID and user ID."""
|
|
5056
5121
|
if self.memory is None:
|
|
@@ -5299,6 +5364,8 @@ class Agent:
|
|
|
5299
5364
|
"""
|
|
5300
5365
|
from agno.document import Document
|
|
5301
5366
|
|
|
5367
|
+
if num_documents is None and self.knowledge is not None:
|
|
5368
|
+
num_documents = self.knowledge.num_documents
|
|
5302
5369
|
# Validate the filters against known valid filter keys
|
|
5303
5370
|
if self.knowledge is not None:
|
|
5304
5371
|
valid_filters, invalid_keys = self.knowledge.validate_filters(filters) # type: ignore
|
|
@@ -5338,9 +5405,6 @@ class Agent:
|
|
|
5338
5405
|
):
|
|
5339
5406
|
return None
|
|
5340
5407
|
|
|
5341
|
-
if num_documents is None:
|
|
5342
|
-
num_documents = self.knowledge.num_documents
|
|
5343
|
-
|
|
5344
5408
|
log_debug(f"Searching knowledge base with filters: {filters}")
|
|
5345
5409
|
relevant_docs: List[Document] = self.knowledge.search(
|
|
5346
5410
|
query=query, num_documents=num_documents, filters=filters
|
|
@@ -5361,6 +5425,9 @@ class Agent:
|
|
|
5361
5425
|
"""Get relevant documents from knowledge base asynchronously."""
|
|
5362
5426
|
from agno.document import Document
|
|
5363
5427
|
|
|
5428
|
+
if num_documents is None and self.knowledge is not None:
|
|
5429
|
+
num_documents = self.knowledge.num_documents
|
|
5430
|
+
|
|
5364
5431
|
# Validate the filters against known valid filter keys
|
|
5365
5432
|
if self.knowledge is not None:
|
|
5366
5433
|
valid_filters, invalid_keys = self.knowledge.validate_filters(filters) # type: ignore
|
|
@@ -5404,9 +5471,6 @@ class Agent:
|
|
|
5404
5471
|
):
|
|
5405
5472
|
return None
|
|
5406
5473
|
|
|
5407
|
-
if num_documents is None:
|
|
5408
|
-
num_documents = self.knowledge.num_documents
|
|
5409
|
-
|
|
5410
5474
|
log_debug(f"Searching knowledge base with filters: {filters}")
|
|
5411
5475
|
relevant_docs: List[Document] = await self.knowledge.async_search(
|
|
5412
5476
|
query=query, num_documents=num_documents, filters=filters
|
|
@@ -6372,6 +6436,99 @@ class Agent:
|
|
|
6372
6436
|
else:
|
|
6373
6437
|
log_warning("A response model is required to parse the response with a parser model")
|
|
6374
6438
|
|
|
6439
|
+
def _generate_response_with_output_model(self, model_response: ModelResponse, run_messages: RunMessages) -> None:
|
|
6440
|
+
"""Parse the model response using the output model."""
|
|
6441
|
+
if self.output_model is None:
|
|
6442
|
+
return
|
|
6443
|
+
|
|
6444
|
+
messages_for_output_model = self.get_messages_for_output_model(run_messages.messages)
|
|
6445
|
+
output_model_response: ModelResponse = self.output_model.response(messages=messages_for_output_model)
|
|
6446
|
+
model_response.content = output_model_response.content
|
|
6447
|
+
|
|
6448
|
+
def _generate_response_with_output_model_stream(
|
|
6449
|
+
self, run_response: RunResponse, run_messages: RunMessages, stream_intermediate_steps: bool = False
|
|
6450
|
+
):
|
|
6451
|
+
"""Parse the model response using the output model."""
|
|
6452
|
+
from agno.utils.events import (
|
|
6453
|
+
create_output_model_response_completed_event,
|
|
6454
|
+
create_output_model_response_started_event,
|
|
6455
|
+
)
|
|
6456
|
+
|
|
6457
|
+
if self.output_model is None:
|
|
6458
|
+
return
|
|
6459
|
+
|
|
6460
|
+
if stream_intermediate_steps:
|
|
6461
|
+
yield self._handle_event(create_output_model_response_started_event(run_response), run_response)
|
|
6462
|
+
|
|
6463
|
+
messages_for_output_model = self.get_messages_for_output_model(run_messages.messages)
|
|
6464
|
+
|
|
6465
|
+
model_response = ModelResponse(content="")
|
|
6466
|
+
|
|
6467
|
+
for model_response_event in self.output_model.response_stream(messages=messages_for_output_model):
|
|
6468
|
+
yield from self._handle_model_response_chunk(
|
|
6469
|
+
run_response=run_response,
|
|
6470
|
+
model_response=model_response,
|
|
6471
|
+
model_response_event=model_response_event,
|
|
6472
|
+
)
|
|
6473
|
+
|
|
6474
|
+
if stream_intermediate_steps:
|
|
6475
|
+
yield self._handle_event(create_output_model_response_completed_event(run_response), run_response)
|
|
6476
|
+
|
|
6477
|
+
# Build a list of messages that should be added to the RunResponse
|
|
6478
|
+
messages_for_run_response = [m for m in run_messages.messages if m.add_to_agent_memory]
|
|
6479
|
+
# Update the RunResponse messages
|
|
6480
|
+
run_response.messages = messages_for_run_response
|
|
6481
|
+
# Update the RunResponse metrics
|
|
6482
|
+
run_response.metrics = self.aggregate_metrics_from_messages(messages_for_run_response)
|
|
6483
|
+
|
|
6484
|
+
async def _agenerate_response_with_output_model(self, model_response: ModelResponse, run_messages: RunMessages):
|
|
6485
|
+
"""Parse the model response using the output model."""
|
|
6486
|
+
if self.output_model is None:
|
|
6487
|
+
return
|
|
6488
|
+
|
|
6489
|
+
messages_for_output_model = self.get_messages_for_output_model(run_messages.messages)
|
|
6490
|
+
output_model_response: ModelResponse = await self.output_model.aresponse(messages=messages_for_output_model)
|
|
6491
|
+
model_response.content = output_model_response.content
|
|
6492
|
+
|
|
6493
|
+
async def _agenerate_response_with_output_model_stream(
|
|
6494
|
+
self, run_response: RunResponse, run_messages: RunMessages, stream_intermediate_steps: bool = False
|
|
6495
|
+
):
|
|
6496
|
+
"""Parse the model response using the output model."""
|
|
6497
|
+
from agno.utils.events import (
|
|
6498
|
+
create_output_model_response_completed_event,
|
|
6499
|
+
create_output_model_response_started_event,
|
|
6500
|
+
)
|
|
6501
|
+
|
|
6502
|
+
if self.output_model is None:
|
|
6503
|
+
return
|
|
6504
|
+
|
|
6505
|
+
if stream_intermediate_steps:
|
|
6506
|
+
yield self._handle_event(create_output_model_response_started_event(run_response), run_response)
|
|
6507
|
+
|
|
6508
|
+
messages_for_output_model = self.get_messages_for_output_model(run_messages.messages)
|
|
6509
|
+
|
|
6510
|
+
model_response = ModelResponse(content="")
|
|
6511
|
+
|
|
6512
|
+
model_response_stream = self.output_model.aresponse_stream(messages=messages_for_output_model)
|
|
6513
|
+
|
|
6514
|
+
async for model_response_event in model_response_stream:
|
|
6515
|
+
for event in self._handle_model_response_chunk(
|
|
6516
|
+
run_response=run_response,
|
|
6517
|
+
model_response=model_response,
|
|
6518
|
+
model_response_event=model_response_event,
|
|
6519
|
+
):
|
|
6520
|
+
yield event
|
|
6521
|
+
|
|
6522
|
+
if stream_intermediate_steps:
|
|
6523
|
+
yield self._handle_event(create_output_model_response_completed_event(run_response), run_response)
|
|
6524
|
+
|
|
6525
|
+
# Build a list of messages that should be added to the RunResponse
|
|
6526
|
+
messages_for_run_response = [m for m in run_messages.messages if m.add_to_agent_memory]
|
|
6527
|
+
# Update the RunResponse messages
|
|
6528
|
+
run_response.messages = messages_for_run_response
|
|
6529
|
+
# Update the RunResponse metrics
|
|
6530
|
+
run_response.metrics = self.aggregate_metrics_from_messages(messages_for_run_response)
|
|
6531
|
+
|
|
6375
6532
|
def _handle_event(self, event: RunResponseEvent, run_response: RunResponse):
|
|
6376
6533
|
# We only store events that are not run_response_content events
|
|
6377
6534
|
events_to_skip = [event.value for event in self.events_to_skip] if self.events_to_skip else []
|
|
@@ -6893,6 +7050,7 @@ class Agent:
|
|
|
6893
7050
|
if stream:
|
|
6894
7051
|
_response_content: str = ""
|
|
6895
7052
|
_response_thinking: str = ""
|
|
7053
|
+
_response_reasoning_content: str = ""
|
|
6896
7054
|
response_content_batch: Union[str, JSON, Markdown] = ""
|
|
6897
7055
|
reasoning_steps: List[ReasoningStep] = []
|
|
6898
7056
|
|
|
@@ -6959,6 +7117,8 @@ class Agent:
|
|
|
6959
7117
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
6960
7118
|
if hasattr(resp, "thinking") and resp.thinking is not None:
|
|
6961
7119
|
_response_thinking += resp.thinking
|
|
7120
|
+
if hasattr(resp, "reasoning_content") and resp.reasoning_content is not None:
|
|
7121
|
+
_response_reasoning_content += resp.reasoning_content
|
|
6962
7122
|
if (
|
|
6963
7123
|
hasattr(resp, "extra_data")
|
|
6964
7124
|
and resp.extra_data is not None
|
|
@@ -7030,6 +7190,18 @@ class Agent:
|
|
|
7030
7190
|
if render:
|
|
7031
7191
|
live_log.update(Group(*panels))
|
|
7032
7192
|
|
|
7193
|
+
if len(_response_reasoning_content) > 0:
|
|
7194
|
+
render = True
|
|
7195
|
+
# Create panel for reasoning content
|
|
7196
|
+
reasoning_panel = create_panel(
|
|
7197
|
+
content=Text(_response_reasoning_content),
|
|
7198
|
+
title=f"Reasoning ({response_timer.elapsed:.1f}s)",
|
|
7199
|
+
border_style="green",
|
|
7200
|
+
)
|
|
7201
|
+
panels.append(reasoning_panel)
|
|
7202
|
+
if render:
|
|
7203
|
+
live_log.update(Group(*panels))
|
|
7204
|
+
|
|
7033
7205
|
# Add tool calls panel if available
|
|
7034
7206
|
if (
|
|
7035
7207
|
self.show_tool_calls
|
|
@@ -7342,6 +7514,7 @@ class Agent:
|
|
|
7342
7514
|
if stream:
|
|
7343
7515
|
_response_content: str = ""
|
|
7344
7516
|
_response_thinking: str = ""
|
|
7517
|
+
_response_reasoning_content: str = ""
|
|
7345
7518
|
reasoning_steps: List[ReasoningStep] = []
|
|
7346
7519
|
response_content_batch: Union[str, JSON, Markdown] = ""
|
|
7347
7520
|
|
|
@@ -7409,6 +7582,8 @@ class Agent:
|
|
|
7409
7582
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
7410
7583
|
if resp.thinking is not None:
|
|
7411
7584
|
_response_thinking += resp.thinking
|
|
7585
|
+
if hasattr(resp, "reasoning_content") and resp.reasoning_content is not None:
|
|
7586
|
+
_response_reasoning_content += resp.reasoning_content
|
|
7412
7587
|
|
|
7413
7588
|
if (
|
|
7414
7589
|
hasattr(resp, "extra_data")
|
|
@@ -7482,6 +7657,18 @@ class Agent:
|
|
|
7482
7657
|
if render:
|
|
7483
7658
|
live_log.update(Group(*panels))
|
|
7484
7659
|
|
|
7660
|
+
if len(_response_reasoning_content) > 0:
|
|
7661
|
+
render = True
|
|
7662
|
+
# Create panel for reasoning content
|
|
7663
|
+
reasoning_panel = create_panel(
|
|
7664
|
+
content=Text(_response_reasoning_content),
|
|
7665
|
+
title=f"Reasoning ({response_timer.elapsed:.1f}s)",
|
|
7666
|
+
border_style="green",
|
|
7667
|
+
)
|
|
7668
|
+
panels.append(reasoning_panel)
|
|
7669
|
+
if render:
|
|
7670
|
+
live_log.update(Group(*panels))
|
|
7671
|
+
|
|
7485
7672
|
# Add tool calls panel if available
|
|
7486
7673
|
if (
|
|
7487
7674
|
self.show_tool_calls
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from os import getenv
|
|
2
|
-
from typing import Any, Dict, List, Optional, Union
|
|
2
|
+
from typing import Any, Callable, Dict, List, Optional, Union
|
|
3
3
|
from urllib.parse import quote
|
|
4
4
|
from uuid import uuid4
|
|
5
5
|
|
|
@@ -110,13 +110,14 @@ class Playground:
|
|
|
110
110
|
def get_async_router(self) -> APIRouter:
|
|
111
111
|
return get_async_playground_router(self.agents, self.workflows, self.teams, self.app_id)
|
|
112
112
|
|
|
113
|
-
def get_app(self, use_async: bool = True, prefix: str = "/v1") -> FastAPI:
|
|
113
|
+
def get_app(self, use_async: bool = True, prefix: str = "/v1", lifespan: Optional[Callable] = None) -> FastAPI:
|
|
114
114
|
if not self.api_app:
|
|
115
115
|
self.api_app = FastAPI(
|
|
116
116
|
title=self.settings.title,
|
|
117
117
|
docs_url="/docs" if self.settings.docs_enabled else None,
|
|
118
118
|
redoc_url="/redoc" if self.settings.docs_enabled else None,
|
|
119
119
|
openapi_url="/openapi.json" if self.settings.docs_enabled else None,
|
|
120
|
+
lifespan=lifespan,
|
|
120
121
|
)
|
|
121
122
|
|
|
122
123
|
if not self.api_app:
|
|
@@ -3,7 +3,7 @@ from typing import List
|
|
|
3
3
|
|
|
4
4
|
from agno.document.base import Document
|
|
5
5
|
from agno.document.reader.base import Reader
|
|
6
|
-
from agno.utils.log import log_info, logger
|
|
6
|
+
from agno.utils.log import log_debug, log_info, logger
|
|
7
7
|
|
|
8
8
|
try:
|
|
9
9
|
from youtube_transcript_api import YouTubeTranscriptApi
|
|
@@ -23,12 +23,16 @@ class YouTubeReader(Reader):
|
|
|
23
23
|
log_info(f"Reading transcript for video: {video_id}")
|
|
24
24
|
|
|
25
25
|
# Get transcript
|
|
26
|
-
|
|
26
|
+
log_debug(f"Fetching transcript for video: {video_id}")
|
|
27
|
+
# Create an instance of YouTubeTranscriptApi
|
|
28
|
+
ytt_api = YouTubeTranscriptApi()
|
|
29
|
+
transcript_data = ytt_api.fetch(video_id)
|
|
27
30
|
|
|
28
31
|
# Combine transcript segments into full text
|
|
29
32
|
transcript_text = ""
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
|
|
34
|
+
for segment in transcript_data:
|
|
35
|
+
transcript_text += f"{segment.text} "
|
|
32
36
|
|
|
33
37
|
documents = [
|
|
34
38
|
Document(
|
|
@@ -16,7 +16,7 @@ except ImportError:
|
|
|
16
16
|
@dataclass
|
|
17
17
|
class OpenAIEmbedder(Embedder):
|
|
18
18
|
id: str = "text-embedding-3-small"
|
|
19
|
-
dimensions: int =
|
|
19
|
+
dimensions: Optional[int] = None
|
|
20
20
|
encoding_format: Literal["float", "base64"] = "float"
|
|
21
21
|
user: Optional[str] = None
|
|
22
22
|
api_key: Optional[str] = None
|
|
@@ -26,6 +26,10 @@ class OpenAIEmbedder(Embedder):
|
|
|
26
26
|
client_params: Optional[Dict[str, Any]] = None
|
|
27
27
|
openai_client: Optional[OpenAIClient] = None
|
|
28
28
|
|
|
29
|
+
def __post_init__(self):
|
|
30
|
+
if self.dimensions is None:
|
|
31
|
+
self.dimensions = 3072 if self.id == "text-embedding-3-large" else 1536
|
|
32
|
+
|
|
29
33
|
@property
|
|
30
34
|
def client(self) -> OpenAIClient:
|
|
31
35
|
if self.openai_client:
|
|
@@ -449,7 +449,7 @@ class Claude(Model):
|
|
|
449
449
|
|
|
450
450
|
def get_system_message_for_model(self, tools: Optional[List[Any]] = None) -> Optional[str]:
|
|
451
451
|
if tools is not None and len(tools) > 0:
|
|
452
|
-
tool_call_prompt = "Do not reflect on the quality of the returned search results in your response"
|
|
452
|
+
tool_call_prompt = "Do not reflect on the quality of the returned search results in your response\n\n"
|
|
453
453
|
return tool_call_prompt
|
|
454
454
|
return None
|
|
455
455
|
|
|
@@ -570,8 +570,16 @@ class Claude(Model):
|
|
|
570
570
|
}
|
|
571
571
|
|
|
572
572
|
elif isinstance(response, ContentBlockStopEvent):
|
|
573
|
+
# Handle completed thinking content
|
|
574
|
+
if response.content_block.type == "thinking": # type: ignore
|
|
575
|
+
model_response.thinking = response.content_block.thinking # type: ignore
|
|
576
|
+
# Store signature if available
|
|
577
|
+
if hasattr(response.content_block, "signature"): # type: ignore
|
|
578
|
+
model_response.provider_data = {
|
|
579
|
+
"signature": response.content_block.signature, # type: ignore
|
|
580
|
+
}
|
|
573
581
|
# Handle tool calls
|
|
574
|
-
|
|
582
|
+
elif response.content_block.type == "tool_use": # type: ignore
|
|
575
583
|
tool_use = response.content_block # type: ignore
|
|
576
584
|
tool_name = tool_use.name
|
|
577
585
|
tool_input = tool_use.input
|
|
@@ -1025,6 +1025,10 @@ class Model(ABC):
|
|
|
1025
1025
|
stream_data.response_thinking += model_response_delta.thinking
|
|
1026
1026
|
should_yield = True
|
|
1027
1027
|
|
|
1028
|
+
if model_response_delta.reasoning_content is not None:
|
|
1029
|
+
stream_data.response_thinking += model_response_delta.reasoning_content
|
|
1030
|
+
should_yield = True
|
|
1031
|
+
|
|
1028
1032
|
if model_response_delta.redacted_thinking is not None:
|
|
1029
1033
|
stream_data.response_redacted_thinking += model_response_delta.redacted_thinking
|
|
1030
1034
|
should_yield = True
|
|
@@ -713,15 +713,29 @@ class Gemini(Model):
|
|
|
713
713
|
if isinstance(text_content, str):
|
|
714
714
|
# Check if this is a thought summary
|
|
715
715
|
if hasattr(part, "thought") and part.thought:
|
|
716
|
-
|
|
716
|
+
# Add all parts as single message
|
|
717
|
+
if model_response.reasoning_content is None:
|
|
718
|
+
model_response.reasoning_content = text_content
|
|
719
|
+
else:
|
|
720
|
+
model_response.reasoning_content += text_content
|
|
717
721
|
else:
|
|
718
|
-
model_response.content
|
|
722
|
+
if model_response.content is None:
|
|
723
|
+
model_response.content = text_content
|
|
724
|
+
else:
|
|
725
|
+
model_response.content += text_content
|
|
719
726
|
else:
|
|
720
727
|
content_str = str(text_content) if text_content is not None else ""
|
|
721
728
|
if hasattr(part, "thought") and part.thought:
|
|
722
|
-
|
|
729
|
+
# Add all parts as single message
|
|
730
|
+
if model_response.reasoning_content is None:
|
|
731
|
+
model_response.reasoning_content = content_str
|
|
732
|
+
else:
|
|
733
|
+
model_response.reasoning_content += content_str
|
|
723
734
|
else:
|
|
724
|
-
model_response.content
|
|
735
|
+
if model_response.content is None:
|
|
736
|
+
model_response.content = content_str
|
|
737
|
+
else:
|
|
738
|
+
model_response.content += content_str
|
|
725
739
|
|
|
726
740
|
if hasattr(part, "inline_data") and part.inline_data is not None:
|
|
727
741
|
model_response.image = ImageArtifact(
|
|
@@ -803,9 +817,15 @@ class Gemini(Model):
|
|
|
803
817
|
text_content = str(part.text) if part.text is not None else ""
|
|
804
818
|
# Check if this is a thought summary
|
|
805
819
|
if hasattr(part, "thought") and part.thought:
|
|
806
|
-
model_response.reasoning_content
|
|
820
|
+
if model_response.reasoning_content is None:
|
|
821
|
+
model_response.reasoning_content = text_content
|
|
822
|
+
else:
|
|
823
|
+
model_response.reasoning_content += text_content
|
|
807
824
|
else:
|
|
808
|
-
model_response.content
|
|
825
|
+
if model_response.content is None:
|
|
826
|
+
model_response.content = text_content
|
|
827
|
+
else:
|
|
828
|
+
model_response.content += text_content
|
|
809
829
|
|
|
810
830
|
if hasattr(part, "inline_data") and part.inline_data is not None:
|
|
811
831
|
model_response.image = ImageArtifact(
|