agno 1.8.2__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/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 +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 +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 +128 -72
- 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 +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 +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 +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 +17 -18
- 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 +18 -33
- 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 +1 -1
- 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 +6 -12
- 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 -110
- 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 -1053
- agno/app/playground/deploy.py +0 -249
- agno/app/playground/operator.py +0 -183
- agno/app/playground/schemas.py +0 -223
- agno/app/playground/serve.py +0 -55
- agno/app/playground/sync_router.py +0 -1045
- 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 -3313
- 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.2.dist-info/METADATA +0 -982
- agno-1.8.2.dist-info/RECORD +0 -566
- agno-1.8.2.dist-info/entry_points.txt +0 -3
- agno-1.8.2.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.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
- {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/session/team.py
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import asdict, dataclass
|
|
4
|
+
from typing import Any, Dict, List, Mapping, Optional, Union
|
|
5
|
+
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.run.agent import RunOutput, RunStatus
|
|
8
|
+
from agno.run.team import TeamRunOutput
|
|
9
|
+
from agno.session.summary import SessionSummary
|
|
10
|
+
from agno.utils.log import log_debug, log_warning
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class TeamSession:
|
|
15
|
+
"""Team Session that is stored in the database"""
|
|
16
|
+
|
|
17
|
+
# Session UUID
|
|
18
|
+
session_id: str
|
|
19
|
+
|
|
20
|
+
# ID of the team that this session is associated with
|
|
21
|
+
team_id: Optional[str] = None
|
|
22
|
+
# ID of the user interacting with this team
|
|
23
|
+
user_id: Optional[str] = None
|
|
24
|
+
# ID of the workflow that this session is associated with
|
|
25
|
+
workflow_id: Optional[str] = None
|
|
26
|
+
|
|
27
|
+
# Team Data: agent_id, name and model
|
|
28
|
+
team_data: Optional[Dict[str, Any]] = None
|
|
29
|
+
# Session Data: session_name, session_state, images, videos, audio
|
|
30
|
+
session_data: Optional[Dict[str, Any]] = None
|
|
31
|
+
# Metadata stored with this team
|
|
32
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
33
|
+
# List of all runs in the session
|
|
34
|
+
runs: Optional[list[Union[TeamRunOutput, RunOutput]]] = None
|
|
35
|
+
# Summary of the session
|
|
36
|
+
summary: Optional[SessionSummary] = None
|
|
37
|
+
|
|
38
|
+
# The unix timestamp when this session was created
|
|
39
|
+
created_at: Optional[int] = None
|
|
40
|
+
# The unix timestamp when this session was last updated
|
|
41
|
+
updated_at: Optional[int] = None
|
|
42
|
+
|
|
43
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
44
|
+
session_dict = asdict(self)
|
|
45
|
+
|
|
46
|
+
session_dict["runs"] = [run.to_dict() for run in self.runs] if self.runs else None
|
|
47
|
+
session_dict["summary"] = self.summary.to_dict() if self.summary else None
|
|
48
|
+
|
|
49
|
+
return session_dict
|
|
50
|
+
|
|
51
|
+
@classmethod
|
|
52
|
+
def from_dict(cls, data: Mapping[str, Any]) -> Optional[TeamSession]:
|
|
53
|
+
if data is None or data.get("session_id") is None:
|
|
54
|
+
log_warning("TeamSession is missing session_id")
|
|
55
|
+
return None
|
|
56
|
+
|
|
57
|
+
if data.get("summary") is not None:
|
|
58
|
+
data["summary"] = SessionSummary.from_dict(data["summary"]) # type: ignore
|
|
59
|
+
|
|
60
|
+
runs = data.get("runs", [])
|
|
61
|
+
serialized_runs: List[Union[TeamRunOutput, RunOutput]] = []
|
|
62
|
+
for run in runs:
|
|
63
|
+
if "agent_id" in run:
|
|
64
|
+
serialized_runs.append(RunOutput.from_dict(run))
|
|
65
|
+
elif "team_id" in run:
|
|
66
|
+
serialized_runs.append(TeamRunOutput.from_dict(run))
|
|
67
|
+
|
|
68
|
+
return cls(
|
|
69
|
+
session_id=data.get("session_id"), # type: ignore
|
|
70
|
+
team_id=data.get("team_id"),
|
|
71
|
+
user_id=data.get("user_id"),
|
|
72
|
+
workflow_id=data.get("workflow_id"),
|
|
73
|
+
team_data=data.get("team_data"),
|
|
74
|
+
session_data=data.get("session_data"),
|
|
75
|
+
metadata=data.get("metadata"),
|
|
76
|
+
created_at=data.get("created_at"),
|
|
77
|
+
updated_at=data.get("updated_at"),
|
|
78
|
+
runs=serialized_runs,
|
|
79
|
+
summary=data.get("summary"),
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
def get_run(self, run_id: str) -> Optional[Union[TeamRunOutput, RunOutput]]:
|
|
83
|
+
for run in self.runs or []:
|
|
84
|
+
if run.run_id == run_id:
|
|
85
|
+
return run
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
def upsert_run(self, run_response: Union[TeamRunOutput, RunOutput]):
|
|
89
|
+
"""Adds a RunOutput, together with some calculated data, to the runs list."""
|
|
90
|
+
|
|
91
|
+
messages = run_response.messages
|
|
92
|
+
if messages is None:
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
for m in messages or []:
|
|
96
|
+
if m.metrics is not None:
|
|
97
|
+
m.metrics.duration = None
|
|
98
|
+
|
|
99
|
+
if not self.runs:
|
|
100
|
+
self.runs = []
|
|
101
|
+
|
|
102
|
+
for i, existing_run in enumerate(self.runs or []):
|
|
103
|
+
if existing_run.run_id == run_response.run_id:
|
|
104
|
+
self.runs[i] = run_response
|
|
105
|
+
break
|
|
106
|
+
else:
|
|
107
|
+
self.runs.append(run_response)
|
|
108
|
+
|
|
109
|
+
log_debug("Added RunOutput to Team Session")
|
|
110
|
+
|
|
111
|
+
def get_messages_from_last_n_runs(
|
|
112
|
+
self,
|
|
113
|
+
agent_id: Optional[str] = None,
|
|
114
|
+
team_id: Optional[str] = None,
|
|
115
|
+
last_n: Optional[int] = None,
|
|
116
|
+
skip_role: Optional[str] = None,
|
|
117
|
+
skip_status: Optional[List[RunStatus]] = None,
|
|
118
|
+
skip_history_messages: bool = True,
|
|
119
|
+
member_runs: bool = False,
|
|
120
|
+
) -> List[Message]:
|
|
121
|
+
"""Returns the messages from the last_n runs, excluding previously tagged history messages.
|
|
122
|
+
Args:
|
|
123
|
+
|
|
124
|
+
agent_id: The id of the agent to get the messages from.
|
|
125
|
+
team_id: The id of the team to get the messages from.
|
|
126
|
+
last_n: The number of runs to return from the end of the conversation. Defaults to all runs.
|
|
127
|
+
skip_role: Skip messages with this role.
|
|
128
|
+
skip_status: Skip messages with this status.
|
|
129
|
+
skip_history_messages: Skip messages that were tagged as history in previous runs.
|
|
130
|
+
Returns:
|
|
131
|
+
A list of Messages from the specified runs, excluding history messages.
|
|
132
|
+
"""
|
|
133
|
+
if not self.runs:
|
|
134
|
+
return []
|
|
135
|
+
|
|
136
|
+
if skip_status is None:
|
|
137
|
+
skip_status = [RunStatus.paused, RunStatus.cancelled, RunStatus.error]
|
|
138
|
+
|
|
139
|
+
session_runs = self.runs
|
|
140
|
+
# Filter by agent_id and team_id
|
|
141
|
+
if agent_id:
|
|
142
|
+
session_runs = [run for run in session_runs if hasattr(run, "agent_id") and run.agent_id == agent_id] # type: ignore
|
|
143
|
+
if team_id:
|
|
144
|
+
session_runs = [run for run in session_runs if hasattr(run, "team_id") and run.team_id == team_id] # type: ignore
|
|
145
|
+
|
|
146
|
+
if not member_runs:
|
|
147
|
+
# Filter for the main team runs
|
|
148
|
+
session_runs = [run for run in session_runs if run.parent_run_id is None] # type: ignore
|
|
149
|
+
|
|
150
|
+
# Filter by status
|
|
151
|
+
session_runs = [run for run in session_runs if hasattr(run, "status") and run.status not in skip_status] # type: ignore
|
|
152
|
+
|
|
153
|
+
# Filter by last_n
|
|
154
|
+
runs_to_process = session_runs[-last_n:] if last_n is not None else session_runs
|
|
155
|
+
messages_from_history = []
|
|
156
|
+
system_message = None
|
|
157
|
+
for run_response in runs_to_process:
|
|
158
|
+
if not (run_response and run_response.messages):
|
|
159
|
+
continue
|
|
160
|
+
|
|
161
|
+
for message in run_response.messages or []:
|
|
162
|
+
# Skip messages with specified role
|
|
163
|
+
if skip_role and message.role == skip_role:
|
|
164
|
+
continue
|
|
165
|
+
# Skip messages that were tagged as history in previous runs
|
|
166
|
+
if hasattr(message, "from_history") and message.from_history and skip_history_messages:
|
|
167
|
+
continue
|
|
168
|
+
if message.role == "system":
|
|
169
|
+
# Only add the system message once
|
|
170
|
+
if system_message is None:
|
|
171
|
+
system_message = message
|
|
172
|
+
messages_from_history.append(system_message)
|
|
173
|
+
else:
|
|
174
|
+
messages_from_history.append(message)
|
|
175
|
+
|
|
176
|
+
log_debug(f"Getting messages from previous runs: {len(messages_from_history)}")
|
|
177
|
+
return messages_from_history
|
|
178
|
+
|
|
179
|
+
def get_tool_calls(self, num_calls: Optional[int] = None) -> List[Dict[str, Any]]:
|
|
180
|
+
"""Returns a list of tool calls from the messages"""
|
|
181
|
+
|
|
182
|
+
tool_calls = []
|
|
183
|
+
session_runs = self.runs
|
|
184
|
+
if session_runs is None:
|
|
185
|
+
return []
|
|
186
|
+
|
|
187
|
+
for run_response in session_runs[::-1]:
|
|
188
|
+
if run_response and run_response.messages:
|
|
189
|
+
for message in run_response.messages or []:
|
|
190
|
+
if message.tool_calls:
|
|
191
|
+
for tool_call in message.tool_calls:
|
|
192
|
+
tool_calls.append(tool_call)
|
|
193
|
+
if num_calls and len(tool_calls) >= num_calls:
|
|
194
|
+
return tool_calls
|
|
195
|
+
return tool_calls
|
|
196
|
+
|
|
197
|
+
def get_messages_for_session(
|
|
198
|
+
self,
|
|
199
|
+
user_role: str = "user",
|
|
200
|
+
assistant_role: Optional[List[str]] = None,
|
|
201
|
+
skip_history_messages: bool = True,
|
|
202
|
+
) -> List[Message]:
|
|
203
|
+
"""Returns a list of messages for the session that iterate through user message and assistant response."""
|
|
204
|
+
|
|
205
|
+
if assistant_role is None:
|
|
206
|
+
# TODO: Check if we still need CHATBOT as a role
|
|
207
|
+
assistant_role = ["assistant", "model", "CHATBOT"]
|
|
208
|
+
|
|
209
|
+
final_messages: List[Message] = []
|
|
210
|
+
session_runs = self.runs
|
|
211
|
+
if session_runs is None:
|
|
212
|
+
return []
|
|
213
|
+
|
|
214
|
+
for run_response in session_runs:
|
|
215
|
+
if run_response and run_response.messages:
|
|
216
|
+
user_message_from_run = None
|
|
217
|
+
assistant_message_from_run = None
|
|
218
|
+
|
|
219
|
+
# Start from the beginning to look for the user message
|
|
220
|
+
for message in run_response.messages or []:
|
|
221
|
+
if hasattr(message, "from_history") and message.from_history and skip_history_messages:
|
|
222
|
+
continue
|
|
223
|
+
if message.role == user_role:
|
|
224
|
+
user_message_from_run = message
|
|
225
|
+
break
|
|
226
|
+
|
|
227
|
+
# Start from the end to look for the assistant response
|
|
228
|
+
for message in run_response.messages[::-1]:
|
|
229
|
+
if hasattr(message, "from_history") and message.from_history and skip_history_messages:
|
|
230
|
+
continue
|
|
231
|
+
if message.role in assistant_role:
|
|
232
|
+
assistant_message_from_run = message
|
|
233
|
+
break
|
|
234
|
+
|
|
235
|
+
if user_message_from_run and assistant_message_from_run:
|
|
236
|
+
final_messages.append(user_message_from_run)
|
|
237
|
+
final_messages.append(assistant_message_from_run)
|
|
238
|
+
return final_messages
|
|
239
|
+
|
|
240
|
+
def get_session_summary(self) -> Optional[SessionSummary]:
|
|
241
|
+
"""Get the session summary for the session"""
|
|
242
|
+
|
|
243
|
+
if self.summary is None:
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
return self.summary # type: ignore
|
|
247
|
+
|
|
248
|
+
# Chat History functions
|
|
249
|
+
def get_chat_history(self) -> List[Message]:
|
|
250
|
+
"""Get the chat history for the session"""
|
|
251
|
+
|
|
252
|
+
messages = []
|
|
253
|
+
if self.runs is None:
|
|
254
|
+
return []
|
|
255
|
+
|
|
256
|
+
for run in self.runs or []:
|
|
257
|
+
if run.messages is None:
|
|
258
|
+
continue
|
|
259
|
+
|
|
260
|
+
messages.extend([msg for msg in run.messages or [] if not msg.from_history])
|
|
261
|
+
|
|
262
|
+
return messages
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import time
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from typing import Any, Dict, List, Mapping, Optional
|
|
5
6
|
|
|
6
|
-
from agno.run.
|
|
7
|
+
from agno.run.workflow import WorkflowRunOutput
|
|
7
8
|
from agno.utils.log import logger
|
|
8
9
|
|
|
9
10
|
|
|
@@ -21,15 +22,15 @@ class WorkflowSession:
|
|
|
21
22
|
# Workflow name
|
|
22
23
|
workflow_name: Optional[str] = None
|
|
23
24
|
|
|
24
|
-
# Workflow runs - stores
|
|
25
|
-
runs: Optional[List[
|
|
25
|
+
# Workflow runs - stores WorkflowRunOutput objects in memory
|
|
26
|
+
runs: Optional[List[WorkflowRunOutput]] = None
|
|
26
27
|
|
|
27
28
|
# Session Data: session_name, session_state, images, videos, audio
|
|
28
29
|
session_data: Optional[Dict[str, Any]] = None
|
|
29
30
|
# Workflow configuration and metadata
|
|
30
31
|
workflow_data: Optional[Dict[str, Any]] = None
|
|
31
|
-
#
|
|
32
|
-
|
|
32
|
+
# Metadata stored with this workflow session
|
|
33
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
33
34
|
|
|
34
35
|
# The unix timestamp when this session was created
|
|
35
36
|
created_at: Optional[int] = None
|
|
@@ -40,7 +41,28 @@ class WorkflowSession:
|
|
|
40
41
|
if self.runs is None:
|
|
41
42
|
self.runs = []
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
# Ensure session_data, workflow_data, and metadata are dictionaries, not None
|
|
45
|
+
if self.session_data is None:
|
|
46
|
+
self.session_data = {}
|
|
47
|
+
if self.workflow_data is None:
|
|
48
|
+
self.workflow_data = {}
|
|
49
|
+
if self.metadata is None:
|
|
50
|
+
self.metadata = {}
|
|
51
|
+
|
|
52
|
+
# Set timestamps if they're not already set
|
|
53
|
+
current_time = int(time.time())
|
|
54
|
+
if self.created_at is None:
|
|
55
|
+
self.created_at = current_time
|
|
56
|
+
if self.updated_at is None:
|
|
57
|
+
self.updated_at = current_time
|
|
58
|
+
|
|
59
|
+
def get_run(self, run_id: str) -> Optional[WorkflowRunOutput]:
|
|
60
|
+
for run in self.runs or []:
|
|
61
|
+
if run.run_id == run_id:
|
|
62
|
+
return run
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
def upsert_run(self, run: WorkflowRunOutput) -> None:
|
|
44
66
|
"""Add or update a workflow run (upsert behavior)"""
|
|
45
67
|
if self.runs is None:
|
|
46
68
|
self.runs = []
|
|
@@ -48,12 +70,10 @@ class WorkflowSession:
|
|
|
48
70
|
# Find existing run and update it, or append new one
|
|
49
71
|
for i, existing_run in enumerate(self.runs):
|
|
50
72
|
if existing_run.run_id == run.run_id:
|
|
51
|
-
# Update existing run
|
|
52
73
|
self.runs[i] = run
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
self.runs.append(run)
|
|
74
|
+
break
|
|
75
|
+
else:
|
|
76
|
+
self.runs.append(run)
|
|
57
77
|
|
|
58
78
|
def to_dict(self) -> Dict[str, Any]:
|
|
59
79
|
"""Convert to dictionary for storage, serializing runs to dicts"""
|
|
@@ -65,14 +85,7 @@ class WorkflowSession:
|
|
|
65
85
|
try:
|
|
66
86
|
runs_data.append(run.to_dict())
|
|
67
87
|
except Exception as e:
|
|
68
|
-
|
|
69
|
-
runs_data.append(
|
|
70
|
-
{
|
|
71
|
-
"run_id": getattr(run, "run_id", "unknown"),
|
|
72
|
-
"status": str(getattr(run, "status", "unknown")),
|
|
73
|
-
"error": f"Serialization failed: {str(e)}",
|
|
74
|
-
}
|
|
75
|
-
)
|
|
88
|
+
raise ValueError(f"Serialization failed: {str(e)}")
|
|
76
89
|
return {
|
|
77
90
|
"session_id": self.session_id,
|
|
78
91
|
"user_id": self.user_id,
|
|
@@ -81,7 +94,7 @@ class WorkflowSession:
|
|
|
81
94
|
"runs": runs_data,
|
|
82
95
|
"session_data": self.session_data,
|
|
83
96
|
"workflow_data": self.workflow_data,
|
|
84
|
-
"
|
|
97
|
+
"metadata": self.metadata,
|
|
85
98
|
"created_at": self.created_at,
|
|
86
99
|
"updated_at": self.updated_at,
|
|
87
100
|
}
|
|
@@ -93,11 +106,21 @@ class WorkflowSession:
|
|
|
93
106
|
logger.warning("WorkflowSession is missing session_id")
|
|
94
107
|
return None
|
|
95
108
|
|
|
96
|
-
# Deserialize runs from dictionaries back to
|
|
109
|
+
# Deserialize runs from dictionaries back to WorkflowRunOutput objects
|
|
97
110
|
runs_data = data.get("runs")
|
|
98
|
-
runs: Optional[List[
|
|
111
|
+
runs: Optional[List[WorkflowRunOutput]] = None
|
|
112
|
+
|
|
99
113
|
if runs_data is not None:
|
|
100
|
-
runs = [
|
|
114
|
+
runs = []
|
|
115
|
+
for run_item in runs_data:
|
|
116
|
+
if isinstance(run_item, WorkflowRunOutput):
|
|
117
|
+
# Already a WorkflowRunOutput object (from deserialize_session_json_fields)
|
|
118
|
+
runs.append(run_item)
|
|
119
|
+
elif isinstance(run_item, dict):
|
|
120
|
+
# Still a dictionary, needs to be converted
|
|
121
|
+
runs.append(WorkflowRunOutput.from_dict(run_item))
|
|
122
|
+
else:
|
|
123
|
+
logger.warning(f"Unexpected run item type: {type(run_item)}")
|
|
101
124
|
|
|
102
125
|
return cls(
|
|
103
126
|
session_id=data.get("session_id"), # type: ignore
|
|
@@ -107,7 +130,7 @@ class WorkflowSession:
|
|
|
107
130
|
runs=runs,
|
|
108
131
|
session_data=data.get("session_data"),
|
|
109
132
|
workflow_data=data.get("workflow_data"),
|
|
110
|
-
|
|
133
|
+
metadata=data.get("metadata"),
|
|
111
134
|
created_at=data.get("created_at"),
|
|
112
135
|
updated_at=data.get("updated_at"),
|
|
113
136
|
)
|
agno/team/__init__.py
CHANGED
|
@@ -4,30 +4,29 @@ from agno.run.team import (
|
|
|
4
4
|
ReasoningCompletedEvent,
|
|
5
5
|
ReasoningStartedEvent,
|
|
6
6
|
ReasoningStepEvent,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
RunCancelledEvent,
|
|
8
|
+
RunCompletedEvent,
|
|
9
|
+
RunContentEvent,
|
|
10
|
+
RunErrorEvent,
|
|
11
|
+
RunStartedEvent,
|
|
12
12
|
TeamRunEvent,
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
TeamRunOutput,
|
|
14
|
+
TeamRunOutputEvent,
|
|
15
15
|
ToolCallCompletedEvent,
|
|
16
16
|
ToolCallStartedEvent,
|
|
17
17
|
)
|
|
18
|
-
from agno.team.team import
|
|
18
|
+
from agno.team.team import Team
|
|
19
19
|
|
|
20
20
|
__all__ = [
|
|
21
21
|
"Team",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"TeamRunResponseEvent",
|
|
22
|
+
"TeamRunOutput",
|
|
23
|
+
"TeamRunOutputEvent",
|
|
25
24
|
"TeamRunEvent",
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
25
|
+
"RunContentEvent",
|
|
26
|
+
"RunCancelledEvent",
|
|
27
|
+
"RunErrorEvent",
|
|
28
|
+
"RunStartedEvent",
|
|
29
|
+
"RunCompletedEvent",
|
|
31
30
|
"MemoryUpdateStartedEvent",
|
|
32
31
|
"MemoryUpdateCompletedEvent",
|
|
33
32
|
"ReasoningStartedEvent",
|