agno 1.7.3__tar.gz → 1.7.4__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.3 → agno-1.7.4}/PKG-INFO +1 -1
- {agno-1.7.3 → agno-1.7.4}/agno/agent/agent.py +87 -19
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/agent.py +1 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/team.py +1 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/app.py +2 -1
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/async_router.py +97 -28
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/operator.py +25 -19
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/schemas.py +1 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/sync_router.py +93 -26
- {agno-1.7.3 → agno-1.7.4}/agno/run/base.py +2 -0
- {agno-1.7.3 → agno-1.7.4}/agno/run/response.py +4 -4
- {agno-1.7.3 → agno-1.7.4}/agno/run/team.py +6 -6
- agno-1.7.4/agno/run/v2/workflow.py +563 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/base.py +4 -4
- {agno-1.7.3 → agno-1.7.4}/agno/storage/dynamodb.py +74 -10
- {agno-1.7.3 → agno-1.7.4}/agno/storage/firestore.py +6 -1
- {agno-1.7.3 → agno-1.7.4}/agno/storage/gcs_json.py +8 -2
- {agno-1.7.3 → agno-1.7.4}/agno/storage/json.py +20 -5
- {agno-1.7.3 → agno-1.7.4}/agno/storage/mongodb.py +14 -5
- {agno-1.7.3 → agno-1.7.4}/agno/storage/mysql.py +56 -17
- {agno-1.7.3 → agno-1.7.4}/agno/storage/postgres.py +55 -13
- {agno-1.7.3 → agno-1.7.4}/agno/storage/redis.py +25 -5
- {agno-1.7.3 → agno-1.7.4}/agno/storage/session/__init__.py +3 -1
- {agno-1.7.3 → agno-1.7.4}/agno/storage/session/agent.py +3 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/session/team.py +3 -0
- agno-1.7.4/agno/storage/session/v2/__init__.py +5 -0
- agno-1.7.4/agno/storage/session/v2/workflow.py +89 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/singlestore.py +74 -12
- {agno-1.7.3 → agno-1.7.4}/agno/storage/sqlite.py +64 -18
- {agno-1.7.3 → agno-1.7.4}/agno/storage/yaml.py +26 -6
- {agno-1.7.3 → agno-1.7.4}/agno/team/team.py +85 -16
- {agno-1.7.3 → agno-1.7.4}/agno/utils/log.py +12 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/message.py +5 -1
- {agno-1.7.3 → agno-1.7.4}/agno/utils/openai.py +20 -5
- {agno-1.7.3 → agno-1.7.4}/agno/utils/pprint.py +32 -8
- agno-1.7.4/agno/workflow/v2/__init__.py +21 -0
- agno-1.7.4/agno/workflow/v2/condition.py +554 -0
- agno-1.7.4/agno/workflow/v2/loop.py +602 -0
- agno-1.7.4/agno/workflow/v2/parallel.py +659 -0
- agno-1.7.4/agno/workflow/v2/router.py +521 -0
- agno-1.7.4/agno/workflow/v2/step.py +861 -0
- agno-1.7.4/agno/workflow/v2/steps.py +465 -0
- agno-1.7.4/agno/workflow/v2/types.py +347 -0
- agno-1.7.4/agno/workflow/v2/workflow.py +3134 -0
- agno-1.7.4/agno/workspace/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/PKG-INFO +1 -1
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/SOURCES.txt +13 -0
- {agno-1.7.3 → agno-1.7.4}/pyproject.toml +1 -1
- {agno-1.7.3 → agno-1.7.4}/LICENSE +0 -0
- {agno-1.7.3 → agno-1.7.4}/README.md +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/agent/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/agent/metrics.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/agent.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/api.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/evals.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/playground.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/routes.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/evals.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/playground.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/response.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/user.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/workflows.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/schemas/workspace.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/team.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/user.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/workflows.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/api/workspace.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/agui/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/agui/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/agui/async_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/agui/sync_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/agui/utils.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/discord/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/discord/client.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/async_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/fastapi/sync_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/deploy.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/serve.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/settings.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/playground/utils.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/settings.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/slack/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/slack/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/slack/async_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/slack/security.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/slack/sync_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/utils.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/async_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/security.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/app/whatsapp/sync_router.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/auth_server.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/config.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/console.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/credentials.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/entrypoint.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/operator.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/settings.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/ws/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/cli/ws/ws_cli.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/constants.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/debug.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/agentic.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/document.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/fixed.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/markdown.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/recursive.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/semantic.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/chunking/strategy.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/arxiv_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/csv_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/docx_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/firecrawl_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/gcs/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/gcs/pdf_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/json_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/markdown_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/pdf_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/pdf_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/s3/text_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/text_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/url_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/website_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/document/reader/youtube_reader.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/aws_bedrock.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/azure_openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/cohere.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/fastembed.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/fireworks.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/google.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/huggingface.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/langdb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/mistral.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/nebius.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/ollama.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/sentence_transformer.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/together.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/embedder/voyageai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/eval/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/eval/accuracy.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/eval/performance.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/eval/reliability.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/eval/utils.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/exceptions.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/file/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/file/file.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/file/local/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/file/local/csv.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/file/local/txt.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/context.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/db_app.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/resource.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/infra/resources.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/agent.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/arxiv.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/combined.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/csv.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/csv_url.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/document.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/docx.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/firecrawl.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/gcs/pdf.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/json.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/langchain.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/light_rag.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/llamaindex.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/markdown.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf_bytes.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/pdf_url.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/pdf.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/s3/text.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/text.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/url.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/website.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/wikipedia.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/knowledge/youtube.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/media.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/agent.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/classifier.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/db/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/db/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/db/mongodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/db/postgres.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/db/sqlite.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/manager.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/memory.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/row.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/summarizer.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/summary.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/team.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/firestore.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/mongodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/postgres.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/redis.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/schema.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/db/sqlite.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/manager.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/memory.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/schema.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/v2/summarizer.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/memory/workflow.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/aimlapi/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/aimlapi/aimlapi.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/anthropic/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/anthropic/claude.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/aws/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/aws/bedrock.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/aws/claude.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/azure/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/azure/ai_foundry.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/azure/openai_chat.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/cerebras.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/cerebras/cerebras_openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/cohere/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/cohere/chat.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/deepinfra/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/deepinfra/deepinfra.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/deepseek/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/deepseek/deepseek.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/defaults.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/fireworks/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/fireworks/fireworks.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/google/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/google/gemini.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/groq/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/groq/groq.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/huggingface/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/huggingface/huggingface.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/ibm/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/ibm/watsonx.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/internlm/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/internlm/internlm.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/langdb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/langdb/langdb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/chat.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/litellm/litellm_openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/lmstudio/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/lmstudio/lmstudio.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/message.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/meta/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/meta/llama.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/meta/llama_openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/mistral/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/mistral/mistral.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/nebius/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/nebius/nebius.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/nvidia/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/nvidia/nvidia.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/chat.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/ollama/tools.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openai/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openai/chat.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openai/like.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openai/responses.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openrouter/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/openrouter/openrouter.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/perplexity/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/perplexity/perplexity.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/response.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/sambanova/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/sambanova/sambanova.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/together/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/together/together.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/vercel/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/vercel/v0.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/vllm/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/vllm/vllm.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/xai/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/models/xai/xai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/playground/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/playground/deploy.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/playground/playground.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/playground/serve.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/playground/settings.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/py.typed +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/azure_ai_foundry.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/deepseek.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/default.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/groq.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/helpers.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/ollama.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reasoning/step.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reranker/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reranker/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reranker/cohere.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reranker/infinity.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/reranker/sentence_transformer.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/run/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/run/messages.py +0 -0
- {agno-1.7.3/agno/storage → agno-1.7.4/agno/run/v2}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/run/workflow.py +0 -0
- {agno-1.7.3/agno/storage/agent → agno-1.7.4/agno/storage}/__init__.py +0 -0
- {agno-1.7.3/agno/storage/workflow → agno-1.7.4/agno/storage/agent}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/dynamodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/json.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/mongodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/postgres.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/singlestore.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/sqlite.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/agent/yaml.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/session/workflow.py +0 -0
- {agno-1.7.3/agno/tools/models → agno-1.7.4/agno/storage/workflow}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/mongodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/postgres.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/storage/workflow/sqlite.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/team/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/agentql.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/airflow.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/api.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/apify.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/arxiv.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/aws_lambda.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/aws_ses.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/baidusearch.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/bravesearch.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/brightdata.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/browserbase.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/calcom.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/calculator.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/cartesia.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/clickup_tool.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/confluence.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/crawl4ai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/csv_toolkit.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/dalle.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/daytona.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/decorator.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/desi_vocal.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/discord.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/docker.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/duckdb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/duckduckgo.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/e2b.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/eleven_labs.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/email.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/exa.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/fal.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/file.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/financial_datasets.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/firecrawl.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/function.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/giphy.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/github.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/gmail.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/google_bigquery.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/google_maps.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/googlecalendar.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/googlesearch.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/googlesheets.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/hackernews.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/jina.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/jira.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/knowledge.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/linear.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/local_file_system.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/lumalab.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/mcp.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/mem0.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/mlx_transcribe.py +0 -0
- {agno-1.7.3/agno/tools/streamlit → agno-1.7.4/agno/tools/models}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/models/azure_openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/models/gemini.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/models/groq.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/models/nebius.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/models_labs.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/moviepy_video.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/newspaper.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/newspaper4k.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/openai.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/openbb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/opencv.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/openweather.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/oxylabs.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/pandas.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/postgres.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/pubmed.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/python.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/reasoning.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/reddit.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/replicate.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/resend.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/scrapegraph.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/searxng.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/serpapi.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/serper.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/shell.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/slack.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/sleep.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/spider.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/sql.py +0 -0
- {agno-1.7.3/agno/utils → agno-1.7.4/agno/tools/streamlit}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/streamlit/components.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/tavily.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/telegram.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/thinking.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/todoist.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/tool_registry.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/toolkit.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/trello.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/twilio.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/user_control_flow.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/valyu.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/visualization.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/webbrowser.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/webex.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/website.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/webtools.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/whatsapp.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/wikipedia.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/x.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/yfinance.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/youtube.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/zendesk.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/zep.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/tools/zoom.py +0 -0
- {agno-1.7.3/agno/utils/models → agno-1.7.4/agno/utils}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/audio.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/certs.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/code_execution.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/common.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/defaults.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/dttm.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/enum.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/env.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/events.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/filesystem.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/format_str.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/functions.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/gemini.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/git.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/http.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/json_io.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/json_schema.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/load_env.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/location.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/mcp.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/media.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/merge_dict.py +0 -0
- {agno-1.7.3/agno/workspace → agno-1.7.4/agno/utils/models}/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/ai_foundry.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/aws_claude.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/claude.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/cohere.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/llama.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/mistral.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/openai_responses.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/schema_utils.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/models/watsonx.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/pickle.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/prompts.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/py_io.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/pyproject.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/resource_filter.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/response.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/response_iterator.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/safe_formatter.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/shell.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/string.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/timer.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/tools.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/web.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/whatsapp.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/utils/yaml_io.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/base.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/cassandra.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/cassandra/index.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/chroma/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/chroma/chromadb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/clickhouse/index.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/couchbase/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/couchbase/couchbase.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/distance.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/lancedb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/lancedb/lance_db.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/milvus/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/milvus/milvus.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/mongodb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/mongodb/mongodb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/index.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pgvector/pgvector.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pineconedb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/pineconedb/pineconedb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/qdrant/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/qdrant/qdrant.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/search.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/index.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/singlestore/singlestore.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/upstashdb/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/upstashdb/upstashdb.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/index.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/vectordb/weaviate/weaviate.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workflow/__init__.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workflow/workflow.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workspace/config.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workspace/enums.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workspace/helpers.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workspace/operator.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno/workspace/settings.py +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/dependency_links.txt +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/entry_points.txt +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/requires.txt +0 -0
- {agno-1.7.3 → agno-1.7.4}/agno.egg-info/top_level.txt +0 -0
- {agno-1.7.3 → agno-1.7.4}/setup.cfg +0 -0
|
@@ -318,9 +318,13 @@ class Agent:
|
|
|
318
318
|
|
|
319
319
|
# Optional workflow ID. Indicates this agent is part of a workflow.
|
|
320
320
|
workflow_id: Optional[str] = None
|
|
321
|
+
# Set when this agent is part of a workflow.
|
|
322
|
+
workflow_session_id: Optional[str] = None
|
|
321
323
|
|
|
322
324
|
# Optional team session state. Set by the team leader agent.
|
|
323
325
|
team_session_state: Optional[Dict[str, Any]] = None
|
|
326
|
+
# Optional workflow session state. Set by the workflow.
|
|
327
|
+
workflow_session_state: Optional[Dict[str, Any]] = None
|
|
324
328
|
|
|
325
329
|
# --- Debug & Monitoring ---
|
|
326
330
|
# Enable debug logs
|
|
@@ -543,7 +547,7 @@ class Agent:
|
|
|
543
547
|
self.session_metrics: Optional[SessionMetrics] = None
|
|
544
548
|
|
|
545
549
|
self.run_id: Optional[str] = None
|
|
546
|
-
self.run_input: Optional[Union[str, List, Dict, Message]] = None
|
|
550
|
+
self.run_input: Optional[Union[str, List, Dict, Message, BaseModel]] = None
|
|
547
551
|
self.run_messages: Optional[RunMessages] = None
|
|
548
552
|
self.run_response: Optional[RunResponse] = None
|
|
549
553
|
|
|
@@ -695,10 +699,14 @@ class Agent:
|
|
|
695
699
|
self.session_state["current_user_id"] = user_id
|
|
696
700
|
if self.team_session_state is not None:
|
|
697
701
|
self.team_session_state["current_user_id"] = user_id
|
|
702
|
+
if self.workflow_session_state is not None:
|
|
703
|
+
self.workflow_session_state["current_user_id"] = user_id
|
|
698
704
|
if session_id is not None:
|
|
699
705
|
self.session_state["current_session_id"] = session_id
|
|
700
706
|
if self.team_session_state is not None:
|
|
701
707
|
self.team_session_state["current_session_id"] = session_id
|
|
708
|
+
if self.workflow_session_state is not None:
|
|
709
|
+
self.workflow_session_state["current_user_id"] = user_id
|
|
702
710
|
|
|
703
711
|
def _reset_session_state(self) -> None:
|
|
704
712
|
"""Reset the session state for the agent."""
|
|
@@ -929,7 +937,7 @@ class Agent:
|
|
|
929
937
|
@overload
|
|
930
938
|
def run(
|
|
931
939
|
self,
|
|
932
|
-
message: Optional[Union[str, List, Dict, Message]] = None,
|
|
940
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
933
941
|
*,
|
|
934
942
|
stream: Literal[False] = False,
|
|
935
943
|
stream_intermediate_steps: Optional[bool] = None,
|
|
@@ -950,7 +958,7 @@ class Agent:
|
|
|
950
958
|
@overload
|
|
951
959
|
def run(
|
|
952
960
|
self,
|
|
953
|
-
message: Optional[Union[str, List, Dict, Message]] = None,
|
|
961
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
954
962
|
*,
|
|
955
963
|
stream: Literal[True] = True,
|
|
956
964
|
stream_intermediate_steps: Optional[bool] = None,
|
|
@@ -970,7 +978,7 @@ class Agent:
|
|
|
970
978
|
|
|
971
979
|
def run(
|
|
972
980
|
self,
|
|
973
|
-
message: Optional[Union[str, List, Dict, Message]] = None,
|
|
981
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
974
982
|
*,
|
|
975
983
|
stream: Optional[bool] = None,
|
|
976
984
|
stream_intermediate_steps: Optional[bool] = None,
|
|
@@ -1346,7 +1354,7 @@ class Agent:
|
|
|
1346
1354
|
|
|
1347
1355
|
async def arun(
|
|
1348
1356
|
self,
|
|
1349
|
-
message: Optional[Union[str, List, Dict, Message]] = None,
|
|
1357
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
1350
1358
|
*,
|
|
1351
1359
|
stream: Optional[bool] = None,
|
|
1352
1360
|
user_id: Optional[str] = None,
|
|
@@ -3869,6 +3877,8 @@ class Agent:
|
|
|
3869
3877
|
session_data["session_state"] = self.session_state
|
|
3870
3878
|
if self.team_session_state is not None and len(self.team_session_state) > 0:
|
|
3871
3879
|
session_data["team_session_state"] = self.team_session_state
|
|
3880
|
+
if self.workflow_session_state is not None and len(self.workflow_session_state) > 0:
|
|
3881
|
+
session_data["workflow_session_state"] = self.workflow_session_state
|
|
3872
3882
|
if self.session_metrics is not None:
|
|
3873
3883
|
session_data["session_metrics"] = asdict(self.session_metrics) if self.session_metrics is not None else None
|
|
3874
3884
|
if self.team_data is not None:
|
|
@@ -3905,12 +3915,15 @@ class Agent:
|
|
|
3905
3915
|
memory_dict = None
|
|
3906
3916
|
|
|
3907
3917
|
self.team_session_id = cast(str, self.team_session_id)
|
|
3918
|
+
self.workflow_session_id = cast(str, self.workflow_session_id)
|
|
3919
|
+
|
|
3908
3920
|
self.agent_id = cast(str, self.agent_id)
|
|
3909
3921
|
return AgentSession(
|
|
3910
3922
|
session_id=session_id,
|
|
3911
3923
|
agent_id=self.agent_id,
|
|
3912
3924
|
user_id=user_id,
|
|
3913
3925
|
team_session_id=self.team_session_id,
|
|
3926
|
+
workflow_session_id=self.workflow_session_id,
|
|
3914
3927
|
memory=memory_dict,
|
|
3915
3928
|
agent_data=self.get_agent_data(),
|
|
3916
3929
|
session_data=self.get_session_data(),
|
|
@@ -3921,6 +3934,9 @@ class Agent:
|
|
|
3921
3934
|
def load_agent_session(self, session: AgentSession):
|
|
3922
3935
|
"""Load the existing Agent from an AgentSession (from the database)"""
|
|
3923
3936
|
|
|
3937
|
+
if not hasattr(session, "memory"):
|
|
3938
|
+
return
|
|
3939
|
+
|
|
3924
3940
|
from agno.utils.merge_dict import merge_dictionaries
|
|
3925
3941
|
|
|
3926
3942
|
# Get the agent_id, user_id and session_id from the database
|
|
@@ -3977,6 +3993,22 @@ class Agent:
|
|
|
3977
3993
|
# Update the current team_session_state
|
|
3978
3994
|
self.team_session_state = team_session_state_from_db
|
|
3979
3995
|
|
|
3996
|
+
if "workflow_session_state" in session.session_data:
|
|
3997
|
+
workflow_session_state_from_db = session.session_data.get("workflow_session_state")
|
|
3998
|
+
if (
|
|
3999
|
+
workflow_session_state_from_db is not None
|
|
4000
|
+
and isinstance(workflow_session_state_from_db, dict)
|
|
4001
|
+
and len(workflow_session_state_from_db) > 0
|
|
4002
|
+
):
|
|
4003
|
+
# If the workflow_session_state is already set, merge the workflow_session_state from the database with the current workflow_session_state
|
|
4004
|
+
if self.workflow_session_state is not None and len(self.workflow_session_state) > 0:
|
|
4005
|
+
# This updates workflow_session_state_from_db
|
|
4006
|
+
# If there are conflicting keys, values from workflow_session_state_from_db will take precedence
|
|
4007
|
+
merge_dictionaries(self.workflow_session_state, workflow_session_state_from_db)
|
|
4008
|
+
else:
|
|
4009
|
+
# Update the current workflow_session_state
|
|
4010
|
+
self.workflow_session_state = workflow_session_state_from_db
|
|
4011
|
+
|
|
3980
4012
|
# Get the session_metrics from the database
|
|
3981
4013
|
if "session_metrics" in session.session_data:
|
|
3982
4014
|
session_metrics_from_db = session.session_data.get("session_metrics")
|
|
@@ -4147,10 +4179,10 @@ class Agent:
|
|
|
4147
4179
|
if not self.storage:
|
|
4148
4180
|
return
|
|
4149
4181
|
|
|
4150
|
-
agent_session_from_db = self.storage.read(session_id=session_id)
|
|
4182
|
+
agent_session_from_db = self.storage.read(session_id=session_id) # type: ignore
|
|
4151
4183
|
if (
|
|
4152
4184
|
agent_session_from_db is not None
|
|
4153
|
-
and agent_session_from_db.memory is not None
|
|
4185
|
+
and agent_session_from_db.memory is not None # type: ignore
|
|
4154
4186
|
and "runs" in agent_session_from_db.memory # type: ignore
|
|
4155
4187
|
):
|
|
4156
4188
|
if isinstance(self.memory, AgentMemory):
|
|
@@ -4278,6 +4310,7 @@ class Agent:
|
|
|
4278
4310
|
format_variables = ChainMap(
|
|
4279
4311
|
self.session_state or {},
|
|
4280
4312
|
self.team_session_state or {},
|
|
4313
|
+
self.workflow_session_state or {},
|
|
4281
4314
|
self.context or {},
|
|
4282
4315
|
self.extra_data or {},
|
|
4283
4316
|
{"user_id": self.user_id} if self.user_id is not None else {},
|
|
@@ -4614,7 +4647,7 @@ class Agent:
|
|
|
4614
4647
|
def get_user_message(
|
|
4615
4648
|
self,
|
|
4616
4649
|
*,
|
|
4617
|
-
message: Optional[Union[str, List]],
|
|
4650
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
4618
4651
|
audio: Optional[Sequence[Audio]] = None,
|
|
4619
4652
|
images: Optional[Sequence[Image]] = None,
|
|
4620
4653
|
videos: Optional[Sequence[Video]] = None,
|
|
@@ -4687,7 +4720,7 @@ class Agent:
|
|
|
4687
4720
|
)
|
|
4688
4721
|
|
|
4689
4722
|
# 2. If create_default_user_message is False or message is a list, return the message as is.
|
|
4690
|
-
if not self.create_default_user_message
|
|
4723
|
+
if not self.create_default_user_message:
|
|
4691
4724
|
return Message(
|
|
4692
4725
|
role=self.user_message_role,
|
|
4693
4726
|
content=message,
|
|
@@ -4698,6 +4731,24 @@ class Agent:
|
|
|
4698
4731
|
**kwargs,
|
|
4699
4732
|
)
|
|
4700
4733
|
|
|
4734
|
+
# Handle list messages by converting to string
|
|
4735
|
+
if isinstance(message, list):
|
|
4736
|
+
# Convert list to string (join with newlines if all elements are strings)
|
|
4737
|
+
if all(isinstance(item, str) for item in message):
|
|
4738
|
+
message_content = "\n".join(message)
|
|
4739
|
+
else:
|
|
4740
|
+
message_content = str(message)
|
|
4741
|
+
|
|
4742
|
+
return Message(
|
|
4743
|
+
role=self.user_message_role,
|
|
4744
|
+
content=message_content,
|
|
4745
|
+
images=images,
|
|
4746
|
+
audio=audio,
|
|
4747
|
+
videos=videos,
|
|
4748
|
+
files=files,
|
|
4749
|
+
**kwargs,
|
|
4750
|
+
)
|
|
4751
|
+
|
|
4701
4752
|
# 3. Build the default user message for the Agent
|
|
4702
4753
|
if message is None:
|
|
4703
4754
|
# If we have any media, return a message with empty content
|
|
@@ -4719,6 +4770,10 @@ class Agent:
|
|
|
4719
4770
|
# Format the message with the session state variables
|
|
4720
4771
|
if self.add_state_in_messages:
|
|
4721
4772
|
user_msg_content = self.format_message_with_state_variables(message)
|
|
4773
|
+
|
|
4774
|
+
# Convert to string for concatenation operations
|
|
4775
|
+
user_msg_content_str = get_text_from_message(user_msg_content) if user_msg_content is not None else ""
|
|
4776
|
+
|
|
4722
4777
|
# 4.1 Add references to user message
|
|
4723
4778
|
if (
|
|
4724
4779
|
self.add_references
|
|
@@ -4726,15 +4781,18 @@ class Agent:
|
|
|
4726
4781
|
and references.references is not None
|
|
4727
4782
|
and len(references.references) > 0
|
|
4728
4783
|
):
|
|
4729
|
-
|
|
4730
|
-
|
|
4731
|
-
|
|
4732
|
-
|
|
4784
|
+
user_msg_content_str += "\n\nUse the following references from the knowledge base if it helps:\n"
|
|
4785
|
+
user_msg_content_str += "<references>\n"
|
|
4786
|
+
user_msg_content_str += self.convert_documents_to_string(references.references) + "\n"
|
|
4787
|
+
user_msg_content_str += "</references>"
|
|
4733
4788
|
# 4.2 Add context to user message
|
|
4734
4789
|
if self.add_context and self.context is not None:
|
|
4735
|
-
|
|
4736
|
-
|
|
4737
|
-
|
|
4790
|
+
user_msg_content_str += "\n\n<context>\n"
|
|
4791
|
+
user_msg_content_str += self.convert_context_to_string(self.context) + "\n"
|
|
4792
|
+
user_msg_content_str += "</context>"
|
|
4793
|
+
|
|
4794
|
+
# Use the string version for the final content
|
|
4795
|
+
user_msg_content = user_msg_content_str
|
|
4738
4796
|
|
|
4739
4797
|
# Return the user message
|
|
4740
4798
|
return Message(
|
|
@@ -4750,7 +4808,7 @@ class Agent:
|
|
|
4750
4808
|
def get_run_messages(
|
|
4751
4809
|
self,
|
|
4752
4810
|
*,
|
|
4753
|
-
message: Optional[Union[str, List, Dict, Message]] = None,
|
|
4811
|
+
message: Optional[Union[str, List, Dict, Message, BaseModel]] = None,
|
|
4754
4812
|
session_id: str,
|
|
4755
4813
|
user_id: Optional[str] = None,
|
|
4756
4814
|
audio: Optional[Sequence[Audio]] = None,
|
|
@@ -4877,6 +4935,14 @@ class Agent:
|
|
|
4877
4935
|
user_message = Message.model_validate(message)
|
|
4878
4936
|
except Exception as e:
|
|
4879
4937
|
log_warning(f"Failed to validate message: {e}")
|
|
4938
|
+
# 4.4 If message is provided as a BaseModel, convert it to a Message
|
|
4939
|
+
elif isinstance(message, BaseModel):
|
|
4940
|
+
try:
|
|
4941
|
+
# Create a user message with the BaseModel content
|
|
4942
|
+
content = message.model_dump_json(indent=2, exclude_none=True)
|
|
4943
|
+
user_message = Message(role=self.user_message_role, content=content)
|
|
4944
|
+
except Exception as e:
|
|
4945
|
+
log_warning(f"Failed to convert BaseModel to message: {e}")
|
|
4880
4946
|
# Add user message to run_messages
|
|
4881
4947
|
if user_message is not None:
|
|
4882
4948
|
run_messages.user_message = user_message
|
|
@@ -6731,6 +6797,7 @@ class Agent:
|
|
|
6731
6797
|
session_id=agent_session.session_id,
|
|
6732
6798
|
agent_data=agent_session.to_dict() if self.monitoring else agent_session.telemetry_data(),
|
|
6733
6799
|
team_session_id=agent_session.team_session_id,
|
|
6800
|
+
workflow_session_id=agent_session.workflow_session_id,
|
|
6734
6801
|
),
|
|
6735
6802
|
monitor=self.monitoring,
|
|
6736
6803
|
)
|
|
@@ -6758,6 +6825,7 @@ class Agent:
|
|
|
6758
6825
|
session_id=agent_session.session_id,
|
|
6759
6826
|
agent_data=agent_session.to_dict() if self.monitoring else agent_session.telemetry_data(),
|
|
6760
6827
|
team_session_id=agent_session.team_session_id,
|
|
6828
|
+
workflow_session_id=agent_session.workflow_session_id,
|
|
6761
6829
|
),
|
|
6762
6830
|
monitor=self.monitoring,
|
|
6763
6831
|
)
|
|
@@ -6770,7 +6838,7 @@ class Agent:
|
|
|
6770
6838
|
|
|
6771
6839
|
def print_response(
|
|
6772
6840
|
self,
|
|
6773
|
-
message: Optional[Union[List, Dict, str, Message]] = None,
|
|
6841
|
+
message: Optional[Union[List, Dict, str, Message, BaseModel]] = None,
|
|
6774
6842
|
*,
|
|
6775
6843
|
session_id: Optional[str] = None,
|
|
6776
6844
|
session_state: Optional[Dict[str, Any]] = None,
|
|
@@ -7219,7 +7287,7 @@ class Agent:
|
|
|
7219
7287
|
|
|
7220
7288
|
async def aprint_response(
|
|
7221
7289
|
self,
|
|
7222
|
-
message: Optional[Union[List, Dict, str, Message]] = None,
|
|
7290
|
+
message: Optional[Union[List, Dict, str, Message, BaseModel]] = None,
|
|
7223
7291
|
*,
|
|
7224
7292
|
messages: Optional[List[Union[Dict, Message]]] = None,
|
|
7225
7293
|
session_id: Optional[str] = None,
|
|
@@ -15,6 +15,7 @@ class AgentRunCreate(BaseModel):
|
|
|
15
15
|
|
|
16
16
|
session_id: str
|
|
17
17
|
team_session_id: Optional[str] = None
|
|
18
|
+
workflow_session_id: Optional[str] = None
|
|
18
19
|
run_id: Optional[str] = None
|
|
19
20
|
run_data: Optional[Dict[str, Any]] = None
|
|
20
21
|
agent_data: Optional[Dict[str, Any]] = None
|
|
@@ -15,6 +15,7 @@ class TeamRunCreate(BaseModel):
|
|
|
15
15
|
|
|
16
16
|
session_id: str
|
|
17
17
|
team_session_id: Optional[str] = None
|
|
18
|
+
workflow_session_id: Optional[str] = None
|
|
18
19
|
run_id: Optional[str] = None
|
|
19
20
|
run_data: Optional[Dict[str, Any]] = None
|
|
20
21
|
team_data: Optional[Dict[str, Any]] = None
|
|
@@ -83,7 +83,7 @@ class Playground:
|
|
|
83
83
|
|
|
84
84
|
if self.workflows:
|
|
85
85
|
for workflow in self.workflows:
|
|
86
|
-
if not workflow.app_id:
|
|
86
|
+
if hasattr(workflow, "app_id") and not workflow.app_id:
|
|
87
87
|
workflow.app_id = self.app_id
|
|
88
88
|
if not workflow.workflow_id:
|
|
89
89
|
workflow.workflow_id = generate_id(workflow.name)
|
|
@@ -197,6 +197,7 @@ class Playground:
|
|
|
197
197
|
# Print the panel
|
|
198
198
|
console.print(panel)
|
|
199
199
|
self.set_app_id()
|
|
200
|
+
|
|
200
201
|
self.register_app_on_platform()
|
|
201
202
|
|
|
202
203
|
uvicorn.run(app=app, host=host, port=port, reload=reload, **kwargs)
|
|
@@ -38,11 +38,13 @@ from agno.memory.agent import AgentMemory
|
|
|
38
38
|
from agno.memory.v2 import Memory
|
|
39
39
|
from agno.run.response import RunResponseErrorEvent, RunResponseEvent
|
|
40
40
|
from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
|
|
41
|
+
from agno.run.v2.workflow import WorkflowErrorEvent
|
|
41
42
|
from agno.storage.session.agent import AgentSession
|
|
42
43
|
from agno.storage.session.team import TeamSession
|
|
43
44
|
from agno.storage.session.workflow import WorkflowSession
|
|
44
45
|
from agno.team.team import Team
|
|
45
46
|
from agno.utils.log import logger
|
|
47
|
+
from agno.workflow.v2.workflow import Workflow as WorkflowV2
|
|
46
48
|
from agno.workflow.workflow import Workflow
|
|
47
49
|
|
|
48
50
|
|
|
@@ -146,6 +148,31 @@ async def team_chat_response_streamer(
|
|
|
146
148
|
return
|
|
147
149
|
|
|
148
150
|
|
|
151
|
+
async def workflow_response_streamer(
|
|
152
|
+
workflow: WorkflowV2,
|
|
153
|
+
body: WorkflowRunRequest,
|
|
154
|
+
) -> AsyncGenerator:
|
|
155
|
+
try:
|
|
156
|
+
run_response = await workflow.arun(
|
|
157
|
+
**body.input,
|
|
158
|
+
user_id=body.user_id,
|
|
159
|
+
session_id=body.session_id or str(uuid4()),
|
|
160
|
+
stream=True,
|
|
161
|
+
stream_intermediate_steps=True,
|
|
162
|
+
)
|
|
163
|
+
async for run_response_chunk in run_response:
|
|
164
|
+
yield run_response_chunk.to_json()
|
|
165
|
+
except Exception as e:
|
|
166
|
+
import traceback
|
|
167
|
+
|
|
168
|
+
traceback.print_exc(limit=3)
|
|
169
|
+
error_response = WorkflowErrorEvent(
|
|
170
|
+
error=str(e),
|
|
171
|
+
)
|
|
172
|
+
yield error_response.to_json()
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
|
|
149
176
|
def get_async_playground_router(
|
|
150
177
|
agents: Optional[List[Agent]] = None,
|
|
151
178
|
workflows: Optional[List[Workflow]] = None,
|
|
@@ -616,13 +643,22 @@ def get_async_playground_router(
|
|
|
616
643
|
if workflow is None:
|
|
617
644
|
raise HTTPException(status_code=404, detail="Workflow not found")
|
|
618
645
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
646
|
+
if isinstance(workflow, Workflow):
|
|
647
|
+
return WorkflowGetResponse(
|
|
648
|
+
workflow_id=workflow.workflow_id,
|
|
649
|
+
name=workflow.name,
|
|
650
|
+
description=workflow.description,
|
|
651
|
+
parameters=workflow._run_parameters or {},
|
|
652
|
+
storage=workflow.storage.__class__.__name__ if workflow.storage else None,
|
|
653
|
+
)
|
|
654
|
+
else:
|
|
655
|
+
return WorkflowGetResponse(
|
|
656
|
+
workflow_id=workflow.workflow_id,
|
|
657
|
+
name=workflow.name,
|
|
658
|
+
description=workflow.description,
|
|
659
|
+
parameters=workflow.run_parameters,
|
|
660
|
+
storage=workflow.storage.__class__.__name__ if workflow.storage else None,
|
|
661
|
+
)
|
|
626
662
|
|
|
627
663
|
@playground_router.post("/workflows/{workflow_id}/runs")
|
|
628
664
|
async def create_workflow_run(workflow_id: str, body: WorkflowRunRequest):
|
|
@@ -637,24 +673,54 @@ def get_async_playground_router(
|
|
|
637
673
|
logger.debug("Creating new session")
|
|
638
674
|
|
|
639
675
|
# Create a new instance of this workflow
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
676
|
+
if isinstance(workflow, Workflow):
|
|
677
|
+
new_workflow_instance = workflow.deep_copy(
|
|
678
|
+
update={"workflow_id": workflow_id, "session_id": body.session_id}
|
|
679
|
+
)
|
|
680
|
+
new_workflow_instance.user_id = body.user_id
|
|
681
|
+
new_workflow_instance.session_name = None
|
|
643
682
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
683
|
+
# Return based on the response type
|
|
684
|
+
try:
|
|
685
|
+
if new_workflow_instance._run_return_type == "RunResponse":
|
|
686
|
+
# Return as a normal response
|
|
687
|
+
return new_workflow_instance.run(**body.input)
|
|
688
|
+
else:
|
|
689
|
+
# Return as a streaming response
|
|
690
|
+
return StreamingResponse(
|
|
691
|
+
(result.to_json() for result in new_workflow_instance.run(**body.input)),
|
|
692
|
+
media_type="text/event-stream",
|
|
693
|
+
headers={
|
|
694
|
+
"Access-Control-Allow-Origin": "*",
|
|
695
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
696
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
697
|
+
},
|
|
698
|
+
)
|
|
699
|
+
except Exception as e:
|
|
700
|
+
# Handle unexpected runtime errors
|
|
701
|
+
raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
|
|
702
|
+
else:
|
|
703
|
+
# Return based on the response type
|
|
704
|
+
try:
|
|
705
|
+
if body.stream:
|
|
706
|
+
# Return as a streaming response
|
|
707
|
+
return StreamingResponse(
|
|
708
|
+
workflow_response_streamer(workflow, body),
|
|
709
|
+
media_type="text/event-stream",
|
|
710
|
+
headers={
|
|
711
|
+
"Access-Control-Allow-Origin": "*",
|
|
712
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
713
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
|
|
714
|
+
},
|
|
715
|
+
)
|
|
716
|
+
else:
|
|
717
|
+
# Return as a normal response
|
|
718
|
+
return await workflow.arun(
|
|
719
|
+
**body.input, session_id=body.session_id or str(uuid4()), user_id=body.user_id
|
|
720
|
+
)
|
|
721
|
+
except Exception as e:
|
|
722
|
+
# Handle unexpected runtime errors
|
|
723
|
+
raise HTTPException(status_code=500, detail=f"Error running workflow: {str(e)}")
|
|
658
724
|
|
|
659
725
|
@playground_router.get("/workflows/{workflow_id}/sessions")
|
|
660
726
|
async def get_all_workflow_sessions(workflow_id: str, user_id: Optional[str] = Query(None, min_length=1)):
|
|
@@ -689,7 +755,7 @@ def get_async_playground_router(
|
|
|
689
755
|
)
|
|
690
756
|
return workflow_sessions
|
|
691
757
|
|
|
692
|
-
@playground_router.get("/workflows/{workflow_id}/sessions/{session_id}"
|
|
758
|
+
@playground_router.get("/workflows/{workflow_id}/sessions/{session_id}")
|
|
693
759
|
async def get_workflow_session(
|
|
694
760
|
workflow_id: str, session_id: str, user_id: Optional[str] = Query(None, min_length=1)
|
|
695
761
|
):
|
|
@@ -704,15 +770,18 @@ def get_async_playground_router(
|
|
|
704
770
|
|
|
705
771
|
# Retrieve the specific session
|
|
706
772
|
try:
|
|
707
|
-
workflow_session
|
|
773
|
+
workflow_session = workflow.storage.read(session_id, user_id) # type: ignore
|
|
708
774
|
except Exception as e:
|
|
709
775
|
raise HTTPException(status_code=500, detail=f"Error retrieving session: {str(e)}")
|
|
710
776
|
|
|
711
777
|
if not workflow_session:
|
|
712
778
|
raise HTTPException(status_code=404, detail="Session not found")
|
|
713
779
|
|
|
714
|
-
|
|
715
|
-
|
|
780
|
+
workflow_session_dict = workflow_session.to_dict()
|
|
781
|
+
if "memory" not in workflow_session_dict:
|
|
782
|
+
workflow_session_dict["memory"] = {"runs": workflow_session_dict.pop("runs", [])}
|
|
783
|
+
|
|
784
|
+
return JSONResponse(content=workflow_session_dict)
|
|
716
785
|
|
|
717
786
|
@playground_router.post("/workflows/{workflow_id}/sessions/{session_id}/rename")
|
|
718
787
|
async def rename_workflow_session(workflow_id: str, session_id: str, body: WorkflowRenameRequest):
|
|
@@ -92,30 +92,36 @@ def get_session_title_from_workflow_session(workflow_session: WorkflowSession) -
|
|
|
92
92
|
)
|
|
93
93
|
if session_name is not None:
|
|
94
94
|
return session_name
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
# Split content by newlines and take first line, but limit to 100 chars
|
|
105
|
-
first_line = content.split("\n")[0]
|
|
106
|
-
return first_line[:100] + "..." if len(first_line) > 100 else first_line
|
|
107
|
-
|
|
108
|
-
# Fallback to response.content structure (if it exists)
|
|
109
|
-
response = _run.get("response")
|
|
110
|
-
if response:
|
|
111
|
-
content = response.get("content")
|
|
95
|
+
if hasattr(workflow_session, "memory"):
|
|
96
|
+
memory = workflow_session.memory
|
|
97
|
+
if memory is not None:
|
|
98
|
+
runs = memory.get("runs")
|
|
99
|
+
runs = cast(List[Any], runs)
|
|
100
|
+
for _run in runs:
|
|
101
|
+
try:
|
|
102
|
+
# Try to get content directly from the run first (workflow structure)
|
|
103
|
+
content = _run.get("content")
|
|
112
104
|
if content:
|
|
113
105
|
# Split content by newlines and take first line, but limit to 100 chars
|
|
114
106
|
first_line = content.split("\n")[0]
|
|
115
107
|
return first_line[:100] + "..." if len(first_line) > 100 else first_line
|
|
116
108
|
|
|
117
|
-
|
|
118
|
-
|
|
109
|
+
# Fallback to response.content structure (if it exists)
|
|
110
|
+
response = _run.get("response")
|
|
111
|
+
if response:
|
|
112
|
+
content = response.get("content")
|
|
113
|
+
if content:
|
|
114
|
+
# Split content by newlines and take first line, but limit to 100 chars
|
|
115
|
+
first_line = content.split("\n")[0]
|
|
116
|
+
return first_line[:100] + "..." if len(first_line) > 100 else first_line
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
logger.error(f"Error parsing workflow session: {e}")
|
|
120
|
+
if hasattr(workflow_session, "runs"):
|
|
121
|
+
if workflow_session.runs is not None and len(workflow_session.runs) > 0:
|
|
122
|
+
for _run in workflow_session.runs:
|
|
123
|
+
if _run.content:
|
|
124
|
+
return _run.content[:100] + "..." if len(_run.content) > 100 else _run.content
|
|
119
125
|
return "Unnamed session"
|
|
120
126
|
|
|
121
127
|
|