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
|
@@ -7,8 +7,10 @@ from pydantic import BaseModel
|
|
|
7
7
|
|
|
8
8
|
from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
|
|
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.reasoning.step import ReasoningStep
|
|
13
|
+
from agno.run.base import BaseRunOutputEvent, MessageReferences, RunStatus
|
|
12
14
|
from agno.utils.log import logger
|
|
13
15
|
|
|
14
16
|
|
|
@@ -16,8 +18,8 @@ class RunEvent(str, Enum):
|
|
|
16
18
|
"""Events that can be sent by the run() functions"""
|
|
17
19
|
|
|
18
20
|
run_started = "RunStarted"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
run_content = "RunContent"
|
|
22
|
+
run_intermediate_content = "RunIntermediateContent"
|
|
21
23
|
run_completed = "RunCompleted"
|
|
22
24
|
run_error = "RunError"
|
|
23
25
|
run_cancelled = "RunCancelled"
|
|
@@ -43,14 +45,20 @@ class RunEvent(str, Enum):
|
|
|
43
45
|
|
|
44
46
|
|
|
45
47
|
@dataclass
|
|
46
|
-
class
|
|
48
|
+
class BaseAgentRunEvent(BaseRunOutputEvent):
|
|
47
49
|
created_at: int = field(default_factory=lambda: int(time()))
|
|
48
50
|
event: str = ""
|
|
49
51
|
agent_id: str = ""
|
|
50
52
|
agent_name: str = ""
|
|
51
53
|
run_id: Optional[str] = None
|
|
52
54
|
session_id: Optional[str] = None
|
|
53
|
-
|
|
55
|
+
|
|
56
|
+
# Step context for workflow execution
|
|
57
|
+
workflow_id: Optional[str] = None
|
|
58
|
+
workflow_run_id: Optional[str] = None
|
|
59
|
+
step_id: Optional[str] = None
|
|
60
|
+
step_name: Optional[str] = None
|
|
61
|
+
step_index: Optional[int] = None
|
|
54
62
|
tools: Optional[List[ToolExecution]] = None
|
|
55
63
|
|
|
56
64
|
# For backwards compatibility
|
|
@@ -70,7 +78,7 @@ class BaseAgentRunResponseEvent(BaseRunResponseEvent):
|
|
|
70
78
|
|
|
71
79
|
|
|
72
80
|
@dataclass
|
|
73
|
-
class
|
|
81
|
+
class RunStartedEvent(BaseAgentRunEvent):
|
|
74
82
|
"""Event sent when the run starts"""
|
|
75
83
|
|
|
76
84
|
event: str = RunEvent.run_started.value
|
|
@@ -79,44 +87,50 @@ class RunResponseStartedEvent(BaseAgentRunResponseEvent):
|
|
|
79
87
|
|
|
80
88
|
|
|
81
89
|
@dataclass
|
|
82
|
-
class
|
|
83
|
-
"""Main event for each delta of the
|
|
90
|
+
class RunContentEvent(BaseAgentRunEvent):
|
|
91
|
+
"""Main event for each delta of the RunOutput"""
|
|
84
92
|
|
|
85
|
-
event: str = RunEvent.
|
|
93
|
+
event: str = RunEvent.run_content.value
|
|
86
94
|
content: Optional[Any] = None
|
|
87
95
|
content_type: str = "str"
|
|
88
|
-
thinking: Optional[str] = None
|
|
89
96
|
reasoning_content: Optional[str] = None
|
|
90
97
|
citations: Optional[Citations] = None
|
|
91
98
|
response_audio: Optional[AudioResponse] = None # Model audio response
|
|
92
99
|
image: Optional[ImageArtifact] = None # Image attached to the response
|
|
93
|
-
|
|
100
|
+
references: Optional[List[MessageReferences]] = None
|
|
101
|
+
additional_input: Optional[List[Message]] = None
|
|
102
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
103
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
94
104
|
|
|
95
105
|
|
|
96
106
|
@dataclass
|
|
97
|
-
class
|
|
98
|
-
event: str = RunEvent.
|
|
107
|
+
class IntermediateRunContentEvent(BaseAgentRunEvent):
|
|
108
|
+
event: str = RunEvent.run_intermediate_content.value
|
|
99
109
|
content: Optional[Any] = None
|
|
100
110
|
content_type: str = "str"
|
|
101
111
|
|
|
102
112
|
|
|
103
113
|
@dataclass
|
|
104
|
-
class
|
|
114
|
+
class RunCompletedEvent(BaseAgentRunEvent):
|
|
105
115
|
event: str = RunEvent.run_completed.value
|
|
106
116
|
content: Optional[Any] = None
|
|
107
117
|
content_type: str = "str"
|
|
108
118
|
reasoning_content: Optional[str] = None
|
|
109
|
-
thinking: Optional[str] = None
|
|
110
119
|
citations: Optional[Citations] = None
|
|
111
120
|
images: Optional[List[ImageArtifact]] = None # Images attached to the response
|
|
112
121
|
videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
|
|
113
122
|
audio: Optional[List[AudioArtifact]] = None # Audio attached to the response
|
|
114
123
|
response_audio: Optional[AudioResponse] = None # Model audio response
|
|
115
|
-
|
|
124
|
+
references: Optional[List[MessageReferences]] = None
|
|
125
|
+
additional_input: Optional[List[Message]] = None
|
|
126
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
127
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
128
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
129
|
+
metrics: Optional[Metrics] = None
|
|
116
130
|
|
|
117
131
|
|
|
118
132
|
@dataclass
|
|
119
|
-
class
|
|
133
|
+
class RunPausedEvent(BaseAgentRunEvent):
|
|
120
134
|
event: str = RunEvent.run_paused.value
|
|
121
135
|
tools: Optional[List[ToolExecution]] = None
|
|
122
136
|
|
|
@@ -126,18 +140,18 @@ class RunResponsePausedEvent(BaseAgentRunResponseEvent):
|
|
|
126
140
|
|
|
127
141
|
|
|
128
142
|
@dataclass
|
|
129
|
-
class
|
|
143
|
+
class RunContinuedEvent(BaseAgentRunEvent):
|
|
130
144
|
event: str = RunEvent.run_continued.value
|
|
131
145
|
|
|
132
146
|
|
|
133
147
|
@dataclass
|
|
134
|
-
class
|
|
148
|
+
class RunErrorEvent(BaseAgentRunEvent):
|
|
135
149
|
event: str = RunEvent.run_error.value
|
|
136
150
|
content: Optional[str] = None
|
|
137
151
|
|
|
138
152
|
|
|
139
153
|
@dataclass
|
|
140
|
-
class
|
|
154
|
+
class RunCancelledEvent(BaseAgentRunEvent):
|
|
141
155
|
event: str = RunEvent.run_cancelled.value
|
|
142
156
|
reason: Optional[str] = None
|
|
143
157
|
|
|
@@ -147,22 +161,22 @@ class RunResponseCancelledEvent(BaseAgentRunResponseEvent):
|
|
|
147
161
|
|
|
148
162
|
|
|
149
163
|
@dataclass
|
|
150
|
-
class MemoryUpdateStartedEvent(
|
|
164
|
+
class MemoryUpdateStartedEvent(BaseAgentRunEvent):
|
|
151
165
|
event: str = RunEvent.memory_update_started.value
|
|
152
166
|
|
|
153
167
|
|
|
154
168
|
@dataclass
|
|
155
|
-
class MemoryUpdateCompletedEvent(
|
|
169
|
+
class MemoryUpdateCompletedEvent(BaseAgentRunEvent):
|
|
156
170
|
event: str = RunEvent.memory_update_completed.value
|
|
157
171
|
|
|
158
172
|
|
|
159
173
|
@dataclass
|
|
160
|
-
class ReasoningStartedEvent(
|
|
174
|
+
class ReasoningStartedEvent(BaseAgentRunEvent):
|
|
161
175
|
event: str = RunEvent.reasoning_started.value
|
|
162
176
|
|
|
163
177
|
|
|
164
178
|
@dataclass
|
|
165
|
-
class ReasoningStepEvent(
|
|
179
|
+
class ReasoningStepEvent(BaseAgentRunEvent):
|
|
166
180
|
event: str = RunEvent.reasoning_step.value
|
|
167
181
|
content: Optional[Any] = None
|
|
168
182
|
content_type: str = "str"
|
|
@@ -170,20 +184,20 @@ class ReasoningStepEvent(BaseAgentRunResponseEvent):
|
|
|
170
184
|
|
|
171
185
|
|
|
172
186
|
@dataclass
|
|
173
|
-
class ReasoningCompletedEvent(
|
|
187
|
+
class ReasoningCompletedEvent(BaseAgentRunEvent):
|
|
174
188
|
event: str = RunEvent.reasoning_completed.value
|
|
175
189
|
content: Optional[Any] = None
|
|
176
190
|
content_type: str = "str"
|
|
177
191
|
|
|
178
192
|
|
|
179
193
|
@dataclass
|
|
180
|
-
class ToolCallStartedEvent(
|
|
194
|
+
class ToolCallStartedEvent(BaseAgentRunEvent):
|
|
181
195
|
event: str = RunEvent.tool_call_started.value
|
|
182
196
|
tool: Optional[ToolExecution] = None
|
|
183
197
|
|
|
184
198
|
|
|
185
199
|
@dataclass
|
|
186
|
-
class ToolCallCompletedEvent(
|
|
200
|
+
class ToolCallCompletedEvent(BaseAgentRunEvent):
|
|
187
201
|
event: str = RunEvent.tool_call_completed.value
|
|
188
202
|
tool: Optional[ToolExecution] = None
|
|
189
203
|
content: Optional[Any] = None
|
|
@@ -193,34 +207,34 @@ class ToolCallCompletedEvent(BaseAgentRunResponseEvent):
|
|
|
193
207
|
|
|
194
208
|
|
|
195
209
|
@dataclass
|
|
196
|
-
class ParserModelResponseStartedEvent(
|
|
210
|
+
class ParserModelResponseStartedEvent(BaseAgentRunEvent):
|
|
197
211
|
event: str = RunEvent.parser_model_response_started.value
|
|
198
212
|
|
|
199
213
|
|
|
200
214
|
@dataclass
|
|
201
|
-
class ParserModelResponseCompletedEvent(
|
|
215
|
+
class ParserModelResponseCompletedEvent(BaseAgentRunEvent):
|
|
202
216
|
event: str = RunEvent.parser_model_response_completed.value
|
|
203
217
|
|
|
204
218
|
|
|
205
219
|
@dataclass
|
|
206
|
-
class OutputModelResponseStartedEvent(
|
|
220
|
+
class OutputModelResponseStartedEvent(BaseAgentRunEvent):
|
|
207
221
|
event: str = RunEvent.output_model_response_started.value
|
|
208
222
|
|
|
209
223
|
|
|
210
224
|
@dataclass
|
|
211
|
-
class OutputModelResponseCompletedEvent(
|
|
225
|
+
class OutputModelResponseCompletedEvent(BaseAgentRunEvent):
|
|
212
226
|
event: str = RunEvent.output_model_response_completed.value
|
|
213
227
|
|
|
214
228
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
229
|
+
RunOutputEvent = Union[
|
|
230
|
+
RunStartedEvent,
|
|
231
|
+
RunContentEvent,
|
|
232
|
+
IntermediateRunContentEvent,
|
|
233
|
+
RunCompletedEvent,
|
|
234
|
+
RunErrorEvent,
|
|
235
|
+
RunCancelledEvent,
|
|
236
|
+
RunPausedEvent,
|
|
237
|
+
RunContinuedEvent,
|
|
224
238
|
ReasoningStartedEvent,
|
|
225
239
|
ReasoningStepEvent,
|
|
226
240
|
ReasoningCompletedEvent,
|
|
@@ -237,14 +251,14 @@ RunResponseEvent = Union[
|
|
|
237
251
|
|
|
238
252
|
# Map event string to dataclass
|
|
239
253
|
RUN_EVENT_TYPE_REGISTRY = {
|
|
240
|
-
RunEvent.run_started.value:
|
|
241
|
-
RunEvent.
|
|
242
|
-
RunEvent.
|
|
243
|
-
RunEvent.run_completed.value:
|
|
244
|
-
RunEvent.run_error.value:
|
|
245
|
-
RunEvent.run_cancelled.value:
|
|
246
|
-
RunEvent.run_paused.value:
|
|
247
|
-
RunEvent.run_continued.value:
|
|
254
|
+
RunEvent.run_started.value: RunStartedEvent,
|
|
255
|
+
RunEvent.run_content.value: RunContentEvent,
|
|
256
|
+
RunEvent.run_intermediate_content.value: IntermediateRunContentEvent,
|
|
257
|
+
RunEvent.run_completed.value: RunCompletedEvent,
|
|
258
|
+
RunEvent.run_error.value: RunErrorEvent,
|
|
259
|
+
RunEvent.run_cancelled.value: RunCancelledEvent,
|
|
260
|
+
RunEvent.run_paused.value: RunPausedEvent,
|
|
261
|
+
RunEvent.run_continued.value: RunContinuedEvent,
|
|
248
262
|
RunEvent.reasoning_started.value: ReasoningStartedEvent,
|
|
249
263
|
RunEvent.reasoning_step.value: ReasoningStepEvent,
|
|
250
264
|
RunEvent.reasoning_completed.value: ReasoningCompletedEvent,
|
|
@@ -259,7 +273,7 @@ RUN_EVENT_TYPE_REGISTRY = {
|
|
|
259
273
|
}
|
|
260
274
|
|
|
261
275
|
|
|
262
|
-
def
|
|
276
|
+
def run_output_event_from_dict(data: dict) -> BaseRunOutputEvent:
|
|
263
277
|
event_type = data.get("event", "")
|
|
264
278
|
cls = RUN_EVENT_TYPE_REGISTRY.get(event_type)
|
|
265
279
|
if not cls:
|
|
@@ -268,37 +282,53 @@ def run_response_event_from_dict(data: dict) -> BaseRunResponseEvent:
|
|
|
268
282
|
|
|
269
283
|
|
|
270
284
|
@dataclass
|
|
271
|
-
class
|
|
285
|
+
class RunOutput:
|
|
272
286
|
"""Response returned by Agent.run() or Workflow.run() functions"""
|
|
273
287
|
|
|
274
|
-
content: Optional[Any] = None
|
|
275
|
-
content_type: str = "str"
|
|
276
|
-
thinking: Optional[str] = None
|
|
277
|
-
reasoning_content: Optional[str] = None
|
|
278
|
-
messages: Optional[List[Message]] = None
|
|
279
|
-
metrics: Optional[Dict[str, Any]] = None
|
|
280
|
-
model: Optional[str] = None
|
|
281
|
-
model_provider: Optional[str] = None
|
|
282
288
|
run_id: Optional[str] = None
|
|
283
289
|
agent_id: Optional[str] = None
|
|
284
290
|
agent_name: Optional[str] = None
|
|
285
291
|
session_id: Optional[str] = None
|
|
286
|
-
|
|
292
|
+
parent_run_id: Optional[str] = None
|
|
287
293
|
workflow_id: Optional[str] = None
|
|
294
|
+
user_id: Optional[str] = None
|
|
295
|
+
|
|
296
|
+
content: Optional[Any] = None
|
|
297
|
+
content_type: str = "str"
|
|
298
|
+
|
|
299
|
+
reasoning_content: Optional[str] = None
|
|
300
|
+
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
301
|
+
reasoning_messages: Optional[List[Message]] = None
|
|
302
|
+
|
|
303
|
+
model: Optional[str] = None
|
|
304
|
+
model_provider: Optional[str] = None
|
|
305
|
+
messages: Optional[List[Message]] = None
|
|
306
|
+
metrics: Optional[Metrics] = None
|
|
307
|
+
additional_input: Optional[List[Message]] = None
|
|
308
|
+
|
|
288
309
|
tools: Optional[List[ToolExecution]] = None
|
|
289
|
-
|
|
310
|
+
|
|
290
311
|
images: Optional[List[ImageArtifact]] = None # Images attached to the response
|
|
291
312
|
videos: Optional[List[VideoArtifact]] = None # Videos attached to the response
|
|
292
313
|
audio: Optional[List[AudioArtifact]] = None # Audio attached to the response
|
|
293
314
|
response_audio: Optional[AudioResponse] = None # Model audio response
|
|
315
|
+
|
|
294
316
|
citations: Optional[Citations] = None
|
|
295
|
-
|
|
317
|
+
references: Optional[List[MessageReferences]] = None
|
|
318
|
+
|
|
319
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
320
|
+
|
|
296
321
|
created_at: int = field(default_factory=lambda: int(time()))
|
|
297
322
|
|
|
298
|
-
events: Optional[List[
|
|
323
|
+
events: Optional[List[RunOutputEvent]] = None
|
|
299
324
|
|
|
300
325
|
status: RunStatus = RunStatus.running
|
|
301
326
|
|
|
327
|
+
# === FOREIGN KEY RELATIONSHIPS ===
|
|
328
|
+
# These fields establish relationships to parent workflow/step structures
|
|
329
|
+
# and should be treated as foreign keys for data integrity
|
|
330
|
+
workflow_step_id: Optional[str] = None # FK: Points to StepOutput.step_id
|
|
331
|
+
|
|
302
332
|
@property
|
|
303
333
|
def is_paused(self):
|
|
304
334
|
return self.status == RunStatus.paused
|
|
@@ -328,16 +358,23 @@ class RunResponse:
|
|
|
328
358
|
not in [
|
|
329
359
|
"messages",
|
|
330
360
|
"tools",
|
|
331
|
-
"
|
|
361
|
+
"metadata",
|
|
332
362
|
"images",
|
|
333
363
|
"videos",
|
|
334
364
|
"audio",
|
|
335
365
|
"response_audio",
|
|
336
366
|
"citations",
|
|
337
367
|
"events",
|
|
368
|
+
"additional_input",
|
|
369
|
+
"reasoning_steps",
|
|
370
|
+
"reasoning_messages",
|
|
371
|
+
"references",
|
|
338
372
|
]
|
|
339
373
|
}
|
|
340
374
|
|
|
375
|
+
if self.metrics is not None:
|
|
376
|
+
_dict["metrics"] = self.metrics.to_dict() if isinstance(self.metrics, Metrics) else self.metrics
|
|
377
|
+
|
|
341
378
|
if self.events is not None:
|
|
342
379
|
_dict["events"] = [e.to_dict() for e in self.events]
|
|
343
380
|
|
|
@@ -347,10 +384,20 @@ class RunResponse:
|
|
|
347
384
|
if self.messages is not None:
|
|
348
385
|
_dict["messages"] = [m.to_dict() for m in self.messages]
|
|
349
386
|
|
|
350
|
-
if self.
|
|
351
|
-
_dict["
|
|
352
|
-
|
|
353
|
-
|
|
387
|
+
if self.metadata is not None:
|
|
388
|
+
_dict["metadata"] = self.metadata
|
|
389
|
+
|
|
390
|
+
if self.additional_input is not None:
|
|
391
|
+
_dict["additional_input"] = [m.to_dict() for m in self.additional_input]
|
|
392
|
+
|
|
393
|
+
if self.reasoning_messages is not None:
|
|
394
|
+
_dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
|
|
395
|
+
|
|
396
|
+
if self.reasoning_steps is not None:
|
|
397
|
+
_dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
|
|
398
|
+
|
|
399
|
+
if self.references is not None:
|
|
400
|
+
_dict["references"] = [r.model_dump() for r in self.references]
|
|
354
401
|
|
|
355
402
|
if self.images is not None:
|
|
356
403
|
_dict["images"] = []
|
|
@@ -413,9 +460,12 @@ class RunResponse:
|
|
|
413
460
|
return json.dumps(_dict, indent=2)
|
|
414
461
|
|
|
415
462
|
@classmethod
|
|
416
|
-
def from_dict(cls, data: Dict[str, Any]) -> "
|
|
463
|
+
def from_dict(cls, data: Dict[str, Any]) -> "RunOutput":
|
|
464
|
+
if "run" in data:
|
|
465
|
+
data = data.pop("run")
|
|
466
|
+
|
|
417
467
|
events = data.pop("events", None)
|
|
418
|
-
events = [
|
|
468
|
+
events = [run_output_event_from_dict(event) for event in events] if events else None
|
|
419
469
|
|
|
420
470
|
messages = data.pop("messages", None)
|
|
421
471
|
messages = [Message.model_validate(message) for message in messages] if messages else None
|
|
@@ -438,12 +488,30 @@ class RunResponse:
|
|
|
438
488
|
response_audio = data.pop("response_audio", None)
|
|
439
489
|
response_audio = AudioResponse.model_validate(response_audio) if response_audio else None
|
|
440
490
|
|
|
441
|
-
|
|
442
|
-
if
|
|
443
|
-
|
|
491
|
+
metrics = data.pop("metrics", None)
|
|
492
|
+
if metrics:
|
|
493
|
+
metrics = Metrics(**metrics)
|
|
494
|
+
|
|
495
|
+
additional_input = data.pop("additional_input", None)
|
|
496
|
+
|
|
497
|
+
if additional_input is not None:
|
|
498
|
+
additional_input = [Message.model_validate(message) for message in additional_input]
|
|
499
|
+
|
|
500
|
+
reasoning_steps = data.pop("reasoning_steps", None)
|
|
501
|
+
if reasoning_steps is not None:
|
|
502
|
+
reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
|
|
503
|
+
|
|
504
|
+
reasoning_messages = data.pop("reasoning_messages", None)
|
|
505
|
+
if reasoning_messages is not None:
|
|
506
|
+
reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
|
|
507
|
+
|
|
508
|
+
references = data.pop("references", None)
|
|
509
|
+
if references is not None:
|
|
510
|
+
references = [MessageReferences.model_validate(reference) for reference in references]
|
|
444
511
|
|
|
445
512
|
return cls(
|
|
446
513
|
messages=messages,
|
|
514
|
+
metrics=metrics,
|
|
447
515
|
citations=citations,
|
|
448
516
|
tools=tools,
|
|
449
517
|
images=images,
|
|
@@ -451,6 +519,10 @@ class RunResponse:
|
|
|
451
519
|
videos=videos,
|
|
452
520
|
response_audio=response_audio,
|
|
453
521
|
events=events,
|
|
522
|
+
additional_input=additional_input,
|
|
523
|
+
reasoning_steps=reasoning_steps,
|
|
524
|
+
reasoning_messages=reasoning_messages,
|
|
525
|
+
references=references,
|
|
454
526
|
**data,
|
|
455
527
|
)
|
|
456
528
|
|
agno/run/base.py
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
from dataclasses import asdict, dataclass
|
|
2
2
|
from enum import Enum
|
|
3
|
-
from typing import Any, Dict
|
|
3
|
+
from typing import Any, Dict
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel
|
|
6
6
|
|
|
7
7
|
from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
|
|
8
8
|
from agno.models.message import Citations, Message, MessageReferences
|
|
9
|
+
from agno.models.metrics import Metrics
|
|
9
10
|
from agno.models.response import ToolExecution
|
|
10
11
|
from agno.reasoning.step import ReasoningStep
|
|
11
12
|
from agno.utils.log import log_error
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
@dataclass
|
|
15
|
-
class
|
|
16
|
+
class BaseRunOutputEvent:
|
|
16
17
|
def to_dict(self) -> Dict[str, Any]:
|
|
17
18
|
_dict = {
|
|
18
19
|
k: v
|
|
@@ -22,7 +23,7 @@ class BaseRunResponseEvent:
|
|
|
22
23
|
not in [
|
|
23
24
|
"tools",
|
|
24
25
|
"tool",
|
|
25
|
-
"
|
|
26
|
+
"metadata",
|
|
26
27
|
"image",
|
|
27
28
|
"images",
|
|
28
29
|
"videos",
|
|
@@ -30,13 +31,28 @@ class BaseRunResponseEvent:
|
|
|
30
31
|
"response_audio",
|
|
31
32
|
"citations",
|
|
32
33
|
"member_responses",
|
|
34
|
+
"reasoning_messages",
|
|
35
|
+
"reasoning_steps",
|
|
36
|
+
"references",
|
|
37
|
+
"additional_input",
|
|
38
|
+
"metrics",
|
|
33
39
|
]
|
|
34
40
|
}
|
|
35
41
|
|
|
36
|
-
if hasattr(self, "
|
|
37
|
-
_dict["
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
if hasattr(self, "metadata") and self.metadata is not None:
|
|
43
|
+
_dict["metadata"] = self.metadata
|
|
44
|
+
|
|
45
|
+
if hasattr(self, "additional_input") and self.additional_input is not None:
|
|
46
|
+
_dict["additional_input"] = [m.to_dict() for m in self.additional_input]
|
|
47
|
+
|
|
48
|
+
if hasattr(self, "reasoning_messages") and self.reasoning_messages is not None:
|
|
49
|
+
_dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
|
|
50
|
+
|
|
51
|
+
if hasattr(self, "reasoning_steps") and self.reasoning_steps is not None:
|
|
52
|
+
_dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
|
|
53
|
+
|
|
54
|
+
if hasattr(self, "references") and self.references is not None:
|
|
55
|
+
_dict["references"] = [r.model_dump() for r in self.references]
|
|
40
56
|
|
|
41
57
|
if hasattr(self, "member_responses") and self.member_responses:
|
|
42
58
|
_dict["member_responses"] = [response.to_dict() for response in self.member_responses]
|
|
@@ -100,6 +116,9 @@ class BaseRunResponseEvent:
|
|
|
100
116
|
else:
|
|
101
117
|
_dict["tool"] = self.tool
|
|
102
118
|
|
|
119
|
+
if hasattr(self, "metrics") and self.metrics is not None:
|
|
120
|
+
_dict["metrics"] = self.metrics.to_dict()
|
|
121
|
+
|
|
103
122
|
return _dict
|
|
104
123
|
|
|
105
124
|
def to_json(self) -> str:
|
|
@@ -139,13 +158,25 @@ class BaseRunResponseEvent:
|
|
|
139
158
|
if response_audio:
|
|
140
159
|
data["response_audio"] = AudioResponse.model_validate(response_audio)
|
|
141
160
|
|
|
142
|
-
|
|
143
|
-
if
|
|
144
|
-
data["
|
|
161
|
+
additional_input = data.pop("additional_input", None)
|
|
162
|
+
if additional_input is not None:
|
|
163
|
+
data["additional_input"] = [Message.model_validate(message) for message in additional_input]
|
|
145
164
|
|
|
146
|
-
|
|
147
|
-
if
|
|
148
|
-
data.
|
|
165
|
+
reasoning_steps = data.pop("reasoning_steps", None)
|
|
166
|
+
if reasoning_steps is not None:
|
|
167
|
+
data["reasoning_steps"] = [ReasoningStep.model_validate(step) for step in reasoning_steps]
|
|
168
|
+
|
|
169
|
+
reasoning_messages = data.pop("reasoning_messages", None)
|
|
170
|
+
if reasoning_messages is not None:
|
|
171
|
+
data["reasoning_messages"] = [Message.model_validate(message) for message in reasoning_messages]
|
|
172
|
+
|
|
173
|
+
references = data.pop("references", None)
|
|
174
|
+
if references is not None:
|
|
175
|
+
data["references"] = [MessageReferences.model_validate(reference) for reference in references]
|
|
176
|
+
|
|
177
|
+
metrics = data.pop("metrics", None)
|
|
178
|
+
if metrics:
|
|
179
|
+
data["metrics"] = Metrics(**metrics)
|
|
149
180
|
|
|
150
181
|
return cls(**data)
|
|
151
182
|
|
|
@@ -158,51 +189,6 @@ class BaseRunResponseEvent:
|
|
|
158
189
|
return False
|
|
159
190
|
|
|
160
191
|
|
|
161
|
-
@dataclass
|
|
162
|
-
class RunResponseExtraData:
|
|
163
|
-
references: Optional[List[MessageReferences]] = None
|
|
164
|
-
add_messages: Optional[List[Message]] = None
|
|
165
|
-
reasoning_steps: Optional[List[ReasoningStep]] = None
|
|
166
|
-
reasoning_messages: Optional[List[Message]] = None
|
|
167
|
-
|
|
168
|
-
def to_dict(self) -> Dict[str, Any]:
|
|
169
|
-
_dict = {}
|
|
170
|
-
if self.add_messages is not None:
|
|
171
|
-
_dict["add_messages"] = [m.to_dict() for m in self.add_messages]
|
|
172
|
-
if self.reasoning_messages is not None:
|
|
173
|
-
_dict["reasoning_messages"] = [m.to_dict() for m in self.reasoning_messages]
|
|
174
|
-
if self.reasoning_steps is not None:
|
|
175
|
-
_dict["reasoning_steps"] = [rs.model_dump() for rs in self.reasoning_steps]
|
|
176
|
-
if self.references is not None:
|
|
177
|
-
_dict["references"] = [r.model_dump() for r in self.references]
|
|
178
|
-
return _dict
|
|
179
|
-
|
|
180
|
-
@classmethod
|
|
181
|
-
def from_dict(cls, data: Dict[str, Any]) -> "RunResponseExtraData":
|
|
182
|
-
add_messages = data.pop("add_messages", None)
|
|
183
|
-
if add_messages is not None:
|
|
184
|
-
add_messages = [Message.model_validate(message) for message in add_messages]
|
|
185
|
-
|
|
186
|
-
reasoning_steps = data.pop("reasoning_steps", None)
|
|
187
|
-
if reasoning_steps is not None:
|
|
188
|
-
reasoning_steps = [ReasoningStep.model_validate(step) for step in reasoning_steps]
|
|
189
|
-
|
|
190
|
-
reasoning_messages = data.pop("reasoning_messages", None)
|
|
191
|
-
if reasoning_messages is not None:
|
|
192
|
-
reasoning_messages = [Message.model_validate(message) for message in reasoning_messages]
|
|
193
|
-
|
|
194
|
-
references = data.pop("references", None)
|
|
195
|
-
if references is not None:
|
|
196
|
-
references = [MessageReferences.model_validate(reference) for reference in references]
|
|
197
|
-
|
|
198
|
-
return cls(
|
|
199
|
-
add_messages=add_messages,
|
|
200
|
-
reasoning_steps=reasoning_steps,
|
|
201
|
-
reasoning_messages=reasoning_messages,
|
|
202
|
-
references=references,
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
|
|
206
192
|
class RunStatus(str, Enum):
|
|
207
193
|
"""State of the main run response"""
|
|
208
194
|
|
agno/run/cancel.py
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Run cancellation management."""
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
from typing import Dict
|
|
5
|
+
|
|
6
|
+
from agno.exceptions import RunCancelledException
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunCancellationManager:
|
|
11
|
+
"""Manages cancellation state for agent runs."""
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
self._cancelled_runs: Dict[str, bool] = {}
|
|
15
|
+
self._lock = threading.Lock()
|
|
16
|
+
|
|
17
|
+
def register_run(self, run_id: str) -> None:
|
|
18
|
+
"""Register a new run as not cancelled."""
|
|
19
|
+
with self._lock:
|
|
20
|
+
self._cancelled_runs[run_id] = False
|
|
21
|
+
logger.debug(f"Registered run {run_id} for cancellation tracking")
|
|
22
|
+
|
|
23
|
+
def cancel_run(self, run_id: str) -> bool:
|
|
24
|
+
"""Cancel a run by marking it as cancelled.
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
bool: True if run was found and cancelled, False if run not found.
|
|
28
|
+
"""
|
|
29
|
+
with self._lock:
|
|
30
|
+
if run_id in self._cancelled_runs:
|
|
31
|
+
self._cancelled_runs[run_id] = True
|
|
32
|
+
logger.info(f"Run {run_id} marked for cancellation")
|
|
33
|
+
return True
|
|
34
|
+
else:
|
|
35
|
+
logger.warning(f"Attempted to cancel unknown run {run_id}")
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
def is_cancelled(self, run_id: str) -> bool:
|
|
39
|
+
"""Check if a run is cancelled."""
|
|
40
|
+
with self._lock:
|
|
41
|
+
return self._cancelled_runs.get(run_id, False)
|
|
42
|
+
|
|
43
|
+
def cleanup_run(self, run_id: str) -> None:
|
|
44
|
+
"""Remove a run from tracking (called when run completes)."""
|
|
45
|
+
with self._lock:
|
|
46
|
+
if run_id in self._cancelled_runs:
|
|
47
|
+
del self._cancelled_runs[run_id]
|
|
48
|
+
logger.debug(f"Cleaned up cancellation tracking for run {run_id}")
|
|
49
|
+
|
|
50
|
+
def raise_if_cancelled(self, run_id: str) -> None:
|
|
51
|
+
"""Check if a run should be cancelled and raise exception if so."""
|
|
52
|
+
if self.is_cancelled(run_id):
|
|
53
|
+
logger.info(f"Cancelling run {run_id}")
|
|
54
|
+
raise RunCancelledException(f"Run {run_id} was cancelled")
|
|
55
|
+
|
|
56
|
+
def get_active_runs(self) -> Dict[str, bool]:
|
|
57
|
+
"""Get all currently tracked runs and their cancellation status."""
|
|
58
|
+
with self._lock:
|
|
59
|
+
return self._cancelled_runs.copy()
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# Global cancellation manager instance
|
|
63
|
+
_cancellation_manager = RunCancellationManager()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def register_run(run_id: str) -> None:
|
|
67
|
+
"""Register a new run for cancellation tracking."""
|
|
68
|
+
_cancellation_manager.register_run(run_id)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def cancel_run(run_id: str) -> bool:
|
|
72
|
+
"""Cancel a run."""
|
|
73
|
+
return _cancellation_manager.cancel_run(run_id)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def cleanup_run(run_id: str) -> None:
|
|
77
|
+
"""Clean up cancellation tracking for a completed run."""
|
|
78
|
+
_cancellation_manager.cleanup_run(run_id)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def raise_if_cancelled(run_id: str) -> None:
|
|
82
|
+
"""Check if a run should be cancelled and raise exception if so."""
|
|
83
|
+
_cancellation_manager.raise_if_cancelled(run_id)
|