agno 1.7.4__tar.gz → 1.7.5__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.4 → agno-1.7.5}/PKG-INFO +4 -1
- {agno-1.7.4 → agno-1.7.5}/agno/agent/agent.py +28 -14
- {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/app.py +1 -1
- {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/async_router.py +67 -16
- {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/sync_router.py +80 -14
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/agent.py +39 -2
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/combined.py +1 -1
- {agno-1.7.4 → agno-1.7.5}/agno/team/team.py +20 -5
- {agno-1.7.4 → agno-1.7.5}/agno/tools/decorator.py +45 -2
- {agno-1.7.4 → agno-1.7.5}/agno/tools/function.py +16 -12
- {agno-1.7.4 → agno-1.7.5}/agno/utils/pprint.py +2 -0
- agno-1.7.5/agno/vectordb/surrealdb/__init__.py +3 -0
- agno-1.7.5/agno/vectordb/surrealdb/surrealdb.py +493 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/workflow.py +2 -4
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/PKG-INFO +4 -1
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/SOURCES.txt +2 -0
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/requires.txt +4 -0
- {agno-1.7.4 → agno-1.7.5}/pyproject.toml +6 -3
- {agno-1.7.4 → agno-1.7.5}/LICENSE +0 -0
- {agno-1.7.4 → agno-1.7.5}/README.md +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/agent/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/agent/metrics.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/agent.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/api.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/evals.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/playground.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/routes.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/agent.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/evals.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/playground.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/response.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/team.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/user.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/workflows.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/workspace.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/team.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/user.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/workflows.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/api/workspace.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/agui/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/agui/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/agui/async_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/agui/sync_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/agui/utils.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/discord/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/discord/client.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/async_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/deploy.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/operator.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/schemas.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/serve.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/settings.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/sync_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/playground/utils.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/settings.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/slack/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/slack/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/slack/async_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/slack/security.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/slack/sync_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/utils.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/async_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/security.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/sync_router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/auth_server.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/config.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/console.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/credentials.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/entrypoint.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/operator.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/settings.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/ws/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/cli/ws/ws_cli.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/constants.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/debug.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/agentic.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/document.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/fixed.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/markdown.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/recursive.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/semantic.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/strategy.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/arxiv_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/csv_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/docx_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/firecrawl_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/gcs/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/gcs/pdf_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/json_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/markdown_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/pdf_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/pdf_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/text_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/text_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/url_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/website_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/document/reader/youtube_reader.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/aws_bedrock.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/azure_openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/cohere.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/fastembed.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/fireworks.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/google.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/huggingface.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/langdb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/mistral.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/nebius.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/ollama.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/sentence_transformer.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/together.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/embedder/voyageai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/eval/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/eval/accuracy.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/eval/performance.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/eval/reliability.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/eval/utils.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/exceptions.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/file/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/file/file.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/file/local/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/file/local/csv.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/file/local/txt.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/context.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/db_app.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/resource.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/infra/resources.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/arxiv.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/csv.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/csv_url.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/document.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/docx.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/firecrawl.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/pdf.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/json.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/langchain.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/light_rag.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/llamaindex.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/markdown.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf_bytes.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf_url.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/pdf.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/text.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/text.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/url.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/website.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/wikipedia.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/knowledge/youtube.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/media.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/agent.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/classifier.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/db/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/db/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/db/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/db/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/db/sqlite.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/manager.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/memory.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/row.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/summarizer.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/summary.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/team.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/firestore.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/redis.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/schema.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/sqlite.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/manager.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/memory.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/schema.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/summarizer.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/memory/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/aimlapi/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/anthropic/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/anthropic/claude.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/aws/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/aws/bedrock.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/aws/claude.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/azure/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/azure/ai_foundry.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/azure/openai_chat.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/cerebras.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/cohere/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/cohere/chat.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/deepinfra/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/deepseek/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/deepseek/deepseek.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/defaults.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/fireworks/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/fireworks/fireworks.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/google/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/google/gemini.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/groq/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/groq/groq.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/huggingface/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/huggingface/huggingface.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/ibm/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/ibm/watsonx.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/internlm/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/internlm/internlm.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/langdb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/langdb/langdb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/chat.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/lmstudio/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/message.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/meta/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/meta/llama.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/meta/llama_openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/mistral/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/mistral/mistral.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/nebius/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/nebius/nebius.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/nvidia/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/nvidia/nvidia.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/chat.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/tools.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openai/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openai/chat.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openai/like.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openai/responses.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openrouter/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/openrouter/openrouter.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/perplexity/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/perplexity/perplexity.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/response.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/sambanova/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/sambanova/sambanova.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/together/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/together/together.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/vercel/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/vercel/v0.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/vllm/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/vllm/vllm.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/xai/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/models/xai/xai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/playground/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/playground/deploy.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/playground/playground.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/playground/serve.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/playground/settings.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/py.typed +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/deepseek.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/default.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/groq.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/helpers.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/ollama.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reasoning/step.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reranker/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reranker/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reranker/cohere.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reranker/infinity.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/reranker/sentence_transformer.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/messages.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/response.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/team.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/v2/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/v2/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/run/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/dynamodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/json.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/singlestore.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/sqlite.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/yaml.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/dynamodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/firestore.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/gcs_json.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/json.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/mysql.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/redis.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/agent.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/team.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/v2/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/v2/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/session/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/singlestore.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/sqlite.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/sqlite.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/storage/yaml.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/team/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/agentql.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/airflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/api.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/apify.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/arxiv.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/aws_lambda.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/aws_ses.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/baidusearch.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/bravesearch.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/brightdata.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/browserbase.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/calcom.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/calculator.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/cartesia.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/clickup_tool.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/confluence.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/crawl4ai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/csv_toolkit.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/dalle.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/daytona.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/desi_vocal.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/discord.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/docker.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/duckdb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/duckduckgo.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/e2b.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/eleven_labs.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/email.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/exa.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/fal.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/file.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/financial_datasets.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/firecrawl.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/giphy.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/github.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/gmail.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/google_bigquery.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/google_maps.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/googlecalendar.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/googlesearch.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/googlesheets.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/hackernews.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/jina.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/jira.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/knowledge.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/linear.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/local_file_system.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/lumalab.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/mcp.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/mem0.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/mlx_transcribe.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models/azure_openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models/gemini.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models/groq.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models/nebius.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/models_labs.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/moviepy_video.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/newspaper.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/newspaper4k.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/openbb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/opencv.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/openweather.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/oxylabs.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/pandas.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/postgres.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/pubmed.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/python.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/reasoning.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/reddit.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/replicate.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/resend.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/scrapegraph.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/searxng.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/serpapi.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/serper.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/shell.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/slack.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/sleep.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/spider.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/sql.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/streamlit/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/streamlit/components.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/tavily.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/telegram.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/thinking.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/todoist.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/tool_registry.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/toolkit.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/trello.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/twilio.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/user_control_flow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/valyu.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/visualization.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/webbrowser.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/webex.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/website.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/webtools.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/whatsapp.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/wikipedia.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/x.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/yfinance.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/youtube.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/zendesk.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/zep.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/tools/zoom.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/audio.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/certs.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/code_execution.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/common.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/defaults.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/dttm.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/enum.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/env.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/events.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/filesystem.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/format_str.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/functions.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/gemini.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/git.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/http.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/json_io.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/json_schema.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/load_env.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/location.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/log.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/mcp.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/media.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/merge_dict.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/message.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/ai_foundry.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/aws_claude.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/claude.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/cohere.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/llama.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/mistral.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/openai_responses.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/schema_utils.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/models/watsonx.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/openai.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/pickle.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/prompts.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/py_io.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/pyproject.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/resource_filter.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/response.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/response_iterator.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/safe_formatter.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/shell.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/string.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/timer.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/tools.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/web.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/whatsapp.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/utils/yaml_io.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/base.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/index.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/distance.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/index.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/search.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/index.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/index.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/condition.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/loop.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/parallel.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/router.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/step.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/steps.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/types.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workflow/workflow.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/__init__.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/config.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/enums.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/helpers.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/operator.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno/workspace/settings.py +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/dependency_links.txt +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/entry_points.txt +0 -0
- {agno-1.7.4 → agno-1.7.5}/agno.egg-info/top_level.txt +0 -0
- {agno-1.7.4 → agno-1.7.5}/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.5
|
|
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.
|
|
@@ -573,6 +573,8 @@ Provides-Extra: clickhouse
|
|
|
573
573
|
Requires-Dist: clickhouse-connect; extra == "clickhouse"
|
|
574
574
|
Provides-Extra: pinecone
|
|
575
575
|
Requires-Dist: pinecone==5.4.2; extra == "pinecone"
|
|
576
|
+
Provides-Extra: surrealdb
|
|
577
|
+
Requires-Dist: surrealdb>=1.0.4; extra == "surrealdb"
|
|
576
578
|
Provides-Extra: pdf
|
|
577
579
|
Requires-Dist: pypdf; extra == "pdf"
|
|
578
580
|
Requires-Dist: rapidocr_onnxruntime; extra == "pdf"
|
|
@@ -664,6 +666,7 @@ Requires-Dist: agno[weaviate]; extra == "vectordbs"
|
|
|
664
666
|
Requires-Dist: agno[milvusdb]; extra == "vectordbs"
|
|
665
667
|
Requires-Dist: agno[clickhouse]; extra == "vectordbs"
|
|
666
668
|
Requires-Dist: agno[pinecone]; extra == "vectordbs"
|
|
669
|
+
Requires-Dist: agno[surrealdb]; extra == "vectordbs"
|
|
667
670
|
Provides-Extra: knowledge
|
|
668
671
|
Requires-Dist: agno[pdf]; extra == "knowledge"
|
|
669
672
|
Requires-Dist: agno[docx]; extra == "knowledge"
|
|
@@ -119,6 +119,8 @@ class Agent:
|
|
|
119
119
|
session_state: Optional[Dict[str, Any]] = None
|
|
120
120
|
search_previous_sessions_history: Optional[bool] = False
|
|
121
121
|
num_history_sessions: Optional[int] = None
|
|
122
|
+
# If True, cache the session in memory
|
|
123
|
+
cache_session: bool = True
|
|
122
124
|
|
|
123
125
|
# --- Agent Context ---
|
|
124
126
|
# Context available for tools and prompt functions
|
|
@@ -351,6 +353,7 @@ class Agent:
|
|
|
351
353
|
session_state: Optional[Dict[str, Any]] = None,
|
|
352
354
|
search_previous_sessions_history: Optional[bool] = False,
|
|
353
355
|
num_history_sessions: Optional[int] = None,
|
|
356
|
+
cache_session: bool = True,
|
|
354
357
|
context: Optional[Dict[str, Any]] = None,
|
|
355
358
|
add_context: bool = False,
|
|
356
359
|
resolve_context: bool = True,
|
|
@@ -441,6 +444,8 @@ class Agent:
|
|
|
441
444
|
self.search_previous_sessions_history = search_previous_sessions_history
|
|
442
445
|
self.num_history_sessions = num_history_sessions
|
|
443
446
|
|
|
447
|
+
self.cache_session = cache_session
|
|
448
|
+
|
|
444
449
|
self.context = context
|
|
445
450
|
self.add_context = add_context
|
|
446
451
|
self.resolve_context = resolve_context
|
|
@@ -754,9 +759,6 @@ class Agent:
|
|
|
754
759
|
|
|
755
760
|
self._initialize_session_state(user_id=user_id, session_id=session_id)
|
|
756
761
|
|
|
757
|
-
# Read existing session from storage
|
|
758
|
-
self.read_from_storage(session_id=session_id)
|
|
759
|
-
|
|
760
762
|
return session_id, user_id
|
|
761
763
|
|
|
762
764
|
def _run(
|
|
@@ -996,16 +998,18 @@ class Agent:
|
|
|
996
998
|
**kwargs: Any,
|
|
997
999
|
) -> Union[RunResponse, Iterator[RunResponseEvent]]:
|
|
998
1000
|
"""Run the Agent and return the response."""
|
|
999
|
-
|
|
1000
1001
|
session_id, user_id = self._initialize_session(
|
|
1001
1002
|
session_id=session_id, user_id=user_id, session_state=session_state
|
|
1002
1003
|
)
|
|
1003
1004
|
|
|
1004
|
-
log_debug(f"Session ID: {session_id}", center=True)
|
|
1005
|
-
|
|
1006
1005
|
# Initialize the Agent
|
|
1007
1006
|
self.initialize_agent()
|
|
1008
1007
|
|
|
1008
|
+
# Read existing session from storage
|
|
1009
|
+
self.read_from_storage(session_id=session_id)
|
|
1010
|
+
|
|
1011
|
+
log_debug(f"Session ID: {session_id}", center=True)
|
|
1012
|
+
|
|
1009
1013
|
# Initialize Knowledge Filters
|
|
1010
1014
|
effective_filters = knowledge_filters
|
|
1011
1015
|
|
|
@@ -1382,6 +1386,9 @@ class Agent:
|
|
|
1382
1386
|
# Initialize the Agent
|
|
1383
1387
|
self.initialize_agent()
|
|
1384
1388
|
|
|
1389
|
+
# Read existing session from storage
|
|
1390
|
+
self.read_from_storage(session_id=session_id)
|
|
1391
|
+
|
|
1385
1392
|
effective_filters = knowledge_filters
|
|
1386
1393
|
# When filters are passed manually
|
|
1387
1394
|
if self.knowledge_filters or knowledge_filters:
|
|
@@ -1606,6 +1613,9 @@ class Agent:
|
|
|
1606
1613
|
retries: The number of retries to continue the run for.
|
|
1607
1614
|
knowledge_filters: The knowledge filters to use for the run.
|
|
1608
1615
|
"""
|
|
1616
|
+
# Initialize the Agent
|
|
1617
|
+
self.initialize_agent()
|
|
1618
|
+
|
|
1609
1619
|
if session_id is not None:
|
|
1610
1620
|
self.reset_run_state()
|
|
1611
1621
|
# Reset session state if a session_id is provided. Session name and session state will be loaded from storage.
|
|
@@ -1614,9 +1624,6 @@ class Agent:
|
|
|
1614
1624
|
if self.session_id is not None and session_id != self.session_id:
|
|
1615
1625
|
self.session_state = None
|
|
1616
1626
|
|
|
1617
|
-
# Initialize the Agent
|
|
1618
|
-
self.initialize_agent()
|
|
1619
|
-
|
|
1620
1627
|
# Initialize Session
|
|
1621
1628
|
# Use the default user_id and session_id when necessary
|
|
1622
1629
|
user_id = user_id if user_id is not None else self.user_id
|
|
@@ -1996,6 +2003,9 @@ class Agent:
|
|
|
1996
2003
|
retries: The number of retries to continue the run for.
|
|
1997
2004
|
knowledge_filters: The knowledge filters to use for the run.
|
|
1998
2005
|
"""
|
|
2006
|
+
# Initialize the Agent
|
|
2007
|
+
self.initialize_agent()
|
|
2008
|
+
|
|
1999
2009
|
if session_id is not None:
|
|
2000
2010
|
self.reset_run_state()
|
|
2001
2011
|
# Reset session state if a session_id is provided. Session name and session state will be loaded from storage.
|
|
@@ -2004,9 +2014,6 @@ class Agent:
|
|
|
2004
2014
|
if self.session_id is not None and session_id != self.session_id:
|
|
2005
2015
|
self.session_state = None
|
|
2006
2016
|
|
|
2007
|
-
# Initialize the Agent
|
|
2008
|
-
self.initialize_agent()
|
|
2009
|
-
|
|
2010
2017
|
# Initialize Session
|
|
2011
2018
|
# Use the default user_id and session_id when necessary
|
|
2012
2019
|
user_id = user_id if user_id is not None else self.user_id
|
|
@@ -4056,6 +4063,7 @@ class Agent:
|
|
|
4056
4063
|
# Convert dict to Memory
|
|
4057
4064
|
elif isinstance(self.memory, dict):
|
|
4058
4065
|
memory_dict = self.memory
|
|
4066
|
+
|
|
4059
4067
|
memory_dict.pop("runs")
|
|
4060
4068
|
self.memory = Memory(**memory_dict)
|
|
4061
4069
|
else:
|
|
@@ -4111,6 +4119,7 @@ class Agent:
|
|
|
4111
4119
|
self.memory.runs[session.session_id] = []
|
|
4112
4120
|
for run in session.memory["runs"]:
|
|
4113
4121
|
run_session_id = run["session_id"]
|
|
4122
|
+
|
|
4114
4123
|
if "team_id" in run:
|
|
4115
4124
|
self.memory.runs[run_session_id].append(TeamRunResponse.from_dict(run))
|
|
4116
4125
|
else:
|
|
@@ -4179,10 +4188,10 @@ class Agent:
|
|
|
4179
4188
|
if not self.storage:
|
|
4180
4189
|
return
|
|
4181
4190
|
|
|
4182
|
-
agent_session_from_db = self.storage.read(session_id=session_id)
|
|
4191
|
+
agent_session_from_db = self.storage.read(session_id=session_id) # type: ignore
|
|
4183
4192
|
if (
|
|
4184
4193
|
agent_session_from_db is not None
|
|
4185
|
-
and agent_session_from_db.memory is not None
|
|
4194
|
+
and agent_session_from_db.memory is not None # type: ignore
|
|
4186
4195
|
and "runs" in agent_session_from_db.memory # type: ignore
|
|
4187
4196
|
):
|
|
4188
4197
|
if isinstance(self.memory, AgentMemory):
|
|
@@ -4224,6 +4233,11 @@ class Agent:
|
|
|
4224
4233
|
AgentSession,
|
|
4225
4234
|
self.storage.upsert(session=self.get_agent_session(session_id=session_id, user_id=user_id)),
|
|
4226
4235
|
)
|
|
4236
|
+
|
|
4237
|
+
if not self.cache_session:
|
|
4238
|
+
if self.memory is not None and self.memory.runs is not None and session_id in self.memory.runs:
|
|
4239
|
+
self.memory.runs.pop(session_id) # type: ignore
|
|
4240
|
+
|
|
4227
4241
|
return self.agent_session
|
|
4228
4242
|
|
|
4229
4243
|
def add_introduction(self, introduction: str) -> None:
|
|
@@ -77,7 +77,7 @@ class FastAPIApp(BaseAPIApp):
|
|
|
77
77
|
|
|
78
78
|
if self.workflows:
|
|
79
79
|
for workflow in self.workflows:
|
|
80
|
-
if not workflow.app_id:
|
|
80
|
+
if hasattr(workflow, "app_id") and not workflow.app_id:
|
|
81
81
|
workflow.app_id = self.app_id
|
|
82
82
|
if not workflow.workflow_id:
|
|
83
83
|
workflow.workflow_id = generate_id(workflow.name)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from dataclasses import asdict
|
|
3
3
|
from io import BytesIO
|
|
4
|
-
from typing import AsyncGenerator, List, Optional, cast
|
|
4
|
+
from typing import Any, AsyncGenerator, Dict, List, Optional, Union, cast
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
7
7
|
from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
|
|
@@ -14,8 +14,10 @@ from agno.media import File as FileMedia
|
|
|
14
14
|
from agno.run.response import RunResponseErrorEvent
|
|
15
15
|
from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
|
|
16
16
|
from agno.run.team import TeamRunResponseEvent
|
|
17
|
+
from agno.run.v2.workflow import WorkflowErrorEvent
|
|
17
18
|
from agno.team.team import Team
|
|
18
19
|
from agno.utils.log import logger
|
|
20
|
+
from agno.workflow.v2.workflow import Workflow as WorkflowV2
|
|
19
21
|
from agno.workflow.workflow import Workflow
|
|
20
22
|
|
|
21
23
|
|
|
@@ -83,6 +85,42 @@ async def team_chat_response_streamer(
|
|
|
83
85
|
return
|
|
84
86
|
|
|
85
87
|
|
|
88
|
+
async def workflow_response_streamer(
|
|
89
|
+
workflow: WorkflowV2,
|
|
90
|
+
body: Union[Dict[str, Any], str],
|
|
91
|
+
session_id: Optional[str] = None,
|
|
92
|
+
user_id: Optional[str] = None,
|
|
93
|
+
) -> AsyncGenerator:
|
|
94
|
+
try:
|
|
95
|
+
if isinstance(body, dict):
|
|
96
|
+
run_response = await workflow.arun( # type: ignore
|
|
97
|
+
**body,
|
|
98
|
+
user_id=user_id,
|
|
99
|
+
session_id=session_id,
|
|
100
|
+
stream=True,
|
|
101
|
+
stream_intermediate_steps=True,
|
|
102
|
+
)
|
|
103
|
+
else:
|
|
104
|
+
run_response = await workflow.arun( # type: ignore
|
|
105
|
+
body,
|
|
106
|
+
user_id=user_id,
|
|
107
|
+
session_id=session_id,
|
|
108
|
+
stream=True,
|
|
109
|
+
stream_intermediate_steps=True,
|
|
110
|
+
)
|
|
111
|
+
async for run_response_chunk in run_response:
|
|
112
|
+
yield run_response_chunk.to_json()
|
|
113
|
+
except Exception as e:
|
|
114
|
+
import traceback
|
|
115
|
+
|
|
116
|
+
traceback.print_exc(limit=3)
|
|
117
|
+
error_response = WorkflowErrorEvent(
|
|
118
|
+
error=str(e),
|
|
119
|
+
)
|
|
120
|
+
yield error_response.to_json()
|
|
121
|
+
return
|
|
122
|
+
|
|
123
|
+
|
|
86
124
|
def get_async_router(
|
|
87
125
|
agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None, workflows: Optional[List[Workflow]] = None
|
|
88
126
|
) -> APIRouter:
|
|
@@ -351,17 +389,24 @@ def get_async_router(
|
|
|
351
389
|
media_type="text/event-stream",
|
|
352
390
|
)
|
|
353
391
|
elif workflow:
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
392
|
+
if isinstance(workflow, Workflow):
|
|
393
|
+
workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
|
|
394
|
+
workflow_instance.user_id = user_id
|
|
395
|
+
workflow_instance.session_name = None
|
|
396
|
+
|
|
397
|
+
if isinstance(workflow_input, dict):
|
|
398
|
+
return StreamingResponse(
|
|
399
|
+
(json.dumps(asdict(result)) for result in await workflow_instance.arun(**workflow_input)),
|
|
400
|
+
media_type="text/event-stream",
|
|
401
|
+
)
|
|
402
|
+
else:
|
|
403
|
+
return StreamingResponse(
|
|
404
|
+
(json.dumps(asdict(result)) for result in await workflow_instance.arun(workflow_input)), # type: ignore
|
|
405
|
+
media_type="text/event-stream",
|
|
406
|
+
)
|
|
362
407
|
else:
|
|
363
408
|
return StreamingResponse(
|
|
364
|
-
(
|
|
409
|
+
workflow_response_streamer(workflow, workflow_input, session_id=session_id, user_id=user_id), # type: ignore
|
|
365
410
|
media_type="text/event-stream",
|
|
366
411
|
)
|
|
367
412
|
else:
|
|
@@ -392,12 +437,18 @@ def get_async_router(
|
|
|
392
437
|
)
|
|
393
438
|
return team_run_response.to_dict()
|
|
394
439
|
elif workflow:
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
440
|
+
if isinstance(workflow, Workflow):
|
|
441
|
+
workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
|
|
442
|
+
workflow_instance.user_id = user_id
|
|
443
|
+
workflow_instance.session_name = None
|
|
444
|
+
if isinstance(workflow_input, dict):
|
|
445
|
+
return (await workflow_instance.arun(**workflow_input)).to_dict()
|
|
446
|
+
else:
|
|
447
|
+
return (await workflow_instance.arun(workflow_input)).to_dict() # type: ignore
|
|
400
448
|
else:
|
|
401
|
-
|
|
449
|
+
if isinstance(workflow_input, dict):
|
|
450
|
+
return (await workflow.arun(**workflow_input, session_id=session_id, user_id=user_id)).to_dict()
|
|
451
|
+
else:
|
|
452
|
+
return (await workflow.arun(workflow_input, session_id=session_id, user_id=user_id)).to_dict() # type: ignore
|
|
402
453
|
|
|
403
454
|
return router
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from dataclasses import asdict
|
|
3
3
|
from io import BytesIO
|
|
4
|
-
from typing import Any, Dict, Generator, List, Optional, cast
|
|
4
|
+
from typing import Any, Dict, Generator, List, Optional, Union, cast
|
|
5
5
|
from uuid import uuid4
|
|
6
6
|
|
|
7
7
|
from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
|
|
@@ -15,8 +15,10 @@ from agno.run.base import RunStatus
|
|
|
15
15
|
from agno.run.response import RunResponseEvent
|
|
16
16
|
from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
|
|
17
17
|
from agno.run.team import TeamRunResponseEvent
|
|
18
|
+
from agno.run.v2.workflow import WorkflowErrorEvent
|
|
18
19
|
from agno.team.team import Team
|
|
19
20
|
from agno.utils.log import logger
|
|
21
|
+
from agno.workflow.v2.workflow import Workflow as WorkflowV2
|
|
20
22
|
from agno.workflow.workflow import Workflow
|
|
21
23
|
|
|
22
24
|
|
|
@@ -82,6 +84,42 @@ def team_chat_response_streamer(
|
|
|
82
84
|
return
|
|
83
85
|
|
|
84
86
|
|
|
87
|
+
def workflow_response_streamer(
|
|
88
|
+
workflow: WorkflowV2,
|
|
89
|
+
body: Union[Dict[str, Any], str],
|
|
90
|
+
session_id: Optional[str] = None,
|
|
91
|
+
user_id: Optional[str] = None,
|
|
92
|
+
) -> Generator:
|
|
93
|
+
try:
|
|
94
|
+
if isinstance(body, dict):
|
|
95
|
+
run_response = workflow.run(
|
|
96
|
+
**body,
|
|
97
|
+
user_id=user_id,
|
|
98
|
+
session_id=session_id,
|
|
99
|
+
stream=True,
|
|
100
|
+
stream_intermediate_steps=True,
|
|
101
|
+
)
|
|
102
|
+
else:
|
|
103
|
+
run_response = workflow.run(
|
|
104
|
+
body,
|
|
105
|
+
user_id=user_id,
|
|
106
|
+
session_id=session_id,
|
|
107
|
+
stream=True,
|
|
108
|
+
stream_intermediate_steps=True,
|
|
109
|
+
)
|
|
110
|
+
for run_response_chunk in run_response:
|
|
111
|
+
yield run_response_chunk.to_json()
|
|
112
|
+
except Exception as e:
|
|
113
|
+
import traceback
|
|
114
|
+
|
|
115
|
+
traceback.print_exc(limit=3)
|
|
116
|
+
error_response = WorkflowErrorEvent(
|
|
117
|
+
error=str(e),
|
|
118
|
+
)
|
|
119
|
+
yield error_response.to_json()
|
|
120
|
+
return
|
|
121
|
+
|
|
122
|
+
|
|
85
123
|
def get_sync_router(
|
|
86
124
|
agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None, workflows: Optional[List[Workflow]] = None
|
|
87
125
|
) -> APIRouter:
|
|
@@ -251,12 +289,12 @@ def get_sync_router(
|
|
|
251
289
|
@router.post("/runs")
|
|
252
290
|
def run_agent_or_team_or_workflow(
|
|
253
291
|
message: str = Form(None),
|
|
254
|
-
stream: bool = Form(
|
|
292
|
+
stream: bool = Form(False),
|
|
255
293
|
monitor: bool = Form(False),
|
|
256
294
|
agent_id: Optional[str] = Query(None),
|
|
257
295
|
team_id: Optional[str] = Query(None),
|
|
258
296
|
workflow_id: Optional[str] = Query(None),
|
|
259
|
-
workflow_input: Optional[
|
|
297
|
+
workflow_input: Optional[str] = Form(None),
|
|
260
298
|
session_id: Optional[str] = Form(None),
|
|
261
299
|
user_id: Optional[str] = Form(None),
|
|
262
300
|
files: Optional[List[UploadFile]] = File(None),
|
|
@@ -297,6 +335,13 @@ def get_sync_router(
|
|
|
297
335
|
if not workflow_input:
|
|
298
336
|
raise HTTPException(status_code=400, detail="Workflow input is required")
|
|
299
337
|
|
|
338
|
+
# Parse workflow_input into a dict if it is a valid JSON
|
|
339
|
+
try:
|
|
340
|
+
parsed_workflow_input = json.loads(workflow_input)
|
|
341
|
+
workflow_input = parsed_workflow_input
|
|
342
|
+
except json.JSONDecodeError:
|
|
343
|
+
pass
|
|
344
|
+
|
|
300
345
|
if agent:
|
|
301
346
|
agent.monitoring = bool(monitor)
|
|
302
347
|
elif team:
|
|
@@ -339,13 +384,25 @@ def get_sync_router(
|
|
|
339
384
|
media_type="text/event-stream",
|
|
340
385
|
)
|
|
341
386
|
elif workflow:
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
387
|
+
if isinstance(workflow, Workflow):
|
|
388
|
+
workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
|
|
389
|
+
workflow_instance.user_id = user_id
|
|
390
|
+
workflow_instance.session_name = None
|
|
391
|
+
if isinstance(workflow_input, dict):
|
|
392
|
+
return StreamingResponse(
|
|
393
|
+
(json.dumps(asdict(result)) for result in workflow_instance.run(**workflow_input)),
|
|
394
|
+
media_type="text/event-stream",
|
|
395
|
+
)
|
|
396
|
+
else:
|
|
397
|
+
return StreamingResponse(
|
|
398
|
+
(json.dumps(asdict(result)) for result in workflow_instance.run(workflow_input)), # type: ignore
|
|
399
|
+
media_type="text/event-stream",
|
|
400
|
+
)
|
|
401
|
+
else:
|
|
402
|
+
return StreamingResponse(
|
|
403
|
+
workflow_response_streamer(workflow, workflow_input, session_id=session_id, user_id=user_id),
|
|
404
|
+
media_type="text/event-stream",
|
|
405
|
+
)
|
|
349
406
|
else:
|
|
350
407
|
if agent:
|
|
351
408
|
run_response = cast(
|
|
@@ -374,9 +431,18 @@ def get_sync_router(
|
|
|
374
431
|
)
|
|
375
432
|
return team_run_response.to_dict()
|
|
376
433
|
elif workflow:
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
434
|
+
if isinstance(workflow, Workflow):
|
|
435
|
+
workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
|
|
436
|
+
workflow_instance.user_id = user_id
|
|
437
|
+
workflow_instance.session_name = None
|
|
438
|
+
if isinstance(workflow_input, dict):
|
|
439
|
+
return workflow_instance.run(**workflow_input).to_dict()
|
|
440
|
+
else:
|
|
441
|
+
return workflow_instance.run(workflow_input).to_dict() # type: ignore
|
|
442
|
+
else:
|
|
443
|
+
if isinstance(workflow_input, dict):
|
|
444
|
+
return workflow.run(**workflow_input, session_id=session_id, user_id=user_id).to_dict()
|
|
445
|
+
else:
|
|
446
|
+
return workflow.run(workflow_input, session_id=session_id, user_id=user_id).to_dict()
|
|
381
447
|
|
|
382
448
|
return router
|
|
@@ -184,7 +184,7 @@ class AgentKnowledge(BaseModel):
|
|
|
184
184
|
# Filter out documents which already exist in the vector db
|
|
185
185
|
if skip_existing:
|
|
186
186
|
log_debug("Filtering out existing documents before insertion.")
|
|
187
|
-
documents_to_load = self.
|
|
187
|
+
documents_to_load = await self.async_filter_existing_documents(document_list)
|
|
188
188
|
|
|
189
189
|
if documents_to_load:
|
|
190
190
|
for doc in documents_to_load:
|
|
@@ -439,6 +439,43 @@ class AgentKnowledge(BaseModel):
|
|
|
439
439
|
|
|
440
440
|
return filtered_documents
|
|
441
441
|
|
|
442
|
+
async def async_filter_existing_documents(self, documents: List[Document]) -> List[Document]:
|
|
443
|
+
"""Filter out documents that already exist in the vector database.
|
|
444
|
+
|
|
445
|
+
This helper method is used across various knowledge base implementations
|
|
446
|
+
to avoid inserting duplicate documents.
|
|
447
|
+
|
|
448
|
+
Args:
|
|
449
|
+
documents (List[Document]): List of documents to filter
|
|
450
|
+
|
|
451
|
+
Returns:
|
|
452
|
+
List[Document]: Filtered list of documents that don't exist in the database
|
|
453
|
+
"""
|
|
454
|
+
from agno.utils.log import log_debug, log_info
|
|
455
|
+
|
|
456
|
+
if not self.vector_db:
|
|
457
|
+
log_debug("No vector database configured, skipping document filtering")
|
|
458
|
+
return documents
|
|
459
|
+
|
|
460
|
+
# Use set for O(1) lookups
|
|
461
|
+
seen_content = set()
|
|
462
|
+
original_count = len(documents)
|
|
463
|
+
filtered_documents = []
|
|
464
|
+
|
|
465
|
+
for doc in documents:
|
|
466
|
+
# Check hash and existence in DB
|
|
467
|
+
content_hash = doc.content # Assuming doc.content is reliable hash key
|
|
468
|
+
if content_hash not in seen_content and not await self.vector_db.async_doc_exists(doc):
|
|
469
|
+
seen_content.add(content_hash)
|
|
470
|
+
filtered_documents.append(doc)
|
|
471
|
+
else:
|
|
472
|
+
log_debug(f"Skipping existing document: {doc.name} (or duplicate content)")
|
|
473
|
+
|
|
474
|
+
if len(filtered_documents) < original_count:
|
|
475
|
+
log_info(f"Skipped {original_count - len(filtered_documents)} existing/duplicate documents.")
|
|
476
|
+
|
|
477
|
+
return filtered_documents
|
|
478
|
+
|
|
442
479
|
def _track_metadata_structure(self, metadata: Optional[Dict[str, Any]]) -> None:
|
|
443
480
|
"""Track metadata structure to enable filter extraction from queries
|
|
444
481
|
|
|
@@ -655,7 +692,7 @@ class AgentKnowledge(BaseModel):
|
|
|
655
692
|
documents_to_insert = documents
|
|
656
693
|
if skip_existing:
|
|
657
694
|
log_debug("Filtering out existing documents before insertion.")
|
|
658
|
-
documents_to_insert = self.
|
|
695
|
+
documents_to_insert = await self.async_filter_existing_documents(documents)
|
|
659
696
|
|
|
660
697
|
if documents_to_insert: # type: ignore
|
|
661
698
|
log_debug(f"Inserting {len(documents_to_insert)} new documents.")
|
|
@@ -32,5 +32,5 @@ class CombinedKnowledgeBase(AgentKnowledge):
|
|
|
32
32
|
|
|
33
33
|
for kb in self.sources:
|
|
34
34
|
log_debug(f"Loading documents from {kb.__class__.__name__}")
|
|
35
|
-
async for document in
|
|
35
|
+
async for document in kb.async_document_lists: # type: ignore
|
|
36
36
|
yield document
|
|
@@ -130,6 +130,8 @@ class Team:
|
|
|
130
130
|
session_name: Optional[str] = None
|
|
131
131
|
# Session state (stored in the database to persist across runs)
|
|
132
132
|
session_state: Optional[Dict[str, Any]] = None
|
|
133
|
+
# If True, cache the session in memory
|
|
134
|
+
cache_session: bool = True
|
|
133
135
|
|
|
134
136
|
# Team session state (shared between team leaders and team members)
|
|
135
137
|
team_session_state: Optional[Dict[str, Any]] = None
|
|
@@ -311,6 +313,7 @@ class Team:
|
|
|
311
313
|
team_session_state: Optional[Dict[str, Any]] = None,
|
|
312
314
|
workflow_session_state: Optional[Dict[str, Any]] = None,
|
|
313
315
|
add_state_in_messages: bool = False,
|
|
316
|
+
cache_session: bool = True,
|
|
314
317
|
description: Optional[str] = None,
|
|
315
318
|
instructions: Optional[Union[str, List[str], Callable]] = None,
|
|
316
319
|
expected_output: Optional[str] = None,
|
|
@@ -390,6 +393,8 @@ class Team:
|
|
|
390
393
|
self.workflow_session_state = workflow_session_state
|
|
391
394
|
self.add_state_in_messages = add_state_in_messages
|
|
392
395
|
|
|
396
|
+
self.cache_session = cache_session
|
|
397
|
+
|
|
393
398
|
self.description = description
|
|
394
399
|
self.instructions = instructions
|
|
395
400
|
self.expected_output = expected_output
|
|
@@ -729,9 +734,6 @@ class Team:
|
|
|
729
734
|
|
|
730
735
|
self._initialize_session_state(user_id=user_id, session_id=session_id)
|
|
731
736
|
|
|
732
|
-
# Read existing session from storage
|
|
733
|
-
self.read_from_storage(session_id=session_id)
|
|
734
|
-
|
|
735
737
|
return session_id, user_id
|
|
736
738
|
|
|
737
739
|
@overload
|
|
@@ -799,6 +801,9 @@ class Team:
|
|
|
799
801
|
# Initialize Team
|
|
800
802
|
self.initialize_team(session_id=session_id)
|
|
801
803
|
|
|
804
|
+
# Read existing session from storage
|
|
805
|
+
self.read_from_storage(session_id=session_id)
|
|
806
|
+
|
|
802
807
|
# Initialize Knowledge Filters
|
|
803
808
|
effective_filters = knowledge_filters
|
|
804
809
|
|
|
@@ -1191,14 +1196,17 @@ class Team:
|
|
|
1191
1196
|
**kwargs: Any,
|
|
1192
1197
|
) -> Union[TeamRunResponse, AsyncIterator[Union[RunResponseEvent, TeamRunResponseEvent]]]:
|
|
1193
1198
|
"""Run the Team asynchronously and return the response."""
|
|
1194
|
-
|
|
1195
1199
|
session_id, user_id = self._initialize_session(
|
|
1196
1200
|
session_id=session_id, user_id=user_id, session_state=session_state
|
|
1197
1201
|
)
|
|
1198
1202
|
log_debug(f"Session ID: {session_id}", center=True)
|
|
1199
1203
|
|
|
1204
|
+
# Initialize Team
|
|
1200
1205
|
self.initialize_team(session_id=session_id)
|
|
1201
1206
|
|
|
1207
|
+
# Read existing session from storage
|
|
1208
|
+
self.read_from_storage(session_id=session_id)
|
|
1209
|
+
|
|
1202
1210
|
effective_filters = knowledge_filters
|
|
1203
1211
|
|
|
1204
1212
|
# When filters are passed manually
|
|
@@ -1630,7 +1638,7 @@ class Team:
|
|
|
1630
1638
|
self.memory.add_team_run(team_run) # type: ignore
|
|
1631
1639
|
|
|
1632
1640
|
elif isinstance(self.memory, Memory):
|
|
1633
|
-
# Add
|
|
1641
|
+
# Add run to memory
|
|
1634
1642
|
self.memory.add_run(session_id=session_id, run=run_response)
|
|
1635
1643
|
|
|
1636
1644
|
def _update_memory(
|
|
@@ -6848,6 +6856,11 @@ class Team:
|
|
|
6848
6856
|
self.team_session = cast(
|
|
6849
6857
|
TeamSession, self.storage.upsert(session=self._get_team_session(session_id=session_id, user_id=user_id))
|
|
6850
6858
|
)
|
|
6859
|
+
|
|
6860
|
+
# Remove session from memory
|
|
6861
|
+
if not self.cache_session:
|
|
6862
|
+
if self.memory is not None and self.memory.runs is not None and session_id in self.memory.runs:
|
|
6863
|
+
self.memory.runs.pop(session_id) # type: ignore
|
|
6851
6864
|
return self.team_session
|
|
6852
6865
|
|
|
6853
6866
|
def rename_session(self, session_name: str, session_id: Optional[str] = None) -> None:
|
|
@@ -7025,6 +7038,7 @@ class Team:
|
|
|
7025
7038
|
self.memory.runs[session.session_id] = []
|
|
7026
7039
|
for run in session.memory["runs"]:
|
|
7027
7040
|
run_session_id = run["session_id"]
|
|
7041
|
+
|
|
7028
7042
|
if "team_id" in run:
|
|
7029
7043
|
self.memory.runs[run_session_id].append(TeamRunResponse.from_dict(run))
|
|
7030
7044
|
else:
|
|
@@ -7739,6 +7753,7 @@ class Team:
|
|
|
7739
7753
|
run_responses = self.memory.runs.get(session_id)
|
|
7740
7754
|
if run_responses is not None:
|
|
7741
7755
|
memory_dict["runs"] = [rr.to_dict() for rr in run_responses]
|
|
7756
|
+
|
|
7742
7757
|
return TeamSession(
|
|
7743
7758
|
session_id=session_id,
|
|
7744
7759
|
team_id=self.team_id,
|