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/app/playground/deploy.py
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import tarfile
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
from typing import List, Optional, cast
|
|
4
|
-
|
|
5
|
-
from rich import box
|
|
6
|
-
from rich.panel import Panel
|
|
7
|
-
from rich.text import Text
|
|
8
|
-
|
|
9
|
-
from agno.api.playground import deploy_playground_archive
|
|
10
|
-
from agno.cli.settings import agno_cli_settings
|
|
11
|
-
from agno.utils.log import logger
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def create_deployment_info(
|
|
15
|
-
app: str, root: Path, elapsed_time: str = "[waiting...]", status: Optional[str] = None, error: Optional[str] = None
|
|
16
|
-
) -> Text:
|
|
17
|
-
"""Create a formatted text display showing deployment information.
|
|
18
|
-
|
|
19
|
-
Args:
|
|
20
|
-
app (str): The name of the application being deployed
|
|
21
|
-
root (Path): The path to the root directory
|
|
22
|
-
elapsed_time (str): The elapsed deployment time. Defaults to "[waiting...]"
|
|
23
|
-
status (Optional[str]): The current deployment status. Defaults to None
|
|
24
|
-
error (Optional[str]): The deployment error message. Defaults to None
|
|
25
|
-
|
|
26
|
-
Returns:
|
|
27
|
-
Text: A Rich Text object containing formatted deployment information
|
|
28
|
-
"""
|
|
29
|
-
# Base info always shown
|
|
30
|
-
elements = [
|
|
31
|
-
("📦 App: ", "bold"),
|
|
32
|
-
(f"{app}\n", "cyan"),
|
|
33
|
-
("📂 Root: ", "bold"),
|
|
34
|
-
(f"{root}\n", "cyan"),
|
|
35
|
-
("⏱️ Time: ", "bold"),
|
|
36
|
-
(f"{elapsed_time}\n", "yellow"),
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
# Add either status or error, not both
|
|
40
|
-
if error is not None:
|
|
41
|
-
elements.extend(
|
|
42
|
-
[
|
|
43
|
-
("🚨 Error: ", "bold"),
|
|
44
|
-
(f"{error}", "red"),
|
|
45
|
-
]
|
|
46
|
-
)
|
|
47
|
-
elif status is not None:
|
|
48
|
-
elements.extend(
|
|
49
|
-
[
|
|
50
|
-
("🚧 Status: ", "bold"),
|
|
51
|
-
(f"{status}", "yellow"),
|
|
52
|
-
]
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
return Text.assemble(*elements)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def create_info_panel(deployment_info: Text) -> Panel:
|
|
59
|
-
"""Create a formatted panel to display deployment information.
|
|
60
|
-
|
|
61
|
-
Args:
|
|
62
|
-
deployment_info (Text): The Rich Text object containing deployment information
|
|
63
|
-
|
|
64
|
-
Returns:
|
|
65
|
-
Panel: A Rich Panel object containing the formatted deployment information
|
|
66
|
-
"""
|
|
67
|
-
return Panel(
|
|
68
|
-
deployment_info,
|
|
69
|
-
title="[bold green]🚀 Deploying Playground App[/bold green]",
|
|
70
|
-
border_style="cyan",
|
|
71
|
-
box=box.HEAVY,
|
|
72
|
-
padding=(1, 2),
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def create_error_panel(deployment_info: Text) -> Panel:
|
|
77
|
-
"""Create a formatted panel to display deployment error information.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
deployment_info (Text): The Rich Text object containing deployment error information
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
Panel: A Rich Panel object containing the formatted deployment error information
|
|
84
|
-
"""
|
|
85
|
-
return Panel(
|
|
86
|
-
deployment_info,
|
|
87
|
-
title="[bold red]🚨 Deployment Failed[/bold red]",
|
|
88
|
-
border_style="red",
|
|
89
|
-
box=box.HEAVY,
|
|
90
|
-
padding=(1, 2),
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def create_tar_archive(root: Path) -> Path:
|
|
95
|
-
"""Create a gzipped tar archive of the playground files.
|
|
96
|
-
|
|
97
|
-
Args:
|
|
98
|
-
root (Path): The path to the directory to be archived
|
|
99
|
-
|
|
100
|
-
Returns:
|
|
101
|
-
Path: The path to the created tar archive
|
|
102
|
-
|
|
103
|
-
Raises:
|
|
104
|
-
Exception: If archive creation fails
|
|
105
|
-
"""
|
|
106
|
-
tar_path = root.with_suffix(".tar.gz")
|
|
107
|
-
try:
|
|
108
|
-
logger.debug(f"Creating playground archive: {tar_path.name}")
|
|
109
|
-
with tarfile.open(tar_path, "w:gz") as tar:
|
|
110
|
-
tar.add(root, arcname=root.name)
|
|
111
|
-
logger.debug(f"Successfully created playground archive: {tar_path.name}")
|
|
112
|
-
return tar_path
|
|
113
|
-
except Exception as e:
|
|
114
|
-
logger.error(f"Failed to create playground archive: {e}")
|
|
115
|
-
raise
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def deploy_archive(name: str, tar_path: Path) -> None:
|
|
119
|
-
"""Deploying the tar archive to agno-cloud.
|
|
120
|
-
|
|
121
|
-
Args:
|
|
122
|
-
name (str): The name of the playground app
|
|
123
|
-
tar_path (Path): The path to the tar archive to be deployed
|
|
124
|
-
|
|
125
|
-
Raises:
|
|
126
|
-
Exception: If the deployment process fails
|
|
127
|
-
"""
|
|
128
|
-
try:
|
|
129
|
-
logger.debug(f"Deploying playground archive: {tar_path.name}")
|
|
130
|
-
deploy_playground_archive(name=name, tar_path=tar_path)
|
|
131
|
-
logger.debug(f"Successfully deployed playground archive: {tar_path.name}")
|
|
132
|
-
except Exception:
|
|
133
|
-
raise
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def cleanup_archive(tar_path: Path) -> None:
|
|
137
|
-
"""Delete the temporary tar archive after deployment.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
tar_path (Path): The path to the tar archive to be deleted
|
|
141
|
-
|
|
142
|
-
Raises:
|
|
143
|
-
Exception: If the deletion process fails
|
|
144
|
-
"""
|
|
145
|
-
try:
|
|
146
|
-
logger.debug(f"Deleting playground archive: {tar_path.name}")
|
|
147
|
-
tar_path.unlink()
|
|
148
|
-
logger.debug(f"Successfully deleted playground archive: {tar_path.name}")
|
|
149
|
-
except Exception as e:
|
|
150
|
-
logger.error(f"Failed to delete playground archive: {e}")
|
|
151
|
-
raise
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
def deploy_playground_app(
|
|
155
|
-
app: str,
|
|
156
|
-
name: str,
|
|
157
|
-
root: Optional[Path] = None,
|
|
158
|
-
) -> None:
|
|
159
|
-
"""Deploy a playground application to agno-cloud.
|
|
160
|
-
|
|
161
|
-
This function:
|
|
162
|
-
1. Creates a tar archive of the root directory.
|
|
163
|
-
2. Uploades the archive to agno-cloud.
|
|
164
|
-
3. Cleaning up temporary files.
|
|
165
|
-
4. Displaying real-time progress updates.
|
|
166
|
-
|
|
167
|
-
Args:
|
|
168
|
-
app (str): The application to deploy as a string identifier.
|
|
169
|
-
It should be the name of the module containing the Playground app from the root path.
|
|
170
|
-
name (str): The name of the playground app.
|
|
171
|
-
root (Optional[Path]): The root path containing the application files. Defaults to the current working directory.
|
|
172
|
-
|
|
173
|
-
Raises:
|
|
174
|
-
Exception: If any step of the deployment process fails
|
|
175
|
-
"""
|
|
176
|
-
|
|
177
|
-
agno_cli_settings.gate_alpha_feature()
|
|
178
|
-
|
|
179
|
-
from rich.console import Group
|
|
180
|
-
from rich.live import Live
|
|
181
|
-
from rich.status import Status
|
|
182
|
-
|
|
183
|
-
from agno.utils.timer import Timer
|
|
184
|
-
|
|
185
|
-
if app is None:
|
|
186
|
-
raise ValueError("PlaygroundApp is required")
|
|
187
|
-
|
|
188
|
-
if name is None:
|
|
189
|
-
raise ValueError("PlaygroundApp name is required")
|
|
190
|
-
|
|
191
|
-
with Live(refresh_per_second=4) as live_display:
|
|
192
|
-
response_timer = Timer()
|
|
193
|
-
response_timer.start()
|
|
194
|
-
root = root or Path.cwd()
|
|
195
|
-
root = cast(Path, root)
|
|
196
|
-
try:
|
|
197
|
-
deployment_info = create_deployment_info(app=app, root=root, status="Initializing...")
|
|
198
|
-
panels: List[Panel] = [create_info_panel(deployment_info=deployment_info)]
|
|
199
|
-
|
|
200
|
-
status = Status(
|
|
201
|
-
"[bold blue]Initializing playground...[/bold blue]",
|
|
202
|
-
spinner="aesthetic",
|
|
203
|
-
speed=2,
|
|
204
|
-
)
|
|
205
|
-
panels.append(status) # type: ignore
|
|
206
|
-
live_display.update(Group(*panels))
|
|
207
|
-
|
|
208
|
-
# Step 1: Create archive
|
|
209
|
-
status.update("[bold blue]Creating playground archive...[/bold blue]")
|
|
210
|
-
tar_path = create_tar_archive(root=root)
|
|
211
|
-
panels[0] = create_info_panel(
|
|
212
|
-
create_deployment_info(
|
|
213
|
-
app=app, root=root, elapsed_time=f"{response_timer.elapsed:.1f}s", status="Creating archive..."
|
|
214
|
-
)
|
|
215
|
-
)
|
|
216
|
-
live_display.update(Group(*panels))
|
|
217
|
-
|
|
218
|
-
# Step 2: Upload archive
|
|
219
|
-
status.update("[bold blue]Uploading playground archive...[/bold blue]")
|
|
220
|
-
deploy_archive(name=name, tar_path=tar_path)
|
|
221
|
-
panels[0] = create_info_panel(
|
|
222
|
-
create_deployment_info(
|
|
223
|
-
app=app, root=root, elapsed_time=f"{response_timer.elapsed:.1f}s", status="Uploading archive..."
|
|
224
|
-
)
|
|
225
|
-
)
|
|
226
|
-
live_display.update(Group(*panels))
|
|
227
|
-
|
|
228
|
-
# Step 3: Cleanup
|
|
229
|
-
status.update("[bold blue]Deleting playground archive...[/bold blue]")
|
|
230
|
-
cleanup_archive(tar_path)
|
|
231
|
-
panels[0] = create_info_panel(
|
|
232
|
-
create_deployment_info(
|
|
233
|
-
app=app, root=root, elapsed_time=f"{response_timer.elapsed:.1f}s", status="Deleting archive..."
|
|
234
|
-
)
|
|
235
|
-
)
|
|
236
|
-
live_display.update(Group(*panels))
|
|
237
|
-
|
|
238
|
-
# Final display update
|
|
239
|
-
status.stop()
|
|
240
|
-
panels.pop()
|
|
241
|
-
live_display.update(Group(*panels))
|
|
242
|
-
except Exception as e:
|
|
243
|
-
status.update(f"[bold red]Deployment failed: {str(e)}[/bold red]")
|
|
244
|
-
panels[0] = create_error_panel(
|
|
245
|
-
create_deployment_info(app=app, root=root, elapsed_time=f"{response_timer.elapsed:.1f}s", error=str(e))
|
|
246
|
-
)
|
|
247
|
-
status.stop()
|
|
248
|
-
panels.pop()
|
|
249
|
-
live_display.update(Group(*panels))
|
agno/app/playground/operator.py
DELETED
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
from typing import Any, List, Optional, Union, cast
|
|
2
|
-
|
|
3
|
-
from agno.agent.agent import Agent, AgentRun, Function, Toolkit
|
|
4
|
-
from agno.run.response import RunResponse
|
|
5
|
-
from agno.run.team import TeamRunResponse
|
|
6
|
-
from agno.storage.session.agent import AgentSession
|
|
7
|
-
from agno.storage.session.team import TeamSession
|
|
8
|
-
from agno.storage.session.workflow import WorkflowSession
|
|
9
|
-
from agno.team.team import Team
|
|
10
|
-
from agno.utils.log import logger
|
|
11
|
-
from agno.workflow.workflow import Workflow
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def format_tools(agent_tools):
|
|
15
|
-
formatted_tools = []
|
|
16
|
-
if agent_tools is not None:
|
|
17
|
-
for tool in agent_tools:
|
|
18
|
-
if isinstance(tool, dict):
|
|
19
|
-
formatted_tools.append(tool)
|
|
20
|
-
elif isinstance(tool, Toolkit):
|
|
21
|
-
for _, f in tool.functions.items():
|
|
22
|
-
formatted_tools.append(f.to_dict())
|
|
23
|
-
elif isinstance(tool, Function):
|
|
24
|
-
formatted_tools.append(tool.to_dict())
|
|
25
|
-
elif callable(tool):
|
|
26
|
-
func = Function.from_callable(tool)
|
|
27
|
-
formatted_tools.append(func.to_dict())
|
|
28
|
-
else:
|
|
29
|
-
logger.warning(f"Unknown tool type: {type(tool)}")
|
|
30
|
-
return formatted_tools
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def get_agent_by_id(agent_id: str, agents: Optional[List[Agent]] = None) -> Optional[Agent]:
|
|
34
|
-
if agent_id is None or agents is None:
|
|
35
|
-
return None
|
|
36
|
-
|
|
37
|
-
for agent in agents:
|
|
38
|
-
if agent.agent_id == agent_id:
|
|
39
|
-
return agent
|
|
40
|
-
return None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def get_session_title(session: Union[AgentSession, TeamSession]) -> str:
|
|
44
|
-
if session is None:
|
|
45
|
-
return "Unnamed session"
|
|
46
|
-
session_name = session.session_data.get("session_name") if session.session_data is not None else None
|
|
47
|
-
if session_name is not None:
|
|
48
|
-
return session_name
|
|
49
|
-
memory = session.memory
|
|
50
|
-
if memory is not None:
|
|
51
|
-
# Proxy for knowing it is legacy memory implementation
|
|
52
|
-
runs = memory.get("runs")
|
|
53
|
-
runs = cast(List[Any], runs)
|
|
54
|
-
|
|
55
|
-
for _run in runs:
|
|
56
|
-
try:
|
|
57
|
-
if "response" in _run:
|
|
58
|
-
run_parsed = AgentRun.model_validate(_run)
|
|
59
|
-
if run_parsed.message is not None and run_parsed.message.role == "user":
|
|
60
|
-
content = run_parsed.message.get_content_string()
|
|
61
|
-
if content:
|
|
62
|
-
return content
|
|
63
|
-
else:
|
|
64
|
-
return "No title"
|
|
65
|
-
else:
|
|
66
|
-
if "agent_id" in _run:
|
|
67
|
-
run_response_parsed = RunResponse.from_dict(_run)
|
|
68
|
-
else:
|
|
69
|
-
run_response_parsed = TeamRunResponse.from_dict(_run) # type: ignore
|
|
70
|
-
if run_response_parsed.messages is not None and len(run_response_parsed.messages) > 0:
|
|
71
|
-
for msg in run_response_parsed.messages:
|
|
72
|
-
if msg.role == "user":
|
|
73
|
-
content = msg.get_content_string()
|
|
74
|
-
if content:
|
|
75
|
-
return content
|
|
76
|
-
|
|
77
|
-
except Exception as e:
|
|
78
|
-
import traceback
|
|
79
|
-
|
|
80
|
-
traceback.print_exc(limit=3)
|
|
81
|
-
|
|
82
|
-
logger.error(f"Error parsing chat: {e}")
|
|
83
|
-
|
|
84
|
-
return "Unnamed session"
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def get_session_title_from_workflow_session(workflow_session: WorkflowSession) -> str:
|
|
88
|
-
if workflow_session is None:
|
|
89
|
-
return "Unnamed session"
|
|
90
|
-
session_name = (
|
|
91
|
-
workflow_session.session_data.get("session_name") if workflow_session.session_data is not None else None
|
|
92
|
-
)
|
|
93
|
-
if session_name is not None:
|
|
94
|
-
return session_name
|
|
95
|
-
if hasattr(workflow_session, "memory"):
|
|
96
|
-
memory = workflow_session.memory
|
|
97
|
-
if memory is not None:
|
|
98
|
-
runs = memory.get("runs")
|
|
99
|
-
runs = cast(List[Any], runs)
|
|
100
|
-
for _run in runs:
|
|
101
|
-
try:
|
|
102
|
-
# Try to get content directly from the run first (workflow structure)
|
|
103
|
-
content = _run.get("content")
|
|
104
|
-
if content:
|
|
105
|
-
# Split content by newlines and take first line, but limit to 100 chars
|
|
106
|
-
first_line = content.split("\n")[0]
|
|
107
|
-
return first_line[:100] + "..." if len(first_line) > 100 else first_line
|
|
108
|
-
|
|
109
|
-
# Fallback to response.content structure (if it exists)
|
|
110
|
-
response = _run.get("response")
|
|
111
|
-
if response:
|
|
112
|
-
content = response.get("content")
|
|
113
|
-
if content:
|
|
114
|
-
# Split content by newlines and take first line, but limit to 100 chars
|
|
115
|
-
first_line = content.split("\n")[0]
|
|
116
|
-
return first_line[:100] + "..." if len(first_line) > 100 else first_line
|
|
117
|
-
|
|
118
|
-
except Exception as e:
|
|
119
|
-
logger.error(f"Error parsing workflow session: {e}")
|
|
120
|
-
if hasattr(workflow_session, "runs"):
|
|
121
|
-
if workflow_session.runs is not None and len(workflow_session.runs) > 0:
|
|
122
|
-
for _run in workflow_session.runs:
|
|
123
|
-
if _run.content:
|
|
124
|
-
return _run.content[:100] + "..." if len(_run.content) > 100 else _run.content
|
|
125
|
-
return "Unnamed session"
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
def get_workflow_by_id(workflow_id: str, workflows: Optional[List[Workflow]] = None) -> Optional[Workflow]:
|
|
129
|
-
if workflows is None or workflow_id is None:
|
|
130
|
-
return None
|
|
131
|
-
|
|
132
|
-
for workflow in workflows:
|
|
133
|
-
if workflow.workflow_id == workflow_id:
|
|
134
|
-
return workflow
|
|
135
|
-
return None
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def get_team_by_id(team_id: str, teams: Optional[List[Team]] = None) -> Optional[Team]:
|
|
139
|
-
if teams is None or team_id is None:
|
|
140
|
-
return None
|
|
141
|
-
|
|
142
|
-
for team in teams:
|
|
143
|
-
if team.team_id == team_id:
|
|
144
|
-
return team
|
|
145
|
-
return None
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
def get_session_title_from_team_session(team_session: TeamSession) -> str:
|
|
149
|
-
if team_session is None:
|
|
150
|
-
return "Unnamed session"
|
|
151
|
-
session_name = team_session.session_data.get("session_name") if team_session.session_data is not None else None
|
|
152
|
-
if session_name is not None:
|
|
153
|
-
return session_name
|
|
154
|
-
memory = team_session.memory
|
|
155
|
-
if memory is not None:
|
|
156
|
-
runs = memory.get("runs")
|
|
157
|
-
runs = cast(List[Any], runs)
|
|
158
|
-
|
|
159
|
-
for _run in runs:
|
|
160
|
-
try:
|
|
161
|
-
if "response" in _run:
|
|
162
|
-
run_parsed = AgentRun.model_validate(_run)
|
|
163
|
-
if run_parsed.message is not None and run_parsed.message.role == "user":
|
|
164
|
-
content = run_parsed.message.get_content_string()
|
|
165
|
-
if content:
|
|
166
|
-
return content
|
|
167
|
-
else:
|
|
168
|
-
return "No title"
|
|
169
|
-
else:
|
|
170
|
-
if "agent_id" in _run:
|
|
171
|
-
run_response_parsed = RunResponse.from_dict(_run)
|
|
172
|
-
else:
|
|
173
|
-
run_response_parsed = TeamRunResponse.from_dict(_run) # type: ignore
|
|
174
|
-
if run_response_parsed.messages is not None and len(run_response_parsed.messages) > 0:
|
|
175
|
-
for msg in run_response_parsed.messages:
|
|
176
|
-
if msg.role == "user":
|
|
177
|
-
content = msg.get_content_string()
|
|
178
|
-
if content:
|
|
179
|
-
return content
|
|
180
|
-
|
|
181
|
-
except Exception as e:
|
|
182
|
-
logger.error(f"Error parsing chat: {e}")
|
|
183
|
-
return "Unnamed session"
|
agno/app/playground/schemas.py
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
from datetime import datetime
|
|
2
|
-
from typing import Any, Callable, Dict, List, Optional, Union
|
|
3
|
-
from uuid import uuid4
|
|
4
|
-
|
|
5
|
-
from fastapi import UploadFile
|
|
6
|
-
from pydantic import BaseModel
|
|
7
|
-
|
|
8
|
-
from agno.agent import Agent
|
|
9
|
-
from agno.app.playground.operator import format_tools
|
|
10
|
-
from agno.memory.agent import AgentMemory
|
|
11
|
-
from agno.memory.team import TeamMemory
|
|
12
|
-
from agno.memory.v2 import Memory
|
|
13
|
-
from agno.team import Team
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class AgentModel(BaseModel):
|
|
17
|
-
name: Optional[str] = None
|
|
18
|
-
model: Optional[str] = None
|
|
19
|
-
provider: Optional[str] = None
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class AgentGetResponse(BaseModel):
|
|
23
|
-
agent_id: Optional[str] = None
|
|
24
|
-
name: Optional[str] = None
|
|
25
|
-
model: Optional[AgentModel] = None
|
|
26
|
-
add_context: Optional[bool] = None
|
|
27
|
-
tools: Optional[List[Dict[str, Any]]] = None
|
|
28
|
-
memory: Optional[Dict[str, Any]] = None
|
|
29
|
-
storage: Optional[Dict[str, Any]] = None
|
|
30
|
-
knowledge: Optional[Dict[str, Any]] = None
|
|
31
|
-
description: Optional[str] = None
|
|
32
|
-
instructions: Optional[Union[List[str], str, Callable]] = None
|
|
33
|
-
|
|
34
|
-
@classmethod
|
|
35
|
-
def from_agent(self, agent: Agent, async_mode: bool = False) -> "AgentGetResponse":
|
|
36
|
-
if agent.memory:
|
|
37
|
-
memory_dict: Optional[Dict[str, Any]] = {}
|
|
38
|
-
if isinstance(agent.memory, AgentMemory) and agent.memory.db:
|
|
39
|
-
memory_dict = {"name": agent.memory.db.__class__.__name__}
|
|
40
|
-
elif isinstance(agent.memory, Memory) and agent.memory.db:
|
|
41
|
-
memory_dict = {"name": "Memory"}
|
|
42
|
-
if agent.memory.model is not None:
|
|
43
|
-
memory_dict["model"] = AgentModel(
|
|
44
|
-
name=agent.memory.model.name,
|
|
45
|
-
model=agent.memory.model.id,
|
|
46
|
-
provider=agent.memory.model.provider,
|
|
47
|
-
)
|
|
48
|
-
if agent.memory.db is not None:
|
|
49
|
-
memory_dict["db"] = agent.memory.db.__dict__() # type: ignore
|
|
50
|
-
|
|
51
|
-
else:
|
|
52
|
-
memory_dict = None
|
|
53
|
-
else:
|
|
54
|
-
memory_dict = None
|
|
55
|
-
tools = agent.get_tools(session_id=str(uuid4()), async_mode=async_mode)
|
|
56
|
-
return AgentGetResponse(
|
|
57
|
-
agent_id=agent.agent_id,
|
|
58
|
-
name=agent.name,
|
|
59
|
-
model=AgentModel(
|
|
60
|
-
name=agent.model.name or agent.model.__class__.__name__ if agent.model else None,
|
|
61
|
-
model=agent.model.id if agent.model else None,
|
|
62
|
-
provider=agent.model.provider or agent.model.__class__.__name__ if agent.model else None,
|
|
63
|
-
),
|
|
64
|
-
add_context=agent.add_context,
|
|
65
|
-
tools=format_tools(tools) if tools else None,
|
|
66
|
-
memory=memory_dict,
|
|
67
|
-
storage={"name": agent.storage.__class__.__name__} if agent.storage else None,
|
|
68
|
-
knowledge={"name": agent.knowledge.__class__.__name__} if agent.knowledge else None,
|
|
69
|
-
description=agent.description,
|
|
70
|
-
instructions=agent.instructions,
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
class AgentRunRequest(BaseModel):
|
|
75
|
-
message: str
|
|
76
|
-
agent_id: str
|
|
77
|
-
stream: bool = True
|
|
78
|
-
monitor: bool = False
|
|
79
|
-
session_id: Optional[str] = None
|
|
80
|
-
user_id: Optional[str] = None
|
|
81
|
-
files: Optional[List[UploadFile]] = None
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class AgentRenameRequest(BaseModel):
|
|
85
|
-
name: str
|
|
86
|
-
user_id: str
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class AgentSessionsResponse(BaseModel):
|
|
90
|
-
title: Optional[str] = None
|
|
91
|
-
session_id: Optional[str] = None
|
|
92
|
-
session_name: Optional[str] = None
|
|
93
|
-
created_at: Optional[int] = None
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
class MemoryResponse(BaseModel):
|
|
97
|
-
memory: str
|
|
98
|
-
topics: Optional[List[str]] = None
|
|
99
|
-
last_updated: Optional[datetime] = None
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
class WorkflowRenameRequest(BaseModel):
|
|
103
|
-
name: str
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
class WorkflowRunRequest(BaseModel):
|
|
107
|
-
input: Dict[str, Any]
|
|
108
|
-
user_id: Optional[str] = None
|
|
109
|
-
session_id: Optional[str] = None
|
|
110
|
-
stream: bool = True
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
class WorkflowSessionResponse(BaseModel):
|
|
114
|
-
title: Optional[str] = None
|
|
115
|
-
session_id: Optional[str] = None
|
|
116
|
-
session_name: Optional[str] = None
|
|
117
|
-
created_at: Optional[int] = None
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
class WorkflowGetResponse(BaseModel):
|
|
121
|
-
workflow_id: str
|
|
122
|
-
name: Optional[str] = None
|
|
123
|
-
description: Optional[str] = None
|
|
124
|
-
parameters: Optional[Dict[str, Any]] = None
|
|
125
|
-
storage: Optional[str] = None
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
class WorkflowsGetResponse(BaseModel):
|
|
129
|
-
workflow_id: str
|
|
130
|
-
name: str
|
|
131
|
-
description: Optional[str] = None
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
class TeamModel(BaseModel):
|
|
135
|
-
name: Optional[str] = None
|
|
136
|
-
model: Optional[str] = None
|
|
137
|
-
provider: Optional[str] = None
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
class TeamGetResponse(BaseModel):
|
|
141
|
-
team_id: Optional[str] = None
|
|
142
|
-
name: Optional[str] = None
|
|
143
|
-
description: Optional[str] = None
|
|
144
|
-
mode: Optional[str] = None
|
|
145
|
-
model: Optional[TeamModel] = None
|
|
146
|
-
success_criteria: Optional[str] = None
|
|
147
|
-
instructions: Optional[Union[List[str], str, Callable]] = None
|
|
148
|
-
members: Optional[List[Union[AgentGetResponse, "TeamGetResponse"]]] = None
|
|
149
|
-
expected_output: Optional[str] = None
|
|
150
|
-
context: Optional[str] = None
|
|
151
|
-
enable_agentic_context: Optional[bool] = None
|
|
152
|
-
storage: Optional[Dict[str, Any]] = None
|
|
153
|
-
memory: Optional[Dict[str, Any]] = None
|
|
154
|
-
async_mode: bool = False
|
|
155
|
-
|
|
156
|
-
@classmethod
|
|
157
|
-
def from_team(self, team: Team, async_mode: bool = False) -> "TeamGetResponse":
|
|
158
|
-
import json
|
|
159
|
-
|
|
160
|
-
memory_dict: Optional[Dict[str, Any]] = {}
|
|
161
|
-
if isinstance(team.memory, Memory):
|
|
162
|
-
memory_dict = {"name": "Memory"}
|
|
163
|
-
if team.memory.model is not None:
|
|
164
|
-
memory_dict["model"] = AgentModel(
|
|
165
|
-
name=team.memory.model.name,
|
|
166
|
-
model=team.memory.model.id,
|
|
167
|
-
provider=team.memory.model.provider,
|
|
168
|
-
)
|
|
169
|
-
if team.memory.db is not None:
|
|
170
|
-
memory_dict["db"] = team.memory.db.__dict__() # type: ignore
|
|
171
|
-
elif isinstance(team.memory, TeamMemory):
|
|
172
|
-
memory_dict = {"name": team.memory.db.__class__.__name__}
|
|
173
|
-
else:
|
|
174
|
-
memory_dict = None
|
|
175
|
-
|
|
176
|
-
return TeamGetResponse(
|
|
177
|
-
team_id=team.team_id,
|
|
178
|
-
name=team.name,
|
|
179
|
-
model=TeamModel(
|
|
180
|
-
name=team.model.name or team.model.__class__.__name__ if team.model else None,
|
|
181
|
-
model=team.model.id if team.model else None,
|
|
182
|
-
provider=team.model.provider or team.model.__class__.__name__ if team.model else None,
|
|
183
|
-
),
|
|
184
|
-
success_criteria=team.success_criteria,
|
|
185
|
-
instructions=team.instructions,
|
|
186
|
-
description=team.description,
|
|
187
|
-
expected_output=team.expected_output,
|
|
188
|
-
context=json.dumps(team.context) if isinstance(team.context, dict) else team.context,
|
|
189
|
-
enable_agentic_context=team.enable_agentic_context,
|
|
190
|
-
mode=team.mode,
|
|
191
|
-
storage={"name": team.storage.__class__.__name__} if team.storage else None,
|
|
192
|
-
memory=memory_dict,
|
|
193
|
-
members=[
|
|
194
|
-
AgentGetResponse.from_agent(member, async_mode=async_mode)
|
|
195
|
-
if isinstance(member, Agent)
|
|
196
|
-
else TeamGetResponse.from_team(member, async_mode=async_mode)
|
|
197
|
-
if isinstance(member, Team)
|
|
198
|
-
else None
|
|
199
|
-
for member in team.members
|
|
200
|
-
],
|
|
201
|
-
)
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
class TeamRunRequest(BaseModel):
|
|
205
|
-
input: Dict[str, Any]
|
|
206
|
-
user_id: Optional[str] = None
|
|
207
|
-
session_id: Optional[str] = None
|
|
208
|
-
files: Optional[List[UploadFile]] = None
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
class TeamSessionResponse(BaseModel):
|
|
212
|
-
title: Optional[str] = None
|
|
213
|
-
session_id: Optional[str] = None
|
|
214
|
-
session_name: Optional[str] = None
|
|
215
|
-
created_at: Optional[int] = None
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
class TeamRenameRequest(BaseModel):
|
|
219
|
-
name: str
|
|
220
|
-
user_id: str
|