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
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from hashlib import md5
|
|
3
|
-
from typing import Any, Dict, List, Optional
|
|
4
|
-
|
|
5
|
-
try:
|
|
6
|
-
from sqlalchemy.dialects import mysql
|
|
7
|
-
from sqlalchemy.engine import Engine, create_engine
|
|
8
|
-
from sqlalchemy.inspection import inspect
|
|
9
|
-
from sqlalchemy.orm import Session, sessionmaker
|
|
10
|
-
from sqlalchemy.schema import Column, MetaData, Table
|
|
11
|
-
from sqlalchemy.sql.expression import func, select, text
|
|
12
|
-
from sqlalchemy.types import DateTime
|
|
13
|
-
except ImportError:
|
|
14
|
-
raise ImportError("`sqlalchemy` not installed")
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
from agno.document import Document
|
|
18
|
-
from agno.embedder import Embedder
|
|
19
|
-
from agno.embedder.openai import OpenAIEmbedder
|
|
20
|
-
from agno.reranker.base import Reranker
|
|
21
|
-
from agno.utils.log import logger
|
|
22
|
-
from agno.vectordb.base import VectorDb
|
|
23
|
-
from agno.vectordb.distance import Distance
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class S2VectorDb(VectorDb):
|
|
27
|
-
def __init__(
|
|
28
|
-
self,
|
|
29
|
-
collection: str,
|
|
30
|
-
schema: Optional[str] = "ai",
|
|
31
|
-
db_url: Optional[str] = None,
|
|
32
|
-
db_engine: Optional[Engine] = None,
|
|
33
|
-
embedder: Embedder = OpenAIEmbedder(),
|
|
34
|
-
distance: Distance = Distance.cosine,
|
|
35
|
-
reranker: Optional[Reranker] = None,
|
|
36
|
-
):
|
|
37
|
-
_engine: Optional[Engine] = db_engine
|
|
38
|
-
if _engine is None and db_url is not None:
|
|
39
|
-
_engine = create_engine(db_url)
|
|
40
|
-
|
|
41
|
-
if _engine is None:
|
|
42
|
-
raise ValueError("Must provide either db_url or db_engine")
|
|
43
|
-
|
|
44
|
-
self.collection: str = collection
|
|
45
|
-
self.schema: Optional[str] = schema
|
|
46
|
-
self.db_url: Optional[str] = db_url
|
|
47
|
-
self.db_engine: Engine = _engine
|
|
48
|
-
self.metadata: MetaData = MetaData(schema=self.schema)
|
|
49
|
-
self.embedder: Embedder = embedder
|
|
50
|
-
self.dimensions: Optional[int] = self.embedder.dimensions
|
|
51
|
-
self.distance: Distance = distance
|
|
52
|
-
self.Session: sessionmaker[Session] = sessionmaker(bind=self.db_engine)
|
|
53
|
-
self.table: Table = self.get_table()
|
|
54
|
-
self.reranker: Optional[Reranker] = reranker
|
|
55
|
-
|
|
56
|
-
def get_table(self) -> Table:
|
|
57
|
-
"""
|
|
58
|
-
Define the table structure.
|
|
59
|
-
|
|
60
|
-
Returns:
|
|
61
|
-
Table: SQLAlchemy Table object.
|
|
62
|
-
"""
|
|
63
|
-
return Table(
|
|
64
|
-
self.collection,
|
|
65
|
-
self.metadata,
|
|
66
|
-
Column("id", mysql.TEXT),
|
|
67
|
-
Column("name", mysql.TEXT),
|
|
68
|
-
Column("meta_data", mysql.TEXT),
|
|
69
|
-
Column("content", mysql.TEXT),
|
|
70
|
-
Column("embedding", mysql.BLOB), # Use BLOB for storing vector embeddings
|
|
71
|
-
Column("usage", mysql.TEXT),
|
|
72
|
-
Column("created_at", DateTime(timezone=True), server_default=text("now()")),
|
|
73
|
-
Column("updated_at", DateTime(timezone=True), onupdate=text("now()")),
|
|
74
|
-
Column("content_hash", mysql.TEXT),
|
|
75
|
-
extend_existing=True,
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
def table_exists(self) -> bool:
|
|
79
|
-
"""
|
|
80
|
-
Check if the table exists.
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
bool: True if the table exists, False otherwise.
|
|
84
|
-
"""
|
|
85
|
-
logger.debug(f"Checking if table exists: {self.table.name}")
|
|
86
|
-
try:
|
|
87
|
-
return inspect(self.db_engine).has_table(self.table.name, schema=self.schema)
|
|
88
|
-
except Exception as e:
|
|
89
|
-
logger.error(e)
|
|
90
|
-
return False
|
|
91
|
-
|
|
92
|
-
def create(self) -> None:
|
|
93
|
-
"""
|
|
94
|
-
Create the table if it does not exist.
|
|
95
|
-
"""
|
|
96
|
-
if not self.table_exists():
|
|
97
|
-
# with self.Session() as sess:
|
|
98
|
-
# with sess.begin():
|
|
99
|
-
# if self.schema is not None:
|
|
100
|
-
# logger.debug(f"Creating schema: {self.schema}")
|
|
101
|
-
# sess.execute(text(f"CREATE DATABASE IF NOT EXISTS {self.schema};"))
|
|
102
|
-
logger.info(f"Creating table: {self.collection}")
|
|
103
|
-
self.table.create(self.db_engine)
|
|
104
|
-
|
|
105
|
-
def doc_exists(self, document: Document) -> bool:
|
|
106
|
-
"""
|
|
107
|
-
Validating if the document exists or not
|
|
108
|
-
|
|
109
|
-
Args:
|
|
110
|
-
document (Document): Document to validate
|
|
111
|
-
"""
|
|
112
|
-
columns = [self.table.c.name, self.table.c.content_hash]
|
|
113
|
-
with self.Session.begin() as sess:
|
|
114
|
-
cleaned_content = document.content.replace("\x00", "\ufffd")
|
|
115
|
-
stmt = select(*columns).where(self.table.c.content_hash == md5(cleaned_content.encode()).hexdigest())
|
|
116
|
-
result = sess.execute(stmt).first()
|
|
117
|
-
return result is not None
|
|
118
|
-
|
|
119
|
-
def name_exists(self, name: str) -> bool:
|
|
120
|
-
"""
|
|
121
|
-
Validate if a row with this name exists or not
|
|
122
|
-
|
|
123
|
-
Args:
|
|
124
|
-
name (str): Name to check
|
|
125
|
-
"""
|
|
126
|
-
with self.Session.begin() as sess:
|
|
127
|
-
stmt = select(self.table.c.name).where(self.table.c.name == name)
|
|
128
|
-
result = sess.execute(stmt).first()
|
|
129
|
-
return result is not None
|
|
130
|
-
|
|
131
|
-
def id_exists(self, id: str) -> bool:
|
|
132
|
-
"""
|
|
133
|
-
Validate if a row with this id exists or not
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
id (str): Id to check
|
|
137
|
-
"""
|
|
138
|
-
with self.Session.begin() as sess:
|
|
139
|
-
stmt = select(self.table.c.id).where(self.table.c.id == id)
|
|
140
|
-
result = sess.execute(stmt).first()
|
|
141
|
-
return result is not None
|
|
142
|
-
|
|
143
|
-
def insert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None, batch_size: int = 10) -> None:
|
|
144
|
-
"""
|
|
145
|
-
Insert documents into the table.
|
|
146
|
-
|
|
147
|
-
Args:
|
|
148
|
-
documents (List[Document]): List of documents to insert.
|
|
149
|
-
filters (Optional[Dict[str, Any]]): Optional filters for the insert.
|
|
150
|
-
batch_size (int): Number of documents to insert in each batch.
|
|
151
|
-
"""
|
|
152
|
-
with self.Session.begin() as sess:
|
|
153
|
-
counter = 0
|
|
154
|
-
for document in documents:
|
|
155
|
-
document.embed(embedder=self.embedder)
|
|
156
|
-
cleaned_content = document.content.replace("\x00", "\ufffd")
|
|
157
|
-
content_hash = md5(cleaned_content.encode()).hexdigest()
|
|
158
|
-
_id = document.id or content_hash
|
|
159
|
-
|
|
160
|
-
meta_data_json = json.dumps(document.meta_data)
|
|
161
|
-
usage_json = json.dumps(document.usage)
|
|
162
|
-
embedding_json = json.dumps(document.embedding)
|
|
163
|
-
json_array_pack = text("JSON_ARRAY_PACK(:embedding)").bindparams(embedding=embedding_json)
|
|
164
|
-
|
|
165
|
-
stmt = mysql.insert(self.table).values(
|
|
166
|
-
id=_id,
|
|
167
|
-
name=document.name,
|
|
168
|
-
meta_data=meta_data_json,
|
|
169
|
-
content=cleaned_content,
|
|
170
|
-
embedding=json_array_pack,
|
|
171
|
-
usage=usage_json,
|
|
172
|
-
content_hash=content_hash,
|
|
173
|
-
)
|
|
174
|
-
sess.execute(stmt)
|
|
175
|
-
counter += 1
|
|
176
|
-
logger.debug(f"Inserted document: {document.name} ({document.meta_data})")
|
|
177
|
-
|
|
178
|
-
# Commit all documents
|
|
179
|
-
sess.commit()
|
|
180
|
-
logger.debug(f"Committed {counter} documents")
|
|
181
|
-
|
|
182
|
-
def upsert_available(self) -> bool:
|
|
183
|
-
return False
|
|
184
|
-
|
|
185
|
-
def upsert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None, batch_size: int = 20) -> None:
|
|
186
|
-
"""
|
|
187
|
-
Upsert documents into the database.
|
|
188
|
-
|
|
189
|
-
Args:
|
|
190
|
-
documents (List[Document]): List of documents to upsert
|
|
191
|
-
filters (Optional[Dict[str, Any]]): Optional filters for upserting documents
|
|
192
|
-
batch_size (int): Batch size for upserting documents
|
|
193
|
-
"""
|
|
194
|
-
with self.Session.begin() as sess:
|
|
195
|
-
counter = 0
|
|
196
|
-
for document in documents:
|
|
197
|
-
document.embed(embedder=self.embedder)
|
|
198
|
-
cleaned_content = document.content.replace("\x00", "\ufffd")
|
|
199
|
-
content_hash = md5(cleaned_content.encode()).hexdigest()
|
|
200
|
-
_id = document.id or content_hash
|
|
201
|
-
|
|
202
|
-
meta_data_json = json.dumps(document.meta_data)
|
|
203
|
-
usage_json = json.dumps(document.usage)
|
|
204
|
-
embedding_json = json.dumps(document.embedding)
|
|
205
|
-
json_array_pack = text("JSON_ARRAY_PACK(:embedding)").bindparams(embedding=embedding_json)
|
|
206
|
-
|
|
207
|
-
stmt = mysql.insert(self.table).values(
|
|
208
|
-
id=_id,
|
|
209
|
-
name=document.name,
|
|
210
|
-
meta_data=meta_data_json,
|
|
211
|
-
content=cleaned_content,
|
|
212
|
-
embedding=json_array_pack,
|
|
213
|
-
usage=usage_json,
|
|
214
|
-
content_hash=content_hash,
|
|
215
|
-
)
|
|
216
|
-
sess.execute(stmt)
|
|
217
|
-
counter += 1
|
|
218
|
-
logger.debug(f"Inserted document: {document.id} | {document.name} | {document.meta_data}")
|
|
219
|
-
|
|
220
|
-
# Commit all remaining documents
|
|
221
|
-
sess.commit()
|
|
222
|
-
logger.debug(f"Committed {counter} documents")
|
|
223
|
-
|
|
224
|
-
def search(self, query: str, limit: int = 5, filters: Optional[Dict[str, Any]] = None) -> List[Document]:
|
|
225
|
-
"""
|
|
226
|
-
Search for documents based on a query and optional filters.
|
|
227
|
-
|
|
228
|
-
Args:
|
|
229
|
-
query (str): The search query.
|
|
230
|
-
limit (int): The maximum number of results to return.
|
|
231
|
-
filters (Optional[Dict[str, Any]]): Optional filters for the search.
|
|
232
|
-
|
|
233
|
-
Returns:
|
|
234
|
-
List[Document]: List of documents that match the query.
|
|
235
|
-
"""
|
|
236
|
-
query_embedding = self.embedder.get_embedding(query)
|
|
237
|
-
if query_embedding is None:
|
|
238
|
-
logger.error(f"Error getting embedding for Query: {query}")
|
|
239
|
-
return []
|
|
240
|
-
|
|
241
|
-
columns = [
|
|
242
|
-
self.table.c.name,
|
|
243
|
-
self.table.c.meta_data,
|
|
244
|
-
self.table.c.content,
|
|
245
|
-
func.json_array_unpack(self.table.c.embedding).label(
|
|
246
|
-
"embedding"
|
|
247
|
-
), # Unpack embedding here # self.table.c.embedding,
|
|
248
|
-
self.table.c.usage,
|
|
249
|
-
]
|
|
250
|
-
|
|
251
|
-
stmt = select(*columns)
|
|
252
|
-
|
|
253
|
-
if filters is not None:
|
|
254
|
-
for key, value in filters.items():
|
|
255
|
-
if hasattr(self.table.c, key):
|
|
256
|
-
stmt = stmt.where(getattr(self.table.c, key) == value)
|
|
257
|
-
|
|
258
|
-
if self.distance == Distance.l2:
|
|
259
|
-
stmt = stmt.order_by(self.table.c.embedding.max_inner_product(query_embedding))
|
|
260
|
-
if self.distance == Distance.cosine:
|
|
261
|
-
embedding_json = json.dumps(query_embedding)
|
|
262
|
-
dot_product_expr = func.dot_product(self.table.c.embedding, text("JSON_ARRAY_PACK(:embedding)"))
|
|
263
|
-
stmt = stmt.order_by(dot_product_expr.desc())
|
|
264
|
-
stmt = stmt.params(embedding=embedding_json)
|
|
265
|
-
# stmt = stmt.order_by(self.table.c.embedding.cosine_distance(query_embedding))
|
|
266
|
-
if self.distance == Distance.max_inner_product:
|
|
267
|
-
stmt = stmt.order_by(self.table.c.embedding.max_inner_product(query_embedding))
|
|
268
|
-
|
|
269
|
-
stmt = stmt.limit(limit=limit)
|
|
270
|
-
logger.debug(f"Query: {stmt}")
|
|
271
|
-
|
|
272
|
-
# Get neighbors
|
|
273
|
-
# This will only work if embedding column is created with `vector` data type.
|
|
274
|
-
with self.Session.begin() as sess:
|
|
275
|
-
neighbors = sess.execute(stmt).fetchall() or []
|
|
276
|
-
# if self.index is not None:
|
|
277
|
-
# if isinstance(self.index, Ivfflat):
|
|
278
|
-
# # Assuming 'nprobe' is a relevant parameter to be set for the session
|
|
279
|
-
# # Update the session settings based on the Ivfflat index configuration
|
|
280
|
-
# sess.execute(text(f"SET SESSION nprobe = {self.index.nprobe}"))
|
|
281
|
-
# elif isinstance(self.index, HNSWFlat):
|
|
282
|
-
# # Assuming 'ef_search' is a relevant parameter to be set for the session
|
|
283
|
-
# # Update the session settings based on the HNSW index configuration
|
|
284
|
-
# sess.execute(text(f"SET SESSION ef_search = {self.index.ef_search}"))
|
|
285
|
-
|
|
286
|
-
# Build search results
|
|
287
|
-
search_results: List[Document] = []
|
|
288
|
-
for neighbor in neighbors:
|
|
289
|
-
meta_data_dict = json.loads(neighbor.meta_data) if neighbor.meta_data else {}
|
|
290
|
-
usage_dict = json.loads(neighbor.usage) if neighbor.usage else {}
|
|
291
|
-
# Convert the embedding mysql.TEXT back into a list
|
|
292
|
-
embedding_list = json.loads(neighbor.embedding) if neighbor.embedding else []
|
|
293
|
-
|
|
294
|
-
search_results.append(
|
|
295
|
-
Document(
|
|
296
|
-
name=neighbor.name,
|
|
297
|
-
meta_data=meta_data_dict,
|
|
298
|
-
content=neighbor.content,
|
|
299
|
-
embedder=self.embedder,
|
|
300
|
-
embedding=embedding_list,
|
|
301
|
-
usage=usage_dict,
|
|
302
|
-
)
|
|
303
|
-
)
|
|
304
|
-
|
|
305
|
-
if self.reranker:
|
|
306
|
-
search_results = self.reranker.rerank(query=query, documents=search_results)
|
|
307
|
-
|
|
308
|
-
return search_results
|
|
309
|
-
|
|
310
|
-
def drop(self) -> None:
|
|
311
|
-
"""
|
|
312
|
-
Delete the table.
|
|
313
|
-
"""
|
|
314
|
-
if self.table_exists():
|
|
315
|
-
logger.debug(f"Deleting table: {self.collection}")
|
|
316
|
-
self.table.drop(self.db_engine)
|
|
317
|
-
|
|
318
|
-
def exists(self) -> bool:
|
|
319
|
-
"""
|
|
320
|
-
Check if the table exists.
|
|
321
|
-
|
|
322
|
-
Returns:
|
|
323
|
-
bool: True if the table exists, False otherwise.
|
|
324
|
-
"""
|
|
325
|
-
return self.table_exists()
|
|
326
|
-
|
|
327
|
-
def get_count(self) -> int:
|
|
328
|
-
"""
|
|
329
|
-
Get the count of rows in the table.
|
|
330
|
-
|
|
331
|
-
Returns:
|
|
332
|
-
int: The count of rows.
|
|
333
|
-
"""
|
|
334
|
-
with self.Session.begin() as sess:
|
|
335
|
-
stmt = select(func.count(self.table.c.name)).select_from(self.table)
|
|
336
|
-
result = sess.execute(stmt).scalar()
|
|
337
|
-
if result is not None:
|
|
338
|
-
return int(result)
|
|
339
|
-
return 0
|
|
340
|
-
|
|
341
|
-
def optimize(self) -> None:
|
|
342
|
-
pass
|
|
343
|
-
|
|
344
|
-
def delete(self) -> bool:
|
|
345
|
-
"""
|
|
346
|
-
Clear all rows from the table.
|
|
347
|
-
|
|
348
|
-
Returns:
|
|
349
|
-
bool: True if the table was cleared, False otherwise.
|
|
350
|
-
"""
|
|
351
|
-
logger.info(f"Deleting table: {self.collection}")
|
|
352
|
-
with self.Session.begin() as sess:
|
|
353
|
-
stmt = self.table.delete()
|
|
354
|
-
sess.execute(stmt)
|
|
355
|
-
return True
|
agno/workspace/__init__.py
DELETED
|
File without changes
|
agno/workspace/config.py
DELETED
|
@@ -1,325 +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.api.schemas.team import TeamSchema
|
|
7
|
-
from agno.api.schemas.workspace import WorkspaceSchema
|
|
8
|
-
from agno.infra.base import InfraBase
|
|
9
|
-
from agno.infra.resources import InfraResources
|
|
10
|
-
from agno.utils.log import logger
|
|
11
|
-
from agno.workspace.settings import WorkspaceSettings
|
|
12
|
-
|
|
13
|
-
# List of directories to ignore when loading the workspace
|
|
14
|
-
ignored_dirs = ["ignore", "test", "tests", "config"]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class WorkspaceConfig(BaseModel):
|
|
18
|
-
"""The WorkspaceConfig holds the configuration for an Agno workspace."""
|
|
19
|
-
|
|
20
|
-
# Root directory of the workspace.
|
|
21
|
-
ws_root_path: Path
|
|
22
|
-
# WorkspaceSchema: This field indicates that the workspace is synced with the api
|
|
23
|
-
ws_schema: Optional[WorkspaceSchema] = None
|
|
24
|
-
# The Team for this workspace
|
|
25
|
-
ws_team: Optional[TeamSchema] = None
|
|
26
|
-
# The API key for this workspace
|
|
27
|
-
ws_api_key: Optional[str] = None
|
|
28
|
-
|
|
29
|
-
# Path to the "workspace" directory inside the workspace root
|
|
30
|
-
_workspace_dir_path: Optional[Path] = None
|
|
31
|
-
# WorkspaceSettings
|
|
32
|
-
_workspace_settings: Optional[WorkspaceSettings] = None
|
|
33
|
-
|
|
34
|
-
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
35
|
-
|
|
36
|
-
def to_dict(self) -> dict:
|
|
37
|
-
return self.model_dump(include={"ws_root_path", "ws_schema", "ws_team", "ws_api_key"})
|
|
38
|
-
|
|
39
|
-
@property
|
|
40
|
-
def workspace_dir_path(self) -> Optional[Path]:
|
|
41
|
-
if self._workspace_dir_path is None:
|
|
42
|
-
if self.ws_root_path is not None:
|
|
43
|
-
from agno.workspace.helpers import get_workspace_dir_path
|
|
44
|
-
|
|
45
|
-
self._workspace_dir_path = get_workspace_dir_path(self.ws_root_path)
|
|
46
|
-
return self._workspace_dir_path
|
|
47
|
-
|
|
48
|
-
def validate_workspace_settings(self, obj: Any) -> bool:
|
|
49
|
-
if not isinstance(obj, WorkspaceSettings):
|
|
50
|
-
raise Exception("WorkspaceSettings must be of type WorkspaceSettings")
|
|
51
|
-
|
|
52
|
-
if self.ws_root_path is not None and obj.ws_root is not None:
|
|
53
|
-
if obj.ws_root != self.ws_root_path:
|
|
54
|
-
raise Exception(f"WorkspaceSettings.ws_root ({obj.ws_root}) must match {self.ws_root_path}")
|
|
55
|
-
return True
|
|
56
|
-
|
|
57
|
-
@property
|
|
58
|
-
def workspace_settings(self) -> Optional[WorkspaceSettings]:
|
|
59
|
-
if self._workspace_settings is not None:
|
|
60
|
-
return self._workspace_settings
|
|
61
|
-
|
|
62
|
-
ws_settings_file: Optional[Path] = None
|
|
63
|
-
if self.workspace_dir_path is not None:
|
|
64
|
-
_ws_settings_file = self.workspace_dir_path.joinpath("settings.py")
|
|
65
|
-
if _ws_settings_file.exists() and _ws_settings_file.is_file():
|
|
66
|
-
ws_settings_file = _ws_settings_file
|
|
67
|
-
if ws_settings_file is None:
|
|
68
|
-
logger.debug("workspace_settings file not found")
|
|
69
|
-
return None
|
|
70
|
-
|
|
71
|
-
logger.debug(f"Loading workspace_settings from {ws_settings_file}")
|
|
72
|
-
try:
|
|
73
|
-
from agno.utils.py_io import get_python_objects_from_module
|
|
74
|
-
|
|
75
|
-
python_objects = get_python_objects_from_module(ws_settings_file)
|
|
76
|
-
for obj_name, obj in python_objects.items():
|
|
77
|
-
if isinstance(obj, WorkspaceSettings):
|
|
78
|
-
if self.validate_workspace_settings(obj):
|
|
79
|
-
self._workspace_settings = obj
|
|
80
|
-
if self.ws_schema is not None and self._workspace_settings is not None:
|
|
81
|
-
self._workspace_settings.ws_schema = self.ws_schema
|
|
82
|
-
logger.debug("Added WorkspaceSchema to WorkspaceSettings")
|
|
83
|
-
except Exception:
|
|
84
|
-
logger.warning(f"Error in {ws_settings_file}")
|
|
85
|
-
raise
|
|
86
|
-
return self._workspace_settings
|
|
87
|
-
|
|
88
|
-
def set_local_env(self) -> None:
|
|
89
|
-
from os import environ
|
|
90
|
-
|
|
91
|
-
from agno.constants import (
|
|
92
|
-
AWS_REGION_ENV_VAR,
|
|
93
|
-
WORKSPACE_DIR_ENV_VAR,
|
|
94
|
-
WORKSPACE_ID_ENV_VAR,
|
|
95
|
-
WORKSPACE_NAME_ENV_VAR,
|
|
96
|
-
WORKSPACE_ROOT_ENV_VAR,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
if self.ws_root_path is not None:
|
|
100
|
-
environ[WORKSPACE_ROOT_ENV_VAR] = str(self.ws_root_path)
|
|
101
|
-
|
|
102
|
-
workspace_dir_path: Optional[Path] = self.workspace_dir_path
|
|
103
|
-
if workspace_dir_path is not None:
|
|
104
|
-
environ[WORKSPACE_DIR_ENV_VAR] = str(workspace_dir_path)
|
|
105
|
-
|
|
106
|
-
if self.workspace_settings is not None:
|
|
107
|
-
environ[WORKSPACE_NAME_ENV_VAR] = str(self.workspace_settings.ws_name)
|
|
108
|
-
|
|
109
|
-
if self.ws_schema is not None and self.ws_schema.id_workspace is not None:
|
|
110
|
-
environ[WORKSPACE_ID_ENV_VAR] = str(self.ws_schema.id_workspace)
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
environ.get(AWS_REGION_ENV_VAR) is None
|
|
114
|
-
and self.workspace_settings is not None
|
|
115
|
-
and self.workspace_settings.aws_region is not None
|
|
116
|
-
):
|
|
117
|
-
environ[AWS_REGION_ENV_VAR] = self.workspace_settings.aws_region
|
|
118
|
-
|
|
119
|
-
def get_resources(
|
|
120
|
-
self,
|
|
121
|
-
env: Optional[str] = None,
|
|
122
|
-
infra: Optional[str] = None,
|
|
123
|
-
order: str = "create",
|
|
124
|
-
) -> List[InfraResources]:
|
|
125
|
-
if self.ws_root_path is None:
|
|
126
|
-
logger.warning("WorkspaceConfig.ws_root_path is None")
|
|
127
|
-
return []
|
|
128
|
-
|
|
129
|
-
from sys import path as sys_path
|
|
130
|
-
|
|
131
|
-
from agno.utils.load_env import load_env
|
|
132
|
-
from agno.utils.py_io import get_python_objects_from_module
|
|
133
|
-
|
|
134
|
-
logger.debug("**--> Loading WorkspaceConfig")
|
|
135
|
-
logger.debug(f"Loading .env from {self.ws_root_path}")
|
|
136
|
-
load_env(dotenv_dir=self.ws_root_path)
|
|
137
|
-
|
|
138
|
-
# NOTE: When loading a workspace, relative imports or package imports do not work.
|
|
139
|
-
# This is a known problem in python
|
|
140
|
-
# eg: https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944
|
|
141
|
-
# To make them work, we add workspace_root to sys.path so is treated as a module
|
|
142
|
-
logger.debug(f"Adding {self.ws_root_path} to path")
|
|
143
|
-
sys_path.insert(0, str(self.ws_root_path))
|
|
144
|
-
|
|
145
|
-
workspace_dir_path: Optional[Path] = self.workspace_dir_path
|
|
146
|
-
if workspace_dir_path is not None:
|
|
147
|
-
logger.debug(f"--^^-- Loading workspace from: {workspace_dir_path}")
|
|
148
|
-
# Create a dict of objects in the workspace directory
|
|
149
|
-
workspace_objects: Dict[str, InfraResources] = {}
|
|
150
|
-
resource_files = workspace_dir_path.rglob("*.py")
|
|
151
|
-
for resource_file in resource_files:
|
|
152
|
-
if resource_file.name == "__init__.py":
|
|
153
|
-
continue
|
|
154
|
-
|
|
155
|
-
resource_file_parts = resource_file.parts
|
|
156
|
-
workspace_dir_path_parts = workspace_dir_path.parts
|
|
157
|
-
resource_file_parts_after_ws = resource_file_parts[len(workspace_dir_path_parts) :]
|
|
158
|
-
# Check if file in ignored directory
|
|
159
|
-
if any([ignored_dir in resource_file_parts_after_ws for ignored_dir in ignored_dirs]):
|
|
160
|
-
logger.debug(f"Skipping file in ignored directory: {resource_file}")
|
|
161
|
-
continue
|
|
162
|
-
logger.debug(f"Reading file: {resource_file}")
|
|
163
|
-
try:
|
|
164
|
-
python_objects = get_python_objects_from_module(resource_file)
|
|
165
|
-
# logger.debug(f"python_objects: {python_objects}")
|
|
166
|
-
for obj_name, obj in python_objects.items():
|
|
167
|
-
if isinstance(obj, WorkspaceSettings):
|
|
168
|
-
logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
|
|
169
|
-
if self.validate_workspace_settings(obj):
|
|
170
|
-
self._workspace_settings = obj
|
|
171
|
-
if self.ws_schema is not None and self._workspace_settings is not None:
|
|
172
|
-
self._workspace_settings.ws_schema = self.ws_schema
|
|
173
|
-
logger.debug("Added WorkspaceSchema to WorkspaceSettings")
|
|
174
|
-
elif isinstance(obj, InfraResources):
|
|
175
|
-
logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
|
|
176
|
-
if not obj.enabled:
|
|
177
|
-
logger.debug(f"Skipping {obj_name}: disabled")
|
|
178
|
-
continue
|
|
179
|
-
workspace_objects[obj_name] = obj
|
|
180
|
-
except Exception:
|
|
181
|
-
logger.warning(f"Error in {resource_file}")
|
|
182
|
-
raise
|
|
183
|
-
logger.debug(f"workspace_objects: {workspace_objects}")
|
|
184
|
-
logger.debug("**--> WorkspaceConfig loaded")
|
|
185
|
-
logger.debug(f"Removing {self.ws_root_path} from path")
|
|
186
|
-
sys_path.remove(str(self.ws_root_path))
|
|
187
|
-
|
|
188
|
-
# Filter resources by infra
|
|
189
|
-
filtered_ws_objects_by_infra_type: Dict[str, InfraResources] = {}
|
|
190
|
-
logger.debug(f"Filtering resources for env: {env} | infra: {infra} | order: {order}")
|
|
191
|
-
if infra is None:
|
|
192
|
-
filtered_ws_objects_by_infra_type = workspace_objects
|
|
193
|
-
else:
|
|
194
|
-
for resource_name, resource in workspace_objects.items():
|
|
195
|
-
if resource.infra == infra:
|
|
196
|
-
filtered_ws_objects_by_infra_type[resource_name] = resource
|
|
197
|
-
|
|
198
|
-
# Filter resources by env
|
|
199
|
-
filtered_infra_objects_by_env: Dict[str, InfraResources] = {}
|
|
200
|
-
if env is None:
|
|
201
|
-
filtered_infra_objects_by_env = filtered_ws_objects_by_infra_type
|
|
202
|
-
else:
|
|
203
|
-
for resource_name, resource in filtered_ws_objects_by_infra_type.items():
|
|
204
|
-
if resource.env == env:
|
|
205
|
-
filtered_infra_objects_by_env[resource_name] = resource
|
|
206
|
-
|
|
207
|
-
# Updated resources with the workspace settings
|
|
208
|
-
# Create a temporary workspace settings object if it does not exist
|
|
209
|
-
if self._workspace_settings is None:
|
|
210
|
-
self._workspace_settings = WorkspaceSettings(
|
|
211
|
-
ws_root=self.ws_root_path,
|
|
212
|
-
ws_name=self.ws_root_path.stem,
|
|
213
|
-
)
|
|
214
|
-
logger.debug(f"Created WorkspaceSettings: {self._workspace_settings}")
|
|
215
|
-
# Update the resources with the workspace settings
|
|
216
|
-
if self._workspace_settings is not None:
|
|
217
|
-
for resource_name, resource in filtered_infra_objects_by_env.items():
|
|
218
|
-
logger.debug(f"Setting workspace settings for {resource.__class__.__name__}")
|
|
219
|
-
resource.set_workspace_settings(self._workspace_settings)
|
|
220
|
-
|
|
221
|
-
# Create a list of InfraResources from the filtered resources
|
|
222
|
-
infra_resources_list: List[InfraResources] = []
|
|
223
|
-
for resource_name, resource in filtered_infra_objects_by_env.items():
|
|
224
|
-
# If the resource is an InfraResources object, add it to the list
|
|
225
|
-
if isinstance(resource, InfraResources):
|
|
226
|
-
infra_resources_list.append(resource)
|
|
227
|
-
|
|
228
|
-
return infra_resources_list
|
|
229
|
-
|
|
230
|
-
@staticmethod
|
|
231
|
-
def get_resources_from_file(
|
|
232
|
-
resource_file: Path,
|
|
233
|
-
env: Optional[str] = None,
|
|
234
|
-
infra: Optional[str] = None,
|
|
235
|
-
order: str = "create",
|
|
236
|
-
) -> List[InfraResources]:
|
|
237
|
-
if not resource_file.exists():
|
|
238
|
-
raise FileNotFoundError(f"File {resource_file} does not exist")
|
|
239
|
-
if not resource_file.is_file():
|
|
240
|
-
raise ValueError(f"Path {resource_file} is not a file")
|
|
241
|
-
if not resource_file.suffix == ".py":
|
|
242
|
-
raise ValueError(f"File {resource_file} is not a python file")
|
|
243
|
-
|
|
244
|
-
from sys import path as sys_path
|
|
245
|
-
|
|
246
|
-
from agno.utils.load_env import load_env
|
|
247
|
-
from agno.utils.py_io import get_python_objects_from_module
|
|
248
|
-
|
|
249
|
-
resource_file_parent_dir = resource_file.parent.resolve()
|
|
250
|
-
logger.debug(f"Loading .env from {resource_file_parent_dir}")
|
|
251
|
-
load_env(dotenv_dir=resource_file_parent_dir)
|
|
252
|
-
|
|
253
|
-
temporary_ws_config = WorkspaceConfig(ws_root_path=resource_file_parent_dir)
|
|
254
|
-
|
|
255
|
-
# NOTE: When loading a directory, relative imports or package imports do not work.
|
|
256
|
-
# This is a known problem in python
|
|
257
|
-
# eg: https://stackoverflow.com/questions/6323860/sibling-package-imports/50193944#50193944
|
|
258
|
-
# To make them work, we add the resource_file_parent_dir to sys.path so it can be treated as a module
|
|
259
|
-
logger.debug(f"Adding {resource_file_parent_dir} to path")
|
|
260
|
-
sys_path.insert(0, str(resource_file_parent_dir))
|
|
261
|
-
|
|
262
|
-
logger.debug(f"**--> Reading Infra resources from {resource_file}")
|
|
263
|
-
|
|
264
|
-
# Get all infra resources from the file
|
|
265
|
-
infra_objects: Dict[str, InfraBase] = {}
|
|
266
|
-
try:
|
|
267
|
-
# Get all python objects from the file
|
|
268
|
-
python_objects = get_python_objects_from_module(resource_file)
|
|
269
|
-
# Filter out the objects that are subclasses of InfraBase
|
|
270
|
-
for obj_name, obj in python_objects.items():
|
|
271
|
-
if isinstance(obj, InfraBase):
|
|
272
|
-
logger.debug(f"Found: {obj.__class__.__module__}: {obj_name}")
|
|
273
|
-
if not obj.enabled:
|
|
274
|
-
logger.debug(f"Skipping {obj_name}: disabled")
|
|
275
|
-
continue
|
|
276
|
-
infra_objects[obj_name] = obj
|
|
277
|
-
except Exception:
|
|
278
|
-
logger.error(f"Error reading: {resource_file}")
|
|
279
|
-
raise
|
|
280
|
-
|
|
281
|
-
# Filter resources by infra
|
|
282
|
-
filtered_infra_objects_by_infra_type: Dict[str, InfraBase] = {}
|
|
283
|
-
logger.debug(f"Filtering resources for env: {env} | infra: {infra} | order: {order}")
|
|
284
|
-
if infra is None:
|
|
285
|
-
filtered_infra_objects_by_infra_type = infra_objects
|
|
286
|
-
else:
|
|
287
|
-
for resource_name, resource in infra_objects.items():
|
|
288
|
-
if resource.infra == infra:
|
|
289
|
-
filtered_infra_objects_by_infra_type[resource_name] = resource
|
|
290
|
-
|
|
291
|
-
# Filter resources by env
|
|
292
|
-
filtered_infra_objects_by_env: Dict[str, InfraBase] = {}
|
|
293
|
-
if env is None:
|
|
294
|
-
filtered_infra_objects_by_env = filtered_infra_objects_by_infra_type
|
|
295
|
-
else:
|
|
296
|
-
for resource_name, resource in filtered_infra_objects_by_infra_type.items():
|
|
297
|
-
if resource.env == env:
|
|
298
|
-
filtered_infra_objects_by_env[resource_name] = resource
|
|
299
|
-
|
|
300
|
-
# Updated resources with the workspace settings
|
|
301
|
-
# Create a temporary workspace settings object if it does not exist
|
|
302
|
-
if temporary_ws_config._workspace_settings is None:
|
|
303
|
-
temporary_ws_config._workspace_settings = WorkspaceSettings(
|
|
304
|
-
ws_root=temporary_ws_config.ws_root_path,
|
|
305
|
-
ws_name=temporary_ws_config.ws_root_path.stem,
|
|
306
|
-
)
|
|
307
|
-
# Update the resources with the workspace settings
|
|
308
|
-
if temporary_ws_config._workspace_settings is not None:
|
|
309
|
-
for resource_name, resource in filtered_infra_objects_by_env.items():
|
|
310
|
-
logger.debug(f"Setting workspace settings for {resource.__class__.__name__}")
|
|
311
|
-
resource.set_workspace_settings(temporary_ws_config._workspace_settings)
|
|
312
|
-
|
|
313
|
-
# Create a list of InfraResources from the filtered resources
|
|
314
|
-
infra_resources_list: List[InfraResources] = []
|
|
315
|
-
for resource_name, resource in filtered_infra_objects_by_env.items():
|
|
316
|
-
# If the resource is an InfraResources object, add it to the list
|
|
317
|
-
if isinstance(resource, InfraResources):
|
|
318
|
-
infra_resources_list.append(resource)
|
|
319
|
-
# Otherwise, get the InfraResources object from the resource
|
|
320
|
-
else:
|
|
321
|
-
_infra_resources = resource.get_infra_resources()
|
|
322
|
-
if _infra_resources is not None and isinstance(_infra_resources, InfraResources):
|
|
323
|
-
infra_resources_list.append(_infra_resources)
|
|
324
|
-
|
|
325
|
-
return infra_resources_list
|