agno 0.1.2__py3-none-any.whl → 2.3.13__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 +44 -5
- agno/agent/agent.py +10531 -2975
- agno/api/agent.py +14 -53
- agno/api/api.py +7 -46
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +6 -25
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +6 -9
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/team.py +10 -10
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +22 -26
- 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/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +946 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2781 -0
- agno/db/dynamo/schemas.py +442 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +2379 -0
- agno/db/firestore/schemas.py +181 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1791 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1312 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1777 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2760 -0
- agno/db/mongo/mongo.py +2597 -0
- agno/db/mongo/schemas.py +119 -0
- agno/db/mongo/utils.py +276 -0
- agno/db/mysql/__init__.py +4 -0
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +2923 -0
- agno/db/mysql/schemas.py +186 -0
- agno/db/mysql/utils.py +488 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +2870 -0
- agno/db/postgres/schemas.py +187 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +2141 -0
- agno/db/redis/schemas.py +159 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +34 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +61 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +179 -0
- agno/db/singlestore/singlestore.py +2877 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +181 -0
- agno/db/sqlite/sqlite.py +2908 -0
- agno/db/sqlite/utils.py +429 -0
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +118 -0
- agno/eval/__init__.py +24 -0
- agno/eval/accuracy.py +666 -276
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +779 -0
- agno/eval/reliability.py +241 -62
- agno/eval/utils.py +120 -0
- agno/exceptions.py +143 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -1
- agno/{document → knowledge}/chunking/agentic.py +22 -14
- agno/{document → knowledge}/chunking/document.py +2 -2
- agno/{document → knowledge}/chunking/fixed.py +7 -6
- agno/knowledge/chunking/markdown.py +151 -0
- agno/{document → knowledge}/chunking/recursive.py +15 -3
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +91 -0
- agno/knowledge/chunking/strategy.py +165 -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/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/{embedder → knowledge/embedder}/base.py +8 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/{embedder → knowledge/embedder}/together.py +1 -1
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +3006 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +164 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +88 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +127 -0
- agno/knowledge/reader/web_search_reader.py +325 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +91 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/{reranker → knowledge/reranker}/base.py +1 -1
- agno/{reranker → knowledge/reranker}/cohere.py +2 -2
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +234 -0
- agno/media.py +439 -95
- agno/memory/__init__.py +16 -3
- agno/memory/manager.py +1474 -123
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +62 -0
- agno/models/anthropic/__init__.py +4 -0
- agno/models/anthropic/claude.py +960 -496
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +686 -451
- agno/models/aws/claude.py +190 -183
- agno/models/azure/__init__.py +18 -1
- agno/models/azure/ai_foundry.py +489 -0
- agno/models/azure/openai_chat.py +89 -40
- agno/models/base.py +2477 -550
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +565 -0
- agno/models/cerebras/cerebras_openai.py +131 -0
- agno/models/cohere/__init__.py +4 -0
- agno/models/cohere/chat.py +306 -492
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +74 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +90 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +45 -0
- agno/models/deepseek/__init__.py +4 -0
- agno/models/deepseek/deepseek.py +110 -9
- agno/models/fireworks/__init__.py +4 -0
- agno/models/fireworks/fireworks.py +19 -22
- agno/models/google/__init__.py +3 -7
- agno/models/google/gemini.py +1717 -662
- agno/models/google/utils.py +22 -0
- agno/models/groq/__init__.py +4 -0
- agno/models/groq/groq.py +391 -666
- agno/models/huggingface/__init__.py +4 -0
- agno/models/huggingface/huggingface.py +266 -538
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +432 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +20 -3
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +60 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +503 -0
- agno/models/litellm/litellm_openai.py +42 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +361 -39
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +502 -0
- agno/models/meta/llama_openai.py +79 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +4 -0
- agno/models/mistral/mistral.py +293 -393
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +53 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +4 -0
- agno/models/nvidia/nvidia.py +22 -3
- agno/models/ollama/__init__.py +4 -2
- agno/models/ollama/chat.py +257 -492
- agno/models/openai/__init__.py +7 -0
- agno/models/openai/chat.py +725 -770
- agno/models/openai/like.py +16 -2
- agno/models/openai/responses.py +1121 -0
- agno/models/openrouter/__init__.py +4 -0
- agno/models/openrouter/openrouter.py +62 -5
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +203 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +82 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +69 -0
- agno/models/response.py +177 -7
- agno/models/sambanova/__init__.py +4 -0
- agno/models/sambanova/sambanova.py +23 -4
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +42 -0
- agno/models/together/__init__.py +4 -0
- agno/models/together/together.py +21 -164
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +43 -0
- agno/models/vertexai/__init__.py +0 -1
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +83 -0
- agno/models/xai/__init__.py +2 -0
- agno/models/xai/xai.py +111 -7
- agno/os/__init__.py +3 -0
- agno/os/app.py +1027 -0
- agno/os/auth.py +244 -0
- agno/os/config.py +126 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +249 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +147 -0
- agno/os/interfaces/agui/utils.py +574 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +210 -0
- agno/os/interfaces/whatsapp/security.py +55 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +293 -0
- agno/os/middleware/__init__.py +9 -0
- agno/os/middleware/jwt.py +797 -0
- agno/os/router.py +258 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +450 -0
- agno/os/routers/evals/schemas.py +174 -0
- agno/os/routers/evals/utils.py +231 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +1008 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +661 -0
- agno/os/routers/memory/schemas.py +88 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +534 -0
- agno/os/scopes.py +469 -0
- agno/{playground → os}/settings.py +7 -15
- agno/os/utils.py +973 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +24 -1
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +2 -1
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +822 -0
- agno/run/base.py +247 -0
- agno/run/cancel.py +81 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +767 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +260 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +342 -0
- agno/session/workflow.py +501 -0
- agno/table.py +10 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +9536 -0
- agno/tools/__init__.py +7 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +22 -12
- agno/tools/api.py +122 -0
- agno/tools/apify.py +276 -83
- agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
- agno/tools/aws_lambda.py +28 -7
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +11 -4
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +32 -23
- agno/tools/calculator.py +24 -37
- agno/tools/cartesia.py +187 -0
- agno/tools/{clickup_tool.py → clickup.py} +17 -28
- agno/tools/confluence.py +91 -26
- agno/tools/crawl4ai.py +139 -43
- agno/tools/csv_toolkit.py +28 -22
- agno/tools/dalle.py +36 -22
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +169 -14
- agno/tools/desi_vocal.py +23 -11
- agno/tools/discord.py +32 -29
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +76 -81
- agno/tools/duckduckgo.py +43 -40
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +65 -54
- agno/tools/email.py +13 -5
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +324 -42
- agno/tools/fal.py +39 -35
- agno/tools/file.py +196 -30
- agno/tools/file_generation.py +356 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +108 -33
- agno/tools/function.py +960 -122
- agno/tools/giphy.py +34 -12
- agno/tools/github.py +1294 -97
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +271 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +607 -107
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +20 -12
- agno/tools/jina.py +24 -14
- agno/tools/jira.py +48 -19
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +82 -43
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +15 -7
- agno/tools/lumalab.py +41 -26
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +11 -9
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +163 -82
- agno/tools/moviepy_video.py +18 -13
- agno/tools/nano_banana.py +151 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +15 -4
- agno/tools/newspaper4k.py +19 -6
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +181 -17
- agno/tools/openbb.py +27 -20
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +25 -15
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +238 -185
- agno/tools/pubmed.py +125 -13
- agno/tools/python.py +48 -35
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +207 -29
- agno/tools/redshift.py +406 -0
- agno/tools/replicate.py +69 -26
- agno/tools/resend.py +11 -6
- agno/tools/scrapegraph.py +179 -19
- agno/tools/searxng.py +23 -31
- agno/tools/serpapi.py +15 -10
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +23 -12
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +56 -14
- agno/tools/sleep.py +8 -6
- agno/tools/spider.py +35 -11
- agno/tools/spotify.py +919 -0
- agno/tools/sql.py +34 -19
- agno/tools/tavily.py +158 -8
- agno/tools/telegram.py +18 -8
- agno/tools/todoist.py +218 -0
- agno/tools/toolkit.py +134 -9
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +25 -28
- agno/tools/twilio.py +18 -9
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +23 -19
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +28 -19
- agno/tools/workflow.py +285 -0
- agno/tools/{twitter.py → x.py} +142 -46
- agno/tools/yfinance.py +41 -39
- agno/tools/youtube.py +34 -17
- agno/tools/zendesk.py +15 -5
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +86 -37
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/audio.py +37 -1
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +103 -20
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +700 -0
- agno/utils/functions.py +107 -37
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +171 -0
- agno/utils/http.py +185 -0
- agno/utils/json_schema.py +159 -37
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +221 -8
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +335 -14
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +77 -2
- agno/utils/models/ai_foundry.py +50 -0
- agno/utils/models/claude.py +373 -0
- agno/utils/models/cohere.py +94 -0
- agno/utils/models/llama.py +85 -0
- agno/utils/models/mistral.py +100 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +1 -1
- agno/utils/pprint.py +124 -8
- agno/utils/print_response/agent.py +930 -0
- agno/utils/print_response/team.py +1914 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +4 -4
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +204 -51
- agno/utils/team.py +139 -0
- agno/utils/timer.py +9 -2
- agno/utils/tokens.py +657 -0
- agno/utils/tools.py +19 -1
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +3 -3
- agno/vectordb/__init__.py +2 -0
- agno/vectordb/base.py +87 -9
- agno/vectordb/cassandra/__init__.py +5 -1
- agno/vectordb/cassandra/cassandra.py +383 -27
- agno/vectordb/chroma/__init__.py +4 -0
- agno/vectordb/chroma/chromadb.py +748 -83
- agno/vectordb/clickhouse/__init__.py +7 -1
- agno/vectordb/clickhouse/clickhousedb.py +554 -53
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1446 -0
- agno/vectordb/lancedb/__init__.py +5 -0
- agno/vectordb/lancedb/lance_db.py +730 -98
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +3 -0
- agno/vectordb/milvus/milvus.py +966 -78
- agno/vectordb/mongodb/__init__.py +9 -1
- agno/vectordb/mongodb/mongodb.py +1175 -172
- agno/vectordb/pgvector/__init__.py +8 -0
- agno/vectordb/pgvector/pgvector.py +599 -115
- agno/vectordb/pineconedb/__init__.py +5 -1
- agno/vectordb/pineconedb/pineconedb.py +406 -43
- agno/vectordb/qdrant/__init__.py +4 -0
- agno/vectordb/qdrant/qdrant.py +914 -61
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/__init__.py +8 -1
- agno/vectordb/singlestore/singlestore.py +771 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +663 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1009 -0
- agno/workflow/__init__.py +23 -1
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +759 -0
- agno/workflow/loop.py +756 -0
- agno/workflow/parallel.py +853 -0
- agno/workflow/router.py +723 -0
- agno/workflow/step.py +1564 -0
- agno/workflow/steps.py +613 -0
- agno/workflow/types.py +556 -0
- agno/workflow/workflow.py +4327 -514
- agno-2.3.13.dist-info/METADATA +639 -0
- agno-2.3.13.dist-info/RECORD +613 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
- agno-2.3.13.dist-info/licenses/LICENSE +201 -0
- agno/api/playground.py +0 -91
- agno/api/schemas/playground.py +0 -22
- agno/api/schemas/user.py +0 -22
- agno/api/schemas/workspace.py +0 -46
- agno/api/user.py +0 -160
- agno/api/workspace.py +0 -151
- agno/cli/auth_server.py +0 -118
- agno/cli/config.py +0 -275
- agno/cli/console.py +0 -88
- agno/cli/credentials.py +0 -23
- agno/cli/entrypoint.py +0 -571
- agno/cli/operator.py +0 -355
- agno/cli/settings.py +0 -85
- agno/cli/ws/ws_cli.py +0 -817
- agno/constants.py +0 -13
- agno/document/__init__.py +0 -1
- agno/document/chunking/semantic.py +0 -47
- agno/document/chunking/strategy.py +0 -31
- agno/document/reader/__init__.py +0 -1
- agno/document/reader/arxiv_reader.py +0 -41
- agno/document/reader/base.py +0 -22
- agno/document/reader/csv_reader.py +0 -84
- agno/document/reader/docx_reader.py +0 -46
- agno/document/reader/firecrawl_reader.py +0 -99
- agno/document/reader/json_reader.py +0 -43
- agno/document/reader/pdf_reader.py +0 -219
- agno/document/reader/s3/pdf_reader.py +0 -46
- agno/document/reader/s3/text_reader.py +0 -51
- agno/document/reader/text_reader.py +0 -41
- agno/document/reader/website_reader.py +0 -175
- agno/document/reader/youtube_reader.py +0 -50
- agno/embedder/__init__.py +0 -1
- agno/embedder/azure_openai.py +0 -86
- agno/embedder/cohere.py +0 -72
- agno/embedder/fastembed.py +0 -37
- agno/embedder/google.py +0 -73
- agno/embedder/huggingface.py +0 -54
- agno/embedder/mistral.py +0 -80
- agno/embedder/ollama.py +0 -57
- agno/embedder/openai.py +0 -74
- agno/embedder/sentence_transformer.py +0 -38
- agno/embedder/voyageai.py +0 -64
- agno/eval/perf.py +0 -201
- agno/file/__init__.py +0 -1
- 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 -230
- agno/knowledge/arxiv.py +0 -22
- agno/knowledge/combined.py +0 -22
- agno/knowledge/csv.py +0 -28
- agno/knowledge/csv_url.py +0 -19
- agno/knowledge/document.py +0 -20
- agno/knowledge/docx.py +0 -30
- agno/knowledge/json.py +0 -28
- agno/knowledge/langchain.py +0 -71
- agno/knowledge/llamaindex.py +0 -66
- agno/knowledge/pdf.py +0 -28
- agno/knowledge/pdf_url.py +0 -26
- agno/knowledge/s3/base.py +0 -60
- agno/knowledge/s3/pdf.py +0 -21
- agno/knowledge/s3/text.py +0 -23
- agno/knowledge/text.py +0 -30
- agno/knowledge/website.py +0 -88
- agno/knowledge/wikipedia.py +0 -31
- agno/knowledge/youtube.py +0 -22
- agno/memory/agent.py +0 -392
- agno/memory/classifier.py +0 -104
- agno/memory/db/__init__.py +0 -1
- 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 -15
- agno/memory/row.py +0 -36
- agno/memory/summarizer.py +0 -192
- agno/memory/summary.py +0 -19
- agno/memory/workflow.py +0 -38
- agno/models/google/gemini_openai.py +0 -26
- agno/models/ollama/hermes.py +0 -221
- agno/models/ollama/tools.py +0 -362
- agno/models/vertexai/gemini.py +0 -595
- agno/playground/__init__.py +0 -3
- agno/playground/async_router.py +0 -421
- agno/playground/deploy.py +0 -249
- agno/playground/operator.py +0 -92
- agno/playground/playground.py +0 -91
- agno/playground/schemas.py +0 -76
- agno/playground/serve.py +0 -55
- agno/playground/sync_router.py +0 -405
- agno/reasoning/agent.py +0 -68
- agno/run/response.py +0 -112
- agno/storage/agent/__init__.py +0 -0
- agno/storage/agent/base.py +0 -38
- agno/storage/agent/dynamodb.py +0 -350
- agno/storage/agent/json.py +0 -92
- agno/storage/agent/mongodb.py +0 -228
- agno/storage/agent/postgres.py +0 -367
- agno/storage/agent/session.py +0 -79
- agno/storage/agent/singlestore.py +0 -303
- agno/storage/agent/sqlite.py +0 -357
- agno/storage/agent/yaml.py +0 -93
- agno/storage/workflow/__init__.py +0 -0
- agno/storage/workflow/base.py +0 -40
- agno/storage/workflow/mongodb.py +0 -233
- agno/storage/workflow/postgres.py +0 -366
- agno/storage/workflow/session.py +0 -60
- agno/storage/workflow/sqlite.py +0 -359
- agno/tools/googlesearch.py +0 -88
- 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/vectordb/singlestore/s2vectordb.py +0 -390
- agno/vectordb/singlestore/s2vectordb2.py +0 -355
- agno/workspace/__init__.py +0 -0
- agno/workspace/config.py +0 -325
- agno/workspace/enums.py +0 -6
- agno/workspace/helpers.py +0 -48
- agno/workspace/operator.py +0 -758
- agno/workspace/settings.py +0 -63
- agno-0.1.2.dist-info/LICENSE +0 -375
- agno-0.1.2.dist-info/METADATA +0 -502
- agno-0.1.2.dist-info/RECORD +0 -352
- agno-0.1.2.dist-info/entry_points.txt +0 -3
- /agno/{cli → db/migrations}/__init__.py +0 -0
- /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
- /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
- /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
- /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
- /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
- /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
- /agno/{reranker → utils/models}/__init__.py +0 -0
- /agno/{storage → utils/print_response}/__init__.py +0 -0
- {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
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}"
|
agno/infra/resource.py
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
from pathlib import Path
|
|
2
|
-
from typing import Any, Dict, List, Optional
|
|
3
|
-
|
|
4
|
-
from agno.infra.base import InfraBase
|
|
5
|
-
from agno.utils.log import logger
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class InfraResource(InfraBase):
|
|
9
|
-
"""Base class for Infrastructure Resources."""
|
|
10
|
-
|
|
11
|
-
# Resource name (required)
|
|
12
|
-
name: str
|
|
13
|
-
# Resource type
|
|
14
|
-
resource_type: Optional[str] = None
|
|
15
|
-
# List of resource types to match for filtering
|
|
16
|
-
resource_type_list: Optional[List[str]] = None
|
|
17
|
-
|
|
18
|
-
# -*- Cached Data
|
|
19
|
-
active_resource: Optional[Any] = None
|
|
20
|
-
resource_created: bool = False
|
|
21
|
-
resource_updated: bool = False
|
|
22
|
-
resource_deleted: bool = False
|
|
23
|
-
|
|
24
|
-
def read(self, client: Any) -> bool:
|
|
25
|
-
raise NotImplementedError
|
|
26
|
-
|
|
27
|
-
def is_active(self, client: Any) -> bool:
|
|
28
|
-
raise NotImplementedError
|
|
29
|
-
|
|
30
|
-
def create(self, client: Any) -> bool:
|
|
31
|
-
raise NotImplementedError
|
|
32
|
-
|
|
33
|
-
def update(self, client: Any) -> bool:
|
|
34
|
-
raise NotImplementedError
|
|
35
|
-
|
|
36
|
-
def delete(self, client: Any) -> bool:
|
|
37
|
-
raise NotImplementedError
|
|
38
|
-
|
|
39
|
-
def get_resource_name(self) -> str:
|
|
40
|
-
return self.name or self.__class__.__name__
|
|
41
|
-
|
|
42
|
-
def get_resource_type(self) -> str:
|
|
43
|
-
if self.resource_type is None:
|
|
44
|
-
return self.__class__.__name__
|
|
45
|
-
return self.resource_type
|
|
46
|
-
|
|
47
|
-
def get_resource_type_list(self) -> List[str]:
|
|
48
|
-
if self.resource_type_list is None:
|
|
49
|
-
return [self.get_resource_type().lower()]
|
|
50
|
-
|
|
51
|
-
type_list: List[str] = [resource_type.lower() for resource_type in self.resource_type_list]
|
|
52
|
-
if self.get_resource_type() not in type_list:
|
|
53
|
-
type_list.append(self.get_resource_type().lower())
|
|
54
|
-
return type_list
|
|
55
|
-
|
|
56
|
-
def get_input_file_path(self) -> Optional[Path]:
|
|
57
|
-
workspace_dir: Optional[Path] = self.workspace_dir
|
|
58
|
-
if workspace_dir is None:
|
|
59
|
-
from agno.workspace.helpers import get_workspace_dir_from_env
|
|
60
|
-
|
|
61
|
-
workspace_dir = get_workspace_dir_from_env()
|
|
62
|
-
if workspace_dir is not None:
|
|
63
|
-
resource_name: str = self.get_resource_name()
|
|
64
|
-
if resource_name is not None:
|
|
65
|
-
input_file_name = f"{resource_name}.yaml"
|
|
66
|
-
input_dir_path = workspace_dir
|
|
67
|
-
if self.input_dir is not None:
|
|
68
|
-
input_dir_path = input_dir_path.joinpath(self.input_dir)
|
|
69
|
-
else:
|
|
70
|
-
input_dir_path = input_dir_path.joinpath("input")
|
|
71
|
-
if self.env is not None:
|
|
72
|
-
input_dir_path = input_dir_path.joinpath(self.env)
|
|
73
|
-
if self.group is not None:
|
|
74
|
-
input_dir_path = input_dir_path.joinpath(self.group)
|
|
75
|
-
if self.get_resource_type() is not None:
|
|
76
|
-
input_dir_path = input_dir_path.joinpath(self.get_resource_type().lower())
|
|
77
|
-
return input_dir_path.joinpath(input_file_name)
|
|
78
|
-
return None
|
|
79
|
-
|
|
80
|
-
def get_output_file_path(self) -> Optional[Path]:
|
|
81
|
-
workspace_dir: Optional[Path] = self.workspace_dir
|
|
82
|
-
if workspace_dir is None:
|
|
83
|
-
from agno.workspace.helpers import get_workspace_dir_from_env
|
|
84
|
-
|
|
85
|
-
workspace_dir = get_workspace_dir_from_env()
|
|
86
|
-
if workspace_dir is not None:
|
|
87
|
-
resource_name: str = self.get_resource_name()
|
|
88
|
-
if resource_name is not None:
|
|
89
|
-
output_file_name = f"{resource_name}.yaml"
|
|
90
|
-
output_dir_path = workspace_dir
|
|
91
|
-
output_dir_path = output_dir_path.joinpath("output")
|
|
92
|
-
if self.env is not None:
|
|
93
|
-
output_dir_path = output_dir_path.joinpath(self.env)
|
|
94
|
-
if self.output_dir is not None:
|
|
95
|
-
output_dir_path = output_dir_path.joinpath(self.output_dir)
|
|
96
|
-
elif self.get_resource_type() is not None:
|
|
97
|
-
output_dir_path = output_dir_path.joinpath(self.get_resource_type().lower())
|
|
98
|
-
return output_dir_path.joinpath(output_file_name)
|
|
99
|
-
return None
|
|
100
|
-
|
|
101
|
-
def save_output_file(self) -> bool:
|
|
102
|
-
output_file_path: Optional[Path] = self.get_output_file_path()
|
|
103
|
-
if output_file_path is not None:
|
|
104
|
-
try:
|
|
105
|
-
from agno.utils.yaml_io import write_yaml_file
|
|
106
|
-
|
|
107
|
-
if not output_file_path.exists():
|
|
108
|
-
output_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
109
|
-
output_file_path.touch(exist_ok=True)
|
|
110
|
-
write_yaml_file(output_file_path, self.active_resource)
|
|
111
|
-
logger.info(f"Resource saved to: {str(output_file_path)}")
|
|
112
|
-
return True
|
|
113
|
-
except Exception as e:
|
|
114
|
-
logger.error(f"Could not write {self.get_resource_name()} to file: {e}")
|
|
115
|
-
return False
|
|
116
|
-
|
|
117
|
-
def read_resource_from_file(self) -> Optional[Dict[str, Any]]:
|
|
118
|
-
output_file_path: Optional[Path] = self.get_output_file_path()
|
|
119
|
-
if output_file_path is not None:
|
|
120
|
-
try:
|
|
121
|
-
from agno.utils.yaml_io import read_yaml_file
|
|
122
|
-
|
|
123
|
-
if output_file_path.exists() and output_file_path.is_file():
|
|
124
|
-
data_from_file = read_yaml_file(output_file_path)
|
|
125
|
-
if data_from_file is not None and isinstance(data_from_file, dict):
|
|
126
|
-
return data_from_file
|
|
127
|
-
else:
|
|
128
|
-
logger.warning(f"Could not read {self.get_resource_name()} from {output_file_path}")
|
|
129
|
-
except Exception as e:
|
|
130
|
-
logger.error(f"Could not read {self.get_resource_name()} from file: {e}")
|
|
131
|
-
return None
|
|
132
|
-
|
|
133
|
-
def delete_output_file(self) -> bool:
|
|
134
|
-
output_file_path: Optional[Path] = self.get_output_file_path()
|
|
135
|
-
if output_file_path is not None:
|
|
136
|
-
try:
|
|
137
|
-
if output_file_path.exists() and output_file_path.is_file():
|
|
138
|
-
output_file_path.unlink()
|
|
139
|
-
logger.debug(f"Output file deleted: {str(output_file_path)}")
|
|
140
|
-
return True
|
|
141
|
-
except Exception as e:
|
|
142
|
-
logger.error(f"Could not delete output file: {e}")
|
|
143
|
-
return False
|
|
144
|
-
|
|
145
|
-
def matches_filters(
|
|
146
|
-
self,
|
|
147
|
-
group_filter: Optional[str] = None,
|
|
148
|
-
name_filter: Optional[str] = None,
|
|
149
|
-
type_filter: Optional[str] = None,
|
|
150
|
-
) -> bool:
|
|
151
|
-
if group_filter is not None:
|
|
152
|
-
group_name = self.get_group_name()
|
|
153
|
-
logger.debug(f"{self.get_resource_name()}: Checking {group_filter} in {group_name}")
|
|
154
|
-
if group_name is None or group_filter not in group_name:
|
|
155
|
-
return False
|
|
156
|
-
if name_filter is not None:
|
|
157
|
-
resource_name = self.get_resource_name()
|
|
158
|
-
logger.debug(f"{self.get_resource_name()}: Checking {name_filter} in {resource_name}")
|
|
159
|
-
if resource_name is None or name_filter not in resource_name:
|
|
160
|
-
return False
|
|
161
|
-
if type_filter is not None:
|
|
162
|
-
resource_type_list = self.get_resource_type_list()
|
|
163
|
-
logger.debug(f"{self.get_resource_name()}: Checking {type_filter.lower()} in {resource_type_list}")
|
|
164
|
-
if resource_type_list is None or type_filter.lower() not in resource_type_list:
|
|
165
|
-
return False
|
|
166
|
-
return True
|
|
167
|
-
|
|
168
|
-
def should_create(
|
|
169
|
-
self,
|
|
170
|
-
group_filter: Optional[str] = None,
|
|
171
|
-
name_filter: Optional[str] = None,
|
|
172
|
-
type_filter: Optional[str] = None,
|
|
173
|
-
) -> bool:
|
|
174
|
-
if not self.enabled or self.skip_create:
|
|
175
|
-
return False
|
|
176
|
-
return self.matches_filters(group_filter, name_filter, type_filter)
|
|
177
|
-
|
|
178
|
-
def should_delete(
|
|
179
|
-
self,
|
|
180
|
-
group_filter: Optional[str] = None,
|
|
181
|
-
name_filter: Optional[str] = None,
|
|
182
|
-
type_filter: Optional[str] = None,
|
|
183
|
-
) -> bool:
|
|
184
|
-
if not self.enabled or self.skip_delete:
|
|
185
|
-
return False
|
|
186
|
-
return self.matches_filters(group_filter, name_filter, type_filter)
|
|
187
|
-
|
|
188
|
-
def should_update(
|
|
189
|
-
self,
|
|
190
|
-
group_filter: Optional[str] = None,
|
|
191
|
-
name_filter: Optional[str] = None,
|
|
192
|
-
type_filter: Optional[str] = None,
|
|
193
|
-
) -> bool:
|
|
194
|
-
if not self.enabled or self.skip_update:
|
|
195
|
-
return False
|
|
196
|
-
return self.matches_filters(group_filter, name_filter, type_filter)
|
|
197
|
-
|
|
198
|
-
def __hash__(self):
|
|
199
|
-
return hash(f"{self.get_resource_type()}:{self.get_resource_name()}")
|
|
200
|
-
|
|
201
|
-
def __eq__(self, other):
|
|
202
|
-
if isinstance(other, InfraResource):
|
|
203
|
-
if other.get_resource_type() == self.get_resource_type():
|
|
204
|
-
return self.get_resource_name() == other.get_resource_name()
|
|
205
|
-
return False
|