agno 1.8.0__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 +2781 -4126
- 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/media.py +2 -2
- 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/dashscope/dashscope.py +14 -5
- agno/models/google/gemini.py +123 -53
- 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 +135 -27
- agno/models/openai/responses.py +233 -115
- 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 +2967 -4243
- 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 +71 -18
- 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 +62 -62
- 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 +46 -62
- 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 +134 -0
- 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/location.py +2 -2
- 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 +356 -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 -698
- 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.0.dist-info/METADATA +0 -979
- agno-1.8.0.dist-info/RECORD +0 -565
- agno-1.8.0.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.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
- {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/run/v2/workflow.py
DELETED
|
@@ -1,567 +0,0 @@
|
|
|
1
|
-
from dataclasses import asdict, dataclass, field
|
|
2
|
-
from enum import Enum
|
|
3
|
-
from time import time
|
|
4
|
-
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
|
|
5
|
-
|
|
6
|
-
from pydantic import BaseModel
|
|
7
|
-
|
|
8
|
-
from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
|
|
9
|
-
from agno.run.base import RunStatus
|
|
10
|
-
from agno.utils.log import log_error
|
|
11
|
-
|
|
12
|
-
if TYPE_CHECKING:
|
|
13
|
-
from agno.workflow.v2.types import StepOutput, WorkflowMetrics
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class WorkflowRunEvent(str, Enum):
|
|
17
|
-
"""Events that can be sent by workflow execution"""
|
|
18
|
-
|
|
19
|
-
workflow_started = "WorkflowStarted"
|
|
20
|
-
workflow_completed = "WorkflowCompleted"
|
|
21
|
-
workflow_cancelled = "WorkflowCancelled"
|
|
22
|
-
workflow_error = "WorkflowError"
|
|
23
|
-
|
|
24
|
-
step_started = "StepStarted"
|
|
25
|
-
step_completed = "StepCompleted"
|
|
26
|
-
step_error = "StepError"
|
|
27
|
-
|
|
28
|
-
loop_execution_started = "LoopExecutionStarted"
|
|
29
|
-
loop_iteration_started = "LoopIterationStarted"
|
|
30
|
-
loop_iteration_completed = "LoopIterationCompleted"
|
|
31
|
-
loop_execution_completed = "LoopExecutionCompleted"
|
|
32
|
-
|
|
33
|
-
parallel_execution_started = "ParallelExecutionStarted"
|
|
34
|
-
parallel_execution_completed = "ParallelExecutionCompleted"
|
|
35
|
-
|
|
36
|
-
condition_execution_started = "ConditionExecutionStarted"
|
|
37
|
-
condition_execution_completed = "ConditionExecutionCompleted"
|
|
38
|
-
|
|
39
|
-
router_execution_started = "RouterExecutionStarted"
|
|
40
|
-
router_execution_completed = "RouterExecutionCompleted"
|
|
41
|
-
|
|
42
|
-
steps_execution_started = "StepsExecutionStarted"
|
|
43
|
-
steps_execution_completed = "StepsExecutionCompleted"
|
|
44
|
-
|
|
45
|
-
step_output = "StepOutput"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@dataclass
|
|
49
|
-
class BaseWorkflowRunResponseEvent:
|
|
50
|
-
"""Base class for all workflow run response events"""
|
|
51
|
-
|
|
52
|
-
created_at: int = field(default_factory=lambda: int(time()))
|
|
53
|
-
event: str = ""
|
|
54
|
-
|
|
55
|
-
# Workflow-specific fields
|
|
56
|
-
workflow_id: Optional[str] = None
|
|
57
|
-
workflow_name: Optional[str] = None
|
|
58
|
-
session_id: Optional[str] = None
|
|
59
|
-
run_id: Optional[str] = None
|
|
60
|
-
|
|
61
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
62
|
-
_dict = {k: v for k, v in asdict(self).items() if v is not None}
|
|
63
|
-
|
|
64
|
-
if hasattr(self, "content") and self.content and isinstance(self.content, BaseModel):
|
|
65
|
-
_dict["content"] = self.content.model_dump(exclude_none=True)
|
|
66
|
-
|
|
67
|
-
# Handle StepOutput fields that contain Message objects
|
|
68
|
-
if hasattr(self, "step_responses") and self.step_responses is not None:
|
|
69
|
-
_dict["step_responses"] = [step.to_dict() for step in self.step_responses]
|
|
70
|
-
|
|
71
|
-
if hasattr(self, "step_response") and self.step_response is not None:
|
|
72
|
-
_dict["step_response"] = self.step_response.to_dict()
|
|
73
|
-
|
|
74
|
-
if hasattr(self, "iteration_results") and self.iteration_results is not None:
|
|
75
|
-
_dict["iteration_results"] = [step.to_dict() for step in self.iteration_results]
|
|
76
|
-
|
|
77
|
-
if hasattr(self, "all_results") and self.all_results is not None:
|
|
78
|
-
_dict["all_results"] = [[step.to_dict() for step in iteration] for iteration in self.all_results]
|
|
79
|
-
|
|
80
|
-
if hasattr(self, "step_results") and self.step_results is not None:
|
|
81
|
-
_dict["step_results"] = [step.to_dict() for step in self.step_results]
|
|
82
|
-
|
|
83
|
-
return _dict
|
|
84
|
-
|
|
85
|
-
def to_json(self) -> str:
|
|
86
|
-
import json
|
|
87
|
-
|
|
88
|
-
try:
|
|
89
|
-
_dict = self.to_dict()
|
|
90
|
-
except Exception:
|
|
91
|
-
log_error("Failed to convert response to json", exc_info=True)
|
|
92
|
-
raise
|
|
93
|
-
|
|
94
|
-
return json.dumps(_dict, indent=2)
|
|
95
|
-
|
|
96
|
-
@property
|
|
97
|
-
def is_cancelled(self):
|
|
98
|
-
return False
|
|
99
|
-
|
|
100
|
-
@property
|
|
101
|
-
def is_error(self):
|
|
102
|
-
return False
|
|
103
|
-
|
|
104
|
-
@property
|
|
105
|
-
def status(self):
|
|
106
|
-
status = "Completed"
|
|
107
|
-
if self.is_error:
|
|
108
|
-
status = "Error"
|
|
109
|
-
if self.is_cancelled:
|
|
110
|
-
status = "Cancelled"
|
|
111
|
-
|
|
112
|
-
return status
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
@dataclass
|
|
116
|
-
class WorkflowStartedEvent(BaseWorkflowRunResponseEvent):
|
|
117
|
-
"""Event sent when workflow execution starts"""
|
|
118
|
-
|
|
119
|
-
event: str = WorkflowRunEvent.workflow_started.value
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
@dataclass
|
|
123
|
-
class WorkflowCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
124
|
-
"""Event sent when workflow execution completes"""
|
|
125
|
-
|
|
126
|
-
event: str = WorkflowRunEvent.workflow_completed.value
|
|
127
|
-
content: Optional[Any] = None
|
|
128
|
-
content_type: str = "str"
|
|
129
|
-
|
|
130
|
-
# Store actual step execution results as StepOutput objects
|
|
131
|
-
step_responses: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
132
|
-
extra_data: Optional[Dict[str, Any]] = None
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
@dataclass
|
|
136
|
-
class WorkflowErrorEvent(BaseWorkflowRunResponseEvent):
|
|
137
|
-
"""Event sent when workflow execution fails"""
|
|
138
|
-
|
|
139
|
-
event: str = WorkflowRunEvent.workflow_error.value
|
|
140
|
-
error: Optional[str] = None
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
@dataclass
|
|
144
|
-
class WorkflowCancelledEvent(BaseWorkflowRunResponseEvent):
|
|
145
|
-
"""Event sent when workflow execution is cancelled"""
|
|
146
|
-
|
|
147
|
-
event: str = WorkflowRunEvent.workflow_cancelled.value
|
|
148
|
-
reason: Optional[str] = None
|
|
149
|
-
|
|
150
|
-
@property
|
|
151
|
-
def is_cancelled(self):
|
|
152
|
-
return True
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
@dataclass
|
|
156
|
-
class StepStartedEvent(BaseWorkflowRunResponseEvent):
|
|
157
|
-
"""Event sent when step execution starts"""
|
|
158
|
-
|
|
159
|
-
event: str = WorkflowRunEvent.step_started.value
|
|
160
|
-
step_name: Optional[str] = None
|
|
161
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
@dataclass
|
|
165
|
-
class StepCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
166
|
-
"""Event sent when step execution completes"""
|
|
167
|
-
|
|
168
|
-
event: str = WorkflowRunEvent.step_completed.value
|
|
169
|
-
step_name: Optional[str] = None
|
|
170
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
171
|
-
|
|
172
|
-
content: Optional[Any] = None
|
|
173
|
-
content_type: str = "str"
|
|
174
|
-
|
|
175
|
-
# Media content fields
|
|
176
|
-
images: Optional[List[ImageArtifact]] = None
|
|
177
|
-
videos: Optional[List[VideoArtifact]] = None
|
|
178
|
-
audio: Optional[List[AudioArtifact]] = None
|
|
179
|
-
response_audio: Optional[AudioResponse] = None
|
|
180
|
-
|
|
181
|
-
# Store actual step execution results as StepOutput objects
|
|
182
|
-
step_response: Optional["StepOutput"] = None # noqa: F821
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
@dataclass
|
|
186
|
-
class StepErrorEvent(BaseWorkflowRunResponseEvent):
|
|
187
|
-
"""Event sent when step execution fails"""
|
|
188
|
-
|
|
189
|
-
event: str = WorkflowRunEvent.step_error.value
|
|
190
|
-
step_name: Optional[str] = None
|
|
191
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
192
|
-
error: Optional[str] = None
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
@dataclass
|
|
196
|
-
class LoopExecutionStartedEvent(BaseWorkflowRunResponseEvent):
|
|
197
|
-
"""Event sent when loop execution starts"""
|
|
198
|
-
|
|
199
|
-
event: str = WorkflowRunEvent.loop_execution_started.value
|
|
200
|
-
step_name: Optional[str] = None
|
|
201
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
202
|
-
max_iterations: Optional[int] = None
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
@dataclass
|
|
206
|
-
class LoopIterationStartedEvent(BaseWorkflowRunResponseEvent):
|
|
207
|
-
"""Event sent when loop iteration starts"""
|
|
208
|
-
|
|
209
|
-
event: str = WorkflowRunEvent.loop_iteration_started.value
|
|
210
|
-
step_name: Optional[str] = None
|
|
211
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
212
|
-
iteration: int = 0
|
|
213
|
-
max_iterations: Optional[int] = None
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
@dataclass
|
|
217
|
-
class LoopIterationCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
218
|
-
"""Event sent when loop iteration completes"""
|
|
219
|
-
|
|
220
|
-
event: str = WorkflowRunEvent.loop_iteration_completed.value
|
|
221
|
-
step_name: Optional[str] = None
|
|
222
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
223
|
-
iteration: int = 0
|
|
224
|
-
max_iterations: Optional[int] = None
|
|
225
|
-
iteration_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
226
|
-
should_continue: bool = True
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
@dataclass
|
|
230
|
-
class LoopExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
231
|
-
"""Event sent when loop execution completes"""
|
|
232
|
-
|
|
233
|
-
event: str = WorkflowRunEvent.loop_execution_completed.value
|
|
234
|
-
step_name: Optional[str] = None
|
|
235
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
236
|
-
total_iterations: int = 0
|
|
237
|
-
max_iterations: Optional[int] = None
|
|
238
|
-
all_results: List[List["StepOutput"]] = field(default_factory=list) # noqa: F821
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
@dataclass
|
|
242
|
-
class ParallelExecutionStartedEvent(BaseWorkflowRunResponseEvent):
|
|
243
|
-
"""Event sent when parallel step execution starts"""
|
|
244
|
-
|
|
245
|
-
event: str = WorkflowRunEvent.parallel_execution_started.value
|
|
246
|
-
step_name: Optional[str] = None
|
|
247
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
248
|
-
parallel_step_count: Optional[int] = None
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
@dataclass
|
|
252
|
-
class ParallelExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
253
|
-
"""Event sent when parallel step execution completes"""
|
|
254
|
-
|
|
255
|
-
event: str = WorkflowRunEvent.parallel_execution_completed.value
|
|
256
|
-
step_name: Optional[str] = None
|
|
257
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
258
|
-
parallel_step_count: Optional[int] = None
|
|
259
|
-
|
|
260
|
-
# Results from all parallel steps
|
|
261
|
-
step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
@dataclass
|
|
265
|
-
class ConditionExecutionStartedEvent(BaseWorkflowRunResponseEvent):
|
|
266
|
-
"""Event sent when condition step execution starts"""
|
|
267
|
-
|
|
268
|
-
event: str = WorkflowRunEvent.condition_execution_started.value
|
|
269
|
-
step_name: Optional[str] = None
|
|
270
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
271
|
-
condition_result: Optional[bool] = None
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
@dataclass
|
|
275
|
-
class ConditionExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
276
|
-
"""Event sent when condition step execution completes"""
|
|
277
|
-
|
|
278
|
-
event: str = WorkflowRunEvent.condition_execution_completed.value
|
|
279
|
-
step_name: Optional[str] = None
|
|
280
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
281
|
-
condition_result: Optional[bool] = None
|
|
282
|
-
executed_steps: Optional[int] = None
|
|
283
|
-
|
|
284
|
-
# Results from executed steps
|
|
285
|
-
step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
@dataclass
|
|
289
|
-
class RouterExecutionStartedEvent(BaseWorkflowRunResponseEvent):
|
|
290
|
-
"""Event sent when router step execution starts"""
|
|
291
|
-
|
|
292
|
-
event: str = WorkflowRunEvent.router_execution_started.value
|
|
293
|
-
step_name: Optional[str] = None
|
|
294
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
295
|
-
# Names of steps selected by router
|
|
296
|
-
selected_steps: List[str] = field(default_factory=list)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
@dataclass
|
|
300
|
-
class RouterExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
301
|
-
"""Event sent when router step execution completes"""
|
|
302
|
-
|
|
303
|
-
event: str = WorkflowRunEvent.router_execution_completed.value
|
|
304
|
-
step_name: Optional[str] = None
|
|
305
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
306
|
-
# Names of steps that were selected
|
|
307
|
-
selected_steps: List[str] = field(default_factory=list)
|
|
308
|
-
executed_steps: Optional[int] = None
|
|
309
|
-
|
|
310
|
-
# Results from executed steps
|
|
311
|
-
step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
@dataclass
|
|
315
|
-
class StepsExecutionStartedEvent(BaseWorkflowRunResponseEvent):
|
|
316
|
-
"""Event sent when steps execution starts"""
|
|
317
|
-
|
|
318
|
-
event: str = WorkflowRunEvent.steps_execution_started.value
|
|
319
|
-
step_name: Optional[str] = None
|
|
320
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
321
|
-
steps_count: Optional[int] = None
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
@dataclass
|
|
325
|
-
class StepsExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
|
|
326
|
-
"""Event sent when steps execution completes"""
|
|
327
|
-
|
|
328
|
-
event: str = WorkflowRunEvent.steps_execution_completed.value
|
|
329
|
-
step_name: Optional[str] = None
|
|
330
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
331
|
-
steps_count: Optional[int] = None
|
|
332
|
-
executed_steps: Optional[int] = None
|
|
333
|
-
|
|
334
|
-
# Results from executed steps
|
|
335
|
-
step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
@dataclass
|
|
339
|
-
class StepOutputEvent(BaseWorkflowRunResponseEvent):
|
|
340
|
-
"""Event sent when a step produces output - replaces direct StepOutput yielding"""
|
|
341
|
-
|
|
342
|
-
event: str = "StepOutput"
|
|
343
|
-
step_name: Optional[str] = None
|
|
344
|
-
step_index: Optional[Union[int, tuple]] = None
|
|
345
|
-
|
|
346
|
-
# Store actual step execution result as StepOutput object
|
|
347
|
-
step_output: Optional["StepOutput"] = None # noqa: F821
|
|
348
|
-
|
|
349
|
-
# Properties for backward compatibility
|
|
350
|
-
@property
|
|
351
|
-
def content(self) -> Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]]:
|
|
352
|
-
return self.step_output.content if self.step_output else None
|
|
353
|
-
|
|
354
|
-
@property
|
|
355
|
-
def images(self) -> Optional[List[ImageArtifact]]:
|
|
356
|
-
return self.step_output.images if self.step_output else None
|
|
357
|
-
|
|
358
|
-
@property
|
|
359
|
-
def videos(self) -> Optional[List[VideoArtifact]]:
|
|
360
|
-
return self.step_output.videos if self.step_output else None
|
|
361
|
-
|
|
362
|
-
@property
|
|
363
|
-
def audio(self) -> Optional[List[AudioArtifact]]:
|
|
364
|
-
return self.step_output.audio if self.step_output else None
|
|
365
|
-
|
|
366
|
-
@property
|
|
367
|
-
def success(self) -> bool:
|
|
368
|
-
return self.step_output.success if self.step_output else True
|
|
369
|
-
|
|
370
|
-
@property
|
|
371
|
-
def error(self) -> Optional[str]:
|
|
372
|
-
return self.step_output.error if self.step_output else None
|
|
373
|
-
|
|
374
|
-
@property
|
|
375
|
-
def stop(self) -> bool:
|
|
376
|
-
return self.step_output.stop if self.step_output else False
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
# Union type for all workflow run response events
|
|
380
|
-
WorkflowRunResponseEvent = Union[
|
|
381
|
-
WorkflowStartedEvent,
|
|
382
|
-
WorkflowCompletedEvent,
|
|
383
|
-
WorkflowErrorEvent,
|
|
384
|
-
StepStartedEvent,
|
|
385
|
-
StepCompletedEvent,
|
|
386
|
-
StepErrorEvent,
|
|
387
|
-
LoopExecutionStartedEvent,
|
|
388
|
-
LoopIterationStartedEvent,
|
|
389
|
-
LoopIterationCompletedEvent,
|
|
390
|
-
LoopExecutionCompletedEvent,
|
|
391
|
-
ParallelExecutionStartedEvent,
|
|
392
|
-
ParallelExecutionCompletedEvent,
|
|
393
|
-
ConditionExecutionStartedEvent,
|
|
394
|
-
ConditionExecutionCompletedEvent,
|
|
395
|
-
RouterExecutionStartedEvent,
|
|
396
|
-
RouterExecutionCompletedEvent,
|
|
397
|
-
StepsExecutionStartedEvent,
|
|
398
|
-
StepsExecutionCompletedEvent,
|
|
399
|
-
StepOutputEvent,
|
|
400
|
-
]
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
@dataclass
|
|
404
|
-
class WorkflowRunResponse:
|
|
405
|
-
"""Response returned by Workflow.run() functions - kept for backwards compatibility"""
|
|
406
|
-
|
|
407
|
-
content: Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]] = None
|
|
408
|
-
content_type: str = "str"
|
|
409
|
-
metrics: Optional[Dict[str, Any]] = None
|
|
410
|
-
|
|
411
|
-
# Workflow-specific fields
|
|
412
|
-
workflow_id: Optional[str] = None
|
|
413
|
-
workflow_name: Optional[str] = None
|
|
414
|
-
|
|
415
|
-
run_id: Optional[str] = None
|
|
416
|
-
session_id: Optional[str] = None
|
|
417
|
-
|
|
418
|
-
# Media content fields
|
|
419
|
-
images: Optional[List[ImageArtifact]] = None
|
|
420
|
-
videos: Optional[List[VideoArtifact]] = None
|
|
421
|
-
audio: Optional[List[AudioArtifact]] = None
|
|
422
|
-
response_audio: Optional[AudioResponse] = None
|
|
423
|
-
|
|
424
|
-
# Store actual step execution results as StepOutput objects
|
|
425
|
-
step_responses: List[Union["StepOutput", List["StepOutput"]]] = field(default_factory=list) # noqa: F821
|
|
426
|
-
|
|
427
|
-
# Store events from workflow execution
|
|
428
|
-
events: Optional[List[WorkflowRunResponseEvent]] = None
|
|
429
|
-
|
|
430
|
-
# Workflow metrics aggregated from all steps
|
|
431
|
-
workflow_metrics: Optional["WorkflowMetrics"] = None
|
|
432
|
-
|
|
433
|
-
extra_data: Optional[Dict[str, Any]] = None
|
|
434
|
-
created_at: int = field(default_factory=lambda: int(time()))
|
|
435
|
-
|
|
436
|
-
status: RunStatus = RunStatus.pending
|
|
437
|
-
|
|
438
|
-
@property
|
|
439
|
-
def is_cancelled(self):
|
|
440
|
-
return self.status == RunStatus.cancelled
|
|
441
|
-
|
|
442
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
443
|
-
_dict = {
|
|
444
|
-
k: v
|
|
445
|
-
for k, v in asdict(self).items()
|
|
446
|
-
if v is not None
|
|
447
|
-
and k
|
|
448
|
-
not in [
|
|
449
|
-
"extra_data",
|
|
450
|
-
"images",
|
|
451
|
-
"videos",
|
|
452
|
-
"audio",
|
|
453
|
-
"response_audio",
|
|
454
|
-
"step_responses",
|
|
455
|
-
"events",
|
|
456
|
-
"workflow_metrics",
|
|
457
|
-
]
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
if self.status is not None:
|
|
461
|
-
_dict["status"] = self.status.value if isinstance(self.status, RunStatus) else self.status
|
|
462
|
-
|
|
463
|
-
if self.extra_data is not None:
|
|
464
|
-
_dict["extra_data"] = self.extra_data
|
|
465
|
-
|
|
466
|
-
if self.images is not None:
|
|
467
|
-
_dict["images"] = [img.to_dict() for img in self.images]
|
|
468
|
-
|
|
469
|
-
if self.videos is not None:
|
|
470
|
-
_dict["videos"] = [vid.to_dict() for vid in self.videos]
|
|
471
|
-
|
|
472
|
-
if self.audio is not None:
|
|
473
|
-
_dict["audio"] = [aud.to_dict() for aud in self.audio]
|
|
474
|
-
|
|
475
|
-
if self.response_audio is not None:
|
|
476
|
-
_dict["response_audio"] = self.response_audio.to_dict()
|
|
477
|
-
|
|
478
|
-
if self.step_responses:
|
|
479
|
-
flattened_responses = []
|
|
480
|
-
for step_response in self.step_responses:
|
|
481
|
-
if isinstance(step_response, list):
|
|
482
|
-
# Handle List[StepOutput] from workflow components like Steps
|
|
483
|
-
flattened_responses.extend([s.to_dict() for s in step_response])
|
|
484
|
-
else:
|
|
485
|
-
# Handle single StepOutput
|
|
486
|
-
flattened_responses.append(step_response.to_dict())
|
|
487
|
-
_dict["step_responses"] = flattened_responses
|
|
488
|
-
|
|
489
|
-
if self.workflow_metrics is not None:
|
|
490
|
-
_dict["workflow_metrics"] = self.workflow_metrics.to_dict()
|
|
491
|
-
|
|
492
|
-
if self.content and isinstance(self.content, BaseModel):
|
|
493
|
-
_dict["content"] = self.content.model_dump(exclude_none=True)
|
|
494
|
-
|
|
495
|
-
if self.events is not None:
|
|
496
|
-
_dict["events"] = [e.to_dict() for e in self.events]
|
|
497
|
-
|
|
498
|
-
return _dict
|
|
499
|
-
|
|
500
|
-
def to_json(self) -> str:
|
|
501
|
-
import json
|
|
502
|
-
|
|
503
|
-
_dict = self.to_dict()
|
|
504
|
-
return json.dumps(_dict, indent=2)
|
|
505
|
-
|
|
506
|
-
@classmethod
|
|
507
|
-
def from_dict(cls, data: Dict[str, Any]) -> "WorkflowRunResponse":
|
|
508
|
-
# Import here to avoid circular import
|
|
509
|
-
from agno.workflow.v2.step import StepOutput
|
|
510
|
-
|
|
511
|
-
workflow_metrics_dict = data.pop("workflow_metrics", {})
|
|
512
|
-
workflow_metrics = None
|
|
513
|
-
if workflow_metrics_dict:
|
|
514
|
-
from agno.workflow.v2.workflow import WorkflowMetrics
|
|
515
|
-
|
|
516
|
-
workflow_metrics = WorkflowMetrics.from_dict(workflow_metrics_dict)
|
|
517
|
-
|
|
518
|
-
step_responses = data.pop("step_responses", [])
|
|
519
|
-
parsed_step_responses: List[Union["StepOutput", List["StepOutput"]]] = []
|
|
520
|
-
if step_responses:
|
|
521
|
-
for step_output_dict in step_responses:
|
|
522
|
-
# Reconstruct StepOutput from dict
|
|
523
|
-
parsed_step_responses.append(StepOutput.from_dict(step_output_dict))
|
|
524
|
-
|
|
525
|
-
extra_data = data.pop("extra_data", None)
|
|
526
|
-
|
|
527
|
-
images = data.pop("images", [])
|
|
528
|
-
images = [ImageArtifact.model_validate(image) for image in images] if images else None
|
|
529
|
-
|
|
530
|
-
videos = data.pop("videos", [])
|
|
531
|
-
videos = [VideoArtifact.model_validate(video) for video in videos] if videos else None
|
|
532
|
-
|
|
533
|
-
audio = data.pop("audio", [])
|
|
534
|
-
audio = [AudioArtifact.model_validate(audio) for audio in audio] if audio else None
|
|
535
|
-
|
|
536
|
-
response_audio = data.pop("response_audio", None)
|
|
537
|
-
response_audio = AudioResponse.model_validate(response_audio) if response_audio else None
|
|
538
|
-
|
|
539
|
-
events = data.pop("events", [])
|
|
540
|
-
|
|
541
|
-
return cls(
|
|
542
|
-
step_responses=parsed_step_responses,
|
|
543
|
-
extra_data=extra_data,
|
|
544
|
-
images=images,
|
|
545
|
-
videos=videos,
|
|
546
|
-
audio=audio,
|
|
547
|
-
response_audio=response_audio,
|
|
548
|
-
events=events,
|
|
549
|
-
workflow_metrics=workflow_metrics,
|
|
550
|
-
**data,
|
|
551
|
-
)
|
|
552
|
-
|
|
553
|
-
def get_content_as_string(self, **kwargs) -> str:
|
|
554
|
-
import json
|
|
555
|
-
|
|
556
|
-
from pydantic import BaseModel
|
|
557
|
-
|
|
558
|
-
if isinstance(self.content, str):
|
|
559
|
-
return self.content
|
|
560
|
-
elif isinstance(self.content, BaseModel):
|
|
561
|
-
return self.content.model_dump_json(exclude_none=True, **kwargs)
|
|
562
|
-
else:
|
|
563
|
-
return json.dumps(self.content, **kwargs)
|
|
564
|
-
|
|
565
|
-
def has_completed(self) -> bool:
|
|
566
|
-
"""Check if the workflow run is completed (either successfully or with error)"""
|
|
567
|
-
return self.status in [RunStatus.completed, RunStatus.error]
|
agno/storage/__init__.py
DELETED
|
File without changes
|
agno/storage/agent/__init__.py
DELETED
|
File without changes
|
agno/storage/agent/dynamodb.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.dynamodb import DynamoDbStorage as DynamoDbAgentStorage # noqa: F401
|
agno/storage/agent/json.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.json import JsonStorage as JsonAgentStorage # noqa: F401
|
agno/storage/agent/mongodb.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.mongodb import MongoDbStorage as MongoDbAgentStorage # noqa: F401
|
agno/storage/agent/postgres.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.postgres import PostgresStorage as PostgresAgentStorage # noqa: F401
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.singlestore import SingleStoreStorage as SingleStoreAgentStorage # noqa: F401
|
agno/storage/agent/sqlite.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.sqlite import SqliteStorage as SqliteAgentStorage # noqa: F401
|
agno/storage/agent/yaml.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
from agno.storage.yaml import YamlStorage as YamlAgentStorage # noqa: F401
|
agno/storage/base.py
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import List, Literal, Optional
|
|
3
|
-
|
|
4
|
-
from agno.storage.session import Session
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Storage(ABC):
|
|
8
|
-
def __init__(self, mode: Optional[Literal["agent", "team", "workflow", "workflow_v2"]] = "agent"):
|
|
9
|
-
self._mode: Literal["agent", "team", "workflow", "workflow_v2"] = "agent" if mode is None else mode
|
|
10
|
-
|
|
11
|
-
@property
|
|
12
|
-
def mode(self) -> Literal["agent", "team", "workflow", "workflow_v2"]:
|
|
13
|
-
"""Get the mode of the storage."""
|
|
14
|
-
return self._mode
|
|
15
|
-
|
|
16
|
-
@mode.setter
|
|
17
|
-
def mode(self, value: Optional[Literal["agent", "team", "workflow", "workflow_v2"]]) -> None:
|
|
18
|
-
"""Set the mode of the storage."""
|
|
19
|
-
self._mode = "agent" if value is None else value
|
|
20
|
-
|
|
21
|
-
@abstractmethod
|
|
22
|
-
def create(self) -> None:
|
|
23
|
-
raise NotImplementedError
|
|
24
|
-
|
|
25
|
-
@abstractmethod
|
|
26
|
-
def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[Session]:
|
|
27
|
-
raise NotImplementedError
|
|
28
|
-
|
|
29
|
-
@abstractmethod
|
|
30
|
-
def get_all_session_ids(self, user_id: Optional[str] = None, entity_id: Optional[str] = None) -> List[str]:
|
|
31
|
-
raise NotImplementedError
|
|
32
|
-
|
|
33
|
-
@abstractmethod
|
|
34
|
-
def get_all_sessions(self, user_id: Optional[str] = None, entity_id: Optional[str] = None) -> List[Session]:
|
|
35
|
-
raise NotImplementedError
|
|
36
|
-
|
|
37
|
-
@abstractmethod
|
|
38
|
-
def get_recent_sessions(
|
|
39
|
-
self,
|
|
40
|
-
user_id: Optional[str] = None,
|
|
41
|
-
entity_id: Optional[str] = None,
|
|
42
|
-
limit: Optional[int] = 2,
|
|
43
|
-
) -> List[Session]:
|
|
44
|
-
raise NotImplementedError
|
|
45
|
-
|
|
46
|
-
@abstractmethod
|
|
47
|
-
def upsert(self, session: Session) -> Optional[Session]:
|
|
48
|
-
raise NotImplementedError
|
|
49
|
-
|
|
50
|
-
@abstractmethod
|
|
51
|
-
def delete_session(self, session_id: Optional[str] = None):
|
|
52
|
-
raise NotImplementedError
|
|
53
|
-
|
|
54
|
-
@abstractmethod
|
|
55
|
-
def drop(self) -> None:
|
|
56
|
-
raise NotImplementedError
|
|
57
|
-
|
|
58
|
-
@abstractmethod
|
|
59
|
-
def upgrade_schema(self) -> None:
|
|
60
|
-
raise NotImplementedError
|