agno 1.8.1__py3-none-any.whl → 2.0.0__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 +3143 -4170
- agno/api/agent.py +11 -67
- agno/api/api.py +5 -46
- agno/api/evals.py +8 -19
- 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 +11 -66
- 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 +1743 -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 +1432 -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 +882 -0
- agno/db/in_memory/utils.py +172 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1045 -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 +1416 -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 +297 -0
- agno/db/postgres/__init__.py +3 -0
- agno/db/postgres/postgres.py +1710 -0
- agno/db/postgres/schemas.py +124 -0
- agno/db/postgres/utils.py +280 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1367 -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 +1712 -0
- agno/db/singlestore/utils.py +326 -0
- agno/db/sqlite/__init__.py +3 -0
- agno/db/sqlite/schemas.py +119 -0
- agno/db/sqlite/sqlite.py +1676 -0
- agno/db/sqlite/utils.py +268 -0
- agno/db/utils.py +88 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +154 -48
- 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 +15 -11
- 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 +1551 -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 +47 -65
- agno/knowledge/reader/docx_reader.py +83 -0
- agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
- agno/{document → knowledge}/reader/json_reader.py +30 -9
- agno/{document → knowledge}/reader/markdown_reader.py +58 -9
- agno/{document → knowledge}/reader/pdf_reader.py +71 -126
- agno/knowledge/reader/reader_factory.py +268 -0
- agno/knowledge/reader/s3_reader.py +101 -0
- agno/{document → knowledge}/reader/text_reader.py +31 -10
- agno/knowledge/reader/url_reader.py +128 -0
- agno/knowledge/reader/web_search_reader.py +366 -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 +269 -268
- 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 +131 -131
- agno/models/aws/bedrock.py +110 -182
- agno/models/aws/claude.py +64 -18
- agno/models/azure/ai_foundry.py +73 -23
- agno/models/base.py +346 -290
- agno/models/cerebras/cerebras.py +84 -27
- agno/models/cohere/chat.py +106 -98
- agno/models/google/gemini.py +105 -46
- 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 +46 -151
- 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 +85 -47
- agno/models/openai/chat.py +154 -37
- 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 +15 -9
- 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 +497 -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 +77 -33
- 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 +32 -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 +29 -0
- agno/os/mcp.py +235 -0
- agno/os/router.py +1400 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +393 -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 +850 -0
- agno/os/routers/knowledge/schemas.py +118 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +410 -0
- agno/os/routers/memory/schemas.py +58 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +178 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +536 -0
- agno/os/schema.py +945 -0
- agno/{app/playground → os}/settings.py +7 -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/agent.py +633 -0
- agno/run/base.py +53 -77
- agno/run/cancel.py +81 -0
- agno/run/team.py +243 -96
- agno/run/workflow.py +550 -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 +3260 -4824
- 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 +43 -23
- agno/tools/browserbase.py +13 -4
- agno/tools/calcom.py +12 -10
- agno/tools/calculator.py +10 -27
- agno/tools/cartesia.py +20 -17
- 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 +22 -12
- agno/tools/daytona.py +13 -16
- agno/tools/decorator.py +6 -3
- agno/tools/desi_vocal.py +17 -8
- 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 +36 -29
- agno/tools/email.py +4 -1
- agno/tools/evm.py +7 -1
- agno/tools/exa.py +19 -14
- agno/tools/fal.py +30 -30
- agno/tools/file.py +9 -8
- agno/tools/financial_datasets.py +25 -44
- agno/tools/firecrawl.py +22 -22
- agno/tools/function.py +127 -18
- agno/tools/giphy.py +23 -11
- 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 +19 -34
- agno/tools/linkup.py +5 -1
- agno/tools/local_file_system.py +8 -5
- agno/tools/lumalab.py +32 -20
- agno/tools/mcp.py +1 -2
- 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 +33 -15
- agno/tools/models/gemini.py +59 -32
- agno/tools/models/groq.py +30 -23
- agno/tools/models/nebius.py +28 -12
- agno/tools/models_labs.py +40 -16
- 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 +58 -32
- agno/tools/openbb.py +12 -11
- agno/tools/opencv.py +63 -47
- 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 +55 -42
- 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 +100 -123
- agno/utils/gemini.py +32 -2
- agno/utils/knowledge.py +29 -0
- agno/utils/log.py +54 -4
- agno/utils/mcp.py +68 -10
- agno/utils/media.py +39 -0
- agno/utils/message.py +12 -1
- agno/utils/models/aws_claude.py +1 -1
- agno/utils/models/claude.py +47 -4
- agno/utils/models/cohere.py +1 -1
- agno/utils/models/mistral.py +8 -7
- agno/utils/models/schema_utils.py +3 -3
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- agno/utils/pprint.py +33 -32
- agno/utils/print_response/agent.py +779 -0
- agno/utils/print_response/team.py +1669 -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/streamlit.py +481 -0
- 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} +207 -49
- agno/workflow/{v2/steps.py → steps.py} +147 -66
- agno/workflow/types.py +482 -0
- agno/workflow/workflow.py +2410 -696
- agno-2.0.0.dist-info/METADATA +494 -0
- agno-2.0.0.dist-info/RECORD +515 -0
- agno-2.0.0.dist-info/licenses/LICENSE +201 -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/response.py +0 -467
- 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-1.8.1.dist-info/licenses/LICENSE +0 -375
- /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.0.dist-info}/WHEEL +0 -0
- {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/run/team.py
CHANGED
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
from dataclasses import asdict, dataclass, field
|
|
2
2
|
from enum import Enum
|
|
3
3
|
from time import time
|
|
4
|
-
from typing import Any, Dict, List, Optional, Union
|
|
4
|
+
from typing import Any, Dict, List, Optional, Sequence, Union
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
|
|
8
|
-
from agno.media import
|
|
8
|
+
from agno.media import Audio, File, Image, Video
|
|
9
9
|
from agno.models.message import Citations, Message
|
|
10
|
+
from agno.models.metrics import Metrics
|
|
10
11
|
from agno.models.response import ToolExecution
|
|
11
|
-
from agno.
|
|
12
|
-
from agno.run.
|
|
12
|
+
from agno.reasoning.step import ReasoningStep
|
|
13
|
+
from agno.run.agent import RunEvent, RunOutput, RunOutputEvent, run_output_event_from_dict
|
|
14
|
+
from agno.run.base import BaseRunOutputEvent, MessageReferences, RunStatus
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
class TeamRunEvent(str, Enum):
|
|
16
18
|
"""Events that can be sent by the run() functions"""
|
|
17
19
|
|
|
18
20
|
run_started = "TeamRunStarted"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
run_content = "TeamRunContent"
|
|
22
|
+
run_intermediate_content = "TeamRunIntermediateContent"
|
|
21
23
|
run_completed = "TeamRunCompleted"
|
|
22
24
|
run_error = "TeamRunError"
|
|
23
25
|
run_cancelled = "TeamRunCancelled"
|
|
@@ -38,32 +40,38 @@ class TeamRunEvent(str, Enum):
|
|
|
38
40
|
output_model_response_started = "TeamOutputModelResponseStarted"
|
|
39
41
|
output_model_response_completed = "TeamOutputModelResponseCompleted"
|
|
40
42
|
|
|
43
|
+
custom_event = "CustomEvent"
|
|
44
|
+
|
|
41
45
|
|
|
42
46
|
@dataclass
|
|
43
|
-
class
|
|
47
|
+
class BaseTeamRunEvent(BaseRunOutputEvent):
|
|
44
48
|
created_at: int = field(default_factory=lambda: int(time()))
|
|
45
49
|
event: str = ""
|
|
46
50
|
team_id: str = ""
|
|
47
51
|
team_name: str = ""
|
|
48
52
|
run_id: Optional[str] = None
|
|
49
53
|
session_id: Optional[str] = None
|
|
50
|
-
|
|
51
|
-
|
|
54
|
+
|
|
55
|
+
workflow_id: Optional[str] = None
|
|
56
|
+
workflow_run_id: Optional[str] = None # This is the workflow's run_id
|
|
57
|
+
step_id: Optional[str] = None
|
|
58
|
+
step_name: Optional[str] = None
|
|
59
|
+
step_index: Optional[int] = None
|
|
52
60
|
|
|
53
61
|
# For backwards compatibility
|
|
54
62
|
content: Optional[Any] = None
|
|
55
63
|
|
|
56
64
|
@classmethod
|
|
57
|
-
def from_dict(cls, data: Dict[str, Any]) -> "
|
|
65
|
+
def from_dict(cls, data: Dict[str, Any]) -> "BaseTeamRunEvent":
|
|
58
66
|
member_responses = data.pop("member_responses", None)
|
|
59
67
|
event = super().from_dict(data)
|
|
60
68
|
|
|
61
69
|
member_responses_final = []
|
|
62
70
|
for response in member_responses or []:
|
|
63
71
|
if "agent_id" in response:
|
|
64
|
-
run_response_parsed =
|
|
72
|
+
run_response_parsed = RunOutput.from_dict(response)
|
|
65
73
|
else:
|
|
66
|
-
run_response_parsed =
|
|
74
|
+
run_response_parsed = TeamRunOutput.from_dict(response) # type: ignore
|
|
67
75
|
member_responses_final.append(run_response_parsed)
|
|
68
76
|
|
|
69
77
|
if member_responses_final:
|
|
@@ -73,7 +81,7 @@ class BaseTeamRunResponseEvent(BaseRunResponseEvent):
|
|
|
73
81
|
|
|
74
82
|
|
|
75
83
|
@dataclass
|
|
76
|
-
class
|
|
84
|
+
class RunStartedEvent(BaseTeamRunEvent):
|
|
77
85
|
"""Event sent when the run starts"""
|
|
78
86
|
|
|
79
87
|
event: str = TeamRunEvent.run_started.value
|
|
@@ -82,71 +90,82 @@ class RunResponseStartedEvent(BaseTeamRunResponseEvent):
|
|
|
82
90
|
|
|
83
91
|
|
|
84
92
|
@dataclass
|
|
85
|
-
class
|
|
86
|
-
"""Main event for each delta of the
|
|
93
|
+
class RunContentEvent(BaseTeamRunEvent):
|
|
94
|
+
"""Main event for each delta of the RunOutput"""
|
|
87
95
|
|
|
88
|
-
event: str = TeamRunEvent.
|
|
96
|
+
event: str = TeamRunEvent.run_content.value
|
|
89
97
|
content: Optional[Any] = None
|
|
90
98
|
content_type: str = "str"
|
|
91
|
-
|
|
99
|
+
reasoning_content: Optional[str] = None
|
|
92
100
|
citations: Optional[Citations] = None
|
|
93
|
-
response_audio: Optional[
|
|
94
|
-
image: Optional[
|
|
95
|
-
|
|
101
|
+
response_audio: Optional[Audio] = None # Model audio response
|
|
102
|
+
image: Optional[Image] = None # Image attached to the response
|
|
103
|
+
references: Optional[List[MessageReferences]] = None
|
|
104
|
+
additional_input: Optional[List[Message]] = None
|
|
105
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
106
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
96
107
|
|
|
97
108
|
|
|
98
109
|
@dataclass
|
|
99
|
-
class
|
|
100
|
-
event: str = TeamRunEvent.
|
|
110
|
+
class IntermediateRunContentEvent(BaseTeamRunEvent):
|
|
111
|
+
event: str = TeamRunEvent.run_intermediate_content.value
|
|
101
112
|
content: Optional[Any] = None
|
|
102
113
|
content_type: str = "str"
|
|
103
114
|
|
|
104
115
|
|
|
105
116
|
@dataclass
|
|
106
|
-
class
|
|
117
|
+
class RunCompletedEvent(BaseTeamRunEvent):
|
|
107
118
|
event: str = TeamRunEvent.run_completed.value
|
|
108
119
|
content: Optional[Any] = None
|
|
109
120
|
content_type: str = "str"
|
|
110
121
|
reasoning_content: Optional[str] = None
|
|
111
|
-
thinking: Optional[str] = None
|
|
112
122
|
citations: Optional[Citations] = None
|
|
113
|
-
images: Optional[List[
|
|
114
|
-
videos: Optional[List[
|
|
115
|
-
audio: Optional[List[
|
|
116
|
-
response_audio: Optional[
|
|
117
|
-
|
|
118
|
-
|
|
123
|
+
images: Optional[List[Image]] = None # Images attached to the response
|
|
124
|
+
videos: Optional[List[Video]] = None # Videos attached to the response
|
|
125
|
+
audio: Optional[List[Audio]] = None # Audio attached to the response
|
|
126
|
+
response_audio: Optional[Audio] = None # Model audio response
|
|
127
|
+
references: Optional[List[MessageReferences]] = None
|
|
128
|
+
additional_input: Optional[List[Message]] = None
|
|
129
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
130
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
131
|
+
member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
|
|
132
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
133
|
+
metrics: Optional[Metrics] = None
|
|
119
134
|
|
|
120
135
|
|
|
121
136
|
@dataclass
|
|
122
|
-
class
|
|
137
|
+
class RunErrorEvent(BaseTeamRunEvent):
|
|
123
138
|
event: str = TeamRunEvent.run_error.value
|
|
124
139
|
content: Optional[str] = None
|
|
125
140
|
|
|
126
141
|
|
|
127
142
|
@dataclass
|
|
128
|
-
class
|
|
143
|
+
class RunCancelledEvent(BaseTeamRunEvent):
|
|
129
144
|
event: str = TeamRunEvent.run_cancelled.value
|
|
130
145
|
reason: Optional[str] = None
|
|
131
146
|
|
|
147
|
+
@property
|
|
148
|
+
def is_cancelled(self):
|
|
149
|
+
return True
|
|
150
|
+
|
|
132
151
|
|
|
133
152
|
@dataclass
|
|
134
|
-
class MemoryUpdateStartedEvent(
|
|
153
|
+
class MemoryUpdateStartedEvent(BaseTeamRunEvent):
|
|
135
154
|
event: str = TeamRunEvent.memory_update_started.value
|
|
136
155
|
|
|
137
156
|
|
|
138
157
|
@dataclass
|
|
139
|
-
class MemoryUpdateCompletedEvent(
|
|
158
|
+
class MemoryUpdateCompletedEvent(BaseTeamRunEvent):
|
|
140
159
|
event: str = TeamRunEvent.memory_update_completed.value
|
|
141
160
|
|
|
142
161
|
|
|
143
162
|
@dataclass
|
|
144
|
-
class ReasoningStartedEvent(
|
|
163
|
+
class ReasoningStartedEvent(BaseTeamRunEvent):
|
|
145
164
|
event: str = TeamRunEvent.reasoning_started.value
|
|
146
165
|
|
|
147
166
|
|
|
148
167
|
@dataclass
|
|
149
|
-
class ReasoningStepEvent(
|
|
168
|
+
class ReasoningStepEvent(BaseTeamRunEvent):
|
|
150
169
|
event: str = TeamRunEvent.reasoning_step.value
|
|
151
170
|
content: Optional[Any] = None
|
|
152
171
|
content_type: str = "str"
|
|
@@ -154,55 +173,60 @@ class ReasoningStepEvent(BaseTeamRunResponseEvent):
|
|
|
154
173
|
|
|
155
174
|
|
|
156
175
|
@dataclass
|
|
157
|
-
class ReasoningCompletedEvent(
|
|
176
|
+
class ReasoningCompletedEvent(BaseTeamRunEvent):
|
|
158
177
|
event: str = TeamRunEvent.reasoning_completed.value
|
|
159
178
|
content: Optional[Any] = None
|
|
160
179
|
content_type: str = "str"
|
|
161
180
|
|
|
162
181
|
|
|
163
182
|
@dataclass
|
|
164
|
-
class ToolCallStartedEvent(
|
|
183
|
+
class ToolCallStartedEvent(BaseTeamRunEvent):
|
|
165
184
|
event: str = TeamRunEvent.tool_call_started.value
|
|
166
185
|
tool: Optional[ToolExecution] = None
|
|
167
186
|
|
|
168
187
|
|
|
169
188
|
@dataclass
|
|
170
|
-
class ToolCallCompletedEvent(
|
|
189
|
+
class ToolCallCompletedEvent(BaseTeamRunEvent):
|
|
171
190
|
event: str = TeamRunEvent.tool_call_completed.value
|
|
172
191
|
tool: Optional[ToolExecution] = None
|
|
173
192
|
content: Optional[Any] = None
|
|
174
|
-
images: Optional[List[
|
|
175
|
-
videos: Optional[List[
|
|
176
|
-
audio: Optional[List[
|
|
193
|
+
images: Optional[List[Image]] = None # Images produced by the tool call
|
|
194
|
+
videos: Optional[List[Video]] = None # Videos produced by the tool call
|
|
195
|
+
audio: Optional[List[Audio]] = None # Audio produced by the tool call
|
|
177
196
|
|
|
178
197
|
|
|
179
198
|
@dataclass
|
|
180
|
-
class ParserModelResponseStartedEvent(
|
|
199
|
+
class ParserModelResponseStartedEvent(BaseTeamRunEvent):
|
|
181
200
|
event: str = TeamRunEvent.parser_model_response_started.value
|
|
182
201
|
|
|
183
202
|
|
|
184
203
|
@dataclass
|
|
185
|
-
class ParserModelResponseCompletedEvent(
|
|
204
|
+
class ParserModelResponseCompletedEvent(BaseTeamRunEvent):
|
|
186
205
|
event: str = TeamRunEvent.parser_model_response_completed.value
|
|
187
206
|
|
|
188
207
|
|
|
189
208
|
@dataclass
|
|
190
|
-
class OutputModelResponseStartedEvent(
|
|
209
|
+
class OutputModelResponseStartedEvent(BaseTeamRunEvent):
|
|
191
210
|
event: str = TeamRunEvent.output_model_response_started.value
|
|
192
211
|
|
|
193
212
|
|
|
194
213
|
@dataclass
|
|
195
|
-
class OutputModelResponseCompletedEvent(
|
|
214
|
+
class OutputModelResponseCompletedEvent(BaseTeamRunEvent):
|
|
196
215
|
event: str = TeamRunEvent.output_model_response_completed.value
|
|
197
216
|
|
|
198
217
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
218
|
+
@dataclass
|
|
219
|
+
class CustomEvent(BaseTeamRunEvent):
|
|
220
|
+
event: str = TeamRunEvent.custom_event.value
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
TeamRunOutputEvent = Union[
|
|
224
|
+
RunStartedEvent,
|
|
225
|
+
RunContentEvent,
|
|
226
|
+
IntermediateRunContentEvent,
|
|
227
|
+
RunCompletedEvent,
|
|
228
|
+
RunErrorEvent,
|
|
229
|
+
RunCancelledEvent,
|
|
206
230
|
ReasoningStartedEvent,
|
|
207
231
|
ReasoningStepEvent,
|
|
208
232
|
ReasoningCompletedEvent,
|
|
@@ -214,16 +238,17 @@ TeamRunResponseEvent = Union[
|
|
|
214
238
|
ParserModelResponseCompletedEvent,
|
|
215
239
|
OutputModelResponseStartedEvent,
|
|
216
240
|
OutputModelResponseCompletedEvent,
|
|
241
|
+
CustomEvent,
|
|
217
242
|
]
|
|
218
243
|
|
|
219
244
|
# Map event string to dataclass for team events
|
|
220
245
|
TEAM_RUN_EVENT_TYPE_REGISTRY = {
|
|
221
|
-
TeamRunEvent.run_started.value:
|
|
222
|
-
TeamRunEvent.
|
|
223
|
-
TeamRunEvent.
|
|
224
|
-
TeamRunEvent.run_completed.value:
|
|
225
|
-
TeamRunEvent.run_error.value:
|
|
226
|
-
TeamRunEvent.run_cancelled.value:
|
|
246
|
+
TeamRunEvent.run_started.value: RunStartedEvent,
|
|
247
|
+
TeamRunEvent.run_content.value: RunContentEvent,
|
|
248
|
+
TeamRunEvent.run_intermediate_content.value: IntermediateRunContentEvent,
|
|
249
|
+
TeamRunEvent.run_completed.value: RunCompletedEvent,
|
|
250
|
+
TeamRunEvent.run_error.value: RunErrorEvent,
|
|
251
|
+
TeamRunEvent.run_cancelled.value: RunCancelledEvent,
|
|
227
252
|
TeamRunEvent.reasoning_started.value: ReasoningStartedEvent,
|
|
228
253
|
TeamRunEvent.reasoning_step.value: ReasoningStepEvent,
|
|
229
254
|
TeamRunEvent.reasoning_completed.value: ReasoningCompletedEvent,
|
|
@@ -235,13 +260,14 @@ TEAM_RUN_EVENT_TYPE_REGISTRY = {
|
|
|
235
260
|
TeamRunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
|
|
236
261
|
TeamRunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
|
|
237
262
|
TeamRunEvent.output_model_response_completed.value: OutputModelResponseCompletedEvent,
|
|
263
|
+
TeamRunEvent.custom_event.value: CustomEvent,
|
|
238
264
|
}
|
|
239
265
|
|
|
240
266
|
|
|
241
|
-
def
|
|
267
|
+
def team_run_output_event_from_dict(data: dict) -> BaseTeamRunEvent:
|
|
242
268
|
event_type = data.get("event", "")
|
|
243
269
|
if event_type in {e.value for e in RunEvent}:
|
|
244
|
-
return
|
|
270
|
+
return run_output_event_from_dict(data) # type: ignore
|
|
245
271
|
else:
|
|
246
272
|
event_class = TEAM_RUN_EVENT_TYPE_REGISTRY.get(event_type)
|
|
247
273
|
if not event_class:
|
|
@@ -250,46 +276,126 @@ def team_run_response_event_from_dict(data: dict) -> BaseTeamRunResponseEvent:
|
|
|
250
276
|
|
|
251
277
|
|
|
252
278
|
@dataclass
|
|
253
|
-
class
|
|
279
|
+
class TeamRunInput:
|
|
280
|
+
"""Container for the raw input data passed to Agent.run().
|
|
281
|
+
This captures the original input exactly as provided by the user,
|
|
282
|
+
separate from the processed messages that go to the model.
|
|
283
|
+
Attributes:
|
|
284
|
+
input_content: The literal input message/content passed to run()
|
|
285
|
+
images: Images directly passed to run()
|
|
286
|
+
videos: Videos directly passed to run()
|
|
287
|
+
audios: Audio files directly passed to run()
|
|
288
|
+
files: Files directly passed to run()
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
input_content: Optional[Union[str, List, Dict, Message, BaseModel, List[Message]]] = None
|
|
292
|
+
images: Optional[Sequence[Image]] = None
|
|
293
|
+
videos: Optional[Sequence[Video]] = None
|
|
294
|
+
audios: Optional[Sequence[Audio]] = None
|
|
295
|
+
files: Optional[Sequence[File]] = None
|
|
296
|
+
|
|
297
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
298
|
+
"""Convert to dictionary representation"""
|
|
299
|
+
result: Dict[str, Any] = {}
|
|
300
|
+
|
|
301
|
+
if self.input_content is not None:
|
|
302
|
+
if isinstance(self.input_content, (str)):
|
|
303
|
+
result["input_content"] = self.input_content
|
|
304
|
+
elif isinstance(self.input_content, BaseModel):
|
|
305
|
+
result["input_content"] = self.input_content.model_dump(exclude_none=True)
|
|
306
|
+
elif isinstance(self.input_content, Message):
|
|
307
|
+
result["input_content"] = self.input_content.to_dict()
|
|
308
|
+
elif (
|
|
309
|
+
isinstance(self.input_content, list)
|
|
310
|
+
and self.input_content
|
|
311
|
+
and isinstance(self.input_content[0], Message)
|
|
312
|
+
):
|
|
313
|
+
result["input_content"] = [m.to_dict() for m in self.input_content]
|
|
314
|
+
else:
|
|
315
|
+
result["input_content"] = self.input_content
|
|
316
|
+
|
|
317
|
+
if self.images:
|
|
318
|
+
result["images"] = [img.to_dict() for img in self.images]
|
|
319
|
+
if self.videos:
|
|
320
|
+
result["videos"] = [vid.to_dict() for vid in self.videos]
|
|
321
|
+
if self.audios:
|
|
322
|
+
result["audios"] = [aud.to_dict() for aud in self.audios]
|
|
323
|
+
|
|
324
|
+
return result
|
|
325
|
+
|
|
326
|
+
@classmethod
|
|
327
|
+
def from_dict(cls, data: Dict[str, Any]) -> "TeamRunInput":
|
|
328
|
+
"""Create TeamRunInput from dictionary"""
|
|
329
|
+
images = None
|
|
330
|
+
if data.get("images"):
|
|
331
|
+
images = [Image.model_validate(img_data) for img_data in data["images"]]
|
|
332
|
+
|
|
333
|
+
videos = None
|
|
334
|
+
if data.get("videos"):
|
|
335
|
+
videos = [Video.model_validate(vid_data) for vid_data in data["videos"]]
|
|
336
|
+
|
|
337
|
+
audios = None
|
|
338
|
+
if data.get("audios"):
|
|
339
|
+
audios = [Audio.model_validate(aud_data) for aud_data in data["audios"]]
|
|
340
|
+
|
|
341
|
+
files = None
|
|
342
|
+
if data.get("files"):
|
|
343
|
+
files = [File.model_validate(file_data) for file_data in data["files"]]
|
|
344
|
+
|
|
345
|
+
return cls(input_content=data.get("input_content"), images=images, videos=videos, audios=audios, files=files)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
@dataclass
|
|
349
|
+
class TeamRunOutput:
|
|
254
350
|
"""Response returned by Team.run() functions"""
|
|
255
351
|
|
|
256
352
|
content: Optional[Any] = None
|
|
257
353
|
content_type: str = "str"
|
|
258
|
-
thinking: Optional[str] = None
|
|
259
354
|
messages: Optional[List[Message]] = None
|
|
260
|
-
metrics: Optional[
|
|
355
|
+
metrics: Optional[Metrics] = None
|
|
261
356
|
model: Optional[str] = None
|
|
262
357
|
model_provider: Optional[str] = None
|
|
263
358
|
|
|
264
|
-
member_responses: List[Union["
|
|
359
|
+
member_responses: List[Union["TeamRunOutput", RunOutput]] = field(default_factory=list)
|
|
265
360
|
|
|
266
361
|
run_id: Optional[str] = None
|
|
267
362
|
team_id: Optional[str] = None
|
|
268
363
|
team_name: Optional[str] = None
|
|
269
364
|
session_id: Optional[str] = None
|
|
270
|
-
|
|
271
|
-
team_session_id: Optional[str] = None
|
|
365
|
+
parent_run_id: Optional[str] = None
|
|
272
366
|
|
|
273
367
|
tools: Optional[List[ToolExecution]] = None
|
|
274
|
-
formatted_tool_calls: Optional[List[str]] = None
|
|
275
368
|
|
|
276
|
-
images: Optional[List[
|
|
277
|
-
videos: Optional[List[
|
|
278
|
-
audio: Optional[List[
|
|
369
|
+
images: Optional[List[Image]] = None # Images from member runs
|
|
370
|
+
videos: Optional[List[Video]] = None # Videos from member runs
|
|
371
|
+
audio: Optional[List[Audio]] = None # Audio from member runs
|
|
372
|
+
|
|
373
|
+
response_audio: Optional[Audio] = None # Model audio response
|
|
279
374
|
|
|
280
|
-
|
|
375
|
+
# Input media and messages from user
|
|
376
|
+
input: Optional[TeamRunInput] = None
|
|
281
377
|
|
|
282
378
|
reasoning_content: Optional[str] = None
|
|
283
379
|
|
|
284
380
|
citations: Optional[Citations] = None
|
|
285
381
|
|
|
286
|
-
|
|
382
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
383
|
+
|
|
384
|
+
references: Optional[List[MessageReferences]] = None
|
|
385
|
+
additional_input: Optional[List[Message]] = None
|
|
386
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
387
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
287
388
|
created_at: int = field(default_factory=lambda: int(time()))
|
|
288
389
|
|
|
289
|
-
events: Optional[List[Union[
|
|
390
|
+
events: Optional[List[Union[RunOutputEvent, TeamRunOutputEvent]]] = None
|
|
290
391
|
|
|
291
392
|
status: RunStatus = RunStatus.running
|
|
292
393
|
|
|
394
|
+
# === FOREIGN KEY RELATIONSHIPS ===
|
|
395
|
+
# These fields establish relationships to parent workflow/step structures
|
|
396
|
+
# and should be treated as foreign keys for data integrity
|
|
397
|
+
workflow_step_id: Optional[str] = None # FK: Points to StepOutput.step_id
|
|
398
|
+
|
|
293
399
|
@property
|
|
294
400
|
def is_paused(self):
|
|
295
401
|
return self.status == RunStatus.paused
|
|
@@ -308,13 +414,17 @@ class TeamRunResponse:
|
|
|
308
414
|
"messages",
|
|
309
415
|
"status",
|
|
310
416
|
"tools",
|
|
311
|
-
"
|
|
417
|
+
"metadata",
|
|
312
418
|
"images",
|
|
313
419
|
"videos",
|
|
314
420
|
"audio",
|
|
315
421
|
"response_audio",
|
|
316
422
|
"citations",
|
|
317
423
|
"events",
|
|
424
|
+
"additional_input",
|
|
425
|
+
"reasoning_steps",
|
|
426
|
+
"reasoning_messages",
|
|
427
|
+
"references",
|
|
318
428
|
]
|
|
319
429
|
}
|
|
320
430
|
if self.events is not None:
|
|
@@ -326,8 +436,20 @@ class TeamRunResponse:
|
|
|
326
436
|
if self.messages is not None:
|
|
327
437
|
_dict["messages"] = [m.to_dict() for m in self.messages]
|
|
328
438
|
|
|
329
|
-
if self.
|
|
330
|
-
_dict["
|
|
439
|
+
if self.metadata is not None:
|
|
440
|
+
_dict["metadata"] = self.metadata
|
|
441
|
+
|
|
442
|
+
if self.additional_input is not None:
|
|
443
|
+
_dict["additional_input"] = [m.to_dict() for m in self.additional_input]
|
|
444
|
+
|
|
445
|
+
if self.reasoning_messages is not None:
|
|
446
|
+
_dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
|
|
447
|
+
|
|
448
|
+
if self.reasoning_steps is not None:
|
|
449
|
+
_dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
|
|
450
|
+
|
|
451
|
+
if self.references is not None:
|
|
452
|
+
_dict["references"] = [r.model_dump() for r in self.references]
|
|
331
453
|
|
|
332
454
|
if self.images is not None:
|
|
333
455
|
_dict["images"] = [img.to_dict() for img in self.images]
|
|
@@ -361,6 +483,9 @@ class TeamRunResponse:
|
|
|
361
483
|
else:
|
|
362
484
|
_dict["tools"].append(tool)
|
|
363
485
|
|
|
486
|
+
if self.input is not None:
|
|
487
|
+
_dict["input"] = self.input.to_dict()
|
|
488
|
+
|
|
364
489
|
return _dict
|
|
365
490
|
|
|
366
491
|
def to_json(self) -> str:
|
|
@@ -371,17 +496,17 @@ class TeamRunResponse:
|
|
|
371
496
|
return json.dumps(_dict, indent=2)
|
|
372
497
|
|
|
373
498
|
@classmethod
|
|
374
|
-
def from_dict(cls, data: Dict[str, Any]) -> "
|
|
499
|
+
def from_dict(cls, data: Dict[str, Any]) -> "TeamRunOutput":
|
|
375
500
|
events = data.pop("events", None)
|
|
376
501
|
final_events = []
|
|
377
502
|
for event in events or []:
|
|
378
503
|
if "agent_id" in event:
|
|
379
504
|
# Use the factory from response.py for agent events
|
|
380
|
-
from agno.run.
|
|
505
|
+
from agno.run.agent import run_output_event_from_dict
|
|
381
506
|
|
|
382
|
-
event =
|
|
507
|
+
event = run_output_event_from_dict(event)
|
|
383
508
|
else:
|
|
384
|
-
event =
|
|
509
|
+
event = team_run_output_event_from_dict(event)
|
|
385
510
|
final_events.append(event)
|
|
386
511
|
events = final_events
|
|
387
512
|
|
|
@@ -389,48 +514,70 @@ class TeamRunResponse:
|
|
|
389
514
|
messages = [Message.model_validate(message) for message in messages] if messages else None
|
|
390
515
|
|
|
391
516
|
member_responses = data.pop("member_responses", [])
|
|
392
|
-
parsed_member_responses: List[Union["
|
|
517
|
+
parsed_member_responses: List[Union["TeamRunOutput", RunOutput]] = []
|
|
393
518
|
if member_responses:
|
|
394
519
|
for response in member_responses:
|
|
395
520
|
if "agent_id" in response:
|
|
396
|
-
parsed_member_responses.append(
|
|
521
|
+
parsed_member_responses.append(RunOutput.from_dict(response))
|
|
397
522
|
else:
|
|
398
523
|
parsed_member_responses.append(cls.from_dict(response))
|
|
399
524
|
|
|
400
|
-
|
|
401
|
-
if
|
|
402
|
-
|
|
525
|
+
additional_input = data.pop("additional_input", None)
|
|
526
|
+
if additional_input is not None:
|
|
527
|
+
additional_input = [Message.model_validate(message) for message in additional_input]
|
|
528
|
+
|
|
529
|
+
reasoning_steps = data.pop("reasoning_steps", None)
|
|
530
|
+
if reasoning_steps is not None:
|
|
531
|
+
reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
|
|
532
|
+
|
|
533
|
+
reasoning_messages = data.pop("reasoning_messages", None)
|
|
534
|
+
if reasoning_messages is not None:
|
|
535
|
+
reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
|
|
536
|
+
|
|
537
|
+
references = data.pop("references", None)
|
|
538
|
+
if references is not None:
|
|
539
|
+
references = [MessageReferences.model_validate(reference) for reference in references]
|
|
403
540
|
|
|
404
541
|
images = data.pop("images", [])
|
|
405
|
-
images = [
|
|
542
|
+
images = [Image.model_validate(image) for image in images] if images else None
|
|
406
543
|
|
|
407
544
|
videos = data.pop("videos", [])
|
|
408
|
-
videos = [
|
|
545
|
+
videos = [Video.model_validate(video) for video in videos] if videos else None
|
|
409
546
|
|
|
410
547
|
audio = data.pop("audio", [])
|
|
411
|
-
audio = [
|
|
548
|
+
audio = [Audio.model_validate(audio) for audio in audio] if audio else None
|
|
412
549
|
|
|
413
550
|
tools = data.pop("tools", [])
|
|
414
551
|
tools = [ToolExecution.from_dict(tool) for tool in tools] if tools else None
|
|
415
552
|
|
|
416
553
|
response_audio = data.pop("response_audio", None)
|
|
417
|
-
response_audio =
|
|
554
|
+
response_audio = Audio.model_validate(response_audio) if response_audio else None
|
|
555
|
+
|
|
556
|
+
input_data = data.pop("input", None)
|
|
557
|
+
input_obj = None
|
|
558
|
+
if input_data:
|
|
559
|
+
input_obj = TeamRunInput.from_dict(input_data)
|
|
560
|
+
|
|
561
|
+
metrics = data.pop("metrics", None)
|
|
562
|
+
if metrics:
|
|
563
|
+
metrics = Metrics(**metrics)
|
|
418
564
|
|
|
419
565
|
citations = data.pop("citations", None)
|
|
420
566
|
citations = Citations.model_validate(citations) if citations else None
|
|
421
567
|
|
|
422
|
-
# To make it backwards compatible
|
|
423
|
-
if "event" in data:
|
|
424
|
-
data.pop("event")
|
|
425
|
-
|
|
426
568
|
return cls(
|
|
427
569
|
messages=messages,
|
|
570
|
+
metrics=metrics,
|
|
428
571
|
member_responses=parsed_member_responses,
|
|
429
|
-
|
|
572
|
+
additional_input=additional_input,
|
|
573
|
+
reasoning_steps=reasoning_steps,
|
|
574
|
+
reasoning_messages=reasoning_messages,
|
|
575
|
+
references=references,
|
|
430
576
|
images=images,
|
|
431
577
|
videos=videos,
|
|
432
578
|
audio=audio,
|
|
433
579
|
response_audio=response_audio,
|
|
580
|
+
input=input_obj,
|
|
434
581
|
citations=citations,
|
|
435
582
|
tools=tools,
|
|
436
583
|
events=events,
|
|
@@ -449,7 +596,7 @@ class TeamRunResponse:
|
|
|
449
596
|
else:
|
|
450
597
|
return json.dumps(self.content, **kwargs)
|
|
451
598
|
|
|
452
|
-
def add_member_run(self, run_response: Union["
|
|
599
|
+
def add_member_run(self, run_response: Union["TeamRunOutput", RunOutput]) -> None:
|
|
453
600
|
self.member_responses.append(run_response)
|
|
454
601
|
if run_response.images is not None:
|
|
455
602
|
if self.images is None:
|