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/embedder/openai.py
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
3
|
-
|
|
4
|
-
from typing_extensions import Literal
|
|
5
|
-
|
|
6
|
-
from agno.embedder.base import Embedder
|
|
7
|
-
from agno.utils.log import logger
|
|
8
|
-
|
|
9
|
-
try:
|
|
10
|
-
from openai import OpenAI as OpenAIClient
|
|
11
|
-
from openai.types.create_embedding_response import CreateEmbeddingResponse
|
|
12
|
-
except ImportError:
|
|
13
|
-
raise ImportError("`openai` not installed")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@dataclass
|
|
17
|
-
class OpenAIEmbedder(Embedder):
|
|
18
|
-
id: str = "text-embedding-3-small"
|
|
19
|
-
dimensions: Optional[int] = None
|
|
20
|
-
encoding_format: Literal["float", "base64"] = "float"
|
|
21
|
-
user: Optional[str] = None
|
|
22
|
-
api_key: Optional[str] = None
|
|
23
|
-
organization: Optional[str] = None
|
|
24
|
-
base_url: Optional[str] = None
|
|
25
|
-
request_params: Optional[Dict[str, Any]] = None
|
|
26
|
-
client_params: Optional[Dict[str, Any]] = None
|
|
27
|
-
openai_client: Optional[OpenAIClient] = None
|
|
28
|
-
|
|
29
|
-
def __post_init__(self):
|
|
30
|
-
if self.dimensions is None:
|
|
31
|
-
self.dimensions = 3072 if self.id == "text-embedding-3-large" else 1536
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def client(self) -> OpenAIClient:
|
|
35
|
-
if self.openai_client:
|
|
36
|
-
return self.openai_client
|
|
37
|
-
|
|
38
|
-
_client_params: Dict[str, Any] = {
|
|
39
|
-
"api_key": self.api_key,
|
|
40
|
-
"organization": self.organization,
|
|
41
|
-
"base_url": self.base_url,
|
|
42
|
-
}
|
|
43
|
-
_client_params = {k: v for k, v in _client_params.items() if v is not None}
|
|
44
|
-
if self.client_params:
|
|
45
|
-
_client_params.update(self.client_params)
|
|
46
|
-
self.openai_client = OpenAIClient(**_client_params)
|
|
47
|
-
return self.openai_client
|
|
48
|
-
|
|
49
|
-
def response(self, text: str) -> CreateEmbeddingResponse:
|
|
50
|
-
_request_params: Dict[str, Any] = {
|
|
51
|
-
"input": text,
|
|
52
|
-
"model": self.id,
|
|
53
|
-
"encoding_format": self.encoding_format,
|
|
54
|
-
}
|
|
55
|
-
if self.user is not None:
|
|
56
|
-
_request_params["user"] = self.user
|
|
57
|
-
if self.id.startswith("text-embedding-3"):
|
|
58
|
-
_request_params["dimensions"] = self.dimensions
|
|
59
|
-
if self.request_params:
|
|
60
|
-
_request_params.update(self.request_params)
|
|
61
|
-
return self.client.embeddings.create(**_request_params)
|
|
62
|
-
|
|
63
|
-
def get_embedding(self, text: str) -> List[float]:
|
|
64
|
-
response: CreateEmbeddingResponse = self.response(text=text)
|
|
65
|
-
try:
|
|
66
|
-
return response.data[0].embedding
|
|
67
|
-
except Exception as e:
|
|
68
|
-
logger.warning(e)
|
|
69
|
-
return []
|
|
70
|
-
|
|
71
|
-
def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
|
|
72
|
-
response: CreateEmbeddingResponse = self.response(text=text)
|
|
73
|
-
|
|
74
|
-
embedding = response.data[0].embedding
|
|
75
|
-
usage = response.usage
|
|
76
|
-
if usage:
|
|
77
|
-
return embedding, usage.model_dump()
|
|
78
|
-
return embedding, None
|
agno/file/__init__.py
DELETED
agno/file/file.py
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any, List, Optional
|
|
3
|
-
|
|
4
|
-
from agno.utils.common import dataclass_to_dict
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@dataclass
|
|
8
|
-
class File:
|
|
9
|
-
name: Optional[str] = None
|
|
10
|
-
description: Optional[str] = None
|
|
11
|
-
columns: Optional[List[str]] = None
|
|
12
|
-
path: Optional[str] = None
|
|
13
|
-
type: str = "FILE"
|
|
14
|
-
|
|
15
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
16
|
-
return dataclass_to_dict(self, exclude_none=True)
|
agno/file/local/csv.py
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
|
-
from agno.file import File
|
|
5
|
-
from agno.utils.common import dataclass_to_dict
|
|
6
|
-
from agno.utils.log import log_debug
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@dataclass
|
|
10
|
-
class CsvFile(File):
|
|
11
|
-
path: str = "" # type: ignore
|
|
12
|
-
type: str = "CSV"
|
|
13
|
-
|
|
14
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
15
|
-
if self.name is None:
|
|
16
|
-
from pathlib import Path
|
|
17
|
-
|
|
18
|
-
self.name = Path(self.path).name
|
|
19
|
-
|
|
20
|
-
if self.columns is None:
|
|
21
|
-
try:
|
|
22
|
-
# Get the columns from the file
|
|
23
|
-
import csv
|
|
24
|
-
|
|
25
|
-
with open(self.path) as csvfile:
|
|
26
|
-
dict_reader = csv.DictReader(csvfile)
|
|
27
|
-
if dict_reader.fieldnames is not None:
|
|
28
|
-
self.columns = list(dict_reader.fieldnames)
|
|
29
|
-
except Exception as e:
|
|
30
|
-
log_debug(f"Error getting columns from file: {e}")
|
|
31
|
-
|
|
32
|
-
return dataclass_to_dict(self, exclude_none=True)
|
agno/file/local/txt.py
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
|
-
from agno.file import File
|
|
5
|
-
from agno.utils.common import dataclass_to_dict
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@dataclass
|
|
9
|
-
class TextFile(File):
|
|
10
|
-
path: str = "" # type: ignore
|
|
11
|
-
type: str = "TEXT"
|
|
12
|
-
|
|
13
|
-
def get_metadata(self) -> dict[str, Any]:
|
|
14
|
-
if self.name is None:
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
|
|
17
|
-
self.name = Path(self.path).name
|
|
18
|
-
|
|
19
|
-
return dataclass_to_dict(self, exclude_none=True)
|
agno/infra/app.py
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Optional, Union
|
|
2
|
-
|
|
3
|
-
from pydantic import Field, field_validator
|
|
4
|
-
from pydantic_core.core_schema import ValidationInfo
|
|
5
|
-
|
|
6
|
-
from agno.infra.base import InfraBase
|
|
7
|
-
from agno.infra.context import ContainerContext
|
|
8
|
-
from agno.infra.resource import InfraResource
|
|
9
|
-
from agno.utils.log import logger
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class InfraApp(InfraBase):
|
|
13
|
-
"""Base class for Infrastructure Apps."""
|
|
14
|
-
|
|
15
|
-
# -*- App Name (required)
|
|
16
|
-
name: str
|
|
17
|
-
|
|
18
|
-
# -*- Image Configuration
|
|
19
|
-
# Image can be provided as a DockerImage object
|
|
20
|
-
image: Optional[Any] = None
|
|
21
|
-
# OR as image_name:image_tag str
|
|
22
|
-
image_str: Optional[str] = None
|
|
23
|
-
# OR as image_name and image_tag
|
|
24
|
-
image_name: Optional[str] = None
|
|
25
|
-
image_tag: Optional[str] = None
|
|
26
|
-
# Entrypoint for the container
|
|
27
|
-
entrypoint: Optional[Union[str, List[str]]] = None
|
|
28
|
-
# Command for the container
|
|
29
|
-
command: Optional[Union[str, List[str]]] = None
|
|
30
|
-
|
|
31
|
-
# -*- Python Configuration
|
|
32
|
-
# Install python dependencies using a requirements.txt file
|
|
33
|
-
install_requirements: bool = False
|
|
34
|
-
# Path to the requirements.txt file relative to the workspace_root
|
|
35
|
-
requirements_file: str = "requirements.txt"
|
|
36
|
-
# Set the PYTHONPATH env var
|
|
37
|
-
set_python_path: bool = True
|
|
38
|
-
# Manually provide the PYTHONPATH.
|
|
39
|
-
# If None, PYTHONPATH is set to workspace_root
|
|
40
|
-
python_path: Optional[str] = None
|
|
41
|
-
# Add paths to the PYTHONPATH env var
|
|
42
|
-
# If python_path is provided, this value is ignored
|
|
43
|
-
add_python_paths: Optional[List[str]] = None
|
|
44
|
-
|
|
45
|
-
# -*- App Ports
|
|
46
|
-
# Open a container port if open_port=True
|
|
47
|
-
open_port: bool = False
|
|
48
|
-
# If open_port=True, port_number is used to set the
|
|
49
|
-
# container_port if container_port is None and host_port if host_port is None
|
|
50
|
-
port_number: int = 80
|
|
51
|
-
# Port number on the Container to open
|
|
52
|
-
# Preferred over port_number if both are set
|
|
53
|
-
container_port: Optional[int] = Field(None, validate_default=True)
|
|
54
|
-
# Port name for the opened port
|
|
55
|
-
container_port_name: str = "http"
|
|
56
|
-
# Port number on the Host to map to the Container port
|
|
57
|
-
# Preferred over port_number if both are set
|
|
58
|
-
host_port: Optional[int] = Field(None, validate_default=True)
|
|
59
|
-
|
|
60
|
-
# -*- Extra Resources created "before" the App resources
|
|
61
|
-
resources: Optional[List[InfraResource]] = None
|
|
62
|
-
|
|
63
|
-
# -*- Other args
|
|
64
|
-
print_env_on_load: bool = False
|
|
65
|
-
|
|
66
|
-
# -*- App specific args. Not to be set by the user.
|
|
67
|
-
# Container Environment that can be set by subclasses
|
|
68
|
-
# which is used as a starting point for building the container_env
|
|
69
|
-
# Any variables set in container_env will be overridden by values
|
|
70
|
-
# in the env_vars dict or env_file
|
|
71
|
-
container_env: Optional[Dict[str, Any]] = None
|
|
72
|
-
# Variable used to cache the container context
|
|
73
|
-
container_context: Optional[ContainerContext] = None
|
|
74
|
-
|
|
75
|
-
# -*- Cached Data
|
|
76
|
-
cached_resources: Optional[List[Any]] = None
|
|
77
|
-
|
|
78
|
-
@field_validator("container_port", mode="before")
|
|
79
|
-
def set_container_port(cls, v, info: ValidationInfo):
|
|
80
|
-
port_number = info.data.get("port_number")
|
|
81
|
-
if v is None and port_number is not None:
|
|
82
|
-
v = port_number
|
|
83
|
-
return v
|
|
84
|
-
|
|
85
|
-
@field_validator("host_port", mode="before")
|
|
86
|
-
def set_host_port(cls, v, info: ValidationInfo):
|
|
87
|
-
port_number = info.data.get("port_number")
|
|
88
|
-
if v is None and port_number is not None:
|
|
89
|
-
v = port_number
|
|
90
|
-
return v
|
|
91
|
-
|
|
92
|
-
def get_app_name(self) -> str:
|
|
93
|
-
return self.name
|
|
94
|
-
|
|
95
|
-
def get_image_str(self) -> str:
|
|
96
|
-
if self.image:
|
|
97
|
-
return f"{self.image.name}:{self.image.tag}"
|
|
98
|
-
elif self.image_str:
|
|
99
|
-
return self.image_str
|
|
100
|
-
elif self.image_name and self.image_tag:
|
|
101
|
-
return f"{self.image_name}:{self.image_tag}"
|
|
102
|
-
elif self.image_name:
|
|
103
|
-
return f"{self.image_name}:latest"
|
|
104
|
-
else:
|
|
105
|
-
return ""
|
|
106
|
-
|
|
107
|
-
def build_resources(self, build_context: Any) -> Optional[Any]:
|
|
108
|
-
logger.debug(f"@build_resource_group not defined for {self.get_app_name()}")
|
|
109
|
-
return None
|
|
110
|
-
|
|
111
|
-
def get_dependencies(self) -> Optional[List[InfraResource]]:
|
|
112
|
-
return (
|
|
113
|
-
[dep for dep in self.depends_on if isinstance(dep, InfraResource)] if self.depends_on is not None else None
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
def add_app_properties_to_resources(self, resources: List[InfraResource]) -> List[InfraResource]:
|
|
117
|
-
updated_resources = []
|
|
118
|
-
app_properties = self.model_dump(exclude_defaults=True)
|
|
119
|
-
app_group = self.get_group_name()
|
|
120
|
-
app_output_dir = self.get_app_name()
|
|
121
|
-
|
|
122
|
-
app_skip_create = app_properties.get("skip_create")
|
|
123
|
-
app_skip_read = app_properties.get("skip_read")
|
|
124
|
-
app_skip_update = app_properties.get("skip_update")
|
|
125
|
-
app_skip_delete = app_properties.get("skip_delete")
|
|
126
|
-
app_recreate_on_update = app_properties.get("recreate_on_update")
|
|
127
|
-
app_use_cache = app_properties.get("use_cache")
|
|
128
|
-
app_force = app_properties.get("force")
|
|
129
|
-
app_debug_mode = app_properties.get("debug_mode")
|
|
130
|
-
app_wait_for_create = app_properties.get("wait_for_create")
|
|
131
|
-
app_wait_for_update = app_properties.get("wait_for_update")
|
|
132
|
-
app_wait_for_delete = app_properties.get("wait_for_delete")
|
|
133
|
-
app_save_output = app_properties.get("save_output")
|
|
134
|
-
|
|
135
|
-
for resource in resources:
|
|
136
|
-
resource_properties = resource.model_dump(exclude_defaults=True)
|
|
137
|
-
resource_skip_create = resource_properties.get("skip_create")
|
|
138
|
-
resource_skip_read = resource_properties.get("skip_read")
|
|
139
|
-
resource_skip_update = resource_properties.get("skip_update")
|
|
140
|
-
resource_skip_delete = resource_properties.get("skip_delete")
|
|
141
|
-
resource_recreate_on_update = resource_properties.get("recreate_on_update")
|
|
142
|
-
resource_use_cache = resource_properties.get("use_cache")
|
|
143
|
-
resource_force = resource_properties.get("force")
|
|
144
|
-
resource_debug_mode = resource_properties.get("debug_mode")
|
|
145
|
-
resource_wait_for_create = resource_properties.get("wait_for_create")
|
|
146
|
-
resource_wait_for_update = resource_properties.get("wait_for_update")
|
|
147
|
-
resource_wait_for_delete = resource_properties.get("wait_for_delete")
|
|
148
|
-
resource_save_output = resource_properties.get("save_output")
|
|
149
|
-
|
|
150
|
-
# If skip_create on resource is not set, use app level skip_create (if set on app)
|
|
151
|
-
if resource_skip_create is None and app_skip_create is not None:
|
|
152
|
-
resource.skip_create = app_skip_create
|
|
153
|
-
# If skip_read on resource is not set, use app level skip_read (if set on app)
|
|
154
|
-
if resource_skip_read is None and app_skip_read is not None:
|
|
155
|
-
resource.skip_read = app_skip_read
|
|
156
|
-
# If skip_update on resource is not set, use app level skip_update (if set on app)
|
|
157
|
-
if resource_skip_update is None and app_skip_update is not None:
|
|
158
|
-
resource.skip_update = app_skip_update
|
|
159
|
-
# If skip_delete on resource is not set, use app level skip_delete (if set on app)
|
|
160
|
-
if resource_skip_delete is None and app_skip_delete is not None:
|
|
161
|
-
resource.skip_delete = app_skip_delete
|
|
162
|
-
# If recreate_on_update on resource is not set, use app level recreate_on_update (if set on app)
|
|
163
|
-
if resource_recreate_on_update is None and app_recreate_on_update is not None:
|
|
164
|
-
resource.recreate_on_update = app_recreate_on_update
|
|
165
|
-
# If use_cache on resource is not set, use app level use_cache (if set on app)
|
|
166
|
-
if resource_use_cache is None and app_use_cache is not None:
|
|
167
|
-
resource.use_cache = app_use_cache
|
|
168
|
-
# If force on resource is not set, use app level force (if set on app)
|
|
169
|
-
if resource_force is None and app_force is not None:
|
|
170
|
-
resource.force = app_force
|
|
171
|
-
# If debug_mode on resource is not set, use app level debug_mode (if set on app)
|
|
172
|
-
if resource_debug_mode is None and app_debug_mode is not None:
|
|
173
|
-
resource.debug_mode = app_debug_mode
|
|
174
|
-
# If wait_for_create on resource is not set, use app level wait_for_create (if set on app)
|
|
175
|
-
if resource_wait_for_create is None and app_wait_for_create is not None:
|
|
176
|
-
resource.wait_for_create = app_wait_for_create
|
|
177
|
-
# If wait_for_update on resource is not set, use app level wait_for_update (if set on app)
|
|
178
|
-
if resource_wait_for_update is None and app_wait_for_update is not None:
|
|
179
|
-
resource.wait_for_update = app_wait_for_update
|
|
180
|
-
# If wait_for_delete on resource is not set, use app level wait_for_delete (if set on app)
|
|
181
|
-
if resource_wait_for_delete is None and app_wait_for_delete is not None:
|
|
182
|
-
resource.wait_for_delete = app_wait_for_delete
|
|
183
|
-
# If save_output on resource is not set, use app level save_output (if set on app)
|
|
184
|
-
if resource_save_output is None and app_save_output is not None:
|
|
185
|
-
resource.save_output = app_save_output
|
|
186
|
-
# If workspace_settings on resource is not set, use app level workspace_settings (if set on app)
|
|
187
|
-
if resource.workspace_settings is None and self.workspace_settings is not None:
|
|
188
|
-
resource.set_workspace_settings(self.workspace_settings)
|
|
189
|
-
# If group on resource is not set, use app level group (if set on app)
|
|
190
|
-
if resource.group is None and app_group is not None:
|
|
191
|
-
resource.group = app_group
|
|
192
|
-
|
|
193
|
-
# Always set output_dir on resource to app level output_dir
|
|
194
|
-
resource.output_dir = app_output_dir
|
|
195
|
-
|
|
196
|
-
app_dependencies = self.get_dependencies()
|
|
197
|
-
if app_dependencies is not None:
|
|
198
|
-
if resource.depends_on is None:
|
|
199
|
-
resource.depends_on = app_dependencies
|
|
200
|
-
else:
|
|
201
|
-
resource.depends_on.extend(app_dependencies)
|
|
202
|
-
|
|
203
|
-
updated_resources.append(resource)
|
|
204
|
-
return updated_resources
|
|
205
|
-
|
|
206
|
-
def get_resources(self, build_context: Any) -> List[InfraResource]:
|
|
207
|
-
if self.cached_resources is not None and len(self.cached_resources) > 0:
|
|
208
|
-
return self.cached_resources
|
|
209
|
-
|
|
210
|
-
base_resources = self.resources or []
|
|
211
|
-
app_resources = self.build_resources(build_context)
|
|
212
|
-
if app_resources is not None:
|
|
213
|
-
base_resources.extend(app_resources)
|
|
214
|
-
|
|
215
|
-
self.cached_resources = self.add_app_properties_to_resources(base_resources)
|
|
216
|
-
# logger.debug(f"Resources: {self.cached_resources}")
|
|
217
|
-
return self.cached_resources
|
|
218
|
-
|
|
219
|
-
def matches_filters(self, group_filter: Optional[str] = None) -> bool:
|
|
220
|
-
if group_filter is not None:
|
|
221
|
-
group_name = self.get_group_name()
|
|
222
|
-
logger.debug(f"{self.get_app_name()}: Checking {group_filter} in {group_name}")
|
|
223
|
-
if group_name is None or group_filter not in group_name:
|
|
224
|
-
return False
|
|
225
|
-
return True
|
|
226
|
-
|
|
227
|
-
def should_create(self, group_filter: Optional[str] = None) -> bool:
|
|
228
|
-
if not self.enabled or self.skip_create:
|
|
229
|
-
return False
|
|
230
|
-
return self.matches_filters(group_filter)
|
|
231
|
-
|
|
232
|
-
def should_delete(self, group_filter: Optional[str] = None) -> bool:
|
|
233
|
-
if not self.enabled or self.skip_delete:
|
|
234
|
-
return False
|
|
235
|
-
return self.matches_filters(group_filter)
|
|
236
|
-
|
|
237
|
-
def should_update(self, group_filter: Optional[str] = None) -> bool:
|
|
238
|
-
if not self.enabled or self.skip_update:
|
|
239
|
-
return False
|
|
240
|
-
return self.matches_filters(group_filter)
|
agno/infra/base.py
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Any, Dict, List, Optional
|
|
3
|
-
|
|
4
|
-
from pydantic import BaseModel, ConfigDict
|
|
5
|
-
|
|
6
|
-
from agno.workspace.settings import WorkspaceSettings
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class InfraBase(BaseModel):
|
|
10
|
-
"""Base class for all InfraResource, InfraApp and InfraResources objects."""
|
|
11
|
-
|
|
12
|
-
# Name of the infrastructure resource
|
|
13
|
-
name: Optional[str] = None
|
|
14
|
-
# Group for the infrastructure resource
|
|
15
|
-
# Used for filtering infrastructure resources by group
|
|
16
|
-
group: Optional[str] = None
|
|
17
|
-
# Environment filter for this resource
|
|
18
|
-
env: Optional[str] = None
|
|
19
|
-
# Infrastructure filter for this resource
|
|
20
|
-
infra: Optional[str] = None
|
|
21
|
-
# Whether this resource is enabled
|
|
22
|
-
enabled: bool = True
|
|
23
|
-
|
|
24
|
-
# Resource Control
|
|
25
|
-
skip_create: bool = False
|
|
26
|
-
skip_read: bool = False
|
|
27
|
-
skip_update: bool = False
|
|
28
|
-
skip_delete: bool = False
|
|
29
|
-
recreate_on_update: bool = False
|
|
30
|
-
# Skip create if resource with the same name is active
|
|
31
|
-
use_cache: bool = True
|
|
32
|
-
# Force create/update/delete even if a resource with the same name is active
|
|
33
|
-
force: Optional[bool] = None
|
|
34
|
-
|
|
35
|
-
# Wait for resource to be created, updated or deleted
|
|
36
|
-
wait_for_create: bool = True
|
|
37
|
-
wait_for_update: bool = True
|
|
38
|
-
wait_for_delete: bool = True
|
|
39
|
-
waiter_delay: int = 30
|
|
40
|
-
waiter_max_attempts: int = 50
|
|
41
|
-
|
|
42
|
-
# Environment Variables for the resource (if applicable)
|
|
43
|
-
# Add env variables to resource where applicable
|
|
44
|
-
env_vars: Optional[Dict[str, Any]] = None
|
|
45
|
-
# Read env from a file in yaml format
|
|
46
|
-
env_file: Optional[Path] = None
|
|
47
|
-
# Add secret variables to resource where applicable
|
|
48
|
-
# secrets_dict: Optional[Dict[str, Any]] = None
|
|
49
|
-
# Read secrets from a file in yaml format
|
|
50
|
-
secrets_file: Optional[Path] = None
|
|
51
|
-
# Read secret variables from AWS Secrets
|
|
52
|
-
aws_secrets: Optional[Any] = None
|
|
53
|
-
|
|
54
|
-
# Debug Mode
|
|
55
|
-
debug_mode: bool = False
|
|
56
|
-
|
|
57
|
-
# Store resource to output directory
|
|
58
|
-
# If True, save resource output to json files
|
|
59
|
-
save_output: bool = False
|
|
60
|
-
# The directory for the input files in the workspace directory
|
|
61
|
-
input_dir: Optional[str] = None
|
|
62
|
-
# The directory for the output files in the workspace directory
|
|
63
|
-
output_dir: Optional[str] = None
|
|
64
|
-
|
|
65
|
-
# Dependencies for the resource
|
|
66
|
-
depends_on: Optional[List[Any]] = None
|
|
67
|
-
|
|
68
|
-
# Workspace Settings
|
|
69
|
-
workspace_settings: Optional[WorkspaceSettings] = None
|
|
70
|
-
|
|
71
|
-
# Cached Data
|
|
72
|
-
cached_workspace_dir: Optional[Path] = None
|
|
73
|
-
cached_env_file_data: Optional[Dict[str, Any]] = None
|
|
74
|
-
cached_secret_file_data: Optional[Dict[str, Any]] = None
|
|
75
|
-
|
|
76
|
-
model_config = ConfigDict(arbitrary_types_allowed=True, populate_by_name=True)
|
|
77
|
-
|
|
78
|
-
def get_group_name(self) -> Optional[str]:
|
|
79
|
-
return self.group or self.name
|
|
80
|
-
|
|
81
|
-
@property
|
|
82
|
-
def workspace_root(self) -> Optional[Path]:
|
|
83
|
-
return self.workspace_settings.ws_root if self.workspace_settings is not None else None
|
|
84
|
-
|
|
85
|
-
@property
|
|
86
|
-
def workspace_name(self) -> Optional[str]:
|
|
87
|
-
return self.workspace_settings.ws_name if self.workspace_settings is not None else None
|
|
88
|
-
|
|
89
|
-
@property
|
|
90
|
-
def workspace_dir(self) -> Optional[Path]:
|
|
91
|
-
if self.cached_workspace_dir is not None:
|
|
92
|
-
return self.cached_workspace_dir
|
|
93
|
-
|
|
94
|
-
if self.workspace_root is not None:
|
|
95
|
-
from agno.workspace.helpers import get_workspace_dir_path
|
|
96
|
-
|
|
97
|
-
workspace_dir = get_workspace_dir_path(self.workspace_root)
|
|
98
|
-
if workspace_dir is not None:
|
|
99
|
-
self.cached_workspace_dir = workspace_dir
|
|
100
|
-
return workspace_dir
|
|
101
|
-
return None
|
|
102
|
-
|
|
103
|
-
def set_workspace_settings(self, workspace_settings: Optional[WorkspaceSettings] = None) -> None:
|
|
104
|
-
if workspace_settings is not None:
|
|
105
|
-
self.workspace_settings = workspace_settings
|
|
106
|
-
|
|
107
|
-
def get_env_file_data(self) -> Optional[Dict[str, Any]]:
|
|
108
|
-
if self.cached_env_file_data is None:
|
|
109
|
-
from agno.utils.yaml_io import read_yaml_file
|
|
110
|
-
|
|
111
|
-
self.cached_env_file_data = read_yaml_file(file_path=self.env_file)
|
|
112
|
-
return self.cached_env_file_data
|
|
113
|
-
|
|
114
|
-
def get_secret_file_data(self) -> Optional[Dict[str, Any]]:
|
|
115
|
-
if self.cached_secret_file_data is None:
|
|
116
|
-
from agno.utils.yaml_io import read_yaml_file
|
|
117
|
-
|
|
118
|
-
self.cached_secret_file_data = read_yaml_file(file_path=self.secrets_file)
|
|
119
|
-
return self.cached_secret_file_data
|
|
120
|
-
|
|
121
|
-
def get_secret_from_file(self, secret_name: str) -> Optional[str]:
|
|
122
|
-
secret_file_data = self.get_secret_file_data()
|
|
123
|
-
if secret_file_data is not None:
|
|
124
|
-
return secret_file_data.get(secret_name)
|
|
125
|
-
return None
|
|
126
|
-
|
|
127
|
-
def get_infra_resources(self) -> Optional[Any]:
|
|
128
|
-
"""This method returns an InfraResources object for this resource"""
|
|
129
|
-
raise NotImplementedError("get_infra_resources method not implemented")
|
|
130
|
-
|
|
131
|
-
def set_aws_env_vars(self, env_dict: Dict[str, str], aws_region: Optional[str] = None) -> None:
|
|
132
|
-
from agno.constants import (
|
|
133
|
-
AWS_DEFAULT_REGION_ENV_VAR,
|
|
134
|
-
AWS_REGION_ENV_VAR,
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
if aws_region is not None:
|
|
138
|
-
# logger.debug(f"Setting AWS Region to {aws_region}")
|
|
139
|
-
env_dict[AWS_REGION_ENV_VAR] = aws_region
|
|
140
|
-
env_dict[AWS_DEFAULT_REGION_ENV_VAR] = aws_region
|
|
141
|
-
elif self.workspace_settings is not None and self.workspace_settings.aws_region is not None:
|
|
142
|
-
# logger.debug(f"Setting AWS Region to {aws_region} using workspace_settings")
|
|
143
|
-
env_dict[AWS_REGION_ENV_VAR] = self.workspace_settings.aws_region
|
|
144
|
-
env_dict[AWS_DEFAULT_REGION_ENV_VAR] = self.workspace_settings.aws_region
|
agno/infra/context.py
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from pydantic import BaseModel
|
|
4
|
-
|
|
5
|
-
from agno.api.schemas.workspace import WorkspaceSchema
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class ContainerContext(BaseModel):
|
|
9
|
-
"""ContainerContext is a context object passed when creating containers."""
|
|
10
|
-
|
|
11
|
-
# Workspace name
|
|
12
|
-
workspace_name: str
|
|
13
|
-
# Workspace schema from the API
|
|
14
|
-
workspace_schema: Optional[WorkspaceSchema] = None
|
|
15
|
-
# Path to the workspace directory inside the container
|
|
16
|
-
workspace_root: str
|
|
17
|
-
# Path to the workspace parent directory inside the container
|
|
18
|
-
workspace_parent: str
|
|
19
|
-
# Path to the requirements.txt file relative to the workspace_root
|
|
20
|
-
requirements_file: Optional[str] = None
|
agno/infra/db_app.py
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
|
|
3
|
-
from agno.infra.app import ContainerContext, InfraApp, InfraResource # noqa: F401
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class DbApp(InfraApp):
|
|
7
|
-
db_user: Optional[str] = None
|
|
8
|
-
db_password: Optional[str] = None
|
|
9
|
-
db_database: Optional[str] = None
|
|
10
|
-
db_driver: Optional[str] = None
|
|
11
|
-
|
|
12
|
-
def get_db_user(self) -> Optional[str]:
|
|
13
|
-
return self.db_user or self.get_secret_from_file("DB_USER")
|
|
14
|
-
|
|
15
|
-
def get_db_password(self) -> Optional[str]:
|
|
16
|
-
return self.db_password or self.get_secret_from_file("DB_PASSWORD")
|
|
17
|
-
|
|
18
|
-
def get_db_database(self) -> Optional[str]:
|
|
19
|
-
return self.db_database or self.get_secret_from_file("DB_DATABASE")
|
|
20
|
-
|
|
21
|
-
def get_db_driver(self) -> Optional[str]:
|
|
22
|
-
return self.db_driver or self.get_secret_from_file("DB_DRIVER")
|
|
23
|
-
|
|
24
|
-
def get_db_host(self) -> Optional[str]:
|
|
25
|
-
raise NotImplementedError
|
|
26
|
-
|
|
27
|
-
def get_db_port(self) -> Optional[int]:
|
|
28
|
-
raise NotImplementedError
|
|
29
|
-
|
|
30
|
-
def get_db_connection(self) -> Optional[str]:
|
|
31
|
-
user = self.get_db_user()
|
|
32
|
-
password = self.get_db_password()
|
|
33
|
-
database = self.get_db_database()
|
|
34
|
-
driver = self.get_db_driver()
|
|
35
|
-
host = self.get_db_host()
|
|
36
|
-
port = self.get_db_port()
|
|
37
|
-
return f"{driver}://{user}:{password}@{host}:{port}/{database}"
|
|
38
|
-
|
|
39
|
-
def get_db_host_local(self) -> Optional[str]:
|
|
40
|
-
return "localhost"
|
|
41
|
-
|
|
42
|
-
def get_db_port_local(self) -> Optional[int]:
|
|
43
|
-
return self.host_port
|
|
44
|
-
|
|
45
|
-
def get_db_connection_local(self) -> Optional[str]:
|
|
46
|
-
user = self.get_db_user()
|
|
47
|
-
password = self.get_db_password()
|
|
48
|
-
database = self.get_db_database()
|
|
49
|
-
driver = self.get_db_driver()
|
|
50
|
-
host = self.get_db_host_local()
|
|
51
|
-
port = self.get_db_port_local()
|
|
52
|
-
return f"{driver}://{user}:{password}@{host}:{port}/{database}"
|