agno 1.8.1__py3-none-any.whl → 2.0.0a1__py3-none-any.whl
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/__init__.py +8 -0
- agno/agent/__init__.py +19 -27
- agno/agent/agent.py +2778 -4123
- agno/api/agent.py +9 -65
- agno/api/api.py +5 -46
- agno/api/evals.py +6 -17
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -41
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +5 -21
- agno/api/schemas/evals.py +7 -16
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +5 -21
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +11 -7
- agno/api/settings.py +53 -0
- agno/api/team.py +9 -64
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/db/__init__.py +24 -0
- agno/db/base.py +245 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +1749 -0
- agno/db/dynamo/schemas.py +278 -0
- agno/db/dynamo/utils.py +684 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1438 -0
- agno/db/firestore/schemas.py +130 -0
- agno/db/firestore/utils.py +278 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1001 -0
- agno/db/gcs_json/utils.py +194 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +888 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1051 -0
- agno/db/json/utils.py +196 -0
- agno/db/migrations/v1_to_v2.py +162 -0
- agno/db/mongo/__init__.py +3 -0
- agno/db/mongo/mongo.py +1417 -0
- agno/db/mongo/schemas.py +77 -0
- agno/db/mongo/utils.py +204 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +1719 -0
- agno/db/mysql/schemas.py +124 -0
- agno/db/mysql/utils.py +298 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1720 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +281 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1371 -0
- agno/db/redis/schemas.py +109 -0
- agno/db/redis/utils.py +288 -0
- agno/db/schemas/__init__.py +3 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +116 -0
- agno/db/singlestore/singlestore.py +1722 -0
- agno/db/singlestore/utils.py +327 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1680 -0
- agno/db/sqlite/utils.py +269 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +142 -43
- agno/eval/performance.py +88 -23
- agno/eval/reliability.py +73 -20
- agno/eval/utils.py +23 -13
- agno/integrations/discord/__init__.py +3 -0
- agno/{app → integrations}/discord/client.py +10 -10
- agno/knowledge/__init__.py +2 -2
- agno/{document → knowledge}/chunking/agentic.py +2 -2
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +3 -3
- agno/{document → knowledge}/chunking/markdown.py +2 -2
- agno/{document → knowledge}/chunking/recursive.py +2 -2
- agno/{document → knowledge}/chunking/row.py +2 -2
- agno/knowledge/chunking/semantic.py +59 -0
- agno/knowledge/chunking/strategy.py +121 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/{document → knowledge/document}/base.py +12 -2
- agno/knowledge/embedder/__init__.py +5 -0
- agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
- agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
- agno/{embedder → knowledge/embedder}/base.py +6 -0
- agno/{embedder → knowledge/embedder}/cohere.py +72 -1
- agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/{embedder → knowledge/embedder}/google.py +74 -1
- agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
- agno/{embedder → knowledge/embedder}/jina.py +48 -2
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +139 -0
- agno/{embedder → knowledge/embedder}/nebius.py +1 -1
- agno/{embedder → knowledge/embedder}/ollama.py +54 -3
- agno/knowledge/embedder/openai.py +223 -0
- agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
- agno/knowledge/knowledge.py +1515 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
- agno/knowledge/reader/base.py +88 -0
- agno/{document → knowledge}/reader/csv_reader.py +68 -15
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/knowledge/reader/gcs_reader.py +67 -0
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +36 -9
- agno/{document → knowledge}/reader/pdf_reader.py +79 -21
- agno/knowledge/reader/reader_factory.py +275 -0
- agno/knowledge/reader/s3_reader.py +171 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +84 -0
- agno/knowledge/reader/web_search_reader.py +389 -0
- agno/{document → knowledge}/reader/website_reader.py +37 -10
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/{reranker → knowledge/reranker}/infinity.py +2 -2
- agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
- agno/knowledge/types.py +30 -0
- agno/knowledge/utils.py +169 -0
- agno/memory/__init__.py +2 -10
- agno/memory/manager.py +1003 -148
- agno/models/aimlapi/__init__.py +2 -2
- agno/models/aimlapi/aimlapi.py +6 -6
- agno/models/anthropic/claude.py +129 -82
- agno/models/aws/bedrock.py +107 -175
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +347 -287
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +100 -42
- agno/models/groq/groq.py +97 -35
- agno/models/huggingface/huggingface.py +92 -27
- agno/models/ibm/watsonx.py +72 -13
- agno/models/litellm/chat.py +85 -13
- agno/models/message.py +38 -144
- agno/models/meta/llama.py +85 -49
- agno/models/metrics.py +120 -0
- agno/models/mistral/mistral.py +90 -21
- agno/models/ollama/__init__.py +0 -2
- agno/models/ollama/chat.py +84 -46
- agno/models/openai/chat.py +121 -23
- agno/models/openai/responses.py +178 -105
- agno/models/perplexity/perplexity.py +26 -2
- agno/models/portkey/portkey.py +0 -7
- agno/models/response.py +14 -8
- agno/models/utils.py +20 -0
- agno/models/vercel/__init__.py +2 -2
- agno/models/vercel/v0.py +1 -1
- agno/models/vllm/__init__.py +2 -2
- agno/models/vllm/vllm.py +3 -3
- agno/models/xai/xai.py +10 -10
- agno/os/__init__.py +3 -0
- agno/os/app.py +393 -0
- agno/os/auth.py +47 -0
- agno/os/config.py +103 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +31 -0
- agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
- agno/{app → os/interfaces}/agui/utils.py +65 -28
- agno/os/interfaces/base.py +21 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
- agno/os/interfaces/slack/slack.py +33 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
- agno/os/interfaces/whatsapp/whatsapp.py +30 -0
- agno/os/router.py +843 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +204 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +161 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +413 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +179 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +58 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +163 -0
- agno/os/schema.py +892 -0
- agno/{app/playground → os}/settings.py +8 -15
- agno/os/utils.py +270 -0
- agno/reasoning/azure_ai_foundry.py +4 -4
- agno/reasoning/deepseek.py +4 -4
- agno/reasoning/default.py +6 -11
- agno/reasoning/groq.py +4 -4
- agno/reasoning/helpers.py +4 -6
- agno/reasoning/ollama.py +4 -4
- agno/reasoning/openai.py +4 -4
- agno/run/{response.py → agent.py} +144 -72
- agno/run/base.py +44 -58
- agno/run/cancel.py +83 -0
- agno/run/team.py +133 -77
- agno/run/workflow.py +537 -12
- agno/session/__init__.py +10 -0
- agno/session/agent.py +244 -0
- agno/session/summary.py +225 -0
- agno/session/team.py +262 -0
- agno/{storage/session/v2 → session}/workflow.py +47 -24
- agno/team/__init__.py +15 -16
- agno/team/team.py +2961 -4253
- agno/tools/agentql.py +14 -5
- agno/tools/airflow.py +9 -4
- agno/tools/api.py +7 -3
- agno/tools/apify.py +2 -46
- agno/tools/arxiv.py +8 -3
- agno/tools/aws_lambda.py +7 -5
- agno/tools/aws_ses.py +7 -1
- agno/tools/baidusearch.py +4 -1
- agno/tools/bitbucket.py +4 -4
- agno/tools/brandfetch.py +14 -11
- agno/tools/bravesearch.py +4 -1
- agno/tools/brightdata.py +42 -22
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +18 -13
- agno/tools/{clickup_tool.py → clickup.py} +12 -25
- agno/tools/confluence.py +8 -8
- agno/tools/crawl4ai.py +7 -1
- agno/tools/csv_toolkit.py +9 -8
- agno/tools/dalle.py +18 -11
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +16 -7
- agno/tools/discord.py +11 -8
- agno/tools/docker.py +30 -42
- agno/tools/duckdb.py +34 -53
- agno/tools/duckduckgo.py +8 -7
- agno/tools/e2b.py +61 -61
- agno/tools/eleven_labs.py +35 -28
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +29 -29
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +68 -17
- agno/tools/giphy.py +22 -10
- agno/tools/github.py +48 -126
- agno/tools/gmail.py +45 -61
- agno/tools/google_bigquery.py +7 -6
- agno/tools/google_maps.py +11 -26
- agno/tools/googlesearch.py +7 -2
- agno/tools/googlesheets.py +21 -17
- agno/tools/hackernews.py +9 -5
- agno/tools/jina.py +5 -4
- agno/tools/jira.py +18 -9
- agno/tools/knowledge.py +31 -32
- agno/tools/linear.py +18 -33
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +31 -19
- agno/tools/mem0.py +18 -12
- agno/tools/memori.py +14 -10
- agno/tools/mlx_transcribe.py +3 -2
- agno/tools/models/azure_openai.py +32 -14
- agno/tools/models/gemini.py +58 -31
- agno/tools/models/groq.py +29 -20
- agno/tools/models/nebius.py +27 -11
- agno/tools/models_labs.py +39 -15
- agno/tools/moviepy_video.py +7 -6
- agno/tools/neo4j.py +10 -8
- agno/tools/newspaper.py +7 -2
- agno/tools/newspaper4k.py +8 -3
- agno/tools/openai.py +57 -26
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +62 -46
- agno/tools/openweather.py +14 -12
- agno/tools/pandas.py +11 -3
- agno/tools/postgres.py +4 -12
- agno/tools/pubmed.py +4 -1
- agno/tools/python.py +9 -22
- agno/tools/reasoning.py +35 -27
- agno/tools/reddit.py +11 -26
- agno/tools/replicate.py +54 -41
- agno/tools/resend.py +4 -1
- agno/tools/scrapegraph.py +15 -14
- agno/tools/searxng.py +10 -23
- agno/tools/serpapi.py +6 -3
- agno/tools/serper.py +13 -4
- agno/tools/shell.py +9 -2
- agno/tools/slack.py +12 -11
- agno/tools/sleep.py +3 -2
- agno/tools/spider.py +24 -4
- agno/tools/sql.py +7 -6
- agno/tools/tavily.py +6 -4
- agno/tools/telegram.py +12 -4
- agno/tools/todoist.py +11 -31
- agno/tools/toolkit.py +1 -1
- agno/tools/trafilatura.py +22 -6
- agno/tools/trello.py +9 -22
- agno/tools/twilio.py +10 -3
- agno/tools/user_control_flow.py +6 -1
- agno/tools/valyu.py +34 -5
- agno/tools/visualization.py +19 -28
- agno/tools/webbrowser.py +4 -3
- agno/tools/webex.py +11 -7
- agno/tools/website.py +15 -46
- agno/tools/webtools.py +12 -4
- agno/tools/whatsapp.py +5 -9
- agno/tools/wikipedia.py +20 -13
- agno/tools/x.py +14 -13
- agno/tools/yfinance.py +13 -40
- agno/tools/youtube.py +26 -20
- agno/tools/zendesk.py +7 -2
- agno/tools/zep.py +10 -7
- agno/tools/zoom.py +10 -9
- agno/utils/common.py +1 -19
- agno/utils/events.py +95 -118
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +2 -2
- agno/utils/mcp.py +11 -5
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/claude.py +6 -4
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1565 -0
- agno/utils/print_response/workflow.py +1451 -0
- agno/utils/prompts.py +14 -14
- agno/utils/reasoning.py +87 -0
- agno/utils/response.py +42 -42
- agno/utils/string.py +8 -22
- agno/utils/team.py +50 -0
- agno/utils/timer.py +2 -2
- agno/vectordb/base.py +33 -21
- agno/vectordb/cassandra/cassandra.py +287 -23
- agno/vectordb/chroma/chromadb.py +482 -59
- agno/vectordb/clickhouse/clickhousedb.py +270 -63
- agno/vectordb/couchbase/couchbase.py +309 -29
- agno/vectordb/lancedb/lance_db.py +360 -21
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +145 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +374 -0
- agno/vectordb/llamaindex/llamaindexdb.py +127 -0
- agno/vectordb/milvus/milvus.py +242 -32
- agno/vectordb/mongodb/mongodb.py +200 -24
- agno/vectordb/pgvector/pgvector.py +319 -37
- agno/vectordb/pineconedb/pineconedb.py +221 -27
- agno/vectordb/qdrant/qdrant.py +334 -14
- agno/vectordb/singlestore/singlestore.py +286 -29
- agno/vectordb/surrealdb/surrealdb.py +187 -7
- agno/vectordb/upstashdb/upstashdb.py +342 -26
- agno/vectordb/weaviate/weaviate.py +227 -165
- agno/workflow/__init__.py +17 -13
- agno/workflow/{v2/condition.py → condition.py} +135 -32
- agno/workflow/{v2/loop.py → loop.py} +115 -28
- agno/workflow/{v2/parallel.py → parallel.py} +138 -108
- agno/workflow/{v2/router.py → router.py} +133 -32
- agno/workflow/{v2/step.py → step.py} +200 -42
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2394 -696
- agno-2.0.0a1.dist-info/METADATA +355 -0
- agno-2.0.0a1.dist-info/RECORD +514 -0
- agno/agent/metrics.py +0 -107
- agno/api/app.py +0 -35
- agno/api/playground.py +0 -92
- agno/api/schemas/app.py +0 -12
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -35
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workflows.py +0 -33
- agno/api/workspace.py +0 -175
- agno/app/agui/__init__.py +0 -3
- agno/app/agui/app.py +0 -17
- agno/app/agui/sync_router.py +0 -120
- agno/app/base.py +0 -186
- agno/app/discord/__init__.py +0 -3
- agno/app/fastapi/__init__.py +0 -3
- agno/app/fastapi/app.py +0 -107
- agno/app/fastapi/async_router.py +0 -457
- agno/app/fastapi/sync_router.py +0 -448
- agno/app/playground/app.py +0 -228
- agno/app/playground/async_router.py +0 -1050
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -220
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1042
- agno/app/playground/utils.py +0 -46
- agno/app/settings.py +0 -15
- agno/app/slack/__init__.py +0 -3
- agno/app/slack/app.py +0 -19
- agno/app/slack/sync_router.py +0 -92
- agno/app/utils.py +0 -54
- agno/app/whatsapp/__init__.py +0 -3
- agno/app/whatsapp/app.py +0 -15
- agno/app/whatsapp/sync_router.py +0 -197
- agno/cli/auth_server.py +0 -249
- agno/cli/config.py +0 -274
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -357
- agno/cli/settings.py +0 -96
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -5
- agno/document/chunking/semantic.py +0 -45
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -5
- agno/document/reader/base.py +0 -47
- agno/document/reader/docx_reader.py +0 -60
- agno/document/reader/gcs/pdf_reader.py +0 -44
- agno/document/reader/s3/pdf_reader.py +0 -59
- agno/document/reader/s3/text_reader.py +0 -63
- agno/document/reader/url_reader.py +0 -59
- agno/document/reader/youtube_reader.py +0 -58
- agno/embedder/__init__.py +0 -5
- agno/embedder/langdb.py +0 -80
- agno/embedder/mistral.py +0 -82
- agno/embedder/openai.py +0 -78
- agno/file/__init__.py +0 -5
- agno/file/file.py +0 -16
- agno/file/local/csv.py +0 -32
- agno/file/local/txt.py +0 -19
- agno/infra/app.py +0 -240
- agno/infra/base.py +0 -144
- agno/infra/context.py +0 -20
- agno/infra/db_app.py +0 -52
- agno/infra/resource.py +0 -205
- agno/infra/resources.py +0 -55
- agno/knowledge/agent.py +0 -702
- agno/knowledge/arxiv.py +0 -33
- agno/knowledge/combined.py +0 -36
- agno/knowledge/csv.py +0 -144
- agno/knowledge/csv_url.py +0 -124
- agno/knowledge/document.py +0 -223
- agno/knowledge/docx.py +0 -137
- agno/knowledge/firecrawl.py +0 -34
- agno/knowledge/gcs/__init__.py +0 -0
- agno/knowledge/gcs/base.py +0 -39
- agno/knowledge/gcs/pdf.py +0 -125
- agno/knowledge/json.py +0 -137
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/light_rag.py +0 -273
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/markdown.py +0 -154
- agno/knowledge/pdf.py +0 -164
- agno/knowledge/pdf_bytes.py +0 -42
- agno/knowledge/pdf_url.py +0 -148
- agno/knowledge/s3/__init__.py +0 -0
- agno/knowledge/s3/base.py +0 -64
- agno/knowledge/s3/pdf.py +0 -33
- agno/knowledge/s3/text.py +0 -34
- agno/knowledge/text.py +0 -141
- agno/knowledge/url.py +0 -46
- agno/knowledge/website.py +0 -179
- agno/knowledge/wikipedia.py +0 -32
- agno/knowledge/youtube.py +0 -35
- agno/memory/agent.py +0 -423
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -5
- agno/memory/db/base.py +0 -42
- agno/memory/db/mongodb.py +0 -189
- agno/memory/db/postgres.py +0 -203
- agno/memory/db/sqlite.py +0 -193
- agno/memory/memory.py +0 -22
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -201
- agno/memory/summary.py +0 -19
- agno/memory/team.py +0 -415
- agno/memory/v2/__init__.py +0 -2
- agno/memory/v2/db/__init__.py +0 -1
- agno/memory/v2/db/base.py +0 -42
- agno/memory/v2/db/firestore.py +0 -339
- agno/memory/v2/db/mongodb.py +0 -196
- agno/memory/v2/db/postgres.py +0 -214
- agno/memory/v2/db/redis.py +0 -187
- agno/memory/v2/db/schema.py +0 -54
- agno/memory/v2/db/sqlite.py +0 -209
- agno/memory/v2/manager.py +0 -437
- agno/memory/v2/memory.py +0 -1097
- agno/memory/v2/schema.py +0 -55
- agno/memory/v2/summarizer.py +0 -215
- agno/memory/workflow.py +0 -38
- agno/models/ollama/tools.py +0 -430
- agno/models/qwen/__init__.py +0 -5
- agno/playground/__init__.py +0 -10
- agno/playground/deploy.py +0 -3
- agno/playground/playground.py +0 -3
- agno/playground/serve.py +0 -3
- agno/playground/settings.py +0 -3
- agno/reranker/__init__.py +0 -0
- agno/run/v2/__init__.py +0 -0
- agno/run/v2/workflow.py +0 -567
- agno/storage/__init__.py +0 -0
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/dynamodb.py +0 -1
- agno/storage/agent/json.py +0 -1
- agno/storage/agent/mongodb.py +0 -1
- agno/storage/agent/postgres.py +0 -1
- agno/storage/agent/singlestore.py +0 -1
- agno/storage/agent/sqlite.py +0 -1
- agno/storage/agent/yaml.py +0 -1
- agno/storage/base.py +0 -60
- agno/storage/dynamodb.py +0 -673
- agno/storage/firestore.py +0 -297
- agno/storage/gcs_json.py +0 -261
- agno/storage/in_memory.py +0 -234
- agno/storage/json.py +0 -237
- agno/storage/mongodb.py +0 -328
- agno/storage/mysql.py +0 -685
- agno/storage/postgres.py +0 -682
- agno/storage/redis.py +0 -336
- agno/storage/session/__init__.py +0 -16
- agno/storage/session/agent.py +0 -64
- agno/storage/session/team.py +0 -63
- agno/storage/session/v2/__init__.py +0 -5
- agno/storage/session/workflow.py +0 -61
- agno/storage/singlestore.py +0 -606
- agno/storage/sqlite.py +0 -646
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/mongodb.py +0 -1
- agno/storage/workflow/postgres.py +0 -1
- agno/storage/workflow/sqlite.py +0 -1
- agno/storage/yaml.py +0 -241
- agno/tools/thinking.py +0 -73
- agno/utils/defaults.py +0 -57
- agno/utils/filesystem.py +0 -39
- agno/utils/git.py +0 -52
- agno/utils/json_io.py +0 -30
- agno/utils/load_env.py +0 -19
- agno/utils/py_io.py +0 -19
- agno/utils/pyproject.py +0 -18
- agno/utils/resource_filter.py +0 -31
- agno/workflow/v2/__init__.py +0 -21
- agno/workflow/v2/types.py +0 -357
- agno/workflow/v2/workflow.py +0 -3312
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -52
- agno/workspace/operator.py +0 -757
- agno/workspace/settings.py +0 -158
- agno-1.8.1.dist-info/METADATA +0 -982
- agno-1.8.1.dist-info/RECORD +0 -566
- agno-1.8.1.dist-info/entry_points.txt +0 -3
- /agno/{app → db/migrations}/__init__.py +0 -0
- /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{cli → integrations}/__init__.py +0 -0
- /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
- /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
- /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
- /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
- /agno/{app → os/interfaces}/slack/security.py +0 -0
- /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
- /agno/{file/local → utils/print_response}/__init__.py +0 -0
- /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
from dataclasses import dataclass
|
|
3
|
-
from typing import AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
|
|
3
|
+
from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
|
|
4
|
+
from uuid import uuid4
|
|
4
5
|
|
|
5
|
-
from agno.run.
|
|
6
|
-
from agno.run.team import
|
|
7
|
-
from agno.run.
|
|
6
|
+
from agno.run.agent import RunOutputEvent
|
|
7
|
+
from agno.run.team import TeamRunOutputEvent
|
|
8
|
+
from agno.run.workflow import (
|
|
8
9
|
ConditionExecutionCompletedEvent,
|
|
9
10
|
ConditionExecutionStartedEvent,
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
WorkflowRunOutput,
|
|
12
|
+
WorkflowRunOutputEvent,
|
|
12
13
|
)
|
|
13
14
|
from agno.utils.log import log_debug, logger
|
|
14
|
-
from agno.workflow.
|
|
15
|
-
from agno.workflow.
|
|
15
|
+
from agno.workflow.step import Step
|
|
16
|
+
from agno.workflow.types import StepInput, StepOutput, StepType
|
|
16
17
|
|
|
17
18
|
WorkflowSteps = List[
|
|
18
19
|
Union[
|
|
@@ -48,11 +49,11 @@ class Condition:
|
|
|
48
49
|
"""Prepare the steps for execution - mirrors workflow logic"""
|
|
49
50
|
from agno.agent.agent import Agent
|
|
50
51
|
from agno.team.team import Team
|
|
51
|
-
from agno.workflow.
|
|
52
|
-
from agno.workflow.
|
|
53
|
-
from agno.workflow.
|
|
54
|
-
from agno.workflow.
|
|
55
|
-
from agno.workflow.
|
|
52
|
+
from agno.workflow.loop import Loop
|
|
53
|
+
from agno.workflow.parallel import Parallel
|
|
54
|
+
from agno.workflow.router import Router
|
|
55
|
+
from agno.workflow.step import Step
|
|
56
|
+
from agno.workflow.steps import Steps
|
|
56
57
|
|
|
57
58
|
prepared_steps: WorkflowSteps = []
|
|
58
59
|
for step in self.steps:
|
|
@@ -100,7 +101,7 @@ class Condition:
|
|
|
100
101
|
updated_previous_step_outputs.update(condition_step_outputs)
|
|
101
102
|
|
|
102
103
|
return StepInput(
|
|
103
|
-
|
|
104
|
+
input=step_input.input,
|
|
104
105
|
previous_step_content=previous_step_content,
|
|
105
106
|
previous_step_outputs=updated_previous_step_outputs,
|
|
106
107
|
additional_data=step_input.additional_data,
|
|
@@ -145,11 +146,19 @@ class Condition:
|
|
|
145
146
|
return False
|
|
146
147
|
|
|
147
148
|
def execute(
|
|
148
|
-
self,
|
|
149
|
-
|
|
149
|
+
self,
|
|
150
|
+
step_input: StepInput,
|
|
151
|
+
session_id: Optional[str] = None,
|
|
152
|
+
user_id: Optional[str] = None,
|
|
153
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
154
|
+
store_executor_outputs: bool = True,
|
|
155
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
156
|
+
) -> StepOutput:
|
|
150
157
|
"""Execute the condition and its steps with sequential chaining if condition is true"""
|
|
151
158
|
log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
|
|
152
159
|
|
|
160
|
+
conditional_step_id = str(uuid4())
|
|
161
|
+
|
|
153
162
|
self._prepare_steps()
|
|
154
163
|
|
|
155
164
|
# Evaluate the condition
|
|
@@ -158,7 +167,13 @@ class Condition:
|
|
|
158
167
|
|
|
159
168
|
if not condition_result:
|
|
160
169
|
log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
|
|
161
|
-
return
|
|
170
|
+
return StepOutput(
|
|
171
|
+
step_name=self.name,
|
|
172
|
+
step_id=conditional_step_id,
|
|
173
|
+
step_type=StepType.CONDITION,
|
|
174
|
+
content=f"Condition {self.name} not met - skipped {len(self.steps)} steps",
|
|
175
|
+
success=True,
|
|
176
|
+
)
|
|
162
177
|
|
|
163
178
|
log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
|
|
164
179
|
all_results: List[StepOutput] = []
|
|
@@ -167,7 +182,14 @@ class Condition:
|
|
|
167
182
|
|
|
168
183
|
for i, step in enumerate(self.steps):
|
|
169
184
|
try:
|
|
170
|
-
step_output = step.execute(
|
|
185
|
+
step_output = step.execute( # type: ignore[union-attr]
|
|
186
|
+
current_step_input,
|
|
187
|
+
session_id=session_id,
|
|
188
|
+
user_id=user_id,
|
|
189
|
+
workflow_run_response=workflow_run_response,
|
|
190
|
+
store_executor_outputs=store_executor_outputs,
|
|
191
|
+
session_state=session_state,
|
|
192
|
+
)
|
|
171
193
|
|
|
172
194
|
# Handle both single StepOutput and List[StepOutput] (from Loop/Condition/Router steps)
|
|
173
195
|
if isinstance(step_output, list):
|
|
@@ -210,7 +232,17 @@ class Condition:
|
|
|
210
232
|
break
|
|
211
233
|
|
|
212
234
|
log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
213
|
-
|
|
235
|
+
|
|
236
|
+
return StepOutput(
|
|
237
|
+
step_name=self.name,
|
|
238
|
+
step_id=conditional_step_id,
|
|
239
|
+
step_type=StepType.CONDITION,
|
|
240
|
+
content=f"Condition {self.name} completed with {len(all_results)} results",
|
|
241
|
+
success=all(result.success for result in all_results) if all_results else True,
|
|
242
|
+
error=None,
|
|
243
|
+
stop=False,
|
|
244
|
+
steps=all_results,
|
|
245
|
+
)
|
|
214
246
|
|
|
215
247
|
def execute_stream(
|
|
216
248
|
self,
|
|
@@ -218,12 +250,17 @@ class Condition:
|
|
|
218
250
|
session_id: Optional[str] = None,
|
|
219
251
|
user_id: Optional[str] = None,
|
|
220
252
|
stream_intermediate_steps: bool = False,
|
|
221
|
-
workflow_run_response: Optional[
|
|
253
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
222
254
|
step_index: Optional[Union[int, tuple]] = None,
|
|
223
|
-
|
|
255
|
+
store_executor_outputs: bool = True,
|
|
256
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
257
|
+
parent_step_id: Optional[str] = None,
|
|
258
|
+
) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
|
|
224
259
|
"""Execute the condition with streaming support - mirrors Loop logic"""
|
|
225
260
|
log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
|
|
226
261
|
|
|
262
|
+
conditional_step_id = str(uuid4())
|
|
263
|
+
|
|
227
264
|
self._prepare_steps()
|
|
228
265
|
|
|
229
266
|
# Evaluate the condition
|
|
@@ -240,6 +277,8 @@ class Condition:
|
|
|
240
277
|
step_name=self.name,
|
|
241
278
|
step_index=step_index,
|
|
242
279
|
condition_result=condition_result,
|
|
280
|
+
step_id=conditional_step_id,
|
|
281
|
+
parent_step_id=parent_step_id,
|
|
243
282
|
)
|
|
244
283
|
|
|
245
284
|
if not condition_result:
|
|
@@ -255,6 +294,8 @@ class Condition:
|
|
|
255
294
|
condition_result=False,
|
|
256
295
|
executed_steps=0,
|
|
257
296
|
step_results=[],
|
|
297
|
+
step_id=conditional_step_id,
|
|
298
|
+
parent_step_id=parent_step_id,
|
|
258
299
|
)
|
|
259
300
|
return
|
|
260
301
|
|
|
@@ -283,6 +324,9 @@ class Condition:
|
|
|
283
324
|
stream_intermediate_steps=stream_intermediate_steps,
|
|
284
325
|
workflow_run_response=workflow_run_response,
|
|
285
326
|
step_index=child_step_index,
|
|
327
|
+
store_executor_outputs=store_executor_outputs,
|
|
328
|
+
session_state=session_state,
|
|
329
|
+
parent_step_id=conditional_step_id,
|
|
286
330
|
):
|
|
287
331
|
if isinstance(event, StepOutput):
|
|
288
332
|
step_outputs_for_step.append(event)
|
|
@@ -342,17 +386,33 @@ class Condition:
|
|
|
342
386
|
condition_result=True,
|
|
343
387
|
executed_steps=len(self.steps),
|
|
344
388
|
step_results=all_results,
|
|
389
|
+
step_id=conditional_step_id,
|
|
390
|
+
parent_step_id=parent_step_id,
|
|
345
391
|
)
|
|
346
392
|
|
|
347
|
-
|
|
348
|
-
|
|
393
|
+
yield StepOutput(
|
|
394
|
+
step_name=self.name,
|
|
395
|
+
step_id=conditional_step_id,
|
|
396
|
+
step_type=StepType.CONDITION,
|
|
397
|
+
content=f"Condition {self.name} completed with {len(all_results)} results",
|
|
398
|
+
success=all(result.success for result in all_results) if all_results else True,
|
|
399
|
+
steps=all_results,
|
|
400
|
+
)
|
|
349
401
|
|
|
350
402
|
async def aexecute(
|
|
351
|
-
self,
|
|
352
|
-
|
|
403
|
+
self,
|
|
404
|
+
step_input: StepInput,
|
|
405
|
+
session_id: Optional[str] = None,
|
|
406
|
+
user_id: Optional[str] = None,
|
|
407
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
408
|
+
store_executor_outputs: bool = True,
|
|
409
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
410
|
+
) -> StepOutput:
|
|
353
411
|
"""Async execute the condition and its steps with sequential chaining"""
|
|
354
412
|
log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
|
|
355
413
|
|
|
414
|
+
conditional_step_id = str(uuid4())
|
|
415
|
+
|
|
356
416
|
self._prepare_steps()
|
|
357
417
|
|
|
358
418
|
# Evaluate the condition
|
|
@@ -361,7 +421,13 @@ class Condition:
|
|
|
361
421
|
|
|
362
422
|
if not condition_result:
|
|
363
423
|
log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
|
|
364
|
-
return
|
|
424
|
+
return StepOutput(
|
|
425
|
+
step_name=self.name,
|
|
426
|
+
step_id=str(uuid4()),
|
|
427
|
+
step_type=StepType.CONDITION,
|
|
428
|
+
content=f"Condition {self.name} not met - skipped {len(self.steps)} steps",
|
|
429
|
+
success=True,
|
|
430
|
+
)
|
|
365
431
|
|
|
366
432
|
log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
|
|
367
433
|
|
|
@@ -372,7 +438,14 @@ class Condition:
|
|
|
372
438
|
|
|
373
439
|
for i, step in enumerate(self.steps):
|
|
374
440
|
try:
|
|
375
|
-
step_output = await step.aexecute(
|
|
441
|
+
step_output = await step.aexecute( # type: ignore[union-attr]
|
|
442
|
+
current_step_input,
|
|
443
|
+
session_id=session_id,
|
|
444
|
+
user_id=user_id,
|
|
445
|
+
workflow_run_response=workflow_run_response,
|
|
446
|
+
store_executor_outputs=store_executor_outputs,
|
|
447
|
+
session_state=session_state,
|
|
448
|
+
)
|
|
376
449
|
|
|
377
450
|
# Handle both single StepOutput and List[StepOutput]
|
|
378
451
|
if isinstance(step_output, list):
|
|
@@ -413,7 +486,17 @@ class Condition:
|
|
|
413
486
|
break
|
|
414
487
|
|
|
415
488
|
log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
416
|
-
|
|
489
|
+
|
|
490
|
+
return StepOutput(
|
|
491
|
+
step_name=self.name,
|
|
492
|
+
step_id=conditional_step_id,
|
|
493
|
+
step_type=StepType.CONDITION,
|
|
494
|
+
content=f"Condition {self.name} completed with {len(all_results)} results",
|
|
495
|
+
success=all(result.success for result in all_results) if all_results else True,
|
|
496
|
+
error=None,
|
|
497
|
+
stop=False,
|
|
498
|
+
steps=all_results,
|
|
499
|
+
)
|
|
417
500
|
|
|
418
501
|
async def aexecute_stream(
|
|
419
502
|
self,
|
|
@@ -421,12 +504,17 @@ class Condition:
|
|
|
421
504
|
session_id: Optional[str] = None,
|
|
422
505
|
user_id: Optional[str] = None,
|
|
423
506
|
stream_intermediate_steps: bool = False,
|
|
424
|
-
workflow_run_response: Optional[
|
|
507
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
425
508
|
step_index: Optional[Union[int, tuple]] = None,
|
|
426
|
-
|
|
509
|
+
store_executor_outputs: bool = True,
|
|
510
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
511
|
+
parent_step_id: Optional[str] = None,
|
|
512
|
+
) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
|
|
427
513
|
"""Async execute the condition with streaming support - mirrors Loop logic"""
|
|
428
514
|
log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
|
|
429
515
|
|
|
516
|
+
conditional_step_id = str(uuid4())
|
|
517
|
+
|
|
430
518
|
self._prepare_steps()
|
|
431
519
|
|
|
432
520
|
# Evaluate the condition
|
|
@@ -443,6 +531,8 @@ class Condition:
|
|
|
443
531
|
step_name=self.name,
|
|
444
532
|
step_index=step_index,
|
|
445
533
|
condition_result=condition_result,
|
|
534
|
+
step_id=conditional_step_id,
|
|
535
|
+
parent_step_id=parent_step_id,
|
|
446
536
|
)
|
|
447
537
|
|
|
448
538
|
if not condition_result:
|
|
@@ -458,6 +548,8 @@ class Condition:
|
|
|
458
548
|
condition_result=False,
|
|
459
549
|
executed_steps=0,
|
|
460
550
|
step_results=[],
|
|
551
|
+
step_id=conditional_step_id,
|
|
552
|
+
parent_step_id=parent_step_id,
|
|
461
553
|
)
|
|
462
554
|
return
|
|
463
555
|
|
|
@@ -488,6 +580,9 @@ class Condition:
|
|
|
488
580
|
stream_intermediate_steps=stream_intermediate_steps,
|
|
489
581
|
workflow_run_response=workflow_run_response,
|
|
490
582
|
step_index=child_step_index,
|
|
583
|
+
store_executor_outputs=store_executor_outputs,
|
|
584
|
+
session_state=session_state,
|
|
585
|
+
parent_step_id=conditional_step_id,
|
|
491
586
|
):
|
|
492
587
|
if isinstance(event, StepOutput):
|
|
493
588
|
step_outputs_for_step.append(event)
|
|
@@ -548,7 +643,15 @@ class Condition:
|
|
|
548
643
|
condition_result=True,
|
|
549
644
|
executed_steps=len(self.steps),
|
|
550
645
|
step_results=all_results,
|
|
646
|
+
step_id=conditional_step_id,
|
|
647
|
+
parent_step_id=parent_step_id,
|
|
551
648
|
)
|
|
552
649
|
|
|
553
|
-
|
|
554
|
-
|
|
650
|
+
yield StepOutput(
|
|
651
|
+
step_name=self.name,
|
|
652
|
+
step_id=conditional_step_id,
|
|
653
|
+
step_type=StepType.CONDITION,
|
|
654
|
+
content=f"Condition {self.name} completed with {len(all_results)} results",
|
|
655
|
+
success=all(result.success for result in all_results) if all_results else True,
|
|
656
|
+
steps=all_results,
|
|
657
|
+
)
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
from dataclasses import dataclass
|
|
3
|
-
from typing import AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
|
|
3
|
+
from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
|
|
4
|
+
from uuid import uuid4
|
|
4
5
|
|
|
5
|
-
from agno.run.
|
|
6
|
-
from agno.run.team import
|
|
7
|
-
from agno.run.
|
|
6
|
+
from agno.run.agent import RunOutputEvent
|
|
7
|
+
from agno.run.team import TeamRunOutputEvent
|
|
8
|
+
from agno.run.workflow import (
|
|
8
9
|
LoopExecutionCompletedEvent,
|
|
9
10
|
LoopExecutionStartedEvent,
|
|
10
11
|
LoopIterationCompletedEvent,
|
|
11
12
|
LoopIterationStartedEvent,
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
WorkflowRunOutput,
|
|
14
|
+
WorkflowRunOutputEvent,
|
|
14
15
|
)
|
|
15
16
|
from agno.utils.log import log_debug, logger
|
|
16
|
-
from agno.workflow.
|
|
17
|
-
from agno.workflow.
|
|
17
|
+
from agno.workflow.step import Step
|
|
18
|
+
from agno.workflow.types import StepInput, StepOutput, StepType
|
|
18
19
|
|
|
19
20
|
WorkflowSteps = List[
|
|
20
21
|
Union[
|
|
@@ -61,11 +62,11 @@ class Loop:
|
|
|
61
62
|
"""Prepare the steps for execution - mirrors workflow logic"""
|
|
62
63
|
from agno.agent.agent import Agent
|
|
63
64
|
from agno.team.team import Team
|
|
64
|
-
from agno.workflow.
|
|
65
|
-
from agno.workflow.
|
|
66
|
-
from agno.workflow.
|
|
67
|
-
from agno.workflow.
|
|
68
|
-
from agno.workflow.
|
|
65
|
+
from agno.workflow.condition import Condition
|
|
66
|
+
from agno.workflow.parallel import Parallel
|
|
67
|
+
from agno.workflow.router import Router
|
|
68
|
+
from agno.workflow.step import Step
|
|
69
|
+
from agno.workflow.steps import Steps
|
|
69
70
|
|
|
70
71
|
prepared_steps: WorkflowSteps = []
|
|
71
72
|
for step in self.steps:
|
|
@@ -114,7 +115,7 @@ class Loop:
|
|
|
114
115
|
updated_previous_step_outputs.update(loop_step_outputs)
|
|
115
116
|
|
|
116
117
|
return StepInput(
|
|
117
|
-
|
|
118
|
+
input=step_input.input,
|
|
118
119
|
previous_step_content=previous_step_content,
|
|
119
120
|
previous_step_outputs=updated_previous_step_outputs,
|
|
120
121
|
additional_data=step_input.additional_data,
|
|
@@ -128,7 +129,10 @@ class Loop:
|
|
|
128
129
|
step_input: StepInput,
|
|
129
130
|
session_id: Optional[str] = None,
|
|
130
131
|
user_id: Optional[str] = None,
|
|
131
|
-
|
|
132
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
133
|
+
store_executor_outputs: bool = True,
|
|
134
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
135
|
+
) -> StepOutput:
|
|
132
136
|
"""Execute loop steps with iteration control - mirrors workflow execution logic"""
|
|
133
137
|
# Use workflow logger for loop orchestration
|
|
134
138
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
@@ -146,7 +150,14 @@ class Loop:
|
|
|
146
150
|
loop_step_outputs = {} # Track outputs within this loop iteration
|
|
147
151
|
|
|
148
152
|
for i, step in enumerate(self.steps):
|
|
149
|
-
step_output = step.execute(
|
|
153
|
+
step_output = step.execute( # type: ignore[union-attr]
|
|
154
|
+
current_step_input,
|
|
155
|
+
session_id=session_id,
|
|
156
|
+
user_id=user_id,
|
|
157
|
+
workflow_run_response=workflow_run_response,
|
|
158
|
+
store_executor_outputs=store_executor_outputs,
|
|
159
|
+
session_state=session_state,
|
|
160
|
+
)
|
|
150
161
|
|
|
151
162
|
# Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
|
|
152
163
|
if isinstance(step_output, list):
|
|
@@ -194,7 +205,14 @@ class Loop:
|
|
|
194
205
|
for iteration_results in all_results:
|
|
195
206
|
flattened_results.extend(iteration_results)
|
|
196
207
|
|
|
197
|
-
return
|
|
208
|
+
return StepOutput(
|
|
209
|
+
step_name=self.name,
|
|
210
|
+
step_id=str(uuid4()),
|
|
211
|
+
step_type=StepType.LOOP,
|
|
212
|
+
content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
|
|
213
|
+
success=all(result.success for result in flattened_results) if flattened_results else True,
|
|
214
|
+
steps=flattened_results,
|
|
215
|
+
)
|
|
198
216
|
|
|
199
217
|
def execute_stream(
|
|
200
218
|
self,
|
|
@@ -202,15 +220,20 @@ class Loop:
|
|
|
202
220
|
session_id: Optional[str] = None,
|
|
203
221
|
user_id: Optional[str] = None,
|
|
204
222
|
stream_intermediate_steps: bool = False,
|
|
205
|
-
workflow_run_response: Optional[
|
|
223
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
206
224
|
step_index: Optional[Union[int, tuple]] = None,
|
|
207
|
-
|
|
225
|
+
store_executor_outputs: bool = True,
|
|
226
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
227
|
+
parent_step_id: Optional[str] = None,
|
|
228
|
+
) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
|
|
208
229
|
"""Execute loop steps with streaming support - mirrors workflow execution logic"""
|
|
209
230
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
210
231
|
|
|
211
232
|
# Prepare steps first
|
|
212
233
|
self._prepare_steps()
|
|
213
234
|
|
|
235
|
+
loop_step_id = str(uuid4())
|
|
236
|
+
|
|
214
237
|
if stream_intermediate_steps and workflow_run_response:
|
|
215
238
|
# Yield loop started event
|
|
216
239
|
yield LoopExecutionStartedEvent(
|
|
@@ -221,6 +244,8 @@ class Loop:
|
|
|
221
244
|
step_name=self.name,
|
|
222
245
|
step_index=step_index,
|
|
223
246
|
max_iterations=self.max_iterations,
|
|
247
|
+
step_id=loop_step_id,
|
|
248
|
+
parent_step_id=parent_step_id,
|
|
224
249
|
)
|
|
225
250
|
|
|
226
251
|
all_results = []
|
|
@@ -241,6 +266,8 @@ class Loop:
|
|
|
241
266
|
step_index=step_index,
|
|
242
267
|
iteration=iteration + 1,
|
|
243
268
|
max_iterations=self.max_iterations,
|
|
269
|
+
step_id=loop_step_id,
|
|
270
|
+
parent_step_id=parent_step_id,
|
|
244
271
|
)
|
|
245
272
|
|
|
246
273
|
# Execute all steps in this iteration - mirroring workflow logic
|
|
@@ -267,6 +294,9 @@ class Loop:
|
|
|
267
294
|
stream_intermediate_steps=stream_intermediate_steps,
|
|
268
295
|
workflow_run_response=workflow_run_response,
|
|
269
296
|
step_index=composite_step_index,
|
|
297
|
+
store_executor_outputs=store_executor_outputs,
|
|
298
|
+
session_state=session_state,
|
|
299
|
+
parent_step_id=loop_step_id,
|
|
270
300
|
):
|
|
271
301
|
if isinstance(event, StepOutput):
|
|
272
302
|
step_outputs_for_iteration.append(event)
|
|
@@ -331,6 +361,8 @@ class Loop:
|
|
|
331
361
|
max_iterations=self.max_iterations,
|
|
332
362
|
iteration_results=iteration_results,
|
|
333
363
|
should_continue=should_continue,
|
|
364
|
+
step_id=loop_step_id,
|
|
365
|
+
parent_step_id=parent_step_id,
|
|
334
366
|
)
|
|
335
367
|
|
|
336
368
|
iteration += 1
|
|
@@ -353,22 +385,38 @@ class Loop:
|
|
|
353
385
|
total_iterations=iteration,
|
|
354
386
|
max_iterations=self.max_iterations,
|
|
355
387
|
all_results=all_results,
|
|
388
|
+
step_id=loop_step_id,
|
|
389
|
+
parent_step_id=parent_step_id,
|
|
356
390
|
)
|
|
357
391
|
|
|
392
|
+
flattened_results = []
|
|
358
393
|
for iteration_results in all_results:
|
|
359
|
-
|
|
360
|
-
|
|
394
|
+
flattened_results.extend(iteration_results)
|
|
395
|
+
|
|
396
|
+
yield StepOutput(
|
|
397
|
+
step_name=self.name,
|
|
398
|
+
step_id=loop_step_id,
|
|
399
|
+
step_type=StepType.LOOP,
|
|
400
|
+
content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
|
|
401
|
+
success=all(result.success for result in flattened_results) if flattened_results else True,
|
|
402
|
+
steps=flattened_results,
|
|
403
|
+
)
|
|
361
404
|
|
|
362
405
|
async def aexecute(
|
|
363
406
|
self,
|
|
364
407
|
step_input: StepInput,
|
|
365
408
|
session_id: Optional[str] = None,
|
|
366
409
|
user_id: Optional[str] = None,
|
|
367
|
-
|
|
410
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
411
|
+
store_executor_outputs: bool = True,
|
|
412
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
413
|
+
) -> StepOutput:
|
|
368
414
|
"""Execute loop steps asynchronously with iteration control - mirrors workflow execution logic"""
|
|
369
415
|
# Use workflow logger for async loop orchestration
|
|
370
416
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
371
417
|
|
|
418
|
+
loop_step_id = str(uuid4())
|
|
419
|
+
|
|
372
420
|
# Prepare steps first
|
|
373
421
|
self._prepare_steps()
|
|
374
422
|
|
|
@@ -382,7 +430,14 @@ class Loop:
|
|
|
382
430
|
loop_step_outputs = {} # Track outputs within this loop iteration
|
|
383
431
|
|
|
384
432
|
for i, step in enumerate(self.steps):
|
|
385
|
-
step_output = await step.aexecute(
|
|
433
|
+
step_output = await step.aexecute( # type: ignore[union-attr]
|
|
434
|
+
current_step_input,
|
|
435
|
+
session_id=session_id,
|
|
436
|
+
user_id=user_id,
|
|
437
|
+
workflow_run_response=workflow_run_response,
|
|
438
|
+
store_executor_outputs=store_executor_outputs,
|
|
439
|
+
session_state=session_state,
|
|
440
|
+
)
|
|
386
441
|
|
|
387
442
|
# Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
|
|
388
443
|
if isinstance(step_output, list):
|
|
@@ -433,7 +488,14 @@ class Loop:
|
|
|
433
488
|
for iteration_results in all_results:
|
|
434
489
|
flattened_results.extend(iteration_results)
|
|
435
490
|
|
|
436
|
-
return
|
|
491
|
+
return StepOutput(
|
|
492
|
+
step_name=self.name,
|
|
493
|
+
step_id=loop_step_id,
|
|
494
|
+
step_type=StepType.LOOP,
|
|
495
|
+
content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
|
|
496
|
+
success=all(result.success for result in flattened_results) if flattened_results else True,
|
|
497
|
+
steps=flattened_results,
|
|
498
|
+
)
|
|
437
499
|
|
|
438
500
|
async def aexecute_stream(
|
|
439
501
|
self,
|
|
@@ -441,12 +503,17 @@ class Loop:
|
|
|
441
503
|
session_id: Optional[str] = None,
|
|
442
504
|
user_id: Optional[str] = None,
|
|
443
505
|
stream_intermediate_steps: bool = False,
|
|
444
|
-
workflow_run_response: Optional[
|
|
506
|
+
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
445
507
|
step_index: Optional[Union[int, tuple]] = None,
|
|
446
|
-
|
|
508
|
+
store_executor_outputs: bool = True,
|
|
509
|
+
session_state: Optional[Dict[str, Any]] = None,
|
|
510
|
+
parent_step_id: Optional[str] = None,
|
|
511
|
+
) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
|
|
447
512
|
"""Execute loop steps with async streaming support - mirrors workflow execution logic"""
|
|
448
513
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
449
514
|
|
|
515
|
+
loop_step_id = str(uuid4())
|
|
516
|
+
|
|
450
517
|
# Prepare steps first
|
|
451
518
|
self._prepare_steps()
|
|
452
519
|
|
|
@@ -460,6 +527,8 @@ class Loop:
|
|
|
460
527
|
step_name=self.name,
|
|
461
528
|
step_index=step_index,
|
|
462
529
|
max_iterations=self.max_iterations,
|
|
530
|
+
step_id=loop_step_id,
|
|
531
|
+
parent_step_id=parent_step_id,
|
|
463
532
|
)
|
|
464
533
|
|
|
465
534
|
all_results = []
|
|
@@ -480,6 +549,8 @@ class Loop:
|
|
|
480
549
|
step_index=step_index,
|
|
481
550
|
iteration=iteration + 1,
|
|
482
551
|
max_iterations=self.max_iterations,
|
|
552
|
+
step_id=loop_step_id,
|
|
553
|
+
parent_step_id=parent_step_id,
|
|
483
554
|
)
|
|
484
555
|
|
|
485
556
|
# Execute all steps in this iteration - mirroring workflow logic
|
|
@@ -506,6 +577,9 @@ class Loop:
|
|
|
506
577
|
stream_intermediate_steps=stream_intermediate_steps,
|
|
507
578
|
workflow_run_response=workflow_run_response,
|
|
508
579
|
step_index=composite_step_index,
|
|
580
|
+
store_executor_outputs=store_executor_outputs,
|
|
581
|
+
session_state=session_state,
|
|
582
|
+
parent_step_id=loop_step_id,
|
|
509
583
|
):
|
|
510
584
|
if isinstance(event, StepOutput):
|
|
511
585
|
step_outputs_for_iteration.append(event)
|
|
@@ -573,6 +647,8 @@ class Loop:
|
|
|
573
647
|
max_iterations=self.max_iterations,
|
|
574
648
|
iteration_results=iteration_results,
|
|
575
649
|
should_continue=should_continue,
|
|
650
|
+
step_id=loop_step_id,
|
|
651
|
+
parent_step_id=parent_step_id,
|
|
576
652
|
)
|
|
577
653
|
|
|
578
654
|
iteration += 1
|
|
@@ -595,8 +671,19 @@ class Loop:
|
|
|
595
671
|
total_iterations=iteration,
|
|
596
672
|
max_iterations=self.max_iterations,
|
|
597
673
|
all_results=all_results,
|
|
674
|
+
step_id=loop_step_id,
|
|
675
|
+
parent_step_id=parent_step_id,
|
|
598
676
|
)
|
|
599
677
|
|
|
678
|
+
flattened_results = []
|
|
600
679
|
for iteration_results in all_results:
|
|
601
|
-
|
|
602
|
-
|
|
680
|
+
flattened_results.extend(iteration_results)
|
|
681
|
+
|
|
682
|
+
yield StepOutput(
|
|
683
|
+
step_name=self.name,
|
|
684
|
+
step_id=loop_step_id,
|
|
685
|
+
step_type=StepType.LOOP,
|
|
686
|
+
content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
|
|
687
|
+
success=all(result.success for result in flattened_results) if flattened_results else True,
|
|
688
|
+
steps=flattened_results,
|
|
689
|
+
)
|