From 98fc3b82f3f16488b343948c823be997b5368cc5 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 13:44:20 -0500 Subject: [PATCH 01/28] refactor of bicep variable names to be more generic and pytest cleanup --- backend/poetry.lock | 716 ++++++------------ backend/pyproject.toml | 10 +- .../tests/unit/test_logger_blob_callbacks.py | 10 - infra/deploy.sh | 4 +- infra/main.bicep | 55 +- 5 files changed, 273 insertions(+), 522 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index c7cdf554..c755299f 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -592,6 +592,7 @@ files = [ ] [package.dependencies] +tinycss2 = {version = ">=1.1.0,<1.5", optional = true, markers = "extra == \"css\""} webencodings = "*" [package.extras] @@ -824,17 +825,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "cloudpickle" -version = "3.1.0" -description = "Pickler class to extend the standard pickle.Pickler functionality" -optional = false -python-versions = ">=3.8" -files = [ - {file = "cloudpickle-3.1.0-py3-none-any.whl", hash = "sha256:fe11acda67f61aaaec473e3afe030feb131d78a43461b718185363384f1ba12e"}, - {file = "cloudpickle-3.1.0.tar.gz", hash = "sha256:81a929b6e3c7335c863c771d673d105f02efdb89dfaba0c90495d1c64796601b"}, -] - [[package]] name = "colorama" version = "0.4.6" @@ -1181,57 +1171,6 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "dask" -version = "2024.12.1" -description = "Parallel PyData with Task Scheduling" -optional = false -python-versions = ">=3.10" -files = [ - {file = "dask-2024.12.1-py3-none-any.whl", hash = "sha256:1f32acddf1a6994e3af6734756f0a92467c47050bc29f3555bb9b140420e8e19"}, - {file = "dask-2024.12.1.tar.gz", hash = "sha256:bac809af21c2dd7eb06827bccbfc612504f3ee6435580e548af912828f823195"}, -] - -[package.dependencies] -click = ">=8.1" -cloudpickle = ">=3.0.0" -dask-expr = {version = ">=1.1,<1.2", optional = true, markers = "extra == \"dataframe\""} -fsspec = ">=2021.09.0" -importlib_metadata = {version = ">=4.13.0", markers = "python_version < \"3.12\""} -numpy = {version = ">=1.24", optional = true, markers = "extra == \"array\""} -packaging = ">=20.0" -pandas = {version = ">=2.0", optional = true, markers = "extra == \"dataframe\""} -partd = ">=1.4.0" -pyyaml = ">=5.3.1" -toolz = ">=0.10.0" - -[package.extras] -array = ["numpy (>=1.24)"] -complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=14.0.1)"] -dataframe = ["dask-expr (>=1.1,<1.2)", "dask[array]", "pandas (>=2.0)"] -diagnostics = ["bokeh (>=3.1.0)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.12.1)"] -test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] - -[[package]] -name = "dask-expr" -version = "1.1.21" -description = "High Level Expressions for Dask" -optional = false -python-versions = ">=3.10" -files = [ - {file = "dask_expr-1.1.21-py3-none-any.whl", hash = "sha256:2c2a9a0b0e66b26cf918679988f97e947bc936544f3a106102055adb9a9edeba"}, - {file = "dask_expr-1.1.21.tar.gz", hash = "sha256:eb45de8e6fea1ce2608a431b4e03a484592defb1796665530c91386ffac581d3"}, -] - -[package.dependencies] -dask = "2024.12.1" -pandas = ">=2" -pyarrow = ">=14.0.1" - -[package.extras] -analyze = ["crick", "distributed", "graphviz"] - [[package]] name = "datashaper" version = "0.0.49" @@ -1632,6 +1571,28 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "fnllm" +version = "0.0.10" +description = "A function-based LLM protocol and wrapper." +optional = false +python-versions = ">=3.10" +files = [ + {file = "fnllm-0.0.10-py3-none-any.whl", hash = "sha256:e676001d9b0ebbe194590393d427385760adaefcab6a456268e4f13a0e9d2cb6"}, + {file = "fnllm-0.0.10.tar.gz", hash = "sha256:ece859432b83a462dc35db6483f36313ff935b79f437186daa44e3679f4f49cf"}, +] + +[package.dependencies] +aiolimiter = ">=1.1.0" +httpx = ">=0.27.0" +json-repair = ">=0.30.0" +pydantic = ">=2.8.2" +tenacity = ">=8.5.0" + +[package.extras] +azure = ["azure-identity (>=1.17.1)", "azure-storage-blob (>=12.20.0)"] +openai = ["openai (>=1.35.12)", "tiktoken (>=0.7.0)"] + [[package]] name = "fonttools" version = "4.55.3" @@ -1939,47 +1900,47 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "graphrag" -version = "0.3.3" -description = "" +version = "1.0.1" +description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." optional = false python-versions = "<3.13,>=3.10" files = [ - {file = "graphrag-0.3.3-py3-none-any.whl", hash = "sha256:b48b2bd98f168b5fea182d9db42e61d13496d87c80be90d5e431b56bbe930bc0"}, - {file = "graphrag-0.3.3.tar.gz", hash = "sha256:2a082e6c47ee93b469862d3f46b94e2578d2133c95f1280e07855f119a9279a8"}, + {file = "graphrag-1.0.1-py3-none-any.whl", hash = "sha256:821f5c4017f79802ee4e97fa00582b9720ab8146b651523825cb037b978e0fd7"}, + {file = "graphrag-1.0.1.tar.gz", hash = "sha256:178da70b500fd7a85d422774a14ae45ed315f0bb61bebd28f36bccd56da45fa1"}, ] [package.dependencies] aiofiles = ">=24.1.0,<25.0.0" -aiolimiter = ">=1.1.0,<2.0.0" -azure-identity = ">=1.17.1,<2.0.0" -azure-search-documents = ">=11.4.0,<12.0.0" -azure-storage-blob = ">=12.22.0,<13.0.0" +azure-identity = ">=1.19.0,<2.0.0" +azure-search-documents = ">=11.5.2,<12.0.0" +azure-storage-blob = ">=12.24.0,<13.0.0" datashaper = ">=0.0.49,<0.0.50" devtools = ">=0.12.2,<0.13.0" environs = ">=11.0.0,<12.0.0" -fastparquet = ">=2024.2.0,<2025.0.0" +fnllm = ">=0.0.10,<0.0.11" future = ">=1.0.0,<2.0.0" graspologic = ">=3.4.1,<4.0.0" -json-repair = ">=0.28.4,<0.29.0" -lancedb = ">=0.12.0,<0.13.0" -nest-asyncio = {version = ">=1.6.0,<2.0.0", markers = "platform_system == \"Windows\""} -networkx = ">=3,<4" +httpx = ">=0.28.1,<0.29.0" +json-repair = ">=0.30.3,<0.31.0" +lancedb = ">=0.17.0,<0.18.0" +matplotlib = ">=3.9.3,<4.0.0" +networkx = ">=3.4.2,<4.0.0" nltk = "3.9.1" -numba = "0.60.0" numpy = ">=1.25.2,<2.0.0" -openai = ">=1.37.1,<2.0.0" +openai = ">=1.57.0,<2.0.0" +pandas = ">=2.2.3,<3.0.0" pyaml-env = ">=1.2.1,<2.0.0" -pydantic = ">=2,<3" -python-dotenv = ">=1.0.0,<2.0.0" +pyarrow = ">=15.0.0,<16.0.0" +pydantic = ">=2.10.3,<3.0.0" +python-dotenv = ">=1.0.1,<2.0.0" pyyaml = ">=6.0.2,<7.0.0" -rich = ">=13.6.0,<14.0.0" -scipy = "1.12.0" -swifter = ">=1.4.0,<2.0.0" +rich = ">=13.9.4,<14.0.0" tenacity = ">=9.0.0,<10.0.0" -textual = ">=0.78.0,<0.79.0" -tiktoken = ">=0.7.0,<0.8.0" +tiktoken = ">=0.8.0,<0.9.0" +tqdm = ">=4.67.1,<5.0.0" +typer = ">=0.15.1,<0.16.0" typing-extensions = ">=4.12.2,<5.0.0" -uvloop = {version = ">=0.20.0,<0.21.0", markers = "platform_system != \"Windows\""} +umap-learn = ">=0.5.6,<0.6.0" [[package]] name = "graspologic" @@ -2409,13 +2370,13 @@ files = [ [[package]] name = "json-repair" -version = "0.28.4" +version = "0.30.3" description = "A package to repair broken json strings" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "json_repair-0.28.4-py3-none-any.whl", hash = "sha256:b3e138735b25773a7c02b42498c80aa7d6b7aec168a3ee100473f7c5e22334e5"}, - {file = "json_repair-0.28.4.tar.gz", hash = "sha256:b7f1c48d8bc9e18a24e2b05459e8afb0a82cade5a242382422a9b065a6762578"}, + {file = "json_repair-0.30.3-py3-none-any.whl", hash = "sha256:63bb588162b0958ae93d85356ecbe54c06b8c33f8a4834f93fa2719ea669804e"}, + {file = "json_repair-0.30.3.tar.gz", hash = "sha256:0ac56e7ae9253ee9c507a7e1a3a26799c9b0bbe5e2bec1b2cc5053e90d5b05e3"}, ] [[package]] @@ -2864,30 +2825,25 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "lancedb" -version = "0.12.0" +version = "0.17.0" description = "lancedb" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "lancedb-0.12.0-cp38-abi3-macosx_10_15_x86_64.whl", hash = "sha256:28df523b1b1d7b3db47ee95baa8dd85b94238e811a1b04de91083b47aa28dcb5"}, - {file = "lancedb-0.12.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:07a92887e470befe5d89ef960afcd516bb9501796458751885499d31c1e448de"}, - {file = "lancedb-0.12.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea79b71f2382a3974447a341e0fbb904b9db70269f32378f4cb45b2b20b90771"}, - {file = "lancedb-0.12.0-cp38-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:db9d4f37252075ede29e090517eb15025d85edcd56001e788b7b7a22190b2028"}, - {file = "lancedb-0.12.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:8c52158181b6f63cc24a93c11f4bd038d8932ac8c9d14ef9c6e6aaeefb54fb1f"}, - {file = "lancedb-0.12.0-cp38-abi3-win_amd64.whl", hash = "sha256:c4e63c3b5b3ce40303ec350ba7000bfb7c7c181b7de59c7950f7c2c4bda0421c"}, + {file = "lancedb-0.17.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:40aac1583edda390e51189c4e95bdfd4768d23705234e12a7b81957f1143df42"}, + {file = "lancedb-0.17.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:895bed499dae61cac1dbfc40ad71a566e06ab5c8d538aa57873a0cba859f8a7a"}, + {file = "lancedb-0.17.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea688d0f63796ee912a7cfe6667f36661e36756fa8340b94dd54d666a7db63f"}, + {file = "lancedb-0.17.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:f51a61950ead30a605b5653a81e8362e4aac6fec32705b88b9c9319e9308b2bb"}, + {file = "lancedb-0.17.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:07e6f10b3fcbeb6c737996e5ebd68d04c3ca2656a9b8b970111ecf368245e7f6"}, + {file = "lancedb-0.17.0-cp39-abi3-win_amd64.whl", hash = "sha256:9d7e82f83f430d906c285d3303729258b21b1cc8da634c9f7017e354bcb7318a"}, ] [package.dependencies] -attrs = ">=21.3.0" -cachetools = "*" deprecation = "*" overrides = ">=0.7" packaging = "*" pydantic = ">=1.10" -pylance = "0.16.0" -ratelimiter = ">=1.0,<2.0" -requests = ">=2.31.0" -retry = ">=0.9.2" +pylance = "0.20.0" tqdm = ">=4.27.0" [package.extras] @@ -2895,29 +2851,9 @@ azure = ["adlfs (>=2024.2.0)"] clip = ["open-clip", "pillow", "torch"] dev = ["pre-commit", "ruff"] docs = ["mkdocs", "mkdocs-jupyter", "mkdocs-material", "mkdocstrings[python]"] -embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "google-generativeai", "huggingface-hub", "ibm-watsonx-ai (>=1.1.2)", "instructorembedding", "ollama", "open-clip-torch", "openai (>=1.6.1)", "pillow", "sentence-transformers", "torch"] +embeddings = ["awscli (>=1.29.57)", "boto3 (>=1.28.57)", "botocore (>=1.31.57)", "cohere", "google-generativeai", "huggingface-hub", "ibm-watsonx-ai (>=1.1.2)", "instructorembedding", "ollama", "open-clip-torch", "openai (>=1.6.1)", "pillow", "requests (>=2.31.0)", "sentence-transformers", "torch"] tests = ["aiohttp", "boto3", "duckdb", "pandas (>=1.4)", "polars (>=0.19,<=1.3.0)", "pytest", "pytest-asyncio", "pytest-mock", "pytz", "tantivy"] -[[package]] -name = "linkify-it-py" -version = "2.0.3" -description = "Links recognition library with FULL unicode support." -optional = false -python-versions = ">=3.7" -files = [ - {file = "linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048"}, - {file = "linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79"}, -] - -[package.dependencies] -uc-micro-py = "*" - -[package.extras] -benchmark = ["pytest", "pytest-benchmark"] -dev = ["black", "flake8", "isort", "pre-commit", "pyproject-flake8"] -doc = ["myst-parser", "sphinx", "sphinx-book-theme"] -test = ["coverage", "pytest", "pytest-cov"] - [[package]] name = "llvmlite" version = "0.43.0" @@ -2948,17 +2884,6 @@ files = [ {file = "llvmlite-0.43.0.tar.gz", hash = "sha256:ae2b5b5c3ef67354824fb75517c8db5fbe93bc02cd9671f3c62271626bc041d5"}, ] -[[package]] -name = "locket" -version = "1.0.0" -description = "File-based locks for Python on Linux and Windows" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, - {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, -] - [[package]] name = "markdown-it-py" version = "3.0.0" @@ -2971,8 +2896,6 @@ files = [ ] [package.dependencies] -linkify-it-py = {version = ">=1,<3", optional = true, markers = "extra == \"linkify\""} -mdit-py-plugins = {version = "*", optional = true, markers = "extra == \"plugins\""} mdurl = ">=0.1,<1.0" [package.extras] @@ -3156,25 +3079,6 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "mdit-py-plugins" -version = "0.4.2" -description = "Collection of plugins for markdown-it-py" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, - {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, -] - -[package.dependencies] -markdown-it-py = ">=1.0.0,<4.0.0" - -[package.extras] -code-style = ["pre-commit"] -rtd = ["myst-parser", "sphinx-book-theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] - [[package]] name = "mdurl" version = "0.1.2" @@ -3383,18 +3287,18 @@ test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>= [[package]] name = "nbconvert" -version = "7.16.4" +version = "7.16.5" description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, - {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, + {file = "nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547"}, + {file = "nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344"}, ] [package.dependencies] beautifulsoup4 = "*" -bleach = "!=5.0.0" +bleach = {version = "!=5.0.0", extras = ["css"]} defusedxml = "*" jinja2 = ">=3.0" jupyter-core = ">=4.7" @@ -3406,7 +3310,6 @@ nbformat = ">=5.7" packaging = "*" pandocfilters = ">=1.4.1" pygments = ">=2.4.1" -tinycss2 = "*" traitlets = ">=5.1" [package.extras] @@ -3841,24 +3744,6 @@ files = [ qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["docopt", "pytest"] -[[package]] -name = "partd" -version = "1.4.2" -description = "Appendable key-value storage" -optional = false -python-versions = ">=3.9" -files = [ - {file = "partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f"}, - {file = "partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c"}, -] - -[package.dependencies] -locket = "*" -toolz = "*" - -[package.extras] -complete = ["blosc", "numpy (>=1.20.0)", "pandas (>=1.3)", "pyzmq"] - [[package]] name = "patsy" version = "1.0.1" @@ -3892,93 +3777,89 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "11.0.0" +version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" files = [ - {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"}, - {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"}, - {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"}, - {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"}, - {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"}, - {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"}, - {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"}, - {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"}, - {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"}, - {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"}, - {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"}, - {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"}, - {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"}, - {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"}, - {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"}, - {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"}, - {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"}, - {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"}, - {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, - {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, - {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, - {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, - {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, - {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, - {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, - {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"}, - {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"}, - {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"}, - {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"}, - {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"}, - {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"}, - {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"}, - {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"}, - {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"}, - {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] typing = ["typing-extensions"] xmp = ["defusedxml"] @@ -4286,17 +4167,6 @@ files = [ [package.extras] tests = ["pytest"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyaml-env" version = "1.2.1" @@ -4588,28 +4458,30 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylance" -version = "0.16.0" +version = "0.20.0" description = "python wrapper for Lance columnar format" optional = false python-versions = ">=3.9" files = [ - {file = "pylance-0.16.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:ee0c11d15d6e1d5cac6fb5dbcd443db1dc8a581ea0251b1df6f0dcc80175a006"}, - {file = "pylance-0.16.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1b0ac2c25aed3f3afdbbb36f45ef076b84f7b2f8fc3edcdfb94c4c485b55b22d"}, - {file = "pylance-0.16.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9d2daf0fc1f6006c0f0b955cb976f0f25e7fa3813dc60c09446ac7a05172888"}, - {file = "pylance-0.16.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:449d961ee5c7eaff76a87bbfeaa77576747448f0a8b8d646db8ba0f6c282eee2"}, - {file = "pylance-0.16.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:85abe3171995a436adbfa205f751cc82ccef3332740626e0217f2b48e6b22d4e"}, - {file = "pylance-0.16.0-cp39-abi3-win_amd64.whl", hash = "sha256:77d821d8e9bd1bcaefb6a40d5dddf112740cf81b9ab317c9ebc60a7035ae9282"}, + {file = "pylance-0.20.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:fbb640b00567ff79d23a5994c0f0bc97587fcf74ece6ca568e77c453f70801c5"}, + {file = "pylance-0.20.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8e30f1b6429b843429fde8f3d6fb7e715153174161e3bcf29902e2d32ee471f"}, + {file = "pylance-0.20.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032242a347ac909db81c0ade6384d82102f4ec61bc892d8caaa04b3d0a7b1613"}, + {file = "pylance-0.20.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:5320f11925524c1a67279afc4638cad60f61c36f11d3d9c2a91651489874be0d"}, + {file = "pylance-0.20.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:fa5acd4488c574f6017145eafd5b45b178d611a5cbcd2ed492e01013fc72f5a2"}, + {file = "pylance-0.20.0-cp39-abi3-win_amd64.whl", hash = "sha256:587850cddd0e669addd9414f378fa30527fc9020010cb73c842f026ea8a9b4ea"}, ] [package.dependencies] -numpy = ">=1.22,<2" -pyarrow = ">=12" +numpy = ">=1.22" +pyarrow = ">=14" [package.extras] benchmarks = ["pytest-benchmark"] +cuvs-cu11 = ["cuvs-cu11", "pylibraft-cu11"] +cuvs-cu12 = ["cuvs-cu12", "pylibraft-cu12"] dev = ["ruff (==0.4.1)"] -ray = ["ray[data]"] -tests = ["boto3", "datasets", "duckdb", "h5py (<3.11)", "ml-dtypes", "pandas", "pillow", "polars[pandas,pyarrow]", "pytest", "tensorflow", "tqdm"] +ray = ["ray[data] (<2.38)"] +tests = ["boto3", "datasets", "duckdb", "ml-dtypes", "pandas", "pillow", "polars[pandas,pyarrow]", "pytest", "tensorflow", "tqdm"] torch = ["torch"] [[package]] @@ -4632,13 +4504,13 @@ scipy = ">=1.0" [[package]] name = "pyparsing" -version = "3.2.0" +version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" files = [ - {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, - {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, ] [package.extras] @@ -4668,13 +4540,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-asyncio" -version = "0.25.0" +version = "0.25.1" description = "Pytest support for asyncio" optional = false python-versions = ">=3.9" files = [ - {file = "pytest_asyncio-0.25.0-py3-none-any.whl", hash = "sha256:db5432d18eac6b7e28b46dcd9b69921b55c3b1086e85febfe04e70b18d9e81b3"}, - {file = "pytest_asyncio-0.25.0.tar.gz", hash = "sha256:8c0610303c9e0442a5db8604505fc0f545456ba1528824842b37b4a626cbf609"}, + {file = "pytest_asyncio-0.25.1-py3-none-any.whl", hash = "sha256:c84878849ec63ff2ca509423616e071ef9cd8cc93c053aa33b5b8fb70a990671"}, + {file = "pytest_asyncio-0.25.1.tar.gz", hash = "sha256:79be8a72384b0c917677e00daa711e07db15259f4d23203c59012bcd989d4aee"}, ] [package.dependencies] @@ -5029,20 +4901,6 @@ files = [ [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} -[[package]] -name = "ratelimiter" -version = "1.2.0.post0" -description = "Simple python rate limiting object" -optional = false -python-versions = "*" -files = [ - {file = "ratelimiter-1.2.0.post0-py3-none-any.whl", hash = "sha256:a52be07bc0bb0b3674b4b304550f10c769bbb00fead3072e035904474259809f"}, - {file = "ratelimiter-1.2.0.post0.tar.gz", hash = "sha256:5c395dcabdbbde2e5178ef3f89b568a3066454a6ddc223b76473dac22f89b4f7"}, -] - -[package.extras] -test = ["pytest (>=3.0)", "pytest-asyncio"] - [[package]] name = "referencing" version = "0.35.1" @@ -5200,21 +5058,6 @@ requests = ">=2.0.0" [package.extras] rsa = ["oauthlib[signedtoken] (>=3.0.0)"] -[[package]] -name = "retry" -version = "0.9.2" -description = "Easy to use retry decorator." -optional = false -python-versions = "*" -files = [ - {file = "retry-0.9.2-py2.py3-none-any.whl", hash = "sha256:ccddf89761fa2c726ab29391837d4327f819ea14d244c232a1d24c67a2f98606"}, - {file = "retry-0.9.2.tar.gz", hash = "sha256:f8bfa8b99b69c4506d6f5bd3b0aabf77f98cdb17f3c9fc3f5ca820033336fba4"}, -] - -[package.dependencies] -decorator = ">=3.4.2" -py = ">=1.4.26,<2.0.0" - [[package]] name = "rfc3339-validator" version = "0.1.4" @@ -5387,29 +5230,29 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruff" -version = "0.8.4" +version = "0.8.5" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.8.4-py3-none-linux_armv6l.whl", hash = "sha256:58072f0c06080276804c6a4e21a9045a706584a958e644353603d36ca1eb8a60"}, - {file = "ruff-0.8.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ffb60904651c00a1e0b8df594591770018a0f04587f7deeb3838344fe3adabac"}, - {file = "ruff-0.8.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:6ddf5d654ac0d44389f6bf05cee4caeefc3132a64b58ea46738111d687352296"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e248b1f0fa2749edd3350a2a342b67b43a2627434c059a063418e3d375cfe643"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf197b98ed86e417412ee3b6c893f44c8864f816451441483253d5ff22c0e81e"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c41319b85faa3aadd4d30cb1cffdd9ac6b89704ff79f7664b853785b48eccdf3"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:9f8402b7c4f96463f135e936d9ab77b65711fcd5d72e5d67597b543bbb43cf3f"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4e56b3baa9c23d324ead112a4fdf20db9a3f8f29eeabff1355114dd96014604"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:736272574e97157f7edbbb43b1d046125fce9e7d8d583d5d65d0c9bf2c15addf"}, - {file = "ruff-0.8.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fe710ab6061592521f902fca7ebcb9fabd27bc7c57c764298b1c1f15fff720"}, - {file = "ruff-0.8.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:13e9ec6d6b55f6da412d59953d65d66e760d583dd3c1c72bf1f26435b5bfdbae"}, - {file = "ruff-0.8.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:97d9aefef725348ad77d6db98b726cfdb075a40b936c7984088804dfd38268a7"}, - {file = "ruff-0.8.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ab78e33325a6f5374e04c2ab924a3367d69a0da36f8c9cb6b894a62017506111"}, - {file = "ruff-0.8.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8ef06f66f4a05c3ddbc9121a8b0cecccd92c5bf3dd43b5472ffe40b8ca10f0f8"}, - {file = "ruff-0.8.4-py3-none-win32.whl", hash = "sha256:552fb6d861320958ca5e15f28b20a3d071aa83b93caee33a87b471f99a6c0835"}, - {file = "ruff-0.8.4-py3-none-win_amd64.whl", hash = "sha256:f21a1143776f8656d7f364bd264a9d60f01b7f52243fbe90e7670c0dfe0cf65d"}, - {file = "ruff-0.8.4-py3-none-win_arm64.whl", hash = "sha256:9183dd615d8df50defa8b1d9a074053891ba39025cf5ae88e8bcb52edcc4bf08"}, - {file = "ruff-0.8.4.tar.gz", hash = "sha256:0d5f89f254836799af1615798caa5f80b7f935d7a670fad66c5007928e57ace8"}, + {file = "ruff-0.8.5-py3-none-linux_armv6l.whl", hash = "sha256:5ad11a5e3868a73ca1fa4727fe7e33735ea78b416313f4368c504dbeb69c0f88"}, + {file = "ruff-0.8.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:f69ab37771ea7e0715fead8624ec42996d101269a96e31f4d31be6fc33aa19b7"}, + {file = "ruff-0.8.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b5462d7804558ccff9c08fe8cbf6c14b7efe67404316696a2dde48297b1925bb"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d56de7220a35607f9fe59f8a6d018e14504f7b71d784d980835e20fc0611cd50"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d99cf80b0429cbebf31cbbf6f24f05a29706f0437c40413d950e67e2d4faca4"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b75ac29715ac60d554a049dbb0ef3b55259076181c3369d79466cb130eb5afd"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c9d526a62c9eda211b38463528768fd0ada25dad524cb33c0e99fcff1c67b5dc"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:587c5e95007612c26509f30acc506c874dab4c4abbacd0357400bd1aa799931b"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:622b82bf3429ff0e346835ec213aec0a04d9730480cbffbb6ad9372014e31bbd"}, + {file = "ruff-0.8.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f99be814d77a5dac8a8957104bdd8c359e85c86b0ee0e38dca447cb1095f70fb"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c01c048f9c3385e0fd7822ad0fd519afb282af9cf1778f3580e540629df89725"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7512e8cb038db7f5db6aae0e24735ff9ea03bb0ed6ae2ce534e9baa23c1dc9ea"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:762f113232acd5b768d6b875d16aad6b00082add40ec91c927f0673a8ec4ede8"}, + {file = "ruff-0.8.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:03a90200c5dfff49e4c967b405f27fdfa81594cbb7c5ff5609e42d7fe9680da5"}, + {file = "ruff-0.8.5-py3-none-win32.whl", hash = "sha256:8710ffd57bdaa6690cbf6ecff19884b8629ec2a2a2a2f783aa94b1cc795139ed"}, + {file = "ruff-0.8.5-py3-none-win_amd64.whl", hash = "sha256:4020d8bf8d3a32325c77af452a9976a9ad6455773bcb94991cf15bd66b347e47"}, + {file = "ruff-0.8.5-py3-none-win_arm64.whl", hash = "sha256:134ae019ef13e1b060ab7136e7828a6d83ea727ba123381307eb37c6bd5e01cb"}, + {file = "ruff-0.8.5.tar.gz", hash = "sha256:1098d36f69831f7ff2a1da3e6407d5fbd6dfa2559e4f74ff2d260c5588900317"}, ] [[package]] @@ -5565,6 +5408,17 @@ enabler = ["pytest-enabler (>=2.2)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + [[package]] name = "six" version = "1.17.0" @@ -5710,26 +5564,6 @@ build = ["cython (>=3.0.10)"] develop = ["colorama", "cython (>=3.0.10)", "cython (>=3.0.10,<4)", "flake8", "isort", "joblib", "matplotlib (>=3)", "pytest (>=7.3.0,<8)", "pytest-cov", "pytest-randomly", "pytest-xdist", "pywinpty", "setuptools-scm[toml] (>=8.0,<9.0)"] docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "numpydoc", "pandas-datareader", "sphinx"] -[[package]] -name = "swifter" -version = "1.4.0" -description = "A package which efficiently applies any function to a pandas dataframe or series in the fastest available manner" -optional = false -python-versions = "*" -files = [ - {file = "swifter-1.4.0.tar.gz", hash = "sha256:e1bb74476a21b3f07a17aa18c97fdcba8599726bd17da732f09dabcc50e26ba0"}, -] - -[package.dependencies] -dask = {version = ">=2.10.0", extras = ["dataframe"]} -pandas = ">=1.0.0" -psutil = ">=5.6.6" -tqdm = ">=4.33.0" - -[package.extras] -groupby = ["ray (>=1.0.0)"] -notebook = ["ipywidgets (>=7.0.0)"] - [[package]] name = "tenacity" version = "9.0.0" @@ -5766,25 +5600,6 @@ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] -[[package]] -name = "textual" -version = "0.78.0" -description = "Modern Text User Interface framework" -optional = false -python-versions = "<4.0.0,>=3.8.1" -files = [ - {file = "textual-0.78.0-py3-none-any.whl", hash = "sha256:c9d3c7dc467c37ee2e54a0283ac2c85dac35e4fc949518ed054a65b8e3e9b822"}, - {file = "textual-0.78.0.tar.gz", hash = "sha256:421f508b0d41ea0b8ecf273bf83f0d19376667eb0a87f70575252395d90ab315"}, -] - -[package.dependencies] -markdown-it-py = {version = ">=2.1.0", extras = ["linkify", "plugins"]} -rich = ">=13.3.3" -typing-extensions = ">=4.4.0,<5.0.0" - -[package.extras] -syntax = ["tree-sitter (>=0.20.1,<0.21.0)", "tree-sitter-languages (==1.10.2)"] - [[package]] name = "threadpoolctl" version = "3.5.0" @@ -5798,47 +5613,42 @@ files = [ [[package]] name = "tiktoken" -version = "0.7.0" +version = "0.8.0" description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "tiktoken-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485f3cc6aba7c6b6ce388ba634fbba656d9ee27f766216f45146beb4ac18b25f"}, - {file = "tiktoken-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e54be9a2cd2f6d6ffa3517b064983fb695c9a9d8aa7d574d1ef3c3f931a99225"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79383a6e2c654c6040e5f8506f3750db9ddd71b550c724e673203b4f6b4b4590"}, - {file = "tiktoken-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d4511c52caacf3c4981d1ae2df85908bd31853f33d30b345c8b6830763f769c"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13c94efacdd3de9aff824a788353aa5749c0faee1fbe3816df365ea450b82311"}, - {file = "tiktoken-0.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8e58c7eb29d2ab35a7a8929cbeea60216a4ccdf42efa8974d8e176d50c9a3df5"}, - {file = "tiktoken-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:21a20c3bd1dd3e55b91c1331bf25f4af522c525e771691adbc9a69336fa7f702"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:10c7674f81e6e350fcbed7c09a65bca9356eaab27fb2dac65a1e440f2bcfe30f"}, - {file = "tiktoken-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:084cec29713bc9d4189a937f8a35dbdfa785bd1235a34c1124fe2323821ee93f"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811229fde1652fedcca7c6dfe76724d0908775b353556d8a71ed74d866f73f7b"}, - {file = "tiktoken-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b6e7dc2e7ad1b3757e8a24597415bafcfb454cebf9a33a01f2e6ba2e663992"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1063c5748be36344c7e18c7913c53e2cca116764c2080177e57d62c7ad4576d1"}, - {file = "tiktoken-0.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20295d21419bfcca092644f7e2f2138ff947a6eb8cfc732c09cc7d76988d4a89"}, - {file = "tiktoken-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:959d993749b083acc57a317cbc643fb85c014d055b2119b739487288f4e5d1cb"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:71c55d066388c55a9c00f61d2c456a6086673ab7dec22dd739c23f77195b1908"}, - {file = "tiktoken-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09ed925bccaa8043e34c519fbb2f99110bd07c6fd67714793c21ac298e449410"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03c6c40ff1db0f48a7b4d2dafeae73a5607aacb472fa11f125e7baf9dce73704"}, - {file = "tiktoken-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d20b5c6af30e621b4aca094ee61777a44118f52d886dbe4f02b70dfe05c15350"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d427614c3e074004efa2f2411e16c826f9df427d3c70a54725cae860f09e4bf4"}, - {file = "tiktoken-0.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c46d7af7b8c6987fac9b9f61041b452afe92eb087d29c9ce54951280f899a97"}, - {file = "tiktoken-0.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:0bc603c30b9e371e7c4c7935aba02af5994a909fc3c0fe66e7004070858d3f8f"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2398fecd38c921bcd68418675a6d155fad5f5e14c2e92fcf5fe566fa5485a858"}, - {file = "tiktoken-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f5f6afb52fb8a7ea1c811e435e4188f2bef81b5e0f7a8635cc79b0eef0193d6"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:861f9ee616766d736be4147abac500732b505bf7013cfaf019b85892637f235e"}, - {file = "tiktoken-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54031f95c6939f6b78122c0aa03a93273a96365103793a22e1793ee86da31685"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:fffdcb319b614cf14f04d02a52e26b1d1ae14a570f90e9b55461a72672f7b13d"}, - {file = "tiktoken-0.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c72baaeaefa03ff9ba9688624143c858d1f6b755bb85d456d59e529e17234769"}, - {file = "tiktoken-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:131b8aeb043a8f112aad9f46011dced25d62629091e51d9dc1adbf4a1cc6aa98"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cabc6dc77460df44ec5b879e68692c63551ae4fae7460dd4ff17181df75f1db7"}, - {file = "tiktoken-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8d57f29171255f74c0aeacd0651e29aa47dff6f070cb9f35ebc14c82278f3b25"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee92776fdbb3efa02a83f968c19d4997a55c8e9ce7be821ceee04a1d1ee149c"}, - {file = "tiktoken-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e215292e99cb41fbc96988ef62ea63bb0ce1e15f2c147a61acc319f8b4cbe5bf"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a81bac94769cab437dd3ab0b8a4bc4e0f9cf6835bcaa88de71f39af1791727a"}, - {file = "tiktoken-0.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d6d73ea93e91d5ca771256dfc9d1d29f5a554b83821a1dc0891987636e0ae226"}, - {file = "tiktoken-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:2bcb28ddf79ffa424f171dfeef9a4daff61a94c631ca6813f43967cb263b83b9"}, - {file = "tiktoken-0.7.0.tar.gz", hash = "sha256:1077266e949c24e0291f6c350433c6f0971365ece2b173a23bc3b9f9defef6b6"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e"}, + {file = "tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560"}, + {file = "tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2"}, + {file = "tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9"}, + {file = "tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1"}, + {file = "tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d"}, + {file = "tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47"}, + {file = "tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419"}, + {file = "tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:881839cfeae051b3628d9823b2e56b5cc93a9e2efb435f4cf15f17dc45f21586"}, + {file = "tiktoken-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fe9399bdc3f29d428f16a2f86c3c8ec20be3eac5f53693ce4980371c3245729b"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a58deb7075d5b69237a3ff4bb51a726670419db6ea62bdcd8bd80c78497d7ab"}, + {file = "tiktoken-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2908c0d043a7d03ebd80347266b0e58440bdef5564f84f4d29fb235b5df3b04"}, + {file = "tiktoken-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:294440d21a2a51e12d4238e68a5972095534fe9878be57d905c476017bff99fc"}, + {file = "tiktoken-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:d8f3192733ac4d77977432947d563d7e1b310b96497acd3c196c9bddb36ed9db"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:02be1666096aff7da6cbd7cdaa8e7917bfed3467cd64b38b1f112e96d3b06a24"}, + {file = "tiktoken-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94ff53c5c74b535b2cbf431d907fc13c678bbd009ee633a2aca269a04389f9a"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b231f5e8982c245ee3065cd84a4712d64692348bc609d84467c57b4b72dcbc5"}, + {file = "tiktoken-0.8.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4177faa809bd55f699e88c96d9bb4635d22e3f59d635ba6fd9ffedf7150b9953"}, + {file = "tiktoken-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5376b6f8dc4753cd81ead935c5f518fa0fbe7e133d9e25f648d8c4dabdd4bad7"}, + {file = "tiktoken-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:18228d624807d66c87acd8f25fc135665617cab220671eb65b50f5d70fa51f69"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e17807445f0cf1f25771c9d86496bd8b5c376f7419912519699f3cc4dc5c12e"}, + {file = "tiktoken-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:886f80bd339578bbdba6ed6d0567a0d5c6cfe198d9e587ba6c447654c65b8edc"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6adc8323016d7758d6de7313527f755b0fc6c72985b7d9291be5d96d73ecd1e1"}, + {file = "tiktoken-0.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b591fb2b30d6a72121a80be24ec7a0e9eb51c5500ddc7e4c2496516dd5e3816b"}, + {file = "tiktoken-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:845287b9798e476b4d762c3ebda5102be87ca26e5d2c9854002825d60cdb815d"}, + {file = "tiktoken-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:1473cfe584252dc3fa62adceb5b1c763c1874e04511b197da4e6de51d6ce5a02"}, + {file = "tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2"}, ] [package.dependencies] @@ -5907,17 +5717,6 @@ files = [ {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] -[[package]] -name = "toolz" -version = "1.0.0" -description = "List processing tools and functional utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236"}, - {file = "toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02"}, -] - [[package]] name = "tornado" version = "6.4.2" @@ -5974,6 +5773,23 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] +[[package]] +name = "typer" +version = "0.15.1" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.7" +files = [ + {file = "typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847"}, + {file = "typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a"}, +] + +[package.dependencies] +click = ">=8.0.0" +rich = ">=10.11.0" +shellingham = ">=1.3.0" +typing-extensions = ">=3.7.4.3" + [[package]] name = "types-python-dateutil" version = "2.9.0.20241206" @@ -6007,20 +5823,6 @@ files = [ {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] -[[package]] -name = "uc-micro-py" -version = "1.0.3" -description = "Micro subset of unicode data files for linkify-it-py projects." -optional = false -python-versions = ">=3.7" -files = [ - {file = "uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a"}, - {file = "uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5"}, -] - -[package.extras] -test = ["coverage", "pytest", "pytest-cov"] - [[package]] name = "umap-learn" version = "0.5.7" @@ -6095,50 +5897,6 @@ typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} [package.extras] standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] -[[package]] -name = "uvloop" -version = "0.20.0" -description = "Fast implementation of asyncio event loop on top of libuv" -optional = false -python-versions = ">=3.8.0" -files = [ - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9ebafa0b96c62881d5cafa02d9da2e44c23f9f0cd829f3a32a6aff771449c996"}, - {file = "uvloop-0.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35968fc697b0527a06e134999eef859b4034b37aebca537daeb598b9d45a137b"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b16696f10e59d7580979b420eedf6650010a4a9c3bd8113f24a103dfdb770b10"}, - {file = "uvloop-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b04d96188d365151d1af41fa2d23257b674e7ead68cfd61c725a422764062ae"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94707205efbe809dfa3a0d09c08bef1352f5d3d6612a506f10a319933757c006"}, - {file = "uvloop-0.20.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:89e8d33bb88d7263f74dc57d69f0063e06b5a5ce50bb9a6b32f5fcbe655f9e73"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e50289c101495e0d1bb0bfcb4a60adde56e32f4449a67216a1ab2750aa84f037"}, - {file = "uvloop-0.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e237f9c1e8a00e7d9ddaa288e535dc337a39bcbf679f290aee9d26df9e72bce9"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:746242cd703dc2b37f9d8b9f173749c15e9a918ddb021575a0205ec29a38d31e"}, - {file = "uvloop-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82edbfd3df39fb3d108fc079ebc461330f7c2e33dbd002d146bf7c445ba6e756"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80dc1b139516be2077b3e57ce1cb65bfed09149e1d175e0478e7a987863b68f0"}, - {file = "uvloop-0.20.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f44af67bf39af25db4c1ac27e82e9665717f9c26af2369c404be865c8818dcf"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4b75f2950ddb6feed85336412b9a0c310a2edbcf4cf931aa5cfe29034829676d"}, - {file = "uvloop-0.20.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:77fbc69c287596880ecec2d4c7a62346bef08b6209749bf6ce8c22bbaca0239e"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6462c95f48e2d8d4c993a2950cd3d31ab061864d1c226bbf0ee2f1a8f36674b9"}, - {file = "uvloop-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:649c33034979273fa71aa25d0fe120ad1777c551d8c4cd2c0c9851d88fcb13ab"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a609780e942d43a275a617c0839d85f95c334bad29c4c0918252085113285b5"}, - {file = "uvloop-0.20.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aea15c78e0d9ad6555ed201344ae36db5c63d428818b4b2a42842b3870127c00"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0e94b221295b5e69de57a1bd4aeb0b3a29f61be6e1b478bb8a69a73377db7ba"}, - {file = "uvloop-0.20.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fee6044b64c965c425b65a4e17719953b96e065c5b7e09b599ff332bb2744bdf"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:265a99a2ff41a0fd56c19c3838b29bf54d1d177964c300dad388b27e84fd7847"}, - {file = "uvloop-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10c2956efcecb981bf9cfb8184d27d5d64b9033f917115a960b83f11bfa0d6b"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e7d61fe8e8d9335fac1bf8d5d82820b4808dd7a43020c149b63a1ada953d48a6"}, - {file = "uvloop-0.20.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2beee18efd33fa6fdb0976e18475a4042cd31c7433c866e8a09ab604c7c22ff2"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d8c36fdf3e02cec92aed2d44f63565ad1522a499c654f07935c8f9d04db69e95"}, - {file = "uvloop-0.20.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0fac7be202596c7126146660725157d4813aa29a4cc990fe51346f75ff8fde7"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0fba61846f294bce41eb44d60d58136090ea2b5b99efd21cbdf4e21927c56a"}, - {file = "uvloop-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95720bae002ac357202e0d866128eb1ac82545bcf0b549b9abe91b5178d9b541"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:36c530d8fa03bfa7085af54a48f2ca16ab74df3ec7108a46ba82fd8b411a2315"}, - {file = "uvloop-0.20.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e97152983442b499d7a71e44f29baa75b3b02e65d9c44ba53b10338e98dedb66"}, - {file = "uvloop-0.20.0.tar.gz", hash = "sha256:4603ca714a754fc8d9b197e325db25b2ea045385e8a3ad05d3463de725fdf469"}, -] - -[package.extras] -docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] -test = ["Cython (>=0.29.36,<0.30.0)", "aiohttp (==3.9.0b0)", "aiohttp (>=3.8.1)", "flake8 (>=5.0,<6.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=23.0.0,<23.1.0)", "pycodestyle (>=2.9.0,<2.10.0)"] - [[package]] name = "virtualenv" version = "20.28.0" @@ -6425,4 +6183,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "d4e96d771f8a3a2a585eb83d1c8af67a58b4635330baf3b4bf9ce565c217c642" +content-hash = "bae0ddd74ebd3aa28bc21fb73b05b1f563cfd6aa8b032b82a7a05d4bc40555e2" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index add88b82..68bb2e2f 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "graphrag-solution-accelerator" -version = "0.1.1" +version = "1.0.1" description = "" authors = [ "Josh Bradley ", @@ -10,7 +10,7 @@ authors = [ "Douglas Orbaker ", "Chris Sanchez ", "Shane Solomon ", - "Kenny Zhang " + "Kenny Zhang ", ] license = "MIT" package-mode = false @@ -45,6 +45,7 @@ attrs = ">=23.2.0" azure-core = ">=1.30.1" azure-cosmos = ">=4.5.1" azure-identity = ">=1.15.0" +azure-monitor-opentelemetry-exporter = "*" azure-search-documents = ">=11.4.0" azure-storage-blob = ">=12.19.0" datashaper = ">=0.0.46" @@ -53,13 +54,12 @@ fastapi = ">=0.110.0" fastapi-offline = ">=1.7.3" fastparquet = ">=2023.10.1" fsspec = ">=2024.2.0" -graphrag = "==0.3.3" +graphrag = "==1.0.1" graspologic = ">=3.3.0" httpx = ">=0.25.2" kubernetes = ">=29.0.0" networkx = ">=3.2.1" nltk = "*" -azure-monitor-opentelemetry-exporter = "*" opentelemetry-sdk = ">=1.27.0" pandas = ">=2.2.1" pyaml-env = ">=1.2.1" @@ -69,8 +69,8 @@ python-multipart = ">=0.0.6" requests = "*" rich = ">=13.7.1" tiktoken = ">=0.6.0" -uvicorn = ">=0.23.2" urllib3 = ">=2.2.2" +uvicorn = ">=0.23.2" [tool.ruff] target-version = "py310" diff --git a/backend/tests/unit/test_logger_blob_callbacks.py b/backend/tests/unit/test_logger_blob_callbacks.py index c1d935b2..b7e7fb26 100644 --- a/backend/tests/unit/test_logger_blob_callbacks.py +++ b/backend/tests/unit/test_logger_blob_callbacks.py @@ -44,16 +44,6 @@ def test_on_workflow_end(workflow_callbacks): assert workflow_callbacks._blob_service_client.get_blob_client().append_block.called -# def test_on_workflow_step_start(workflow_callbacks): -# workflow_callbacks.on_workflow_step_start("test_step", object()) -# assert workflow_callbacks._blob_service_client.get_blob_client().append_block.called - - -# def test_on_workflow_step_end(workflow_callbacks): -# workflow_callbacks.on_workflow_step_end("test_step", object()) -# assert workflow_callbacks._blob_service_client.get_blob_client().append_block.called - - def test_on_error(workflow_callbacks): workflow_callbacks.on_error("test_error", Exception("test_exception")) assert workflow_callbacks._blob_service_client.get_blob_client().append_block.called diff --git a/infra/deploy.sh b/infra/deploy.sh index 888c7589..d7fa847b 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -445,7 +445,7 @@ installGraphRAGHelmChart () { local cosmosEndpoint=$(jq -r .azure_cosmosdb_endpoint.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$cosmosEndpoint" "Unable to parse CosmosDB endpoint from Azure outputs, exiting..." - local graphragHostname=$(jq -r .azure_graphrag_hostname.value <<< $AZURE_OUTPUTS) + local graphragHostname=$(jq -r .azure_app_hostname.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$graphragHostname" "Unable to parse graphrag hostname from deployment outputs, exiting..." local storageAccountBlobUrl=$(jq -r .azure_storage_account_blob_url.value <<< $AZURE_OUTPUTS) @@ -559,7 +559,7 @@ deployGraphragAPI () { local apimName=$(jq -r .azure_apim_name.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$apimName" "Error parsing apim name from azure outputs, exiting..." local backendSwaggerUrl="$apimGatewayUrl/manpage/openapi.json" - local graphragUrl=$(jq -r .azure_graphrag_url.value <<< $AZURE_OUTPUTS) + local graphragUrl=$(jq -r .azure_app_url.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$graphragUrl" "Error parsing GraphRAG URL from azure outputs, exiting..." waitForGraphragBackend $backendSwaggerUrl diff --git a/infra/main.bicep b/infra/main.bicep index a312ffdf..846a90cf 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -17,14 +17,14 @@ Private Endpoints Managed Identity */ -@description('Unique name to append to each resource') -param resourceBaseName string = '' -var resourceBaseNameFinal = !empty(resourceBaseName) ? resourceBaseName : toLower(uniqueString('${subscription().id}/resourceGroups/${graphRagName}')) - @minLength(1) @maxLength(64) @description('Name of the resource group that GraphRAG will be deployed in.') -param graphRagName string +param resourceGroupName string + +@description('Unique name to append to each resource') +param resourceBaseName string = '' +var resourceBaseNameFinal = !empty(resourceBaseName) ? resourceBaseName : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroupName}')) @description('Cloud region for all resources') param location string = resourceGroup().location @@ -34,13 +34,13 @@ param deployerPrincipalId string @minLength(1) @description('Name of the publisher of the API Management instance.') -param publisherName string +param apiPublisherName string @minLength(1) @description('Email address of the publisher of the API Management instance.') -param publisherEmail string +param apiPublisherEmail string -@description('The AKS namespace the workload identity service account will be created in.') +@description('The AKS namespace to install GraphRAG in.') param aksNamespace string = 'graphrag' @description('Public key to allow access to AKS Linux nodes.') @@ -52,21 +52,25 @@ param enablePrivateEndpoints bool = true @description('Whether to restore the API Management instance.') param restoreAPIM bool = false -param acrName string = '' -param apimName string = '' +// optional parameters that will default to a generated name if not provided param apimTier string = 'Developer' +param apimName string = '' +param acrName string = '' param storageAccountName string = '' param cosmosDbName string = '' param aiSearchName string = '' -var graphRagDnsLabel = 'graphrag' -var dnsDomain = 'graphrag.io' -var graphRagHostname = '${graphRagDnsLabel}.${dnsDomain}' -var graphRagUrl = 'http://${graphRagHostname}' + var abbrs = loadJsonContent('abbreviations.json') -var tags = { 'azd-env-name': graphRagName } +var tags = { 'azd-env-name': resourceGroupName } var workloadIdentityName = '${abbrs.managedIdentityUserAssignedIdentities}${resourceBaseNameFinal}' var aksServiceAccountName = '${aksNamespace}-workload-sa' var workloadIdentitySubject = 'system:serviceaccount:${aksNamespace}:${aksServiceAccountName}' + +// endpoint configuration +var dnsDomain = 'graphrag.io' +var appHostname = 'graphrag.${dnsDomain}' +var appUrl = 'http://${appHostname}' + @description('Role definitions for various roles that will be assigned at deployment time. Learn more: https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles') var roles = { storageBlobDataContributor: resourceId( @@ -81,29 +85,28 @@ var roles = { 'Microsoft.Authorization/roleDefinitions', '8ebe5a00-799e-43f5-93ac-243d3dce84a7' // AI Search Index Data Contributor Role ) - aiSearchIndexDataReader: resourceId ( + aiSearchIndexDataReader: resourceId( 'Microsoft.Authorization/roleDefinitions', '1407120a-92aa-4202-b7e9-c0e197c71c8f' // AI Search Index Data Reader Role ) - privateDnsZoneContributor: resourceId ( + privateDnsZoneContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role ) - networkContributor: resourceId ( + networkContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7' // Network Contributor Role ) - cognitiveServicesOpenaiContributor: resourceId ( + cognitiveServicesOpenaiContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', 'a001fd3d-188f-4b5d-821b-7da978bf7442' // Cognitive Services OpenAI Contributor ) - acrPull: resourceId ( + acrPull: resourceId( 'Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d' // ACR Pull Role ) } - module log 'core/log-analytics/log.bicep' = { name: 'log-analytics' params:{ @@ -281,8 +284,8 @@ module apim 'core/apim/apim.bicep' = { sku: apimTier skuCount: 1 // TODO expose in param for premium sku availabilityZones: [] // TODO expose in param for premium sku - publisherEmail: publisherEmail - publisherName: publisherName + publisherEmail: apiPublisherEmail + publisherName: apiPublisherName logAnalyticsWorkspaceId: log.outputs.id subnetId: vnet.properties.subnets[0].id // apim subnet } @@ -292,7 +295,7 @@ module graphragApi 'core/apim/apim.graphrag-documentation.bicep' = { name: 'graphrag-api' params: { apimname: apim.outputs.name - backendUrl: graphRagUrl + backendUrl: appUrl } } @@ -407,8 +410,8 @@ output azure_app_insights_connection_string string = apim.outputs.appInsightsCon output azure_apim_name string = apim.outputs.name output azure_apim_gateway_url string = apim.outputs.apimGatewayUrl output azure_dns_zone_name string = privateDnsZone.outputs.name -output azure_graphrag_hostname string = graphRagHostname -output azure_graphrag_url string = graphRagUrl +output azure_app_hostname string = appHostname +output azure_app_url string = appUrl output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId output azure_workload_identity_name string = workloadIdentity.outputs.name From 2b41976d88696fce039c40ccf0286f4aa032705b Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 13:45:20 -0500 Subject: [PATCH 02/28] add RBAC reader role assignment to cosmosdb bicep deployment --- infra/core/cosmosdb/cosmosdb.bicep | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/infra/core/cosmosdb/cosmosdb.bicep b/infra/core/cosmosdb/cosmosdb.bicep index b64f02ae..36ede469 100644 --- a/infra/core/cosmosdb/cosmosdb.bicep +++ b/infra/core/cosmosdb/cosmosdb.bicep @@ -15,12 +15,15 @@ param publicNetworkAccess string = 'Disabled' '00000000-0000-0000-0000-000000000001' // 'Cosmos DB Built-in Data Reader' role '00000000-0000-0000-0000-000000000002' // 'Cosmos DB Built-in Data Contributor' role ]) -param roleDefinitionId string = '00000000-0000-0000-0000-000000000002' +param roleDefinitionId array = [ + '00000000-0000-0000-0000-000000000001' + '00000000-0000-0000-0000-000000000002' +] param principalId string -resource cosmosDb 'Microsoft.DocumentDB/databaseAccounts@2022-11-15' = { +resource cosmosDb 'Microsoft.DocumentDB/databaseAccounts@2024-11-15' = { name: cosmosDbName location: location tags: { @@ -165,15 +168,17 @@ resource containerStoreContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatab } } -resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-11-15' = { - name: guid('${roleDefinitionId}-${principalId}-${cosmosDb.id}') - parent: cosmosDb - properties: { - roleDefinitionId: '/${subscription().id}/resourceGroups/${resourceGroup().name}/providers/Microsoft.DocumentDB/databaseAccounts/${cosmosDb.name}/sqlRoleDefinitions/${roleDefinitionId}' - principalId: principalId - scope: cosmosDb.id +resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-11-15' = [ + for id in roleDefinitionId: { + name: guid('${id}-${principalId}-${cosmosDb.id}') + parent: cosmosDb + properties: { + roleDefinitionId: '${resourceGroup().id}/providers/Microsoft.DocumentDB/databaseAccounts/${cosmosDb.name}/sqlRoleDefinitions/${id}' + principalId: principalId + scope: cosmosDb.id + } } -} +] output name string = cosmosDb.name output id string = cosmosDb.id From 699bfa589ae4df8f3b666a2b437acfeb027d385d Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 14:11:45 -0500 Subject: [PATCH 03/28] update dependabot settings --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 34010525..50468762 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,6 +6,6 @@ version: 2 updates: - package-ecosystem: "pip" - directory: "/" + directory: "/backend" schedule: interval: "weekly" From ff5714af1fa59816c014cc4896b0946d874f4cf2 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 19:27:05 -0500 Subject: [PATCH 04/28] update code references to new locations in graphrag library --- backend/src/api/query.py | 6 +- backend/src/api/query_streaming.py | 8 ++- backend/src/logger/load_logger.py | 2 +- backend/src/logger/typing.py | 6 +- backend/src/typing/pipeline.py | 6 +- backend/tests/conftest.py | 7 +- .../tests/integration/test_utils_pipeline.py | 71 +++++++++++++++++++ 7 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 backend/tests/integration/test_utils_pipeline.py diff --git a/backend/src/api/query.py b/backend/src/api/query.py index 134a3203..3c18cf86 100644 --- a/backend/src/api/query.py +++ b/backend/src/api/query.py @@ -16,9 +16,9 @@ APIRouter, HTTPException, ) +from graphrag.api.query import global_search, local_search from graphrag.config import create_graphrag_config from graphrag.model.types import TextEmbedder -from graphrag.query.api import global_search, local_search from graphrag.vector_stores.base import ( BaseVectorStore, VectorStoreDocument, @@ -408,9 +408,9 @@ async def local_query(request: GraphRequest): parameters.embeddings.vector_store["index_names"] = sanitized_index_names # internally write over the get_embedding_description_store # method to use the multi-index collection. - import graphrag.query.api + import graphrag.api.query - graphrag.query.api._get_embedding_description_store = ( + graphrag.api.query._get_embedding_description_store = ( _get_embedding_description_store ) # perform async search diff --git a/backend/src/api/query_streaming.py b/backend/src/api/query_streaming.py index 6b80d551..555e9ff2 100644 --- a/backend/src/api/query_streaming.py +++ b/backend/src/api/query_streaming.py @@ -13,11 +13,13 @@ HTTPException, ) from fastapi.responses import StreamingResponse -from graphrag.config import create_graphrag_config -from graphrag.query.api import ( +from graphrag.api.query import ( global_search_streaming as global_search_streaming_internal, ) -from graphrag.query.api import local_search_streaming as local_search_streaming_internal +from graphrag.api.query import ( + local_search_streaming as local_search_streaming_internal, +) +from graphrag.config import create_graphrag_config from src.api.azure_clients import AzureClientManager from src.api.common import ( diff --git a/backend/src/logger/load_logger.py b/backend/src/logger/load_logger.py index cd0383db..db326d9d 100644 --- a/backend/src/logger/load_logger.py +++ b/backend/src/logger/load_logger.py @@ -6,7 +6,7 @@ from typing import List from datashaper import WorkflowCallbacks, WorkflowCallbacksManager -from graphrag.index.reporting import FileWorkflowCallbacks +from graphrag.callbacks.file_workflow_callbacks import FileWorkflowCallbacks from src.api.azure_clients import AzureClientManager from src.logger.application_insights_workflow_callbacks import ( diff --git a/backend/src/logger/typing.py b/backend/src/logger/typing.py index 0e543847..7494bf91 100644 --- a/backend/src/logger/typing.py +++ b/backend/src/logger/typing.py @@ -5,9 +5,9 @@ from enum import Enum from typing import Literal -from graphrag.index.config import ( +from graphrag.index.config.reporting import ( PipelineReportingConfig, - reporting, + PipelineReportingConfigTypes, ) from pydantic import Field as pydantic_Field @@ -46,5 +46,5 @@ class PipelineAppInsightsReportingConfig( # add the new type to the existing PipelineReportingConfigTypes PipelineReportingConfigTypes = ( - reporting.PipelineReportingConfigTypes | PipelineAppInsightsReportingConfig + PipelineReportingConfigTypes | PipelineAppInsightsReportingConfig ) diff --git a/backend/src/typing/pipeline.py b/backend/src/typing/pipeline.py index 55ed9668..6f0bce63 100644 --- a/backend/src/typing/pipeline.py +++ b/backend/src/typing/pipeline.py @@ -4,8 +4,12 @@ from enum import Enum -class PipelineJobState(Enum): +class PipelineJobState(str, Enum): SCHEDULED = "scheduled" RUNNING = "running" FAILED = "failed" COMPLETE = "complete" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index b7881591..8d5f18b0 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -18,12 +18,13 @@ def blob_with_data_container_name(blob_service_client: BlobServiceClient): # create a storage container and upload some data container_name = "container-with-data" - blob_service_client.create_container(container_name) - blob_client = blob_service_client.get_blob_client(container_name, "data.txt") + sanitized_name = sanitize_name(container_name) + blob_service_client.create_container(sanitized_name) + blob_client = blob_service_client.get_blob_client(sanitized_name, "data.txt") blob_client.upload_blob(data="Hello, World!", overwrite=True) yield container_name # cleanup - blob_service_client.delete_container(container_name) + blob_service_client.delete_container(sanitized_name) @pytest.fixture(scope="session") diff --git a/backend/tests/integration/test_utils_pipeline.py b/backend/tests/integration/test_utils_pipeline.py new file mode 100644 index 00000000..a36e774d --- /dev/null +++ b/backend/tests/integration/test_utils_pipeline.py @@ -0,0 +1,71 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +""" +Integration tests for the PipelineJob class. +""" + +from typing import Generator + +import pytest + +from src.typing.pipeline import PipelineJobState +from src.utils.pipeline import PipelineJob + + +@pytest.fixture() +def cosmos_index_job_entry(cosmos_client) -> Generator[str, None, None]: + """Create an entry for an indexing job in the appropriate CosmosDB database and container + that graphrag expects when first scheduling an indexing job.""" + + db_client = cosmos_client.get_database_client("graphrag") + container_client = db_client.get_container_client("jobs") + synthetic_job_entry = { + "id": "testID", + "epoch_request_time": 0, + "human_readable_index_name": "test_human_readable_index_name", + "sanitized_index_name": "test_sanitized_index_name", + "human_readable_storage_name": "test_human_readable_storage_name", + "sanitized_storage_name": "test_sanitized_storage_name", + "all_workflows": ["workflow1", "workflow2"], + "completed_workflows": ["workflow1"], + "failed_workflows": ["workflow2"], + "status": PipelineJobState.COMPLETE, + "percent_complete": 50.0, + "progress": "some progress", + } + container_client.upsert_item(synthetic_job_entry) + yield synthetic_job_entry["id"] + # teardown + container_client.delete_item( + synthetic_job_entry["id"], partition_key=synthetic_job_entry["id"] + ) + + +def test_pipeline_job_interface(cosmos_index_job_entry): + pipeline_job = PipelineJob() + # test creating a new entry + pipeline_job.create_item( + id="synthetic_id", + human_readable_index_name="test_human_readable_index_name", + human_readable_storage_name="test_human_readable_storage_name", + entity_extraction_prompt="fake entity extraction prompt", + community_report_prompt="fake community report prompt", + summarize_descriptions_prompt="fake summarize descriptions prompt", + ) + assert pipeline_job.item_exist("synthetic_id") + + # test loading an existing entry + pipeline_job = pipeline_job.load_item(cosmos_index_job_entry) + assert pipeline_job.id == "testID" + assert pipeline_job.human_readable_index_name == "test_human_readable_index_name" + assert pipeline_job.sanitized_index_name == "test_sanitized_index_name" + assert ( + pipeline_job.human_readable_storage_name == "test_human_readable_storage_name" + ) + assert pipeline_job.sanitized_storage_name == "test_sanitized_storage_name" + assert pipeline_job.all_workflows == ["workflow1", "workflow2"] + assert pipeline_job.completed_workflows == ["workflow1"] + assert pipeline_job.failed_workflows == ["workflow2"] + assert pipeline_job.status == PipelineJobState.COMPLETE + assert pipeline_job.percent_complete == 50.0 + assert pipeline_job.progress == "some progress" From 0252646d16fac9a697d006c751d07f970519f13e Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 23:19:28 -0500 Subject: [PATCH 05/28] refactor variable names to be more generic and add integration tests --- backend/src/api/index_configuration.py | 46 +++++++------------ .../tests/integration/test_utils_pipeline.py | 35 ++++++++++++++ infra/deploy.sh | 6 +-- 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/backend/src/api/index_configuration.py b/backend/src/api/index_configuration.py index 43efa34e..55c24c35 100644 --- a/backend/src/api/index_configuration.py +++ b/backend/src/api/index_configuration.py @@ -3,16 +3,15 @@ import inspect import os -import shutil import traceback +import graphrag.api as api import yaml from fastapi import ( APIRouter, HTTPException, ) -from fastapi.responses import StreamingResponse -from graphrag.prompt_tune.cli import prompt_tune as generate_fine_tune_prompts +from graphrag.config.create_graphrag_config import create_graphrag_config from src.api.azure_clients import AzureClientManager from src.api.common import ( @@ -27,7 +26,7 @@ @index_configuration_route.get( "/prompts", - summary="Generate graphrag prompts from user-provided data.", + summary="Generate prompts from user-provided data.", description="Generating custom prompts from user-provided data may take several minutes to run based on the amount of data used.", ) async def generate_prompts(storage_name: str, limit: int = 5): @@ -44,29 +43,23 @@ async def generate_prompts(storage_name: str, limit: int = 5): status_code=500, detail=f"Data container '{storage_name}' does not exist.", ) + + # load pipeline configuration file (settings.yaml) for input data and other settings this_directory = os.path.dirname( os.path.abspath(inspect.getfile(inspect.currentframe())) ) - - # write custom settings.yaml to a file and store in a temporary directory data = yaml.safe_load(open(f"{this_directory}/pipeline-settings.yaml")) data["input"]["container_name"] = sanitized_storage_name - temp_dir = f"/tmp/{sanitized_storage_name}_prompt_tuning" - shutil.rmtree(temp_dir, ignore_errors=True) - os.makedirs(temp_dir, exist_ok=True) - with open(f"{temp_dir}/settings.yaml", "w") as f: - yaml.dump(data, f, default_flow_style=False) + graphrag_config = create_graphrag_config(values=data, root_dir=".") # generate prompts try: - await generate_fine_tune_prompts( - config=f"{temp_dir}/settings.yaml", - root=temp_dir, - domain="", - selection_method="random", + # NOTE: we need to call api.generate_indexing_prompts + prompts: tuple[str, str, str] = await api.generate_indexing_prompts( + config=graphrag_config, + root=".", limit=limit, - skip_entity_types=True, - output=f"{temp_dir}/prompts", + selection_method="random", ) except Exception as e: logger = LoggerSingleton().get_instance() @@ -84,14 +77,9 @@ async def generate_prompts(storage_name: str, limit: int = 5): detail=f"Error generating prompts for data in '{storage_name}'. Please try a lower limit.", ) - # zip up the generated prompt files and return the zip file - temp_archive = ( - f"{temp_dir}/prompts" # will become a zip file with the name prompts.zip - ) - shutil.make_archive(temp_archive, "zip", root_dir=temp_dir, base_dir="prompts") - - def iterfile(file_path: str): - with open(file_path, mode="rb") as file_like: - yield from file_like - - return StreamingResponse(iterfile(f"{temp_archive}.zip")) + content = { + "entity_extraction_prompt": prompts[0], + "entity_summarization_prompt": prompts[1], + "community_summarization_prompt": prompts[2], + } + return content # return a fastapi.responses.JSONResponse object diff --git a/backend/tests/integration/test_utils_pipeline.py b/backend/tests/integration/test_utils_pipeline.py index a36e774d..8cc40c97 100644 --- a/backend/tests/integration/test_utils_pipeline.py +++ b/backend/tests/integration/test_utils_pipeline.py @@ -42,7 +42,9 @@ def cosmos_index_job_entry(cosmos_client) -> Generator[str, None, None]: def test_pipeline_job_interface(cosmos_index_job_entry): + """Test the src.utils.pipeline.PipelineJob class interface.""" pipeline_job = PipelineJob() + # test creating a new entry pipeline_job.create_item( id="synthetic_id", @@ -69,3 +71,36 @@ def test_pipeline_job_interface(cosmos_index_job_entry): assert pipeline_job.status == PipelineJobState.COMPLETE assert pipeline_job.percent_complete == 50.0 assert pipeline_job.progress == "some progress" + assert pipeline_job.calculate_percent_complete() == 50.0 + + # test setters and getters + pipeline_job.id = "newID" + assert pipeline_job.id == "newID" + pipeline_job.epoch_request_time = 1 + assert pipeline_job.epoch_request_time == 1 + + pipeline_job.human_readable_index_name = "new_human_readable_index_name" + assert pipeline_job.human_readable_index_name == "new_human_readable_index_name" + pipeline_job.sanitized_index_name = "new_sanitized_index_name" + assert pipeline_job.sanitized_index_name == "new_sanitized_index_name" + + pipeline_job.human_readable_storage_name = "new_human_readable_storage_name" + assert pipeline_job.human_readable_storage_name == "new_human_readable_storage_name" + pipeline_job.sanitized_storage_name = "new_sanitized_storage_name" + assert pipeline_job.sanitized_storage_name == "new_sanitized_storage_name" + + pipeline_job.entity_extraction_prompt = "new_entity_extraction_prompt" + assert pipeline_job.entity_extraction_prompt == "new_entity_extraction_prompt" + pipeline_job.community_report_prompt = "new_community_report_prompt" + assert pipeline_job.community_report_prompt == "new_community_report_prompt" + pipeline_job.summarize_descriptions_prompt = "new_summarize_descriptions_prompt" + assert pipeline_job.summarize_descriptions_prompt == "new_summarize_descriptions_prompt" + + pipeline_job.all_workflows = ["new_workflow1", "new_workflow2", "new_workflow3"] + assert len(pipeline_job.all_workflows) == 3 + + pipeline_job.completed_workflows = ["new_workflow1", "new_workflow2"] + assert len(pipeline_job.completed_workflows) == 2 + + pipeline_job.failed_workflows = ["new_workflow3"] + assert len(pipeline_job.failed_workflows) == 1 diff --git a/infra/deploy.sh b/infra/deploy.sh index d7fa847b..56fdaf8d 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -347,12 +347,12 @@ deployAzureResources () { --resource-group $RESOURCE_GROUP \ --template-file ./main.bicep \ --parameters "resourceBaseName=$RESOURCE_BASE_NAME" \ - --parameters "graphRagName=$RESOURCE_GROUP" \ + --parameters "resourceGroupName=$RESOURCE_GROUP" \ --parameters "apimName=$APIM_NAME" \ --parameters "apimTier=$APIM_TIER" \ - --parameters "publisherName=$PUBLISHER_NAME" \ + --parameters "apiPublisherName=$PUBLISHER_NAME" \ + --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ --parameters "aksSshRsaPublicKey=$SSH_PUBLICKEY" \ - --parameters "publisherEmail=$PUBLISHER_EMAIL" \ --parameters "enablePrivateEndpoints=$ENABLE_PRIVATE_ENDPOINTS" \ --parameters "acrName=$CONTAINER_REGISTRY_NAME" \ --parameters "deployerPrincipalId=$deployerPrincipalId" \ From fbbad71d0b3f84632db64bbcda9c3623285d5f88 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Thu, 2 Jan 2025 23:20:01 -0500 Subject: [PATCH 06/28] add new pytests --- .../test_api_index_configuration.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 backend/tests/integration/test_api_index_configuration.py diff --git a/backend/tests/integration/test_api_index_configuration.py b/backend/tests/integration/test_api_index_configuration.py new file mode 100644 index 00000000..384858c8 --- /dev/null +++ b/backend/tests/integration/test_api_index_configuration.py @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +""" +Integration tests for the /index/config API endpoints. +""" + +from unittest.mock import AsyncMock, patch + +import pytest_asyncio + + +@pytest_asyncio.fixture +def mock_generate_indexing_prompts(): + with patch( + "graphrag.api.generate_indexing_prompts", new_callable=AsyncMock + ) as mock: + mock.return_value = ( + "synthetic-prompt1", + "synthetic-prompt2", + "synthetic-prompt3", + ) + yield mock + + +def test_generate_prompts( + blob_with_data_container_name, mock_generate_indexing_prompts, client +): + """Test generating prompts.""" + response = client.get( + "/index/config/prompts", + params={"storage_name": blob_with_data_container_name}, + ) + assert response.status_code == 200 From 2f744c148a6905efe3b006adc09486a2d173bec1 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 3 Jan 2025 00:55:38 -0500 Subject: [PATCH 07/28] ruff format updates --- backend/src/api/index.py | 4 ++-- backend/tests/integration/test_utils_pipeline.py | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/api/index.py b/backend/src/api/index.py index 3fda4151..cb0af903 100644 --- a/backend/src/api/index.py +++ b/backend/src/api/index.py @@ -17,9 +17,9 @@ HTTPException, UploadFile, ) -from graphrag.config import create_graphrag_config -from graphrag.index import create_pipeline_config +from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.index.bootstrap import bootstrap +from graphrag.index.create_pipeline_config import create_pipeline_config from graphrag.index.run import run_pipeline_with_config from kubernetes import ( client as kubernetes_client, diff --git a/backend/tests/integration/test_utils_pipeline.py b/backend/tests/integration/test_utils_pipeline.py index 8cc40c97..5f0a950b 100644 --- a/backend/tests/integration/test_utils_pipeline.py +++ b/backend/tests/integration/test_utils_pipeline.py @@ -94,7 +94,10 @@ def test_pipeline_job_interface(cosmos_index_job_entry): pipeline_job.community_report_prompt = "new_community_report_prompt" assert pipeline_job.community_report_prompt == "new_community_report_prompt" pipeline_job.summarize_descriptions_prompt = "new_summarize_descriptions_prompt" - assert pipeline_job.summarize_descriptions_prompt == "new_summarize_descriptions_prompt" + assert ( + pipeline_job.summarize_descriptions_prompt + == "new_summarize_descriptions_prompt" + ) pipeline_job.all_workflows = ["new_workflow1", "new_workflow2", "new_workflow3"] assert len(pipeline_job.all_workflows) == 3 From 4e1b1ba050cf8ba4141b51102ab3d01e9b7bc677 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 3 Jan 2025 13:49:26 -0500 Subject: [PATCH 08/28] revert bicep api version changes to a working condition --- infra/core/cosmosdb/cosmosdb.bicep | 14 +++++++------- infra/deploy.sh | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/infra/core/cosmosdb/cosmosdb.bicep b/infra/core/cosmosdb/cosmosdb.bicep index 36ede469..1aecdb45 100644 --- a/infra/core/cosmosdb/cosmosdb.bicep +++ b/infra/core/cosmosdb/cosmosdb.bicep @@ -82,7 +82,7 @@ resource cosmosDb 'Microsoft.DocumentDB/databaseAccounts@2024-11-15' = { } } -resource graphragDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2022-11-15' = { +resource graphragDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2024-11-15' = { parent: cosmosDb name: 'graphrag' properties: { @@ -92,7 +92,7 @@ resource graphragDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@20 } } -resource jobsContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2022-11-15' = { +resource jobsContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-11-15' = { parent: graphragDatabase name: 'jobs' properties: { @@ -130,7 +130,7 @@ resource jobsContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/conta } } -resource containerStoreContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2022-11-15' = { +resource containerStoreContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-11-15' = { parent: graphragDatabase name: 'container-store' properties: { @@ -168,12 +168,12 @@ resource containerStoreContainer 'Microsoft.DocumentDB/databaseAccounts/sqlDatab } } -resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-11-15' = [ - for id in roleDefinitionId: { - name: guid('${id}-${principalId}-${cosmosDb.id}') +resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-11-15' = [ + for roleId in roleDefinitionId: { + name: guid('${roleId}-${principalId}-${cosmosDb.id}') parent: cosmosDb properties: { - roleDefinitionId: '${resourceGroup().id}/providers/Microsoft.DocumentDB/databaseAccounts/${cosmosDb.name}/sqlRoleDefinitions/${id}' + roleDefinitionId: '${resourceGroup().id}/providers/Microsoft.DocumentDB/databaseAccounts/${cosmosDb.name}/sqlRoleDefinitions/${roleId}' principalId: principalId scope: cosmosDb.id } diff --git a/infra/deploy.sh b/infra/deploy.sh index 56fdaf8d..92b2be1a 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -264,11 +264,11 @@ createResourceGroupIfNotExists () { local location=$1 local rg=$2 printf "Checking if resource group $rg exists... " - az group show -n $rg -o json >/dev/null 2>&1 + az group show -n $rg -o json > /dev/null 2>&1 if [ $? -ne 0 ]; then printf "No.\n" printf "Creating resource group... " - az group create -l $location -n $rg >/dev/null 2>&1 + az group create -l $location -n $rg > /dev/null 2>&1 printf "Done.\n" else printf "Yes.\n" @@ -295,7 +295,7 @@ getAksCredentials () { local rg=$1 local aks=$2 printf "Getting AKS credentials... " - az aks get-credentials -g $rg -n $aks --overwrite-existing 2>&1 + az aks get-credentials -g $rg -n $aks --overwrite-existing > /dev/null 2>&1 exitIfCommandFailed $? "Error getting AKS credentials, exiting..." kubelogin convert-kubeconfig -l azurecli exitIfCommandFailed $? "Error logging into AKS, exiting..." From 44d78590511ca47852c3397974d8b6ae66159d03 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 3 Jan 2025 18:07:33 -0500 Subject: [PATCH 09/28] fix bad import --- backend/src/api/query_streaming.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/api/query_streaming.py b/backend/src/api/query_streaming.py index 555e9ff2..aff7e66f 100644 --- a/backend/src/api/query_streaming.py +++ b/backend/src/api/query_streaming.py @@ -404,9 +404,9 @@ async def local_search_streaming(request: GraphRequest): parameters.embeddings.vector_store["index_names"] = sanitized_index_names # internally write over the get_embedding_description_store # method to use the multi-index collection. - import graphrag.query.api + import graphrag.api.query - graphrag.query.api._get_embedding_description_store = ( + graphrag.api.query._get_embedding_description_store = ( _get_embedding_description_store ) From 97d8b5276db97300be86f8dad45e2750d8af95ce Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 3 Jan 2025 19:25:04 -0500 Subject: [PATCH 10/28] temporary move of import statement --- backend/src/api/index.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/api/index.py b/backend/src/api/index.py index cb0af903..91b94339 100644 --- a/backend/src/api/index.py +++ b/backend/src/api/index.py @@ -20,7 +20,6 @@ from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.index.bootstrap import bootstrap from graphrag.index.create_pipeline_config import create_pipeline_config -from graphrag.index.run import run_pipeline_with_config from kubernetes import ( client as kubernetes_client, ) @@ -251,6 +250,8 @@ async def _start_indexing_pipeline(index_name: str): # run the pipeline try: + # TODO refactor to use the new replacement for run_pipeline_with_config + from graphrag.index.run import run_pipeline_with_config async for workflow_result in run_pipeline_with_config( config_or_path=pipeline_config, callbacks=workflow_callbacks, From 3c960593ae777bb0518928c970e8f174593b5ec1 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 3 Jan 2025 19:26:37 -0500 Subject: [PATCH 11/28] update synthetic index dataset --- .../output/create_final_communities.parquet | Bin 0 -> 23204 bytes .../create_final_community_reports.parquet | Bin 219648 -> 125900 bytes .../output/create_final_covariates.parquet | Bin 0 -> 57679 bytes ...parquet => create_final_documents.parquet} | Bin 76926 -> 80543 bytes .../output/create_final_entities.parquet | Bin 42819 -> 23273 bytes .../output/create_final_nodes.parquet | Bin 0 -> 12050 bytes .../output/create_final_relationships.parquet | Bin 54169 -> 37336 bytes ...arquet => create_final_text_units.parquet} | Bin 79955 -> 103757 bytes .../data/synthetic-dataset/output/stats.json | 55 ++++++++++++++++++ 9 files changed, 55 insertions(+) create mode 100644 backend/tests/data/synthetic-dataset/output/create_final_communities.parquet create mode 100644 backend/tests/data/synthetic-dataset/output/create_final_covariates.parquet rename backend/tests/data/synthetic-dataset/output/{create_base_documents.parquet => create_final_documents.parquet} (88%) create mode 100644 backend/tests/data/synthetic-dataset/output/create_final_nodes.parquet rename backend/tests/data/synthetic-dataset/output/{create_base_text_units.parquet => create_final_text_units.parquet} (71%) create mode 100644 backend/tests/data/synthetic-dataset/output/stats.json diff --git a/backend/tests/data/synthetic-dataset/output/create_final_communities.parquet b/backend/tests/data/synthetic-dataset/output/create_final_communities.parquet new file mode 100644 index 0000000000000000000000000000000000000000..006e7d2441f5dc36bb44bdf6a647532ca43d31f8 GIT binary patch literal 23204 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%0AFYNT*g3^K}Dt-2L|vq@rY51 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 J%&^tw|34YE9Torp literal 219648 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%0AgD6W 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 PA0LW}bcJG3px*I6cFudy diff --git a/backend/tests/data/synthetic-dataset/output/create_final_covariates.parquet b/backend/tests/data/synthetic-dataset/output/create_final_covariates.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2fbf64d58fa121f0a3829096e58db2b8b8724ce7 GIT binary patch literal 57679 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 P-^jbaF*0(s+2a2PB;rxy literal 0 HcmV?d00001 diff --git a/backend/tests/data/synthetic-dataset/output/create_base_documents.parquet b/backend/tests/data/synthetic-dataset/output/create_final_documents.parquet similarity index 88% rename from backend/tests/data/synthetic-dataset/output/create_base_documents.parquet rename to backend/tests/data/synthetic-dataset/output/create_final_documents.parquet index 74a3cb0412f2c4cf4227645df9b09800f4a1497b..2a8e037c7bb79c62b7b0af50fa2f9dc810bf40b4 100644 GIT binary patch delta 6792 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 M*OpGF{O8j@0gB=yhyVZp delta 3257 zcmc&%TWnlM89uXi+)c=>X?J5c+hUnyl_*Jb=6cRl;|n3GAep(wo19%+ z^*UY$ON+P(M1_JPad-kM@sI}u1tD4q9(bsDYoQVqhzAf4NIU^TX;nZV=A2wz2P!HA zBkix*ng8W%>_AiuXVQw&2%}q_^GCA*%=N)}+)bl(}L#wqL-l@@ln_Cxo_h`n+3;-Fg_)?~j z+dD$Np@SpCnU>CF@|pb2O#X#TakZFzw=o|KIp9)>Un_uo|E;~bpX{B=J)PFzM?-(Q zo>YNKq!BcVSp@^AurIY1I4KGWEfp-$L5x7mwL#jaP8B&l?JMO6ma~AdAkmRfD9bFw z0py`!glOgq2}6PukU%-rvbqbDyuL-E{wrU65;BtxRqRuf~cn`W0qK9O~5$9 zni_<;a}sK&6&UdSEn(bgXi1=gz(q|}Ow zzzBvBGDK2m5Cp08PxNf;hCk3_) z`qY7ioc9Tcy4rCZhaneANWm%cA;Oq25mGK7*?n{?bp0gQMe+ zxOOV;xXYw4L7<5pFZ3KApev!ZuKtoJhPdl;NKBwZiWw2RA|N8Dc|ZjTd|yB+99}GZ zHv<&)m2hL=1G(}k_iXNufq!2`PKHMxLW_OdcoF~c1UT0J)MNKvf4HY>dflbOQpb$qV z!BhKaX83-^hs&%{6snb>#rTiXNuYUH*aMh_Z;7chgL;Li?!ij z41HqkHlNf=wBGKljXg8^(XkyI8+&oo2m3+%MFe&i*2Yeaj@g!p^ioH(jk6fL_h926 zATS;G5!ieDfmgHB;DO8d6$mcI--943cGjb4hwmL=VhKSd9>Bot`PRNO>AEx?Ka0Wp zGqsKQyBNIh$x^N4)_5XHi|$k2SZvTMiwo1G(u9hCi@}qs7I7=wVRK>G%E@`uZ1n8( z1h=)wU#nH>mnG^!*`RlIBDGm#wTW&}Ytv=fm}{MHmDhEnw>DKNwVLfHl9RJmwkNvH zi%xHnLOHn+&rmS;L9!OkPnQJ9MWoN#ts*%;zXd?|;sb5`euSSbF{tyGF`;n>6THT_Azm`!0Kb0XxSFv)5{^jZ3vod0Dn+mlfo`Stv&dpjx}Ps_?8#d@Uk=r8)1v z1ArNKAD?C5IIS;h$XzX|-)vAnjnHncx>{dZKzHj{YN_@FUO?xr%Fb*gJ2UZ@8CZ#* zV_?q{55w%Rt~D>l7bv(gbf?hI2Oxj=UonpW$byGS;sF4tQ2;KN^)1-Uh`7*BhKjLiW6ttZTV~pt8^(baM0XJpGopcN|ofaI{P4V zN~I4w`++lO7UR!x@ZOK7%B};EOv9d?PW-yVxsr2PzLY>p6P&r@Jn=t~8oA5lOCoNs aJUVtM2 diff --git a/backend/tests/data/synthetic-dataset/output/create_final_entities.parquet b/backend/tests/data/synthetic-dataset/output/create_final_entities.parquet index f14ff5c46b45ef8954d3afbd7f2faa6882cb9d42..20aa8bb2d218adbd62af34382ef636ae9293448a 100644 GIT binary patch literal 23273 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 v*X1dvP{ApCbkkQc*9E;8rsZiE0HZn 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 literal 0 HcmV?d00001 diff --git a/backend/tests/data/synthetic-dataset/output/create_final_relationships.parquet b/backend/tests/data/synthetic-dataset/output/create_final_relationships.parquet index 28784f8ed03d27b60fee5a241d1030b958dca0b7..7801f78843dc50dd7deb0b6d4a1cba683888d9ee 100644 GIT binary patch literal 37336 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 Njv6;JD`~U*e*nW3Qy~BV diff --git a/backend/tests/data/synthetic-dataset/output/create_base_text_units.parquet b/backend/tests/data/synthetic-dataset/output/create_final_text_units.parquet similarity index 71% rename from backend/tests/data/synthetic-dataset/output/create_base_text_units.parquet rename to backend/tests/data/synthetic-dataset/output/create_final_text_units.parquet index c743f12fe94e8180cb5d5b3cf5e6e58e101581c2..ffedb61e0b8c10a6b66f0e009eec381e17cd84c9 100644 GIT binary patch delta 26574 zcmeI5dwg7HdFSWYBYPyv$74m3$BB|iK{As>Cw|ZU95A4$oH&jl zHzh4O7QrxS6A+N10EJ3`TboOvyIo>hn%IS;h8FO`mZqfzdugZ%H&H0KT(bLpMj?bk zx^$O*x_>mEN?6j&nRDLvx%{5r^LyTYZlV0C_bw|Y8kdaiRPwyccET)=L=$6=5LUhZb8 zZ`!HvB%WzHp`$`GvCO~?Y}>OlZ>{~(LhQ9B)Zfx0J9HpTb2T|ym znJG7sS*{hEsZw^VR1hb;*0cjZ5AxJXqtJCNoBNBc#IaJ($#OeSxR%4cL_V*wbJydd zO0J&Sey+kOv&<;9OxsSqf=Bc+GqMxq$Fbv@X~bKTIOnE9Pw}U~Yu!YWbFC!I-843R z$5nRXMv3nSmhI$zlE;1$r)HFdZtP@rV!5duc|q(Y z++)GAsL*o)+f0Kn_Wa0n!!*k>%inKNVf{$Qj-5@h_FXMfV=~%W36^rVy z1N`VEUg|ixZ6>Cdr`*5UdK~`X`exwpp?=DS*z9Y<7FaYslGuT3%S~WdQIbcwO5)gb z%^-^cGmTSLEmrKXjp^llWB2%urC_c~#jGz5kvU?IDlD*3le@BA*9$X;Us+g47~8Jt z+KF$oHf(~YLM+k`g3O7qG_<9VcT(*a_^=SV||%vtJDs1*XC;2i|wnBAMws4 z;J2o7!w5t1P4*|s{US(sS?+sL9^uw33olcC!m8MggG;0=t(9{30k;|YUcik7W|r8# z%{rNRAS>Y{5$ossE;kjLY3MsKuHwaBipgjEHTBt0KlH35WSs+++V_&c&-?;gb3$L? z@2;E5ZU;G+&qCgT7nm3lTj6>^l!tL>tAMED#wIJu3&R}aln;nn+hK>k6%n4YJWX=E z3NH*D-*WuS^KG^X$H;Rt^g<68OKj6uaa!26!>;nkP9Ct&d1{84>&w#Q*n*i72Tad% z6P2@OtaFkjI8m5~cF2o;&yVdqila=KmfVD;(tyWxQk7W&Pt0lugif9}R}m46HS=AU z9SQ?K$`iMcr*N^ZkmXJ+E8$js37ffxb%ucxS+?&4W)cQrj>8eYaP>4#Vzxl875cVi z@i7trV>689CY;odBs3FDFic!O%KY5Ta~1@jP%i$PnhF!K&B77~B#2oN+d+`PLsQ%0 z@0fqgPP3B^)^EjFyU!zs5m6#x!{RU@bU1Mq5&AL9lGFxz9b2sbIA#_^+qpuuhCeoU+|BP=LOqCEF<;tSD=y|BzMC*sB-=Dh4b zl6k2z;{bciQx|{sa4?_HD}gq_1CqEEF}YQ|HOMlXO~^t!cW^B$BDF-GlZV8=z)Mr2 zu?iC}z<^9MBxpO_5zbD;4qO!mk{CSsDN&J!Lxjq)9bQBP_F{!OI%#C9+{A_*(+*A3 zN;0v;IQ3;ETxI1+;KlexuB?nbbz~(R+p};KK?rs%xi%^?MFh%2MYO=1F|{DY>XnJr zVL$i`w_-;YPR@laERf~R6PzN#VEAl{)K17xaX}uBI1-0SLK-_`TSPSwf|Z&v@y;hd z>mRRt_q3(NAAtyFU_}MrLm!9teXI-T2pku4$VfGQEa}FHGX7>oIV)`^Nk9(9CKI5J z%R+-JaCq#>k0KXn#2SYdrW9fmChLVQg?7xI_~b%A$5Bl`auy>6mgPnTuTNzO99D^( zgl&@~y$AH1_kH@+D+6-@<}2A4n1_uF2=6 znT;`ldo<&fx6%QMjq*>N1jsjN8ad1AL*OOf_d6F8T3`fIKlQhmSLy(I{7-N4dS5l

q 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 OSNb~+KbHR&KK~n3r`!Gj delta 3570 zcmc&%O>Epp75~pB-gtu(o09*^rcS$Zoh_iqp6?GN3TxMn*K(pJDRCTCisrNHc0 z@5kGjH}B1R^WK}^`|mG*QvU4+yE{)cPM~~uey1;gr*AGF%d>~F>~{Hs>$NP)n86Ms zZ+WmtAWNWeP7_K3!ZI+;lMLn*5#>B~kVR1( z21!ax2U|{j5+aZZN)WQa5{jc4Pq?94xnNZ=%GN-8%`(md4LW$i6(){(OcXI#x+o<) zxV52uI;z0vh9LxcEQN*~x(?Bl!)TWZ6?pWY$`EC!GF&m| zqm(An1c8HB!XT`%wLZ8gLLec*Ip`IZn#BcWq%kZ|ORdHfN0I0N4i006xD6%}3O0g)?F-)doBFB~G&c;9skBGFCVPhTEV02A8DlNChIIFbqniGt@)ttuw5{G)O zuW`+VL<0Mml(@Cf!~_R96aLHmL;h!822 zw%TaLFhrOT%C%%lBU%~VkTIW>Kum=f(Kik~Qr1dgx#yNR2xc}EiHD^|#aS!`A{k}@ zYND_)Tv#OIajnRb0`KU=Cf#Vkweg_DeMs(ac%w~)^*{I3d;bGd z_p?;|27>B0ZuW28><6^=_=}Z~Z1&jJ#g(P5*=t(^)jxf`Qh)b)rT+H7Ffaaa1sv$? zAZjGg=Ti6%^54Xd&P+ZxmzTPa4x`snFITYz$JUsh6ohu36B}C#6VR~O z&aq+$4B5zd%gJC74XIBeD}~bmJOCy zZObp~d~cTb9V#U-Ka|Z4M>o6EZJfQA^I_VynZ?h)22@1bsM@=7_QLrkzp|QD$A*T7 zo~i#|nnX5qI4^z&LH}p#Z~hw{BHxK({M4@hdBUTK`y_j~`nTT?RLAPQ)y-Ec2eKHm z!SZu@#p%_-D|@ykUjP;y>|V!_!?lsH=-ck>ieC03pRbK!`9y{1<#Me|J zjfMD~xU?|OmKIJQZ8VxwPj3D3DtHeZTEH!2mRA?&CL4=qmfLM}^VJi>Y^@wy$L>Dy!k!w^e46%NIiFEve>r?2KOF2@8;Q8PUH4cF}?|gire1>PZZB@ zg13v(CirIO6kJW)*yU3#cSNl>&z*nPug|XP`Pub_)3Yqin=2D6j@J#bT{qnFsdbCn zUp0%#h349^ll0Qux#nUxc`3=Z%<_qrMGBueJ$qTttBc(|&NVL{U8I+rD=-~*I+3aP zo@pFA9*2`liE$#4Mw&OioFW!~CmO9ZZFJWsy2CE%hR(DVH26Z>tQ>6=KX?f|Qkpnk zEZqQ4?3p;8^jpPSH^BISe=3go Date: Sat, 4 Jan 2025 02:38:59 -0500 Subject: [PATCH 12/28] refactor bicep to be cleaner and remove ssh public key generation for AKS deployment - no longer needed --- infra/core/acr/acr.bicep | 2 +- infra/core/ai-search/ai-search.bicep | 2 +- infra/core/aks/aks.bicep | 25 +++------------ infra/core/storage/storage.bicep | 2 +- infra/deploy.sh | 22 ------------- infra/main.bicep | 46 +++++++++++++--------------- 6 files changed, 29 insertions(+), 70 deletions(-) diff --git a/infra/core/acr/acr.bicep b/infra/core/acr/acr.bicep index 51e2821a..c5d9a504 100644 --- a/infra/core/acr/acr.bicep +++ b/infra/core/acr/acr.bicep @@ -30,7 +30,7 @@ resource registry 'Microsoft.ContainerRegistry/registries@2023-11-01-preview' = resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ for role in roleAssignments: { name: guid('${role.principalId}-${role.principalType}-${role.roleDefinitionId}') - scope: registry + scope: resourceGroup() properties: role } ] diff --git a/infra/core/ai-search/ai-search.bicep b/infra/core/ai-search/ai-search.bicep index 020aed3c..a02dfe53 100644 --- a/infra/core/ai-search/ai-search.bicep +++ b/infra/core/ai-search/ai-search.bicep @@ -31,7 +31,7 @@ resource aiSearch 'Microsoft.Search/searchServices@2024-03-01-preview' = { resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ for role in roleAssignments: { name: guid('${role.principalId}-${role.principalType}-${role.roleDefinitionId}') - scope: aiSearch + scope: resourceGroup() properties: role } ] diff --git a/infra/core/aks/aks.bicep b/infra/core/aks/aks.bicep index 5d817bbc..07d6e71c 100644 --- a/infra/core/aks/aks.bicep +++ b/infra/core/aks/aks.bicep @@ -43,12 +43,6 @@ param graphragVMSize string = 'standard_d8s_v5' // 8 vcpu, 32 GB memory @description('The VM size of nodes running GraphRAG indexing jobs.') param graphragIndexingVMSize string = 'standard_e8s_v5' // 8 vcpus, 64 GB memory -@description('User name for the Linux Virtual Machines.') -param linuxAdminUsername string = 'azureuser' - -@description('Configure all linux machines with the SSH RSA public key string. Your key should include three parts, for example \'ssh-rsa AAAAB...snip...UcyupgH azureuser@linuxvm\'') -param sshRSAPublicKey string - @description('Enable encryption at host') param enableEncryptionAtHost bool = false @@ -69,7 +63,7 @@ resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' existing name: privateDnsZoneName } -resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = { +resource aks 'Microsoft.ContainerService/managedClusters@2024-09-02-preview' = { name: clusterName location: location identity: { @@ -77,6 +71,7 @@ resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = { } properties: { enableRBAC: true + disableLocalAccounts: true dnsPrefix: !empty(dnsPrefix) ? dnsPrefix : toLower(clusterName) aadProfile: { managed: true @@ -121,16 +116,6 @@ resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = { ] } } - linuxProfile: { - adminUsername: linuxAdminUsername - ssh: { - publicKeys: [ - { - keyData: sshRSAPublicKey - } - ] - } - } networkProfile: { serviceCidr: '10.3.0.0/16' // must not overlap with any subnet IP ranges dnsServiceIP: '10.3.0.10' // must be within the range specified in serviceCidr @@ -200,7 +185,7 @@ resource aks 'Microsoft.ContainerService/managedClusters@2024-02-01' = { } } -resource aksManagedAutoUpgradeSchedule 'Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2024-03-02-preview' = { +resource aksManagedAutoUpgradeSchedule 'Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2024-09-02-preview' = { parent: aks name: 'aksManagedAutoUpgradeSchedule' properties: { @@ -218,7 +203,7 @@ resource aksManagedAutoUpgradeSchedule 'Microsoft.ContainerService/managedCluste } } -resource aksManagedNodeOSUpgradeSchedule 'Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2024-03-02-preview' = { +resource aksManagedNodeOSUpgradeSchedule 'Microsoft.ContainerService/managedClusters/maintenanceConfigurations@2024-09-02-preview' = { parent: aks name: 'aksManagedNodeOSUpgradeSchedule' properties: { @@ -240,7 +225,7 @@ resource aksManagedNodeOSUpgradeSchedule 'Microsoft.ContainerService/managedClus resource webAppRoutingPrivateDnsContributor 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ for role in ingressRoleAssignments: { name: guid('${role.roleDefinitionId}-${privateDnsZone.id}') - scope: privateDnsZone + scope: resourceGroup() properties: { principalId: aks.properties.ingressProfile.webAppRouting.identity.objectId principalType: role.principalType diff --git a/infra/core/storage/storage.bicep b/infra/core/storage/storage.bicep index 21099044..8f6fa031 100644 --- a/infra/core/storage/storage.bicep +++ b/infra/core/storage/storage.bicep @@ -71,7 +71,7 @@ resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = { resource storageRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ for role in roleAssignments: { name: guid('${role.principalId}-${role.principalType}-${role.roleDefinitionId}') - scope: storage + scope: resourceGroup() properties: role } ] diff --git a/infra/deploy.sh b/infra/deploy.sh index 92b2be1a..df324688 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -275,22 +275,6 @@ createResourceGroupIfNotExists () { fi } -createSshkeyIfNotExists () { - local rg=$1 - local keyName="aks-publickey" - printf "Checking if sshkey exists... " - local keyDetails=$(az sshkey show -g $rg --name $keyName -o json 2> /dev/null) - if [ -z "$keyDetails" ]; then - printf "No.\n" - printf "Creating sshkey... " - local keyDetails=$(az sshkey create -g $rg --name $keyName -o json) - exitIfCommandFailed $? "Error creating sshkey." - else - printf "Yes.\n" - fi - SSHKEY_DETAILS=$keyDetails -} - getAksCredentials () { local rg=$1 local aks=$2 @@ -334,8 +318,6 @@ checkForApimSoftDelete () { deployAzureResources () { echo "Deploying Azure resources..." - local SSH_PUBLICKEY=$(jq -r .publicKey <<< $SSHKEY_DETAILS) - exitIfValueEmpty "$SSH_PUBLICKEY" "Unable to read ssh publickey, exiting..." # get principal/object id of the signed in user local deployerPrincipalId=$(az ad signed-in-user show --output json | jq -r .id) exitIfValueEmpty $deployerPrincipalId "Principal ID of deployer not found" @@ -352,7 +334,6 @@ deployAzureResources () { --parameters "apimTier=$APIM_TIER" \ --parameters "apiPublisherName=$PUBLISHER_NAME" \ --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ - --parameters "aksSshRsaPublicKey=$SSH_PUBLICKEY" \ --parameters "enablePrivateEndpoints=$ENABLE_PRIVATE_ENDPOINTS" \ --parameters "acrName=$CONTAINER_REGISTRY_NAME" \ --parameters "deployerPrincipalId=$deployerPrincipalId" \ @@ -707,9 +688,6 @@ validateSKUs $LOCATION $VALIDATE_SKUS_FLAG # Create resource group createResourceGroupIfNotExists $LOCATION $RESOURCE_GROUP -# Generate ssh key for AKS -createSshkeyIfNotExists $RESOURCE_GROUP - # Deploy Azure resources checkForApimSoftDelete deployAzureResources diff --git a/infra/main.bicep b/infra/main.bicep index 846a90cf..4d9c2ceb 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -34,18 +34,15 @@ param deployerPrincipalId string @minLength(1) @description('Name of the publisher of the API Management instance.') -param apiPublisherName string +param apiPublisherName string = 'Microsoft' @minLength(1) @description('Email address of the publisher of the API Management instance.') -param apiPublisherEmail string +param apiPublisherEmail string = 'publisher@microsoft.com' @description('The AKS namespace to install GraphRAG in.') param aksNamespace string = 'graphrag' -@description('Public key to allow access to AKS Linux nodes.') -param aksSshRsaPublicKey string - @description('Whether to enable private endpoints.') param enablePrivateEndpoints bool = true @@ -108,7 +105,7 @@ var roles = { } module log 'core/log-analytics/log.bicep' = { - name: 'log-analytics' + name: 'log-analytics-deployment' params:{ name: '${abbrs.operationalInsightsWorkspaces}${resourceBaseNameFinal}' location: location @@ -117,7 +114,7 @@ module log 'core/log-analytics/log.bicep' = { } module nsg 'core/vnet/nsg.bicep' = { - name: 'nsg' + name: 'nsg-deployment' params: { nsgName: '${abbrs.networkNetworkSecurityGroups}${resourceBaseNameFinal}' location: location @@ -125,7 +122,7 @@ module nsg 'core/vnet/nsg.bicep' = { } resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = { - name: '${abbrs.networkVirtualNetworks}${resourceBaseNameFinal}' + name: '${abbrs.networkVirtualNetworks}${resourceBaseNameFinal}-deployment' location: location properties: { addressSpace: { @@ -173,7 +170,7 @@ resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = { } module acr 'core/acr/acr.bicep' = { - name: 'acr' + name: 'acr-deployment' params: { registryName: !empty(acrName) ? acrName : '${abbrs.containerRegistryRegistries}${resourceBaseNameFinal}' location: location @@ -188,14 +185,13 @@ module acr 'core/acr/acr.bicep' = { } module aks 'core/aks/aks.bicep' = { - name: 'aks' + name: 'aks-deployment' params:{ clusterName: '${abbrs.containerServiceManagedClusters}${resourceBaseNameFinal}' location: location graphragVMSize: 'standard_d8s_v5' // 8 vcpu, 32 GB memory graphragIndexingVMSize: 'standard_e8s_v5' // 8 vcpus, 64 GB memory - clusterAdmins: ['${deployerPrincipalId}'] - sshRSAPublicKey: aksSshRsaPublicKey + clusterAdmins: !empty(deployerPrincipalId) ? ['${deployerPrincipalId}'] : null logAnalyticsWorkspaceId: log.outputs.id subnetId: vnet.properties.subnets[1].id // aks subnet privateDnsZoneName: privateDnsZone.outputs.name @@ -215,7 +211,7 @@ module aks 'core/aks/aks.bicep' = { } module cosmosdb 'core/cosmosdb/cosmosdb.bicep' = { - name: 'cosmosdb' + name: 'cosmosdb-deployment' params: { cosmosDbName: !empty(cosmosDbName) ? cosmosDbName : '${abbrs.documentDBDatabaseAccounts}${resourceBaseNameFinal}' location: location @@ -225,7 +221,7 @@ module cosmosdb 'core/cosmosdb/cosmosdb.bicep' = { } module aiSearch 'core/ai-search/ai-search.bicep' = { - name: 'aisearch' + name: 'aisearch-deployment' params: { name: !empty(aiSearchName) ? aiSearchName : '${abbrs.searchSearchServices}${resourceBaseNameFinal}' location: location @@ -251,7 +247,7 @@ module aiSearch 'core/ai-search/ai-search.bicep' = { } module storage 'core/storage/storage.bicep' = { - name: 'storage' + name: 'storage-deployment' params: { name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${replace(resourceBaseNameFinal, '-', '')}' location: location @@ -273,7 +269,7 @@ module storage 'core/storage/storage.bicep' = { } module apim 'core/apim/apim.bicep' = { - name: 'apim' + name: 'apim-deployment' params: { apiManagementName: !empty(apimName) ? apimName : '${abbrs.apiManagementService}${resourceBaseNameFinal}' restoreAPIM: restoreAPIM @@ -292,7 +288,7 @@ module apim 'core/apim/apim.bicep' = { } module graphragApi 'core/apim/apim.graphrag-documentation.bicep' = { - name: 'graphrag-api' + name: 'graphrag-api-deployment' params: { apimname: apim.outputs.name backendUrl: appUrl @@ -300,7 +296,7 @@ module graphragApi 'core/apim/apim.graphrag-documentation.bicep' = { } module workloadIdentity 'core/identity/identity.bicep' = { - name: 'workload-identity' + name: 'workload-identity-deployment' params: { name: workloadIdentityName location: location @@ -315,7 +311,7 @@ module workloadIdentity 'core/identity/identity.bicep' = { } module privateDnsZone 'core/vnet/private-dns-zone.bicep' = { - name: 'private-dns-zone' + name: 'private-dns-zone-deployment' params: { name: dnsDomain vnetNames: [ @@ -325,7 +321,7 @@ module privateDnsZone 'core/vnet/private-dns-zone.bicep' = { } module privatelinkPrivateDns 'core/vnet/privatelink-private-dns-zones.bicep' = if (enablePrivateEndpoints) { - name: 'privatelink-private-dns-zones' + name: 'privatelink-private-dns-zones-deployment' params: { linkedVnetIds: [ vnet.id @@ -334,7 +330,7 @@ module privatelinkPrivateDns 'core/vnet/privatelink-private-dns-zones.bicep' = i } module azureMonitorPrivateLinkScope 'core/monitor/private-link-scope.bicep' = if (enablePrivateEndpoints) { - name: 'azure-monitor-privatelink-scope' + name: 'azure-monitor-privatelink-scope-deployment' params: { privateLinkScopeName: 'pls-${resourceBaseNameFinal}' privateLinkScopedResources: [ @@ -345,7 +341,7 @@ module azureMonitorPrivateLinkScope 'core/monitor/private-link-scope.bicep' = if } module cosmosDbPrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePrivateEndpoints) { - name: 'cosmosDb-private-endpoint' + name: 'cosmosDb-private-endpoint-deployment' params: { privateEndpointName: '${abbrs.privateEndpoint}cosmos-${cosmosdb.outputs.name}' location: location @@ -357,7 +353,7 @@ module cosmosDbPrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePr } module blobStoragePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePrivateEndpoints) { - name: 'blob-storage-private-endpoint' + name: 'blob-storage-private-endpoint-deployment' params: { privateEndpointName: '${abbrs.privateEndpoint}blob-${storage.outputs.name}' location: location @@ -369,7 +365,7 @@ module blobStoragePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enabl } module aiSearchPrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePrivateEndpoints) { - name: 'ai-search-private-endpoint' + name: 'ai-search-private-endpoint-deployment' params: { privateEndpointName: '${abbrs.privateEndpoint}search-${aiSearch.outputs.name}' location: location @@ -381,7 +377,7 @@ module aiSearchPrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePr } module privateLinkScopePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if (enablePrivateEndpoints) { - name: 'privatelink-scope-private-endpoint' + name: 'privatelink-scope-private-endpoint-deployment' params: { privateEndpointName: '${abbrs.privateEndpoint}pls-${resourceBaseNameFinal}' location: location From 8d448f86d44903ea697a77955ee0f48b676183a4 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Sat, 4 Jan 2025 03:13:13 -0500 Subject: [PATCH 13/28] update common bicep variable name --- infra/deploy.sh | 2 +- infra/main.bicep | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/infra/deploy.sh b/infra/deploy.sh index df324688..efbece12 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -329,7 +329,7 @@ deployAzureResources () { --resource-group $RESOURCE_GROUP \ --template-file ./main.bicep \ --parameters "resourceBaseName=$RESOURCE_BASE_NAME" \ - --parameters "resourceGroupName=$RESOURCE_GROUP" \ + --parameters "resourceGroup=$RESOURCE_GROUP" \ --parameters "apimName=$APIM_NAME" \ --parameters "apimTier=$APIM_TIER" \ --parameters "apiPublisherName=$PUBLISHER_NAME" \ diff --git a/infra/main.bicep b/infra/main.bicep index 4d9c2ceb..c2e52e77 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -20,14 +20,14 @@ Managed Identity @minLength(1) @maxLength(64) @description('Name of the resource group that GraphRAG will be deployed in.') -param resourceGroupName string +param resourceGroup string @description('Unique name to append to each resource') param resourceBaseName string = '' -var resourceBaseNameFinal = !empty(resourceBaseName) ? resourceBaseName : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroupName}')) +var resourceBaseNameFinal = !empty(resourceBaseName) ? resourceBaseName : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroup}')) @description('Cloud region for all resources') -param location string = resourceGroup().location +param location string = az.resourceGroup().location @description('Principal/Object ID of the deployer. Will be used to assign admin roles to the AKS cluster.') param deployerPrincipalId string @@ -58,7 +58,7 @@ param cosmosDbName string = '' param aiSearchName string = '' var abbrs = loadJsonContent('abbreviations.json') -var tags = { 'azd-env-name': resourceGroupName } +var tags = { 'azd-env-name': resourceGroup } var workloadIdentityName = '${abbrs.managedIdentityUserAssignedIdentities}${resourceBaseNameFinal}' var aksServiceAccountName = '${aksNamespace}-workload-sa' var workloadIdentitySubject = 'system:serviceaccount:${aksNamespace}:${aksServiceAccountName}' From 863bff3c3bd8b9b307429aaf734e892c045715e9 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 6 Jan 2025 00:53:29 -0500 Subject: [PATCH 14/28] add aoai to bicep deployment --- backend/poetry.lock | 100 +++++++++++++++++++------------------ backend/pyproject.toml | 2 +- infra/core/aoai/aoai.bicep | 80 +++++++++++++++++++++++++++++ infra/deploy.sh | 14 ------ infra/main.bicep | 19 +++++++ 5 files changed, 152 insertions(+), 63 deletions(-) create mode 100644 infra/core/aoai/aoai.bicep diff --git a/backend/poetry.lock b/backend/poetry.lock index c755299f..bcef65c6 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1903,44 +1903,48 @@ name = "graphrag" version = "1.0.1" description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." optional = false -python-versions = "<3.13,>=3.10" -files = [ - {file = "graphrag-1.0.1-py3-none-any.whl", hash = "sha256:821f5c4017f79802ee4e97fa00582b9720ab8146b651523825cb037b978e0fd7"}, - {file = "graphrag-1.0.1.tar.gz", hash = "sha256:178da70b500fd7a85d422774a14ae45ed315f0bb61bebd28f36bccd56da45fa1"}, -] - -[package.dependencies] -aiofiles = ">=24.1.0,<25.0.0" -azure-identity = ">=1.19.0,<2.0.0" -azure-search-documents = ">=11.5.2,<12.0.0" -azure-storage-blob = ">=12.24.0,<13.0.0" -datashaper = ">=0.0.49,<0.0.50" -devtools = ">=0.12.2,<0.13.0" -environs = ">=11.0.0,<12.0.0" -fnllm = ">=0.0.10,<0.0.11" -future = ">=1.0.0,<2.0.0" -graspologic = ">=3.4.1,<4.0.0" -httpx = ">=0.28.1,<0.29.0" -json-repair = ">=0.30.3,<0.31.0" -lancedb = ">=0.17.0,<0.18.0" -matplotlib = ">=3.9.3,<4.0.0" -networkx = ">=3.4.2,<4.0.0" +python-versions = ">=3.10,<3.13" +files = [] +develop = false + +[package.dependencies] +aiofiles = "^24.1.0" +azure-cosmos = "^4.9.0" +azure-identity = "^1.19.0" +azure-search-documents = "^11.5.2" +azure-storage-blob = "^12.24.0" +devtools = "^0.12.2" +environs = "^11.0.0" +fnllm = "^0.0.10" +future = "^1.0.0" +graspologic = "^3.4.1" +httpx = "^0.28.1" +json-repair = "^0.30.3" +lancedb = "^0.17.0" +matplotlib = "^3.9.3" +networkx = "^3.4.2" nltk = "3.9.1" -numpy = ">=1.25.2,<2.0.0" -openai = ">=1.57.0,<2.0.0" -pandas = ">=2.2.3,<3.0.0" -pyaml-env = ">=1.2.1,<2.0.0" -pyarrow = ">=15.0.0,<16.0.0" -pydantic = ">=2.10.3,<3.0.0" -python-dotenv = ">=1.0.1,<2.0.0" -pyyaml = ">=6.0.2,<7.0.0" -rich = ">=13.9.4,<14.0.0" -tenacity = ">=9.0.0,<10.0.0" -tiktoken = ">=0.8.0,<0.9.0" -tqdm = ">=4.67.1,<5.0.0" -typer = ">=0.15.1,<0.16.0" -typing-extensions = ">=4.12.2,<5.0.0" -umap-learn = ">=0.5.6,<0.6.0" +numpy = "^1.25.2" +openai = "^1.57.0" +pandas = "^2.2.3" +pyaml-env = "^1.2.1" +pyarrow = "^15.0.0" +pydantic = "^2.10.3" +python-dotenv = "^1.0.1" +pyyaml = "^6.0.2" +rich = "^13.9.4" +tenacity = "^9.0.0" +tiktoken = "^0.8.0" +tqdm = "^4.67.1" +typer = "^0.15.1" +typing-extensions = "^4.12.2" +umap-learn = "^0.5.6" + +[package.source] +type = "git" +url = "https://github.com/microsoft/graphrag.git" +reference = "main" +resolved_reference = "cbb8f8788e060f53a3dbe9580eb620c648b3343d" [[package]] name = "graspologic" @@ -2980,13 +2984,13 @@ files = [ [[package]] name = "marshmallow" -version = "3.23.2" +version = "3.23.3" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false python-versions = ">=3.9" files = [ - {file = "marshmallow-3.23.2-py3-none-any.whl", hash = "sha256:bcaf2d6fd74fb1459f8450e85d994997ad3e70036452cbfa4ab685acb19479b3"}, - {file = "marshmallow-3.23.2.tar.gz", hash = "sha256:c448ac6455ca4d794773f00bae22c2f351d62d739929f761dce5eacb5c468d7f"}, + {file = "marshmallow-3.23.3-py3-none-any.whl", hash = "sha256:20c0f8c613f68bcb45b2a0d3282e2f172575560170bf220d67aafb42717910e4"}, + {file = "marshmallow-3.23.3.tar.gz", hash = "sha256:d586c8685ebdb80bf754e1f96e3f305aaf30951f1fc69175b977453633467e76"}, ] [package.dependencies] @@ -2994,7 +2998,7 @@ packaging = ">=17.0" [package.extras] dev = ["marshmallow[tests]", "pre-commit (>=3.5,<5.0)", "tox"] -docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.14)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)", "sphinx-version-warning (==1.1.2)"] +docs = ["alabaster (==1.0.0)", "autodocsumm (==0.2.14)", "sphinx (==8.1.3)", "sphinx-issues (==5.0.0)"] tests = ["pytest", "simplejson"] [[package]] @@ -3545,13 +3549,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.58.1" +version = "1.59.3" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.58.1-py3-none-any.whl", hash = "sha256:e2910b1170a6b7f88ef491ac3a42c387f08bd3db533411f7ee391d166571d63c"}, - {file = "openai-1.58.1.tar.gz", hash = "sha256:f5a035fd01e141fc743f4b0e02c41ca49be8fab0866d3b67f5f29b4f4d3c0973"}, + {file = "openai-1.59.3-py3-none-any.whl", hash = "sha256:b041887a0d8f3e70d1fc6ffbb2bf7661c3b9a2f3e806c04bf42f572b9ac7bc37"}, + {file = "openai-1.59.3.tar.gz", hash = "sha256:7f7fff9d8729968588edf1524e73266e8593bb6cab09298340efb755755bb66f"}, ] [package.dependencies] @@ -5899,13 +5903,13 @@ standard = ["colorama (>=0.4)", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", [[package]] name = "virtualenv" -version = "20.28.0" +version = "20.28.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.8" files = [ - {file = "virtualenv-20.28.0-py3-none-any.whl", hash = "sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0"}, - {file = "virtualenv-20.28.0.tar.gz", hash = "sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"}, + {file = "virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb"}, + {file = "virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329"}, ] [package.dependencies] @@ -6183,4 +6187,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "~3.10" -content-hash = "bae0ddd74ebd3aa28bc21fb73b05b1f563cfd6aa8b032b82a7a05d4bc40555e2" +content-hash = "c573abfd1adb4d94a371b59107776a1bbb1799b732e18147e1ae2ebdee597796" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 68bb2e2f..cd313427 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -54,7 +54,7 @@ fastapi = ">=0.110.0" fastapi-offline = ">=1.7.3" fastparquet = ">=2023.10.1" fsspec = ">=2024.2.0" -graphrag = "==1.0.1" +graphrag = {git = "https://github.com/microsoft/graphrag.git", branch = "main"} graspologic = ">=3.3.0" httpx = ">=0.25.2" kubernetes = ">=29.0.0" diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep new file mode 100644 index 00000000..f1104f7c --- /dev/null +++ b/infra/core/aoai/aoai.bicep @@ -0,0 +1,80 @@ +@description('Name of the Azure OpenAI instance') +param openAiName string = 'openai${uniqueString(resourceGroup().id)}' + +@description('Location for the Azure OpenAI instance') +param location string = resourceGroup().location + +@description('LLM model deployment name') +param llmModelDeploymentName string = 'gpt-4o' + +@description('Embedding model deployment name') +param embeddingModelDeploymentName string = 'text-embedding-ada-002' + +@description('TPM quota for GPT-4o deployment') +param gpt4oTpm int = 10 + +@description('TPM quota for text-embedding-ada-002 deployment') +param textEmbeddingAdaTpm int = 10 + +@description('Array of objects with fields principalId, roleDefinitionId') +param roleAssignments array = [] + + +resource aoai 'Microsoft.CognitiveServices/accounts@2024-10-01' = { + name: openAiName + location: location + sku: { + name: 'S0' + } + kind: 'OpenAI' + properties: { + publicNetworkAccess: 'Enabled' + disableLocalAuth: true + } +} + +resource gpt4oDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { + parent: aoai + name: llmModelDeploymentName + sku: { + name: 'GlobalStandard' + capacity: gpt4oTpm + } + properties: { + model: { + format: 'OpenAI' + name: 'gpt-4o' + version: '2024-05-13' + } + currentCapacity: gpt4oTpm + } +} + +resource textEmbeddingAdaDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { + parent: aoai + name: embeddingModelDeploymentName + sku: { + name: 'Standard' + capacity: textEmbeddingAdaTpm + } + properties: { + model: { + format: 'OpenAI' + name: 'text-embedding-ada-002' + version: '2' + } + currentCapacity: textEmbeddingAdaTpm + } +} + +resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ + for role in roleAssignments: { + name: guid('${role.principalId}-${role.roleDefinitionId}') + scope: resourceGroup() + properties: role + } +] + +output openAiEndpoint string = aoai.properties.endpoint +output gpt4oDeploymentName string = gpt4oDeployment.name +output textEmbeddingAdaDeploymentName string = textEmbeddingAdaDeployment.name diff --git a/infra/deploy.sh b/infra/deploy.sh index efbece12..8e770b3f 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -344,7 +344,6 @@ deployAzureResources () { AZURE_OUTPUTS=$(jq -r .properties.outputs <<< $AZURE_DEPLOY_RESULTS) exitIfCommandFailed $? "Error parsing outputs from Azure deployment..." exitIfValueEmpty "$AZURE_OUTPUTS" "Error parsing outputs from Azure deployment..." - assignAOAIRoleToManagedIdentity } validateSKUs() { @@ -396,19 +395,6 @@ checkSKUQuotas() { printf "Done.\n" } -assignAOAIRoleToManagedIdentity() { - printf "Assigning 'Cognitive Services OpenAI Contributor' role to managed identity... " - local servicePrincipalId=$(jq -r .azure_workload_identity_principal_id.value <<< $AZURE_OUTPUTS) - exitIfValueEmpty "$servicePrincipalId" "Unable to parse service principal id from azure outputs, exiting..." - local scope=$(az cognitiveservices account list --query "[?contains(properties.endpoint, '$GRAPHRAG_API_BASE')] | [0].id" -o tsv) - az role assignment create --only-show-errors \ - --role "Cognitive Services OpenAI Contributor" \ - --assignee "$servicePrincipalId" \ - --scope "$scope" > /dev/null 2>&1 - exitIfCommandFailed $? "Error assigning role to service principal, exiting..." - printf "Done.\n" -} - installGraphRAGHelmChart () { echo "Deploying graphrag helm chart... " local workloadId=$(jq -r .azure_workload_identity_client_id.value <<< $AZURE_OUTPUTS) diff --git a/infra/main.bicep b/infra/main.bicep index c2e52e77..b674ce18 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -169,6 +169,25 @@ resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = { } } +module aoai 'core/aoai/aoai.bicep' = { + name: 'aoai-deployment' + params: { + openAiName: '${abbrs.cognitiveServicesAccounts}${resourceBaseNameFinal}' + location: location + llmModelDeploymentName: 'gpt-4o-${uniqueString(resourceBaseNameFinal)}' + gpt4oTpm: 10 + embeddingModelDeploymentName: 'text-embedding-ada-002-${uniqueString(resourceBaseNameFinal)}' + textEmbeddingAdaTpm: 10 + roleAssignments: [ + { + principalId: workloadIdentity.outputs.principalId + roleDefinitionId: roles.cognitiveServicesOpenaiContributor + principalType: 'ServicePrincipal' + } + ] + } +} + module acr 'core/acr/acr.bicep' = { name: 'acr-deployment' params: { From f068846a5c7ecdf5aac184595f43d4412b657722 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 6 Jan 2025 02:03:09 -0500 Subject: [PATCH 15/28] cleanup bicep variable names --- infra/core/aoai/aoai.bicep | 8 ++++++-- infra/deploy.sh | 31 +++++++++++++++++++------------ infra/main.bicep | 37 +++++++++++++++++++++++++++++-------- 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index f1104f7c..e99b582b 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -76,5 +76,9 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ ] output openAiEndpoint string = aoai.properties.endpoint -output gpt4oDeploymentName string = gpt4oDeployment.name -output textEmbeddingAdaDeploymentName string = textEmbeddingAdaDeployment.name +output llmModel string = gpt4oDeployment.properties.model.name +output llmModelDeploymentName string = gpt4oDeployment.name +output llmModelApiVersion string = gpt4oDeployment.apiVersion +output textEmbeddingModel string = textEmbeddingAdaDeployment.properties.model.name +output textEmbeddingModelDeploymentName string = textEmbeddingAdaDeployment.name +output textEmbeddingModelApiVersion string = textEmbeddingAdaDeployment.apiVersion diff --git a/infra/deploy.sh b/infra/deploy.sh index 8e770b3f..4d1e6b19 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -17,7 +17,6 @@ PUBLISHER_EMAIL="" PUBLISHER_NAME="" RESOURCE_BASE_NAME="" REPORTERS="" -GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT="" CONTAINER_REGISTRY_NAME="" requiredParams=( @@ -244,10 +243,6 @@ populateOptionalParams () { REPORTERS="blob,console,app_insights" printf "\tsetting REPORTERS=blob,console,app_insights\n" fi - if [ -z "$GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT" ]; then - GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT="https://cognitiveservices.azure.com/.default" - printf "\tsetting GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT=$GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT\n" - fi if [ -z "$GRAPHRAG_IMAGE" ]; then GRAPHRAG_IMAGE="graphrag:backend" printf "\tsetting GRAPHRAG_IMAGE=$GRAPHRAG_IMAGE\n" @@ -426,6 +421,19 @@ installGraphRAGHelmChart () { exitIfValueEmpty "$graphragImageName" "Unable to parse graphrag image name, exiting..." exitIfValueEmpty "$graphragImageVersion" "Unable to parse graphrag image version, exiting..." + local graphragApiBase=$(jq -r .azure_aoai_endpoint.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragApiBase" "Unable to parse AOAI endpoint from deployment outputs, exiting..." + local graphragApiVersion=$(jq -r .azure_aoai_llm_model_api_version.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragApiVersion" "Unable to parse AOAI model api version from deployment outputs, exiting..." + local graphragLlmModel=$(jq -r .azure_aoai_llm_model.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragLlmModel" "Unable to parse LLM model name from deployment outputs, exiting..." + local graphragLlmModelDeployment=$(jq -r .azure_aoai_llm_model_deployment_name.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragLlmModelDeployment" "Unable to parse LLM model deployment name from deployment outputs, exiting..." + local graphragEmbeddingModel=$(jq -r .azure_aoai_embedding_model.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragEmbeddingModel" "Unable to parse embedding model name from deployment outputs, exiting..." + local graphragEmbeddingModelDeployment=$(jq -r .azure_aoai_embedding_model_deployment_name.value <<< $AZURE_OUTPUTS) + exitIfValueEmpty "$graphragEmbeddingModelDeployment" "Unable to parse embedding model deployment name from deployment outputs, exiting..." + local escapedReporters=$(sed "s/,/\\\,/g" <<< "$REPORTERS") reset_x=true if ! [ -o xtrace ]; then @@ -445,13 +453,12 @@ installGraphRAGHelmChart () { --set "graphragConfig.AI_SEARCH_URL=https://$aiSearchName.$AISEARCH_ENDPOINT_SUFFIX" \ --set "graphragConfig.AI_SEARCH_AUDIENCE=$AISEARCH_AUDIENCE" \ --set "graphragConfig.COSMOS_URI_ENDPOINT=$cosmosEndpoint" \ - --set "graphragConfig.GRAPHRAG_API_BASE=$GRAPHRAG_API_BASE" \ - --set "graphragConfig.GRAPHRAG_API_VERSION=$GRAPHRAG_API_VERSION" \ - --set "graphragConfig.GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT=$GRAPHRAG_COGNITIVE_SERVICES_ENDPOINT" \ - --set "graphragConfig.GRAPHRAG_LLM_MODEL=$GRAPHRAG_LLM_MODEL" \ - --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$GRAPHRAG_LLM_DEPLOYMENT_NAME" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$GRAPHRAG_EMBEDDING_MODEL" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME" \ + --set "graphragConfig.GRAPHRAG_API_BASE=$graphragApiBase" \ + --set "graphragConfig.GRAPHRAG_API_VERSION=$graphragApiVersion" \ + --set "graphragConfig.GRAPHRAG_LLM_MODEL=$graphragLlmModel" \ + --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$graphragLlmModelDeployment" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$graphragEmbeddingModel" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$graphragEmbeddingModelDeployment" \ --set "graphragConfig.REPORTERS=$escapedReporters" \ --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$storageAccountBlobUrl" diff --git a/infra/main.bicep b/infra/main.bicep index b674ce18..7dcd9e67 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -196,8 +196,8 @@ module acr 'core/acr/acr.bicep' = { roleAssignments: [ { principalId: aks.outputs.kubeletPrincipalId - principalType: 'ServicePrincipal' roleDefinitionId: roles.acrPull + principalType: 'ServicePrincipal' } ] } @@ -248,18 +248,18 @@ module aiSearch 'core/ai-search/ai-search.bicep' = { roleAssignments: [ { principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' roleDefinitionId: roles.aiSearchContributor + principalType: 'ServicePrincipal' } { principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' roleDefinitionId: roles.aiSearchIndexDataContributor + principalType: 'ServicePrincipal' } { principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' roleDefinitionId: roles.aiSearchIndexDataReader + principalType: 'ServicePrincipal' } ] } @@ -275,8 +275,8 @@ module storage 'core/storage/storage.bicep' = { roleAssignments: [ { principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' roleDefinitionId: roles.storageBlobDataContributor + principalType: 'ServicePrincipal' } ] deleteRetentionPolicy: { @@ -407,29 +407,50 @@ module privateLinkScopePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if ( } } + output azure_location string = location + output azure_tenant_id string = tenant().tenantId + output azure_ai_search_name string = aiSearch.outputs.name + output azure_acr_login_server string = acr.outputs.loginServer output azure_acr_name string = acr.outputs.name + +output azure_aoai_endpoint string = aoai.outputs.openAiEndpoint +output azure_aoai_llm_model string = aoai.outputs.llmModel +output azure_aoai_llm_model_deployment_name string = aoai.outputs.llmModelDeploymentName +output azure_aoai_llm_model_api_version string = aoai.outputs.llmModelApiVersion +output azure_aoai_embedding_model string = aoai.outputs.textEmbeddingModel +output azure_aoai_embedding_model_deployment_name string = aoai.outputs.textEmbeddingModelDeploymentName +output azure_aoai_embedding_model_api_version string = aoai.outputs.textEmbeddingModelApiVersion + output azure_aks_name string = aks.outputs.name output azure_aks_controlplanefqdn string = aks.outputs.controlPlaneFqdn output azure_aks_managed_rg string = aks.outputs.managedResourceGroup output azure_aks_service_account_name string = aksServiceAccountName + +output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId +output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId +output azure_workload_identity_name string = workloadIdentity.outputs.name + output azure_storage_account string = storage.outputs.name output azure_storage_account_blob_url string = storage.outputs.primaryEndpoints.blob + output azure_cosmosdb_endpoint string = cosmosdb.outputs.endpoint output azure_cosmosdb_name string = cosmosdb.outputs.name output azure_cosmosdb_id string = cosmosdb.outputs.id + output azure_app_insights_connection_string string = apim.outputs.appInsightsConnectionString + output azure_apim_name string = apim.outputs.name output azure_apim_gateway_url string = apim.outputs.apimGatewayUrl + output azure_dns_zone_name string = privateDnsZone.outputs.name + output azure_app_hostname string = appHostname output azure_app_url string = appUrl -output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId -output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId -output azure_workload_identity_name string = workloadIdentity.outputs.name + output azure_private_dns_zones array = enablePrivateEndpoints ? union( privatelinkPrivateDns.outputs.privateDnsZones, [privateDnsZone.outputs.name] From 743d587d94611d1cb001e4eb9c74aa0c130b45ba Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 6 Jan 2025 02:35:41 -0500 Subject: [PATCH 16/28] cleanup optional parameters and define default values in helm chart --- infra/deploy.sh | 14 -------------- infra/helm/graphrag/values.yaml | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/infra/deploy.sh b/infra/deploy.sh index 4d1e6b19..e39bca20 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -16,17 +16,10 @@ GRAPHRAG_IMAGE="" PUBLISHER_EMAIL="" PUBLISHER_NAME="" RESOURCE_BASE_NAME="" -REPORTERS="" CONTAINER_REGISTRY_NAME="" requiredParams=( LOCATION - GRAPHRAG_API_BASE - GRAPHRAG_API_VERSION - GRAPHRAG_LLM_MODEL - GRAPHRAG_LLM_DEPLOYMENT_NAME - GRAPHRAG_EMBEDDING_MODEL - GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME RESOURCE_GROUP ) @@ -239,10 +232,6 @@ populateOptionalParams () { if [ ! -z "$RESOURCE_BASE_NAME" ]; then printf "\tsetting RESOURCE_BASE_NAME=$RESOURCE_BASE_NAME\n" fi - if [ -z "$REPORTERS" ]; then - REPORTERS="blob,console,app_insights" - printf "\tsetting REPORTERS=blob,console,app_insights\n" - fi if [ -z "$GRAPHRAG_IMAGE" ]; then GRAPHRAG_IMAGE="graphrag:backend" printf "\tsetting GRAPHRAG_IMAGE=$GRAPHRAG_IMAGE\n" @@ -434,7 +423,6 @@ installGraphRAGHelmChart () { local graphragEmbeddingModelDeployment=$(jq -r .azure_aoai_embedding_model_deployment_name.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$graphragEmbeddingModelDeployment" "Unable to parse embedding model deployment name from deployment outputs, exiting..." - local escapedReporters=$(sed "s/,/\\\,/g" <<< "$REPORTERS") reset_x=true if ! [ -o xtrace ]; then set -x @@ -451,7 +439,6 @@ installGraphRAGHelmChart () { --set "ingress.host=$graphragHostname" \ --set "graphragConfig.APP_INSIGHTS_CONNECTION_STRING=$appInsightsConnectionString" \ --set "graphragConfig.AI_SEARCH_URL=https://$aiSearchName.$AISEARCH_ENDPOINT_SUFFIX" \ - --set "graphragConfig.AI_SEARCH_AUDIENCE=$AISEARCH_AUDIENCE" \ --set "graphragConfig.COSMOS_URI_ENDPOINT=$cosmosEndpoint" \ --set "graphragConfig.GRAPHRAG_API_BASE=$graphragApiBase" \ --set "graphragConfig.GRAPHRAG_API_VERSION=$graphragApiVersion" \ @@ -459,7 +446,6 @@ installGraphRAGHelmChart () { --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$graphragLlmModelDeployment" \ --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$graphragEmbeddingModel" \ --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$graphragEmbeddingModelDeployment" \ - --set "graphragConfig.REPORTERS=$escapedReporters" \ --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$storageAccountBlobUrl" local helmResult=$? diff --git a/infra/helm/graphrag/values.yaml b/infra/helm/graphrag/values.yaml index 6ccdeddf..53d38a08 100644 --- a/infra/helm/graphrag/values.yaml +++ b/infra/helm/graphrag/values.yaml @@ -30,7 +30,7 @@ ingress: service.beta.kubernetes.io/azure-load-balancer-internal: "true" graphragConfig: - AI_SEARCH_AUDIENCE: "" + AI_SEARCH_AUDIENCE: "https://search.azure.com" AI_SEARCH_URL: "" APP_INSIGHTS_CONNECTION_STRING: "" COSMOS_URI_ENDPOINT: "" From b6153f35247791d63c2aaa3dea100a674e080bcf Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 6 Jan 2025 19:20:45 -0500 Subject: [PATCH 17/28] auto-format bicep code --- infra/core/ai-search/ai-search.bicep | 2 +- infra/core/aks/aks.bicep | 6 +++--- infra/core/aoai/aoai.bicep | 1 - infra/core/cosmosdb/cosmosdb.bicep | 3 +-- infra/core/identity/identity.bicep | 1 - infra/core/log-analytics/log.bicep | 1 - infra/core/monitor/private-link-scope.bicep | 1 - infra/core/storage/storage.bicep | 7 +++---- infra/core/vnet/private-dns-vnet-link.bicep | 1 - infra/core/vnet/private-dns-zone-a-record.bicep | 1 - infra/core/vnet/private-dns-zone.bicep | 1 - infra/core/vnet/private-endpoint.bicep | 1 - infra/core/vnet/privatelink-private-dns-zones.bicep | 8 ++++++-- infra/core/vnet/vnet-dns-link.bicep | 1 - 14 files changed, 14 insertions(+), 21 deletions(-) diff --git a/infra/core/ai-search/ai-search.bicep b/infra/core/ai-search/ai-search.bicep index a02dfe53..2d51c6ed 100644 --- a/infra/core/ai-search/ai-search.bicep +++ b/infra/core/ai-search/ai-search.bicep @@ -10,7 +10,7 @@ param location string = resourceGroup().location @description('Array of objects with fields principalId, principalType, roleDefinitionId') param roleAssignments array = [] -@allowed([ 'enabled', 'disabled' ]) +@allowed(['enabled', 'disabled']) param publicNetworkAccess string = 'enabled' resource aiSearch 'Microsoft.Search/searchServices@2024-03-01-preview' = { diff --git a/infra/core/aks/aks.bicep b/infra/core/aks/aks.bicep index 07d6e71c..14ebfb3a 100644 --- a/infra/core/aks/aks.bicep +++ b/infra/core/aks/aks.bicep @@ -117,9 +117,9 @@ resource aks 'Microsoft.ContainerService/managedClusters@2024-09-02-preview' = { } } networkProfile: { - serviceCidr: '10.3.0.0/16' // must not overlap with any subnet IP ranges - dnsServiceIP: '10.3.0.10' // must be within the range specified in serviceCidr - podCidr: '10.244.0.0/16' // IP range from which to assign pod IPs + serviceCidr: '10.3.0.0/16' // must not overlap with any subnet IP ranges + dnsServiceIP: '10.3.0.10' // must be within the range specified in serviceCidr + podCidr: '10.244.0.0/16' // IP range from which to assign pod IPs } autoUpgradeProfile: autoUpgradeProfile oidcIssuerProfile: { diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index e99b582b..37f3f94b 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -19,7 +19,6 @@ param textEmbeddingAdaTpm int = 10 @description('Array of objects with fields principalId, roleDefinitionId') param roleAssignments array = [] - resource aoai 'Microsoft.CognitiveServices/accounts@2024-10-01' = { name: openAiName location: location diff --git a/infra/core/cosmosdb/cosmosdb.bicep b/infra/core/cosmosdb/cosmosdb.bicep index 1aecdb45..ef8782ff 100644 --- a/infra/core/cosmosdb/cosmosdb.bicep +++ b/infra/core/cosmosdb/cosmosdb.bicep @@ -7,7 +7,7 @@ param cosmosDbName string @description('The location of the CosmosDB resource.') param location string = resourceGroup().location -@allowed([ 'Enabled', 'Disabled' ]) +@allowed(['Enabled', 'Disabled']) param publicNetworkAccess string = 'Disabled' @description('Role definition id to assign to the principal. Learn more: https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-rbac') @@ -22,7 +22,6 @@ param roleDefinitionId array = [ param principalId string - resource cosmosDb 'Microsoft.DocumentDB/databaseAccounts@2024-11-15' = { name: cosmosDbName location: location diff --git a/infra/core/identity/identity.bicep b/infra/core/identity/identity.bicep index b6f8e56a..0cb0fb57 100644 --- a/infra/core/identity/identity.bicep +++ b/infra/core/identity/identity.bicep @@ -10,7 +10,6 @@ param location string = resourceGroup().location @description('federated name: FederatedIdentityCredentialProperties. See https://learn.microsoft.com/en-us/azure/templates/microsoft.managedidentity/userassignedidentities/federatedidentitycredentials?pivots=deployment-language-bicep#federatedidentitycredentialproperties') param federatedCredentials object = {} - resource identity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { name: name location: location diff --git a/infra/core/log-analytics/log.bicep b/infra/core/log-analytics/log.bicep index cd33261a..0c85dbfa 100644 --- a/infra/core/log-analytics/log.bicep +++ b/infra/core/log-analytics/log.bicep @@ -10,7 +10,6 @@ param location string = resourceGroup().location @description('The public network access for ingestion.') param publicNetworkAccessForIngestion string = 'Disabled' - resource logAnalyticsWorkspace 'Microsoft.OperationalInsights/workspaces@2022-10-01' = { name: name location: location diff --git a/infra/core/monitor/private-link-scope.bicep b/infra/core/monitor/private-link-scope.bicep index 54e18c17..76050c8e 100644 --- a/infra/core/monitor/private-link-scope.bicep +++ b/infra/core/monitor/private-link-scope.bicep @@ -6,7 +6,6 @@ param privateLinkScopedResources array = [] param queryAccessMode string = 'Open' param ingestionAccessMode string = 'PrivateOnly' - resource privateLinkScope 'microsoft.insights/privateLinkScopes@2021-07-01-preview' = { name: privateLinkScopeName location: 'global' diff --git a/infra/core/storage/storage.bicep b/infra/core/storage/storage.bicep index 8f6fa031..aa578b98 100644 --- a/infra/core/storage/storage.bicep +++ b/infra/core/storage/storage.bicep @@ -7,13 +7,13 @@ param name string @description('The location of the Storage Account resource.') param location string = resourceGroup().location -@allowed([ 'Hot', 'Cool', 'Premium' ]) +@allowed(['Hot', 'Cool', 'Premium']) param accessTier string = 'Hot' -@allowed([ 'AzureDnsZone', 'Standard' ]) +@allowed(['AzureDnsZone', 'Standard']) param dnsEndpointType string = 'Standard' -@allowed([ 'Enabled', 'Disabled' ]) +@allowed(['Enabled', 'Disabled']) param publicNetworkAccess string = 'Disabled' @description('Array of objects with fields principalId, principalType, roleDefinitionId') @@ -29,7 +29,6 @@ param kind string = 'StorageV2' param minimumTlsVersion string = 'TLS1_2' param containers array = [] - resource storage 'Microsoft.Storage/storageAccounts@2023-01-01' = { name: name location: location diff --git a/infra/core/vnet/private-dns-vnet-link.bicep b/infra/core/vnet/private-dns-vnet-link.bicep index fcd29d00..9546a86f 100644 --- a/infra/core/vnet/private-dns-vnet-link.bicep +++ b/infra/core/vnet/private-dns-vnet-link.bicep @@ -5,7 +5,6 @@ param vnetId string param privateDnsZoneName string var vnet_id_hash = uniqueString(vnetId) - resource dnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = { name: privateDnsZoneName location: 'global' diff --git a/infra/core/vnet/private-dns-zone-a-record.bicep b/infra/core/vnet/private-dns-zone-a-record.bicep index c1e1739e..04356590 100644 --- a/infra/core/vnet/private-dns-zone-a-record.bicep +++ b/infra/core/vnet/private-dns-zone-a-record.bicep @@ -13,7 +13,6 @@ param ttl int = 900 @description('The IP address') param ipv4Address string - resource dnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' existing = { name: dnsZoneName } diff --git a/infra/core/vnet/private-dns-zone.bicep b/infra/core/vnet/private-dns-zone.bicep index 35d7f525..431c1015 100644 --- a/infra/core/vnet/private-dns-zone.bicep +++ b/infra/core/vnet/private-dns-zone.bicep @@ -7,7 +7,6 @@ param name string @description('The name of the virtual networks the DNS zone should be associated with.') param vnetNames string[] - resource dnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = { name: name location: 'global' diff --git a/infra/core/vnet/private-endpoint.bicep b/infra/core/vnet/private-endpoint.bicep index 0d0eb32c..6d7b6c02 100644 --- a/infra/core/vnet/private-endpoint.bicep +++ b/infra/core/vnet/private-endpoint.bicep @@ -14,7 +14,6 @@ param privateEndpointName string param groupId string param location string = resourceGroup().location - resource privateEndpoint 'Microsoft.Network/privateEndpoints@2021-05-01' = { name: privateEndpointName location: location diff --git a/infra/core/vnet/privatelink-private-dns-zones.bicep b/infra/core/vnet/privatelink-private-dns-zones.bicep index a6c57f1a..89f15e21 100644 --- a/infra/core/vnet/privatelink-private-dns-zones.bicep +++ b/infra/core/vnet/privatelink-private-dns-zones.bicep @@ -11,8 +11,12 @@ var storagePrivateDnsZoneNames = [blobStoragePrivateDnsZoneName] var privateDnsZoneData = loadJsonContent('private-dns-zone-groups.json') var cloudName = toLower(environment().name) var azureMonitorPrivateDnsZones = privateDnsZoneData[cloudName].azureMonitor -var privateDnsZones = union(azureMonitorPrivateDnsZones, storagePrivateDnsZoneNames, [cosmosDbPrivateDnsZoneName], [aiSearchPrivateDnsZoneName]) - +var privateDnsZones = union( + azureMonitorPrivateDnsZones, + storagePrivateDnsZoneNames, + [cosmosDbPrivateDnsZoneName], + [aiSearchPrivateDnsZoneName] +) resource privateDnsZoneResources 'Microsoft.Network/privateDnsZones@2020-06-01' = [ for name in privateDnsZones: { diff --git a/infra/core/vnet/vnet-dns-link.bicep b/infra/core/vnet/vnet-dns-link.bicep index 27448b8e..5ce16f1e 100644 --- a/infra/core/vnet/vnet-dns-link.bicep +++ b/infra/core/vnet/vnet-dns-link.bicep @@ -4,7 +4,6 @@ param privateDnsZoneName string param vnetIds array - resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' existing = { name: privateDnsZoneName } From 5f78d37879812834304e8a95104f2b650c57f142 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Mon, 6 Jan 2025 19:31:10 -0500 Subject: [PATCH 18/28] auto format code --- infra/main.bicep | 56 ++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/infra/main.bicep b/infra/main.bicep index 7dcd9e67..ea734847 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -24,7 +24,9 @@ param resourceGroup string @description('Unique name to append to each resource') param resourceBaseName string = '' -var resourceBaseNameFinal = !empty(resourceBaseName) ? resourceBaseName : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroup}')) +var resourceBaseNameFinal = !empty(resourceBaseName) + ? resourceBaseName + : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroup}')) @description('Cloud region for all resources') param location string = az.resourceGroup().location @@ -76,37 +78,37 @@ var roles = { ) aiSearchContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - 'b24988ac-6180-42a0-ab88-20f7382dd24c' // AI Search Contributor Role + 'b24988ac-6180-42a0-ab88-20f7382dd24c' // AI Search Contributor Role ) aiSearchIndexDataContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - '8ebe5a00-799e-43f5-93ac-243d3dce84a7' // AI Search Index Data Contributor Role + '8ebe5a00-799e-43f5-93ac-243d3dce84a7' // AI Search Index Data Contributor Role ) aiSearchIndexDataReader: resourceId( 'Microsoft.Authorization/roleDefinitions', - '1407120a-92aa-4202-b7e9-c0e197c71c8f' // AI Search Index Data Reader Role + '1407120a-92aa-4202-b7e9-c0e197c71c8f' // AI Search Index Data Reader Role ) privateDnsZoneContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role + 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role ) networkContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - '4d97b98b-1d4f-4787-a291-c67834d212e7' // Network Contributor Role + '4d97b98b-1d4f-4787-a291-c67834d212e7' // Network Contributor Role ) cognitiveServicesOpenaiContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - 'a001fd3d-188f-4b5d-821b-7da978bf7442' // Cognitive Services OpenAI Contributor + 'a001fd3d-188f-4b5d-821b-7da978bf7442' // Cognitive Services OpenAI Contributor ) acrPull: resourceId( 'Microsoft.Authorization/roleDefinitions', - '7f951dda-4ed3-4680-a7ca-43fe172d538d' // ACR Pull Role + '7f951dda-4ed3-4680-a7ca-43fe172d538d' // ACR Pull Role ) } module log 'core/log-analytics/log.bicep' = { name: 'log-analytics-deployment' - params:{ + params: { name: '${abbrs.operationalInsightsWorkspaces}${resourceBaseNameFinal}' location: location publicNetworkAccessForIngestion: enablePrivateEndpoints ? 'Disabled' : 'Enabled' @@ -138,14 +140,16 @@ resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = { networkSecurityGroup: { id: nsg.outputs.id } - delegations: (apimTier=='Developer') ? [] : [ - { - name: 'Microsoft.Web/serverFarms' - properties: { - serviceName: 'Microsoft.Web/serverFarms' - } - } - ] + delegations: (apimTier == 'Developer') + ? [] + : [ + { + name: 'Microsoft.Web/serverFarms' + properties: { + serviceName: 'Microsoft.Web/serverFarms' + } + } + ] } } { @@ -205,11 +209,11 @@ module acr 'core/acr/acr.bicep' = { module aks 'core/aks/aks.bicep' = { name: 'aks-deployment' - params:{ + params: { clusterName: '${abbrs.containerServiceManagedClusters}${resourceBaseNameFinal}' location: location - graphragVMSize: 'standard_d8s_v5' // 8 vcpu, 32 GB memory - graphragIndexingVMSize: 'standard_e8s_v5' // 8 vcpus, 64 GB memory + graphragVMSize: 'standard_d8s_v5' // 8 vcpu, 32 GB memory + graphragIndexingVMSize: 'standard_e8s_v5' // 8 vcpus, 64 GB memory clusterAdmins: !empty(deployerPrincipalId) ? ['${deployerPrincipalId}'] : null logAnalyticsWorkspaceId: log.outputs.id subnetId: vnet.properties.subnets[1].id // aks subnet @@ -268,7 +272,9 @@ module aiSearch 'core/ai-search/ai-search.bicep' = { module storage 'core/storage/storage.bicep' = { name: 'storage-deployment' params: { - name: !empty(storageAccountName) ? storageAccountName : '${abbrs.storageStorageAccounts}${replace(resourceBaseNameFinal, '-', '')}' + name: !empty(storageAccountName) + ? storageAccountName + : '${abbrs.storageStorageAccounts}${replace(resourceBaseNameFinal, '-', '')}' location: location publicNetworkAccess: enablePrivateEndpoints ? 'Disabled' : 'Enabled' tags: tags @@ -407,7 +413,6 @@ module privateLinkScopePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if ( } } - output azure_location string = location output azure_tenant_id string = tenant().tenantId @@ -451,7 +456,6 @@ output azure_dns_zone_name string = privateDnsZone.outputs.name output azure_app_hostname string = appHostname output azure_app_url string = appUrl -output azure_private_dns_zones array = enablePrivateEndpoints ? union( - privatelinkPrivateDns.outputs.privateDnsZones, - [privateDnsZone.outputs.name] -) : [] +output azure_private_dns_zones array = enablePrivateEndpoints + ? union(privatelinkPrivateDns.outputs.privateDnsZones, [privateDnsZone.outputs.name]) + : [] From bc24bfad1c56f2638c13142e0d699576e7f5a561 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Tue, 7 Jan 2025 01:20:33 -0500 Subject: [PATCH 19/28] fix aoai deployment issue --- infra/README.md | 17 +++++++++++++++++ infra/core/aoai/aoai.bicep | 2 ++ infra/deploy.sh | 4 ---- infra/main.bicep | 19 ++++++++----------- 4 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 infra/README.md diff --git a/infra/README.md b/infra/README.md new file mode 100644 index 00000000..50ec49f7 --- /dev/null +++ b/infra/README.md @@ -0,0 +1,17 @@ +# Managed App Instructions + +This guide is a temporary document that walks through the progress made so far to convert the graphrag solution accelerator to a managed app. + +1. Auto format the bicep code + +```bash +find . -type f -name "*.bicep" -exec az bicep format --file {} \; +``` + +2. Convert bicep -> ARM +```bash +az bicep build --file main.bicep --outfile managed-app/mainTemplate.json +``` + +3. Test the Portal Interface +Use the [Azure Portal Sandbox](https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/SandboxBlade) to test and make any UI changes in `managed-app/createUiDefinition.json`. To make additional changes to the Azure portal experience, start by reading some [documentation](https://learn.microsoft.com/en-us/azure/azure-resource-manager/managed-applications/create-uidefinition-overview) and copying the contents of `createUiDefinition.json` into the sandbox environment. diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index 37f3f94b..a8a8fd0a 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -52,6 +52,8 @@ resource gpt4oDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024- resource textEmbeddingAdaDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { parent: aoai name: embeddingModelDeploymentName + // NOTE: simultaneous model deployments are not supported at this time. As a workaround, use dependsOn to force the models to be deployed in a sequential manner. + dependsOn: [gpt4oDeployment] sku: { name: 'Standard' capacity: textEmbeddingAdaTpm diff --git a/infra/deploy.sh b/infra/deploy.sh index e39bca20..9882b92f 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -302,9 +302,6 @@ checkForApimSoftDelete () { deployAzureResources () { echo "Deploying Azure resources..." - # get principal/object id of the signed in user - local deployerPrincipalId=$(az ad signed-in-user show --output json | jq -r .id) - exitIfValueEmpty $deployerPrincipalId "Principal ID of deployer not found" local datetime="`date +%Y-%m-%d_%H-%M-%S`" local deployName="graphrag-deploy-$datetime" echo "Deployment name: $deployName" @@ -320,7 +317,6 @@ deployAzureResources () { --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ --parameters "enablePrivateEndpoints=$ENABLE_PRIVATE_ENDPOINTS" \ --parameters "acrName=$CONTAINER_REGISTRY_NAME" \ - --parameters "deployerPrincipalId=$deployerPrincipalId" \ --output json) # errors in deployment may not be caught by exitIfCommandFailed function so we also check the output for errors exitIfCommandFailed $? "Error deploying Azure resources..." diff --git a/infra/main.bicep b/infra/main.bicep index ea734847..bfc0b76b 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -31,9 +31,6 @@ var resourceBaseNameFinal = !empty(resourceBaseName) @description('Cloud region for all resources') param location string = az.resourceGroup().location -@description('Principal/Object ID of the deployer. Will be used to assign admin roles to the AKS cluster.') -param deployerPrincipalId string - @minLength(1) @description('Name of the publisher of the API Management instance.') param apiPublisherName string = 'Microsoft' @@ -52,7 +49,7 @@ param enablePrivateEndpoints bool = true param restoreAPIM bool = false // optional parameters that will default to a generated name if not provided -param apimTier string = 'Developer' +param apimTier string = 'StandardV2' param apimName string = '' param acrName string = '' param storageAccountName string = '' @@ -185,8 +182,8 @@ module aoai 'core/aoai/aoai.bicep' = { roleAssignments: [ { principalId: workloadIdentity.outputs.principalId - roleDefinitionId: roles.cognitiveServicesOpenaiContributor principalType: 'ServicePrincipal' + roleDefinitionId: roles.cognitiveServicesOpenaiContributor } ] } @@ -200,8 +197,8 @@ module acr 'core/acr/acr.bicep' = { roleAssignments: [ { principalId: aks.outputs.kubeletPrincipalId - roleDefinitionId: roles.acrPull principalType: 'ServicePrincipal' + roleDefinitionId: roles.acrPull } ] } @@ -214,7 +211,7 @@ module aks 'core/aks/aks.bicep' = { location: location graphragVMSize: 'standard_d8s_v5' // 8 vcpu, 32 GB memory graphragIndexingVMSize: 'standard_e8s_v5' // 8 vcpus, 64 GB memory - clusterAdmins: !empty(deployerPrincipalId) ? ['${deployerPrincipalId}'] : null + clusterAdmins: null logAnalyticsWorkspaceId: log.outputs.id subnetId: vnet.properties.subnets[1].id // aks subnet privateDnsZoneName: privateDnsZone.outputs.name @@ -252,18 +249,18 @@ module aiSearch 'core/ai-search/ai-search.bicep' = { roleAssignments: [ { principalId: workloadIdentity.outputs.principalId - roleDefinitionId: roles.aiSearchContributor principalType: 'ServicePrincipal' + roleDefinitionId: roles.aiSearchContributor } { principalId: workloadIdentity.outputs.principalId - roleDefinitionId: roles.aiSearchIndexDataContributor principalType: 'ServicePrincipal' + roleDefinitionId: roles.aiSearchIndexDataContributor } { principalId: workloadIdentity.outputs.principalId - roleDefinitionId: roles.aiSearchIndexDataReader principalType: 'ServicePrincipal' + roleDefinitionId: roles.aiSearchIndexDataReader } ] } @@ -281,8 +278,8 @@ module storage 'core/storage/storage.bicep' = { roleAssignments: [ { principalId: workloadIdentity.outputs.principalId - roleDefinitionId: roles.storageBlobDataContributor principalType: 'ServicePrincipal' + roleDefinitionId: roles.storageBlobDataContributor } ] deleteRetentionPolicy: { From ca0c4890adfdb4cb7fb66410d8ca0fa05bc18bc3 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Wed, 8 Jan 2025 11:38:03 -0500 Subject: [PATCH 20/28] working version of a managed app --- infra/README.md | 34 ++++- infra/core/aoai/aoai.bicep | 60 ++++---- infra/deploy.sh | 2 - infra/main.bicep | 62 +++++--- infra/managed-app/createUiDefinition.json | 176 ++++++++++++++++++++++ 5 files changed, 279 insertions(+), 55 deletions(-) create mode 100644 infra/managed-app/createUiDefinition.json diff --git a/infra/README.md b/infra/README.md index 50ec49f7..afd958fe 100644 --- a/infra/README.md +++ b/infra/README.md @@ -1,17 +1,41 @@ # Managed App Instructions -This guide is a temporary document that walks through the progress made so far to convert the graphrag solution accelerator to a managed app. +This guide is a temporary document that walks through the process to convert the graphrag solution accelerator to a managed app. -1. Auto format the bicep code +### 1. Auto format the bicep code + +As a precaution, start by auto-formating and linting the bicep code to detect any mistakes early-on. ```bash +cd /infra find . -type f -name "*.bicep" -exec az bicep format --file {} \; +find . -type f -name "*.bicep" -exec az bicep lint --file {} \; ``` -2. Convert bicep -> ARM +### 2. Convert bicep -> ARM ```bash az bicep build --file main.bicep --outfile managed-app/mainTemplate.json ``` -3. Test the Portal Interface -Use the [Azure Portal Sandbox](https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/SandboxBlade) to test and make any UI changes in `managed-app/createUiDefinition.json`. To make additional changes to the Azure portal experience, start by reading some [documentation](https://learn.microsoft.com/en-us/azure/azure-resource-manager/managed-applications/create-uidefinition-overview) and copying the contents of `createUiDefinition.json` into the sandbox environment. +### 3. Create & test the Azure portal interface + +Use the [Azure Portal Sandbox](https://portal.azure.com/#blade/Microsoft_Azure_CreateUIDef/SandboxBlade) to test and make any UI changes that are defined in [createUiDefinition.json](createUiDefinition.json). To make additional changes to the Azure portal experience, start by reading some [documentation](https://learn.microsoft.com/en-us/azure/azure-resource-manager/managed-applications/create-uidefinition-overview) and copying the contents of `createUiDefinition.json` into the sandbox environment. + +### 4. Package up the managed app code + +The name of the final two files (`mainTemplate.json` and `createUiDefinition.json`) cannot be changed. The file names are also case-sensitive and cannot be changed at this time. Managed apps require these files to be packaged up into a zip file (where the json files must be at the root directory). + +```bash +cd /infra/managed-app +zip -rj managed-app.zip . +``` + +This zip file can then be uploaded to an Azure Storage location when setting up a [Service Catalog Managed Application Definition](https://ms.portal.azure.com/#view/Microsoft_Azure_Marketplace/GalleryItemDetailsBladeNopdl/id/Microsoft.ApplianceDefinition/selectionMode~/false/resourceGroupId//resourceGroupLocation//dontDiscardJourney~/false/selectedMenuId/home/launchingContext~/%7B%22galleryItemId%22%3A%22Microsoft.ApplianceDefinition%22%2C%22source%22%3A%5B%22GalleryFeaturedMenuItemPart%22%2C%22VirtualizedTileDetails%22%5D%2C%22menuItemId%22%3A%22home%22%2C%22subMenuItemId%22%3A%22Search%20results%22%2C%22telemetryId%22%3A%2220409084-39a1-4800-bbce-d0b26a6f46a4%22%7D/searchTelemetryId/d7d20e05-ca16-47f7-bed5-9c7b8d2fa641). + +### 5. Create the Service Catalog Managed App Definition + +In the Azure Portal, go to Marketplace and create a `Service Catalog Managed App Definition`. You must provide a uri link to the uploaded `managed-app.zip` file as part of the creation process. + +### 6. Deploy the managed app + +In the Azure Portal, find and click on the managed app definition resource that was created in the previous step. A button option to `Deploy from definition` will be available. Click on it and proceed through the setup steps (defined by the `createUiDefinitions.json` file) that a consumer would experience when installing the managed app. diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index a8a8fd0a..b5b1b1e8 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -4,17 +4,23 @@ param openAiName string = 'openai${uniqueString(resourceGroup().id)}' @description('Location for the Azure OpenAI instance') param location string = resourceGroup().location -@description('LLM model deployment name') -param llmModelDeploymentName string = 'gpt-4o' +@description('LLM model name') +param llmModelName string = 'gpt-4o' -@description('Embedding model deployment name') -param embeddingModelDeploymentName string = 'text-embedding-ada-002' +@description('LLM Model API version') +param llmModelVersion string -@description('TPM quota for GPT-4o deployment') -param gpt4oTpm int = 10 +@description('Embedding model name') +param embeddingModelName string = 'text-embedding-ada-002' -@description('TPM quota for text-embedding-ada-002 deployment') -param textEmbeddingAdaTpm int = 10 +@description('Embedding Model API version') +param embeddingModelVersion string + +@description('TPM quota for llm model deployment (x1000)') +param llmTpmQuota int = 10 + +@description('TPM quota for embedding model deployment (x1000)') +param embeddingTpmQuota int = 10 @description('Array of objects with fields principalId, roleDefinitionId') param roleAssignments array = [] @@ -32,39 +38,39 @@ resource aoai 'Microsoft.CognitiveServices/accounts@2024-10-01' = { } } -resource gpt4oDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { +resource llmDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { parent: aoai - name: llmModelDeploymentName + name: llmModelName sku: { name: 'GlobalStandard' - capacity: gpt4oTpm + capacity: llmTpmQuota } properties: { model: { format: 'OpenAI' - name: 'gpt-4o' - version: '2024-05-13' + name: llmModelName + version: llmModelVersion } - currentCapacity: gpt4oTpm + currentCapacity: llmTpmQuota } } -resource textEmbeddingAdaDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { +resource embeddingDeployment 'Microsoft.CognitiveServices/accounts/deployments@2024-10-01' = { parent: aoai - name: embeddingModelDeploymentName + name: embeddingModelName // NOTE: simultaneous model deployments are not supported at this time. As a workaround, use dependsOn to force the models to be deployed in a sequential manner. - dependsOn: [gpt4oDeployment] + dependsOn: [llmDeployment] sku: { name: 'Standard' - capacity: textEmbeddingAdaTpm + capacity: embeddingTpmQuota } properties: { model: { format: 'OpenAI' - name: 'text-embedding-ada-002' - version: '2' + name: embeddingModelName + version: embeddingModelVersion } - currentCapacity: textEmbeddingAdaTpm + currentCapacity: embeddingTpmQuota } } @@ -77,9 +83,9 @@ resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ ] output openAiEndpoint string = aoai.properties.endpoint -output llmModel string = gpt4oDeployment.properties.model.name -output llmModelDeploymentName string = gpt4oDeployment.name -output llmModelApiVersion string = gpt4oDeployment.apiVersion -output textEmbeddingModel string = textEmbeddingAdaDeployment.properties.model.name -output textEmbeddingModelDeploymentName string = textEmbeddingAdaDeployment.name -output textEmbeddingModelApiVersion string = textEmbeddingAdaDeployment.apiVersion +output llmModel string = llmDeployment.properties.model.name +output llmModelDeploymentName string = llmDeployment.name +output llmModelApiVersion string = llmDeployment.apiVersion +output textEmbeddingModel string = embeddingDeployment.properties.model.name +output textEmbeddingModelDeploymentName string = embeddingDeployment.name +output textEmbeddingModelApiVersion string = embeddingDeployment.apiVersion diff --git a/infra/deploy.sh b/infra/deploy.sh index 9882b92f..991589be 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -16,7 +16,6 @@ GRAPHRAG_IMAGE="" PUBLISHER_EMAIL="" PUBLISHER_NAME="" RESOURCE_BASE_NAME="" -CONTAINER_REGISTRY_NAME="" requiredParams=( LOCATION @@ -316,7 +315,6 @@ deployAzureResources () { --parameters "apiPublisherName=$PUBLISHER_NAME" \ --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ --parameters "enablePrivateEndpoints=$ENABLE_PRIVATE_ENDPOINTS" \ - --parameters "acrName=$CONTAINER_REGISTRY_NAME" \ --output json) # errors in deployment may not be caught by exitIfCommandFailed function so we also check the output for errors exitIfCommandFailed $? "Error deploying Azure resources..." diff --git a/infra/main.bicep b/infra/main.bicep index bfc0b76b..c2fde439 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -56,6 +56,24 @@ param storageAccountName string = '' param cosmosDbName string = '' param aiSearchName string = '' +// AOAI parameters +@description('Name of the AOAI LLM model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models') +@allowed(['gpt-4o', 'gpt-4o-mini']) +param llmModelName string = 'gpt-4o' +@description('Version of the AOAI LLM model to use.') +param llmModelVersion string = '2024-08-06' +@description('Quota of the AOAI LLM model to use.') +@minValue(1) +param llmModelQuota int = 10 + +@description('Name of the AOAI embedding model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models') +@allowed(['text-embedding-ada-002', 'text-embedding-3-large']) +param embeddingModelName string = 'text-embedding-ada-002' +param embeddingModelVersion string = '2' +@description('Quota of the AOAI embedding model to use.') +@minValue(1) +param embeddingModelQuota int = 10 + var abbrs = loadJsonContent('abbreviations.json') var tags = { 'azd-env-name': resourceGroup } var workloadIdentityName = '${abbrs.managedIdentityUserAssignedIdentities}${resourceBaseNameFinal}' @@ -175,10 +193,12 @@ module aoai 'core/aoai/aoai.bicep' = { params: { openAiName: '${abbrs.cognitiveServicesAccounts}${resourceBaseNameFinal}' location: location - llmModelDeploymentName: 'gpt-4o-${uniqueString(resourceBaseNameFinal)}' - gpt4oTpm: 10 - embeddingModelDeploymentName: 'text-embedding-ada-002-${uniqueString(resourceBaseNameFinal)}' - textEmbeddingAdaTpm: 10 + llmModelName: llmModelName + llmModelVersion: llmModelVersion + llmTpmQuota: llmModelQuota + embeddingModelName: embeddingModelName + embeddingModelVersion: embeddingModelVersion + embeddingTpmQuota: embeddingModelQuota roleAssignments: [ { principalId: workloadIdentity.outputs.principalId @@ -419,6 +439,11 @@ output azure_ai_search_name string = aiSearch.outputs.name output azure_acr_login_server string = acr.outputs.loginServer output azure_acr_name string = acr.outputs.name +output azure_aks_name string = aks.outputs.name +output azure_aks_controlplanefqdn string = aks.outputs.controlPlaneFqdn +output azure_aks_managed_rg string = aks.outputs.managedResourceGroup +output azure_aks_service_account_name string = aksServiceAccountName + output azure_aoai_endpoint string = aoai.outputs.openAiEndpoint output azure_aoai_llm_model string = aoai.outputs.llmModel output azure_aoai_llm_model_deployment_name string = aoai.outputs.llmModelDeploymentName @@ -427,32 +452,27 @@ output azure_aoai_embedding_model string = aoai.outputs.textEmbeddingModel output azure_aoai_embedding_model_deployment_name string = aoai.outputs.textEmbeddingModelDeploymentName output azure_aoai_embedding_model_api_version string = aoai.outputs.textEmbeddingModelApiVersion -output azure_aks_name string = aks.outputs.name -output azure_aks_controlplanefqdn string = aks.outputs.controlPlaneFqdn -output azure_aks_managed_rg string = aks.outputs.managedResourceGroup -output azure_aks_service_account_name string = aksServiceAccountName +output azure_apim_name string = apim.outputs.name +output azure_apim_gateway_url string = apim.outputs.apimGatewayUrl -output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId -output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId -output azure_workload_identity_name string = workloadIdentity.outputs.name +output azure_app_hostname string = appHostname +output azure_app_url string = appUrl -output azure_storage_account string = storage.outputs.name -output azure_storage_account_blob_url string = storage.outputs.primaryEndpoints.blob +output azure_app_insights_connection_string string = apim.outputs.appInsightsConnectionString output azure_cosmosdb_endpoint string = cosmosdb.outputs.endpoint output azure_cosmosdb_name string = cosmosdb.outputs.name output azure_cosmosdb_id string = cosmosdb.outputs.id -output azure_app_insights_connection_string string = apim.outputs.appInsightsConnectionString - -output azure_apim_name string = apim.outputs.name -output azure_apim_gateway_url string = apim.outputs.apimGatewayUrl - output azure_dns_zone_name string = privateDnsZone.outputs.name -output azure_app_hostname string = appHostname -output azure_app_url string = appUrl - output azure_private_dns_zones array = enablePrivateEndpoints ? union(privatelinkPrivateDns.outputs.privateDnsZones, [privateDnsZone.outputs.name]) : [] + +output azure_storage_account string = storage.outputs.name +output azure_storage_account_blob_url string = storage.outputs.primaryEndpoints.blob + +output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId +output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId +output azure_workload_identity_name string = workloadIdentity.outputs.name diff --git a/infra/managed-app/createUiDefinition.json b/infra/managed-app/createUiDefinition.json new file mode 100644 index 00000000..50a09752 --- /dev/null +++ b/infra/managed-app/createUiDefinition.json @@ -0,0 +1,176 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#", + "handler": "Microsoft.Azure.CreateUIDef", + "version": "0.1.2-preview", + "parameters": { + "basics": [ + {} + ], + "steps": [ + { + "name": "aoaiSettings", + "label": "AOAI Settings", + "subLabel": { + "preValidation": "Configure the AOAI settings", + "postValidation": "Completed" + }, + "elements": [ + { + "name": "llmModel", + "type": "Microsoft.Common.DropDown", + "label": "LLM Model", + "defaultValue": "gpt-4o", + "toolTip": "LLM model to use.", + "constraints": { + "allowedValues": [ + { + "label": "gpt-4o", + "value": "gpt-4o" + }, + { + "label": "gpt-4o-mini", + "value": "gpt-4o-mini" + } + ], + "required": true + }, + "visible": true + }, + { + "name": "llmModelVersion", + "type": "Microsoft.Common.DropDown", + "label": "LLM Model Version", + "defaultValue": "2024-08-06", + "toolTip": "LLM model version to use.", + "constraints": { + "allowedValues": [ + { + "label": "2024-08-06", + "value": "2024-08-06" + }, + { + "label": "2024-07-18", + "value": "2024-07-18" + } + ], + "required": true + }, + "visible": true + }, + { + "name": "llmModelQuota", + "type": "Microsoft.Common.TextBox", + "label": "LLM Model Quota (x1000)", + "placeholder": "85", + "defaultValue": "", + "toolTip": "Model quota to use.", + "constraints": { + "required": true, + "regex": "^[1-9][0-9]*$", + "validationMessage": "Valid LLM model quota." + }, + "visible": true + }, + { + "name": "embeddingModel", + "type": "Microsoft.Common.DropDown", + "label": "Embedding Model", + "defaultValue": "text-embedding-ada-002", + "toolTip": "Embedding model to use", + "constraints": { + "allowedValues": [ + { + "label": "text-embedding-ada-002", + "value": "text-embedding-ada-002" + }, + { + "label": "text-embedding-3-large", + "value": "text-embedding-3-large" + } + ], + "required": true + }, + "visible": true + }, + { + "name": "embeddingModelQuota", + "type": "Microsoft.Common.TextBox", + "label": "Embedding Model Quota (x1000)", + "placeholder": "100", + "defaultValue": "", + "toolTip": "Model quota to use.", + "constraints": { + "required": true, + "regex": "^[1-9][0-9]*$", + "validationMessage": "Valid embedding model quota." + }, + "visible": true + }, + { + "name": "embeddingModelVersion", + "type": "Microsoft.Common.DropDown", + "label": "Embedding Model Version", + "defaultValue": "2", + "toolTip": "Use a valid embedding model version.", + "constraints": { + "allowedValues": [ + { + "label": "2", + "value": "2" + }, + { + "label": "1", + "value": "1" + } + ], + "required": true + }, + "visible": true + } + ] + }, + { + "name": "graphragSettings", + "label": "GraphRAG Settings", + "subLabel": { + "preValidation": "Configure the graphrag settings", + "postValidation": "Completed" + }, + "elements": [ + { + "name": "apimTier", + "type": "Microsoft.Common.DropDown", + "label": "APIM Tier", + "defaultValue": "StandardV2", + "toolTip": "APIM tier to use", + "constraints": { + "allowedValues": [ + { + "label": "Developer", + "value": "Developer" + }, + { + "label": "StandardV2", + "value": "StandardV2" + } + ], + "required": true + }, + "visible": true + } + ] + } + ], + "outputs": { + "resourceGroup": "[resourceGroup().name]", + "location": "[location()]", + "apimTier": "[steps('graphragSettings').apimTier]", + "llmModelName": "[steps('aoaiSettings').llmModel]", + "llmModelQuota": "[int(steps('aoaiSettings').llmModelQuota)]", + "embeddingModelName": "[steps('aoaiSettings').embeddingModel]", + "embeddingModelQuota": "[int(steps('aoaiSettings').embeddingModelQuota)]", + "llmModelVersion": "[steps('aoaiSettings').llmModelVersion]", + "embeddingModelVersion": "[steps('aoaiSettings').embeddingModelVersion]" + } + } +} \ No newline at end of file From 24df161210903092198d12acd105d3eda730132e Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 31 Jan 2025 00:01:46 -0500 Subject: [PATCH 21/28] fix changes after merge with main --- infra/core/aoai/aoai.bicep | 11 ----- infra/deploy.sh | 20 +++----- infra/main.bicep | 95 ++++++-------------------------------- 3 files changed, 22 insertions(+), 104 deletions(-) diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index b5b1b1e8..4566b456 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -22,9 +22,6 @@ param llmTpmQuota int = 10 @description('TPM quota for embedding model deployment (x1000)') param embeddingTpmQuota int = 10 -@description('Array of objects with fields principalId, roleDefinitionId') -param roleAssignments array = [] - resource aoai 'Microsoft.CognitiveServices/accounts@2024-10-01' = { name: openAiName location: location @@ -74,14 +71,6 @@ resource embeddingDeployment 'Microsoft.CognitiveServices/accounts/deployments@2 } } -resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = [ - for role in roleAssignments: { - name: guid('${role.principalId}-${role.roleDefinitionId}') - scope: resourceGroup() - properties: role - } -] - output openAiEndpoint string = aoai.properties.endpoint output llmModel string = llmDeployment.properties.model.name output llmModelDeploymentName string = llmDeployment.name diff --git a/infra/deploy.sh b/infra/deploy.sh index 3d30135d..518935fd 100755 --- a/infra/deploy.sh +++ b/infra/deploy.sh @@ -146,6 +146,9 @@ checkRequiredTools () { which kubectl > /dev/null exitIfCommandFailed $? "kubectl is required, exiting..." + which kubelogin > /dev/null + exitIfCommandFailed $? "kubelogin is required, exiting..." + which helm > /dev/null exitIfCommandFailed $? "helm is required, exiting..." @@ -317,15 +320,12 @@ deployAzureResources () { --no-prompt \ --resource-group $RESOURCE_GROUP \ --template-file ./main.bicep \ - --parameters "resourceBaseName=$RESOURCE_BASE_NAME" \ - --parameters "resourceGroup=$RESOURCE_GROUP" \ --parameters "resourceGroup=$RESOURCE_GROUP" \ + --parameters "resourceBaseName=$RESOURCE_BASE_NAME" \ --parameters "apimName=$APIM_NAME" \ --parameters "apimTier=$APIM_TIER" \ - --parameters "apiPublisherName=$PUBLISHER_NAME" \ --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ --parameters "apiPublisherName=$PUBLISHER_NAME" \ - --parameters "apiPublisherEmail=$PUBLISHER_EMAIL" \ --parameters "enablePrivateEndpoints=$ENABLE_PRIVATE_ENDPOINTS" \ --output json) # errors in deployment may not be caught by exitIfCommandFailed function so we also check the output for errors @@ -414,8 +414,8 @@ installGraphRAGHelmChart () { local graphragImageName=$(sed -rn "s/([^:]+).*/\1/p" <<< "$GRAPHRAG_IMAGE") local graphragImageVersion=$(sed -rn "s/[^:]+:(.*)/\1/p" <<< "$GRAPHRAG_IMAGE") - exitIfValueEmpty "$graphragImageName" "Unable to parse graphrag image name, exiting..." - exitIfValueEmpty "$graphragImageVersion" "Unable to parse graphrag image version, exiting..." + exitIfValueEmpty "$graphragImageName" "Unable to parse graphrag docker image name, exiting..." + exitIfValueEmpty "$graphragImageVersion" "Unable to parse graphrag docker image version, exiting..." local graphragApiBase=$(jq -r .azure_aoai_endpoint.value <<< $AZURE_OUTPUTS) exitIfValueEmpty "$graphragApiBase" "Unable to parse AOAI endpoint from deployment outputs, exiting..." @@ -444,8 +444,8 @@ installGraphRAGHelmChart () { --set "master.image.repository=$containerRegistryName/$graphragImageName" \ --set "master.image.tag=$graphragImageVersion" \ --set "ingress.host=$graphragHostname" \ - --set "graphragConfig.APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightsConnectionString" \ --set "graphragConfig.AI_SEARCH_URL=https://$aiSearchName.$AISEARCH_ENDPOINT_SUFFIX" \ + --set "graphragConfig.APPLICATIONINSIGHTS_CONNECTION_STRING=$appInsightsConnectionString" \ --set "graphragConfig.COSMOS_URI_ENDPOINT=$cosmosEndpoint" \ --set "graphragConfig.GRAPHRAG_API_BASE=$graphragApiBase" \ --set "graphragConfig.GRAPHRAG_API_VERSION=$graphragApiVersion" \ @@ -453,13 +453,7 @@ installGraphRAGHelmChart () { --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$graphragLlmModelDeployment" \ --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$graphragEmbeddingModel" \ --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$graphragEmbeddingModelDeployment" \ - --set "graphragConfig.GRAPHRAG_API_BASE=$GRAPHRAG_API_BASE" \ - --set "graphragConfig.GRAPHRAG_API_VERSION=$GRAPHRAG_API_VERSION" \ --set "graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE" \ - --set "graphragConfig.GRAPHRAG_LLM_MODEL=$GRAPHRAG_LLM_MODEL" \ - --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$GRAPHRAG_LLM_DEPLOYMENT_NAME" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$GRAPHRAG_EMBEDDING_MODEL" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME" \ --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$storageAccountBlobUrl" local helmResult=$? diff --git a/infra/main.bicep b/infra/main.bicep index 723088bb..fa81fb1f 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -22,13 +22,6 @@ Managed Identity @description('Name of the resource group that GraphRAG will be deployed in.') param resourceGroup string -@description('Unique name to append to each resource') -param resourceBaseName string = '' -var resourceBaseNameFinal = !empty(resourceBaseName) - ? resourceBaseName - : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroup}')) -param resourceGroup string - @description('Unique name to append to each resource') param resourceBaseName string = '' var resourceBaseNameFinal = !empty(resourceBaseName) @@ -36,19 +29,16 @@ var resourceBaseNameFinal = !empty(resourceBaseName) : toLower(uniqueString('${subscription().id}/resourceGroups/${resourceGroup}')) @description('Cloud region for all resources') -param location string = az.az.resourceGroup().location +param location string = az.resourceGroup().location @minLength(1) @description('Name of the publisher of the API Management instance.') param apiPublisherName string = 'Microsoft' -param apiPublisherName string = 'Microsoft' @minLength(1) @description('Email address of the publisher of the API Management instance.') param apiPublisherEmail string = 'publisher@microsoft.com' -param apiPublisherEmail string = 'publisher@microsoft.com' -@description('The AKS namespace to install GraphRAG in.') @description('The AKS namespace to install GraphRAG in.') param aksNamespace string = 'graphrag' @@ -97,41 +87,19 @@ var appUrl = 'http://${appHostname}' @description('Role definitions for various roles that will be assigned at deployment time. Learn more: https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles') var roles = { - privateDnsZoneContributor: resourceId( - 'Microsoft.Authorization/roleDefinitions', - 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role - ) - networkContributor: resourceId( - 'Microsoft.Authorization/roleDefinitions', - 'b24988ac-6180-42a0-ab88-20f7382dd24c' // AI Search Contributor Role - ) acrPull: resourceId( 'Microsoft.Authorization/roleDefinitions', - '8ebe5a00-799e-43f5-93ac-243d3dce84a7' // AI Search Index Data Contributor Role '7f951dda-4ed3-4680-a7ca-43fe172d538d' // ACR Pull Role ) - aiSearchIndexDataReader: resourceId( - 'Microsoft.Authorization/roleDefinitions', - '1407120a-92aa-4202-b7e9-c0e197c71c8f' // AI Search Index Data Reader Role - ) - privateDnsZoneContributor: resourceId( - 'Microsoft.Authorization/roleDefinitions', - 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role - ) networkContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7' // Network Contributor Role ) - cognitiveServicesOpenaiContributor: resourceId( - 'Microsoft.Authorization/roleDefinitions', - 'a001fd3d-188f-4b5d-821b-7da978bf7442' // Cognitive Services OpenAI Contributor - ) - acrPull: resourceId( + privateDnsZoneContributor: resourceId( 'Microsoft.Authorization/roleDefinitions', - '7f951dda-4ed3-4680-a7ca-43fe172d538d' // ACR Pull Role + 'b12aa53e-6015-4669-85d0-8515ebb3ae7f' // Private DNS Zone Contributor Role ) } -} // apply RBAC role assignments to the AKS workload identity module aksWorkloadIdentityRBAC 'core/rbac/workload-identity-rbac.bicep' = { @@ -168,7 +136,7 @@ module aksRBAC 'core/rbac/aks-rbac.bicep' = { } module log 'core/log-analytics/log.bicep' = { - name: 'log-analytics-deployment-deployment' + name: 'log-analytics-deployment' params: { name: '${abbrs.operationalInsightsWorkspaces}${resourceBaseNameFinal}' location: location @@ -206,49 +174,14 @@ module aoai 'core/aoai/aoai.bicep' = { embeddingModelName: embeddingModelName embeddingModelVersion: embeddingModelVersion embeddingTpmQuota: embeddingModelQuota - roleAssignments: [ - { - principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' - roleDefinitionId: roles.cognitiveServicesOpenaiContributor - } - ] - } -} - -module aoai 'core/aoai/aoai.bicep' = { - name: 'aoai-deployment' - params: { - openAiName: '${abbrs.cognitiveServicesAccounts}${resourceBaseNameFinal}' - location: location - llmModelName: llmModelName - llmModelVersion: llmModelVersion - llmTpmQuota: llmModelQuota - embeddingModelName: embeddingModelName - embeddingModelVersion: embeddingModelVersion - embeddingTpmQuota: embeddingModelQuota - roleAssignments: [ - { - principalId: workloadIdentity.outputs.principalId - principalType: 'ServicePrincipal' - roleDefinitionId: roles.cognitiveServicesOpenaiContributor - } - ] } } module acr 'core/acr/acr.bicep' = { - name: 'acr' + name: 'acr-deployment' params: { registryName: !empty(acrName) ? acrName : '${abbrs.containerRegistryRegistries}${resourceBaseNameFinal}' location: location - roleAssignments: [ - { - principalId: aks.outputs.kubeletPrincipalId - principalType: 'ServicePrincipal' - roleDefinitionId: roles.acrPull - } - ] } } @@ -259,7 +192,7 @@ module aks 'core/aks/aks.bicep' = { location: location graphragVMSize: 'standard_d8s_v5' // 8 vcpu, 32 GB memory graphragIndexingVMSize: 'standard_e8s_v5' // 8 vcpus, 64 GB memory - clusterAdmins: !empty(deployerPrincipalId) ? ['${deployerPrincipalId}'] : null + clusterAdmins: null logAnalyticsWorkspaceId: log.outputs.id subnetId: vnet.outputs.aksSubnetId privateDnsZoneName: privateDnsZone.outputs.name @@ -452,24 +385,26 @@ output azure_aoai_embedding_model string = aoai.outputs.textEmbeddingModel output azure_aoai_embedding_model_deployment_name string = aoai.outputs.textEmbeddingModelDeploymentName output azure_aoai_embedding_model_api_version string = aoai.outputs.textEmbeddingModelApiVersion -output azure_apim_name string = apim.outputs.name output azure_apim_gateway_url string = apim.outputs.apimGatewayUrl +output azure_apim_name string = apim.outputs.name output azure_app_hostname string = appHostname output azure_app_url string = appUrl -output azure_app_insights_connection_string string = apim.outputs.appInsightsConnectionString +output azure_app_insights_connection_string string = appInsights.outputs.connectionString output azure_cosmosdb_endpoint string = cosmosdb.outputs.endpoint output azure_cosmosdb_name string = cosmosdb.outputs.name output azure_cosmosdb_id string = cosmosdb.outputs.id output azure_dns_zone_name string = privateDnsZone.outputs.name -output azure_app_hostname string = appHostname -output azure_app_url string = appUrl -output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId -output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId -output azure_workload_identity_name string = workloadIdentity.outputs.name output azure_private_dns_zones array = enablePrivateEndpoints ? union(privatelinkPrivateDns.outputs.privateDnsZones, [privateDnsZone.outputs.name]) : [] + +output azure_storage_account string = storage.outputs.name +output azure_storage_account_blob_url string = storage.outputs.primaryEndpoints.blob + +output azure_workload_identity_client_id string = workloadIdentity.outputs.clientId +output azure_workload_identity_principal_id string = workloadIdentity.outputs.principalId +output azure_workload_identity_name string = workloadIdentity.outputs.name From 871b192e02695b0cfedd66a767359cd44df6d818 Mon Sep 17 00:00:00 2001 From: Josh Bradley Date: Fri, 31 Jan 2025 00:10:38 -0500 Subject: [PATCH 22/28] fix synthetic dataset after merge with main --- .../output/create_final_communities.parquet | Bin 23204 -> 24220 bytes .../create_final_community_reports.parquet | Bin 125900 -> 142098 bytes .../output/create_final_covariates.parquet | Bin 57679 -> 61941 bytes .../output/create_final_documents.parquet | Bin 80543 -> 80495 bytes .../output/create_final_entities.parquet | Bin 23273 -> 22171 bytes .../output/create_final_nodes.parquet | Bin 12050 -> 11802 bytes .../output/create_final_relationships.parquet | Bin 37336 -> 37740 bytes .../output/create_final_text_units.parquet | Bin 103757 -> 104890 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/backend/tests/data/synthetic-dataset/output/create_final_communities.parquet b/backend/tests/data/synthetic-dataset/output/create_final_communities.parquet index 006e7d2441f5dc36bb44bdf6a647532ca43d31f8..a53af77184edccb114a870c012afcca52bd35758 100644 GIT binary patch literal 24220 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 b1>)1+qD0q!n#$2X{I7EIhDv3uxzqoDR$#%5 literal 23204 zcmeI44{#mFec#_B0TCdLdoOO!WN!LZIX$kNbwKnubY?aPcVKP6gj(u&_sw9v`6n^XpC3#++TQ7-I;iZWzv~T@5401O;9Y#iL z6?=t96yxTK=|utGFxnPr5eX^XeI_;{Pfg)zrFmYK@H{1y7f2nYLM1^QC*^W=A@h(K zB}p8!NMSvl`MKvy8>l!A9tV7Dhn9G6DAU@ zw_qJ{AUw8{L;)fp>d)!AqQ|s<%+Z0u9Y2VbfYBKLw z)!E;9s@D0Fwf+ya^|!p%GubqN#aB93Rd{LVpGt-IA6wP&Th%Kb;OT0mvc6iWu5YQV z;&(N_P5d_Vdkep7_-*00mEX1euH(0j-}U^~_`Q|i_Vq1;xAAEAgHI`cZkBLY%ato# zElamlIxF=RKIQ7GOYeQRcXu=`N$<9adwDe)&IHM`rqH) z{auXu|C^*f_quD6YR!&JPamI|oI6>n+oFVitF!-$8^31>jdg4r?O0pJl6vJ^>#I%G zN^7;Us&&n_%Ic+kZeIEqmDtkJf6eH+TCQB_YWddEk5h@|pYnj)wk;ae>NS+9-^E2^$O)miO7_l9e0X`Zr=+Np9We^l-KFV+5! z{7C;_bhDJ@&v8px{%K{!rTkG-#}}@e{YO_N>zKrjD~hpMs9Oo|?nSznz`ca-C2}vy zy~OS%;iV~UlOL)y`Qom2zT;k`dkNf2=w2fCqTEaDUXq)=fvVKkT^l;>y6%l&R^P_{ z-*nA;HqTAYP1!|_Zti^l>i)0y^#9Epod><{aW_4CMZvrfcl@t#wBxs{ZTVbfiVdoG68Bi=oES;RmO`m;k#(gzp=Y7i2~)b4ll_pILI(=nnc=@snlVSMtQIp zsWm`?^#Mf){j7r*Es5x90=Cj|RK!tpeINk0C?C8hm0!KQQwiWu!J4d4VGhbut@8_3 zsW{1X;sMnN=&E1^$jr-95Q0!5m$LctLLO&QDvPwz1Y{6`=u9Z3Cxfhz(g$k!&GpNp zX_4AA36#eZ*##RjBdu6#kjBg`3{_qNrXt`uA_ceT=k|@-L8&^k>_635l%o4`{e8*OO&sQO$&qR?$&1dQ<*+J~b4tDmO>&{RO zBVyBdpgT?jm0LfxvkOX-B%~UtMW}xm`&e^?!o{hL18rDRG<53nr*I=8i?9-O3sZ@5 z-z7i3M}m~3q1OCYEvwIQBmga5&DO;bC zM0m3BGwbIjiHkDVQ+W|2d2GDGX1E004FXAH&(HHbWeFx*OfFJm5J(YuF;0R#7Xhxw zJst^=OC+Q}L(dKfEFvo``T`-QHE)wElw1ukH!^vc5Y@Gt7h z#CZ^eWPoYk#9)En3M|nkLAkl`T*A_e$XR-s!WweE#9EU} zA9XDHwmHFtIu6KZix3k}GbRrMK=8Wo$L(1_4C*_V`0ThqZBPJ%v@UEJG&pAGXHA55 z1s1osAWfl3boqW9I7WgkN(098(LMGwf(B{6G>`>(92??B8mY#q;UM*NL|_Fn2=<$h zn)aQpvz0ne*~7p#UKrKHn*`V7k>N)UQbblYkBug#NNf?Z8y1O&L`5&{*)rhcAN+{4 zHn4u9rRQ{4SYS}rf9BG#B@CgwUIJ4htdNmNn&$_Jjv+=Q(KT3-P+T~jI9d5VkqYD? zEH||q8-%vj+0vayr1<3MXXg`KzQP9<43(z2uFhY6hs(=JrWr4Q0SaYFe~@fvD&+RS zW`0mQV1Xl3q~xA*Ru*P>_SDaO?!#OHoD4qDIm}#yK@c;L$dU`^hGP~0>4V!(U>lgF z!adY2aWaW@;7R+`EjxpJiH}KSprRDu^yY1qxaXFQDNItJQBcEZCXR3*VUGQwib3+s z89_kRtVVl8jPS+&Cl?av0s*y>sThVP7S+pjKf!e2N4y}^=PUZf@xh3_R)iY|#0;!S zwZ1WdkP&{*A6I0fWt8{mpAi43!tf!PzsQ;YN!f7-Ne@W{K~| zeW$mfFFAn?*cdC|Vc_?C5$?u|@%tEaZUTR(SP zDaZsRFh-({#o5Xz+J&DXBEX{HSbam-v$KOt&d*UFk1a)`tbTeBmIuJ&t0cj}MFQlI zM8q8;7dA>b!x&Bvng|Po%hP-=q9ht>87&}kguunxj36AwAtu`Ri6`IH6+}4oLJf_# z6G94Gd(+ycG^~BBb(A5PI)2iJl(CR~IKq(^_7OU9rLc)P*F%B%nLH1wXSz`)NJA_g zbO0-r16m2r23MY1fu8dn5S9&0Z2cha>l%!uN;88$k2UHY7Pa#&gau6ii&Cq#ASU)r zEJ!6%O)T_4pbUry05F2Q3g{n03^OKczT6!bDN)8|J=?|^FahLgb`AWXLU_U~iPcjJ zZIDWS!&bcN?=*SglOGsNB_I>k#z9F8*9?gTVrCI!ux?rEu%{));P0>qtbr|z0$ViC zZ!|WQk*w`#c__)5lYv^(0j|-)kO9)4-z)|KnDj*LL^2LsAUQ*!JMFhDB7=#98 zc}0LpQBK#S^DL@fI=A9I%1oserh|&x+3p@>= z#DF<*TKjBkS59~%KR`&c(lM+1>!}ut06C^0)9R5q^nNNcE z7ppq{YSlo;$5&m?sjZ+v&a=3fvZO>BPVMiG`UQUEx2u=`%_jbBe&vvjzVYuqajPR7KE7)8nm3<1_0YC@S8d^^%!P^M4W}3K?az(h`SkmX zKm5!2x1KpYvGXmzc+a!{{P4xYzyGd}Jw3JSU;X*axnG|74`2D~e{%lJ?C`+rf9}#p zj(%q9u3vlM*||NxdFWq{fBL`Q_Ve!)o7Vqm_0Q||57n~0lgZ$(-S%95*V(;iP7hx^ ze8K$ors?}X@#5U`zxoyXAHVv(i*Neivr~6|VC19!rxos@|F0gnnzANqp(tQspsJ2F zO-&w~TVto}^dfEX@l~C_I@ozW?LT+0|2KLUdBE3BdMoC==ik}!_4`LVo?TVuy=U$$ z^IkzHS43h=7&`{$!(uz6qGIj%ZVi2(x=bpMQcMblA6sxJxFqq(mLrf@;R~H9OWylc zU_PKY%DtE*iC_YVgtPZiN)n(HYmQ`@z~MD@0;x{mb`B|~6p?@xT>hBrBDan%cEJQX zS3{daN&97XKnAIOVo)Jnl>vG`OUvis;qoNT$uD!9GFcElM-pEAoGjHRlP3Eq(L50) zglhL>=wL{cvW~1^%>_;eAQMNX1kFZExOQBm4ICKGCFoaDn$TAnNxi^n`x)w;{$k-gio&g*1v4p!gOmQH1+Dzs}uA1jBe^_QR zNbwXNGvqd~6M%!XN)X}L4bl~1-5O*@nx$X>asr)0!Oj7>z#bQQZtxG0DrFKV3p1dA zNmw>A31BUl7fDB&QC~?&y34>0m`X@971^_52MDSJ2CyJ|=9Iuv(dgT@j||B%>WX{` z93Lu8*&+0MhI(VNJhC=YZt_Qn5|IS1G{8_yhLvhiQZ`>TYaD(ocW)c!3Q=c@~m6;e%ktU@k zDX7N5ZU_<_W&6H3KsKae>L>_4)P2K^>GkqO~bpY6>vT!~9qOwaG^0|}Fa z2%kDyNR-z;MyrzQSd*2F&&*O94I+>*^b{ll89J$P$gZXu^hla(6=K2Gsh3gI3)wH6 z7#v-o3rb&+tJd{>aRK)Sa;9#UQ}1&w2SHhGjVbQ=N@KqEsicm4NIKYKKWMx>3VVhX zB8~t{hbbWA3i`Tw0~j?3GnA<3$Hz!1afYdmJ?x~wNl?WshD1AFK8|`+9$_MQ8;2Yc z@InTC7J=0x6A!h#6EKBeWJR`2G=Mxv0I$>dgD#n6zRu)O%f1NYZ;f&o9}NwCs5^}A z!nSS+35f@ZTk8wB5*`f7RTgUs4IT+lPVE=0h@#@fNDCHVIAcnoa0@>Eg(T0pany=^ z0L1{Ct!Tcq5v9Q{^jjYil1If1j5mle1_NmT4-yLoghL<(A?d;)@d5xtQI`~+WQV(b z7(v0y{l){3RFuQ3wN!+7ZBUO`}kL=#@tcY4%u6UKRU0xvig^lU>CTZ*1C z1N(Xg>`t7+e#sYrvQUY6PP!7Cp%(~51&IKK& zR_)6zO(NvgF|uT8hD6vxf?+GZj^GjrRd7ro-XteBr#SP><=L?$SO-rn)baKV2P0$T z*~`NQtJ0D&i6Owv48Z?f9eYYk;tD*&jUgNZgbJ|ThY@xFJ0K&UAI9(@sT~Z!<1rqp zQ2W`IHariGxD9dHi>I4pbhg%(QOv&Zr(KvYu0S=SUa~`s97Z_oJ0}83nI6sZR8r(G zKD!f7Q2?%O6u{>uAxb}Vs+T4LVlfP@s9kKqjidi`VG#FlepK}76-Zjgs(;oEpkmco zQ61X}?f{g~n2{*VQv&(>&MibplI-2br8@4Cu^l7k$TRZwn6*WwZ(BVoB8BIG#VYjd zaOS!#0>?Ru6dfbZsL3zWU*S{V05ajuY-iFs2-8RPA&VnQAdot?Z`%No(4b4)Bh`hj z0hc%_T#7{1&TeYT#K;TVC;?<7%s>M8Uu0c09v8@)#tt|~S9f^sjDUG2&az}=K-k_% zIiH>k6g;+JMma&C&b^cm7!+S6aPyQySQu;>JTD29jG(;wCeAJl1msp8V25or)p;O+ z-+HBg1p224-VIMsry?ztUM3iv5=*BJGtWe0jpQXv4UDTS&T zGUl{ET#5jreB!AHpBdW*vm+?tKoq7FiJ&#lRzji*%`0gD%7>f((#zd6b`;?GP=8_{ zP74-*vZVb^aPy`wT|PqqaXo9IED|u4UlmRL-kwTmbMUzA<$?o)HOETyDs-= za^XqPo$Lx52TDj{$vx@Fvja>hBhiLs(dz7_jjje0MYRvF>!!S9-YLPT6U)iz44&QT8mWh?4ia5>bC z*4IZ1%2dRENH8=+<3s^6wXe2pwvd7W&13SJ`3001o0o z^Vk4%IdKO~^mFmz-|i$W0J=)(CQ=Po`^h^mt*!WHKeG{V3DNiDL*3L#n7E2J^sV1W zu0xjE`PtTXVy_Krv+EzSxnq}nawr4Xq6;elkAel`k(aw85@QXsRr_eI4V#P`r-%{o zILHN9iswrD&h^qH1}{ZbP}DxZ4q6A#Q&un|i(51XlpOR;5V(n!D7UB2dSjtWwy;VH zgaxTEa*~Pc9Byfc$_#9+acf&h$J>{l9i(SXV91nTjLq4wXX*FUPjT{D}npXkD|lUYS?KDXdgUSp+@x-3N1QCA94mgC+nTk)yfa0^4hACJe#**iOKn#pui03YG50w$JH6X`^v9+5? zOekv6>$lnXl&*VJI*VpMw{pQP;tMvAQZLObMz-vGhN6wV6Vt zJ%8OKiWeUk=3-*N4B%i`7D`djMZ>k*Z)+=P$GGsyIN=s93>=HFWbBF(QB0;W^m02) zfFIO$-P)9-J&dy9-DoSImPy@FfPaD1F$tqa>O3EsjrvK+L!g&F^_-M3l62_Q z#yCJ#@)zG-k+sUkQCA0c%<*B;il5`dUl1n?In>-vWL92d29EC0Skn%76QVnJ2!nq1yV%Z+yOF(9f-2 z-I7+St5!EP-?FBqb?v&g^|f2uZ`*MD#*WU{b!~e69o;|jhBt2R+482|zWyJrzxgdc zHsIa4Rp4LAs9*%|`tiYk^wyu)*4Vyd=g_X*!y|j%HhT9x_m17S_wD=c-+y5I;GuWC z^MQ9g_z-ykO-~O`Odft@YI^3#?7NR1n>+sKiTRU{J^qj1^G}{Q_2f^!_otqE-#=aW z>7V&$@BhHh{@m%G|KKmQw64GP_Kw%TaZB6AwVU45+y1&A>Fck*Wnil>-|XF)q;LHR z#@sdhwtL@x@PP+|o%h}Uj(qq2cRn;VGduU_6YqWB^t*rZ$cg#K-}6&XA%jZ))6ZA0 z(emv_?UbIIJTh}^VsdsRa{k=v&gV_%H{a3!Z-1}a|H}_8vh%Oq?yShppWE8;@3)T9 zr|fzUzwo-R{b9=~CJu{6u(tHa(8(fPnTk9HgGQlAk_nuo`EZwM1i3{p#`NTh-2zYc~06#c!fG4Z!Z$M6rio}=%flbIEX7vA`1OM6`ERB29X@NIYB!Z=p;|SbH*uZ!JSfGV(SrlSK<9@K&!?D2N`;ng z9dertF1IjlY_PV0i6B^#y;5|i?ghGpQi8(pQ{(1<3xNs;LE+Q%MMS}k*oY_52S@Tvuwyx}7qQk6`GTZVhAf(N(T8!TbU{3! z8G~LPd?V-x$Ov{!-Is45f+3Rpo5&;iJr2nh+bXdq&cLygm0Ly?idPB{d?gs3y?<^X-g z(x|Iis;331Jm(cyxC}wruvIXKw67Jc6PkfKF_ej*;!JG1;sJ1Y`AX4)h?+Gl$vD7BO;&~H4?%X?Iw~29C#)WB_$mwQpha4 zH75pum5`K*8&awsRBPQFP;;sV_*&N_$1G`2i>YYSa|TsQ1)d(Dh%N|L4*r2u;CKo3 zOZo=TVU7fl7PHr`=}(g7Qx$+*KxH`z0-pw|vj{j-d=s9WUII;6#`tK_B32MFMd9Ya zEU_k+2G9Tl0*c*f296alTdb98DxjZ zLQ!dI5fmFl=H@_+s-WSFvXEm2U`1hiGoUSMhCCzEK36dLbWCV;G0{3=2UyoO_Yi}3QvM=qjQ|4anb_0CZ!w{Tq-S4uHc0~ zw36MYNt2AvsUsb-G#L`C3JisY3S1}Mi$);;h!hgu3_1qRtiYl`J2X0yY4WYI22b)9 zmC|R?xJ3>_K^QnCNnyJI(3JnE^f@_DAwu0KO$pbXf#ZgJ!%~4B05IaT+b5n7_&AGP z(wqrtOv4lHqttKMV&^0A4!B+kPwJXd-K=oD^j^?hz-gS!C5co@Vq76BW%;xmIbM*{ zLe_V4KzJyJuOzz`2+WTb2htMMfL0IaAL@`$BuqRvh!=;3s*nvc?<_YK8^8@I^aRK0 z2u-Bq`ednrLagSNYA|ie^a1$vrGVz}?No4RU&gIKm(wfZ<^a1Iu$6=vbc(VPWh8<_ zf)ZM&aVUzIUMW~odVe8$aD4<6oM%ioj`KH_ z=(q+p6-nc3GuOck;m7i+ixB4(Xdre~KAa0sJEyzb%>kAHh8uHWKb#QY;GEMg$Y?lZ z1yCSc%!$d6W#9u41}q6RBrS0;_&R(pJs80}0+?_l7KQ;CfcNKSNJ;Otq*I+x*dJ&_LlWiBUe}_eQ*j5L3MEnhz?H%6+^QdPLK97G}{#@ zXv2Wng%zbTzZf}5!N3aayulS2`~ciCGeYPVQ~|tmWl1XO)Qjj>!15t^r9$0^g_7=R zVmBg#{~}k9D4pQB2*kh*xLE)I-YbI5Q;3BEBb==Q{(wzHfIl+9qNk(~f~le6;6Jqrs$8JIF!h|CK5eG_u2D6*85v0~SvhrbGOlSFJ8KoZ|}uhDg?`om5-*qsM2zsnslbRA!-U)oY#^Zc(wZ>ToE)bDz} zK2=@ad_o zwX0p%{ms`}H!mHT>#y{G_#4-DtLv6odvx;1;$hm4R6Bp8+W+f+Q|*80ugi_O?in{c zZ^f+pe6?eKw4;J9ZkGle(-kj^J~XU7vC?P$y|K1c&Ksld5b6amL3_c>bkBi5;eJH)E%^p zn!3ssNq2VH&EZO`xH(*w@l9DcK*Ta$kg%anPXe-+Wd~kw>-jU{I%t%o_W}A z8Q8pKMo(Klm^nT*#k*s3`sf^QMfvxUS^o6X@^4%I{hkMSv-rRV%ct9==id03V$x3K z58n9M;=CT5J2~sd+X6bxj^v9|I6ggl^6G^n=CIA?+|;J+9Mr;`=Jv<8*coo0oO#%N z_x^pmykyIJuA9t_v)D43yYJsHi>1%Lr&%~5y=Q>QEUj$Ivj2(4@?lrJ<)&Fo&djN> z+>F0l63gar^?#4CeC!)8y_RDx{{JeL4|whK?`*WI3%_owmo2dTA4)7A>*~kf*-$I0 z)v~e5|0~1tv95l6(^%h~5-%I=+JTzoL*97prg7czn|CY?{($@L%>RSp+*~(YK8Ka= z_~rI+Ua zEi`xJXz4tsCe2ZO^rZ8hvnTb@qeo7-p&zwJk5M;vpZd|A;!e2*=eA{O=<6=ZJLR3h zmiJV;+8TTJ-h1G##r&%4{HCq$CwzEMqtUpJU-$F2Mk8!&f4H%$(RjGA7AkFL($Uvsm1rZ(($*uXDp31mCl;!y;FAg{>R)n2ZCdh zW_s7$p||th-TZGO}e69eW- zSLHOHj_z=CzivGC^56k_o~HM^dne8A{l%3z9Gae*GQ0N{S7p6p&k@F)FjMKtLkD&} za`3>OV~6&qvxgSPJHc}vIXHgL^)j3_Gxy1R7O%f1^JV>WW}Lkn-y6M}442)r(*C2* z`Obr4NmqR{zCF5L)<*7m_n`y#EM51f^4+W#d0y44VR39^_&Pn@vFF6W@jX+lx73#v zWOu{$mG&21689Wl(zoUMc)cvYqrGJ><)H&7UTr?d4vin0GC#n*%Xd!+vt(~8$VafJ z$Ch+^C0+8(^weP^_g?WYuf?9RUwdb$1J z90;!XmHqi^s9V_EJice@Q8RPT5k0>B+s+qTK8CK&a_s0ay?g4!4{_e&(D;NHcQP5@ z`)%h;|5cdpqCsGKO8gM#d*aae9_04wHhlf{m2CL?;iEG-rIzesS&SQ*xo6f+FUGKy z=JUP!l%+WA{5`$DBTKPwe)b@-KAU-@j7!8#{@(LwzGxc~89k;Cq{qv+czDPkJ={2c z_v9X84;bKTTst(CF?UYrmCv|)GCVnY`0mMK5!pD5(ztRje~!BM?{@HHS7Qf%9&|7z zaL` zT<^~9<${j5Ym4(OpK|RX!^A8wg4?f5PRwSzi08w1myg;v7K1mx%khWZ_&;{!rt!=1 zt{cCUUx`!JJauN8HDRX7N+O@ zqH&)N$`U@-QQT0?5@A-`);Y*uf+aF zW6w?BAG!JaSMa(U%>6i3-cH=}=bUfJhuwShkso(;Q9pMiOYg7f_c3?rI{hrQR zp$KTvDyXQ4sGz7-Q9(gK0f!@66%`eSqo_C+L9L3%c?RD*1&`-E=bZ0(zw3Lyf8Oii z>P~60hqdl?55N0&-z!tSt#%!y+pW~CRZiAfb%;Ue#;mWd;SoYo(B<(3Ja&h(((bee zBwx_uaygxD$>Xql9HKjYj!&#~R|Lfhx2rPX3^;;S_DYA(X%E7m0hixdnLbAh_(XeU zRYlNmcRT%3u&P3GID&p>l`BwTuXOv;=eWy*RZe@kvt0BCoW6kHSLt(jT)v>+SMIVq ztNc6;FL$_|o=QisvZBJ_EUzf9a>5w=c9+8$ta7-jg80FePPPly2g$pm3 z6Yy6!C7<0_84!JLNvv?V%f)iP9TzQ^;BRMDz$N;sd`@S;2VCVYS@^5*k~>)CD|d)a$pJGAIIBR`e!FP* zS2|qIK&2xs7LQmZ+MVTYhYO||fKRK+Jr$k+$jKRSJ48QB$m#R=-2pKWbX5ABK8L%i z(&2Zz9R7+5XJydm6lFyn0S^eOs>)sA48mBde6Gr%6m*J}{&F!GkQc2CIxC$Xr`_Xs zI$~;y((eA1gD@Dl}fK$pn?x4pl!YYFBot2;$m7={ustCF(s>1fq4h zsyyy;kKHAT0jImdU*-0cJA4(At4gY>D0j2&(x<~~Px zC2m*_awzwURnAI(pu*`0`aD4iPKMR<`TTGn)9#f4ha+GQl)F7HNpy;CkH-^mR|U%} z#d0YafJN3JolWPkf<>rxS-PwOH!9)(J2C0`|89P;qIq*N;MIy{L-@7c%RMFA4{f=i z{Q1Ta$b20s&?)m>C`+BM&j>5h3wIcXjF z*LUGG&A78xmN^75jqfz<-5JR=zdrQOd1iHpaVeTSJIM_8(hT#1ocX1EnB>3S?ms-_ z->O8p&NdnRMLLS=sSKFpX#9shpZg8dD$w!&IITa740!Cs|nPl){5kI*!>B*nGUud}AR@>0fV^p3=X*i~jAD02(}$H5u0895k3&3HqX9udQQb0{22it#Rf`qGpb;Kd|AAr+LRkQxs$Lo$7X3?NsU+VR?UWM9P@Ak9IXY(`8Xh6P1x=U#sBaD>5^y`bUzM%p zr^clYQT~$baaELu5%P7>WV}m=6l(K-mD!w=q%M9c3^x{yN@3fY^+;EPs^#t0Qg~KF z+M$4D$fnA7345L4u;fpVf6!k1vQwzU6_E?tP@5F>OR}m7<70_P$e*5IA{I}EQW5u> zE79n>v7w{t%aI$AhLy zaoH&S3=lfp)U@4WS0;ubH0uUb^rx`@t5bEOlJftJb^81Ir58+J@(=P(uhM_K0SM$D z95G$qp!xW=JJ}^)YHr|>d57iCP$o-;l3{63Ek7je7qt2MV)H>h9nSv$9NoWF z$&i%bLs5S?6$nM!_~~MVZw+;VYFl}4SX$0EOL4yxw+`AuQ!E}3qkMzdB_(WpdO(S# z`22=Y0`Al%wn+iF5g(BJu>hW|7Sk4?c~I{^Yb3G;eN^lWwTVewgda}NqyugrO5!W1 zSWu>=CZzCgtq<1L#^Yb;xD=Lqi`qjSFvCbJ+9oUElM)OqB1L>Al|?Zj6o)tb?a`1Q z?9?xIh&~|)FK~jpWqauB}WHF zjixn||H<+}M(rVgyP(0xco-8*Fc^!=h_)k^1exIr0{`R{c%PJ9CV}~pB2l*HR^$9O%8;VZNvIGnB(_9#lIcHki1=Bv!WnRJ^P1c?+cvhT2kK&&^N6a~JGKJU&5Bh})X-a7h@@2QLL-j!8VKW?zQI)VPZW z%LhafO0)~L!X@f>qC@g~r$nx9e5dgq?_ND0N+zUm&~$;8Zx6M#mwB(|t$ZvJipEk2 zdvi$_Xe78;F%U>JujfJVaCtN#$sSJSp{|H-?tSvG>cXOA7c2_6)lg@s76epxpX}+X zP!N_hngj&_Pwa~cv#D5g>DZc4nX-3rqj-;S0S|ZW6v24~A}`=)3!<@btgXv->YFby z&4d4b3C}~xF(06a{R3elvdS;%-tInug|#I!#IA5G&X13$R+!3aKE@U!l~~$(E2R!~ zv`cYZzu|Ti5Z?yp-tsvX6EsADvascI)fTVGBWl6>hJ2}YC)drl^1gUX3`lXlO$-aO z)qXxI#)XSfr=@?hrXeaVgOLw<)DDO}flymS^`!eJO4t-pt2R){t~y^y7~}<_0mTXn zd%Sj(=&7OGLjJlhC@J1sZ5knbq8)VFsor7ER6G<*fHSx9fq1A>&{4_u1&g~6YL|)e zfUUFkYuuuhA@8yeG@@nDBG2ecK}-UYHj(pjXO?c9tn#fho1RqI-lOZr{J}h?i?Nr8syrkPDyHpM6 zwj=2+EPGeJm$H3Ry8`c;D|@WPu_UvpNmd)daTQ$?&%|G&*h!!2+ZGiqRv>Zb9Pirb zBw1Nj%?DKf)8)aKKb3$P#iD#F>V20^iqW1t;fNYkx+5mfp^~x4NBRhuH#j1^jRq5t zUAFX*o}rWjWcn5n0RLLRKcI2<6cbM@+{{0Jwyr0Wj}Cs^>V0_Z3l6 zN8`g}jB=YAiSv%5?v?8w#=nu@v$0FKf!#)Lua+&Yz7cO)3nJ4UAe{-^^20kl2ACDfH%Y8zRd%V;-@y;YdEAVyREcLh1OlW8iRgIB+H`p)r`l))6xk9M~>zdj7Yva>O2zC-Pl_*aPNnvAL&jpen{kQP?18Vx5hM{ys40Bm<>6? zgGzAz31Lq2y;vd>?I9%*F%%8P#fZemO~-jj^tbaJ zV60v%5@+7spXfVZ@Y=@F-_NF2WPI7A=`UbTtF#cxS4aWK@5v^Oo==L2B~oBpiTCh( zJB4z_sKL8>8|wc`;o+i@ds4%LJB`L*(M0d#zc;hM3?9r@KOG{Isj^2sAn@i;y2^)9_^np-nb11Dps;)L-QH5f&Ip+g{aeb8~HJZ3WwP? z6+2Qzb}`Hks^)2`lPF2%$eHt0hkw#EID(iSFNM8F^ng{o;c$o%iT8e?8;xi86MY>- z%ZM*Lb2JZ$0QeSAfYK<9MAc~a(zHn=#g4wKXaGO%Nm#YTav`#wWRXPPSEt5G@=Z%YM!nGrhmgRG^2b3jVCa`yqLskW7Y5(V--JBv-l@Ny4|3t!d3(EM(dI zn7u7`X&nmTFQ*~PLeynD4k=HYlJ)|Qc;6n~=+q4Zo#tGS$c`GLB(2U-NIy(}*3MJrHk+3unyRX!b zL*6=Y10X5C6za_HXZo|j4MjBg5^@1yF{AX0iKJ$?R^o&4Sj70b&hlD+WokK_At(8{ z>&Gu9Sa`Yi10=t7`z$OlJ&fZL)O0kX|2wit%}vqQ=VqDjkZ%*!NpXo36$I?_-Hrs= z+~MmVrNroaF7_#1;pv_$WV673QMDr3tEXm*%xVbLF?Nc+dzE}|^(R15lkK^5A`;_v z=Wsg}_8G#v_~XdO;EqLrFDc2ob1%D90Z2HtO9>fkr0+wb&ju_)PHJp#=?&A>uso}$ z)3)c)Xc2&IM_EGh$0b*~V63Kl^fe^ovy-`_u0gbAn_oTs_=ia5l-ufRg!)d#l zL65f&FWZK%a^En-`wO{}(5Xa1zO@M4VWJ}hX4xfvL8T(=R^eiGqATKyu~*8)U3I4) z?k|GWn~(YZsdyakR05joBsb>?S*0nB8rCZjGoMz?yb>J55^2vwG=bxCs4lB}tPHgn zUePtK-I>x3W|CpDQt7Qm;p$eEkcryJ`PtmT>@w7RA7vYN?QofGdIqyW@%7haRu1`E zD_la2m%M+QHrn(xN;)n;Gri0l<(g3$LJo=)&coAfVA_ySgpx5!805`twu5L3~UbigW-lW-g*RPSM=P6lqH!+NZ#g#3kFv)z@am zKS%aF&~NwpA>TN3rD~?p8XT)*SJRA5jRKrAPj;o`MgHi0`rr-Rp{?LCrUf5n=mfxV zJ4zZ|g|5d@lDSnL`Gli#kjP%Bt6!z7by0W$(a?B`5`c3`_MEU1Vj@|tw;ki=UJ<(0 z*iO5@DzrV9V?HiNV#{&{mUWT3AO(231ArZ|kx&POC#GJ7qUIkN?Xp;WiS5zaWtoRX z$2WzcPH~UyHT=9UEMvc>XXUC4%?$eyX&j2I#-9ldiJ$pAMm)&Q%Ij`47Sc4Nbw6Kg zvLfkZ6mQJG%QC68C{z3k3XoAMb0006NM6b@CET;K!6ENfZC}NjIB~a;QWG_a+>n2< z&6Y(zrOh9zY|pAtr273FE~tW)W}`IsGQ7c^(2y@wp*kcPPH4~t-+YsK=FOas-^`J2 zY(9PF)g1V_<<*?I0pqPo?xq~}8^&>6jy#ufD$1VWHsx6Q3_s>H-$_;}Ax|*JbL#st z%xh@|(WP>3o>hjd)0){4Y7&SQ5a|8RwDGp+) z!R!CiApe*S04~Vs(nBA_TxZ9ge#{@^|Kr3o2utuFEkI#uN+msq*x)115>|tRg#LMI z23-3e$(KL5EqKs>@y=-uE$yA7gO{g8c$T?=2l0Qp>T`U<;N(F{=jNWy<_8xSVjE-< zX%1p=Xj5U$|1GPTUX^qLm?jM2_t|wn%gUtn z1VBY%fP6qNfD(X<2WN4PPy|xqET1$;_oT%K4C+~$;~Yhl9?jp={6V%Utt;s~1j5MK z!TlLY(sN8jKmzHjsM64w}`NMKu<_#HR#;gXQNU&GdP=mr1fWzFB%+j zS_EwX*3&{utK7NypHq3;KNFJwrMC9s1%DEfLlUV7vof`0z0bfarx&^^o{WP!SWZ^;n(hX^4Cm z6!6-Esj%z>%n48upd-KP7R@o=UAV-`4>AMk0H)fUe@K^-op+Y?lpjT1CPP8jAkD&y zx_9+yC!bW>G02Bi(CV8md70Y(Z;P(yaadl68w?gk96sb!Hz@zs>%m${U|RMd|b;nnNk z7Cx3od&jMds|q%+x4(v39Y0cZiNkI`X1hX$ic?=bHaB!Y+(juAwlaiw(;$D-Wqs84 z(W>s~EmR~XR@mAReunbL*7V6xSKW_k{Sc3p`Kv&e2Ij;~RS}RHswoxbQ1Z3P1Ha)nZVB!U|SH-rE+(7x!;ye8aS7-f66@sI>AG zo@tnxnW*bS$-?bW|8V?((Tu{O;(fN6GAb7Ct#n^N;elo^{sKw56SmvX+}SQW4JA%t zvlB2n;ASxL6f^}`%O)z@frz_)B5twbBPZ}?Fv`cZVDC_j>0N~a%}M!=t}3w?NqA-5 zt7Gsv$n1~Bh4)C3_9kd>gu*R)DcTu|$D-ZOyLRXYD|TX%DUc(+r+@}O>>f?g?P4dc zDS#SiDBTlu?0fqY4_~8n*e%wY7c)ICJiMj=@HEsKV{v($d52bm;)EsJ;Ro1^qYHd4pS%>7TJ#P)~mB9iLgql9hb8v5}2z+2&H2@ERD zK&Jr-^ML{wyuq58(47XtA|zso(6&}tr!rk-=|3fGmT%C5e4$rCG`%9+%XcKY{GdIt zHb$oCUJexn;kWHQhVk?%Pjyg++`U2SGn(9zjT*_Y!8+gBJ`MH-8mG$tsTx~zb2b&1 zxXm;r#*JIEn;Mb+Tzb{J0q>=JBH1Q?bvzBFTrNZISb{cvq#o?S5=!w^P=!sWM&A3i zXFDH=M^3(>Oa91cpm1CNWj2yFd>wg$Ue*p}TV|xn(z$3sU`XD7wV;loBkIA6P4VMs8C=Z6uLuYm*X(CZ!8DvbxYa z$Zvcl8&6^=B2Mgkjf*Ji-bNw0ll-Jq#!}(H+=+T{ap}UZ*o@lhu0LBK5}1N?VwNrt z5ne^b;)Mxql5Y#gd_s@#0C@1Fw#{!+m9F|XsS-zp$I3gLRh9(`0xVN2xg02%pd*~o zw1GxExq>zgX+4N3s7CG}>TG42(Cv+gCGLAOnucXqjKKEnRY_Jl7>bes(sR8-FSpo{ z&nyry(j#sP!e51isi;U!WXqaB$3tx)ra>igmakH;tD`*7Z{#!)E-eUvyNW~Md0@6W zD1p0WHWGFStpwICY#avca?o9#DSyg#hRhu2IEcE3sA5WD*$ zG&@J_eWd#vDlRgyY**1E#WLv;`OS?vO0Z#x+#^T9ZHFB@uy>7S5x&h(tDzJAkoRy2 z6uGTDxD}Yi9`qgYkhn*4GP-`E+~rL_Wv0G`W(MH%nJMy~O^atM8_m91S@;NUpdnEp zb8@_){Kt>B!NQu>&nv^iqTami^ZLr!V`?y&Lp#fT5?HDq9DE=If`2=QolLmDDZNX{ z-LxK9g25`#5RDQ7KwGbyaVu!ZJ$kQY=Bt@Y>Ck{fV_uT84{6;hjqF|&uen7@-ltDu%LmLph8e=(1Ualh(Vlf+!j}1eHa*~BJ#*`_ zpkk%@eBCndeC|P&_H4(4cMlSoT!PBT!Q4Mv9;WRi0~+nwj)%H3d{Td|J5_k-BuJ1G!lzTmblR zu+>3~F^}u;vnWa$vr!kjPhQHW3r{Af!N_y$R~4JB+pW7+qu zuVUFV;#<;^I;c89ah<%aT-P+~o($HLmmWekKJ(c1lq+7;SsHQko>Uu-rsBc~pxUm?I2Ikcm3kFQ$AXu~aTMRX6$XB}0e@z{<3T zBD^RY&(gZ?N6Jtr{O zjij_+TNBJ7ZE9t@GP|J0@Oqwn=hD)$48smBN^FvYN0e^GAMDv;KBU737@M{X}PU#z!1j;L^3w-L3I7QO9690`=Z3c4GzfDgCe_i2%qsq!V z%i*wF`6|cE+kn5meW+srW;NO5c-}lJYrxr34USHeUwzC)Eo&$D(?X8a0BDrCip4K` z%J65QcbJb=Q2o+;&g@qs8~d&TDzJwi#^b?#30cV3`q5^kdb!x%54w{K}pAou8ea)Kr&6lA$BG7b9SQRlXS>L2N)cbJBQ3rGU&mn@J5 zY`wB>V_-h4v5<$U*Jb?@+;%3g7VF2QsT4olA#9!F7K%pQh`FXHYIDyuSA^ zv;l<;V>lEuUqfsfxgh_?t|zxmUR{WozC6ko;~pBu)FC$~)@l{#V+n76X=dxo18_#KpDM&#Sp(DFsSF$1qMt|U~ri|7^j5)@=|^O|RU z|CM{kFlGjAT)@g_GpC0MYuzg;L$lnpIDaQ8(bK7T2RTJ!r{VlU#;q@V#8$@~o0IO% z>I^X#D9QZ_=7bXO7oIy}>-#_nX3-Y<)lp@HiT^STi6{ATJDGOEBmr&+$ zGQo=8C z_vho+@c#VzvO@X!Y0L4A;>Iv6HMD;mvWj<5ouQsq2w3q>DHIkzv5YW1DVFyEsE;~E zVYQ8KOeV~X()Kek8s(0oL(1s>znP9xV(9QIy4MDt;dD8DcO7~~US>n`!$r(#y5&A%7y1hYr9KJID>1 zG?T1AT6>6gkO7R1ncrt86>4;SsrM!#0WRG8yhr zo3=Qj@_OAc-Oni5*GAS2_ugW8fm)g(aZ($j*AEje>+YNYQ)czimSr}@@`Tx zyjN#*E3ltDAU8f)(EkEBVSO<^04-i(g2I=Qn?fc&?g{yl+m)-A^&9O};CbG^QBU*Gj5c6d{Fj z9JhS1rVirVwUrs*u_lqL)c9f53$z&V!D6YcP{2x%i%S6HJYi&SF7y-^06q^Sq@)#m z>z)Df7de?)cxXv!GDrCEkoC};wgEFrZEdMJ%sS@dx;s&qvE8(8r@K_pgWE{PKwejy z=s+mUUT2U$1Whj~Zx~tKN7Oa3A=_W1{joOkYd(2VYdD%?&Qvn`5p0nX*<`<>;=WEw zY~$hzKu(YG#uqileHtcZRDj9JW#gr!M~+fbw`?&N(c+O^P22b3b=s)Z7E6X?Bb%PdI=ZLELy^)P zPW=DSLkPHK@5^fKv~) zIFdG{VTeNDE#b|dy0{h=1wV{{O8r*^%nR?DbqzySE5ua(i?W~GVeOa^<^?5^ z4*8jo#xzw}VvOe2o<^GQk@d0Hp`}4~@6J=irDZb94xbOfXJ1+Ek|9)u+wiCoP4#V8 zAs;uT)Mk_klZB-18P+{P)?!5L3(&;S?VhJ2G)$R1sD~iUTsKq?41FLJ46@60>dug~ zEaCNRNXq$6F&>f}r$tD z&9>??KG>IM(Bz}&E%(r~wo@dBwopvR2*d9qjK9$|aGbJZrN7Z?*xeCNY@1}v&1I&k zs8HKdZS`nUJsXQVh+M6Q8mibCiyQXmpoI9jZ@v7HZIosUdm(?6x&HCtD5Uwe6dl zf!zg&&hD<-&`FJtail~vM(P$`tuP$mxbE}`Eq9@&4;0X&@%0FUqlBT#&wPnpUwT`) zp=Bt>?y{p!;&uR2WxTU}>5q6&5yBoz_r@RW|Qx@<(0|l_= zW^JUgrWl$omx+nZeljJe+l$(P%VEEDP@y2ZIhW?!LgdO}Y9Kf|_`cSqlS5b8@`p%Q z0VgE8mpM};zlx0EshFR92ViN_0n6>?Bi7ANvM!a->^r19R_tBf{R;V@nBv>Z-kqxi zFh{0pfR^iUOwC|7=X0g1X$_{Qlt76^>%2ryS(Bgbmg8Fu z<`KwBjt&pjf}<6B*_oS6teZAS>NJUpEKN(=cYA;mm5B0n8nJPqY8Hx zMRml|eJ=ZL^=Bdz0MgnzaP?Dv80n`uY|$@fhC zj(q%R<96F5_ElxgbRw*qSt3($8u`+{&DBw^@+R1bS!vEznLl!KoAf~PJY7Kfx=tcn zJabk-mVJZpZt2t6n#ty+g;=m`5-%bri`mSw9&NhwnZ1)QNN@UxML}jMTv2_7DqE^q z#A(cA22FKJT$7Sc#5%hD7P{XvFw^sJ0SdF`w5deA-SpY&_3br{K-rG@Mx>k`>o+R!fxVl znQt+&_{iy8=Cxu{ZeY*kvc(#kgmA;OEH!ii)J5%=vZb1I7rlHh`-$2ZS78qB`j$zI zV-+#x%!&ZNRCh0jiD3@|$r4jKbl~{3Z@5LH@FW*v#~J=h4?Q`;lJSM<7J8;bMFg#b zWDIPEw$Uha1!LfB9?Eh(A2eU6Dm^*6`Du?8*$AuH<7Xm;f*FMejJUOQjRH50S;sx903xSb zM??FE`3v6D+Z*PF)o8qQ1U48g4qd~pRw16fROfg{V|mh6I>gvJ5?^i{QKeeD^lq@z zxY53&dTkD6uQW2*pc2eo9>i~+M_$&D{lh|CTUTio)z)JBm=!Y0ap5pwuKTGh^CdJc z5Ch(y1&#cU-s@}^afVaFfOo6r>OR6AU#HAeVQCe$+(xDGq|&pyYZ@3~ko0)HTZvgg zMptsx8t!w2<}NVOtzXzH+}{pycN;d{?U*>uvB*#>Wl}Czy_AU@UFRV$!Q*-tIW$?8 zXQTmkv^;3c>dM8BI^<>~_J4>X-gec)hof8>CoB^bJCA#L_C!u!H!2qAQynQX!pSt+ zk7kv9g%XB~Mud0`3 zb1m|@tOvT2H+>|3-~NEXsYfj)L5->q6wvo)xrvB#ZPlGEE;o!bu&!1X)bg_3r3^QiL6a8X9>@(c{NL@ zWUOkGFdlR&B}k2#qEUFO{j#nZ&0aXQ((r*&=*PA(Cz*$effD>C$I$D-9i+obwY7IX zo26;xZl!x8xS2^3Zoi%6)67aawi4u4ruQH8KeM?AuPWT+smXtNr;hxPv$d@DFPQ~S zAVpk2inKsk$Ua~}_I`^OQSF2rP%M6qGTdu$h^3(c*Fx@oz2l%FI301X3uG2!dk{WA ztYmk&4SN-~mA2BuW~d&{uKC*#;#Pob-%6KlW>)gdi$u1Hxi?#A6V_U8gwUHoRPTju zX;i3k>sq=$@R-tt zD%)O}{95-L1|+V&uD<_=USr)7!)611+%P|9=Oo(zGRSClRJNzvF*yt9^(1V0x9u6< z^WvF}^>1vf2Zny37T;;UrRb4GXPZGp2 z<|t>ly25>;wC?tkQTE$x>?Er-00M2NhWK8fuFr=BhY}2XC0lAX;wAOBB4jftOO2HR zXKfN6gEfQnZ-ptN7(~o zdJOm=(dB?kyM&Wp&OBvczI1XFP-l$fH2MfPV`5K$Sk)|BaTh<4vhqyf#O+_8WNWjN zZ5Tm59Ezkft!zX)49mm8j&5{Eaoj3@IG;J9=uz<$l23Mg%iv} z`gx_}SVS{>OJ$cjzA9&qyB*J2Nv9ez-e}K=z7aq#_qo`mGeDC+G|109Q9!tY4DO}FSE*tD%ox)PwvD6(!j? z{+kP&zIQW(W#pcrg3LTDPgul(X|QLmai0B|ca4*Mj|FO!tx~X4N8(@V9E@UAsa{og zKBLwehv~_+BO%(i=5^QDevz9$QZyZ-kfTYSx9P9usRYk)yqvMkS^v4pd%dAOr+R^s zG@4P6T_})y6?7W_iyzrEf?C^HGe`5y7H_D=b~&oOz<`P!*(NSAi{VQf? z@Nh}#a}A}hS0bOLPIZF25A;Pv-jY|>68wqx6P<^3LixFO77d%cnCxcqK{IXc@F5C>@UvVrOO~u>Dr-d_3uHS@m z$WCMdbpZB|_{kbe-Sd4l@>6r&>Fp5kbu_Dp-)LB;q&q?qyMa+k;M~buyr8TN(Txjm zCwZ(M$_nepnrfg9|AK9Crg@VNP?k4C*VC&4c6_!6`AEqOXvF|_GSsn6%iJ+bxRcyA zs>}s7%C?x$M@bR#6sVD(`@Gi3RI5Xgh!h|jColspfHmJJTOPwLDMFQ(m;Kf86|3bN zQoiB@(@+pfHa{9Ep`lav(BF(=1rsBiv_{1k-A}@6*hD4c%%j7Z-;I!uzde>pMNPk( zhAE-_BT0s~(olV2@gI%!;BfDM{UNPRu~ zO$`cfFRxo*^UBvfPenw6c_NOPJI8b#z|ad!1KW)>Y!g1IuR~g>dO{DA_~X9&HD6eM z8>1wt(NOMMT7d6hcM?hpYhG1NGry&0fr3jI?zD;)DiJcTR8-F{PL*320?vj8Q&|Cl_a67Hy5XWMNN zs!;=p%|^w{(wt5G%$Z#A4C(jcBRd{)?0envhH!Du*Ua@zOkD}Ll|HqI>CP{Gp|t%BS2AN9XWnwZ@s`_IHvAO8^|)=~5T>93g_vqV#cwbYL8(mlJu|;etsR-s z#L(t3j%qyY;T7yRa^I#LFT3!d%qW=iTUK2{`=l`I@iHKhQ>IIw%Iq#8Lx-`{_^!2= zT8fQ^>{*(uO$V^gxWhuiBevdWc!CB8_frY`o0`<;A^a>h1smTh895D62=CvxNC72pm#tA%l-I>#}x zoOwuIc3tnZ;IktMrQUOoVL;BPvb%2tx>+Q55yvqZ^Qru#RV*e0s_#Drhqy-~Pb(q7 zu-)0UwOL}b;r`rdk63HwU$IM=A(EiU~Bzb|T6A!pPd*%-;R8 z){O*C{H}`B&eF*Y+@yX#Vs5pNzbHbF0*4tjTrsk?AL&Mj&sINJ+JA}caKGR~6ws?P zjT>ovRpTj}2jlbHuUqjn`}5qpwBZhwWg$0jXmvv-uH^cQP%JvRfz-)epUJM^?l!Ua z%UzqB?{>eC?QJF-v)O?%Qe50R!)91GGJ5Nf*0CcgccmfhV&8@CHYjk;NB&Z0<+S%_ z-6rpj3!$Z%j>npi$W5tenT@9P8HZ-0z+>Nu24NrboDDCsJST334M(%5Fl}ab8Ox}P zSG^|OV9y~ZE5I8`pDp$fSb$%QEnarR}mS8i(M|@rUg7F89ls+pg?t7GB(U zKvhWY(gIRw&BON_G}D>s8sotnMv^!8)L)y4oK3?@D7$OlQZv>Yij~a0_TD|QJ=I0ioYp;D6H{B1liu&)>r90exwWnX^>gny~dOd1f%7)cV zuRClFnMSX}{F2i95Oax%{n~7sl3BK?^tBRN>=3!T=l54Ses6OBkWt$w;{@Iqa+q## z6z7mV*~Yi?@C9|hk_!phL8PA?+uKY%Wkb#D6w=4A?W@OP94R-+Oz$huU^Agyt-&b?{K*Aq5;?B>-1_MB#mX4QK$2+uNm zE%jH?O$!NfFwGWpkfEHuTw1n*wT|Ep`%yFdbHuV=b=^GT^vy!Y9w%rav_ddHaR#e~ zh3>utcT9_{+$RL~S-MSZ)9`d(YTapoK(lBRFy2_&y|$%v*3sPh8JK+{_wZ&Eo#mVb zTf0jc&n8M1cAPDri@M~GFi!~V)inEYF|x9+`Ve6JO8k^zzkW~A zkylApi2ZO{Xb$_1j=VaLJfxP-;4V{3R#m03(#NRe4LnjEI_v(~#O z6kZ~K%jAabpDi0Pe!%$G7N)^na}O=#6aP4J;dmrUKG1x2jZqBjycz`}LBp>mi-ZEz ztBg!b34V-}Imsj0O)oHpU*?l_CbG(3I)`bc3q$X-)8$gp$+6$xZ`Fm^F&5go`-0fj}gJH{v+rPwGXs${ZuAA~Si`lF420m9p zois$=vqPJm7-#co=m(oY$aK?2R_EHbTb^RJNbGo)jA^xOg&^5UT4uA43*`O@#_KiQ z1>?oL$bF6A&t55HU!MpF+jy}8**u!=RlWH@8k6572*=Kry7{4;#w(yTyCCS^@gBeENN#*oZXa;KJA+|fNk<|n3XcGo2CJBx5s z+Q(j(=e@G<31)=BwND9q%a)68;CrBcK{`3z0?P%;Kn(Vx?i^3^?UM0}Yu zIn;EKyj0N>v;8H`h_>!m*nT<1he<zGa;0AkbuQH#KjTb*o

2Y_@hqP-8a?#dFkLsHA|1o&;P74e>2VVw9d6V!We!Iq!bn%jmBygKhITD6I+ zGFXzT-Rwn^LXT~~AKz)bqLHYI%-ba4%EyN7iOX+iW(wTX29#KFoW_Cts448?j5 zU-}*0{S5g6n(j`1k0<9JslP;1J)sae$dy(a5_r#XRL$IB;%-nV(_cJA?#jW>%f4Fo zEID34=DSgxd(qN2imjc-IC2<=(fmve>ZqQ8&VH+cxgLMk+YXkWn#;LJpIUg?xC-Fe zk?-)a^w%ro7N>W5&dcSlvQf8um;m{D`zzn0qJr(%-BA1rhQWBc8}S!2|o^ zJNwNF@5DKNTBd2 zvUV6+LQHwx^C)1ory;TFqV}@a#5>7p&6oq^_GJv6{4g*EHQ1d{GQ%w*O>~#<_m6jF22s3wG7(*@&{NA z{qss9q`*P=mEiSS7kLAaE^_xP_{_`9|BJnMkBh46{(#RO=D?ZTX4nh|IKpwx=nTvV6AUr}Avq{0C@6SKyfwf8 zquk`8qN$-_VtGr=yp)n*VQE>KSy^G4X{njr%x+fZqh;Ae%P#h=eFg;0-|h3hf4qPA zeE9GrFz2%O+H0@9)^~lsdsWsV^4AQ~E0w7v;c&v?4fCXdS_&U)0jQvm#akbBOKJC^ zw85Q|EHLj%juy!j`E$Z}_s_adQM5XPsJI)=q zGUlNdP6YibWb`M`6aqxLP_0(=33}6A8`Ov0v-FdIlu?Xh6p{u&l|LvXYbNr#%G+v~ zqKpN2whfQD$Mv=4BWrA)c^Pa>&e_G2%@mFvKYVoMb9VjIwp5VWZ z)V((@hF_i;azFb^vH)58d83cS#{L|Vk1tISH-*C)eBPWT#bi?jKCZzm6w)gBcC%&d z2!7jS*kF0+`~X6*`kFetuFfJ;WdOB=byVzl7LF zTdrjPp%>O@TfaFe;^JUos$R?_XmRY=(blxER9Z7BX&)zSFBF3fyh8+d)qrZo{#+2r z=-qrbzjUm5i_jw`V*r$N+=+OZ#`Jape^-?5Q|q5hb*li@-oF6X58`60YVaM?Pa`4I zfd5WW0u&R;S%{Y8|$yBNxo zvAdZZM=6V63KW0Lb&WVQL1Orb%9i`tS7Ns|AaDJSJ_oXGHRbjT3T{}&Ab!Q%=8>>r zO%DW1ts&oWVx!u2o}V^9rzIpCuP>}zs^ov~CEj!I@e}rFL>hzA{$cFd8sV`>i10lb zc&f&FkL!NiI21SOgzr_!+LTs1a!NT(A;LTZ`A;CpjZ&7>?0G6XoQ07T*j)r?*p%5- zmcz}Cd1a7%{Vp}lrHs!LHup~d7?EQk%A$Jy3ZL_{b&r?DS>afnV7r*<4YHRg?bB}) z=VShFNBe)6SbluDO|4_fZO>`bW~0a#mCc?RJJhTHxMD$HZ> zw0`!UgH1xH>n@U|5&q1UmWl4skPV=W6N$Z$PRh@GF%tE{y9i{Ia)vVHmQXKa7c4q0 zG~s)i=j99pC;Eh&170_toe2@gNP{%e8y2!Ib{TsY*_@xAS(_%IOAkX=5xHzM%{8K7 z?rdBX1(+?>Tl_y^lq?4?4aLzK@`4Iisl~rC`OgMODL6-q2Toxs5BUo=j$fc&5if2D z%KkloQs&qu1dF=@+ia+SNZOVsFz3|EbUDHdl{m5I+Lh4j@ms7AaKC9qYEFdeEPUY6 zdtq(2PZ7RM;Wuf-wPr0e%ar5qBcyX2aOU83dTEK!w>RXvNT7<3)TABE18U3~Mb`Gh zo($x~1~5g7&*eE!-eI#uU2Rd6v?#8wp+j!IG{|-_{F@ zQE=!i=>abKX-*o#RN0O%acRkZIA@MQk*qE+-sw@;PNk;IOw-bCer&|T$D(5pBM8+@ zQSMio+~R3?x=qCn0v{3|56wZ2cqsk!0jQZr*uq=f$IL<{o0@0H3Oywh!wgs4$ajF@XgF5I85Fd>ZXW1?UL5EXs{?W-PsR(Ds zK-L0jSD%(zbDJ6RLf@uunzx;cIF@Y z9)CDQ#B+t0qsYP-ad6b>$in$CW-r=D9uP02HdaE=Xy-7iN6}J2dB>5Fv!69OPA|*)yu48Gf zyUwZ??Iv<62)%(d3&m&i2(NJmsNOY09f{yY(9nd-CorDI1W0`f(-t=-gd9YnTxD$u ze*X@B5Xs)6ah?gayc}k6sw}?-LdZNEE92wD9|HM)oJo@*{xXVjTW8f@rdj>|sfQj? zC8ST`EZ-4y#q`FEyzk)0{4-i%cb`I|f*(3OU(bnZPAuY3nM2J%cGK~D13uOVy35F> zrR25QOo^+f_tqY|nUSIu|(td*fjJxyrro>F#Hu@auOFfdf*a_5#cEK|$v; z{2Zs$q;RMZQG;dyD5+7zF{@HW5?7e1WU6iigsAw3+pskZpq6|4e9)Fz=EcRCrXiY% z#1t_&6C!1+|B*<>MgFdZthY-&YQ{;%pr*8FKgSoWl#QD(eqv0^Yba~XssOxA;>xRLAhWc={A%OH9e+FiV9{8n zBnx4Fwqp##_fVrPc#4|Xdh&0m<8z_j_!7yuo1j4NOm;dLx2hNUQEz{Rurtsj&TuyC zYoR~R{*6K-_SGsK@henJ26;`*_wRY+PN1QZ9%4rGZ>r~>L8L@$3!ljAHSt5*A6I&d zM54i4Gx;|y#H2c7hY+~u0KOJrRyB5QA0iGUqtwDUfJNg(y82aa65bnF=$;8NK=f8y z?Z&SzA!p-MM%8;Jo-=P2*QwxOOnH#-tRlU;sHUpcdbh2yAvwbEHVt z@8e%_&r!XL_lWpp-;_fv96+kw=iV|i{M6ViH4aaeQevAO&f+s)TPmX?D$Cr3Uf`?1 z8FyYd*Kj`03G2Nd6fFC}fhQ^VNF*LEg*hC6g?Bh{@o1&fQSpo80|zt0az>jI>=?=| z4p-FoMjx0LhvI&$!w2L@&u*76M)LnVwGfw zLu%FogBg?z{t+Jh1hH;@=|Hs4$1Q{p1oOw13oojnZ_HlLdAy9sIDc^!;UG{hZO;d9__!;<(fH|E+&|B#3$jpR4oLM^GL%Z zKt`tOXV&pyc2^WpRXBV2XAxnfCR?%xW!qwgf-eY)!%67{Z!)4s4;hxFLHLc8?U!3L zDa#r6{q8F9S(n(CAXA3>%DwnR zESs8_0BQbeJm)_A9B+Oi?|0ogzCzy;i0>kJWg=64B*9Uj9Q`wId?@5~JVFhQ#;UQ8 zM0Qc91srfSJ{rW&9p;$NSdJ$0oAmuxi(~cT@DN85<9LaIa4x8yd$bf2l*&FX&18&Z zu|wy?fo90g*79MqVXyOMo6Fc`?uj^bP5sr9Sxo#_f`WGW)RQ-oEZcfIjR8Shg||Y* z>d4b4alMF_YqhlBmpo8|4p&TqFy6V4NnDHOYyX+l=MH9<~ew!I-LMEJKJFe8-hK=k;t;{UzkMOQ!yNLw$J&N zT+rgB;+PsnD2z&Zz^@_N>m8HIpzTesXrXbiBK(WfsgBzGoUA5`i26xW3g@b&C-6^U zDN>C%8vBDM_ zC2ntdz3H>2G*MxKt@gWqy6ws$HyIcs3>%h5@G9-0uuLFr)bwQ%O?~=U0+KDK+*#YR zBiXiZvJ=@|JpKt*>aK9C8H(KzOwH-k_UBiB8q{u{SZG$n9?SU3#?H`B4m>@CcmdN}!GRKq)yEhn)@lDLem- z2Ja__AQv;^%t_*0p@nL9ePd7X;u#YgzjJJ6Mn5jRX)OsRO-k$$T+cJ!<_4xX`zHhd z_^f25BheOBLllo4|Jbd?Zv`FN>0+H5nTFZq!4iB|NQw~Pc?SP*|H;dv1FaWwMmT#8G+3}Di65!b)d=co zmD1~YdM;yh4oOF8DXA97PrTlOa|P+$v>Jb>5oLbp$0X&RLA&;oZEEQh^gcsd$#Wav z6eA><@F@MX86+wa2ls$(END%0 z`i=He&64(nRN+|?t}V~V#RDtbUUx)C<24%mY8pz$;vB|+#ipQVC0wbxug zZ%5tFKR#Wz%(hb#G&{|RoDU)05r9N`%ke9%Kn4lr(l0r49WVA|m*Gza;w*tYVUdjH z5qL3Cdg|goaZChM)aggH0Elyu1sZ!n0PmX4j;UDKdmvQed~D!tkLVuDZq%SPnZuYJ zy3=(SjlwGpxPJpvhX(3$@OJL_S140U$(iwB9nz+R8}Nz9mhHH5m1Que+f5$PkWT>^ z)mn=Nq#tD1&yax2w7U+;41suDw3bo?I_`=+S&=c_bZpSBvFwP*L(spne-&Sv%b)L0 znv7@$`V7Ly%vj`VK)vCVacG6LA=}PW+~Kq{?I=yuKs%XKC_JPU21e*6+xIdrEkw9a zu=y|K`yI&7QZ}WzPrg?D0T&}iV2*wqo7>|7>ho^JSEx?V4!~=#&fr@Dp zaBC!fSVL55esmJMtA*!#ka>uK-V$?R$;;_la6Eb#%5qSee)_^B;rK5l5B}7XL7$ zKL{jxvCc=dnI(!WW%}*R6*d1fH-89YS+5r-8Ku_D3DCotc3PdjILy9xEt%EN0LXG6 z2P3WIcy-9z{p-jHt!Y<(K1xNN5vI55!3EV^ctCV$n5xR}GMHkX1mQ{HkYKmmYyCij z{>&VSr1Nmv3qiWM7By$-tKoxtIcNIi_Ecnxq3~SdadY8=O7|W-JJH_X58VxGEi0@f znOV{c|M4hxgtmslNwfAr_FKM?sB$btLSyTc`4CSueFRvw(j1#E9c#m3Qq#WkBXi@% zz>&SWMLZ)gHEc1oep!x>VP;}D#g{f`TmJB(xi~IRSlLKwRk&;esacGk5LfC>Z{iQB z^7^Btjdu}t?6!lpBUaV0+%o^%k5Ts42N_5G&)NI^#q&MvBj%$Osy)^Z7dN5CPsMvi z<9R0M7haTC*hBI6S`_Wz6jQb%X6>lTKZFDLr$oA6kt8Y^KCIowOHc8-=%bU?(?mJz6W6#z63wdOKPZ-gNxV zma8Y1<`p=OGr4L72a&>btPuVT`^n0V%Pm!8v6&YbJe8a)7Qe7vcsKsNw9F`2f6E@l zt%C4ga`<-`-+?z^pb2CfJ){f-gZ8V@8XAKl25o&)eW85(+eY};$% zw^+Q}Y@2FQ*0}l8Z5g9Y|6r7UGSZT(f}J{YQ;t5jk1p1)Fb%o?awbJu*a7HAjLPuf z1?LWD`4L?|h|0<3K9JHT(c{I}d*yz`>l6D~C;mnX0~yx*ZCV2W4z z@;lOh;)pcLw)v^}3*v`aEn2eTem95S7CuWxVY>v_u~T-TpnC)-X>gc>in`ac&G|}lyee&%jR28 z77S3Nf1xNr3U^}eT@3#Thn3(R_>#Ng8^q_Er}>*n`XZ*~Hv4}Q#=GO7L$HR}o*-j-qJPkKKB*^vKpj36+EJI>qlL6>1AcY@ zNe=Qp4lJ_LE9f9z(SKWWyoY?fTd?Nk|CEVJX3bK~Vo~}|0^!}0(U6-z6$=Hyq+zz& zAZQweMyjmJX)8^0CZ^xRs6K;nc9bX-IR)lL;ZvA8`;ZM%BAg@0`4GHk5lm>h7tYjK ze?-qn-$)nX^TL|g3*mdDi&rWcuk%;I8kABw5)HF7bHcrU6qCPIFg1s2B`lN%nlvi>c|TEC({c*N?!*3229?Sxa~URu-Pf=& zwqN=QMtTU(Ft8W#(O~@RmR3j=FDG9-Tl0p$-k1UHxXo{&CvZ_Ru&_XiVY~RPURmbm zZQIxvkM}uxkCN2fVb9W$Gd!6UOblvAV}E>GC@j4)55LBQzG?Xy->owJ$UAik=Z6vG z?F74PoNKA4e>PGAIfN4eIA<<2;GP=@!@f3Y9JXu_uu5~z>6ocK5>l`dWwoXsMbe~c zbGMCC*46S8!=-c6<`vX3P@Nx+FJZiNH|Ti8xL6`IDaKb<3%)%*lL>mIj-%wDJTPKPe@VzP>F z&k&fj&%&jEZKo&wu0XxwZOu~($FS{Z$&egnrICF46sqH^LJNi<*S+Ge9A1Y_?{hfg zLE(IKj+ZquW!tKAM=Hk*SHK<*`0<3krgv>jif}Ganp=2?$r`!3kl56=guZDx4Ef$6 zG$)gkz%45B2vpscOL6@e2&@jN>p+(&v$@M=g(o-|7LCa&oZa7apW`xMwn-Uj~j z$-3vV^scc7pkcm-ERABSjyQsz7xZe^R`e}}7x)We9SjD3#sYo9!f?n_m57HhV>Erd zS5+cTB|@uSd~`Vfk|xc8#M3Hqfkt;fL{8~eMu-TuyGk>*lEGnTN^pTm^@gjO%nxpU z8~ps)9=ZZ|{OVr)r{fi>0|y;55uO+(9!tcl^inW>Elm9L)y7_sF?xKBE0eE`#xo7V zgi!I~t5Y@vd$V*KaIYBh>%By^^7IyhC*wcYlNOG=vBvsG0Wd(9U^1H0I+Lq`E$)b7b<1_VAn1pmuH_K@$3BJz_tQEXDFwbFgZly)ZO+xo8SXei$|5 zjke~~(E7bQdup6T93$<&6*i|q>%OOgT;Z5%VZb6{ z=Fr@{KOa1Zz>r@aY<+|O*3j6`y}*7ihgctRx)1pBc~c-jInWNK!t~H0a{%MnTL_!oy<*cAQ(#8?lPT&zyfhIq4EW1?z^VPC zEj+}c8onfm_I^Nbp%wRw!1d9pjjr&<_?B@1;5#g(jRf{qJXkL@#i84rD-_~RF}AYs zEk8-*SM><5GBKQZYA_zYUc5io{kgOu_VtXbmoAF=Va>=VO>T?V1NHF+fQEAPW$Pn z4EA|+G_zD8mUE_W++(7cSs4-O(-_gAB|&<29^XIA9V8x8#is&|?Ui0+n~h&6q>Qj8 zhl^R9eMK6C0=Gw@4lRg*FpLC4`hY`>6^{yNRj3@)8>FO!iO7_WMnQD;BGc~^m1DLL2IzzdcZ z&xmRjKO{u@Ts0zR4-a^}4^3^=rl-SC?{mCT7`ssXDM@^`KMCQoilooUsqokzB(?C5 zyYaHkwm#FS2ww*rRj&N$?3Lh@`&?*19+Z&Dh1V1RNM4VRV}8iM%(Z}#$vs}fBw*E4 zCSjL}$s+If6c1}N>WEF_%?#I@d!q;OB{Qx7Fp4SX4t)ub0af8u%fy8-{4=W>lQ>|O zYkD%}#3B+Cb$S7MFKsw09o%&mzpWB~?867+#R)yx7leaqZ3(b{@rI|}W@nb7CaWj9 zjZ`MBct^b5fi{tif$minzUSY)Vn_11@8lFqkwD!geE2G)d)?*P#Sg*+E}jDuIC8qu zK7rKf=DgtM3y1n!UpaDrX84})!MIEZ`*bxv^+Zw!dv+&3D;{w>sk<}dMI1LUrm`C| zEB;x9Jq~A|fWs|G00YMg4!Y|8CPyQgYRmeg=)3eP{kY%ocrAWM(-^~ViX=w@lh3oR zSe-2t69aaC;n>SUNH2^EtGE-pwBkQW>?2rLYw!_gx3n?!!gtT3C{w>SvOCiGoeJMe zTWm+H1@mZzCRBXqo1(E;*8;>S93{+NuQ5H1@l*BUixLoKC$&?;Y%u@`v&AR)Rt+=I z>t#k+*1SVj_H+Ht>u*QTQ^xE^)=H569na4TJhxz+1D{bhfj<^(^8tmXp^ttLFbV9d zuxe7wru38Q&r=oVv%=JrBi}F$sEJR(rw8Lkb4~&NPUSwjeWF5HST4K~YyhUO*cny$ z-9sicgzVCU87n|2q^8ogk~B)AhuC)A?K-sDf_D^<6;F`_D<4shKS?G}o6t@u2YZF| zE&OBx5y*ZmIlt3fU@(NpDH7~OLQs(->9vSRvbN--UCo*3CUXJ(Y8pnWZ+7rPB;twO6 z`iqM=woL4=b5G0T1iGS#xyQoTMSUzrj`u!>n5IRlrjRLKxQMCbSo|6H@38Dw_6=&qB?A9teC9(;dJRIo zKI@Y?8)X|(>0|h(i06YUw0l>AYt1w;8BdY>o^)JbT(iMduTam?;LEd^QRGSiL1V?{ z_wd(a9b^(Pc1d>Yth|F6|JgQ(-@B77kA=oCc>KMTF#Zn%S*Uh5>1GL8N5rS`Ml5YxKi%~{&=Kx#nq~;FrM?C+)v309E<%_ z7MwFkSybfM5D=cg#9aDBN8uU!1 z^D-yS9@X+3+26uHJrC!rA%Ttd2#G2j%;yeZaHg945{)YlLwG-5jYn%!zGigCvR@83 ze%J$jv1HwDVBDxLCwqD+>#K8C6H6)|l#34GAw3+VEq?r!Y6vr{>)i_Bhi$9f((o{2 zbv?)?6=7p9@%LxUi-|KqSyKrO>-BtQtm!?@@`7Z^O#`Ez7>?_S~j4F#`>#Cq>|4+^`?0EL)95~XQW@CgQ-{Ise84hkXZ|@`@gvv_%?@_$NYBC=rW{=|$R<-3+na z{=tYumiHgb@8!}Qj1ah}c^#<>6?^m+R%n$oyg2m1tf3*R(^qT7k>T~6>!36 z2%tPa2yRu`BP~-5~2rM>53}6V6PZ@U;BN6TYq7E_$vPQ7cJ##{Q9wc zVN~NMw&(8?OeXvr=1*xst_M#IG`Y;uSLj20JLdO?OCta#bk>;sWoC>DMk*&+8Q)h7 zigS4VarcVk}knIIngzOEJ+j!=waA&$+8M34CZoIDo-7V<_r-u9yxMvT( z+QWOmyg&ar1=JTx7xSJEN%>JcZ<25>2~Di{QcRCrYj!Ua{~!qZWBqN%g3e4gO|xL{ zed3EeN_Xb^WsFG<KO3?$6!EI~AH~;rJY9u{q-0d^-wJs1?UtFQw1YiX>zEpF;z?vEhhig~gH*n*N&7v5K{xnX-?aeg`wA zzdtmluZ3<&w9KMO`01~ZbJ7oZlGd?~5q=1AUBok@cfDZSn+W6=s_)u96&oy`X_kqR z0F8ayUeT}cGsNDHM%u1`2ogSm@vpV+C4%>>_CD6r=qwe+FhU}_vI?I%dFDm@;Uc^_ z3HyOkgm8Bsb^xClo`sSXI4YEnj%wU_1gv7CP)0EFMbeb^-kQLvCCF#ai>BT}?D59!561d%raU2Lvx^y!~X_n1)|(Q_CDHvXpj&9))Pv@K3t$O+?s$RI;=?g_ho zF}jNcYx&1Yg(C(b7vQ!0rjX1>LehUkd1Yw0^If&L;=`;@p+p#8Cp5o^XB#Y&fDzO& zv})JqjR*K$Sy1zMI6^qKLmai3oZbs{TmEEU923Jg1N&7C377y?z(t?nS8nI;(SHa1#mE;nJ_$ClWu<9`lg4;rQ=2pf9i$a$rqg{;lN~zjLlnA`arQlAiJBn5{#9fVF@?rdvtLyh)`?9UypQ&cEofZxnvhibsWwM@h zQ3a#BjH{Rl(L>rGRn~fZ%pzn?Vzwc@wDD} zr?Se$FL<&+3l_oG+vfCb`H zE0EoCXdwA9i2o!tMb#V6-pFT12?8On*-Dn?+t!+y0GVS>g~1*C9ZyCmAv8I;dvI^R>_OL}}U z0)kEVqmXP1sK9BHh$7WC*~I>sIqNZUs>kUIQ4zGmGRs}ZA}~q{F;?HL1yG|hqDi%;Y)thO|tx0oSCH1CiI2Q zYtqvGi#|S%+FddxsPj^LKD|`gQVl$k4J#H7 zRYq=3$ychD+h-za1xbjAJ*As$(cG36E{t9Q{aof|*ZtvN^V(3=Sl24pnn&c|2_@;C zD1Bc*7$oK&QQ~pQ^;U^zUV_6&^L*8G>v?`u zxcInWYq6VOz1m`bti_(=kH765)L{QeEyYv}5Jrby?Tt!$Bln5E4OFA!ntsPcz~Nu7 z2}4VWz>V1@MB>x&=#b9{%( zG}WM_2CO_rh@VmUqAuQd=zs-cbGQU$=c~O&B3@a?&cD+b4Hz+sHH`8iJ5ojkbij;6%ql?L=c*S2F;>QB~bR$NRM9DKC})R0f=d;r6RLY z8aw4)5KvKRXTfNr0;SP|!jTRLs3_e&9ej7WYAk>ZOF`dLS?fl#M*!Z?NXh1X%>RH` zhEsg8&S~%|X-a!lUjlB3{Slp&Vp*Tu3=ODDoQxI?8^fk~EX_5rLZ zZ*kCYBfO$dd^r0KKR`6hK!E%Pn{vj_2=nREMzIUSN@d1GV^BS{lt?rOs;uU0PxK4D zP?)cAs6lE-Y-7(cZqy?QdY6F*8jP2=4%OLp%X(9?SZL<0^VG86Gj6F@$|Hev1_Cf5`(c<``@?9EPeB@9TGnW$ ztlk->=ng%FT91s=eq`+?WtkTem(2^I1S8AmG~K7A+RgS%1yk4d8)a9j@t$RWIAYLJ zg{4D&Sx<-DbB%uA_1g!x=X}W+B@SqXI;h4EK*HV=##EsbpjkJ1dvm-27CR7mwx*3ldo2z$&St^`Qn`exn$^y=88GO`B$;!+VRg?kF|Ngq%$ zmLG_ToCt>U$pG5u1p2)|!R~?O4IE_|ZPJfnl-md{dFW-;=dtNb#fr4kxz?fKt!Sgt zGaVAWbuH_q1MNl5xeD4UC%wseYCLFWM5jbR(+psB2BO@O`a^wa&r>6Gq_MBlv2RyP z%Flox$=mV*Wt0QSfnEQ&0<>VIH7JKY5*wNM3edY|zr%(lQ!?DXiScWgktCbDPFy$Z$UCrSX){+kce+JNO`pL`I{_pPu?R@fJVw&M zxj%>5GS5FR~0!tc!m;7V>z|4)r0jGG0rhsyBfAI>ej3!`Ua574;;B z%NfZY0B!6U>6bZWLR{u01(Tduq#s}a4U;Jw{N3}I;nR)*ka|8mCw@m|`hZg!i`pBZ ztOM;WfFE9^D#>G@=HxcIwVg!Np{phbYHg`^bHk*B!0 z>x8Zvn@}&N`iiGZqEvdGN|4r`DQ{lSc-kND4S;K(kam6IL(QA(-4*w;1wi~@%&u3Z z^+4{it&tRR{gS#HQS>mZRP+CEs(mnX0K0bIsRea!ahOkpWCMp3;#grp0I$(a5YEfkFMX{=^SKv(|kLgRiAUhVnK@Uu( zo=R5fwgjJvgo}=qYHiAs%8-hl9joXwG(ENbneZ$Z#Bq@t?r4g3DAK;6(AAn2ATw zig0{aT9^{wslhXJ2MpRG@MaV#em}mABZsi}fKMhAlR$|r*{=YHG^<3(R8~CR=#{9_ za?W`CoR&O?!`DaG!H(nO1B^L69u7ho9L~l7n7(@TlHa$N{1~JAptx2G-K~xTOcGF+ zf|Ld&m4|Jos^q{zdjQl0DG$~NMX=>Y<}Sog;Y$JPC1Uz<%Bach)InWol6C^@XF$Pa!CuA zgi}FGO#fl-HB5cR{`LcGs^fA0CNKSi=^nB`FYMv6clx7c2bN)00xNXU9VJG+K(xX_3cl?7}oz*(1sd$Exbu7RseogT&34~!3kTw(u0s@UE3vKzS5kL z5+6-GYbhsvW#JF-bX20inUFnEnLbLHNA#c^T;#!-fjBRieIeFjZlW8lQGyJ&uuu&V z4tQqaKRR;}>VYl6t|Mr7;cti}s`(5pQnYBt_;KAM}VFb!amCnhAjQ_LM-H-L+f&YwEPle*WpzZ2Qlo zGRXZt+U%IDY;O@ZYqIk-P)m3hF>#6Q0O(E96D3F21D+bx6f5zr>M>Us?`I`#h^Yx0 z#?&^yZQ9DAr>X7??+Vmb0eA=WVsT$i=o1(=9W-wtP9~oOy2p}_fg7hn8YVo>**@YR zTVe9!Af%9`XB$VsrVEJczk!Os9LO~F5NsBEaVfSA(Ng7ObCw=BW{pMX9n1| zjsb|R0p`?^m^|$}#zi)S*taw0;jX19WOTH)7NQlrJ{Wq4%geK(GXDc9S4ggsUvCNw zC7VKA{m_`!=h*4s63iM5qQb=!O8P_kbh8baU>(Jwjd(JWOJ6d92@jAe3YIx|DJiT98ITbx&3Rh*PFteU! zVow62V^EC^FlC4*=Hj=*jg?iP@Kj%3-oOW_03KddMV6>=Xb8VJRQyRDA0MkA7oj@ru8D2^ z+5KhuuWGb1rC2fLurl{{;6G2wyPX->_7QCTpjLnb0)<(@a7w8z!;yfW6wdPEMICTg zH}5(U9+K`!VJdX#WF`N>H|7PZEAHQzx;`N1d+7+=u3OT+V6;cwSAp?hXojA(ij|V5F4opZNY&6 z-1#-Ud1bmH(2@fj0JR4`Ws2K>4}TiX>3f4{beRFVyFmVdog^(#y)GS(?h+%lm%JHV zSQEg%5R7()j{$o4gW`^0@lzGaQ^EfI8rL{*%oIO11uxVwRX8%p^;7#{rra|EG#;4R z`UE}TQEELWvn@*mIHxQnGjz}%SVwkHEST+kEkHV)YCTv!Rl(hJJbR{}7GgEfJW=tx zgVWBS#zBpnrD6D<;MkwWh(QoiR+C-8WF2JPE-3I8j1TKw|Dd6!bs=aY`bt`02@5$h z(~+z&7oZeaBBr%G58$*38hkQ>sb~js1ZS>7YJ!mn*@-mxU88|Ym(_Xj>M-2U)3#e6 ze?{^e_4r&*K2%k4N_?;+J>UpDLpM+p?demBCmLqr*$fPsGb zJ5`#V1>Tlw(AIv#zLk)@64@i!A~5=>>BshGo1p!wAuB+&wJ{_QUD^e{1ek#$dpSSW zH>_b|Y997$UoP>5GyTvv@NhfcA{RI;ar_1epVmX$^=%oiy1%s*gt^<&zgOS_1N7Lg zR>83v)S!5+lE2PqZ|Jc5&>>s*2+x`&-szms1xU9AENO<<{bij$J!7> zGEIUcw;Rd)q$@2&*b?fU{-;AI%jy8Fwl!k#KgPEtu2w z#~QXt z@?rxa-wBN%(SjfE6}eM4QTSD#eo&+A7oRyDQV0&5j6LgvYL557L)1Gmgv)^yEw};1 zMu4jyear!MIu7gQe%iFGR|^6x=A-K4sdy)F9^p&9fry~I;y3RhG#HfwY|XkI9S%1* z|5QplVz)D;EvGr?X3U?A#x;T{N>*LUFMdq9xYA%*ZYVJ+RN1jLw1dHm-|2}?>5Wt* zkAJ6E+Y9(h6-@ONJsF`ln_Kp06^S~W9R^%Bxq-dhVNjdK2^#Yg&K?Ns37GjmDj`V% zKR<$scolmq`C)>zF?r9pdUlOzJCQf`uZ^txgPqoAgeNrd2O+Gp;~vDiO{OYy?aoVv z;ON{S@~W9FK|56=p#zY#>U)Fl0+}HY+Ns15ywNyFDEv)x2+%wW z+X%{R{5fT=ioI{!Ts$>`gzDK4{uzQTK{4i6y=Lq}YjvkE>S)VXPj=z+6 zB*7ntR6L%sS}KeL+OlfUAHowNW7lAP6bBT7_#kGB@t>fPRhtv2v-3YhOYa*X-&I&O zUHq;W?yaI=hsfo9>x?s~&>cYisR|hMZ5kRX3aiS!rYlx0Kpv`^d9Pv^lMrky7yxNek(T3d`2OtlNMP56YT&CO&?Fh7X`k3Hd3Oz>>y8p>?=d z{DAbGevsVA{@vfQQqA6tQ@PkAYkr2ieSvGVZafoZI|Ix;6`QI4Kw%&<;{<}+M5wfh zg{s&EORk#FxE=g^D(kjXn6+9TK*^`aY%MW#fExY`gC-X}Xi2Hnw!LbA;I_L#pB_BO zOERjWtYtkkU-j;Bh)Eg4;DILKFm&C?H)5a*v@DUD)-i=>w7VT@;J?Ih_0?76v(Uyv z;ck4QHymdt#i%Z`PvL}6M_G(V3z!K&AlIv`Ql8U=;wL%IDbmuo_`5SdqTF<6&5ZL> zl&&iOvRc}1_BRwYKzgl)d~9+(B8mMCKr6(XqT2-&DQn39UvbFG_ERW{>Y9Ol7=5x? zH&b2zPsIO9Q}tQ`F&$({{}7A8%?PO9JF7gCMl@C83R=Wk^-Mq3ul07I&tJAvZxKN2|c? zz|FfQh~-2%{1$>@n)d=paESlp47E?J^#*-y*k!tM_VOL%3@&6QAq(538ZO@j9*ic_ z;EYKB3Asq$eSNuR`60a!L|-csK#4$3AkzG~{8qADs+>-T5_vWBcS5^7JfH80Zyu(dy>KmtGcXgd_cpB^- zMgq?$mkp>cyqp?`^l>ThKHpS1wnL1TmQ#H8B%1>q2_Q*a>Z=!YXvyAe$U3ynuQ%xm zI$5A+Zlo0*dB$K8Zq%KnSO1srtj{3b_4G;Q=aBVh>HPT074j=zd%zBxy3S<5`l(^L zjk4ryN75CJopc4j7P~Xmshb;s>Gl;> z=yH&s8r}wq10WIy4+aX7@HDVRb@`1O3sdrEe3y_%53J^YZJlLwpg=1b>LqpXypXi= ziOp4kccSSl$mte$m9%^o_V35DcX%{eIT|B|2=~62m4yhM;I8uCWGe&-8I?Rv~ zfpVd2>i@MPli!f;3AG*%{SbXUuqY5=rbA4ZZov2H&J3ul zsns|BRhRAhYQ6spS6bt#teQdVXJ9CF=D`{L`%dy}%hG_wzCEa;zSrS13B)H>(BC2$m)6W3xRi+wIJp6zie<2WyDZF0{)hIGI@;T5vCl* z^&Q^aR|@GGKU&WAIqiQ9HOx3&4wZE`F;%(Pf4#4Tl%y2%X9(()@Cllwzj| z|2u-C)j~JOT9%f@(k&Yr_KWCl*x(BtZxZtP4Eo<6fG7?MhyT4Jrk|zzsyuDi?U5a^ z7qwns-0p6)bU%iVmDBn$^?kDK%E?f=_kl@(M3WpZ&{?ViH7__^c4|8M_SX8!sdPd4 z#u_{YO~lb<2+Ir99qHZ&&I*ob)RugK6_t7P>A}iNp+hm%11Ugow4nJ&7nghqYSx`0 z1&~V9O8|=|xE%OJjW3jtg9`97Z`) zhQkHCV&~RIksm;=PlJ=XDv;1Ch8Pqc8Y+4nx04HUaJlOuA#fV<^`TNJPc%*7df)^n zOJIXV%A(3RT*s z5s6P~`^FcSAEd$!;UY|kZ@I`=9gq>DulZjF$-c8d2Ns3CA~*(MovDXa2e?4CaTC*U-el90MYF@659tK~ zAI0Si1Ro{8?tl4GH&_8URJu!0$L5Pd=!kS(s{>9!7jdB+*nqE>w&}}u-bA)GpZ+HuVvtwth@3j35)Zstw{xRhETFbVKPVr{=*p!3piUYpAvYXZeLk?e zJ^2t*;PdHjECaV>_a@)AV~?Vjy7vB+9i!9<27?xg1_}g&r-ilE8Ry9x4?Qr^IQ6>4 z;ydPn+7j4lxe@Y(vODS;Xy3GS{hL0q{5~C@kcY4VOdoyMK!2Y*OSU-pQ#^@UR)0Hi}jcOjZG z>BQgB@#>5teX9*#jACCp-AC7yfscj@&>`tINObl2*3@+XKKVAXl9c=*`3?|gQc$0# zxDvuXpSOf68%?Hl8E1zDbwKF;eQfHR{BP$R-wy&$kf5U9u3`3Ww7)3hAfKUu6Z!8# z&JL^W@CDr_`8qqLgFtbHbU-@SBOPrznw_y&hYfd)6$DaXHyy5%M&j~hz}8R(E{I<7 zhH2?G5gp@BZwc!WE&^~%5LbXQDdYhF|0lzE;DTL2A$=11^xispC*OLMBiSf9S3-@l zTV!~>SESFs&fMyKL}ulDaIR*wEf~bL6if1X4TEJ06Vd) zH|$$@a1Saz+%clvy+GFpb`BmOz3R*B05j*gsS}__blIuUDWT5`QgpCnX;47@3{LbtB}h1ZpbtZPl&xRZCySJ#4qP#hA&zG#ge z#~?O`8+AK`bv`8=DY|@J=a9i%c8hx4GQO?r^*YuP?0sDcrtbN+e=oAc#D6ccZcEG6 z>0V($W%_1OUg$SOBXkC?+abD7C_Pqn3r*cLuBxC9PmTB5#XC|y^h&Z%bjy!G zXV*7H^z!h6-pcCwIyr$zhoti{JLbE#z7()Tu+%_<2i#~my-7F2pn)=7G}i(MxLQ}_ zcH>;g8f&$(gYEF8b;fD+aCtdKfxUQ1h12o@uMz8-rZfG568XqJ|K5iMQsvIonfBDW1XW3yu zbqz3VonDGgFg2oXlUz{^gWa)O;1F3tT}NeUM;7{j-o`qw*xjvD!=kx%H|6*%?%Lky z-_pxd1v|Qncln4L9;$2fx?DuZwgT7d?kqaoZbs)08r>;@ce7dV*eId&3%e!EKf^Gg zcPij}3}OR}i(HG7quUOwn;myJs}Ey&>rFNyL>r#S`0K;Nv=quQnR+JJOhOcV4FA$5 zHUHjAO3T*MO3UT@QG}C;zEy6alj@sf2*PfaTdoD*@*3=PUAM|DH1!Jf-xXji5QlVz zVV#K-FMvMjUevvUc+(8vt#XUUT?%`yvD`bAo=L71O>c5?zg2GOG_zafmRseP>%auQ z%nS`XZfQUjew{Ej2Tt#S*T{JTQXTjiGP&$PG7El{19E}uqkvNJnw zm0Rj=m0M_DmmTjiE(39wt`7GFBBuHja>r7LYDR{&|6@qf-!$&k5Q<(9Hr<(6CJ zmg_R8x5_QI$}P9bEjQu^Zk1bnCGP)E%PrwCA<7UYM8Uu}J^UZTz`x@{VupqIhcJX; z!Wf1{N^t-i5Y0#f;Med!(*XG6h!A5;NDO?&Kg2&GjO+YO=YNRG z-|7Y7;=p!zlu=N3gHj-^w$(!Y6+n8xA?HJWLbcWx!PG;gxTEOa3F5m}t!G2~cH#zo z#Ws{W0V-?&LAtI~ELULI+g|J{@zr=KA(Xq8ax2IH067+_rGQ0fC2^ORK>t-;NNN() z6N>-{4Fzo|;#5_jVy@P{VBY~IeBO}K@~T1r4Rx=}p%cBkAahbEyE2s`(z=7-(B8h? zOUU-k`|e|yqVvO0_E4mIM@!41iPNCnPO6UUUU+?>eSc5vM6kD ziALyQbr(&AVmJFhG_9-FLk|qVP@G@;QL+vwa@5wcqo9k=zHHwTW?U8r#eH^g(0UFU z8XNV%165?qn8X43jkMS*q6gCsqKrwsOWklyz-kzaylqPR!~0e;TNd~+m5vut?@laO zncJ#IFLUn7I_HxN`Zl5y-*@;GG;0GhX&B3RTNi}MYuD&;H@Uu(2F3VrxpKS8qJ37x z)HeOeLHh*yT1%l&+icEpOvvhxS76-Bp`-waz=o{qAvCt8nNi9LLD5U)_LesvV0LX! znTBYe5D|{r-N@oI0QrV=0Rtxohq7_ub9d zl_+g4<4~~i&!3secxvhcmHi1apZugW6&yCi$$~%Xu2omS+=DI2YDLT+t7ts@i&w1{+oGd-{VaEQ77@& zQm_YF$P8>M1wI+ig~k~M+A>>L)zpBD1|J68brOU>^Z>7`tQGo$KB9fgzI9B=QRK*1 zSWo4S3Se6r4~%J6GsU*sI9#d5@2NQee;oeXzhDs3{S|Uw$#Dj?susAjC~ZZdM;d9J zs0Dhim-h8XXh{AZ|CS;4cT`(e_+`Jvoc7lO`lSTlu8sgWGf^LYL*q#bLTmu0fQ$tW920GG^p@gA04;|M)1^u6@mO%IE?*f3!AD0g#>=z(jNw zf_&5H>wJLUcft9ub7mCLE6;3)53c?1(F6Mr!Zy>19?;WmW->KKxHyHE$Xm|SDg2@^ z%cgz)mRFwfr}%+eV}3In3|&oKV}8@^cGar^A&>u{7#8w?Lf&x~f8lrW%%iaJ|No<7 z5mpj-P;jU+O3l}f*=c-qFL#>!PHX*eAUn<7?fBo-?Mv}9=0-AIr1{7Vh{B0m=cJS%|hypm3Wjf;9q@@ zs-KnadbEPAq6C9LrIoLTSFI|x4r9a7qUeq{r7xJMoY?_)qhPpey)Xdw>g;Sp4yHCy z8`ja!$VR{h+feHYPJ-d<-pnY?RGm(xaTP$}r@KLjgKpaFnHUO|>+E7g?_C@~8%Zeq zOzt|OWN-gPS^eJ$+5`X*twxOfF$H?S-j`9>kPnFAc)Fz3Jw%)ksXz#ypTj1CG43MwjI4=~^;H@PX^MOf5-^KK6|gd*0Y}VJW3c_ zj5n5{=H&kf)j^t9=BbM53{0MV(k7)?ZTsVZ+fzg<=t z4IA{C*ki3KJWWd(tS?jfeTIz#%}~3aY^->{K`<`RB(Il84mA1Hw`6KRW(_R?kUN;#%)6VB&A;Qb~5Bq9#DaV@eKbQh=`r8g^77)X3L0+IHI<%C;X_u{+rp z^S|fh;;qq2zZT8vXp}2Ml-MyGt)nXVjXFpvVP3{}iz>;fN{D+1;(jMZUt^*ctQ^0_y z%vX4qSPm@?S0f0fxF7nT1rS7Q>MNy29lWv1ki&0KLZFXtdgxvb9}+ZL>58f<^Kkgw z<<+tv>1ZX0(|C-Jq^3@gw`g;LN0BG9Ov2A^pWG1(sVJ%(4Ik%OnhHS^N-ICE1@c$* z{5XF}1=6imwce(y(gvlUht-+d9w}SlSN-zO1R8ho&qr6+HWtI?sVej0CA6=Hq_&>_ zvblirdd^T&6Q4`}O+q<*zft?e2>()Mb>0IG(=#=~;jPzvk5Eate`wY}S<(3b#B$I= zP}BeF_Hv~ku}#-JY{q4d{M z&I;YLc_NgGyV2qQ9iy_2a4IP=v?Us%CA8pSlx?cMz^@fzXgdf(t99NMrS2Kqx2cha z6kh7i%99j(WS1yU=tbmhL9CTF4x_xXWWP|(Q`Tzel@N%M{sC$JgXm||!2a6HJ@K6 zH{o0HVH#9kYQ5qPej6pC?;o7VrUT3hrJq({`awvJz}kQ zkItE{dq%)z3^J5!uLzKRVCyFvX|^AyP?q!Fm`Rt-`5jcnR%wlc2~0Vk-VjLH;WXW= zXqXTl=+=w#p{`t-1!|Rsb%Pz{RQohsrQp8<@iZ^ls1Wr+yuvwK90*7PNtEdye?B`< zw$U4)^lKY-t_7d=2abivIaWIny~_1e`0GCB)>x?fVConc{17;P;~OUry*MP(Rm?wmzKu8DUk+y4xGiH2L3{Ny)`sxeML*R!8cd=KBw=G!eR zDY5G_9q{mAJWbpX4Mci~u0R16u~o%{#U2eREVKoG?e)|z+K*7rqoxq z^oM(?<3;bwOBM#Qi~@ZxwrZYEsI}b39PQgrm53j(Yv_>LXXBALRc<_=CbwAvK%=h) zA5v+a0u$1+n3EgB-EH-Y>|2m#d>=^PY>cY&b&b25#pwKkExYR~J&=O|Ch zP|NRFIuP`zyug&*i4QnfZ+ zAl73i?VN-c(YE7(%)d(Z2kh!4HPva4gkjyY33j|$dwMfIs-^}J6~rtsf0O=g3HwiqTj(p0oOvLuPiT*3R${5A>p@FAqgC2kzzh$?Ii>ay zK$^B(QsNqo(m%a@yPf$K6O|U-W5QJF^#M#IF@eRX7r(6qLB_^v-*3`p=^ETe?pPUM zzbD7{6;Sqz731|diiGZ&hO7Zp%*gMjU4ujKX+ZYo$F>;+9k)H8!s9`gv1&T_e}7EO zTTO*QbLIn5QzkwH33y`==xF_+w)78D4bwr@S6x?|=>?I+%!F>^V3hgkXfup8|L>7z z8~#&<-%w;vLVPlKbWBuJR{XB^T!OL@W|3R|L0`Flg3JhiucoG=C#LgS^tN{v`3O{* zDz*EGTnQq1BYfY0>mxHshWf)(D$M zBX*`kO!$+AA!2^1Ujn!U(P$Og{Z!ef14#>%{=s3C;)~Wiof>vNV6I^JRgpgA87sC9 zlp1MxFl4^Q?@pPhWMVY1E$!c6bOk>TilcDrhTr}U&>e&ne3o79VS z!aU7oQDX0zc@D+)^rx?nARQT6sXrK7UE`MvZuBcmGv^6Ak)E=c;b+Cd-RYMi1{0`S z9HoFhrkRmjK~9oZ5rSee@ad=7dM-%`W*eUlc4;)mq$)}H?vKmsW{!0alE(M;1t8f8TP zN1qrlyo=j9JKFy8XM?34&kigJwan5xCNZ$K zI{&EIc~lTaYijH2OB(qU^TzQ5AhJUm(^7#%T z;TF+SOXwB+E1_Y)2glGTncEjk9uw zTtebSZw=Hlm41zr2Ic_+8xACuMRu4D?LjZye3O~2=o%u+qN=A{)kWN5=Ih&+Qt@z2 zH+VgNgh0aH;PIA=OU+W_M&}ppxquJa^+@BF#;Y|whT~q+j+ytu@UJYBMB5(g$?xQ5 zy766!=tXuA9o1iOr~^v})8t54-V2%4h)VMRm5kTvsI?d~aP@eYvmv1E{3#8oIsRDh zeNh5FjWR5$@vx^@$ZTtzi5k#P0jbD|;UElWVAp`PTlzfIDZ$3j5UAb#x@!1mj6OHZ zgmIYNMyxbDN6jn=;k(z5&=~xXK0c!A%EW)mq=x0OA)ww_35i_ic5vm9hREjFo zm1X#cAgYQpljt z!`Nji(18UZV`wdvZ9vPpJ;C6HTZDS@6QXOYz-I#{>+4I%Z1wV)Aj(@;Pu|i?r?6Kv zC?R8fAZpfCddjNmz@Z|0fXbId*`Bq2WR%)9k4TsuXWGfNm`wCA(`yKbsx+cSC12=trOF?mE(q zwP+=V>dtu(I3x79NyE(5bRHu;taR!=ZLPrnC>Jc=8TSdWONp zw9E9VDsQZATD@2jQ#)-#W@9&9k^{obO}s*HTc7|fSYw|33L!42N5rFr@5}wphj>h| z|87dshroQkU*?Z_S*wJDH=S%0rad&~!|}33M{7pGrRlNDl&f6iEtSSl>G6~pJ@CFV zZ`ZF>JYNl{h;Sc-_-ZXK1!!8osvwgwt_;UG2mQ$0M&9KsK@ObAjI)p$!<|8%M(WumDfjGAn_72&!TXnuHCKk{|= zSZ0?z76d`X64;~AF~Xm+nqrvjt-&!YSk^wTP5%qUC#LvSP8~hrf&E^%MwL66%AQ1l zO0n>{z>SI|wWf@D`kz0Ok_;NZBZouOUrsgP*4WMlA(IP-p+pfL%5;GW4iWvrYGoCU zTYg#K<9d=y(=geWQkQ#O!@mmMH?Q;a*8Q+BW6aXY_6Zmk(=T?pE|Q7XHE*I~xTV3` zrBn>p z%LKS(#Ol_~dEa;=GfE{`6D@ntvPb#?Nc|p)1xKl|aGkCiWS(Z)7`1MA+gU!mXjsVQ z-&Tltyg_1^Y~8g=;`cQSBFW9)!Z{|_y)+nLItHeLVcHR@;D3~Fa zCgWzzc7k7c_WbV3WT5rB_6AZ8{H77d1o3a{V2^+XvoVD!q|r3fI60KlnJx(w23g^_ z2!yJAD;W(>8fE60Q8zg__U=muG=>;=6!g+R{94yLvw|yjJ-0)jzCFu z4gOROxDlRgAt^>EN^89ivOSvr+4LNCS*3WH&iVr!fQZBBA=kdn9Rkgf;*TmnRYZ|7Nr1Z%C5mBjluY&3*d`W6sp|VuV z**QArQELg>niVP-8CF&8 zqsa!2DzQD3^A5`mIr)pgL9S4v?Zyzip3Qt0aUF6rJH1#3I|+R!scB?%Vfxj+4eoCs zif3Lz(ka}#M*Gh0vaLejpcPwl72V9)Xz;Y+%+r3S*8PDYc6%~x^^f0x7cOBQX>(I`v2k{%P}xBtOq`fLNV5P4Ba1p+!DobOJI>9 z#dhyNX+`q`jf^?P`4vmc1(_x7echlLCYAwxA- zqOyJoR%(xolxUg^{yBURYDs$uojULbn%}3^AN52pd2EP%>MyaS;;SGz@KM+oaCZI)$ z1?jj$9J{WpMUmB2?VUI8@Di7SiDCrp;&X(kl41T%CIobZa|aqY~R+;{hIhaxE2J z!nIVUs3(5i{-iQ>LS-sPN(YfCtJ+Du`-VGJgKmx zS6JA#5FC*X{)4k4AB*Th_KN}8$!e+xX|#kqQw&`D9Z~5Chd1n$CW{a^-0VOH95+|dVCdT^2U%$@%CL&*sFpvqq0fT za$X`D@V9YX7sR``bWJ=SD9;@i&ZN@#kqjS+alOsBDBh?dU#OT$K^V@PS}aA$Qq;Ts9J*IJRd{mH^6XV`(89d0h2)j#reGRk zopEjn$?IVmAa~ozL5&a)ga?{%g_8fhbrGjh;p1SfL9WZPpOb*y(=DxU4)vwAGk?3> z4@80v7~ZM{Z%eN(d6;@rpWR=QS%P%(B*lEfCn7*wX!a*j`C?kZRycz|g0 zYYyg*NY@#Kt%@=>umh5Ej*%KWEA%Tm7Qno$$Z+f7=>B6T+k*LCoH^7{u7q0!7jj^w zQFA;9FHq&b7o2^?f0In?Mz$nV3$0&kp0aze1FGJ-icd051xeo~2UJY5CTln-|9>1o zCd-u|rcuQ-_RWdm{#AuT1F{-K9c%a?d{HOO!moxjhg#lNrX7G>Lx>_@XaRG2)R(F? zJ<>2Y)xx*IstS^>vX{pik1&HX&`ipszkvsO2*BWraa=I`xcV>}2uQ6S zs2jcIjdK#DLxrU(xTwgXUSwmK(%<}o9EjPY)=Y=Kgq3MXBP_wR+327=AU-W-Z$z3T zxF7dg7fHYpWl|KBJzqysHE65vx&)j!isRtn83kAr6hn&BO>4BcfObU0X+YwvrVLAh zEj3ZrtGouUWNGMy$x49m1Ev~Smq50~`KHTGk74}Q5F1l)o`Gz2a20a8+UsHdP{GOh zM1}(}r08RCd4?@L$ao($;CtY|z${BLa)2m)25R=#`>I|LIy6KEM#^%1leh@(v#+gG z5kAomI-7u{c&j}xkQf*L9R4@Kn(|aLo^O$WKgRF~No6s<&>xDcqu=~*u=%@ z@!JDvXr*ACi<=&2+ofi{*CGeN9QCzr-6WnF_+p>LcM?}4-^JpzZa7jc@s^po2UA|I zJOPL6NRH0;Ue=7PhNsAV*8pQ*=}c`AM7B&C-cYw@gL}v&l`BJ~n$Ki^R%g6{d--f?TLZ^5B9#b!xEsQdh289taH-&8HPOF#S z>MFOiC%XnIsif>xdOER3Dt?v68=}~qJcMdyP&oM~(y}6^ElE;UfqQAh*=&ur;&xGu zjEZ*@#<$I5<|a(Yi8tOi4Ocwr6Mv~sJXsp^WLMm!U2(WJ9IBal2ENSvcvCx>F#!DH z%H23Wim6M*E}0ToMrGtkU)K|qT`9#&W5~+`!5;lZo`0x&>geVnc?sO32(%G%NjNeR z9*I^7nPG`%j)N}plrw{qy87bZBHH&j@&~Xqu`iCq+k%;E$&KkX#bNHm{L*mK-Vn;e zRco4hf`2T|NyhW|O%u*VpbmDu66fkrd-VVK-c;gdnZqD3YSm_iEpr3PS8@`EgOmg# zDOPg$GW}#<&)j`IGv*li$j(SXV}^vHhY^P=ZO<8*1Q|Pw_I+Er$mlHM?(lc{rgUEc zpjIMoQV7T8Eu~!sVUN6Xysb;&Tf|Dt5K);8bWH-zTg6mha6_{dDaDDxL{>TvY!Wy# z-j_g5q)Ycu9@A2zYhqwa|AH(dz-NEPic_gI!bZ7}Yjho?$Q-`&zBru{6URgN{MK~x z2kB<(qj=us>Dtj}Ws;bRlq?Y>S1K_F!ToZet!~(TZWis z%X7rc{$Q?={d1%wF~#?onq9aBo!A_Q84Z~J$cH}PJ0AUnP75}k~Jk8SnhHnb{MYL$NERcDyGlXrWg*RoM&7p4zwKTVp zW_sDh4^-9UZAFnLu=M*FQG>RLpY0i3`nS+L9;~G(uW#{_zlDOo1=c8-%*67$px*&- zgd)b6E2*rz{9?`%J|uLv@I*-_YJ^={hqU{-{l~V9QAoX3FFvc5PR@)70AQGmabC2bpuUL)?{MFYv%sLtO*D;U!XY#!o z=eTFU9nV%qNY(6Kjr|64)dgn%!h(~~k{)7<^V|9!cq<}Gp9e9E-D_idtl0K9Z->{jFYGaEwC}7Pe z`&I(V#=aEBb;%%6cMRc6$u}~%PiyOpYuS@g)J*AWNZHp9=Epq6H71QnEFwDwgU47* zE%_934CxOl3qDea9vCm$P7!>K=Xat;_jBA;8fmS=oyk*vj)4@kG>}TeMFXi>U_*`D z#zGc!bH2n-j$NUCjAiv8p!w95H=2$Nf=tXFRy4K%EiW2@_K@dyjP+LYQ5gQ53&vs$ zBr>&Q;YT-rZks<2jmfA^d+>9X(V?RqrAbDh5|g&xIrF4Ga9rmr&>}K+ct(B?^jq4T zii*s*K)9p&gu~}xav&O3VCuN9%M?z;xs98po6#DmzsY?Cs>x62CRV{I2kSua!Na|r z5%+k5@U>1HgUk=1JBrX{O?rFQnqF3wZ->&6Taf^FqucLLb&IY|BU6gn7Lj zJ@e3zO(*v0Wm`$_F!m#8Sa6>XB8@KZL8>BB{tHe?kaUFvCpb5Z#{3{H5>}kQ@Un z-76vRyH9lp->{~uymKy=8YR^tp4_i}1ha%zybSIk6cfG7s3SBHr8^u8rbbTBimKT&8PcOH(fjNy~pt4$HXOidX70kq48 zPY4I()&qo=GUj`w?c`u8{$dWAj7Q7H|Ga#S)yn)qm>pyJZ9skT6qA$bS*+}+G&5(e ztObvjQ>C3f_{rolfF14(k`4W2RY5TwpcLt7f8+wjM+&Yvhx=S#vbsnh`SX>p(V)4=^H zg0DjTtO?>2K!4h=;L1o@C8Ttax{9QPv2J7krO_z#r>R$j={tEe^h@hN1JYAG)i~XJ zH5#a?4fW+<`5}^mEbzF+OSQ~_q3C)2&5Xf-I*x-G16}K7u;>dj z!~Le>ZfH5K4mH8$HldjY-EO;mzc_b%iLf|6! zM%mKTlm;mm6KWR6`>o=*e zH5{8UqrfxYMOdyM7|rmDJr z!e?DrmddoLgsp1$ErUh~BW!#%=|-bdfF(*JBo&^fMDs#XBXF3i-1HWtOrf7Oe=eC^ z#axIs{iB5{g!M3sVsK>)vp!n*x1YD4(Qa9wOIc_tPNp2053_sw?cASPwwuRKhZSXP z34BD>rKVmTX_hZIe!cz`ay2kPK}3SOV`CZh^gy#eNQ%Tg(i{d_>^p8&rt z>A$?*Iz*q3jROJa9(ichbh2p_RY`6dOgWs1>C226LfK405ALWM92;v+9uQV5iCsVs zSi8X93G%!N?qH}>wYueZsOYC?vlk!;r$rMrslYB+zG*!E3$wkI++!6gu_n&Zno104 zgC77b^{r*s=WsjJOkprp!Uh*owzob}8K1DHvrT)m*m%JWu#Lxg3-1l3fdkA;9h6=y z1L);E&Fdw_qSu9eDKuD^<5$MF^kc86@nP`(E+Uy4bVqu@Zx&lj=8eSrgPEUI4K9^= zi#VKLf%gHP7vsPZ*RRs-IYX6+(8}WerqOrIqfuS|pbggMF-N?%747&rqiu14ZF>Mc z#65s{T|^JLzFmb05Sqbh#P0cWl?F#Ao3?{%uC-I@JbRK}IS z#6-4NgleH}H-)E!fUDFHa{91&UDk(qrVh8nT7DFpTW$Xa;++D1o7~*XjLKkMiEW=i zL8V_{`2-w?0h`Zg>^^=1e=jqtH{p9h5j(F}XU*gJ>~z_t$Q8%I*Eh4zcenQ-kNx|h zDNX5zx@+vP0A9RcXyxyEX9}836)&0Bm#j7lni7jF0$;EYz*5SXno>R}^Av-k@Dn$b z)bIDA%1z^k13PPwQUe^(I*<3?90?w4g4^wg8u|i(!W)U!Olbj04{^OaF7tFU^Outr z!D;$xs8AA$hTvB*yChb6oRR7L9@E?lH1~OMi@w9+O6+d=DV%vv!+c;e^;fw53B|?; zNV)$BvQ3j?kDMf@^NHjG26HanBUR-xZ_!`?;&8&;VVHLnoc3;j*Lhq9o<@m2C@6R|QEis2Z69IR1M?5z+!WU+0 zj%aVt=Hwpg&zIv%X;f8Pe9H~jw-L9?(g#Yy69KyU%74uNb(qKC0Wx&j4_gMY^W@Gq z@Y3p)=326Z&Rr*!?(|f&E`u=nv!ZQ>Ljm|9u9K7H0+XnND~S9wip+^^>Exd84e1`& zH<({xmQfW#`1V&-fSj=F%Xz2%V-&2ZtS$A_a9b4F#Wb6M(FYxm?`kdvnFjhR@RM>~ zVh^bOe`6C!;UuZ)iWYSUODE*5w|t^PhN3fpK*1R7X%v19vga!Ieaa-)GI1FkSoF2a z_yGHcNo)Xp^F8R$;t2#>LbAT@+*8qvRuZhnBjpAF-=6u7+lEnOYy}Q3@cLBHcEsN& zlCN}59*3w*msCLE7;U^@U)-H6>BZKKL4pKQi_>^Zfg?p`{7L9NQZ?-94>00a2)O_9 z2hL>H4ac31-0Mh~nwn|H_JdN|JpP#Ve$g8UtE*uzTnWPsYGze0_JRqQsB!B=!Zx(D zdSE;e8j>NIH@cxn?y8aZ;JgrO8at*Ti#6q*JH&39}LXC;KwolDAd^#VYPo)(2j^sW|=zBPq!^+wv0lH+MzFA%vBX*Lnud#h-Ab%(02UGZBGz6|*O*mj-GLhU5qsrVSaAAa`O;}bXGcZE% zgE_{Fz%$z})tS>77Wbq~*Lf!fp$`IH_9#JdWE`<$Hzo3h&m|GUrUaHvE=1ob$=Vjj0nV+KEtQh!o z+YOvaCh70t_Kl~V<>h2}sqHwjM2^R~4Kf2RoCQE}X^pSl*Ym*e)ztykE$(?#BS}!g z9Y(A0xGc*R8}BOkIxvyn_rx5F*XTQsN<3bY5De4|k$FS!5Cl~_@C%EXFcW@V&Nk$9 zenl7=_Ni6BQPW!|09PF&4211^EK}j&SRj8@`xe_@qej+I@mXJ&p2eOPY|uFuQr>2U zD#>n#hI%F&FR`cK&&E(&D`r#unS%K`x8Lcx2oIQzn^b<1u2_wmrcuBPn#@u%^WLm! zj(4cW609|HpXI!D7I8ZZ;I@?{9-hQbSKgiCyW8glIH&&_Pd3ZeWZaV^{+KZ?5e;M? zTDU0ek|Ri%Ncd13#!-gMzKQAUBH->I^Kl2yugEwnbr?`)Ss>LjcROkkludBSbp7u8 z3LT)~>5?<~_HhWocCW)LXF;0E_6ftiRFKTrCk8kcQOpY3GfX^S**qb!T{hEqR9}T} z^u^7EZYAzf(57a~>}_x24K)6)2TH@5LBNHA*)PjI723#jM6u78Q1y6JCG+uk)r*#Q zXzeT_2IIC0-LuJxg42`|bjQo_vV}?@T$FVFV`Q1VKIx12eg#GiWRSocjKgp+pv`rO zYtz5if`cxMXnazUVB6J=DIL!Tp)$@yFJA|C(zp*@^jic~&-Lif9IjWHJ9nKUXcSnb zLj^rC5-HOcY49D!j-})qaE#T4gZ?ax2$hJ^`zYOXI|)6Amg+urQ`~I5?rat)S~=WrPcInh{!ku8n$hZ~j`R48rt1&L2veOCe}b6D6a&Q|(}3_Wn@}-NyMU^Z zmH^;mda*w>1ILz8WheEP8W)<2)0ANKik9(T8*{ZUKpZXX^vAW7U3?B}LY;$VekbAceCaf3-s2>5)-S#uiKWuLML(ixdN$i+ z{{oS3Oz2kTOvLxW%YvvdW9grz^q|o?A z6aVs_>U z3hUJ!Yq(PWc3|R;3=9NFynZ(RUdLv~r@1j5gWDA72i0Dm;LOL3S?E)`7+}C*eU&vH zz$4n`P-PuMphEjb+rGqcPr*$wT7tr10EIc*c3wL84 zQj!%#Xcu9zw6s9jC06nnh*ue!PYbI4{7FXi5~LuiuC z?--9K&jj+tj_kyNcdsNyO0T&VQ@JM)xi=G2fLq~tCG9uKi`hVlBpSA;H}k%S50Os9 z2BUv2hWxaEYzPJ`_Pxv;%n&+sDtxQ;G<0Jcu{@EqDb2^&pXK}#^fBHyxMHeo6?vOI za5jI!U{pHuakrULL2?)4P(p4rFwdLzdD$a0=}@>{2OH&S zX8=gMYUV#C@^o~9+mY)2Q|2mam7C9?H~0_vvk;nkHds%G9(F7Qj-g|c-mGQ6*V~3k zE)Qn^A%{Dpmz^_fzM-;%{VB;nPG`5n1OKt&gNr-y(Kzndn3hslo<|7}AM@_?-9_+h z$k8}snxr;ex}|ZPRp)w>;%o6Xwe&Q8gz>Mlo6e9$HDtgND&9O6pB+jACoxY+&P0d6 zxStyg-DUM?hvgRVRj_#p_l^o&mYKPWrSBw`e%?ny)+E}R<>aiE>@Pkkw|699mcS;T z>|xfi=tN6pXP9tB>vW|3?1&5|B-R#|>743evyTS?Wx@d|iX*pLiK%2*?}m8eFH{6O z(lh}Q>Itr$h)lL&&&y51fZxyOLJ6_TG~FJyxUt+X|O$6 z0NLY&LC86Y`!N^_HK7-cKVjJUh8(xlaPlx|lxHRd6hJMxI4)Oa;wx;+h8ijSy2{j# zFfY-3I?ha`DzY9!B$DXas{+4hWTR*>tutiJAZr*J6k*7*7<@g2du1q2S5kG>(VS(q zvk?mE(&Kxr#BvZb zZ>mhEGuUmh>_`v$DWR$@x15c)SWe+ui}H640K#-4)+PyuQ;YHgoIKwKmf_?$;8!Vd zCS3()9^nBB{6P?V!cRGv4U?4yi|An7E0{PF70*_skuU9DC$l(>*^!Impb9ni#WRv@ z4J2(c_n9)S8a3lx1}_xdBfGNyHJYlExjIrXP0#Pkl9F|5?rI*M>tP#`fC1sDIC+4o zW+#-LOh9wFzS3k(18na6MEfT=d*TZF z*)c`GBJ!>-;%nnTGF^{+z9m!{%Z+gA(|qi41{%V%4Jdki3(nUijuj>tvLk9tMPW2t z*5ueKw8(ZliD?K1`ajx7RS09I8mocd5C;tioEQwjdQEUsq0o{Flcckh_^3r?ZX7`8O zYMQ;RwS252mZ7+HS)XMvgJS68wyuXg@J|-kmX`RUDK`?DknmR`?xmF2nuSqvVa*V9 zA~P|-_KgAwbDt03j>>>^CjGZxKITurleC^kci1CC7D&QF*Q3Sa@A;1e<)~0-$HVb9)z3NjP96mE>#VZe^3zGWI%fLE6Hxox|rA0Ha{+EIV0TaI1 zdBxq9-tnBXmbf}eltudyu-^4Eug8uAb=6!$f1v}*xTXC3*Pxja9 z$F_=XuGdv#wg7{)sGOaJbucAwonD3SZ4#)|rcEJ+3LqZTR9dQ3{36ClrkBbwS!;7E(GTon6;+aXnj-2L*&}otXH8Iw zFi4+$MFW`sdr+mMi8GaHP`cxzW{IOG{>_fpnZ*@4JLubvUwnEC)!*BT8o++Mj%wr@ z4KQxU6-?j;PbA*~2?L#El6q5B;!5X%eKxeyGLYutB0E~}tg#TH6Z_z6wZ;m|x5IFq z()O*&`2w3F%li$Dr@U?Z+Z<>T(lecmRE;H0GC;NO9qDB5zO2F(F?~}&OC`5YZf^|b zUtfW8CEZ<%1Mr%N?AH-wj=%KPC8j}}VuE#<-4Z6r6}g9VERTbDX5>=JKwj1x1Mu4g@c^0ot!LM@%zE}Wrei`9~sD=%m9M1W#(LA^LYGyE>+!m zBwZUI%nz1LAyf0|)p@aM>@k3CKU?!Qht@vXdbIp{wnsSXnD9Un!c0Jb(K2n1X zJ`w;NPJFj_*3Z-k+tyYLUh7y9 zV0?4=J?6@CX}NW_l#^-k@9K=~DEH?=-c}q3oGfOE>vTR}>O00Bbl`Ce{<Gqr2n3JxqJC4hHzEL8)pr3l#eqp+pBnyV`0mK*x-%nXs#SC4rwbTOVCPgOdSn-Y6o zJ_G4Sb-nW~c2#rzeLgY(Io4xO1(leH>sWdP}#pt|{NSj87nQ~RIr`HDI zuNP2b9U~FG@Ekcj)VM1)*E1dby=QoftK#w3WAIy((+AT2S#I~z5U^;2`KMwWG~XGJ zI~I8+YX6oNOYc}N5KAzfQ-+2JVhnCthnI}UlW^D9be&knyr9eYhr+7JqMrizo^(ll zG1FUP`fZytfdm@xvI)4SHhelvRaxt*YJDGAzJ4Klb~gwSUk=194N>Bw1nTtZ`2Z{| znnZ)%5&l=>=#ujFCdmNSAg89UJfr1a3QEcA%oBZMlwvRns$s^;oo;g{n@^K3HMaTy*F{>Anw&j9UYP`4Lhj1;^h1GouHF}i z-!8&?`+=$m8KSkn4D-kAAaCr!S2APZW64TGLv$ilwi(Kg&DQ9$=npuV| zGt}8Z0g1A<1w{w-DPPp@$vCVRH&eSSHoFsWQQRt{?>bkd1p${Clf6Y`Q)K##0GlXD zw-yxMrl5tz$5~IMf5cI>%(+-x+{1YEz(~w1u&F;?TIwZNx7iZ|R<+>AA!Ju7UL$96 z^Y-0jYlHJfZ9Rvi51|Zh8)!;cz`SY`^afx+R^#*tvQBWn+?l+h*86#8T_CrJo3aZ5 zm(DYpx@CQHO03jXB5|Zi3!(za46-has&h6vzP9pbMr!%PLW6R7Ej}#spT-_EUJ_&L z6=kZJPlg3E{YjgPQ*j=dNelfz;UiVi;~nlx@xf9ifM8WHzT1jp=_h~g&-fFDzQ?np20^4PCr_&9 zz-vPFoXq{*bCtokYK{`_~X%J%?^O-KZs^ZCvuS^D6v&w1N%v9+2o1L@}Z9NUmj>l{I;pgX(?OUngEmY-3IZwmf zFX40`r>AemnE=!l;Gb1}PjvJfI8X)*X+jvZ~pL7Z@Kneo)j z;nVnE-8^$8nE5H0-Jk>1R>ZxAGYvi6qZpS1CZ1$p zg;3VWwJOj8a!t)GPz#AlXyt8K&kY=`TE|{j zi6nAl60hbd>o54c5@Kaydde5PKCL77wh|!8(6Q;Q!-?nRZF(d#EnUNht9{>gWx$@ zjAYJmp;YUOz_Vqz*oHxyv4|x>Out^@J@e^lKaxSMI56T^G`Xd+U8Qj9PNpuh^HtO2 z#*BC8Wo_`jhd=Xayg)3j-mi3OA?b}HF*KEy$fUs@!XTzeKF{$;rv0tfaDmmJGtsa}r1hlQ8Fe^C zFHb6H*nnb2(&1suW%q6UyrkO`(N7Z3gxn(hz2$Mlj0YYzEnDx*$BHeFr@#?uNtA=; zH%-8&FYZ&Lqr*4Z1bpH}H$Pz-vz+`RIA6JFw0@D!E~kb}?0Am-lPy-=pvr@Yp=<@b z>Nq>fD0WoxWJz$Sm0U1~j~<%ImQc7A_9*hJ*E-wA6}FAT_ZKOF4P~&PU#0eCet5bm znO5{^TCKhns(+_c5N&yLoOYIp-wwa?!03go>N!BtVg$d^36j~W+ZBRk6xof(}N5A-0*4XsSGqVP@97x|)}iHCoC|of(ErCWG{FqLktmyn|j7(pERS(Ap5; zxlA1)P)Ztob|CD*^R}q5ROFqG8K?{keU4;r(y7%=+18zSeJkI(X)=umQP)E-H?!E0 zTuo&KL7}E!HRU3ZWc)sUwJsmAds!KIv~Ouh85Jl>gEQn z@ZeGqdPGBtEIn6{#w{6tNa@|QpiZ}5_oe5`4!Y- zF?tE<4_h5gKugK_TZ%*;zIie_uScg(u``_Y)*^v)sdX%`lUK8hSA*Ip^qY`cRE%>Q z>^uEYR2ca}uhw?YPVWw;0)0LT4TIwqJ#wy7zxf|#G|WjM2yF;##xPG&M>S;*H||VC zrHM`NGL6heZMG50F2i%G@SGfheqI&&dLnhC8kMVGx#>sA&cHV1_fMcA_lQZi5C5F} zIT+p2w=Y2k344TOY5UA-)`+%qowIrMXYg#ZTbS!*7oz0c>~i_P&_e6Hd#(Z4 z-tXn<;-T2{*iiBn5vdsuCyd(A@l?l9Z>;Uh;e4|nw3(`l12NmSE3Lhj%Scw*X&w(> zHuHF6hwRQmv|M2iu<5cK=WuGVWW;=Ycx>fgJlp(ubXJ{^x%Dv#Q?uYG=5cSQ-b-h1 zy01adf=UG$FWE#bTF&8 z47hzo%U7Y_t?dI*u^!zB^v;6P{SYA<57fLO=RtgL(Rl)?3H7a*mJD>>+jbeZlJonz zS5dkc^g|H)JN3X|?xlA-QFR%d2Y+H|aeI!Ecej&bqqK+f5WO7Hjc)t}^dUu_wc|@k z@i=U<`bGx%V+<-CyRCp)Okp*I-dm|XmgjV1?iEwAwI?N{K(BomZBb`PC)-@n348Q+ zwEFRG*oWq=8*7165>pa-9Ez>$%<#ZheTGMGoMKN8&7Dv2V;2~E9o%OP^B8ABr*UPy zm@uA-hxNfRH`Q5cJ)odtq*Q@WKTwvlAJ5tAA~C2!RIk++IsMSCI3$Zl|H(R^n%#kw ztq66K3JLp2YhY1uj5RaXdG4ght-S~sn#usTc3LEyQk@Jmy86n`qib^1N4jI5-nz4W z^WlwSp_&YR5>2fRK?}r)B+VhBiu>-bT1RL6P0kV_t#ZdU*XKCucuH7_L4YW$aX??)nn}s8W zqQy&uBuq$K+$fMl&#Q!hklDyW!>w^oF-)#@VdFx~v`ZgA$Wyi7D#^yAS@-}n zA%uyXQfXZ>08R+?afJJG^Y9_;uOvH38_Mbi3Ze~P**c13eW5e29&Mc1KHS$j*^A(N zYHU$F`kTZp8z%yVV41#JnL8Za6Qf&3sO3O~8gifzN*16d_=3PZ* z)%f63N+NYnw;q7LXYDwL7Mrx9mWK`;rvIGMLABqb^tNQNb{n(pXEar`yU^`I@AkvW z$e^A0b^6`cO+V8wMQMAzNdLlu~AhdE<(--=<=Lj1-wc0(5+OH(}=jMW(Jpa67 zL)#LtO9c-daOR<2oqTea6cs_MS|Prp$)$aZX%B?N=xUL-0j8iUIl36!X7q+p?=;i3 zh4jI`Xs*QaYR}wg`7W61(PkC0Lpv+VHn%1ih0qCLCi5)jB)g@zPOwzJOo+d1`&>f) zMbjeb!HS#_O7wmxvV=euLR?1e$>~V5ALi-ZnfS+4@8H~Icmns%fo-g@ABkUdwlwu{ z&H_TB`LI=)281d&gqw_Rw*g~9eI&Z3t_V2IK>vlEITZc2QZPl>_ooo(AT_gwrX>Zk&%Y}l34z}J4dob<+c z7TMRcj4Jn&j&`J2^J=kl^wMBQz8@sO78{XJRo zYV$`L_9*JGT8E_?7t{EB=9u~`m)RKBv=ta0s7QjMWN2szdfXdZ_CR4V_*oY6nV0g4 zQ}Bt>4xM9o0?M`7Hu(Xq%tYwFl$8j0L=FO~LuIjgQPP&<Yefay(wZMK zE7U2Hoa4L^gKe}p*{~SD0f)CR(VK7gQ%{K|FWTv*OZnW#J(6e)QKF$%wep7cyTbyv zc5#2cdA4bVdRbOJZuz}M_dULrNSz`Q{9j>)ilan;*`KaFWw z=sMvIfqog9ho9RPglZJjYX->InuDqL0O(V(QF|%MA@PIcXS9Zl%@RCkdqju7OudIl zhv-7zD2Gu%p3cI)GR@ON3DjRKBrU0jQJpig=owik#*CHN=X%+ltNze_6-X*_s2Oh- zuE|oEHEeNlSrd>(%gY<64a1q8?hj9YMm1$Jzo{-;DlzQ`{ZBlg&nR-*a$Sdk>O_v( z;W(LaR*V@8pHNvt(Q_m1mL7&fq|PY-i* zx&pFgK&eN9@bEHWt!66n`wlwQ$%sO%w)04)C+Hpno4@z$D9u`1&H$u$O8Sk;drGo>_T4vzk@pi&;&-G%B*N zY6|NmxWD3BCPOn()?hp#$+Cv0zh$G{fu;i2HmQ&R@HQoX|9Cc)(&!tM2xymoK3UD|akhF_WX$HdlIiB(|FP1}e zcWFETc)r>X&b~^aDx?-Drhtd6_tXGA%13MGK+qfxn}e!Cc?;BYYX$(_75K%_y5EJo z20Csv5Pgf`=Yd&SQ2`j5@xJeCxF4+PVktk-X$%B}4WJ>xcA?2FgPLWIbT^2@8gZf* zK;!=F<$xsH#pmY8WgKvrV>WeDF>AS(gQG^x6Bh^fVm=0N*EgVjmiw-cdh07w;64=h zC(t{=fhFN}Ik>Zr)y(}UAd6wXfNymhXU21y1<*gh75T?=*7Y0yH^%-m7ZKj*Gw%&P z2iIg$=lgB{%`TV}Z|JEh@Ra+m8Qg}+fOJmaD#FbnKk`@~Z4HDaa7Q5b%iYRniEDsH zh8Kd*3g=UmUGL8KiQ)CLd=6QM8|owB(!$Sk*fx)k5$yY2WfLm9F~Ls>{7)_zyx*!P zHyPm0|J>egU>nES^Z4$rk52AGb$4AVjv`mY-PbbiLITANei&fMzQ0~v3~#VYs=~p* zO#l)vg*)aWAakT{4V-{-?|@^c`+m8*jQfcvH?ixI0`2+94Ts<5BbRsmWq27N-W2;7 z!#)`c=SbnQlmG2{TM`Yi|Mhw&ahV=)!)(Fty`_Nv7hiq+_~29-9(?uSH`9N5IDPh^ zL%saq&!6YC1U!TPDw8XBk1m^o|qoTj<+=0jMg?>tF7l^gWs(7oIk ztl|7tf}EN&*_7QJ$q=3(BfEvtcEO$^J0 z@mE!C;)Y?Df8gm14}FZaQ$1je8swJuxo7vyc5Jz4nkLr+OHg$T{P43Z|EQ-kbQiwg zxAt|-@7!dGzchFVOqtyD3GG$@&WB>!8t#6oA~CJ~1B}C&1C6=i1K-jB|LQLH7~mzc zxh4H6J>555K3(?VJy+x3M*{Dowt<@v3-C2ug^KxIY-1$+=f8mI+z-Lx^vr?+TCK|3 zSV4uXzN#GB@}lrQleuT>e_i|;Dnl0u7ZSo*D1WG7hAbf{$XK;ngPMD;)BJ5EvOFqnB{p6e7Ymo!(`(oqE4D5Abc4a-Iz$RqJ$l!tSOmklBX5%xl zSdDu&G-!|aK&C+E^VZ=T;3U7g3bs{lN&-HJ28RO2X#7ltcgh}&b@rBJLcL2E-rq5W zC(H5_myH)J7TARVuVZ)eot4U3Y#>n^M!_3mi`|oTVl30_@5cy)0|DH>GX$;<4^MjhSvPveesoHfAoB0FBGo1>Tlo?m% zUwPZF?iyxipI07`ahuzc=8L9x%jP*=!&yM%f~1vs9aFj;N$~VKx)oy}Z7N%cLD#N? zGm9}h6uE%m@l-FW;##IOnNV94!n|wF#ub{rbwyD%x_wxvBf{U3%)`|9D90yw$mFv6 zD%j0>_{^%AnU&-5kZv$5^S6B)zGx=EREyh2V@}6lKl@c47QN+O{#8h)yVCI?Utx?O z_R69sm`msLJ4Rr!mW?>jJ;C_}vrz*(9Qf8ii?lEIW8Y+!Va1LlKfKCXiMNhrSE_De zQOQ%`p)rr;H-JBQ;!By&_#_wyP3R}Kup{wP zoK&P~eY05z>{idD^dXfn%DdzSFynb@nKcsV_^yyA2`2#HsYM20oyuB#kHQHYH8)Ul z0S+w~%25T%K2?B@1!57W$=i0Y8lNS78x;%7n!QWp6Y$g!&iViw*A^%?Y59wz3&AI! zM0jsm4+VJ7NUPGI9lgm2$9i2l8+UM6F4!?R{&~9=t73*FCo^r#U{{*o<2uabUS-P^ z;FpVb3RxjGKz!OP@tM8(zoez`Alnu&Tt!m9UoEH*VM$HTEo zQxtn9j4iI`_Q}O~4AddM1l)a%b4p#=WOfR!lQ^OOOARM986v<(XfjV62^ms3sj_Nn zrMrl_E~I551GFfW@~y zK&ORxl@OFUYO6>H$`@A@-r;`Z=P%Uz6?idy)$>xf$?q7sfL z#1q$;Tr)|ohD!-YV1 zE=OBL*`-(o`bLDNiP0Fz%%gy3gvY;$VU0vGem2(>(%t`&Fb8^)@YtdlKU*9R92_t_ z{uEl4Nq|iV!3JdW$T5WbP{!L8b0!(=9d?^ECBd|BkyraA(T?kgiU=IsnAtOBxvP)>TdbqY0*B z+g%Di`Vvl0YS0Ry5T-En8C2U+kHlE1`+Et%3&(GV@jJMN+$BFsJ4!hr@sx^tT9_dUxb7C-AALS{zd0lkIr6R0DN_ zB4EB6U)Rw>ssp*}(OtRa-Vc>qg2h;W)1;>D&y-K4;C5Ae%Q~jPD^>3!&iAu@?2p+1 zG>^ZZOUj^3v9b&)B`__u_9Zuq6g6CYS}QnY9fi4t%rR`jZ3_R^%3$PHq4tMBW;XL@ zWM7E+AYcRdrY<=5zN`!)`UZId6SHl;u(rWs=|^B?rtflQLY;K@N%$n=1F7$X|U2vRFE3j{;BaZ5xl5iD^_H8h(TYV9V2a0*#mf{Dz=f@AcLc^N^NJL_a&4q zF0=uyNr*=f--N)#G`ZS6!RwA3|J1iI;!1$|dF+qNh0LW>$(Tl_0b@od_tD@^bjr zUWNB2q}sqY;dYIIvZOO(0$jKNUuDza?AJw^0^nj_FeXVtx-ypyW)~kH#3LQL(p^ci@c?&>KC6Yc5E4DUh{m($G5Tch=F~Rw5$3@4bItJw0l(Cu>RIf=gU(@ z$4=5dMYc1S1w7hVCNBzOElZU12U&htH1k|}U@BTiy zXYk6jukNO#n_nAnyY8>>*Dm^D`uPh*|F;l0pr#ITSk(<6`-AZJ<`C*5v;LKNBK?ss z3C{NS|M?32k5R+D&0^*Dzx|%LXMg`(a4+3}Fl@R=1OL;)wz}M-wQ02f>z4T6YDjG? zkqWqc-{-(>b6}(SB-O?lmf-%ut{FU@RgkLkMRBi;#O`^z?QO6cK$-vMc?9_Xqt9Y=q^z!n)FaH5$Bc zNOz!uN8)>*h{lK|F!Kr&ARFR>7NQKuW#t4L=}UO|JQITGu5?`mbYSYF22mCyd;STn ze5oa7B7Q3g79`kbbou*gt6-z{Pf`d5dbcFaoG^>ah%ic74P57ux)*WW03H$Z>v&o^ ztmENxL%L(N2RlSnBvTY4u_bDx@E7v8$XNLU>$Vtab?<7PQJ;0&R z!nay;`B3StG=*}7V5H2=4Io1#)}X5hd*T^PjtS{D48k?(id<^&7Oq7e);aL8FqiNb z4fjB527aYsx!aOK3LxlhxCAKN6##c^FkKhIZDM9iCY63kQ{UP~5!Y_imec^)rH&tL` z`hQggy31woM%~ZI0@*%TF?*k(*}tJULhzhPYT@G*jS&2G`vKiC(a-1snO=PGQa$4b z%&3lj#tZ07`yaG`x{2;kEOzEs<=pE1zsUg2Kl*8&=Jl4V715kPMO%mSXT~bUB@(}o z?#P?j&G&dLANq0JpxUYU(b4yq5g5C+vSN-LpJ?#2rD4DjD|O$18h?CR;cQUp=+KV?Lo;e4@9|}1U;2CfG36=DC zB}C6HHrEVM?idM)}t=kW>D(J|77)O1JZ`>7)eG?;7Wl zC(gfD@o7NRXu1u51#TGU{Hsghbbl=@=5F5i#P+vn4rlvo+LaEiyzm&p-GIZyr@Fu9 zon5-W)`$>D>2kV1{3RJoW&hIsEgH`0{#u8Xg`br|hzW^k)`8cuy;=@;ss5aOIk^j` z`a_k%vT)s*5m`J%BJ_GDrXB6e<3oPL0vn6ZA?AJ)j8=ogQ=4pNqd$26yb|j`0TZ9w z$|M34A;$b2Hhh2bG+|$N19L42<~WFoVcgf1yQ^bO%V4t(=D%flUJZU{FXR;}SpRPC zpSJ+KfBT884M&^eF!26)LZ0>hv5}w|X7~B5e;rS(e=Wn3?}v0J+R5HP{BGXr6aSs$ zcZvVPo{0bcIGG=C$j2obLR?abH^Ar~Ye;>Q?_Df?%%w z5p0AALIxjHkxt^F|GFoxDjA(PcbK3 zf-r2X%_fFMo7k?Ct}eAZev!!V%0WCW(G=Ht@T>TCuwa$d3f|^}R?SUF-@5-lHe{*2uKeW#d9G6ET>(fc66F(`Z*d*Fp$FWY1;2s8n#73uBO}3?%hg1AY@w6 z%wI(=6T-4lp6DMXA@!$-c`p86*|Iwk=0y@lMmLINoOs?tUlJK(QO*bqdMT&EKr3Y| z_%$#T0#ZVqE>zvM%)rjCl5j>sat*>?>oyWL(cM`W)F4I{aWt2z;4&}3ZE?+nmbJ5+ zw#5hm3xO{ot0dYe!aWDVE$SCB-a4^ULY#(&qJhhek(H7yLYo&;_%e3pgeI_PqX(0)u~mkgwK#KKVM7`k+9G^F1P=^8j9b z0LKR7GYpHA&q@)8kUl9QwTOTYi&=r3ORR1Jn6k6)LN>Q`TPT z{?N+$<&^LYWq>(rm3a?9?FLLk%Okyolrna%zAGs>COkYx~LIJz0@$_Sz&|2#^B;Iz`ABrM&3ipNatb+uY+g>Jgwlv1_njB-^5D0qX zcQChZPFXc@lJtN(yo{klnKyyWm2i=A%ZC-KsZZoWO;vU4r_icSI#KeZeSH7szQnrh zLP;r@G*F5J=y~T9mist+!sknTSHbxb-LhwWiD%Uk&X!0Dh1htvlmRcx_}Rr~Lx zww!V|V(#`2AyG^5#Y}KDA>yV8M7e$!m5k=Omr`Q`kzU0I41N=GU&`HC;xC3-h>Q#& zHA3B(q6rvmF}qA~02!yhMJ-ZvQS99b(ktmatyhIVPo3vvofF7M5-MM19jX)@z^d&* zGIUEs9uQ`?k$+QUK84p%b0yrPU7qduCr6A&pdn(c+W8}}2wx?`=q+!!9rR?m0*0ce zyu|%7z+%Kw5b_B_G*1)hQ&yrxpWKUsP6y!~5RAb7tg;5$^R@oa@5uZ}iAZgf(mU&P z517|r9q_7vL-#8&#Vk0IZHD&x!wR5Gs86ZL*8+{lRf4baY?Mqh(ikDWc}ofTLdY9d(x+sqb-pYxTp$T&p%fg(YRr9kx~u{XPjI6}3Z39f z-_H9)1<)6$4nRX?TV@wN329fo}S_OnXe+xPxbRV$28BIEmrqijK;6c`zi!phzoeS2m=GLeX5~h0$Dh)PPP}K6(Z`j zVEtK1OFp$rVV)@=@58%_g#1w0zk;flU3B7?Lk*rHGX%DCONGFB~nC~EssnNbooTw^z5wnh0 zLxxt@533>H4M!PjeXJa-Z~M>|Dq5bPoA|^kxd$re4$`K1-Uncn93_2XmHd(ra8}7u z2JH(j1L!4W@jc~i#oFJQv)V>!;fDmE9|lpq)ND0PiE{s@ju9jknT8PHHcMCk6$qay z`~v$6Tr<~1iZe=X8K-ANu8BO(B{`9IZdm~I`j@MhMPOBWvD_>ZF^SR7oYFNm@+R6a zvL%dPR7D@qQ6og4mV6biyK^8Dbv6d5J3GP+3lK03p*Ob_`LyTF-|7_%{l17fj-Q}h zQo$FHj+I4T=?kGz73!sf`}$NYxmASQ!Nokeys83@CLV>*gb-~YZjTOwzv?@uLu+VE zV>uPXJxHnuYH>J|C4sZqTJ(y_xG_w-K;%3NBhw&36(Y#sdVnddJ{7d>f}l^?WX>?D z{g&DGfpHRpRka?}$0^VXvZZog41>j=Bm!)S2qa#ErD&zdJjieOy~bjmy#Qm}-JZ$! zvQ?`7A+V+7M3bQ5BYO~t(uZ`LCfg#>8zHD7id-zkbJTx}87+{j3e@He1Tof|r9OwW z!)2Upa=IAjY?IgM-1S-sVSQ6aPA0S}8bp(S=$KEfA_2&3bURerkTBdQnj}OZn%o>p zQsKF{IZ|oVhQVPYh$gQ}5h)>8Bm8|f5E+DUSILu7@PHLhShUD8FB-1FZ#qyOKWGhf zFmnAOiAxgzM6UPwXGRea8j!~rno#&oQpqnwl$rpnQDY_#W93QcS`g=+yrcTJdoo}9 z#65XI&CvK`)p%1eF_RleMMV)A!>MWw8YM(;$c0d=)_m=Wd$Os{Q0*k#AGYs=)yXm! z?{-ffkeYv%ai=Tyg(e*m6HWs-CvUeZKj%(oki30*M=N16hlx)7L8?S~{luWhxdP|W zwulJIKLQ61O%!tl_fT&TRKA{ZKpKWS{Y6!gvpR*?AeAxu4WE#5pN9GqpgWV%L2fHU zi=sFqrCSW?An2YM8w748+8eB1*aH@wAJGM&V78)LNV!2NSgWho%9M0EZK|UaD2h+x zM^~BYsS)%tCAn9JYfKBCxF}KYh>BNXd6UjG-^bPAV%?W*Hn1XDM2YJ5oO z&Wp7@wCGI&Chdo2e2?@McETbtYEaTY^k`w( zwan}P67E$gyM=q^P`V&G%?otcsajLe6IY(}u=!nLQKB(LgeIu422Tfc_hd&yctb~s z$Rep;10X`eI9rK-iIuk;lGMTe5PcFF4U&4!7++jnR*(Ololc*{yq z(ql!tl#Tj;@L|yAj&{>9oA(jp-fZ*SBFG}GSiplRt{++�X7bX{jh89kGB9Sqt!4 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 BmO}sl literal 125900 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%0AFYNT*g3^K}Dt-2L|vq@rY51 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 J%&^tw|34YE9Torp diff --git a/backend/tests/data/synthetic-dataset/output/create_final_covariates.parquet b/backend/tests/data/synthetic-dataset/output/create_final_covariates.parquet index 2fbf64d58fa121f0a3829096e58db2b8b8724ce7..0c6e171e8d234a847c45ff96e33861dff31d5cde 100644 GIT binary patch literal 61941 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

2UXk0w%!nLW_RV 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 literal 57679 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 P-^jbaF*0(s+2a2PB;rxy diff --git a/backend/tests/data/synthetic-dataset/output/create_final_documents.parquet b/backend/tests/data/synthetic-dataset/output/create_final_documents.parquet index 2a8e037c7bb79c62b7b0af50fa2f9dc810bf40b4..19d2b0a442a1434114614d95d7bc9f089f252036 100644 GIT binary patch delta 5292 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 delta 5375 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 K75vQ#?tcNS9&&~N literal 23273 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 diff --git a/backend/tests/data/synthetic-dataset/output/create_final_relationships.parquet b/backend/tests/data/synthetic-dataset/output/create_final_relationships.parquet index 7801f78843dc50dd7deb0b6d4a1cba683888d9ee..174d28d0f535d65859356b2553969d51c3b67580 100644 GIT binary patch literal 37740 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 From 82871dfb9112b9e341be33c51b35aeb3c3b3d83d Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Wed, 5 Feb 2025 17:09:32 -0400 Subject: [PATCH 23/28] updated for build --- .../core/apim/apim.graphrag-servicedef.bicep | 2 +- infra/core/scripts/deployment-script.bicep | 234 ++ infra/deploy.parameters.json | 18 +- infra/main.bicep | 56 + .../artifacts/graphrag/.helmignore | 23 + .../managed-app/artifacts/graphrag/Chart.yaml | 14 + infra/managed-app/artifacts/graphrag/LICENSE | 21 + .../artifacts/graphrag/templates/NOTES.txt | 8 + .../artifacts/graphrag/templates/_helpers.tpl | 95 + .../templates/graphrag-clusterrole.yaml | 13 + .../templates/graphrag-configmap.yaml | 9 + .../graphrag/templates/graphrag-ingress.yaml | 52 + .../templates/graphrag-master-deployment.yaml | 67 + .../templates/graphrag-master-hpa.yaml | 32 + .../templates/graphrag-master-service.yaml | 18 + .../graphrag-nginx-internal-controller.yaml | 13 + .../templates/graphrag-rolebinding.yaml | 14 + .../templates/graphrag-serviceaccount.yaml | 13 + .../templates/tests/test-connection.yaml | 15 + .../artifacts/graphrag/values.yaml | 135 + .../artifacts/scripts/updategraphrag.sh | 65 + infra/managed-app/mainTemplate.json | 3595 +++++++++++++++++ infra/managed-app/managed-app.zip | Bin 0 -> 31357 bytes infra/managed-app/managedapp.zip | Bin 0 -> 31357 bytes infra/managed-app/openapi.json | 1 + infra/runbicep.sh | 35 + openapi.json | 1 + 27 files changed, 4539 insertions(+), 10 deletions(-) create mode 100644 infra/core/scripts/deployment-script.bicep create mode 100644 infra/managed-app/artifacts/graphrag/.helmignore create mode 100644 infra/managed-app/artifacts/graphrag/Chart.yaml create mode 100644 infra/managed-app/artifacts/graphrag/LICENSE create mode 100644 infra/managed-app/artifacts/graphrag/templates/NOTES.txt create mode 100644 infra/managed-app/artifacts/graphrag/templates/_helpers.tpl create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-clusterrole.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-configmap.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-ingress.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-master-deployment.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-master-hpa.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-master-service.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-nginx-internal-controller.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-rolebinding.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/graphrag-serviceaccount.yaml create mode 100644 infra/managed-app/artifacts/graphrag/templates/tests/test-connection.yaml create mode 100644 infra/managed-app/artifacts/graphrag/values.yaml create mode 100755 infra/managed-app/artifacts/scripts/updategraphrag.sh create mode 100644 infra/managed-app/mainTemplate.json create mode 100644 infra/managed-app/managed-app.zip create mode 100644 infra/managed-app/managedapp.zip create mode 100644 infra/managed-app/openapi.json create mode 100755 infra/runbicep.sh create mode 100644 openapi.json diff --git a/infra/core/apim/apim.graphrag-servicedef.bicep b/infra/core/apim/apim.graphrag-servicedef.bicep index 34e8e02e..15db4f7a 100644 --- a/infra/core/apim/apim.graphrag-servicedef.bicep +++ b/infra/core/apim/apim.graphrag-servicedef.bicep @@ -24,7 +24,7 @@ resource api 'Microsoft.ApiManagement/service/apis@2023-09-01-preview' = { } isCurrent: true format: 'openapi+json' - value: string(loadJsonContent('graphrag-openapi.json')) // local file will be dynamically created by deployment script + value: string(loadJsonContent('../../managed-app/openapi.json')) // local file will be dynamically created by deployment script } resource apiPolicy 'policies@2022-08-01' = { name: 'policy' diff --git a/infra/core/scripts/deployment-script.bicep b/infra/core/scripts/deployment-script.bicep new file mode 100644 index 00000000..a9373d93 --- /dev/null +++ b/infra/core/scripts/deployment-script.bicep @@ -0,0 +1,234 @@ +param name string +param utcValue string +param location string +param subscriptionId string +param tenantid string +param acrserver string +param azure_location string +param azure_acr_login_server string +param azure_acr_name string +param azure_aks_name string +param azure_aks_controlplanefqdn string +param azure_aks_managed_rg string +param azure_aks_service_account_name string +param azure_apim_gateway_url string +param azure_apim_name string +param managed_identity_aks string +param ai_search_name string + +@description('Specifies the primary script URI.') +param primaryScriptUri string +param imagename string +param imageversion string + + +param azure_aoai_endpoint string +param azure_aoai_llm_model string +param azure_aoai_llm_model_deployment_name string +param azure_aoai_llm_model_api_version string +param azure_aoai_embedding_model string +param azure_aoai_embedding_model_deployment_name string +param azure_aoai_embedding_model_api_version string + +param azure_app_hostname string +param azure_app_url string +param azure_app_insights_connection_string string + +param azure_cosmosdb_endpoint string +param azure_cosmosdb_name string +param azure_cosmosdb_id string +param azure_dns_zone_name string + + +param azure_storage_account string +param azure_storage_account_blob_url string + +param azure_workload_identity_client_id string +param azure_workload_identity_principal_id string +param azure_workload_identity_name string +param cognitive_services_audience string = 'https://cognitiveservices.azure.com/default' + +var clusterAdminRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', '0ab0b1a8-8aac-4efd-b8c2-3ee1fb270be8') + +// Resources +resource aksCluster 'Microsoft.ContainerService/managedClusters@2022-11-02-preview' existing = { + name: azure_aks_name +} + + +resource clusterAdminContributorRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { + name: guid(managed_identity_aks, aksCluster.id, clusterAdminRoleDefinitionId) + scope: aksCluster + properties: { + roleDefinitionId: clusterAdminRoleDefinitionId + principalId: managed_identity_aks + principalType: 'ServicePrincipal' + } +} + +resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01'= { + name: name + location: location + kind: 'AzureCLI' + identity: { + type: 'UserAssigned' + userAssignedIdentities: { + '${managed_identity_aks}': {} + } + } + properties: { + forceUpdateTag: utcValue + azCliVersion: '2.7.0' + timeout: 'PT1H' + environmentVariables: [ + { + name: 'AZURE_SUBSCRIPTION_ID' + value: subscriptionId + } + { + name: 'AZURE_TENANT_ID' + value: tenantid + } + { + name: 'ACR_SERVER' + value: acrserver + } + { + name: 'AZURE_LOCATION' + value: azure_location + } + { + name: 'AZURE_ACR_LOGIN_SERVER' + value: azure_acr_login_server + } + { + name: 'AZURE_ACR_NAME' + value: azure_acr_name + } + { + name: 'AZURE_AKS_NAME' + value: azure_aks_name + } + { + name: 'AZURE_AKS_CONTROLPLANEFQDN' + value: azure_aks_controlplanefqdn + } + { + name: 'AZURE_AKS_MANAGED_RG' + value: azure_aks_managed_rg + } + { + name: 'AZURE_AKS_SERVICE_ACCOUNT_NAME' + value: azure_aks_service_account_name + } + { + name: 'AZURE_APIM_GATEWAY_URL' + value: azure_apim_gateway_url + } + { + name: 'AZURE_APIM_NAME' + value: azure_apim_name + } + { + name: 'MANAGED_IDENTITY_AKS' + value: managed_identity_aks + + } + { + name: 'IMAGE_NAME' + value: imagename + } + { + name: 'IMAGE_VERSION' + value: imageversion + } + { + name: 'AI_SEARCH_NAME' + value: ai_search_name + } + + + { + name: 'AZURE_AOAI_LLM_MODEL' + value: azure_aoai_llm_model + } + { + name: 'AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME' + value: azure_aoai_llm_model_deployment_name + } + { + name: 'AZURE_AOAI_LLM_MODEL_API_VERSION' + value: azure_aoai_llm_model_api_version + } + { + name: 'AZURE_AOAI_EMBEDDING_MODEL' + value: azure_aoai_embedding_model + } + { + name: 'AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME' + value: azure_aoai_embedding_model_deployment_name +} + { name: 'AZURE_AOAI_EMBEDDING_MODEL_API_VERSION' + value: azure_aoai_embedding_model_api_version +} + { name: 'AZURE_APP_HOSTNAME' + value: azure_app_hostname +} + { name: 'AZURE_APP_URL' + value: azure_app_url +} + { name: 'AZURE_APP_INSIGHTS_CONNECTION_STRING' + value: azure_app_insights_connection_string +} + { name: 'AZURE_COSMOSDB_ENDPOINT' + + value: azure_cosmosdb_endpoint } + { name: 'AZURE_COSMOSDB_NAME' + value: azure_cosmosdb_name + } + { name: 'AZURE_COSMOSDB_ID' + value: azure_cosmosdb_id +} + { name: 'AZURE_DNS_ZONE_NAME' + value: azure_dns_zone_name +} + { name: 'AZURE_STORAGE_ACCOUNT' + value: azure_storage_account +} + { name: 'AZURE_STORAGE_ACCOUNT_BLOB_URL' + value: azure_storage_account_blob_url +} + { + name: 'AZURE_WORKLOAD_IDENTITY_CLIENT_ID' + value: azure_workload_identity_client_id +} + { + name: 'AZURE_WORKLOAD_IDENTITY_PRINCIPAL_ID' + value: azure_workload_identity_principal_id +} + { + name: 'AZURE_WORKLOAD_IDENTITY_NAME' + value: azure_workload_identity_name +} + { + name: 'COGNITIVE_SERVICES_AUDIENCE' + value: cognitive_services_audience +} + { + name: 'AZURE_OPENAI_ENDPOINT' + + value: azure_aoai_endpoint + } + + + ] + cleanupPreference: 'OnSuccess' + retentionInterval: 'P1D' + primaryScriptUri: primaryScriptUri + } + dependsOn: [ + aksCluster + ] + +} + diff --git a/infra/deploy.parameters.json b/infra/deploy.parameters.json index f2409b87..7e35ce9b 100644 --- a/infra/deploy.parameters.json +++ b/infra/deploy.parameters.json @@ -1,10 +1,10 @@ { - "GRAPHRAG_API_BASE": "__GRAPHRAG_API_BASE__", - "GRAPHRAG_API_VERSION": "__GRAPHRAG_API_VERSION__", - "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "__GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME__", - "GRAPHRAG_EMBEDDING_MODEL": "__GRAPHRAG_EMBEDDING_MODEL__", - "GRAPHRAG_LLM_DEPLOYMENT_NAME": "__GRAPHRAG_LLM_DEPLOYMENT_NAME__", - "GRAPHRAG_LLM_MODEL": "__GRAPHRAG_LLM_MODEL__", - "LOCATION": "__LOCATION__", - "RESOURCE_GROUP": "__RESOURCE_GROUP__" -} \ No newline at end of file + "GRAPHRAG_API_BASE": "harjsingragbase", + "GRAPHRAG_API_VERSION": "v1", + "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "graphrag-text-embedding-ada-002", + "GRAPHRAG_EMBEDDING_MODEL": "text-embedding-ada-002", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "graphrag-gpt-4o", + "GRAPHRAG_LLM_MODEL": "gpt-4o", + "LOCATION": "eastus2", + "RESOURCE_GROUP": "harjsin-grag-test" +} diff --git a/infra/main.bicep b/infra/main.bicep index fa81fb1f..8dbbe5e1 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -55,6 +55,9 @@ param acrName string = '' param storageAccountName string = '' param cosmosDbName string = '' param aiSearchName string = '' +param utcString string = utcNow() +param graphragimage string = 'graphragbackend' +param graphragimageversion string = 'latest' // AOAI parameters @description('Name of the AOAI LLM model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models') @@ -363,6 +366,59 @@ module privateLinkScopePrivateEndpoint 'core/vnet/private-endpoint.bicep' = if ( } } +module deploymentScript 'core/scripts/deployment-script.bicep' ={ + name: utcString + params: { + utcValue: utcString + name:'graphragscript' + location:location + subscriptionId:subscription().subscriptionId + tenantid:tenant().tenantId + acrserver:'graphrag.azure.acr.io' + azure_location:location + azure_acr_login_server:acr.outputs.loginServer + azure_acr_name:acr.outputs.name + azure_aks_name: aks.outputs.name + azure_aks_controlplanefqdn:aks.outputs.controlPlaneFqdn + azure_aks_managed_rg :aks.outputs.managedResourceGroup + azure_aks_service_account_name:aksServiceAccountName + imagename:graphragimage + imageversion:graphragimageversion + azure_apim_gateway_url:apim.outputs.apimGatewayUrl + azure_apim_name :apim.outputs.name + managed_identity_aks:aks.outputs.systemIdentity + primaryScriptUri:'file://./scripts/deployment-script.sh' + ai_search_name:aiSearch.name + azure_aoai_endpoint:aoai.outputs.openAiEndpoint + azure_aoai_llm_model : aoai.outputs.llmModel + azure_aoai_llm_model_deployment_name:aoai.outputs.llmModelDeploymentName + azure_aoai_llm_model_api_version :aoai.outputs.llmModelApiVersion + azure_aoai_embedding_model:aoai.outputs.textEmbeddingModel + azure_aoai_embedding_model_deployment_name:aoai.outputs.textEmbeddingModelDeploymentName + azure_aoai_embedding_model_api_version:aoai.outputs.textEmbeddingModelApiVersion + + azure_app_hostname:appHostname + azure_app_url:appUrl + azure_app_insights_connection_string:appInsights.outputs.connectionString + + azure_cosmosdb_endpoint :cosmosdb.outputs.endpoint + azure_cosmosdb_name:cosmosdb.outputs.name + azure_cosmosdb_id:cosmosdb.outputs.id + + azure_dns_zone_name:privateDnsZone.outputs.name + + + azure_storage_account:storage.outputs.name + azure_storage_account_blob_url:storage.outputs.primaryEndpoints.blob + + azure_workload_identity_client_id:workloadIdentity.outputs.clientId + azure_workload_identity_principal_id:workloadIdentity.outputs.principalId + azure_workload_identity_name:workloadIdentity.outputs.name + + + } +} + output azure_location string = location output azure_tenant_id string = tenant().tenantId diff --git a/infra/managed-app/artifacts/graphrag/.helmignore b/infra/managed-app/artifacts/graphrag/.helmignore new file mode 100644 index 00000000..0e8a0eb3 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/infra/managed-app/artifacts/graphrag/Chart.yaml b/infra/managed-app/artifacts/graphrag/Chart.yaml new file mode 100644 index 00000000..6e003a45 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/Chart.yaml @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +apiVersion: v2 +name: graphrag +description: GraphRAG - a graph-based RAG search engine +type: application +version: 0.3.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "2.1.0" diff --git a/infra/managed-app/artifacts/graphrag/LICENSE b/infra/managed-app/artifacts/graphrag/LICENSE new file mode 100644 index 00000000..63447fd8 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) Microsoft Corporation. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/infra/managed-app/artifacts/graphrag/templates/NOTES.txt b/infra/managed-app/artifacts/graphrag/templates/NOTES.txt new file mode 100644 index 00000000..c32a7790 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/NOTES.txt @@ -0,0 +1,8 @@ +Thank you for installing {{ .Chart.Name }}. + +Your release is named {{ .Release.Name }}. + +To learn more about the release, try: + + $ helm status {{ .Release.Name }} + $ helm get all {{ .Release.Name }} \ No newline at end of file diff --git a/infra/managed-app/artifacts/graphrag/templates/_helpers.tpl b/infra/managed-app/artifacts/graphrag/templates/_helpers.tpl new file mode 100644 index 00000000..5d5ea14a --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/_helpers.tpl @@ -0,0 +1,95 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "graphrag.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "graphrag.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create a graphrag-master fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "graphrag.master.fullname" -}} +{{- if .Values.master.fullnameOverride }} +{{- .Values.master.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- printf "%s-%s" .Release.Name .Values.master.name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s-%s" .Release.Name $name .Values.master.name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "graphrag.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "graphrag.common.labels" -}} +azure.workload.identity/use: "true" +helm.sh/chart: {{ include "graphrag.chart" . }} +{{ include "graphrag.common.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{- define "graphrag.labels" -}} +{{ include "graphrag.common.labels" . }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "graphrag.common.selectorLabels" -}} +app.kubernetes.io/name: {{ include "graphrag.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{- define "graphrag.master.labels" -}} +{{ include "graphrag.common.labels" . }} +{{ include "graphrag.master.selectorLabels" . }} +{{- end -}} + +{{- define "graphrag.master.selectorLabels" -}} +{{ include "graphrag.common.selectorLabels" . }} +component: {{ .Values.master.name | quote }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "graphrag.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "graphrag.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-clusterrole.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-clusterrole.yaml new file mode 100644 index 00000000..800ae5fb --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-clusterrole.yaml @@ -0,0 +1,13 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "graphrag.fullname" . }} + labels: + {{- include "graphrag.labels" . | nindent 4 }} +rules: +- apiGroups: [""] + resources: ["pods"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] +- apiGroups: ["batch", "extensions"] + resources: ["*"] + verbs: ["*"] diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-configmap.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-configmap.yaml new file mode 100644 index 00000000..a3fbcf2a --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-configmap.yaml @@ -0,0 +1,9 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + {{- include "graphrag.labels" . | nindent 4 }} + name: {{ include "graphrag.fullname" . }} +data: + {{- toYaml .Values.graphragConfig | nindent 2 }} + AKS_NAMESPACE: {{ .Release.Namespace }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-ingress.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-ingress.yaml new file mode 100644 index 00000000..cb29de94 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-ingress.yaml @@ -0,0 +1,52 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "graphrag.fullname" . -}} +{{- $masterFullName := include "graphrag.master.fullname" . -}} +{{- $masterSvcPort := .Values.master.service.port -}} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "graphrag.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + - host: {{ .Values.ingress.host | quote }} + http: + paths: + - path: "/" + pathType: "Prefix" + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $masterFullName }} + port: + number: {{ $masterSvcPort }} + {{- else }} + serviceName: {{ $masterFullName }} + servicePort: {{ $masterSvcPort }} + {{- end }} +{{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-master-deployment.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-deployment.yaml new file mode 100644 index 00000000..c0fa4f00 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-deployment.yaml @@ -0,0 +1,67 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "graphrag.master.fullname" . }} + labels: + {{- include "graphrag.master.labels" . | nindent 4 }} +spec: + {{- if not .Values.master.autoscaling.enabled }} + replicas: {{ .Values.master.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "graphrag.master.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.master.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + date: "{{ now | unixEpoch }}" + {{- include "graphrag.master.labels" . | nindent 8 }} + {{- with .Values.master.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + serviceAccountName: {{ include "graphrag.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.master.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Values.master.name }} + securityContext: + {{- toYaml .Values.master.securityContext | nindent 12 }} + image: "{{ .Values.master.image.repository }}:{{ .Values.master.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.master.image.pullPolicy }} + envFrom: + - configMapRef: + name: {{ include "graphrag.fullname" . }} + ports: + - name: http + containerPort: {{ .Values.master.service.port }} + protocol: TCP + livenessProbe: + {{- toYaml .Values.master.livenessProbe | nindent 12 }} + readinessProbe: + {{- toYaml .Values.master.readinessProbe | nindent 12 }} + resources: + {{- toYaml .Values.master.resources | nindent 12 }} + volumeMounts: + {{- with .Values.master.volumeMounts }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.master.volumes }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.master.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.master.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.master.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-master-hpa.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-hpa.yaml new file mode 100644 index 00000000..7407846d --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.master.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "graphrag.master.fullname" . }} + labels: + {{- include "graphrag.master.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "graphrag.master.fullname" . }} + minReplicas: {{ .Values.master.autoscaling.minReplicas }} + maxReplicas: {{ .Values.master.autoscaling.maxReplicas }} + metrics: + {{- if .Values.master.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.master.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.master.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.master.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-master-service.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-service.yaml new file mode 100644 index 00000000..b68f3f64 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-master-service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "graphrag.master.fullname" . }} +{{- if .Values.master.service.annotations }} + annotations: + {{- range $key, $value := .Values.master.service.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +{{- end }} + labels: + {{- include "graphrag.master.labels" . | nindent 4 }} +spec: + type: {{ .Values.master.service.type }} + ports: + - port: {{ .Values.master.service.port }} + selector: + {{- include "graphrag.master.selectorLabels" . | nindent 4 }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-nginx-internal-controller.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-nginx-internal-controller.yaml new file mode 100644 index 00000000..dc66448f --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-nginx-internal-controller.yaml @@ -0,0 +1,13 @@ +{{- if .Values.ingress.createIngressClass -}} +apiVersion: approuting.kubernetes.azure.com/v1alpha1 +kind: NginxIngressController +metadata: + name: {{ .Values.ingress.className }} +spec: + ingressClassName: {{ .Values.ingress.className }} + controllerNamePrefix: {{ .Values.ingress.className }} + {{- with .Values.ingress.loadBalancerAnnotations }} + loadBalancerAnnotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-rolebinding.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-rolebinding.yaml new file mode 100644 index 00000000..3ebc3eb0 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-rolebinding.yaml @@ -0,0 +1,14 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "graphrag.fullname" . }} + labels: + {{- include "graphrag.labels" . | nindent 4 }} +subjects: +- kind: ServiceAccount + name: {{ include "graphrag.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ include "graphrag.fullname" . }} + apiGroup: rbac.authorization.k8s.io diff --git a/infra/managed-app/artifacts/graphrag/templates/graphrag-serviceaccount.yaml b/infra/managed-app/artifacts/graphrag/templates/graphrag-serviceaccount.yaml new file mode 100644 index 00000000..b3bdbce9 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/graphrag-serviceaccount.yaml @@ -0,0 +1,13 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "graphrag.serviceAccountName" . }} + labels: + {{- include "graphrag.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automount }} +{{- end }} diff --git a/infra/managed-app/artifacts/graphrag/templates/tests/test-connection.yaml b/infra/managed-app/artifacts/graphrag/templates/tests/test-connection.yaml new file mode 100644 index 00000000..59ea7df1 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "graphrag.master.fullname" . }}-test-connection" + labels: + {{- include "graphrag.master.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "graphrag.master.fullname" . }}:{{ .Values.master.service.port }}'] + restartPolicy: Never diff --git a/infra/managed-app/artifacts/graphrag/values.yaml b/infra/managed-app/artifacts/graphrag/values.yaml new file mode 100644 index 00000000..9b8cce48 --- /dev/null +++ b/infra/managed-app/artifacts/graphrag/values.yaml @@ -0,0 +1,135 @@ +# Default values for the graphrag helm chart. + +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Automatically mount a ServiceAccount's API credentials? + automount: true + # Annotations to add to the service account + annotations: + azure.workload.identity/client-id: "" + # Name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +ingress: + enabled: true + className: nginx-internal + createIngressClass: true + host: graphrag.graphrag.io + tls: [] + annotations: + nginx.ingress.kubernetes.io/proxy-connect-timeout: "900" + nginx.ingress.kubernetes.io/proxy-send-timeout: "900" + nginx.ingress.kubernetes.io/proxy-read-timeout: "900" + nginx.ingress.kubernetes.io/proxy-body-size: 500m + loadBalancerAnnotations: + service.beta.kubernetes.io/azure-load-balancer-internal: "true" + +graphragConfig: + AI_SEARCH_AUDIENCE: "https://search.azure.com" + AI_SEARCH_URL: "" + APPLICATIONINSIGHTS_CONNECTION_STRING: "" + # Must set hidden env variable to true to disable statsbeat. For more information: https://github.com/Azure/azure-sdk-for-python/issues/34804 + APPLICATIONINSIGHTS_STATSBEAT_DISABLED_ALL: "True" + COSMOS_URI_ENDPOINT: "" + GRAPHRAG_API_BASE: "" + GRAPHRAG_API_VERSION: "" + COGNITIVE_SERVICES_AUDIENCE: "https://cognitiveservices.azure.com/.default" + GRAPHRAG_LLM_MODEL: "" + GRAPHRAG_LLM_DEPLOYMENT_NAME: "" + GRAPHRAG_EMBEDDING_MODEL: "" + GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME: "" + STORAGE_ACCOUNT_BLOB_URL: "" + +master: + name: "master" + replicaCount: 1 + image: + repository: "" + pullPolicy: Always + # Override the image tag whose default is the chart appVersion. + tag: "" + podAnnotations: {} + podLabels: {} + podSecurityContext: + {} + # fsGroup: 2000 + + securityContext: + {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + + service: + annotations: {} + type: ClusterIP + port: 80 + + resources: + # We recommend not modifying the default resources below unless you know what you're doing + # and have investigated graphrag's baseline spec requirements to ensure the application + # can run properly. + limits: + cpu: 8 + memory: "16Gi" + requests: + cpu: 4 + memory: "10Gi" + + livenessProbe: + httpGet: + path: /manpage/docs + port: http + failureThreshold: 50 + initialDelaySeconds: 30 + periodSeconds: 20 + + readinessProbe: + httpGet: + path: /manpage/docs + port: http + failureThreshold: 50 + initialDelaySeconds: 30 + periodSeconds: 20 + + autoscaling: + enabled: true + minReplicas: 1 + maxReplicas: 20 + targetMemoryUtilizationPercentage: 50 + # targetCPUUtilizationPercentage: 50 + + # Additional volumes on the output Deployment definition. + volumes: [] + # - name: foo + # secret: + # secretName: mysecret + # optional: false + + # Additional volumeMounts on the output Deployment definition. + volumeMounts: [] + # - name: foo + # mountPath: "/etc/foo" + # readOnly: true + + nodeSelector: {} + + tolerations: [] + + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: workload + operator: In + values: + - graphrag diff --git a/infra/managed-app/artifacts/scripts/updategraphrag.sh b/infra/managed-app/artifacts/scripts/updategraphrag.sh new file mode 100755 index 00000000..6b9d21da --- /dev/null +++ b/infra/managed-app/artifacts/scripts/updategraphrag.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# Install kubectl +az aks install-cli --only-show-errors + +# Get AKS credentials +az aks get-credentials \ + --admin \ + --name $clusterName \ + --resource-group $resourceGroupName \ + --subscription $subscriptionId \ + --only-show-errors + +# Check if the cluster is private or not + +# Assign a value to aksNamespace +aksNamespace="graphrag" + +# Install Helm +curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -o get_helm.sh -s +chmod 700 get_helm.sh +./get_helm.sh &>/dev/null + +# Add Helm repos +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx + +# Update Helm repos +helm repo update + +helm pull oci://graphrag.azurecr.io/graphrag --generate-name + +tar -xvf graphrag-0.1.0.tgz + + + + # Log whether the cluster is public or private + echo "$clusterName AKS cluster is public" + + # Install Prometheus + + + # Install NGINX ingress controller using the internal load balancer + helm upgrade -i graphrag ./graphrag -f ./graphrag/values.yaml \ + --namespace $aksNamespace --create-namespace \ + --set "serviceAccount.name=$AZURE_AKS_SERVICE_ACCOUNT_NAME" \ + --set "serviceAccount.annotations.azure\.workload\.identity/client-id=$AZURE_WORKLOAD_IDENTITY_CLIENT_ID" \ + --set "master.image.repository=graphrag.azurecr.io/$IMAGE_NAME" \ + --set "master.image.tag=$IMAGE_VERSION" \ + --set "ingress.host=$AZURE_APP_HOSTNAME" \ + --set "graphragConfig.APP_INSIGHTS_CONNECTION_STRING=$APP_INSIGHTS_CONNECTION_STRING" \ + --set "graphragConfig.AI_SEARCH_URL=https://$AI_SEARCH_NAME.search.windows.net" \ + --set "graphragConfig.COSMOS_URI_ENDPOINT=$AZURE_COSMOSDB_ENDPOINT" \ + --set "graphragConfig.GRAPHRAG_API_BASE=$AZURE_OPENAI_ENDPOINT" \ + --set "graphragConfig.GRAPHRAG_API_VERSION=$AZURE_AOAI_LLM_MODEL_API_VERSION" \ + --set "graphragConfig.GRAPHRAG_LLM_MODEL=$AZURE_AOAI_LLM_MODEL"\ + --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$AZURE_AOAI_EMBEDDING_MODEL" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME" \ + --set "graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE" \ + --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$AZURE_STORAGE_ACCOUNT_BLOB_URL" + + + + + diff --git a/infra/managed-app/mainTemplate.json b/infra/managed-app/mainTemplate.json new file mode 100644 index 00000000..6f46827d --- /dev/null +++ b/infra/managed-app/mainTemplate.json @@ -0,0 +1,3595 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "9931387349449043336" + } + }, + "parameters": { + "resourceGroup": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "metadata": { + "description": "Name of the resource group that GraphRAG will be deployed in." + } + }, + "resourceBaseName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Unique name to append to each resource" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Cloud region for all resources" + } + }, + "apiPublisherName": { + "type": "string", + "defaultValue": "Microsoft", + "minLength": 1, + "metadata": { + "description": "Name of the publisher of the API Management instance." + } + }, + "apiPublisherEmail": { + "type": "string", + "defaultValue": "publisher@microsoft.com", + "minLength": 1, + "metadata": { + "description": "Email address of the publisher of the API Management instance." + } + }, + "aksNamespace": { + "type": "string", + "defaultValue": "graphrag", + "metadata": { + "description": "The AKS namespace to install GraphRAG in." + } + }, + "enablePrivateEndpoints": { + "type": "bool", + "defaultValue": true, + "metadata": { + "description": "Whether to enable private endpoints." + } + }, + "restoreAPIM": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Whether to restore the API Management instance." + } + }, + "apimTier": { + "type": "string", + "defaultValue": "Developer" + }, + "apimName": { + "type": "string", + "defaultValue": "" + }, + "acrName": { + "type": "string", + "defaultValue": "" + }, + "storageAccountName": { + "type": "string", + "defaultValue": "" + }, + "cosmosDbName": { + "type": "string", + "defaultValue": "" + }, + "aiSearchName": { + "type": "string", + "defaultValue": "" + }, + "llmModelName": { + "type": "string", + "defaultValue": "gpt-4o", + "allowedValues": [ + "gpt-4o", + "gpt-4o-mini" + ], + "metadata": { + "description": "Name of the AOAI LLM model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models" + } + }, + "llmModelVersion": { + "type": "string", + "defaultValue": "2024-08-06", + "metadata": { + "description": "Version of the AOAI LLM model to use." + } + }, + "llmModelQuota": { + "type": "int", + "defaultValue": 10, + "minValue": 1, + "metadata": { + "description": "Quota of the AOAI LLM model to use." + } + }, + "embeddingModelName": { + "type": "string", + "defaultValue": "text-embedding-ada-002", + "allowedValues": [ + "text-embedding-ada-002", + "text-embedding-3-large" + ], + "metadata": { + "description": "Name of the AOAI embedding model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models" + } + }, + "embeddingModelVersion": { + "type": "string", + "defaultValue": "2" + }, + "embeddingModelQuota": { + "type": "int", + "defaultValue": 10, + "minValue": 1, + "metadata": { + "description": "Quota of the AOAI embedding model to use." + } + } + }, + "variables": { + "$fxv#0": { + "analysisServicesServers": "as", + "apiManagementService": "apim-", + "appConfigurationConfigurationStores": "appcs-", + "appContainerApps": "ca-", + "appManagedEnvironments": "cae-", + "authorizationPolicyDefinitions": "policy-", + "automationAutomationAccounts": "aa-", + "azureOpenAI": "aoai-", + "blueprintBlueprints": "bp-", + "blueprintBlueprintsArtifacts": "bpa-", + "cacheRedis": "redis-", + "cdnProfiles": "cdnp-", + "cdnProfilesEndpoints": "cdne-", + "cognitiveServicesAccounts": "cog-", + "cognitiveServicesFormRecognizer": "cog-fr-", + "cognitiveServicesTextAnalytics": "cog-ta-", + "computeAvailabilitySets": "avail-", + "computeCloudServices": "cld-", + "computeDiskEncryptionSets": "des", + "computeDisks": "disk", + "computeDisksOs": "osdisk", + "computeGalleries": "gal", + "computeSnapshots": "snap-", + "computeVirtualMachineScaleSets": "vmss-", + "computeVirtualMachines": "vm", + "containerInstanceContainerGroups": "ci", + "containerRegistryRegistries": "cr", + "containerServiceManagedClusters": "aks-", + "dBforMySQLServers": "mysql-", + "dBforPostgreSQLServers": "psql-", + "dataFactoryFactories": "adf-", + "dataLakeAnalyticsAccounts": "dla", + "dataLakeStoreAccounts": "dls", + "dataMigrationServices": "dms-", + "databricksWorkspaces": "dbw-", + "devicesIotHubs": "iot-", + "devicesProvisioningServices": "provs-", + "devicesProvisioningServicesCertificates": "pcert-", + "documentDBDatabaseAccounts": "cosmos-", + "eventGridDomains": "evgd-", + "eventGridDomainsTopics": "evgt-", + "eventGridEventSubscriptions": "evgs-", + "eventHubNamespaces": "evhns-", + "eventHubNamespacesEventHubs": "evh-", + "hdInsightClustersHadoop": "hadoop-", + "hdInsightClustersHbase": "hbase-", + "hdInsightClustersKafka": "kafka-", + "hdInsightClustersMl": "mls-", + "hdInsightClustersSpark": "spark-", + "hdInsightClustersStorm": "storm-", + "hybridComputeMachines": "arcs-", + "insightsActionGroups": "ag-", + "insightsComponents": "appi-", + "keyVaultVaults": "kv-", + "kubernetesConnectedClusters": "arck", + "kustoClusters": "dec", + "kustoClustersDatabases": "dedb", + "logicIntegrationAccounts": "ia-", + "logicWorkflows": "logic-", + "machineLearningServicesWorkspaces": "mlw-", + "managedIdentityUserAssignedIdentities": "id-", + "managementManagementGroups": "mg-", + "migrateAssessmentProjects": "migr-", + "networkApplicationGateways": "agw-", + "networkApplicationSecurityGroups": "asg-", + "networkAzureFirewalls": "afw-", + "networkBastionHosts": "bas-", + "networkConnections": "con-", + "networkDnsZones": "dnsz-", + "networkExpressRouteCircuits": "erc-", + "networkFirewallPolicies": "afwp-", + "networkFirewallPoliciesRuleGroups": "wafrg", + "networkFirewallPoliciesWebApplication": "waf", + "networkFrontDoors": "fd-", + "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-", + "networkLoadBalancersExternal": "lbe-", + "networkLoadBalancersInboundNatRules": "rule-", + "networkLoadBalancersInternal": "lbi-", + "networkLocalNetworkGateways": "lgw-", + "networkNatGateways": "ng-", + "networkNetworkInterfaces": "nic-", + "networkNetworkSecurityGroups": "nsg-", + "networkNetworkSecurityGroupsSecurityRules": "nsgsr-", + "networkNetworkWatchers": "nw-", + "networkPrivateDnsZones": "pdnsz-", + "networkPrivateLinkServices": "pl-", + "networkPublicIPAddresses": "pip-", + "networkPublicIPPrefixes": "ippre-", + "networkRouteFilters": "rf-", + "networkRouteTables": "rt-", + "networkRouteTablesRoutes": "udr-", + "networkTrafficManagerProfiles": "traf-", + "networkVirtualNetworkGateways": "vgw-", + "networkVirtualNetworks": "vnet-", + "networkVirtualNetworksSubnets": "snet-", + "networkVirtualNetworksVirtualNetworkPeerings": "peer-", + "networkVirtualWans": "vwan-", + "networkVpnGateways": "vpng-", + "networkVpnGatewaysVpnConnections": "vcn-", + "networkVpnGatewaysVpnSites": "vst-", + "notificationHubsNamespaces": "ntfns-", + "notificationHubsNamespacesNotificationHubs": "ntf-", + "operationalInsightsWorkspaces": "log-", + "portalDashboards": "dash-", + "powerBIDedicatedCapacities": "pbi-", + "privateEndpoint": "pep-", + "purviewAccounts": "pview-", + "recoveryServicesVaults": "rsv-", + "resourcesResourceGroups": "rg-", + "searchSearchServices": "srch-", + "serviceBusNamespaces": "sb-", + "serviceBusNamespacesQueues": "sbq-", + "serviceBusNamespacesTopics": "sbt-", + "serviceEndPointPolicies": "se-", + "serviceFabricClusters": "sf-", + "signalRServiceSignalR": "sigr", + "sqlManagedInstances": "sqlmi-", + "sqlServers": "sql-", + "sqlServersDataWarehouse": "sqldw-", + "sqlServersDatabases": "sqldb-", + "sqlServersDatabasesStretch": "sqlstrdb-", + "storSimpleManagers": "ssimp", + "storageStorageAccounts": "st", + "storageStorageAccountsVm": "stvm", + "streamAnalyticsCluster": "asa-", + "synapseWorkspaces": "syn", + "synapseWorkspacesAnalyticsWorkspaces": "synw", + "synapseWorkspacesSqlPoolsDedicated": "syndp", + "synapseWorkspacesSqlPoolsSpark": "synsp", + "timeSeriesInsightsEnvironments": "tsi-", + "webServerFarms": "plan-", + "webSitesAppService": "app-", + "webSitesAppServiceEnvironment": "ase-", + "webSitesFunctions": "func-", + "webStaticSites": "stapp-" + }, + "resourceBaseNameFinal": "[if(not(empty(parameters('resourceBaseName'))), parameters('resourceBaseName'), toLower(uniqueString(format('{0}/resourceGroups/{1}', subscription().id, parameters('resourceGroup')))))]", + "abbrs": "[variables('$fxv#0')]", + "tags": { + "azd-env-name": "[parameters('resourceGroup')]" + }, + "workloadIdentityName": "[format('{0}{1}', variables('abbrs').managedIdentityUserAssignedIdentities, variables('resourceBaseNameFinal'))]", + "aksServiceAccountName": "[format('{0}-workload-sa', parameters('aksNamespace'))]", + "workloadIdentitySubject": "[format('system:serviceaccount:{0}:{1}', parameters('aksNamespace'), variables('aksServiceAccountName'))]", + "dnsDomain": "graphrag.io", + "appHostname": "[format('graphrag.{0}', variables('dnsDomain'))]", + "appUrl": "[format('http://{0}', variables('appHostname'))]", + "roles": { + "acrPull": "[resourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')]", + "networkContributor": "[resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')]", + "privateDnsZoneContributor": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b12aa53e-6015-4669-85d0-8515ebb3ae7f')]" + } + }, + "resources": [ + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-workload-identity-rbac-assignments", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "principalId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "principalType": { + "value": "ServicePrincipal" + }, + "cosmosDbName": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "12633129174833370467" + } + }, + "parameters": { + "principalId": { + "type": "string", + "metadata": { + "description": "ID of the service principal to assign the RBAC roles to." + } + }, + "principalType": { + "type": "string", + "allowedValues": [ + "ServicePrincipal", + "User", + "Group", + "Device", + "ForeignGroup" + ], + "metadata": { + "description": "Type of principal to assign the RBAC roles to." + } + }, + "cosmosDbName": { + "type": "string", + "metadata": { + "description": "Name of an existing CosmosDB resource." + } + } + }, + "variables": { + "roleDefinitions": [ + { + "id": "ba92f5b4-2d11-453d-a403-e96b0029c9fe" + }, + { + "id": "b24988ac-6180-42a0-ab88-20f7382dd24c" + }, + { + "id": "8ebe5a00-799e-43f5-93ac-243d3dce84a7" + }, + { + "id": "1407120a-92aa-4202-b7e9-c0e197c71c8f" + }, + { + "id": "a001fd3d-188f-4b5d-821b-7da978bf7442" + }, + { + "id": "3913510d-42f4-4e42-8a64-420c390055eb" + } + ], + "customRoleName": "Custom cosmosDB role for graphrag - adds read/write permissions at the database and container level" + }, + "resources": [ + { + "copy": { + "name": "roleAssignment", + "count": "[length(variables('roleDefinitions'))]" + }, + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "name": "[guid(subscription().subscriptionId, resourceGroup().name, parameters('principalId'), parameters('principalType'), variables('roleDefinitions')[copyIndex()].id)]", + "properties": { + "principalId": "[parameters('principalId')]", + "principalType": "[parameters('principalType')]", + "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('roleDefinitions')[copyIndex()].id)]" + } + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions", + "apiVersion": "2024-12-01-preview", + "name": "[format('{0}/{1}', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]", + "properties": { + "roleName": "[variables('customRoleName')]", + "type": "CustomRole", + "assignableScopes": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + ], + "permissions": [ + { + "dataActions": [ + "Microsoft.DocumentDB/databaseAccounts/readMetadata", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/write" + ] + } + ] + } + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments", + "apiVersion": "2024-12-01-preview", + "name": "[format('{0}/{1}', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName'))), parameters('principalId')))]", + "properties": { + "principalId": "[parameters('principalId')]", + "roleDefinitionId": "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]", + "scope": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-rbac-assignments", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "roleAssignments": { + "value": [ + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.kubeletPrincipalId.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').acrPull]" + }, + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.ingressWebAppIdentity.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').privateDnsZoneContributor]" + }, + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.systemIdentity.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').networkContributor]" + } + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "7894561717174372245" + } + }, + "parameters": { + "roleAssignments": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "Array of objects with fields principalId, principalType, roleDefinitionId" + } + } + }, + "resources": [ + { + "copy": { + "name": "roleAssignment", + "count": "[length(parameters('roleAssignments'))]" + }, + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "name": "[guid(subscription().subscriptionId, resourceGroup().name, parameters('roleAssignments')[copyIndex()].principalId, parameters('roleAssignments')[copyIndex()].principalType, parameters('roleAssignments')[copyIndex()].roleDefinitionId)]", + "properties": "[parameters('roleAssignments')[copyIndex()]]" + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "log-analytics-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[format('{0}{1}', variables('abbrs').operationalInsightsWorkspaces, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccessForIngestion": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "6505063178335705329" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the Log Analytics resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Log Analytics resource." + } + }, + "publicNetworkAccessForIngestion": { + "type": "string", + "defaultValue": "Disabled", + "metadata": { + "description": "The public network access for ingestion." + } + } + }, + "resources": [ + { + "type": "Microsoft.OperationalInsights/workspaces", + "apiVersion": "2022-10-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "properties": { + "retentionInDays": 30, + "publicNetworkAccessForIngestion": "[parameters('publicNetworkAccessForIngestion')]", + "publicNetworkAccessForQuery": "Enabled", + "features": { + "immediatePurgeDataOn30Days": true + } + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('name'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "nsg-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "nsgName": { + "value": "[format('{0}{1}', variables('abbrs').networkNetworkSecurityGroups, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "7427556975670137358" + } + }, + "parameters": { + "nsgName": { + "type": "string", + "defaultValue": "[format('apim-nsg-{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "Name of the NSG for the API Management service." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2024-01-01", + "name": "[parameters('nsgName')]", + "location": "[parameters('location')]", + "properties": { + "securityRules": [ + { + "name": "Client_communication_to_API_Management", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "80", + "sourceAddressPrefix": "Internet", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 100, + "direction": "Inbound" + } + }, + { + "name": "Secure_Client_communication_to_API_Management", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "Internet", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 110, + "direction": "Inbound" + } + }, + { + "name": "Management_endpoint_for_Azure_portal_and_Powershell", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "3443", + "sourceAddressPrefix": "ApiManagement", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 120, + "direction": "Inbound" + } + }, + { + "name": "Dependency_on_Redis_Cache", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6381-6383", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 130, + "direction": "Inbound" + } + }, + { + "name": "Dependency_to_sync_Rate_Limit_Inbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "4290", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 135, + "direction": "Inbound" + } + }, + { + "name": "Dependency_on_Azure_SQL", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "1433", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Sql", + "access": "Allow", + "priority": 140, + "direction": "Outbound" + } + }, + { + "name": "Dependency_for_Log_to_event_Hub_policy", + "properties": { + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "5671", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "EventHub", + "access": "Allow", + "priority": 150, + "direction": "Outbound" + } + }, + { + "name": "Dependency_on_Redis_Cache_outbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6381-6383", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 160, + "direction": "Outbound" + } + }, + { + "name": "Depenedency_To_sync_RateLimit_Outbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "4290", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 165, + "direction": "Outbound" + } + }, + { + "name": "Dependency_on_Azure_File_Share_for_GIT", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "445", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Storage", + "access": "Allow", + "priority": 170, + "direction": "Outbound" + } + }, + { + "name": "Azure_Infrastructure_Load_Balancer", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6390", + "sourceAddressPrefix": "AzureLoadBalancer", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 180, + "direction": "Inbound" + } + }, + { + "name": "Publish_DiagnosticLogs_And_Metrics", + "properties": { + "description": "API Management logs and metrics for consumption by admins and your IT team are all part of the management plane", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureMonitor", + "access": "Allow", + "priority": 185, + "direction": "Outbound", + "destinationPortRanges": [ + "443", + "12000", + "1886" + ] + } + }, + { + "name": "Connect_To_SMTP_Relay_For_SendingEmails", + "properties": { + "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Internet", + "access": "Allow", + "priority": 190, + "direction": "Outbound", + "destinationPortRanges": [ + "25", + "587", + "25028" + ] + } + }, + { + "name": "Authenticate_To_Azure_Active_Directory", + "properties": { + "description": "Connect to Azure Active Directory for developer Portal authentication or for OAuth 2 flow during any proxy authentication", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureActiveDirectory", + "access": "Allow", + "priority": 200, + "direction": "Outbound", + "destinationPortRanges": [ + "80", + "443" + ] + } + }, + { + "name": "Dependency_on_Azure_Storage", + "properties": { + "description": "API Management service dependency on Azure blob and Azure table storage", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Storage", + "access": "Allow", + "priority": 100, + "direction": "Outbound" + } + }, + { + "name": "Publish_Monitoring_Logs", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureCloud", + "access": "Allow", + "priority": 300, + "direction": "Outbound" + } + }, + { + "name": "Deny_All_Internet_Outbound", + "properties": { + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Internet", + "access": "Deny", + "priority": 999, + "direction": "Outbound" + } + } + ] + } + } + ], + "outputs": { + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('nsgName'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "vnet-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "vnetName": { + "value": "[format('{0}{1}', variables('abbrs').networkVirtualNetworks, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "subnetPrefix": { + "value": "[variables('abbrs').networkVirtualNetworksSubnets]" + }, + "apimTier": { + "value": "[parameters('apimTier')]" + }, + "nsgID": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'nsg-deployment'), '2022-09-01').outputs.id.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "7094004855498640344" + } + }, + "parameters": { + "vnetName": { + "type": "string", + "metadata": { + "description": "Name of the vnet resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resource will be deployed." + } + }, + "subnetPrefix": { + "type": "string", + "defaultValue": "snet-", + "metadata": { + "description": "Optional prefix to prepend to subnet names." + } + }, + "apimTier": { + "type": "string", + "allowedValues": [ + "Developer", + "StandardV2" + ], + "metadata": { + "description": "APIM tier - used to determine if subnet delegations are required." + } + }, + "nsgID": { + "type": "string", + "metadata": { + "description": "NSG resource ID." + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2024-01-01", + "name": "[parameters('vnetName')]", + "location": "[parameters('location')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "10.1.0.0/16" + ] + }, + "subnets": [ + { + "name": "[format('{0}apim', parameters('subnetPrefix'))]", + "properties": { + "addressPrefix": "10.1.0.0/24", + "networkSecurityGroup": { + "id": "[parameters('nsgID')]" + }, + "delegations": "[if(equals(parameters('apimTier'), 'Developer'), createArray(), createArray(createObject('name', 'Microsoft.Web/serverFarms', 'properties', createObject('serviceName', 'Microsoft.Web/serverFarms'))))]" + } + }, + { + "name": "[format('{0}aks', parameters('subnetPrefix'))]", + "properties": { + "addressPrefix": "10.1.1.0/24", + "serviceEndpoints": [ + { + "service": "Microsoft.Storage" + }, + { + "service": "Microsoft.Sql" + }, + { + "service": "Microsoft.EventHub" + } + ] + } + } + ] + } + } + ], + "outputs": { + "vnetId": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "vnetName": { + "type": "string", + "value": "[parameters('vnetName')]" + }, + "apimSubnetId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')), '2024-01-01').subnets[0].id]" + }, + "aksSubnetId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')), '2024-01-01').subnets[1].id]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'nsg-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aoai-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "openAiName": { + "value": "[format('{0}{1}', variables('abbrs').cognitiveServicesAccounts, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "llmModelName": { + "value": "[parameters('llmModelName')]" + }, + "llmModelVersion": { + "value": "[parameters('llmModelVersion')]" + }, + "llmTpmQuota": { + "value": "[parameters('llmModelQuota')]" + }, + "embeddingModelName": { + "value": "[parameters('embeddingModelName')]" + }, + "embeddingModelVersion": { + "value": "[parameters('embeddingModelVersion')]" + }, + "embeddingTpmQuota": { + "value": "[parameters('embeddingModelQuota')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "3498035798180053085" + } + }, + "parameters": { + "openAiName": { + "type": "string", + "defaultValue": "[format('openai{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "Name of the Azure OpenAI instance" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for the Azure OpenAI instance" + } + }, + "llmModelName": { + "type": "string", + "defaultValue": "gpt-4o", + "metadata": { + "description": "LLM model name" + } + }, + "llmModelVersion": { + "type": "string", + "metadata": { + "description": "LLM Model API version" + } + }, + "embeddingModelName": { + "type": "string", + "defaultValue": "text-embedding-ada-002", + "metadata": { + "description": "Embedding model name" + } + }, + "embeddingModelVersion": { + "type": "string", + "metadata": { + "description": "Embedding Model API version" + } + }, + "llmTpmQuota": { + "type": "int", + "defaultValue": 10, + "metadata": { + "description": "TPM quota for llm model deployment (x1000)" + } + }, + "embeddingTpmQuota": { + "type": "int", + "defaultValue": 10, + "metadata": { + "description": "TPM quota for embedding model deployment (x1000)" + } + } + }, + "resources": [ + { + "type": "Microsoft.CognitiveServices/accounts", + "apiVersion": "2024-10-01", + "name": "[parameters('openAiName')]", + "location": "[parameters('location')]", + "sku": { + "name": "S0" + }, + "kind": "OpenAI", + "properties": { + "publicNetworkAccess": "Enabled", + "disableLocalAuth": true + } + }, + { + "type": "Microsoft.CognitiveServices/accounts/deployments", + "apiVersion": "2024-10-01", + "name": "[format('{0}/{1}', parameters('openAiName'), parameters('llmModelName'))]", + "sku": { + "name": "GlobalStandard", + "capacity": "[parameters('llmTpmQuota')]" + }, + "properties": { + "model": { + "format": "OpenAI", + "name": "[parameters('llmModelName')]", + "version": "[parameters('llmModelVersion')]" + }, + "currentCapacity": "[parameters('llmTpmQuota')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName'))]" + ] + }, + { + "type": "Microsoft.CognitiveServices/accounts/deployments", + "apiVersion": "2024-10-01", + "name": "[format('{0}/{1}', parameters('openAiName'), parameters('embeddingModelName'))]", + "sku": { + "name": "Standard", + "capacity": "[parameters('embeddingTpmQuota')]" + }, + "properties": { + "model": { + "format": "OpenAI", + "name": "[parameters('embeddingModelName')]", + "version": "[parameters('embeddingModelVersion')]" + }, + "currentCapacity": "[parameters('embeddingTpmQuota')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName'))]", + "[resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('llmModelName'))]" + ] + } + ], + "outputs": { + "openAiEndpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName')), '2024-10-01').endpoint]" + }, + "llmModel": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('llmModelName')), '2024-10-01').model.name]" + }, + "llmModelDeploymentName": { + "type": "string", + "value": "[parameters('llmModelName')]" + }, + "llmModelApiVersion": { + "type": "string", + "value": "2024-10-01" + }, + "textEmbeddingModel": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('embeddingModelName')), '2024-10-01').model.name]" + }, + "textEmbeddingModelDeploymentName": { + "type": "string", + "value": "[parameters('embeddingModelName')]" + }, + "textEmbeddingModelApiVersion": { + "type": "string", + "value": "2024-10-01" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "acr-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "registryName": "[if(not(empty(parameters('acrName'))), createObject('value', parameters('acrName')), createObject('value', format('{0}{1}', variables('abbrs').containerRegistryRegistries, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "2055687397636798534" + } + }, + "parameters": { + "registryName": { + "type": "string", + "metadata": { + "description": "The name of the Container Registry resource. Will be automatically generated if not provided." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Container Registry resource." + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerRegistry/registries", + "apiVersion": "2023-11-01-preview", + "name": "[parameters('registryName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard" + }, + "properties": { + "adminUserEnabled": false, + "encryption": { + "status": "disabled" + }, + "dataEndpointEnabled": false, + "publicNetworkAccess": "Enabled", + "networkRuleBypassOptions": "AzureServices", + "zoneRedundancy": "Disabled", + "anonymousPullEnabled": false, + "metadataSearch": "Disabled" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('registryName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerRegistry/registries', parameters('registryName'))]" + }, + "loginServer": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerRegistry/registries', parameters('registryName')), '2023-11-01-preview').loginServer]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "clusterName": { + "value": "[format('{0}{1}', variables('abbrs').containerServiceManagedClusters, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "graphragVMSize": { + "value": "standard_d8s_v5" + }, + "graphragIndexingVMSize": { + "value": "standard_e8s_v5" + }, + "clusterAdmins": { + "value": null + }, + "logAnalyticsWorkspaceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "privateDnsZoneName": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "11487597397946974030" + } + }, + "parameters": { + "clusterName": { + "type": "string", + "metadata": { + "description": "The name of the Managed Cluster resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Managed Cluster resource." + } + }, + "logAnalyticsWorkspaceId": { + "type": "string", + "metadata": { + "description": "The workspace id of the Log Analytics resource." + } + }, + "autoUpgradeProfile": { + "type": "object", + "defaultValue": { + "nodeOsUpgradeChannel": "NodeImage", + "upgradeChannel": "stable" + }, + "metadata": { + "description": "The auto-upgrade profile." + } + }, + "dnsPrefix": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN." + } + }, + "systemOsDiskSizeGB": { + "type": "int", + "defaultValue": 128, + "minValue": 0, + "maxValue": 1023, + "metadata": { + "description": "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize." + } + }, + "systemNodeCount": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 20, + "metadata": { + "description": "The number of nodes for the system node pool." + } + }, + "systemVMSize": { + "type": "string", + "defaultValue": "standard_d4s_v5", + "metadata": { + "description": "The size of the system Virtual Machine." + } + }, + "graphragNodeCount": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 50, + "metadata": { + "description": "The number of nodes for the graphrag node pool." + } + }, + "graphragVMSize": { + "type": "string", + "defaultValue": "standard_d8s_v5", + "metadata": { + "description": "The VM size of nodes running the GraphRAG API." + } + }, + "graphragIndexingVMSize": { + "type": "string", + "defaultValue": "standard_e8s_v5", + "metadata": { + "description": "The VM size of nodes running GraphRAG indexing jobs." + } + }, + "enableEncryptionAtHost": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Enable encryption at host" + } + }, + "subnetId": { + "type": "string" + }, + "privateDnsZoneName": { + "type": "string" + }, + "clusterAdmins": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "Array of object ids that will have admin role of the cluster" + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerService/managedClusters/agentPools", + "apiVersion": "2024-02-01", + "name": "[format('{0}/{1}', parameters('clusterName'), 'graphrag')]", + "properties": { + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 1, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": "[parameters('graphragNodeCount')]", + "vmSize": "[parameters('graphragVMSize')]", + "osType": "Linux", + "mode": "User", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "nodeLabels": { + "workload": "graphrag" + }, + "tags": { + "workload": "graphrag" + }, + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters/agentPools", + "apiVersion": "2024-02-01", + "name": "[format('{0}/{1}', parameters('clusterName'), 'indexing')]", + "properties": { + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 0, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": 0, + "vmSize": "[parameters('graphragIndexingVMSize')]", + "osType": "Linux", + "mode": "User", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "nodeLabels": { + "workload": "graphrag-indexing" + }, + "tags": { + "workload": "graphrag" + }, + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters", + "apiVersion": "2024-09-02-preview", + "name": "[parameters('clusterName')]", + "location": "[parameters('location')]", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "enableRBAC": true, + "disableLocalAccounts": true, + "dnsPrefix": "[if(not(empty(parameters('dnsPrefix'))), parameters('dnsPrefix'), toLower(parameters('clusterName')))]", + "aadProfile": { + "managed": true, + "enableAzureRBAC": true, + "adminGroupObjectIDs": "[parameters('clusterAdmins')]" + }, + "addonProfiles": { + "omsagent": { + "enabled": true, + "config": { + "logAnalyticsWorkspaceResourceID": "[parameters('logAnalyticsWorkspaceId')]" + } + } + }, + "agentPoolProfiles": [ + { + "name": "agentpool", + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 1, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": "[parameters('systemNodeCount')]", + "vmSize": "[parameters('systemVMSize')]", + "osType": "Linux", + "mode": "System", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "type": "VirtualMachineScaleSets" + } + ], + "autoScalerProfile": { + "expander": "least-waste" + }, + "ingressProfile": { + "webAppRouting": { + "enabled": true, + "dnsZoneResourceIds": [ + "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateDnsZoneName'))]" + ] + } + }, + "networkProfile": { + "serviceCidr": "10.3.0.0/16", + "dnsServiceIP": "10.3.0.10", + "podCidr": "10.244.0.0/16" + }, + "autoUpgradeProfile": "[parameters('autoUpgradeProfile')]", + "oidcIssuerProfile": { + "enabled": true + }, + "securityProfile": { + "workloadIdentity": { + "enabled": true + } + } + } + }, + { + "type": "Microsoft.ContainerService/managedClusters/maintenanceConfigurations", + "apiVersion": "2024-09-02-preview", + "name": "[format('{0}/{1}', parameters('clusterName'), 'aksManagedAutoUpgradeSchedule')]", + "properties": { + "maintenanceWindow": { + "schedule": { + "weekly": { + "intervalWeeks": 1, + "dayOfWeek": "Monday" + } + }, + "durationHours": 4, + "startDate": "2024-06-11", + "startTime": "12:00" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters/maintenanceConfigurations", + "apiVersion": "2024-09-02-preview", + "name": "[format('{0}/{1}', parameters('clusterName'), 'aksManagedNodeOSUpgradeSchedule')]", + "properties": { + "maintenanceWindow": { + "schedule": { + "weekly": { + "intervalWeeks": 1, + "dayOfWeek": "Saturday" + } + }, + "durationHours": 4, + "startDate": "2024-06-11", + "startTime": "12:00" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('clusterName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + }, + "managedResourceGroup": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').nodeResourceGroup]" + }, + "controlPlaneFqdn": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').fqdn]" + }, + "kubeletPrincipalId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').identityProfile.kubeletidentity.objectId]" + }, + "ingressWebAppIdentity": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').ingressProfile.webAppRouting.identity.objectId]" + }, + "systemIdentity": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview', 'full').identity.principalId]" + }, + "issuer": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').oidcIssuerProfile.issuerURL]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "cosmosdb-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "cosmosDbName": "[if(not(empty(parameters('cosmosDbName'))), createObject('value', parameters('cosmosDbName')), createObject('value', format('{0}{1}', variables('abbrs').documentDBDatabaseAccounts, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "11816911936820039606" + } + }, + "parameters": { + "cosmosDbName": { + "type": "string", + "metadata": { + "description": "The name of the CosmosDB resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the CosmosDB resource." + } + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "Disabled", + "allowedValues": [ + "Enabled", + "Disabled" + ] + } + }, + "resources": [ + { + "type": "Microsoft.DocumentDB/databaseAccounts", + "apiVersion": "2024-11-15", + "name": "[parameters('cosmosDbName')]", + "location": "[parameters('location')]", + "tags": { + "defaultExperience": "Core (SQL)", + "hidden-cosmos-mmspecial": "" + }, + "kind": "GlobalDocumentDB", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "publicNetworkAccess": "[parameters('publicNetworkAccess')]", + "enableAutomaticFailover": false, + "enableMultipleWriteLocations": false, + "isVirtualNetworkFilterEnabled": false, + "virtualNetworkRules": [], + "disableKeyBasedMetadataWriteAccess": false, + "enableFreeTier": false, + "enableAnalyticalStorage": false, + "analyticalStorageConfiguration": { + "schemaType": "WellDefined" + }, + "databaseAccountOfferType": "Standard", + "defaultIdentity": "FirstPartyIdentity", + "networkAclBypass": "None", + "disableLocalAuth": true, + "enablePartitionMerge": false, + "minimalTlsVersion": "Tls12", + "consistencyPolicy": { + "defaultConsistencyLevel": "Session", + "maxIntervalInSeconds": 5, + "maxStalenessPrefix": 100 + }, + "locations": [ + { + "locationName": "[parameters('location')]", + "failoverPriority": 0, + "isZoneRedundant": false + } + ], + "cors": [], + "capabilities": [], + "ipRules": [], + "backupPolicy": { + "type": "Periodic", + "periodicModeProperties": { + "backupIntervalInMinutes": 240, + "backupRetentionIntervalInHours": 8, + "backupStorageRedundancy": "Geo" + } + }, + "networkAclBypassResourceIds": [], + "capacity": { + "totalThroughputLimit": 4000 + } + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('cosmosDbName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + }, + "endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), '2024-11-15').documentEndpoint]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aisearch-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": "[if(not(empty(parameters('aiSearchName'))), createObject('value', parameters('aiSearchName')), createObject('value', format('{0}{1}', variables('abbrs').searchSearchServices, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'disabled'), createObject('value', 'enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "2376857239076024622" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the AI Search instance." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Managed Cluster resource." + } + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "enabled", + "allowedValues": [ + "enabled", + "disabled" + ] + } + }, + "resources": [ + { + "type": "Microsoft.Search/searchServices", + "apiVersion": "2024-03-01-preview", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "sku": { + "name": "standard" + }, + "properties": { + "disableLocalAuth": true, + "replicaCount": 1, + "partitionCount": 1, + "publicNetworkAccess": "[parameters('publicNetworkAccess')]", + "semanticSearch": "disabled" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Search/searchServices', parameters('name'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "storage-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": "[if(not(empty(parameters('storageAccountName'))), createObject('value', parameters('storageAccountName')), createObject('value', format('{0}{1}', variables('abbrs').storageStorageAccounts, replace(variables('resourceBaseNameFinal'), '-', ''))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]", + "tags": { + "value": "[variables('tags')]" + }, + "deleteRetentionPolicy": { + "value": { + "enabled": true, + "days": 5 + } + }, + "defaultToOAuthAuthentication": { + "value": true + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "5608400408329637194" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the Storage Account resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Storage Account resource." + } + }, + "accessTier": { + "type": "string", + "defaultValue": "Hot", + "allowedValues": [ + "Hot", + "Cool", + "Premium" + ] + }, + "dnsEndpointType": { + "type": "string", + "defaultValue": "Standard", + "allowedValues": [ + "AzureDnsZone", + "Standard" + ] + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "Disabled", + "allowedValues": [ + "Enabled", + "Disabled" + ] + }, + "tags": { + "type": "object", + "defaultValue": {} + }, + "allowBlobPublicAccess": { + "type": "bool", + "defaultValue": false + }, + "allowCrossTenantReplication": { + "type": "bool", + "defaultValue": true + }, + "allowSharedKeyAccess": { + "type": "bool", + "defaultValue": false + }, + "defaultToOAuthAuthentication": { + "type": "bool", + "defaultValue": false + }, + "deleteRetentionPolicy": { + "type": "object", + "defaultValue": {} + }, + "kind": { + "type": "string", + "defaultValue": "StorageV2" + }, + "minimumTlsVersion": { + "type": "string", + "defaultValue": "TLS1_2" + }, + "containers": { + "type": "array", + "defaultValue": [] + } + }, + "resources": [ + { + "copy": { + "name": "storage::blobServices::container", + "count": "[length(parameters('containers'))]" + }, + "condition": "[not(empty(parameters('containers')))]", + "type": "Microsoft.Storage/storageAccounts/blobServices/containers", + "apiVersion": "2023-01-01", + "name": "[format('{0}/{1}/{2}', parameters('name'), 'default', parameters('containers')[copyIndex()].name)]", + "properties": { + "publicAccess": "[coalesce(tryGet(parameters('containers')[copyIndex()], 'publicAccess'), 'None')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('name'), 'default')]" + ] + }, + { + "condition": "[not(empty(parameters('containers')))]", + "type": "Microsoft.Storage/storageAccounts/blobServices", + "apiVersion": "2023-01-01", + "name": "[format('{0}/{1}', parameters('name'), 'default')]", + "properties": { + "deleteRetentionPolicy": "[parameters('deleteRetentionPolicy')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]" + ] + }, + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2023-01-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "tags": "[parameters('tags')]", + "kind": "[parameters('kind')]", + "sku": { + "name": "Standard_LRS" + }, + "properties": { + "accessTier": "[parameters('accessTier')]", + "allowBlobPublicAccess": "[parameters('allowBlobPublicAccess')]", + "allowCrossTenantReplication": "[parameters('allowCrossTenantReplication')]", + "allowSharedKeyAccess": "[parameters('allowSharedKeyAccess')]", + "defaultToOAuthAuthentication": "[parameters('defaultToOAuthAuthentication')]", + "dnsEndpointType": "[parameters('dnsEndpointType')]", + "isHnsEnabled": true, + "minimumTlsVersion": "[parameters('minimumTlsVersion')]", + "networkAcls": { + "bypass": "AzureServices", + "defaultAction": "Allow" + }, + "publicNetworkAccess": "[parameters('publicNetworkAccess')]" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]" + }, + "primaryEndpoints": { + "type": "object", + "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('name')), '2023-01-01').primaryEndpoints]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "app-insights-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "appInsightsName": { + "value": "[format('{0}{1}', variables('abbrs').insightsComponents, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "appInsightsPublicNetworkAccessForIngestion": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]", + "logAnalyticsWorkspaceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "14280738582927740005" + } + }, + "parameters": { + "appInsightsName": { + "type": "string", + "defaultValue": "appi", + "metadata": { + "description": "Application Insights resource name" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + }, + "appInsightsPublicNetworkAccessForIngestion": { + "type": "string", + "defaultValue": "Disabled", + "metadata": { + "description": "Application Insights public network access for ingestion" + } + }, + "logAnalyticsWorkspaceId": { + "type": "string", + "metadata": { + "description": "Workspace id of a Log Analytics resource." + } + } + }, + "resources": [ + { + "type": "Microsoft.Insights/components", + "apiVersion": "2020-02-02", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('location')]", + "kind": "web", + "properties": { + "Application_Type": "web", + "WorkspaceResourceId": "[parameters('logAnalyticsWorkspaceId')]", + "publicNetworkAccessForIngestion": "[parameters('appInsightsPublicNetworkAccessForIngestion')]", + "publicNetworkAccessForQuery": "Enabled" + } + } + ], + "outputs": { + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Insights/components', parameters('appInsightsName'))]" + }, + "connectionString": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName')), '2020-02-02').ConnectionString]" + }, + "instrumentationKey": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName')), '2020-02-02').InstrumentationKey]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "apim-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "apiManagementName": "[if(not(empty(parameters('apimName'))), createObject('value', parameters('apimName')), createObject('value', format('{0}{1}', variables('abbrs').apiManagementService, variables('resourceBaseNameFinal'))))]", + "restoreAPIM": { + "value": "[parameters('restoreAPIM')]" + }, + "appInsightsId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.id.value]" + }, + "appInsightsInstrumentationKey": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.instrumentationKey.value]" + }, + "publicIpName": { + "value": "[format('{0}{1}', variables('abbrs').networkPublicIPAddresses, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "sku": { + "value": "[parameters('apimTier')]" + }, + "skuCount": { + "value": 1 + }, + "availabilityZones": { + "value": [] + }, + "publisherEmail": { + "value": "[parameters('apiPublisherEmail')]" + }, + "publisherName": { + "value": "[parameters('apiPublisherName')]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.apimSubnetId.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "14582251664377611150" + } + }, + "parameters": { + "apiManagementName": { + "type": "string", + "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "The name of the API Management service instance" + } + }, + "publisherEmail": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "The email address of the owner of the service" + } + }, + "publisherName": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "The name of the owner of the service" + } + }, + "sku": { + "type": "string", + "defaultValue": "Developer", + "allowedValues": [ + "Developer", + "StandardV2" + ], + "metadata": { + "description": "The pricing tier of this API Management service" + } + }, + "skuCount": { + "type": "int", + "defaultValue": 1, + "metadata": { + "description": "The instance size of this API Management service. This should be a multiple of the number of availability zones getting deployed." + } + }, + "appInsightsId": { + "type": "string", + "metadata": { + "description": "Application Insights resource ID" + } + }, + "appInsightsInstrumentationKey": { + "type": "string", + "metadata": { + "description": "Application Insights instrumentation key" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + }, + "availabilityZones": { + "type": "array", + "defaultValue": [ + "1", + "2" + ], + "metadata": { + "description": "Numbers for availability zones, for example, 1,2,3." + } + }, + "publicIpName": { + "type": "string", + "defaultValue": "apimPublicIP", + "metadata": { + "description": "Name for the public IP address used to access the API Management service." + } + }, + "publicIpSku": { + "type": "string", + "defaultValue": "Standard", + "allowedValues": [ + "Standard" + ], + "metadata": { + "description": "SKU for the public IP address used to access the API Management service." + } + }, + "publicIPAllocationMethod": { + "type": "string", + "defaultValue": "Static", + "allowedValues": [ + "Static" + ], + "metadata": { + "description": "Allocation method for the public IP address used to access the API Management service. Standard SKU public IP requires `Static` allocation." + } + }, + "dnsLabelPrefix": { + "type": "string", + "defaultValue": "[toLower(format('{0}-{1}', parameters('publicIpName'), uniqueString(resourceGroup().id)))]", + "metadata": { + "description": "Unique DNS name for the public IP address used to access the API management service." + } + }, + "restoreAPIM": { + "type": "bool", + "defaultValue": false + }, + "subnetId": { + "type": "string" + } + }, + "resources": [ + { + "type": "Microsoft.Network/publicIPAddresses", + "apiVersion": "2024-01-01", + "name": "[parameters('publicIpName')]", + "location": "[parameters('location')]", + "sku": { + "name": "[parameters('publicIpSku')]" + }, + "properties": { + "publicIPAllocationMethod": "[parameters('publicIPAllocationMethod')]", + "publicIPAddressVersion": "IPv4", + "dnsSettings": { + "domainNameLabel": "[parameters('dnsLabelPrefix')]" + } + } + }, + { + "type": "Microsoft.ApiManagement/service", + "apiVersion": "2023-09-01-preview", + "name": "[parameters('apiManagementName')]", + "location": "[parameters('location')]", + "sku": { + "name": "[parameters('sku')]", + "capacity": "[parameters('skuCount')]" + }, + "zones": "[if(equals(length(parameters('availabilityZones')), 0), null(), parameters('availabilityZones'))]", + "properties": { + "restore": "[parameters('restoreAPIM')]", + "publisherEmail": "[parameters('publisherEmail')]", + "publisherName": "[parameters('publisherName')]", + "virtualNetworkType": "External", + "publicIpAddressId": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]", + "virtualNetworkConfiguration": { + "subnetResourceId": "[parameters('subnetId')]" + }, + "customProperties": { + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "false" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/loggers", + "apiVersion": "2024-06-01-preview", + "name": "[format('{0}/{1}', parameters('apiManagementName'), 'apimLogger')]", + "properties": { + "credentials": { + "instrumentationKey": "[parameters('appInsightsInstrumentationKey')]" + }, + "description": "Application Insights for APIM", + "loggerType": "applicationInsights", + "resourceId": "[parameters('appInsightsId')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/diagnostics", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}', parameters('apiManagementName'), 'applicationinsights')]", + "properties": { + "loggerId": "[resourceId('Microsoft.ApiManagement/service/loggers', parameters('apiManagementName'), 'apimLogger')]", + "alwaysLog": "allErrors", + "verbosity": "information", + "sampling": { + "percentage": 100, + "samplingType": "fixed" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]", + "[resourceId('Microsoft.ApiManagement/service/loggers', parameters('apiManagementName'), 'apimLogger')]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('apiManagementName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]" + }, + "apimGatewayUrl": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName')), '2023-09-01-preview').gatewayUrl]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "graphrag-api-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "apimname": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "backendUrl": { + "value": "[variables('appUrl')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "10620983066885906719" + } + }, + "parameters": { + "apimname": { + "type": "string" + }, + "backendUrl": { + "type": "string" + } + }, + "resources": [ + { + "type": "Microsoft.ApiManagement/service/apis/operations", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}/{2}', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1], 'docs')]", + "properties": { + "displayName": "docs", + "method": "GET", + "urlTemplate": "/docs", + "templateParameters": [], + "responses": [] + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis/operations", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}/{2}', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1], 'openapi')]", + "properties": { + "displayName": "openapi", + "method": "GET", + "urlTemplate": "/openapi.json", + "templateParameters": [], + "responses": [] + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/documentation', parameters('apimname'))]", + "properties": { + "displayName": "documentation", + "apiRevision": "1", + "subscriptionRequired": false, + "serviceUrl": "[format('{0}/manpage', parameters('backendUrl'))]", + "path": "manpage", + "protocols": [ + "https" + ], + "authenticationSettings": { + "oAuth2AuthenticationSettings": [], + "openidAuthenticationSettings": [] + }, + "subscriptionKeyParameterNames": { + "header": "Ocp-Apim-Subscription-Key", + "query": "subscription-key" + }, + "isCurrent": true + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "workload-identity-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[variables('workloadIdentityName')]" + }, + "location": { + "value": "[parameters('location')]" + }, + "federatedCredentials": { + "value": { + "aks-workload-identity": { + "issuer": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.issuer.value]", + "audiences": [ + "api://AzureADTokenExchange" + ], + "subject": "[variables('workloadIdentitySubject')]" + } + } + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "11208726344160642523" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the identity" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the identity" + } + }, + "federatedCredentials": { + "type": "object", + "defaultValue": {}, + "metadata": { + "description": "federated name: FederatedIdentityCredentialProperties. See https://learn.microsoft.com/en-us/azure/templates/microsoft.managedidentity/userassignedidentities/federatedidentitycredentials?pivots=deployment-language-bicep#federatedidentitycredentialproperties" + } + } + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2023-01-31", + "name": "[parameters('name')]", + "location": "[parameters('location')]" + }, + { + "copy": { + "name": "federatedCredentialResources", + "count": "[length(items(parameters('federatedCredentials')))]" + }, + "type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials", + "apiVersion": "2023-01-31", + "name": "[format('{0}/{1}', parameters('name'), items(parameters('federatedCredentials'))[copyIndex()].key)]", + "properties": "[items(parameters('federatedCredentials'))[copyIndex()].value]", + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "clientId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name')), '2023-01-31').clientId]" + }, + "principalId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name')), '2023-01-31').principalId]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "private-dns-zone-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[variables('dnsDomain')]" + }, + "vnetNames": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.vnetName.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "languageVersion": "2.0", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "1285005992081263811" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the private DNS zone." + } + }, + "vnetNames": { + "type": "array", + "items": { + "type": "string" + }, + "metadata": { + "description": "The name of the virtual networks the DNS zone should be associated with." + } + } + }, + "resources": { + "dnsZone": { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[parameters('name')]", + "location": "global", + "properties": {} + }, + "vnets": { + "copy": { + "name": "vnets", + "count": "[length(parameters('vnetNames'))]" + }, + "existing": true, + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2024-01-01", + "name": "[parameters('vnetNames')[copyIndex()]]" + }, + "dnsZoneLinks": { + "copy": { + "name": "dnsZoneLinks", + "count": "[length(parameters('vnetNames'))]" + }, + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', parameters('name'), parameters('vnetNames')[copyIndex()])]", + "location": "global", + "properties": { + "registrationEnabled": false, + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetNames')[copyIndex()])]" + } + }, + "dependsOn": [ + "dnsZone" + ] + } + }, + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/privateDnsZones', parameters('name'))]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "privatelink-private-dns-zones-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "linkedVnetIds": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.vnetId.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "16525541988331055931" + } + }, + "parameters": { + "linkedVnetIds": { + "type": "array", + "metadata": { + "description": "Virtual Network IDs to link to" + } + } + }, + "variables": { + "$fxv#0": { + "azureCloud": { + "azureMonitor": [ + "privatelink.monitor.azure.com", + "privatelink.oms.opinsights.azure.com", + "privatelink.agentsvc.azure-automation.net", + "privatelink.ods.opinsights.azure.com" + ] + }, + "azureusgovernment": { + "azureMonitor": [ + "privatelink.monitor.azure.us", + "privatelink.oms.opinsights.azure.us", + "privatelink.agentsvc.azure-automation.us", + "privatelink.ods.opinsights.azure.us" + ] + } + }, + "aiSearchPrivateDnsZoneName": "privatelink.search.windows.net", + "blobStoragePrivateDnsZoneName": "[format('privatelink.blob.{0}', environment().suffixes.storage)]", + "cosmosDbPrivateDnsZoneName": "privatelink.documents.azure.com", + "storagePrivateDnsZoneNames": [ + "[variables('blobStoragePrivateDnsZoneName')]" + ], + "privateDnsZoneData": "[variables('$fxv#0')]", + "cloudName": "[toLower(environment().name)]", + "azureMonitorPrivateDnsZones": "[variables('privateDnsZoneData')[variables('cloudName')].azureMonitor]", + "privateDnsZones": "[union(variables('azureMonitorPrivateDnsZones'), variables('storagePrivateDnsZoneNames'), createArray(variables('cosmosDbPrivateDnsZoneName')), createArray(variables('aiSearchPrivateDnsZoneName')))]" + }, + "resources": [ + { + "copy": { + "name": "privateDnsZoneResources", + "count": "[length(variables('privateDnsZones'))]" + }, + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsZones')[copyIndex()]]", + "location": "global" + }, + { + "copy": { + "name": "dnsVnetLinks", + "count": "[length(variables('privateDnsZones'))]" + }, + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "[replace(variables('privateDnsZones')[copyIndex()], '.', '-')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateDnsZoneName": { + "value": "[variables('privateDnsZones')[copyIndex()]]" + }, + "vnetIds": { + "value": "[parameters('linkedVnetIds')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "6113218360443805978" + } + }, + "parameters": { + "privateDnsZoneName": { + "type": "string" + }, + "vnetIds": { + "type": "array" + } + }, + "resources": [ + { + "copy": { + "name": "dnsVnetLinks", + "count": "[length(parameters('vnetIds'))]" + }, + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', parameters('privateDnsZoneName'), format('{0}-{1}', replace(parameters('privateDnsZoneName'), '.', '-'), uniqueString(parameters('vnetIds')[copyIndex()])))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[parameters('vnetIds')[copyIndex()]]" + }, + "registrationEnabled": false + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[copyIndex()])]" + ] + } + ], + "outputs": { + "azureMonitorPrivateDnsZoneConfigs": { + "type": "array", + "copy": { + "count": "[length(union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName'))))]", + "input": { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName')))[copyIndex()])]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName')))[copyIndex()])])]" + } + } + } + }, + "blobStoragePrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('blobStoragePrivateDnsZoneName')]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('blobStoragePrivateDnsZoneName'))])]" + } + } + ] + }, + "cosmosDbPrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('cosmosDbPrivateDnsZoneName'))]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('cosmosDbPrivateDnsZoneName'))])]" + } + } + ] + }, + "aiSearchPrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('aiSearchPrivateDnsZoneName'))]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('aiSearchPrivateDnsZoneName'))])]" + } + } + ] + }, + "privateDnsZones": { + "type": "array", + "value": "[variables('privateDnsZones')]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "azure-monitor-privatelink-scope-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateLinkScopeName": { + "value": "[format('pls-{0}', variables('resourceBaseNameFinal'))]" + }, + "privateLinkScopedResources": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]", + "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.id.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "3076000571800932587" + } + }, + "parameters": { + "privateLinkScopeName": { + "type": "string" + }, + "privateLinkScopedResources": { + "type": "array", + "defaultValue": [] + }, + "queryAccessMode": { + "type": "string", + "defaultValue": "Open" + }, + "ingestionAccessMode": { + "type": "string", + "defaultValue": "PrivateOnly" + } + }, + "resources": [ + { + "type": "microsoft.insights/privateLinkScopes", + "apiVersion": "2021-07-01-preview", + "name": "[parameters('privateLinkScopeName')]", + "location": "global", + "properties": { + "accessModeSettings": { + "queryAccessMode": "[parameters('queryAccessMode')]", + "ingestionAccessMode": "[parameters('ingestionAccessMode')]" + } + } + }, + { + "copy": { + "name": "scopedResources", + "count": "[length(parameters('privateLinkScopedResources'))]" + }, + "type": "Microsoft.Insights/privateLinkScopes/scopedResources", + "apiVersion": "2021-07-01-preview", + "name": "[format('{0}/{1}', parameters('privateLinkScopeName'), uniqueString(parameters('privateLinkScopedResources')[copyIndex()]))]", + "properties": { + "linkedResourceId": "[parameters('privateLinkScopedResources')[copyIndex()]]" + }, + "dependsOn": [ + "[resourceId('microsoft.insights/privateLinkScopes', parameters('privateLinkScopeName'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('privateLinkScopeName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('microsoft.insights/privateLinkScopes', parameters('privateLinkScopeName'))]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "cosmosDb-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}cosmos-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "Sql" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.cosmosDbPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "13518705746136222913" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "blob-storage-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}blob-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "blob" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.blobStoragePrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "13518705746136222913" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'storage-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "ai-search-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}search-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "searchService" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.aiSearchPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "13518705746136222913" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aisearch-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "privatelink-scope-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}pls-{1}', variables('abbrs').privateEndpoint, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'azure-monitor-privatelink-scope-deployment'), '2022-09-01').outputs.id.value), createObject('value', ''))]", + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "azuremonitor" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.azureMonitorPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.13.18514", + "templateHash": "13518705746136222913" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'azure-monitor-privatelink-scope-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + } + ], + "outputs": { + "azure_location": { + "type": "string", + "value": "[parameters('location')]" + }, + "azure_tenant_id": { + "type": "string", + "value": "[tenant().tenantId]" + }, + "azure_ai_search_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_acr_login_server": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.loginServer.value]" + }, + "azure_acr_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_controlplanefqdn": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.controlPlaneFqdn.value]" + }, + "azure_aks_managed_rg": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.managedResourceGroup.value]" + }, + "azure_aks_service_account_name": { + "type": "string", + "value": "[variables('aksServiceAccountName')]" + }, + "azure_aoai_endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.openAiEndpoint.value]" + }, + "azure_aoai_llm_model": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModel.value]" + }, + "azure_aoai_llm_model_deployment_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelDeploymentName.value]" + }, + "azure_aoai_llm_model_api_version": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelApiVersion.value]" + }, + "azure_aoai_embedding_model": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModel.value]" + }, + "azure_aoai_embedding_model_deployment_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelDeploymentName.value]" + }, + "azure_aoai_embedding_model_api_version": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelApiVersion.value]" + }, + "azure_apim_gateway_url": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.apimGatewayUrl.value]" + }, + "azure_apim_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_app_hostname": { + "type": "string", + "value": "[variables('appHostname')]" + }, + "azure_app_url": { + "type": "string", + "value": "[variables('appUrl')]" + }, + "azure_app_insights_connection_string": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.connectionString.value]" + }, + "azure_cosmosdb_endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.endpoint.value]" + }, + "azure_cosmosdb_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_cosmosdb_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "azure_dns_zone_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_private_dns_zones": { + "type": "array", + "value": "[if(parameters('enablePrivateEndpoints'), union(reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.privateDnsZones.value, createArray(reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value)), createArray())]" + }, + "azure_storage_account": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account_blob_url": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.primaryEndpoints.value.blob]" + }, + "azure_workload_identity_client_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.clientId.value]" + }, + "azure_workload_identity_principal_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "azure_workload_identity_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.name.value]" + } + } +} \ No newline at end of file diff --git a/infra/managed-app/managed-app.zip b/infra/managed-app/managed-app.zip new file mode 100644 index 0000000000000000000000000000000000000000..d28a2c2b029bc89c2da2831f1f48aa464de412d7 GIT binary patch literal 31357 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 R149V;Sw)3`39y5H`ac=Q$@2gJ literal 0 HcmV?d00001 diff --git a/infra/managed-app/managedapp.zip b/infra/managed-app/managedapp.zip new file mode 100644 index 0000000000000000000000000000000000000000..d28a2c2b029bc89c2da2831f1f48aa464de412d7 GIT binary patch literal 31357 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 R149V;Sw)3`39y5H`ac=Q$@2gJ literal 0 HcmV?d00001 diff --git a/infra/managed-app/openapi.json b/infra/managed-app/openapi.json new file mode 100644 index 00000000..5ed5b27b --- /dev/null +++ b/infra/managed-app/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"GraphRAG","version":"v0.0.0"},"paths":{"/data":{"get":{"tags":["Data Management"],"summary":"Get all data storage containers.","description":"Retrieve a list of all data storage containers.","operationId":"get_all_data_storage_containers_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageNameList"}}}}}},"post":{"tags":["Data Management"],"summary":"Upload data to a data storage container","description":"Create a data storage container in Azure and upload files to it.\n\nArgs:\n files (List[UploadFile]): A list of files to be uploaded.\n storage_name (str): The name of the Azure Blob Storage container to which files will be uploaded.\n overwrite (bool): Whether to overwrite existing files with the same name. Defaults to True. If False, files that already exist will be skipped.\n\nReturns:\n BaseResponse: An instance of the BaseResponse model with a status message indicating the result of the upload.\n\nRaises:\n HTTPException: If the container name is invalid or if any error occurs during the upload process.","operationId":"upload_files_data_post","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"overwrite","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Overwrite"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_files_data_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/data/{storage_name}":{"delete":{"tags":["Data Management"],"summary":"Delete a data storage container","description":"Delete a specified data storage container.","operationId":"delete_files_data__storage_name__delete","parameters":[{"name":"storage_name","in":"path","required":true,"schema":{"type":"string","title":"Storage Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index":{"post":{"tags":["Index Operations"],"summary":"Build an index","operationId":"setup_indexing_pipeline_index_post","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"index_name","in":"query","required":true,"schema":{"type":"string","title":"Index Name"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_setup_indexing_pipeline_index_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Index Operations"],"summary":"Get all indexes","description":"Retrieve a list of all index names.","operationId":"get_all_indexes_index_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexNameList"}}}}}}},"/index/{index_name}":{"delete":{"tags":["Index Operations"],"summary":"Delete a specified index","description":"Delete a specified index.","operationId":"delete_index_index__index_name__delete","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/status/{index_name}":{"get":{"tags":["Index Operations"],"summary":"Track the status of an indexing job","operationId":"get_index_job_status_index_status__index_name__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/global":{"post":{"tags":["Query Operations"],"summary":"Perform a global search across the knowledge graph index","description":"The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.","operationId":"global_query_query_global_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/local":{"post":{"tags":["Query Operations"],"summary":"Perform a local search across the knowledge graph index.","description":"The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).","operationId":"local_query_query_local_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/streaming/global":{"post":{"tags":["Query Streaming Operations"],"summary":"Stream a response back after performing a global search","description":"The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.","operationId":"global_search_streaming_query_streaming_global_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/streaming/local":{"post":{"tags":["Query Streaming Operations"],"summary":"Stream a response back after performing a local search","description":"The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).","operationId":"local_search_streaming_query_streaming_local_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/config/prompts":{"get":{"tags":["Index Configuration"],"summary":"Generate graphrag prompts from user-provided data.","description":"Generating custom prompts from user-provided data may take several minutes to run based on the amount of data used.","operationId":"generate_prompts_index_config_prompts_get","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/report/{index_name}/{report_id}":{"get":{"tags":["Sources"],"summary":"Return a single community report.","operationId":"get_report_info_source_report__index_name___report_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/text/{index_name}/{text_unit_id}":{"get":{"tags":["Sources"],"summary":"Return a single base text unit.","operationId":"get_chunk_info_source_text__index_name___text_unit_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"text_unit_id","in":"path","required":true,"schema":{"type":"string","title":"Text Unit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextUnitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/entity/{index_name}/{entity_id}":{"get":{"tags":["Sources"],"summary":"Return a single entity.","operationId":"get_entity_info_source_entity__index_name___entity_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/claim/{index_name}/{claim_id}":{"get":{"tags":["Sources"],"summary":"Return a single claim.","operationId":"get_claim_info_source_claim__index_name___claim_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/relationship/{index_name}/{relationship_id}":{"get":{"tags":["Sources"],"summary":"Return a single relationship.","operationId":"get_relationship_info_source_relationship__index_name___relationship_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"relationship_id","in":"path","required":true,"schema":{"type":"integer","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/graphml/{index_name}":{"get":{"tags":["Graph Operations"],"summary":"Retrieve a GraphML file of the knowledge graph","operationId":"retrieve_graphml_file_graph_graphml__index_name__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"GraphML file successfully downloaded","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/stats/{index_name}":{"get":{"tags":["Graph Operations"],"summary":"Retrieve basic graph statistics, number of nodes and edges","operationId":"retrieve_graph_stats_graph_stats__index_name__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"API health check","description":"Returns a 200 response to indicate the API is healthy.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BaseResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"BaseResponse"},"Body_setup_indexing_pipeline_index_post":{"properties":{"entity_extraction_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Entity Extraction Prompt"},"community_report_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Community Report Prompt"},"summarize_descriptions_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Summarize Descriptions Prompt"}},"type":"object","title":"Body_setup_indexing_pipeline_index_post"},"Body_upload_files_data_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_files_data_post"},"ClaimResponse":{"properties":{"covariate_type":{"type":"string","title":"Covariate Type"},"type":{"type":"string","title":"Type"},"description":{"type":"string","title":"Description"},"subject_id":{"type":"string","title":"Subject Id"},"object_id":{"type":"string","title":"Object Id"},"source_text":{"type":"string","title":"Source Text"},"text_unit_id":{"type":"string","title":"Text Unit Id"},"document_ids":{"items":{"type":"string"},"type":"array","title":"Document Ids"}},"type":"object","required":["covariate_type","type","description","subject_id","object_id","source_text","text_unit_id","document_ids"],"title":"ClaimResponse"},"EntityResponse":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"text_units":{"items":{"type":"string"},"type":"array","title":"Text Units"}},"type":"object","required":["name","description","text_units"],"title":"EntityResponse"},"GraphDataResponse":{"properties":{"nodes":{"type":"integer","title":"Nodes"},"edges":{"type":"integer","title":"Edges"}},"type":"object","required":["nodes","edges"],"title":"GraphDataResponse"},"GraphRequest":{"properties":{"index_name":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Index Name"},"query":{"type":"string","title":"Query"}},"type":"object","required":["index_name","query"],"title":"GraphRequest"},"GraphResponse":{"properties":{"result":{"title":"Result"},"context_data":{"title":"Context Data"}},"type":"object","required":["result","context_data"],"title":"GraphResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IndexNameList":{"properties":{"index_name":{"items":{"type":"string"},"type":"array","title":"Index Name"}},"type":"object","required":["index_name"],"title":"IndexNameList"},"IndexStatusResponse":{"properties":{"status_code":{"type":"integer","title":"Status Code"},"index_name":{"type":"string","title":"Index Name"},"storage_name":{"type":"string","title":"Storage Name"},"status":{"type":"string","title":"Status"},"percent_complete":{"type":"number","title":"Percent Complete"},"progress":{"type":"string","title":"Progress"}},"type":"object","required":["status_code","index_name","storage_name","status","percent_complete","progress"],"title":"IndexStatusResponse"},"RelationshipResponse":{"properties":{"source":{"type":"string","title":"Source"},"source_id":{"type":"integer","title":"Source Id"},"target":{"type":"string","title":"Target"},"target_id":{"type":"integer","title":"Target Id"},"description":{"type":"string","title":"Description"},"text_units":{"items":{"type":"string"},"type":"array","title":"Text Units"}},"type":"object","required":["source","source_id","target","target_id","description","text_units"],"title":"RelationshipResponse"},"ReportResponse":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"ReportResponse"},"StorageNameList":{"properties":{"storage_name":{"items":{"type":"string"},"type":"array","title":"Storage Name"}},"type":"object","required":["storage_name"],"title":"StorageNameList"},"TextUnitResponse":{"properties":{"text":{"type":"string","title":"Text"},"source_document":{"type":"string","title":"Source Document"}},"type":"object","required":["text","source_document"],"title":"TextUnitResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file diff --git a/infra/runbicep.sh b/infra/runbicep.sh new file mode 100755 index 00000000..e2f70783 --- /dev/null +++ b/infra/runbicep.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +deployAzureResources () { + + + echo "Deploying Azure resources..." + local datetime="`date +%Y%m%d%H%M%S`" + local deployName="graphrag-deploy-$datetime" + local rggoup="harjsin$datetime" + echo "Deployment name: $deployName" + az group create -l eastus2 -n "$rggoup" + local AZURE_DEPLOY_RESULTS=$(az deployment group create --name "$deployName" \ + --no-prompt \ + --resource-group "$rggoup" \ + --mode Incremental \ + --template-file ./main.bicep \ + --parameters "resourceBaseName=$rggoup" \ + --parameters "resourceGroup=$rggoup" \ + --parameters "apimName=$rggoup" \ + --parameters "apimTier=Developer" \ + --parameters "apiPublisherName=harjsin" \ + --parameters "apiPublisherEmail=harjsin@microsoft.com" \ + --parameters "enablePrivateEndpoints=false" \ + --output json) + # errors in deployment may not be caught by exitIfCommandFailed function so we also check the output for errors + exitIfCommandFailed $? "Error deploying Azure resources..." + exitIfValueEmpty "$AZURE_DEPLOY_RESULTS" "Error deploying Azure resources..." + AZURE_OUTPUTS=$(jq -r .properties.outputs <<< "$AZURE_DEPLOY_RESULTS") + exitIfCommandFailed $? "Error parsing outputs from Azure deployment..." + exitIfValueEmpty "$AZURE_OUTPUTS" "Error parsing outputs from Azure deployment..." +} + + +deployAzureResources + diff --git a/openapi.json b/openapi.json new file mode 100644 index 00000000..aa507f6e --- /dev/null +++ b/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"GraphRAG","version":"v0.0.0"},"paths":{"/data":{"get":{"tags":["Data Management"],"summary":"Get all data storage containers.","description":"Retrieve a list of all data storage containers.","operationId":"get_all_data_storage_containers_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StorageNameList"}}}}}},"post":{"tags":["Data Management"],"summary":"Upload data to a data storage container","description":"Create a data storage container in Azure and upload files to it.\n\nArgs:\n files (List[UploadFile]): A list of files to be uploaded.\n storage_name (str): The name of the Azure Blob Storage container to which files will be uploaded.\n overwrite (bool): Whether to overwrite existing files with the same name. Defaults to True. If False, files that already exist will be skipped.\n\nReturns:\n BaseResponse: An instance of the BaseResponse model with a status message indicating the result of the upload.\n\nRaises:\n HTTPException: If the container name is invalid or if any error occurs during the upload process.","operationId":"upload_files_data_post","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"overwrite","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Overwrite"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_files_data_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/data/{storage_name}":{"delete":{"tags":["Data Management"],"summary":"Delete a data storage container","description":"Delete a specified data storage container.","operationId":"delete_files_data__storage_name__delete","parameters":[{"name":"storage_name","in":"path","required":true,"schema":{"type":"string","title":"Storage Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index":{"post":{"tags":["Index Operations"],"summary":"Build an index","operationId":"setup_indexing_pipeline_index_post","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"index_name","in":"query","required":true,"schema":{"type":"string","title":"Index Name"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_setup_indexing_pipeline_index_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Index Operations"],"summary":"Get all indexes","description":"Retrieve a list of all index names.","operationId":"get_all_indexes_index_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexNameList"}}}}}}},"/index/{index_name}":{"delete":{"tags":["Index Operations"],"summary":"Delete a specified index","description":"Delete a specified index.","operationId":"delete_index_index__index_name__delete","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/status/{index_name}":{"get":{"tags":["Index Operations"],"summary":"Track the status of an indexing job","operationId":"get_index_job_status_index_status__index_name__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IndexStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/global":{"post":{"tags":["Query Operations"],"summary":"Perform a global search across the knowledge graph index","description":"The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.","operationId":"global_query_query_global_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/local":{"post":{"tags":["Query Operations"],"summary":"Perform a local search across the knowledge graph index.","description":"The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).","operationId":"local_query_query_local_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/streaming/global":{"post":{"tags":["Query Streaming Operations"],"summary":"Stream a response back after performing a global search","description":"The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.","operationId":"global_search_streaming_query_streaming_global_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/query/streaming/local":{"post":{"tags":["Query Streaming Operations"],"summary":"Stream a response back after performing a local search","description":"The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).","operationId":"local_search_streaming_query_streaming_local_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/index/config/prompts":{"get":{"tags":["Index Configuration"],"summary":"Generate prompts from user-provided data.","description":"Generating custom prompts from user-provided data may take several minutes to run based on the amount of data used.","operationId":"generate_prompts_index_config_prompts_get","parameters":[{"name":"storage_name","in":"query","required":true,"schema":{"type":"string","title":"Storage Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/report/{index_name}/{report_id}":{"get":{"tags":["Sources"],"summary":"Return a single community report.","operationId":"get_report_info_source_report__index_name___report_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"report_id","in":"path","required":true,"schema":{"type":"string","title":"Report Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/text/{index_name}/{text_unit_id}":{"get":{"tags":["Sources"],"summary":"Return a single base text unit.","operationId":"get_chunk_info_source_text__index_name___text_unit_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"text_unit_id","in":"path","required":true,"schema":{"type":"string","title":"Text Unit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextUnitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/entity/{index_name}/{entity_id}":{"get":{"tags":["Sources"],"summary":"Return a single entity.","operationId":"get_entity_info_source_entity__index_name___entity_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"entity_id","in":"path","required":true,"schema":{"type":"integer","title":"Entity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/claim/{index_name}/{claim_id}":{"get":{"tags":["Sources"],"summary":"Return a single claim.","operationId":"get_claim_info_source_claim__index_name___claim_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"claim_id","in":"path","required":true,"schema":{"type":"integer","title":"Claim Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/source/relationship/{index_name}/{relationship_id}":{"get":{"tags":["Sources"],"summary":"Return a single relationship.","operationId":"get_relationship_info_source_relationship__index_name___relationship_id__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}},{"name":"relationship_id","in":"path","required":true,"schema":{"type":"integer","title":"Relationship Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelationshipResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/graph/graphml/{index_name}":{"get":{"tags":["Graph Operations"],"summary":"Retrieve a GraphML file of the knowledge graph","operationId":"get_graphml_file_graph_graphml__index_name__get","parameters":[{"name":"index_name","in":"path","required":true,"schema":{"type":"string","title":"Index Name"}}],"responses":{"200":{"description":"GraphML file successfully downloaded","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"API health check","description":"Returns a 200 response to indicate the API is healthy.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BaseResponse":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"BaseResponse"},"Body_setup_indexing_pipeline_index_post":{"properties":{"entity_extraction_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Entity Extraction Prompt"},"community_report_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Community Report Prompt"},"summarize_descriptions_prompt":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Summarize Descriptions Prompt"}},"type":"object","title":"Body_setup_indexing_pipeline_index_post"},"Body_upload_files_data_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_files_data_post"},"ClaimResponse":{"properties":{"covariate_type":{"type":"string","title":"Covariate Type"},"type":{"type":"string","title":"Type"},"description":{"type":"string","title":"Description"},"subject_id":{"type":"string","title":"Subject Id"},"object_id":{"type":"string","title":"Object Id"},"source_text":{"type":"string","title":"Source Text"},"text_unit_id":{"type":"string","title":"Text Unit Id"},"document_ids":{"items":{"type":"string"},"type":"array","title":"Document Ids"}},"type":"object","required":["covariate_type","type","description","subject_id","object_id","source_text","text_unit_id","document_ids"],"title":"ClaimResponse"},"EntityResponse":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"text_units":{"items":{"type":"string"},"type":"array","title":"Text Units"}},"type":"object","required":["name","description","text_units"],"title":"EntityResponse"},"GraphRequest":{"properties":{"index_name":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Index Name"},"query":{"type":"string","title":"Query"},"community_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Community Level"}},"type":"object","required":["index_name","query"],"title":"GraphRequest"},"GraphResponse":{"properties":{"result":{"title":"Result"},"context_data":{"title":"Context Data"}},"type":"object","required":["result","context_data"],"title":"GraphResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IndexNameList":{"properties":{"index_name":{"items":{"type":"string"},"type":"array","title":"Index Name"}},"type":"object","required":["index_name"],"title":"IndexNameList"},"IndexStatusResponse":{"properties":{"status_code":{"type":"integer","title":"Status Code"},"index_name":{"type":"string","title":"Index Name"},"storage_name":{"type":"string","title":"Storage Name"},"status":{"type":"string","title":"Status"},"percent_complete":{"type":"number","title":"Percent Complete"},"progress":{"type":"string","title":"Progress"}},"type":"object","required":["status_code","index_name","storage_name","status","percent_complete","progress"],"title":"IndexStatusResponse"},"RelationshipResponse":{"properties":{"source":{"type":"string","title":"Source"},"source_id":{"type":"integer","title":"Source Id"},"target":{"type":"string","title":"Target"},"target_id":{"type":"integer","title":"Target Id"},"description":{"type":"string","title":"Description"},"text_units":{"items":{"type":"string"},"type":"array","title":"Text Units"}},"type":"object","required":["source","source_id","target","target_id","description","text_units"],"title":"RelationshipResponse"},"ReportResponse":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"ReportResponse"},"StorageNameList":{"properties":{"storage_name":{"items":{"type":"string"},"type":"array","title":"Storage Name"}},"type":"object","required":["storage_name"],"title":"StorageNameList"},"TextUnitResponse":{"properties":{"text":{"type":"string","title":"Text"},"source_document":{"type":"string","title":"Source Document"}},"type":"object","required":["text","source_document"],"title":"TextUnitResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}} \ No newline at end of file From 964b536291b24f826b5ef3d8c3c3544e3931cb2a Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Tue, 11 Feb 2025 15:56:52 -0400 Subject: [PATCH 24/28] updated for build --- infra/mainTemplate.json | 5469 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 5469 insertions(+) create mode 100644 infra/mainTemplate.json diff --git a/infra/mainTemplate.json b/infra/mainTemplate.json new file mode 100644 index 00000000..e8f96874 --- /dev/null +++ b/infra/mainTemplate.json @@ -0,0 +1,5469 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "9942415607713496570" + } + }, + "parameters": { + "resourceGroup": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "metadata": { + "description": "Name of the resource group that GraphRAG will be deployed in." + } + }, + "resourceBaseName": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Unique name to append to each resource" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Cloud region for all resources" + } + }, + "apiPublisherName": { + "type": "string", + "defaultValue": "Microsoft", + "minLength": 1, + "metadata": { + "description": "Name of the publisher of the API Management instance." + } + }, + "apiPublisherEmail": { + "type": "string", + "defaultValue": "publisher@microsoft.com", + "minLength": 1, + "metadata": { + "description": "Email address of the publisher of the API Management instance." + } + }, + "aksNamespace": { + "type": "string", + "defaultValue": "graphrag", + "metadata": { + "description": "The AKS namespace to install GraphRAG in." + } + }, + "enablePrivateEndpoints": { + "type": "bool", + "defaultValue": true, + "metadata": { + "description": "Whether to enable private endpoints." + } + }, + "restoreAPIM": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Whether to restore the API Management instance." + } + }, + "apimTier": { + "type": "string", + "defaultValue": "Developer" + }, + "apimName": { + "type": "string", + "defaultValue": "" + }, + "acrName": { + "type": "string", + "defaultValue": "" + }, + "storageAccountName": { + "type": "string", + "defaultValue": "" + }, + "cosmosDbName": { + "type": "string", + "defaultValue": "" + }, + "aiSearchName": { + "type": "string", + "defaultValue": "" + }, + "utcString": { + "type": "string", + "defaultValue": "[utcNow()]" + }, + "graphragimage": { + "type": "string", + "defaultValue": "graphragbackend" + }, + "graphragimageversion": { + "type": "string", + "defaultValue": "latest" + }, + "llmModelName": { + "type": "string", + "defaultValue": "gpt-4o", + "allowedValues": [ + "gpt-4o", + "gpt-4o-mini" + ], + "metadata": { + "description": "Name of the AOAI LLM model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models" + } + }, + "llmModelVersion": { + "type": "string", + "defaultValue": "2024-08-06", + "metadata": { + "description": "Version of the AOAI LLM model to use." + } + }, + "llmModelQuota": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "metadata": { + "description": "Quota of the AOAI LLM model to use." + } + }, + "embeddingModelName": { + "type": "string", + "defaultValue": "text-embedding-ada-002", + "allowedValues": [ + "text-embedding-ada-002", + "text-embedding-3-large" + ], + "metadata": { + "description": "Name of the AOAI embedding model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models" + } + }, + "embeddingModelVersion": { + "type": "string", + "defaultValue": "2" + }, + "embeddingModelQuota": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "metadata": { + "description": "Quota of the AOAI embedding model to use." + } + }, + "publicStorageAccountName": { + "type": "string", + "defaultValue": "" + }, + "publicStorageAccountKey": { + "type": "securestring", + "defaultValue": "" + } + }, + "variables": { + "$fxv#0": { + "analysisServicesServers": "as", + "apiManagementService": "apim-", + "appConfigurationConfigurationStores": "appcs-", + "appContainerApps": "ca-", + "appManagedEnvironments": "cae-", + "authorizationPolicyDefinitions": "policy-", + "automationAutomationAccounts": "aa-", + "azureOpenAI": "aoai-", + "blueprintBlueprints": "bp-", + "blueprintBlueprintsArtifacts": "bpa-", + "cacheRedis": "redis-", + "cdnProfiles": "cdnp-", + "cdnProfilesEndpoints": "cdne-", + "cognitiveServicesAccounts": "cog-", + "cognitiveServicesFormRecognizer": "cog-fr-", + "cognitiveServicesTextAnalytics": "cog-ta-", + "computeAvailabilitySets": "avail-", + "computeCloudServices": "cld-", + "computeDiskEncryptionSets": "des", + "computeDisks": "disk", + "computeDisksOs": "osdisk", + "computeGalleries": "gal", + "computeSnapshots": "snap-", + "computeVirtualMachineScaleSets": "vmss-", + "computeVirtualMachines": "vm", + "containerInstanceContainerGroups": "ci", + "containerRegistryRegistries": "cr", + "containerServiceManagedClusters": "aks-", + "dBforMySQLServers": "mysql-", + "dBforPostgreSQLServers": "psql-", + "dataFactoryFactories": "adf-", + "dataLakeAnalyticsAccounts": "dla", + "dataLakeStoreAccounts": "dls", + "dataMigrationServices": "dms-", + "databricksWorkspaces": "dbw-", + "devicesIotHubs": "iot-", + "devicesProvisioningServices": "provs-", + "devicesProvisioningServicesCertificates": "pcert-", + "documentDBDatabaseAccounts": "cosmos-", + "eventGridDomains": "evgd-", + "eventGridDomainsTopics": "evgt-", + "eventGridEventSubscriptions": "evgs-", + "eventHubNamespaces": "evhns-", + "eventHubNamespacesEventHubs": "evh-", + "hdInsightClustersHadoop": "hadoop-", + "hdInsightClustersHbase": "hbase-", + "hdInsightClustersKafka": "kafka-", + "hdInsightClustersMl": "mls-", + "hdInsightClustersSpark": "spark-", + "hdInsightClustersStorm": "storm-", + "hybridComputeMachines": "arcs-", + "insightsActionGroups": "ag-", + "insightsComponents": "appi-", + "keyVaultVaults": "kv-", + "kubernetesConnectedClusters": "arck", + "kustoClusters": "dec", + "kustoClustersDatabases": "dedb", + "logicIntegrationAccounts": "ia-", + "logicWorkflows": "logic-", + "machineLearningServicesWorkspaces": "mlw-", + "managedIdentityUserAssignedIdentities": "id-", + "managementManagementGroups": "mg-", + "migrateAssessmentProjects": "migr-", + "networkApplicationGateways": "agw-", + "networkApplicationSecurityGroups": "asg-", + "networkAzureFirewalls": "afw-", + "networkBastionHosts": "bas-", + "networkConnections": "con-", + "networkDnsZones": "dnsz-", + "networkExpressRouteCircuits": "erc-", + "networkFirewallPolicies": "afwp-", + "networkFirewallPoliciesRuleGroups": "wafrg", + "networkFirewallPoliciesWebApplication": "waf", + "networkFrontDoors": "fd-", + "networkFrontdoorWebApplicationFirewallPolicies": "fdfp-", + "networkLoadBalancersExternal": "lbe-", + "networkLoadBalancersInboundNatRules": "rule-", + "networkLoadBalancersInternal": "lbi-", + "networkLocalNetworkGateways": "lgw-", + "networkNatGateways": "ng-", + "networkNetworkInterfaces": "nic-", + "networkNetworkSecurityGroups": "nsg-", + "networkNetworkSecurityGroupsSecurityRules": "nsgsr-", + "networkNetworkWatchers": "nw-", + "networkPrivateDnsZones": "pdnsz-", + "networkPrivateLinkServices": "pl-", + "networkPublicIPAddresses": "pip-", + "networkPublicIPPrefixes": "ippre-", + "networkRouteFilters": "rf-", + "networkRouteTables": "rt-", + "networkRouteTablesRoutes": "udr-", + "networkTrafficManagerProfiles": "traf-", + "networkVirtualNetworkGateways": "vgw-", + "networkVirtualNetworks": "vnet-", + "networkVirtualNetworksSubnets": "snet-", + "networkVirtualNetworksVirtualNetworkPeerings": "peer-", + "networkVirtualWans": "vwan-", + "networkVpnGateways": "vpng-", + "networkVpnGatewaysVpnConnections": "vcn-", + "networkVpnGatewaysVpnSites": "vst-", + "notificationHubsNamespaces": "ntfns-", + "notificationHubsNamespacesNotificationHubs": "ntf-", + "operationalInsightsWorkspaces": "log-", + "portalDashboards": "dash-", + "powerBIDedicatedCapacities": "pbi-", + "privateEndpoint": "pep-", + "purviewAccounts": "pview-", + "recoveryServicesVaults": "rsv-", + "resourcesResourceGroups": "rg-", + "searchSearchServices": "srch-", + "serviceBusNamespaces": "sb-", + "serviceBusNamespacesQueues": "sbq-", + "serviceBusNamespacesTopics": "sbt-", + "serviceEndPointPolicies": "se-", + "serviceFabricClusters": "sf-", + "signalRServiceSignalR": "sigr", + "sqlManagedInstances": "sqlmi-", + "sqlServers": "sql-", + "sqlServersDataWarehouse": "sqldw-", + "sqlServersDatabases": "sqldb-", + "sqlServersDatabasesStretch": "sqlstrdb-", + "storSimpleManagers": "ssimp", + "storageStorageAccounts": "st", + "storageStorageAccountsVm": "stvm", + "streamAnalyticsCluster": "asa-", + "synapseWorkspaces": "syn", + "synapseWorkspacesAnalyticsWorkspaces": "synw", + "synapseWorkspacesSqlPoolsDedicated": "syndp", + "synapseWorkspacesSqlPoolsSpark": "synsp", + "timeSeriesInsightsEnvironments": "tsi-", + "webServerFarms": "plan-", + "webSitesAppService": "app-", + "webSitesAppServiceEnvironment": "ase-", + "webSitesFunctions": "func-", + "webStaticSites": "stapp-" + }, + "$fxv#1": "#!/bin/bash\n# Install kubectl\nset -e\naz aks install-cli --only-show-errors\n \n\n# Get AKS credentials\naz aks get-credentials \\\n --admin \\\n --name $AZURE_AKS_NAME \\\n --resource-group $AZURE_RESOURCE_GROUP --only-show-errors\n\n# Check if the cluster is private or not\n\n# Assign a value to aksNamespace\naksNamespace=\"graphrag\"\n\n# Install Helm\ncurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -o get_helm.sh -s\nchmod 700 get_helm.sh\n./get_helm.sh &>/dev/null\n\n# Add Helm repos\nhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts\nhelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\n\n# Update Helm repos\nhelm repo update\n\nhelm pull oci://graphrag.azurecr.io/graphrag --untar\n\n \nhelm upgrade -i graphrag ./graphrag -f ./graphrag/values.yaml \\\n --namespace $aksNamespace --create-namespace \\\n --set \"serviceAccount.name=$AZURE_AKS_SERVICE_ACCOUNT_NAME\" \\\n --set \"serviceAccount.annotations.azure\\.workload\\.identity/client-id=$AZURE_WORKLOAD_IDENTITY_CLIENT_ID\" \\\n --set \"master.image.repository=graphrag.azurecr.io/$IMAGE_NAME\" \\\n --set \"master.image.tag=$IMAGE_VERSION\" \\\n --set \"ingress.host=$AZURE_APP_HOSTNAME\" \\\n --set \"graphragConfig.APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHTS_CONNECTION_STRING\" \\\n --set \"graphragConfig.AI_SEARCH_URL=https://$AI_SEARCH_NAME.search.windows.net\" \\\n --set \"graphragConfig.COSMOS_URI_ENDPOINT=$AZURE_COSMOSDB_ENDPOINT\" \\\n --set \"graphragConfig.GRAPHRAG_API_BASE=$AZURE_OPENAI_ENDPOINT\" \\\n --set \"graphragConfig.GRAPHRAG_API_VERSION=$AZURE_AOAI_LLM_MODEL_API_VERSION\" \\\n --set \"graphragConfig.GRAPHRAG_LLM_MODEL=$AZURE_AOAI_LLM_MODEL\"\\\n --set \"graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME\" \\\n --set \"graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$AZURE_AOAI_EMBEDDING_MODEL\" \\\n --set \"graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME\" \\\n --set \"graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE\" \\\n --set \"graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$AZURE_STORAGE_ACCOUNT_BLOB_URL\"\n\n \n\n\n\n", + "resourceBaseNameFinal": "[if(not(empty(parameters('resourceBaseName'))), parameters('resourceBaseName'), toLower(uniqueString(format('{0}/resourceGroups/{1}', subscription().id, parameters('resourceGroup')))))]", + "abbrs": "[variables('$fxv#0')]", + "tags": { + "azd-env-name": "[parameters('resourceGroup')]" + }, + "workloadIdentityName": "[format('{0}{1}', variables('abbrs').managedIdentityUserAssignedIdentities, variables('resourceBaseNameFinal'))]", + "aksServiceAccountName": "[format('{0}-workload-sa', parameters('aksNamespace'))]", + "workloadIdentitySubject": "[format('system:serviceaccount:{0}:{1}', parameters('aksNamespace'), variables('aksServiceAccountName'))]", + "dnsDomain": "graphrag.io", + "appHostname": "[format('graphrag.{0}', variables('dnsDomain'))]", + "appUrl": "[format('http://{0}', variables('appHostname'))]", + "roles": { + "acrPull": "[resourceId('Microsoft.Authorization/roleDefinitions', '7f951dda-4ed3-4680-a7ca-43fe172d538d')]", + "networkContributor": "[resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')]", + "privateDnsZoneContributor": "[resourceId('Microsoft.Authorization/roleDefinitions', 'b12aa53e-6015-4669-85d0-8515ebb3ae7f')]" + } + }, + "resources": [ + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-workload-identity-rbac-assignments", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "principalId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "principalType": { + "value": "ServicePrincipal" + }, + "cosmosDbName": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "15674161325892705676" + } + }, + "parameters": { + "principalId": { + "type": "string", + "metadata": { + "description": "ID of the service principal to assign the RBAC roles to." + } + }, + "principalType": { + "type": "string", + "allowedValues": [ + "ServicePrincipal", + "User", + "Group", + "Device", + "ForeignGroup" + ], + "metadata": { + "description": "Type of principal to assign the RBAC roles to." + } + }, + "cosmosDbName": { + "type": "string", + "metadata": { + "description": "Name of an existing CosmosDB resource." + } + } + }, + "variables": { + "roleDefinitions": [ + { + "id": "ba92f5b4-2d11-453d-a403-e96b0029c9fe" + }, + { + "id": "b24988ac-6180-42a0-ab88-20f7382dd24c" + }, + { + "id": "8ebe5a00-799e-43f5-93ac-243d3dce84a7" + }, + { + "id": "1407120a-92aa-4202-b7e9-c0e197c71c8f" + }, + { + "id": "a001fd3d-188f-4b5d-821b-7da978bf7442" + }, + { + "id": "3913510d-42f4-4e42-8a64-420c390055eb" + } + ], + "customRoleName": "Custom cosmosDB role for graphrag - adds read/write permissions at the database and container level" + }, + "resources": [ + { + "copy": { + "name": "roleAssignment", + "count": "[length(variables('roleDefinitions'))]" + }, + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "name": "[guid(subscription().subscriptionId, resourceGroup().name, parameters('principalId'), parameters('principalType'), variables('roleDefinitions')[copyIndex()].id)]", + "properties": { + "principalId": "[parameters('principalId')]", + "principalType": "[parameters('principalType')]", + "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('roleDefinitions')[copyIndex()].id)]" + } + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions", + "apiVersion": "2024-12-01-preview", + "name": "[format('{0}/{1}', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]", + "properties": { + "roleName": "[variables('customRoleName')]", + "type": "CustomRole", + "assignableScopes": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + ], + "permissions": [ + { + "dataActions": [ + "Microsoft.DocumentDB/databaseAccounts/readMetadata", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*", + "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/write" + ] + } + ] + } + }, + { + "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments", + "apiVersion": "2024-12-01-preview", + "name": "[format('{0}/{1}', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName'))), parameters('principalId')))]", + "properties": { + "principalId": "[parameters('principalId')]", + "roleDefinitionId": "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]", + "scope": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + }, + "dependsOn": [ + "[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions', parameters('cosmosDbName'), guid(subscription().subscriptionId, resourceGroup().name, resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), variables('customRoleName')))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-rbac-assignments", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "roleAssignments": { + "value": [ + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.kubeletPrincipalId.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').acrPull]" + }, + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.ingressWebAppIdentity.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').privateDnsZoneContributor]" + }, + { + "principalId": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.systemIdentity.value]", + "principalType": "ServicePrincipal", + "roleDefinitionId": "[variables('roles').networkContributor]" + } + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13254511464568135903" + } + }, + "parameters": { + "roleAssignments": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "Array of objects with fields principalId, principalType, roleDefinitionId" + } + } + }, + "resources": [ + { + "copy": { + "name": "roleAssignment", + "count": "[length(parameters('roleAssignments'))]" + }, + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "name": "[guid(subscription().subscriptionId, resourceGroup().name, parameters('roleAssignments')[copyIndex()].principalId, parameters('roleAssignments')[copyIndex()].principalType, parameters('roleAssignments')[copyIndex()].roleDefinitionId)]", + "properties": "[parameters('roleAssignments')[copyIndex()]]" + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "log-analytics-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[format('{0}{1}', variables('abbrs').operationalInsightsWorkspaces, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccessForIngestion": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "11258206015777241921" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the Log Analytics resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Log Analytics resource." + } + }, + "publicNetworkAccessForIngestion": { + "type": "string", + "defaultValue": "Disabled", + "metadata": { + "description": "The public network access for ingestion." + } + } + }, + "resources": [ + { + "type": "Microsoft.OperationalInsights/workspaces", + "apiVersion": "2022-10-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "properties": { + "retentionInDays": 30, + "publicNetworkAccessForIngestion": "[parameters('publicNetworkAccessForIngestion')]", + "publicNetworkAccessForQuery": "Enabled", + "features": { + "immediatePurgeDataOn30Days": true + } + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.OperationalInsights/workspaces', parameters('name'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "nsg-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "nsgName": { + "value": "[format('{0}{1}', variables('abbrs').networkNetworkSecurityGroups, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "16619124547797522615" + } + }, + "parameters": { + "nsgName": { + "type": "string", + "defaultValue": "[format('apim-nsg-{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "Name of the NSG for the API Management service." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/networkSecurityGroups", + "apiVersion": "2024-01-01", + "name": "[parameters('nsgName')]", + "location": "[parameters('location')]", + "properties": { + "securityRules": [ + { + "name": "Client_communication_to_API_Management", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "80", + "sourceAddressPrefix": "Internet", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 100, + "direction": "Inbound" + } + }, + { + "name": "Secure_Client_communication_to_API_Management", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "Internet", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 110, + "direction": "Inbound" + } + }, + { + "name": "Management_endpoint_for_Azure_portal_and_Powershell", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "3443", + "sourceAddressPrefix": "ApiManagement", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 120, + "direction": "Inbound" + } + }, + { + "name": "Dependency_on_Redis_Cache", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6381-6383", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 130, + "direction": "Inbound" + } + }, + { + "name": "Dependency_to_sync_Rate_Limit_Inbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "4290", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 135, + "direction": "Inbound" + } + }, + { + "name": "Dependency_on_Azure_SQL", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "1433", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Sql", + "access": "Allow", + "priority": 140, + "direction": "Outbound" + } + }, + { + "name": "Dependency_for_Log_to_event_Hub_policy", + "properties": { + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "5671", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "EventHub", + "access": "Allow", + "priority": 150, + "direction": "Outbound" + } + }, + { + "name": "Dependency_on_Redis_Cache_outbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6381-6383", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 160, + "direction": "Outbound" + } + }, + { + "name": "Depenedency_To_sync_RateLimit_Outbound", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "4290", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 165, + "direction": "Outbound" + } + }, + { + "name": "Dependency_on_Azure_File_Share_for_GIT", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "445", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Storage", + "access": "Allow", + "priority": 170, + "direction": "Outbound" + } + }, + { + "name": "Azure_Infrastructure_Load_Balancer", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "6390", + "sourceAddressPrefix": "AzureLoadBalancer", + "destinationAddressPrefix": "VirtualNetwork", + "access": "Allow", + "priority": 180, + "direction": "Inbound" + } + }, + { + "name": "Publish_DiagnosticLogs_And_Metrics", + "properties": { + "description": "API Management logs and metrics for consumption by admins and your IT team are all part of the management plane", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureMonitor", + "access": "Allow", + "priority": 185, + "direction": "Outbound", + "destinationPortRanges": [ + "443", + "12000", + "1886" + ] + } + }, + { + "name": "Connect_To_SMTP_Relay_For_SendingEmails", + "properties": { + "description": "APIM features the ability to generate email traffic as part of the data plane and the management plane", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Internet", + "access": "Allow", + "priority": 190, + "direction": "Outbound", + "destinationPortRanges": [ + "25", + "587", + "25028" + ] + } + }, + { + "name": "Authenticate_To_Azure_Active_Directory", + "properties": { + "description": "Connect to Azure Active Directory for developer Portal authentication or for OAuth 2 flow during any proxy authentication", + "protocol": "Tcp", + "sourcePortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureActiveDirectory", + "access": "Allow", + "priority": 200, + "direction": "Outbound", + "destinationPortRanges": [ + "80", + "443" + ] + } + }, + { + "name": "Dependency_on_Azure_Storage", + "properties": { + "description": "API Management service dependency on Azure blob and Azure table storage", + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Storage", + "access": "Allow", + "priority": 100, + "direction": "Outbound" + } + }, + { + "name": "Publish_Monitoring_Logs", + "properties": { + "protocol": "Tcp", + "sourcePortRange": "*", + "destinationPortRange": "443", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "AzureCloud", + "access": "Allow", + "priority": 300, + "direction": "Outbound" + } + }, + { + "name": "Deny_All_Internet_Outbound", + "properties": { + "protocol": "*", + "sourcePortRange": "*", + "destinationPortRange": "*", + "sourceAddressPrefix": "VirtualNetwork", + "destinationAddressPrefix": "Internet", + "access": "Deny", + "priority": 999, + "direction": "Outbound" + } + } + ] + } + } + ], + "outputs": { + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('nsgName'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "vnet-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "vnetName": { + "value": "[format('{0}{1}', variables('abbrs').networkVirtualNetworks, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "subnetPrefix": { + "value": "[variables('abbrs').networkVirtualNetworksSubnets]" + }, + "apimTier": { + "value": "[parameters('apimTier')]" + }, + "nsgID": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'nsg-deployment'), '2022-09-01').outputs.id.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "9158217012658604749" + } + }, + "parameters": { + "vnetName": { + "type": "string", + "metadata": { + "description": "Name of the vnet resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resource will be deployed." + } + }, + "subnetPrefix": { + "type": "string", + "defaultValue": "snet-", + "metadata": { + "description": "Optional prefix to prepend to subnet names." + } + }, + "apimTier": { + "type": "string", + "allowedValues": [ + "Developer", + "StandardV2" + ], + "metadata": { + "description": "APIM tier - used to determine if subnet delegations are required." + } + }, + "nsgID": { + "type": "string", + "metadata": { + "description": "NSG resource ID." + } + } + }, + "resources": [ + { + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2024-01-01", + "name": "[parameters('vnetName')]", + "location": "[parameters('location')]", + "properties": { + "addressSpace": { + "addressPrefixes": [ + "10.1.0.0/16" + ] + }, + "subnets": [ + { + "name": "[format('{0}apim', parameters('subnetPrefix'))]", + "properties": { + "addressPrefix": "10.1.0.0/24", + "networkSecurityGroup": { + "id": "[parameters('nsgID')]" + }, + "delegations": "[if(equals(parameters('apimTier'), 'Developer'), createArray(), createArray(createObject('name', 'Microsoft.Web/serverFarms', 'properties', createObject('serviceName', 'Microsoft.Web/serverFarms'))))]" + } + }, + { + "name": "[format('{0}aks', parameters('subnetPrefix'))]", + "properties": { + "addressPrefix": "10.1.1.0/24", + "serviceEndpoints": [ + { + "service": "Microsoft.Storage" + }, + { + "service": "Microsoft.Sql" + }, + { + "service": "Microsoft.EventHub" + } + ] + } + } + ] + } + } + ], + "outputs": { + "vnetId": { + "type": "string", + "value": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName'))]" + }, + "vnetName": { + "type": "string", + "value": "[parameters('vnetName')]" + }, + "apimSubnetId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')), '2024-01-01').subnets[0].id]" + }, + "aksSubnetId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Network/virtualNetworks', parameters('vnetName')), '2024-01-01').subnets[1].id]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'nsg-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aoai-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "openAiName": { + "value": "[format('{0}{1}', variables('abbrs').cognitiveServicesAccounts, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "llmModelName": { + "value": "[parameters('llmModelName')]" + }, + "llmModelVersion": { + "value": "[parameters('llmModelVersion')]" + }, + "llmTpmQuota": { + "value": "[parameters('llmModelQuota')]" + }, + "embeddingModelName": { + "value": "[parameters('embeddingModelName')]" + }, + "embeddingModelVersion": { + "value": "[parameters('embeddingModelVersion')]" + }, + "embeddingTpmQuota": { + "value": "[parameters('embeddingModelQuota')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "15475380690582621771" + } + }, + "parameters": { + "openAiName": { + "type": "string", + "defaultValue": "[format('openai{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "Name of the Azure OpenAI instance" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Location for the Azure OpenAI instance" + } + }, + "llmModelName": { + "type": "string", + "defaultValue": "gpt-4o", + "metadata": { + "description": "LLM model name" + } + }, + "llmModelVersion": { + "type": "string", + "metadata": { + "description": "LLM Model API version" + } + }, + "embeddingModelName": { + "type": "string", + "defaultValue": "text-embedding-ada-002", + "metadata": { + "description": "Embedding model name" + } + }, + "embeddingModelVersion": { + "type": "string", + "metadata": { + "description": "Embedding Model API version" + } + }, + "llmTpmQuota": { + "type": "int", + "defaultValue": 1, + "metadata": { + "description": "TPM quota for llm model deployment (x1000)" + } + }, + "embeddingTpmQuota": { + "type": "int", + "defaultValue": 1, + "metadata": { + "description": "TPM quota for embedding model deployment (x1000)" + } + } + }, + "resources": [ + { + "type": "Microsoft.CognitiveServices/accounts", + "apiVersion": "2024-10-01", + "name": "[parameters('openAiName')]", + "location": "[parameters('location')]", + "sku": { + "name": "S0" + }, + "kind": "OpenAI", + "properties": { + "publicNetworkAccess": "Enabled", + "disableLocalAuth": true + } + }, + { + "type": "Microsoft.CognitiveServices/accounts/deployments", + "apiVersion": "2024-10-01", + "name": "[format('{0}/{1}', parameters('openAiName'), parameters('llmModelName'))]", + "sku": { + "name": "GlobalStandard", + "capacity": "[parameters('llmTpmQuota')]" + }, + "properties": { + "model": { + "format": "OpenAI", + "name": "[parameters('llmModelName')]", + "version": "[parameters('llmModelVersion')]" + }, + "currentCapacity": "[parameters('llmTpmQuota')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName'))]" + ] + }, + { + "type": "Microsoft.CognitiveServices/accounts/deployments", + "apiVersion": "2024-10-01", + "name": "[format('{0}/{1}', parameters('openAiName'), parameters('embeddingModelName'))]", + "sku": { + "name": "Standard", + "capacity": "[parameters('embeddingTpmQuota')]" + }, + "properties": { + "model": { + "format": "OpenAI", + "name": "[parameters('embeddingModelName')]", + "version": "[parameters('embeddingModelVersion')]" + }, + "currentCapacity": "[parameters('embeddingTpmQuota')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName'))]", + "[resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('llmModelName'))]" + ] + } + ], + "outputs": { + "openAiEndpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts', parameters('openAiName')), '2024-10-01').endpoint]" + }, + "llmModel": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('llmModelName')), '2024-10-01').model.name]" + }, + "llmModelDeploymentName": { + "type": "string", + "value": "[parameters('llmModelName')]" + }, + "llmModelApiVersion": { + "type": "string", + "value": "2024-10-01" + }, + "textEmbeddingModel": { + "type": "string", + "value": "[reference(resourceId('Microsoft.CognitiveServices/accounts/deployments', parameters('openAiName'), parameters('embeddingModelName')), '2024-10-01').model.name]" + }, + "textEmbeddingModelDeploymentName": { + "type": "string", + "value": "[parameters('embeddingModelName')]" + }, + "textEmbeddingModelApiVersion": { + "type": "string", + "value": "2024-10-01" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "acr-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "registryName": "[if(not(empty(parameters('acrName'))), createObject('value', parameters('acrName')), createObject('value', format('{0}{1}', variables('abbrs').containerRegistryRegistries, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "3579514199569414551" + } + }, + "parameters": { + "registryName": { + "type": "string", + "metadata": { + "description": "The name of the Container Registry resource. Will be automatically generated if not provided." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Container Registry resource." + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerRegistry/registries", + "apiVersion": "2023-11-01-preview", + "name": "[parameters('registryName')]", + "location": "[parameters('location')]", + "sku": { + "name": "Standard" + }, + "properties": { + "adminUserEnabled": false, + "encryption": { + "status": "disabled" + }, + "dataEndpointEnabled": false, + "publicNetworkAccess": "Enabled", + "networkRuleBypassOptions": "AzureServices", + "zoneRedundancy": "Disabled", + "anonymousPullEnabled": false, + "metadataSearch": "Disabled" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('registryName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerRegistry/registries', parameters('registryName'))]" + }, + "loginServer": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerRegistry/registries', parameters('registryName')), '2023-11-01-preview').loginServer]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aks-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "clusterName": { + "value": "[format('{0}{1}', variables('abbrs').containerServiceManagedClusters, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "graphragVMSize": { + "value": "standard_d8s_v5" + }, + "graphragIndexingVMSize": { + "value": "standard_e8s_v5" + }, + "clusterAdmins": { + "value": null + }, + "logAnalyticsWorkspaceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "privateDnsZoneName": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "4262586997141187053" + } + }, + "parameters": { + "clusterName": { + "type": "string", + "metadata": { + "description": "The name of the Managed Cluster resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Managed Cluster resource." + } + }, + "logAnalyticsWorkspaceId": { + "type": "string", + "metadata": { + "description": "The workspace id of the Log Analytics resource." + } + }, + "autoUpgradeProfile": { + "type": "object", + "defaultValue": { + "nodeOsUpgradeChannel": "NodeImage", + "upgradeChannel": "stable" + }, + "metadata": { + "description": "The auto-upgrade profile." + } + }, + "dnsPrefix": { + "type": "string", + "defaultValue": "", + "metadata": { + "description": "Optional DNS prefix to use with hosted Kubernetes API server FQDN." + } + }, + "systemOsDiskSizeGB": { + "type": "int", + "defaultValue": 128, + "minValue": 0, + "maxValue": 1023, + "metadata": { + "description": "Disk size (in GB) to provision for each of the agent pool nodes. This value ranges from 0 to 1023. Specifying 0 will apply the default disk size for that agentVMSize." + } + }, + "systemNodeCount": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 20, + "metadata": { + "description": "The number of nodes for the system node pool." + } + }, + "systemVMSize": { + "type": "string", + "defaultValue": "standard_d4s_v5", + "metadata": { + "description": "The size of the system Virtual Machine." + } + }, + "graphragNodeCount": { + "type": "int", + "defaultValue": 1, + "minValue": 1, + "maxValue": 50, + "metadata": { + "description": "The number of nodes for the graphrag node pool." + } + }, + "graphragVMSize": { + "type": "string", + "defaultValue": "standard_d8s_v5", + "metadata": { + "description": "The VM size of nodes running the GraphRAG API." + } + }, + "graphragIndexingVMSize": { + "type": "string", + "defaultValue": "standard_e8s_v5", + "metadata": { + "description": "The VM size of nodes running GraphRAG indexing jobs." + } + }, + "enableEncryptionAtHost": { + "type": "bool", + "defaultValue": false, + "metadata": { + "description": "Enable encryption at host" + } + }, + "subnetId": { + "type": "string" + }, + "privateDnsZoneName": { + "type": "string" + }, + "clusterAdmins": { + "type": "array", + "defaultValue": [], + "metadata": { + "description": "Array of object ids that will have admin role of the cluster" + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerService/managedClusters/agentPools", + "apiVersion": "2024-02-01", + "name": "[format('{0}/{1}', parameters('clusterName'), 'graphrag')]", + "properties": { + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 1, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": "[parameters('graphragNodeCount')]", + "vmSize": "[parameters('graphragVMSize')]", + "osType": "Linux", + "mode": "User", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "nodeLabels": { + "workload": "graphrag" + }, + "tags": { + "workload": "graphrag" + }, + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters/agentPools", + "apiVersion": "2024-02-01", + "name": "[format('{0}/{1}', parameters('clusterName'), 'indexing')]", + "properties": { + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 0, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": 0, + "vmSize": "[parameters('graphragIndexingVMSize')]", + "osType": "Linux", + "mode": "User", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "nodeLabels": { + "workload": "graphrag-indexing" + }, + "tags": { + "workload": "graphrag" + }, + "type": "VirtualMachineScaleSets" + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters", + "apiVersion": "2024-09-02-preview", + "name": "[parameters('clusterName')]", + "location": "[parameters('location')]", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "enableRBAC": true, + "disableLocalAccounts": false, + "dnsPrefix": "[if(not(empty(parameters('dnsPrefix'))), parameters('dnsPrefix'), toLower(parameters('clusterName')))]", + "aadProfile": { + "managed": true, + "enableAzureRBAC": true, + "adminGroupObjectIDs": "[parameters('clusterAdmins')]" + }, + "addonProfiles": { + "omsagent": { + "enabled": true, + "config": { + "logAnalyticsWorkspaceResourceID": "[parameters('logAnalyticsWorkspaceId')]" + } + } + }, + "agentPoolProfiles": [ + { + "name": "agentpool", + "enableAutoScaling": true, + "upgradeSettings": { + "maxSurge": "50%" + }, + "minCount": 1, + "maxCount": 10, + "osDiskSizeGB": "[parameters('systemOsDiskSizeGB')]", + "count": "[parameters('systemNodeCount')]", + "vmSize": "[parameters('systemVMSize')]", + "osType": "Linux", + "mode": "System", + "enableEncryptionAtHost": "[parameters('enableEncryptionAtHost')]", + "vnetSubnetID": "[parameters('subnetId')]", + "type": "VirtualMachineScaleSets" + } + ], + "autoScalerProfile": { + "expander": "least-waste" + }, + "ingressProfile": { + "webAppRouting": { + "enabled": true, + "dnsZoneResourceIds": [ + "[resourceId('Microsoft.Network/privateDnsZones', parameters('privateDnsZoneName'))]" + ] + } + }, + "networkProfile": { + "serviceCidr": "10.3.0.0/16", + "dnsServiceIP": "10.3.0.10", + "podCidr": "10.244.0.0/16" + }, + "autoUpgradeProfile": "[parameters('autoUpgradeProfile')]", + "oidcIssuerProfile": { + "enabled": true + }, + "securityProfile": { + "workloadIdentity": { + "enabled": true + } + } + } + }, + { + "type": "Microsoft.ContainerService/managedClusters/maintenanceConfigurations", + "apiVersion": "2024-09-02-preview", + "name": "[format('{0}/{1}', parameters('clusterName'), 'aksManagedAutoUpgradeSchedule')]", + "properties": { + "maintenanceWindow": { + "schedule": { + "weekly": { + "intervalWeeks": 1, + "dayOfWeek": "Monday" + } + }, + "durationHours": 4, + "startDate": "2024-06-11", + "startTime": "12:00" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + }, + { + "type": "Microsoft.ContainerService/managedClusters/maintenanceConfigurations", + "apiVersion": "2024-09-02-preview", + "name": "[format('{0}/{1}', parameters('clusterName'), 'aksManagedNodeOSUpgradeSchedule')]", + "properties": { + "maintenanceWindow": { + "schedule": { + "weekly": { + "intervalWeeks": 1, + "dayOfWeek": "Saturday" + } + }, + "durationHours": 4, + "startDate": "2024-06-11", + "startTime": "12:00" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('clusterName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName'))]" + }, + "managedResourceGroup": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').nodeResourceGroup]" + }, + "controlPlaneFqdn": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').fqdn]" + }, + "kubeletPrincipalId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').identityProfile.kubeletidentity.objectId]" + }, + "ingressWebAppIdentity": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').ingressProfile.webAppRouting.identity.objectId]" + }, + "systemIdentity": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview', 'full').identity.principalId]" + }, + "issuer": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ContainerService/managedClusters', parameters('clusterName')), '2024-09-02-preview').oidcIssuerProfile.issuerURL]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "cosmosdb-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "cosmosDbName": "[if(not(empty(parameters('cosmosDbName'))), createObject('value', parameters('cosmosDbName')), createObject('value', format('{0}{1}', variables('abbrs').documentDBDatabaseAccounts, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "4114639481216656536" + } + }, + "parameters": { + "cosmosDbName": { + "type": "string", + "metadata": { + "description": "The name of the CosmosDB resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the CosmosDB resource." + } + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "Disabled", + "allowedValues": [ + "Enabled", + "Disabled" + ] + } + }, + "resources": [ + { + "type": "Microsoft.DocumentDB/databaseAccounts", + "apiVersion": "2024-11-15", + "name": "[parameters('cosmosDbName')]", + "location": "[parameters('location')]", + "tags": { + "defaultExperience": "Core (SQL)", + "hidden-cosmos-mmspecial": "" + }, + "kind": "GlobalDocumentDB", + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "publicNetworkAccess": "[parameters('publicNetworkAccess')]", + "enableAutomaticFailover": false, + "enableMultipleWriteLocations": false, + "isVirtualNetworkFilterEnabled": false, + "virtualNetworkRules": [], + "disableKeyBasedMetadataWriteAccess": false, + "enableFreeTier": false, + "enableAnalyticalStorage": false, + "analyticalStorageConfiguration": { + "schemaType": "WellDefined" + }, + "databaseAccountOfferType": "Standard", + "defaultIdentity": "FirstPartyIdentity", + "networkAclBypass": "None", + "disableLocalAuth": true, + "enablePartitionMerge": false, + "minimalTlsVersion": "Tls12", + "consistencyPolicy": { + "defaultConsistencyLevel": "Session", + "maxIntervalInSeconds": 5, + "maxStalenessPrefix": 100 + }, + "locations": [ + { + "locationName": "[parameters('location')]", + "failoverPriority": 0, + "isZoneRedundant": false + } + ], + "cors": [], + "capabilities": [], + "ipRules": [], + "backupPolicy": { + "type": "Periodic", + "periodicModeProperties": { + "backupIntervalInMinutes": 240, + "backupRetentionIntervalInHours": 8, + "backupStorageRedundancy": "Geo" + } + }, + "networkAclBypassResourceIds": [], + "capacity": { + "totalThroughputLimit": 4000 + } + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('cosmosDbName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName'))]" + }, + "endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.DocumentDB/databaseAccounts', parameters('cosmosDbName')), '2024-11-15').documentEndpoint]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "aisearch-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": "[if(not(empty(parameters('aiSearchName'))), createObject('value', parameters('aiSearchName')), createObject('value', format('{0}{1}', variables('abbrs').searchSearchServices, variables('resourceBaseNameFinal'))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'disabled'), createObject('value', 'enabled'))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "4148789917591925909" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the AI Search instance." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Managed Cluster resource." + } + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "enabled", + "allowedValues": [ + "enabled", + "disabled" + ] + } + }, + "resources": [ + { + "type": "Microsoft.Search/searchServices", + "apiVersion": "2024-03-01-preview", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "sku": { + "name": "standard" + }, + "properties": { + "disableLocalAuth": true, + "replicaCount": 1, + "partitionCount": 1, + "publicNetworkAccess": "[parameters('publicNetworkAccess')]", + "semanticSearch": "disabled" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Search/searchServices', parameters('name'))]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "storage-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": "[if(not(empty(parameters('storageAccountName'))), createObject('value', parameters('storageAccountName')), createObject('value', format('{0}{1}', variables('abbrs').storageStorageAccounts, replace(variables('resourceBaseNameFinal'), '-', ''))))]", + "location": { + "value": "[parameters('location')]" + }, + "publicNetworkAccess": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]", + "tags": { + "value": "[variables('tags')]" + }, + "deleteRetentionPolicy": { + "value": { + "enabled": true, + "days": 5 + } + }, + "defaultToOAuthAuthentication": { + "value": true + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "5352518107419090409" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the Storage Account resource." + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the Storage Account resource." + } + }, + "accessTier": { + "type": "string", + "defaultValue": "Hot", + "allowedValues": [ + "Hot", + "Cool", + "Premium" + ] + }, + "dnsEndpointType": { + "type": "string", + "defaultValue": "Standard", + "allowedValues": [ + "AzureDnsZone", + "Standard" + ] + }, + "publicNetworkAccess": { + "type": "string", + "defaultValue": "Disabled", + "allowedValues": [ + "Enabled", + "Disabled" + ] + }, + "tags": { + "type": "object", + "defaultValue": {} + }, + "allowBlobPublicAccess": { + "type": "bool", + "defaultValue": false + }, + "allowCrossTenantReplication": { + "type": "bool", + "defaultValue": true + }, + "allowSharedKeyAccess": { + "type": "bool", + "defaultValue": false + }, + "defaultToOAuthAuthentication": { + "type": "bool", + "defaultValue": false + }, + "deleteRetentionPolicy": { + "type": "object", + "defaultValue": {} + }, + "kind": { + "type": "string", + "defaultValue": "StorageV2" + }, + "minimumTlsVersion": { + "type": "string", + "defaultValue": "TLS1_2" + }, + "containers": { + "type": "array", + "defaultValue": [] + } + }, + "resources": [ + { + "copy": { + "name": "storage::blobServices::container", + "count": "[length(parameters('containers'))]" + }, + "condition": "[not(empty(parameters('containers')))]", + "type": "Microsoft.Storage/storageAccounts/blobServices/containers", + "apiVersion": "2023-01-01", + "name": "[format('{0}/{1}/{2}', parameters('name'), 'default', parameters('containers')[copyIndex()].name)]", + "properties": { + "publicAccess": "[coalesce(tryGet(parameters('containers')[copyIndex()], 'publicAccess'), 'None')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts/blobServices', parameters('name'), 'default')]" + ] + }, + { + "condition": "[not(empty(parameters('containers')))]", + "type": "Microsoft.Storage/storageAccounts/blobServices", + "apiVersion": "2023-01-01", + "name": "[format('{0}/{1}', parameters('name'), 'default')]", + "properties": { + "deleteRetentionPolicy": "[parameters('deleteRetentionPolicy')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]" + ] + }, + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2023-01-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "tags": "[parameters('tags')]", + "kind": "[parameters('kind')]", + "sku": { + "name": "Standard_LRS" + }, + "properties": { + "accessTier": "[parameters('accessTier')]", + "allowBlobPublicAccess": "[parameters('allowBlobPublicAccess')]", + "allowCrossTenantReplication": "[parameters('allowCrossTenantReplication')]", + "allowSharedKeyAccess": "[parameters('allowSharedKeyAccess')]", + "defaultToOAuthAuthentication": "[parameters('defaultToOAuthAuthentication')]", + "dnsEndpointType": "[parameters('dnsEndpointType')]", + "isHnsEnabled": true, + "minimumTlsVersion": "[parameters('minimumTlsVersion')]", + "networkAcls": { + "bypass": "AzureServices", + "defaultAction": "Allow" + }, + "publicNetworkAccess": "[parameters('publicNetworkAccess')]" + } + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Storage/storageAccounts', parameters('name'))]" + }, + "primaryEndpoints": { + "type": "object", + "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', parameters('name')), '2023-01-01').primaryEndpoints]" + } + } + } + } + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "app-insights-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "appInsightsName": { + "value": "[format('{0}{1}', variables('abbrs').insightsComponents, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "appInsightsPublicNetworkAccessForIngestion": "[if(parameters('enablePrivateEndpoints'), createObject('value', 'Disabled'), createObject('value', 'Enabled'))]", + "logAnalyticsWorkspaceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "11002141915701219380" + } + }, + "parameters": { + "appInsightsName": { + "type": "string", + "defaultValue": "appi", + "metadata": { + "description": "Application Insights resource name" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + }, + "appInsightsPublicNetworkAccessForIngestion": { + "type": "string", + "defaultValue": "Disabled", + "metadata": { + "description": "Application Insights public network access for ingestion" + } + }, + "logAnalyticsWorkspaceId": { + "type": "string", + "metadata": { + "description": "Workspace id of a Log Analytics resource." + } + } + }, + "resources": [ + { + "type": "Microsoft.Insights/components", + "apiVersion": "2020-02-02", + "name": "[parameters('appInsightsName')]", + "location": "[parameters('location')]", + "kind": "web", + "properties": { + "Application_Type": "web", + "WorkspaceResourceId": "[parameters('logAnalyticsWorkspaceId')]", + "publicNetworkAccessForIngestion": "[parameters('appInsightsPublicNetworkAccessForIngestion')]", + "publicNetworkAccessForQuery": "Enabled" + } + } + ], + "outputs": { + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Insights/components', parameters('appInsightsName'))]" + }, + "connectionString": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName')), '2020-02-02').ConnectionString]" + }, + "instrumentationKey": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Insights/components', parameters('appInsightsName')), '2020-02-02').InstrumentationKey]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "apim-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "apiManagementName": "[if(not(empty(parameters('apimName'))), createObject('value', parameters('apimName')), createObject('value', format('{0}{1}', variables('abbrs').apiManagementService, variables('resourceBaseNameFinal'))))]", + "restoreAPIM": { + "value": "[parameters('restoreAPIM')]" + }, + "appInsightsId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.id.value]" + }, + "appInsightsInstrumentationKey": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.instrumentationKey.value]" + }, + "publicIpName": { + "value": "[format('{0}{1}', variables('abbrs').networkPublicIPAddresses, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "sku": { + "value": "[parameters('apimTier')]" + }, + "skuCount": { + "value": 1 + }, + "availabilityZones": { + "value": [] + }, + "publisherEmail": { + "value": "[parameters('apiPublisherEmail')]" + }, + "publisherName": { + "value": "[parameters('apiPublisherName')]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.apimSubnetId.value]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "14843923724157327855" + } + }, + "parameters": { + "apiManagementName": { + "type": "string", + "defaultValue": "[format('apiservice{0}', uniqueString(resourceGroup().id))]", + "metadata": { + "description": "The name of the API Management service instance" + } + }, + "publisherEmail": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "The email address of the owner of the service" + } + }, + "publisherName": { + "type": "string", + "minLength": 1, + "metadata": { + "description": "The name of the owner of the service" + } + }, + "sku": { + "type": "string", + "defaultValue": "Developer", + "allowedValues": [ + "Developer", + "StandardV2" + ], + "metadata": { + "description": "The pricing tier of this API Management service" + } + }, + "skuCount": { + "type": "int", + "defaultValue": 1, + "metadata": { + "description": "The instance size of this API Management service. This should be a multiple of the number of availability zones getting deployed." + } + }, + "appInsightsId": { + "type": "string", + "metadata": { + "description": "Application Insights resource ID" + } + }, + "appInsightsInstrumentationKey": { + "type": "string", + "metadata": { + "description": "Application Insights instrumentation key" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "Azure region where the resources will be deployed" + } + }, + "availabilityZones": { + "type": "array", + "defaultValue": [ + "1", + "2" + ], + "metadata": { + "description": "Numbers for availability zones, for example, 1,2,3." + } + }, + "publicIpName": { + "type": "string", + "defaultValue": "apimPublicIP", + "metadata": { + "description": "Name for the public IP address used to access the API Management service." + } + }, + "publicIpSku": { + "type": "string", + "defaultValue": "Standard", + "allowedValues": [ + "Standard" + ], + "metadata": { + "description": "SKU for the public IP address used to access the API Management service." + } + }, + "publicIPAllocationMethod": { + "type": "string", + "defaultValue": "Static", + "allowedValues": [ + "Static" + ], + "metadata": { + "description": "Allocation method for the public IP address used to access the API Management service. Standard SKU public IP requires `Static` allocation." + } + }, + "dnsLabelPrefix": { + "type": "string", + "defaultValue": "[toLower(format('{0}-{1}', parameters('publicIpName'), uniqueString(resourceGroup().id)))]", + "metadata": { + "description": "Unique DNS name for the public IP address used to access the API management service." + } + }, + "restoreAPIM": { + "type": "bool", + "defaultValue": false + }, + "subnetId": { + "type": "string" + } + }, + "resources": [ + { + "type": "Microsoft.Network/publicIPAddresses", + "apiVersion": "2024-01-01", + "name": "[parameters('publicIpName')]", + "location": "[parameters('location')]", + "sku": { + "name": "[parameters('publicIpSku')]" + }, + "properties": { + "publicIPAllocationMethod": "[parameters('publicIPAllocationMethod')]", + "publicIPAddressVersion": "IPv4", + "dnsSettings": { + "domainNameLabel": "[parameters('dnsLabelPrefix')]" + } + } + }, + { + "type": "Microsoft.ApiManagement/service", + "apiVersion": "2023-09-01-preview", + "name": "[parameters('apiManagementName')]", + "location": "[parameters('location')]", + "sku": { + "name": "[parameters('sku')]", + "capacity": "[parameters('skuCount')]" + }, + "zones": "[if(equals(length(parameters('availabilityZones')), 0), null(), parameters('availabilityZones'))]", + "properties": { + "restore": "[parameters('restoreAPIM')]", + "publisherEmail": "[parameters('publisherEmail')]", + "publisherName": "[parameters('publisherName')]", + "virtualNetworkType": "External", + "publicIpAddressId": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]", + "virtualNetworkConfiguration": { + "subnetResourceId": "[parameters('subnetId')]" + }, + "customProperties": { + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_GCM_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA256": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_256_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TLS_RSA_WITH_AES_128_CBC_SHA": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Ciphers.TripleDes168": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls10": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Tls11": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Protocols.Ssl30": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls10": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Tls11": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Security.Backend.Protocols.Ssl30": "false", + "Microsoft.WindowsAzure.ApiManagement.Gateway.Protocols.Server.Http2": "false" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIpName'))]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/loggers", + "apiVersion": "2024-06-01-preview", + "name": "[format('{0}/{1}', parameters('apiManagementName'), 'apimLogger')]", + "properties": { + "credentials": { + "instrumentationKey": "[parameters('appInsightsInstrumentationKey')]" + }, + "description": "Application Insights for APIM", + "loggerType": "applicationInsights", + "resourceId": "[parameters('appInsightsId')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/diagnostics", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}', parameters('apiManagementName'), 'applicationinsights')]", + "properties": { + "loggerId": "[resourceId('Microsoft.ApiManagement/service/loggers', parameters('apiManagementName'), 'apimLogger')]", + "alwaysLog": "allErrors", + "verbosity": "information", + "sampling": { + "percentage": 100, + "samplingType": "fixed" + } + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]", + "[resourceId('Microsoft.ApiManagement/service/loggers', parameters('apiManagementName'), 'apimLogger')]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('apiManagementName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName'))]" + }, + "apimGatewayUrl": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ApiManagement/service', parameters('apiManagementName')), '2023-09-01-preview').gatewayUrl]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "graphrag-api-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "apimname": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "backendUrl": { + "value": "[variables('appUrl')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "2670804874768629752" + } + }, + "parameters": { + "apimname": { + "type": "string" + }, + "backendUrl": { + "type": "string" + } + }, + "resources": [ + { + "type": "Microsoft.ApiManagement/service/apis/operations", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}/{2}', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1], 'docs')]", + "properties": { + "displayName": "docs", + "method": "GET", + "urlTemplate": "/docs", + "templateParameters": [], + "responses": [] + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis/operations", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}/{2}', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1], 'openapi')]", + "properties": { + "displayName": "openapi", + "method": "GET", + "urlTemplate": "/openapi.json", + "templateParameters": [], + "responses": [] + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/documentation', parameters('apimname')), '/')[0], split(format('{0}/documentation', parameters('apimname')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/documentation', parameters('apimname'))]", + "properties": { + "displayName": "documentation", + "apiRevision": "1", + "subscriptionRequired": false, + "serviceUrl": "[format('{0}/manpage', parameters('backendUrl'))]", + "path": "manpage", + "protocols": [ + "https" + ], + "authenticationSettings": { + "oAuth2AuthenticationSettings": [], + "openidAuthenticationSettings": [] + }, + "subscriptionKeyParameterNames": { + "header": "Ocp-Apim-Subscription-Key", + "query": "subscription-key" + }, + "isCurrent": true + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "workload-identity-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[variables('workloadIdentityName')]" + }, + "location": { + "value": "[parameters('location')]" + }, + "federatedCredentials": { + "value": { + "aks-workload-identity": { + "issuer": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.issuer.value]", + "audiences": [ + "api://AzureADTokenExchange" + ], + "subject": "[variables('workloadIdentitySubject')]" + } + } + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "17962046310475786003" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the identity" + } + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]", + "metadata": { + "description": "The location of the identity" + } + }, + "federatedCredentials": { + "type": "object", + "defaultValue": {}, + "metadata": { + "description": "federated name: FederatedIdentityCredentialProperties. See https://learn.microsoft.com/en-us/azure/templates/microsoft.managedidentity/userassignedidentities/federatedidentitycredentials?pivots=deployment-language-bicep#federatedidentitycredentialproperties" + } + } + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2023-01-31", + "name": "[parameters('name')]", + "location": "[parameters('location')]" + }, + { + "copy": { + "name": "federatedCredentialResources", + "count": "[length(items(parameters('federatedCredentials')))]" + }, + "type": "Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials", + "apiVersion": "2023-01-31", + "name": "[format('{0}/{1}', parameters('name'), items(parameters('federatedCredentials'))[copyIndex()].key)]", + "properties": "[items(parameters('federatedCredentials'))[copyIndex()].value]", + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "clientId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name')), '2023-01-31').clientId]" + }, + "principalId": { + "type": "string", + "value": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('name')), '2023-01-31').principalId]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "private-dns-zone-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "[variables('dnsDomain')]" + }, + "vnetNames": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.vnetName.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "languageVersion": "2.0", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13258802455944913421" + } + }, + "parameters": { + "name": { + "type": "string", + "metadata": { + "description": "The name of the private DNS zone." + } + }, + "vnetNames": { + "type": "array", + "items": { + "type": "string" + }, + "metadata": { + "description": "The name of the virtual networks the DNS zone should be associated with." + } + } + }, + "resources": { + "dnsZone": { + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[parameters('name')]", + "location": "global", + "properties": {} + }, + "vnets": { + "copy": { + "name": "vnets", + "count": "[length(parameters('vnetNames'))]" + }, + "existing": true, + "type": "Microsoft.Network/virtualNetworks", + "apiVersion": "2024-01-01", + "name": "[parameters('vnetNames')[copyIndex()]]" + }, + "dnsZoneLinks": { + "copy": { + "name": "dnsZoneLinks", + "count": "[length(parameters('vnetNames'))]" + }, + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', parameters('name'), parameters('vnetNames')[copyIndex()])]", + "location": "global", + "properties": { + "registrationEnabled": false, + "virtualNetwork": { + "id": "[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetNames')[copyIndex()])]" + } + }, + "dependsOn": [ + "dnsZone" + ] + } + }, + "outputs": { + "name": { + "type": "string", + "value": "[parameters('name')]" + }, + "id": { + "type": "string", + "value": "[resourceId('Microsoft.Network/privateDnsZones', parameters('name'))]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "privatelink-private-dns-zones-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "linkedVnetIds": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.vnetId.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "1905656724149562282" + } + }, + "parameters": { + "linkedVnetIds": { + "type": "array", + "metadata": { + "description": "Virtual Network IDs to link to" + } + } + }, + "variables": { + "$fxv#0": { + "azureCloud": { + "azureMonitor": [ + "privatelink.monitor.azure.com", + "privatelink.oms.opinsights.azure.com", + "privatelink.agentsvc.azure-automation.net", + "privatelink.ods.opinsights.azure.com" + ] + }, + "azureusgovernment": { + "azureMonitor": [ + "privatelink.monitor.azure.us", + "privatelink.oms.opinsights.azure.us", + "privatelink.agentsvc.azure-automation.us", + "privatelink.ods.opinsights.azure.us" + ] + } + }, + "aiSearchPrivateDnsZoneName": "privatelink.search.windows.net", + "blobStoragePrivateDnsZoneName": "[format('privatelink.blob.{0}', environment().suffixes.storage)]", + "cosmosDbPrivateDnsZoneName": "privatelink.documents.azure.com", + "storagePrivateDnsZoneNames": [ + "[variables('blobStoragePrivateDnsZoneName')]" + ], + "privateDnsZoneData": "[variables('$fxv#0')]", + "cloudName": "[toLower(environment().name)]", + "azureMonitorPrivateDnsZones": "[variables('privateDnsZoneData')[variables('cloudName')].azureMonitor]", + "privateDnsZones": "[union(variables('azureMonitorPrivateDnsZones'), variables('storagePrivateDnsZoneNames'), createArray(variables('cosmosDbPrivateDnsZoneName')), createArray(variables('aiSearchPrivateDnsZoneName')))]" + }, + "resources": [ + { + "copy": { + "name": "privateDnsZoneResources", + "count": "[length(variables('privateDnsZones'))]" + }, + "type": "Microsoft.Network/privateDnsZones", + "apiVersion": "2020-06-01", + "name": "[variables('privateDnsZones')[copyIndex()]]", + "location": "global" + }, + { + "copy": { + "name": "dnsVnetLinks", + "count": "[length(variables('privateDnsZones'))]" + }, + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "[replace(variables('privateDnsZones')[copyIndex()], '.', '-')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateDnsZoneName": { + "value": "[variables('privateDnsZones')[copyIndex()]]" + }, + "vnetIds": { + "value": "[parameters('linkedVnetIds')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "9115361788050213720" + } + }, + "parameters": { + "privateDnsZoneName": { + "type": "string" + }, + "vnetIds": { + "type": "array" + } + }, + "resources": [ + { + "copy": { + "name": "dnsVnetLinks", + "count": "[length(parameters('vnetIds'))]" + }, + "type": "Microsoft.Network/privateDnsZones/virtualNetworkLinks", + "apiVersion": "2020-06-01", + "name": "[format('{0}/{1}', parameters('privateDnsZoneName'), format('{0}-{1}', replace(parameters('privateDnsZoneName'), '.', '-'), uniqueString(parameters('vnetIds')[copyIndex()])))]", + "location": "global", + "properties": { + "virtualNetwork": { + "id": "[parameters('vnetIds')[copyIndex()]]" + }, + "registrationEnabled": false + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[copyIndex()])]" + ] + } + ], + "outputs": { + "azureMonitorPrivateDnsZoneConfigs": { + "type": "array", + "copy": { + "count": "[length(union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName'))))]", + "input": { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName')))[copyIndex()])]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), union(variables('azureMonitorPrivateDnsZones'), createArray(variables('blobStoragePrivateDnsZoneName')))[copyIndex()])])]" + } + } + } + }, + "blobStoragePrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('blobStoragePrivateDnsZoneName')]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('blobStoragePrivateDnsZoneName'))])]" + } + } + ] + }, + "cosmosDbPrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('cosmosDbPrivateDnsZoneName'))]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('cosmosDbPrivateDnsZoneName'))])]" + } + } + ] + }, + "aiSearchPrivateDnsZoneConfigs": { + "type": "array", + "value": [ + { + "name": "[variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('aiSearchPrivateDnsZoneName'))]]", + "properties": { + "privateDnsZoneId": "[resourceId('Microsoft.Network/privateDnsZones', variables('privateDnsZones')[indexOf(variables('privateDnsZones'), variables('aiSearchPrivateDnsZoneName'))])]" + } + } + ] + }, + "privateDnsZones": { + "type": "array", + "value": "[variables('privateDnsZones')]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "azure-monitor-privatelink-scope-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateLinkScopeName": { + "value": "[format('pls-{0}', variables('resourceBaseNameFinal'))]" + }, + "privateLinkScopedResources": { + "value": [ + "[reference(resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment'), '2022-09-01').outputs.id.value]", + "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.id.value]" + ] + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "6906230456894515846" + } + }, + "parameters": { + "privateLinkScopeName": { + "type": "string" + }, + "privateLinkScopedResources": { + "type": "array", + "defaultValue": [] + }, + "queryAccessMode": { + "type": "string", + "defaultValue": "Open" + }, + "ingestionAccessMode": { + "type": "string", + "defaultValue": "PrivateOnly" + } + }, + "resources": [ + { + "type": "microsoft.insights/privateLinkScopes", + "apiVersion": "2021-07-01-preview", + "name": "[parameters('privateLinkScopeName')]", + "location": "global", + "properties": { + "accessModeSettings": { + "queryAccessMode": "[parameters('queryAccessMode')]", + "ingestionAccessMode": "[parameters('ingestionAccessMode')]" + } + } + }, + { + "copy": { + "name": "scopedResources", + "count": "[length(parameters('privateLinkScopedResources'))]" + }, + "type": "Microsoft.Insights/privateLinkScopes/scopedResources", + "apiVersion": "2021-07-01-preview", + "name": "[format('{0}/{1}', parameters('privateLinkScopeName'), uniqueString(parameters('privateLinkScopedResources')[copyIndex()]))]", + "properties": { + "linkedResourceId": "[parameters('privateLinkScopedResources')[copyIndex()]]" + }, + "dependsOn": [ + "[resourceId('microsoft.insights/privateLinkScopes', parameters('privateLinkScopeName'))]" + ] + } + ], + "outputs": { + "name": { + "type": "string", + "value": "[parameters('privateLinkScopeName')]" + }, + "id": { + "type": "string", + "value": "[resourceId('microsoft.insights/privateLinkScopes', parameters('privateLinkScopeName'))]" + } + } + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'log-analytics-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "cosmosDb-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}cosmos-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "Sql" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.cosmosDbPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "blob-storage-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}blob-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "blob" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.blobStoragePrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'storage-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "ai-search-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}search-{1}', variables('abbrs').privateEndpoint, reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.name.value)]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.id.value]" + }, + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "searchService" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.aiSearchPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'aisearch-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "condition": "[parameters('enablePrivateEndpoints')]", + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "privatelink-scope-private-endpoint-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "privateEndpointName": { + "value": "[format('{0}pls-{1}', variables('abbrs').privateEndpoint, variables('resourceBaseNameFinal'))]" + }, + "location": { + "value": "[parameters('location')]" + }, + "privateLinkServiceId": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'azure-monitor-privatelink-scope-deployment'), '2022-09-01').outputs.id.value), createObject('value', ''))]", + "subnetId": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'vnet-deployment'), '2022-09-01').outputs.aksSubnetId.value]" + }, + "groupId": { + "value": "azuremonitor" + }, + "privateDnsZoneConfigs": "[if(parameters('enablePrivateEndpoints'), createObject('value', reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.azureMonitorPrivateDnsZoneConfigs.value), createObject('value', createArray()))]" + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" + } + }, + "parameters": { + "privateLinkServiceId": { + "type": "string", + "metadata": { + "description": "Resource ID of service the private endpoint is for" + } + }, + "subnetId": { + "type": "string", + "metadata": { + "description": "The resource ID of the subnet to deploy the private endpoint to" + } + }, + "privateDnsZoneConfigs": { + "type": "array", + "metadata": { + "description": "Map of group id to array of private dns zone configs to associate with the private endpoint" + } + }, + "privateEndpointName": { + "type": "string" + }, + "groupId": { + "type": "string" + }, + "location": { + "type": "string", + "defaultValue": "[resourceGroup().location]" + } + }, + "resources": [ + { + "type": "Microsoft.Network/privateEndpoints", + "apiVersion": "2021-05-01", + "name": "[parameters('privateEndpointName')]", + "location": "[parameters('location')]", + "properties": { + "privateLinkServiceConnections": [ + { + "name": "[parameters('privateEndpointName')]", + "properties": { + "privateLinkServiceId": "[parameters('privateLinkServiceId')]", + "groupIds": [ + "[parameters('groupId')]" + ] + } + } + ], + "subnet": { + "id": "[parameters('subnetId')]" + } + } + }, + { + "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups", + "apiVersion": "2021-05-01", + "name": "[format('{0}/{1}', parameters('privateEndpointName'), parameters('groupId'))]", + "properties": { + "privateDnsZoneConfigs": "[parameters('privateDnsZoneConfigs')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.Network/privateEndpoints', parameters('privateEndpointName'))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'azure-monitor-privatelink-scope-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "[parameters('utcString')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "utcValue": { + "value": "[parameters('utcString')]" + }, + "name": { + "value": "graphragscript" + }, + "location": { + "value": "[parameters('location')]" + }, + "subscriptionId": { + "value": "[subscription().id]" + }, + "tenantid": { + "value": "[tenant().tenantId]" + }, + "acrserver": { + "value": "graphrag.azure.acr.io" + }, + "azure_location": { + "value": "[parameters('location')]" + }, + "azure_acr_login_server": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.loginServer.value]" + }, + "azure_acr_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_controlplanefqdn": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.controlPlaneFqdn.value]" + }, + "azure_aks_managed_rg": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.managedResourceGroup.value]" + }, + "azure_aks_service_account_name": { + "value": "[variables('aksServiceAccountName')]" + }, + "imagename": { + "value": "[parameters('graphragimage')]" + }, + "imageversion": { + "value": "[parameters('graphragimageversion')]" + }, + "azure_apim_gateway_url": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.apimGatewayUrl.value]" + }, + "azure_apim_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "managed_identity_aks": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.systemIdentity.value]" + }, + "script_file": { + "value": "[variables('$fxv#1')]" + }, + "ai_search_name": { + "value": "aisearch-deployment" + }, + "azure_aoai_endpoint": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.openAiEndpoint.value]" + }, + "azure_aoai_llm_model": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModel.value]" + }, + "azure_aoai_llm_model_deployment_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelDeploymentName.value]" + }, + "azure_aoai_llm_model_api_version": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelApiVersion.value]" + }, + "azure_aoai_embedding_model": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModel.value]" + }, + "azure_aoai_embedding_model_deployment_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelDeploymentName.value]" + }, + "azure_aoai_embedding_model_api_version": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelApiVersion.value]" + }, + "azure_app_hostname": { + "value": "[variables('appHostname')]" + }, + "azure_app_url": { + "value": "[variables('appUrl')]" + }, + "azure_app_insights_connection_string": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.connectionString.value]" + }, + "azure_cosmosdb_endpoint": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.endpoint.value]" + }, + "azure_cosmosdb_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_cosmosdb_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "azure_dns_zone_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account_blob_url": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.primaryEndpoints.value.blob]" + }, + "azure_workload_identity_client_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.clientId.value]" + }, + "azure_workload_identity_principal_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "azure_workload_identity_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.name.value]" + }, + "public_storage_account_name": { + "value": "[parameters('publicStorageAccountName')]" + }, + "public_storage_account_key": { + "value": "[parameters('publicStorageAccountKey')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "17195102145442235485" + } + }, + "parameters": { + "name": { + "type": "string" + }, + "utcValue": { + "type": "string" + }, + "location": { + "type": "string" + }, + "subscriptionId": { + "type": "string" + }, + "tenantid": { + "type": "string" + }, + "acrserver": { + "type": "string" + }, + "azure_location": { + "type": "string" + }, + "azure_acr_login_server": { + "type": "string" + }, + "azure_acr_name": { + "type": "string" + }, + "azure_aks_name": { + "type": "string" + }, + "azure_aks_controlplanefqdn": { + "type": "string" + }, + "azure_aks_managed_rg": { + "type": "string" + }, + "azure_aks_service_account_name": { + "type": "string" + }, + "azure_apim_gateway_url": { + "type": "string" + }, + "azure_apim_name": { + "type": "string" + }, + "managed_identity_aks": { + "type": "string" + }, + "ai_search_name": { + "type": "string" + }, + "imagename": { + "type": "string" + }, + "imageversion": { + "type": "string" + }, + "script_file": { + "type": "string" + }, + "azure_aoai_endpoint": { + "type": "string" + }, + "azure_aoai_llm_model": { + "type": "string" + }, + "azure_aoai_llm_model_deployment_name": { + "type": "string" + }, + "azure_aoai_llm_model_api_version": { + "type": "string" + }, + "azure_aoai_embedding_model": { + "type": "string" + }, + "azure_aoai_embedding_model_deployment_name": { + "type": "string" + }, + "azure_aoai_embedding_model_api_version": { + "type": "string" + }, + "azure_app_hostname": { + "type": "string" + }, + "azure_app_url": { + "type": "string" + }, + "azure_app_insights_connection_string": { + "type": "string" + }, + "azure_cosmosdb_endpoint": { + "type": "string" + }, + "azure_cosmosdb_name": { + "type": "string" + }, + "azure_cosmosdb_id": { + "type": "string" + }, + "azure_dns_zone_name": { + "type": "string" + }, + "azure_storage_account": { + "type": "string" + }, + "azure_storage_account_blob_url": { + "type": "string" + }, + "azure_workload_identity_client_id": { + "type": "string" + }, + "azure_workload_identity_principal_id": { + "type": "string" + }, + "azure_workload_identity_name": { + "type": "string" + }, + "cognitive_services_audience": { + "type": "string", + "defaultValue": "https://cognitiveservices.azure.com/default" + }, + "public_storage_account_name": { + "type": "string" + }, + "public_storage_account_key": { + "type": "string" + } + }, + "variables": { + "clusterAdminRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', '0ab0b1a8-8aac-4efd-b8c2-3ee1fb270be8')]" + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2023-01-31", + "name": "[uniqueString(resourceGroup().id)]", + "location": "[parameters('location')]" + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "scope": "[format('Microsoft.ContainerService/managedClusters/{0}', parameters('azure_aks_name'))]", + "name": "[guid(parameters('managed_identity_aks'), resourceId('Microsoft.ContainerService/managedClusters', parameters('azure_aks_name')), variables('clusterAdminRoleDefinitionId'))]", + "properties": { + "roleDefinitionId": "[variables('clusterAdminRoleDefinitionId')]", + "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id)), '2023-01-31').principalId]", + "principalType": "ServicePrincipal" + }, + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id))]" + ] + }, + { + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id)))]": {} + } + }, + "properties": { + "storageAccountSettings": { + "storageAccountName": "[parameters('public_storage_account_name')]", + "storageAccountKey": "[parameters('public_storage_account_key')]" + }, + "forceUpdateTag": "[parameters('utcValue')]", + "azCliVersion": "2.7.0", + "timeout": "PT1H", + "environmentVariables": [ + { + "name": "AZURE_SUBSCRIPTION_ID", + "value": "[parameters('subscriptionId')]" + }, + { + "name": "AZURE_TENANT_ID", + "value": "[parameters('tenantid')]" + }, + { + "name": "ACR_SERVER", + "value": "[parameters('acrserver')]" + }, + { + "name": "AZURE_LOCATION", + "value": "[parameters('azure_location')]" + }, + { + "name": "AZURE_ACR_LOGIN_SERVER", + "value": "[parameters('azure_acr_login_server')]" + }, + { + "name": "AZURE_ACR_NAME", + "value": "[parameters('azure_acr_name')]" + }, + { + "name": "AZURE_AKS_NAME", + "value": "[parameters('azure_aks_name')]" + }, + { + "name": "AZURE_AKS_CONTROLPLANEFQDN", + "value": "[parameters('azure_aks_controlplanefqdn')]" + }, + { + "name": "AZURE_AKS_MANAGED_RG", + "value": "[parameters('azure_aks_managed_rg')]" + }, + { + "name": "AZURE_AKS_SERVICE_ACCOUNT_NAME", + "value": "[parameters('azure_aks_service_account_name')]" + }, + { + "name": "AZURE_APIM_GATEWAY_URL", + "value": "[parameters('azure_apim_gateway_url')]" + }, + { + "name": "AZURE_APIM_NAME", + "value": "[parameters('azure_apim_name')]" + }, + { + "name": "MANAGED_IDENTITY_AKS", + "value": "[parameters('managed_identity_aks')]" + }, + { + "name": "IMAGE_NAME", + "value": "[parameters('imagename')]" + }, + { + "name": "IMAGE_VERSION", + "value": "[parameters('imageversion')]" + }, + { + "name": "AI_SEARCH_NAME", + "value": "[parameters('ai_search_name')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL", + "value": "[parameters('azure_aoai_llm_model')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME", + "value": "[parameters('azure_aoai_llm_model_deployment_name')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL_API_VERSION", + "value": "[parameters('azure_aoai_llm_model_api_version')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL", + "value": "[parameters('azure_aoai_embedding_model')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME", + "value": "[parameters('azure_aoai_embedding_model_deployment_name')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL_API_VERSION", + "value": "[parameters('azure_aoai_embedding_model_api_version')]" + }, + { + "name": "AZURE_APP_HOSTNAME", + "value": "[parameters('azure_app_hostname')]" + }, + { + "name": "AZURE_APP_URL", + "value": "[parameters('azure_app_url')]" + }, + { + "name": "AZURE_APP_INSIGHTS_CONNECTION_STRING", + "value": "[parameters('azure_app_insights_connection_string')]" + }, + { + "name": "AZURE_COSMOSDB_ENDPOINT", + "value": "[parameters('azure_cosmosdb_endpoint')]" + }, + { + "name": "AZURE_COSMOSDB_NAME", + "value": "[parameters('azure_cosmosdb_name')]" + }, + { + "name": "AZURE_COSMOSDB_ID", + "value": "[parameters('azure_cosmosdb_id')]" + }, + { + "name": "AZURE_DNS_ZONE_NAME", + "value": "[parameters('azure_dns_zone_name')]" + }, + { + "name": "AZURE_STORAGE_ACCOUNT", + "value": "[parameters('azure_storage_account')]" + }, + { + "name": "AZURE_STORAGE_ACCOUNT_BLOB_URL", + "value": "[parameters('azure_storage_account_blob_url')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_CLIENT_ID", + "value": "[parameters('azure_workload_identity_client_id')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_PRINCIPAL_ID", + "value": "[parameters('azure_workload_identity_principal_id')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_NAME", + "value": "[parameters('azure_workload_identity_name')]" + }, + { + "name": "COGNITIVE_SERVICES_AUDIENCE", + "value": "[parameters('cognitive_services_audience')]" + }, + { + "name": "AZURE_OPENAI_ENDPOINT", + "value": "[parameters('azure_aoai_endpoint')]" + }, + { + "name": "AZURE_RESOURCE_GROUP", + "value": "[resourceGroup().name]" + } + ], + "cleanupPreference": "OnSuccess", + "retentionInterval": "P1D", + "scriptContent": "[parameters('script_file')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'acr-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aisearch-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aoai-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'storage-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "graphragservicedef-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "GraphRag" + }, + "apimname": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "backendUrl": { + "value": "[variables('appUrl')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13338625497669096861" + } + }, + "parameters": { + "backendUrl": { + "type": "string" + }, + "name": { + "type": "string" + }, + "apimname": { + "type": "string" + } + }, + "variables": { + "$fxv#0": { + "openapi": "3.1.0", + "info": { + "title": "GraphRAG", + "version": "v0.0.0" + }, + "paths": { + "/data": { + "get": { + "tags": [ + "Data Management" + ], + "summary": "Get all data storage containers.", + "description": "Retrieve a list of all data storage containers.", + "operationId": "get_all_data_storage_containers_data_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageNameList" + } + } + } + } + } + }, + "post": { + "tags": [ + "Data Management" + ], + "summary": "Upload data to a data storage container", + "description": "Create a data storage container in Azure and upload files to it.\n\nArgs:\n files (List[UploadFile]): A list of files to be uploaded.\n storage_name (str): The name of the Azure Blob Storage container to which files will be uploaded.\n overwrite (bool): Whether to overwrite existing files with the same name. Defaults to True. If False, files that already exist will be skipped.\n\nReturns:\n BaseResponse: An instance of the BaseResponse model with a status message indicating the result of the upload.\n\nRaises:\n HTTPException: If the container name is invalid or if any error occurs during the upload process.", + "operationId": "upload_files_data_post", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "overwrite", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true, + "title": "Overwrite" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_files_data_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/data/{storage_name}": { + "delete": { + "tags": [ + "Data Management" + ], + "summary": "Delete a data storage container", + "description": "Delete a specified data storage container.", + "operationId": "delete_files_data__storage_name__delete", + "parameters": [ + { + "name": "storage_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index": { + "post": { + "tags": [ + "Index Operations" + ], + "summary": "Build an index", + "operationId": "setup_indexing_pipeline_index_post", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "index_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_setup_indexing_pipeline_index_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Index Operations" + ], + "summary": "Get all indexes", + "description": "Retrieve a list of all index names.", + "operationId": "get_all_indexes_index_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IndexNameList" + } + } + } + } + } + } + }, + "/index/{index_name}": { + "delete": { + "tags": [ + "Index Operations" + ], + "summary": "Delete a specified index", + "description": "Delete a specified index.", + "operationId": "delete_index_index__index_name__delete", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index/status/{index_name}": { + "get": { + "tags": [ + "Index Operations" + ], + "summary": "Track the status of an indexing job", + "operationId": "get_index_job_status_index_status__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IndexStatusResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/global": { + "post": { + "tags": [ + "Query Operations" + ], + "summary": "Perform a global search across the knowledge graph index", + "description": "The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.", + "operationId": "global_query_query_global_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/local": { + "post": { + "tags": [ + "Query Operations" + ], + "summary": "Perform a local search across the knowledge graph index.", + "description": "The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).", + "operationId": "local_query_query_local_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/streaming/global": { + "post": { + "tags": [ + "Query Streaming Operations" + ], + "summary": "Stream a response back after performing a global search", + "description": "The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.", + "operationId": "global_search_streaming_query_streaming_global_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/streaming/local": { + "post": { + "tags": [ + "Query Streaming Operations" + ], + "summary": "Stream a response back after performing a local search", + "description": "The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).", + "operationId": "local_search_streaming_query_streaming_local_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index/config/prompts": { + "get": { + "tags": [ + "Index Configuration" + ], + "summary": "Generate graphrag prompts from user-provided data.", + "description": "Generating custom prompts from user-provided data may take several minutes to run based on the amount of data used.", + "operationId": "generate_prompts_index_config_prompts_get", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 5, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/report/{index_name}/{report_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single community report.", + "operationId": "get_report_info_source_report__index_name___report_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "report_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Report Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/text/{index_name}/{text_unit_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single base text unit.", + "operationId": "get_chunk_info_source_text__index_name___text_unit_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "text_unit_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Text Unit Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TextUnitResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/entity/{index_name}/{entity_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single entity.", + "operationId": "get_entity_info_source_entity__index_name___entity_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "entity_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Entity Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntityResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/claim/{index_name}/{claim_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single claim.", + "operationId": "get_claim_info_source_claim__index_name___claim_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "claim_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Claim Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClaimResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/relationship/{index_name}/{relationship_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single relationship.", + "operationId": "get_relationship_info_source_relationship__index_name___relationship_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "relationship_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Relationship Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RelationshipResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/graph/graphml/{index_name}": { + "get": { + "tags": [ + "Graph Operations" + ], + "summary": "Retrieve a GraphML file of the knowledge graph", + "operationId": "retrieve_graphml_file_graph_graphml__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "GraphML file successfully downloaded", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/graph/stats/{index_name}": { + "get": { + "tags": [ + "Graph Operations" + ], + "summary": "Retrieve basic graph statistics, number of nodes and edges", + "operationId": "retrieve_graph_stats_graph_stats__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphDataResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "API health check", + "description": "Returns a 200 response to indicate the API is healthy.", + "operationId": "health_check_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + } + }, + "components": { + "schemas": { + "BaseResponse": { + "properties": { + "status": { + "type": "string", + "title": "Status" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "BaseResponse" + }, + "Body_setup_indexing_pipeline_index_post": { + "properties": { + "entity_extraction_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Entity Extraction Prompt" + }, + "community_report_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Community Report Prompt" + }, + "summarize_descriptions_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Summarize Descriptions Prompt" + } + }, + "type": "object", + "title": "Body_setup_indexing_pipeline_index_post" + }, + "Body_upload_files_data_post": { + "properties": { + "files": { + "items": { + "type": "string", + "format": "binary" + }, + "type": "array", + "title": "Files" + } + }, + "type": "object", + "required": [ + "files" + ], + "title": "Body_upload_files_data_post" + }, + "ClaimResponse": { + "properties": { + "covariate_type": { + "type": "string", + "title": "Covariate Type" + }, + "type": { + "type": "string", + "title": "Type" + }, + "description": { + "type": "string", + "title": "Description" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "object_id": { + "type": "string", + "title": "Object Id" + }, + "source_text": { + "type": "string", + "title": "Source Text" + }, + "text_unit_id": { + "type": "string", + "title": "Text Unit Id" + }, + "document_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Document Ids" + } + }, + "type": "object", + "required": [ + "covariate_type", + "type", + "description", + "subject_id", + "object_id", + "source_text", + "text_unit_id", + "document_ids" + ], + "title": "ClaimResponse" + }, + "EntityResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "text_units": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Text Units" + } + }, + "type": "object", + "required": [ + "name", + "description", + "text_units" + ], + "title": "EntityResponse" + }, + "GraphDataResponse": { + "properties": { + "nodes": { + "type": "integer", + "title": "Nodes" + }, + "edges": { + "type": "integer", + "title": "Edges" + } + }, + "type": "object", + "required": [ + "nodes", + "edges" + ], + "title": "GraphDataResponse" + }, + "GraphRequest": { + "properties": { + "index_name": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "title": "Index Name" + }, + "query": { + "type": "string", + "title": "Query" + } + }, + "type": "object", + "required": [ + "index_name", + "query" + ], + "title": "GraphRequest" + }, + "GraphResponse": { + "properties": { + "result": { + "title": "Result" + }, + "context_data": { + "title": "Context Data" + } + }, + "type": "object", + "required": [ + "result", + "context_data" + ], + "title": "GraphResponse" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "IndexNameList": { + "properties": { + "index_name": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Index Name" + } + }, + "type": "object", + "required": [ + "index_name" + ], + "title": "IndexNameList" + }, + "IndexStatusResponse": { + "properties": { + "status_code": { + "type": "integer", + "title": "Status Code" + }, + "index_name": { + "type": "string", + "title": "Index Name" + }, + "storage_name": { + "type": "string", + "title": "Storage Name" + }, + "status": { + "type": "string", + "title": "Status" + }, + "percent_complete": { + "type": "number", + "title": "Percent Complete" + }, + "progress": { + "type": "string", + "title": "Progress" + } + }, + "type": "object", + "required": [ + "status_code", + "index_name", + "storage_name", + "status", + "percent_complete", + "progress" + ], + "title": "IndexStatusResponse" + }, + "RelationshipResponse": { + "properties": { + "source": { + "type": "string", + "title": "Source" + }, + "source_id": { + "type": "integer", + "title": "Source Id" + }, + "target": { + "type": "string", + "title": "Target" + }, + "target_id": { + "type": "integer", + "title": "Target Id" + }, + "description": { + "type": "string", + "title": "Description" + }, + "text_units": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Text Units" + } + }, + "type": "object", + "required": [ + "source", + "source_id", + "target", + "target_id", + "description", + "text_units" + ], + "title": "RelationshipResponse" + }, + "ReportResponse": { + "properties": { + "text": { + "type": "string", + "title": "Text" + } + }, + "type": "object", + "required": [ + "text" + ], + "title": "ReportResponse" + }, + "StorageNameList": { + "properties": { + "storage_name": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Storage Name" + } + }, + "type": "object", + "required": [ + "storage_name" + ], + "title": "StorageNameList" + }, + "TextUnitResponse": { + "properties": { + "text": { + "type": "string", + "title": "Text" + }, + "source_document": { + "type": "string", + "title": "Source Document" + } + }, + "type": "object", + "required": [ + "text", + "source_document" + ], + "title": "TextUnitResponse" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + } + } + }, + "$fxv#1": "\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t*\n\t\t\t\n\t\t\t\n\t\t\t\t*\n\t\t\t\n\t\t\t\n\t\t\t\t

*
\n\t\t\t\n\t\t\t\n\t\t\t\t
*
\n\t\t\t
\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n" + }, + "resources": [ + { + "type": "Microsoft.ApiManagement/service/apis/policies", + "apiVersion": "2022-08-01", + "name": "[format('{0}/{1}/{2}', split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[0], split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[1], 'policy')]", + "properties": { + "format": "rawxml", + "value": "[variables('$fxv#1')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[0], split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}', parameters('apimname'), parameters('name'))]", + "properties": { + "displayName": "GraphRAG", + "apiRevision": "1", + "subscriptionRequired": true, + "serviceUrl": "[parameters('backendUrl')]", + "path": "", + "protocols": [ + "https" + ], + "authenticationSettings": { + "oAuth2AuthenticationSettings": [], + "openidAuthenticationSettings": [] + }, + "subscriptionKeyParameterNames": { + "header": "Ocp-Apim-Subscription-Key", + "query": "subscription-key" + }, + "isCurrent": true, + "format": "openapi+json", + "value": "[string(variables('$fxv#0'))]" + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]" + ] + } + ], + "outputs": { + "azure_location": { + "type": "string", + "value": "[parameters('location')]" + }, + "azure_tenant_id": { + "type": "string", + "value": "[tenant().tenantId]" + }, + "azure_ai_search_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aisearch-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_acr_login_server": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.loginServer.value]" + }, + "azure_acr_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_controlplanefqdn": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.controlPlaneFqdn.value]" + }, + "azure_aks_managed_rg": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.managedResourceGroup.value]" + }, + "azure_aks_service_account_name": { + "type": "string", + "value": "[variables('aksServiceAccountName')]" + }, + "azure_aoai_endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.openAiEndpoint.value]" + }, + "azure_aoai_llm_model": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModel.value]" + }, + "azure_aoai_llm_model_deployment_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelDeploymentName.value]" + }, + "azure_aoai_llm_model_api_version": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelApiVersion.value]" + }, + "azure_aoai_embedding_model": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModel.value]" + }, + "azure_aoai_embedding_model_deployment_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelDeploymentName.value]" + }, + "azure_aoai_embedding_model_api_version": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelApiVersion.value]" + }, + "azure_apim_gateway_url": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.apimGatewayUrl.value]" + }, + "azure_apim_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_app_hostname": { + "type": "string", + "value": "[variables('appHostname')]" + }, + "azure_app_url": { + "type": "string", + "value": "[variables('appUrl')]" + }, + "azure_app_insights_connection_string": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.connectionString.value]" + }, + "azure_cosmosdb_endpoint": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.endpoint.value]" + }, + "azure_cosmosdb_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_cosmosdb_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "azure_dns_zone_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_private_dns_zones": { + "type": "array", + "value": "[if(parameters('enablePrivateEndpoints'), union(reference(resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment'), '2022-09-01').outputs.privateDnsZones.value, createArray(reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value)), createArray())]" + }, + "azure_storage_account": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account_blob_url": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.primaryEndpoints.value.blob]" + }, + "azure_workload_identity_client_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.clientId.value]" + }, + "azure_workload_identity_principal_id": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "azure_workload_identity_name": { + "type": "string", + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.name.value]" + } + } +} \ No newline at end of file From 6364389a0f3a9c7a8e10ff91c9b82f1c739bbbed Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Tue, 11 Feb 2025 16:01:32 -0400 Subject: [PATCH 25/28] ManagedAPP --- infra/README.md | 4 + infra/core/aks/aks.bicep | 2 +- infra/core/aoai/aoai.bicep | 4 +- .../core/apim/apim.graphrag-servicedef.bicep | 3 + infra/core/scripts/deployment-script.bicep | 27 +- infra/main.bicep | 30 +- .../artifacts/scripts/updategraphrag.sh | 57 +- infra/managed-app/createUiDefinition.json | 40 +- infra/managed-app/mainTemplate.json | 1980 ++++++++++++++++- 9 files changed, 2041 insertions(+), 106 deletions(-) diff --git a/infra/README.md b/infra/README.md index afd958fe..285f3035 100644 --- a/infra/README.md +++ b/infra/README.md @@ -39,3 +39,7 @@ In the Azure Portal, go to Marketplace and create a `Service Catalog Managed App ### 6. Deploy the managed app In the Azure Portal, find and click on the managed app definition resource that was created in the previous step. A button option to `Deploy from definition` will be available. Click on it and proceed through the setup steps (defined by the `createUiDefinitions.json` file) that a consumer would experience when installing the managed app. + + +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https%3A%2F%2Fgithub.com%2FAzure-Samples%2Fgraphrag-accelerator%2Fblob%2Fharjit-managed-app%2Finfra%2FmainTemplate.json) + diff --git a/infra/core/aks/aks.bicep b/infra/core/aks/aks.bicep index 8d349b73..a990745f 100644 --- a/infra/core/aks/aks.bicep +++ b/infra/core/aks/aks.bicep @@ -65,7 +65,7 @@ resource aks 'Microsoft.ContainerService/managedClusters@2024-09-02-preview' = { } properties: { enableRBAC: true - disableLocalAccounts: true + disableLocalAccounts: false dnsPrefix: !empty(dnsPrefix) ? dnsPrefix : toLower(clusterName) aadProfile: { managed: true diff --git a/infra/core/aoai/aoai.bicep b/infra/core/aoai/aoai.bicep index 4566b456..4b775eb4 100644 --- a/infra/core/aoai/aoai.bicep +++ b/infra/core/aoai/aoai.bicep @@ -17,10 +17,10 @@ param embeddingModelName string = 'text-embedding-ada-002' param embeddingModelVersion string @description('TPM quota for llm model deployment (x1000)') -param llmTpmQuota int = 10 +param llmTpmQuota int = 1 @description('TPM quota for embedding model deployment (x1000)') -param embeddingTpmQuota int = 10 +param embeddingTpmQuota int = 1 resource aoai 'Microsoft.CognitiveServices/accounts@2024-10-01' = { name: openAiName diff --git a/infra/core/apim/apim.graphrag-servicedef.bicep b/infra/core/apim/apim.graphrag-servicedef.bicep index 15db4f7a..4762510e 100644 --- a/infra/core/apim/apim.graphrag-servicedef.bicep +++ b/infra/core/apim/apim.graphrag-servicedef.bicep @@ -5,6 +5,9 @@ param backendUrl string param name string param apimname string + + + resource api 'Microsoft.ApiManagement/service/apis@2023-09-01-preview' = { name: '${apimname}/${name}' properties: { diff --git a/infra/core/scripts/deployment-script.bicep b/infra/core/scripts/deployment-script.bicep index a9373d93..a30ed9ca 100644 --- a/infra/core/scripts/deployment-script.bicep +++ b/infra/core/scripts/deployment-script.bicep @@ -16,10 +16,9 @@ param azure_apim_name string param managed_identity_aks string param ai_search_name string -@description('Specifies the primary script URI.') -param primaryScriptUri string param imagename string param imageversion string +param script_file string param azure_aoai_endpoint string @@ -47,6 +46,8 @@ param azure_workload_identity_client_id string param azure_workload_identity_principal_id string param azure_workload_identity_name string param cognitive_services_audience string = 'https://cognitiveservices.azure.com/default' +param public_storage_account_name string +param public_storage_account_key string var clusterAdminRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', '0ab0b1a8-8aac-4efd-b8c2-3ee1fb270be8') @@ -55,13 +56,18 @@ resource aksCluster 'Microsoft.ContainerService/managedClusters@2022-11-02-previ name: azure_aks_name } +resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = { + name: uniqueString(resourceGroup().id) + location: location +} + resource clusterAdminContributorRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(managed_identity_aks, aksCluster.id, clusterAdminRoleDefinitionId) scope: aksCluster properties: { roleDefinitionId: clusterAdminRoleDefinitionId - principalId: managed_identity_aks + principalId: managedIdentity.properties.principalId principalType: 'ServicePrincipal' } } @@ -73,10 +79,14 @@ resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01'= { identity: { type: 'UserAssigned' userAssignedIdentities: { - '${managed_identity_aks}': {} + '${managedIdentity.id}': {} } } properties: { + storageAccountSettings: { + storageAccountName: public_storage_account_name + storageAccountKey: public_storage_account_key + } forceUpdateTag: utcValue azCliVersion: '2.7.0' timeout: 'PT1H' @@ -219,12 +229,19 @@ resource deploymentScript 'Microsoft.Resources/deploymentScripts@2020-10-01'= { value: azure_aoai_endpoint } + + { + name: 'AZURE_RESOURCE_GROUP' + + value: resourceGroup().name + } ] cleanupPreference: 'OnSuccess' retentionInterval: 'P1D' - primaryScriptUri: primaryScriptUri + //primaryScriptUri: primaryScriptUri + scriptContent:script_file } dependsOn: [ aksCluster diff --git a/infra/main.bicep b/infra/main.bicep index 8dbbe5e1..e076b8fe 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -67,7 +67,7 @@ param llmModelName string = 'gpt-4o' param llmModelVersion string = '2024-08-06' @description('Quota of the AOAI LLM model to use.') @minValue(1) -param llmModelQuota int = 10 +param llmModelQuota int = 1 @description('Name of the AOAI embedding model to use. Must match official model id. For more information: https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models') @allowed(['text-embedding-ada-002', 'text-embedding-3-large']) @@ -75,7 +75,11 @@ param embeddingModelName string = 'text-embedding-ada-002' param embeddingModelVersion string = '2' @description('Quota of the AOAI embedding model to use.') @minValue(1) -param embeddingModelQuota int = 10 +param embeddingModelQuota int = 1 + + +param publicStorageAccountName string ='' +param publicStorageAccountKey string ='' var abbrs = loadJsonContent('abbreviations.json') var tags = { 'azd-env-name': resourceGroup } @@ -372,7 +376,7 @@ module deploymentScript 'core/scripts/deployment-script.bicep' ={ utcValue: utcString name:'graphragscript' location:location - subscriptionId:subscription().subscriptionId + subscriptionId:subscription().id tenantid:tenant().tenantId acrserver:'graphrag.azure.acr.io' azure_location:location @@ -387,7 +391,7 @@ module deploymentScript 'core/scripts/deployment-script.bicep' ={ azure_apim_gateway_url:apim.outputs.apimGatewayUrl azure_apim_name :apim.outputs.name managed_identity_aks:aks.outputs.systemIdentity - primaryScriptUri:'file://./scripts/deployment-script.sh' + script_file:loadTextContent('managed-app/artifacts/scripts/updategraphrag.sh') ai_search_name:aiSearch.name azure_aoai_endpoint:aoai.outputs.openAiEndpoint azure_aoai_llm_model : aoai.outputs.llmModel @@ -396,26 +400,30 @@ module deploymentScript 'core/scripts/deployment-script.bicep' ={ azure_aoai_embedding_model:aoai.outputs.textEmbeddingModel azure_aoai_embedding_model_deployment_name:aoai.outputs.textEmbeddingModelDeploymentName azure_aoai_embedding_model_api_version:aoai.outputs.textEmbeddingModelApiVersion - azure_app_hostname:appHostname azure_app_url:appUrl azure_app_insights_connection_string:appInsights.outputs.connectionString - azure_cosmosdb_endpoint :cosmosdb.outputs.endpoint azure_cosmosdb_name:cosmosdb.outputs.name azure_cosmosdb_id:cosmosdb.outputs.id - azure_dns_zone_name:privateDnsZone.outputs.name - - azure_storage_account:storage.outputs.name azure_storage_account_blob_url:storage.outputs.primaryEndpoints.blob - azure_workload_identity_client_id:workloadIdentity.outputs.clientId azure_workload_identity_principal_id:workloadIdentity.outputs.principalId azure_workload_identity_name:workloadIdentity.outputs.name - + public_storage_account_name: publicStorageAccountName + public_storage_account_key: publicStorageAccountKey + + } +} +module apimgraphragservicedef 'core/apim/apim.graphrag-servicedef.bicep'={ + name: 'graphragservicedef-deployment' + params:{ + name:'GraphRag' + apimname:apim.outputs.name + backendUrl:appUrl } } diff --git a/infra/managed-app/artifacts/scripts/updategraphrag.sh b/infra/managed-app/artifacts/scripts/updategraphrag.sh index 6b9d21da..686c72de 100755 --- a/infra/managed-app/artifacts/scripts/updategraphrag.sh +++ b/infra/managed-app/artifacts/scripts/updategraphrag.sh @@ -1,14 +1,15 @@ #!/bin/bash # Install kubectl +set -e az aks install-cli --only-show-errors +az login --identity + # Get AKS credentials az aks get-credentials \ --admin \ - --name $clusterName \ - --resource-group $resourceGroupName \ - --subscription $subscriptionId \ - --only-show-errors + --name $AZURE_AKS_NAME \ + --resource-group $AZURE_RESOURCE_GROUP --only-show-errors # Check if the cluster is private or not @@ -27,37 +28,27 @@ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx # Update Helm repos helm repo update -helm pull oci://graphrag.azurecr.io/graphrag --generate-name - -tar -xvf graphrag-0.1.0.tgz - +helm pull oci://graphrag.azurecr.io/graphrag --untar - - # Log whether the cluster is public or private - echo "$clusterName AKS cluster is public" - - # Install Prometheus - - # Install NGINX ingress controller using the internal load balancer - helm upgrade -i graphrag ./graphrag -f ./graphrag/values.yaml \ - --namespace $aksNamespace --create-namespace \ - --set "serviceAccount.name=$AZURE_AKS_SERVICE_ACCOUNT_NAME" \ - --set "serviceAccount.annotations.azure\.workload\.identity/client-id=$AZURE_WORKLOAD_IDENTITY_CLIENT_ID" \ - --set "master.image.repository=graphrag.azurecr.io/$IMAGE_NAME" \ - --set "master.image.tag=$IMAGE_VERSION" \ - --set "ingress.host=$AZURE_APP_HOSTNAME" \ - --set "graphragConfig.APP_INSIGHTS_CONNECTION_STRING=$APP_INSIGHTS_CONNECTION_STRING" \ - --set "graphragConfig.AI_SEARCH_URL=https://$AI_SEARCH_NAME.search.windows.net" \ - --set "graphragConfig.COSMOS_URI_ENDPOINT=$AZURE_COSMOSDB_ENDPOINT" \ - --set "graphragConfig.GRAPHRAG_API_BASE=$AZURE_OPENAI_ENDPOINT" \ - --set "graphragConfig.GRAPHRAG_API_VERSION=$AZURE_AOAI_LLM_MODEL_API_VERSION" \ - --set "graphragConfig.GRAPHRAG_LLM_MODEL=$AZURE_AOAI_LLM_MODEL"\ - --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$AZURE_AOAI_EMBEDDING_MODEL" \ - --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME" \ - --set "graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE" \ - --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$AZURE_STORAGE_ACCOUNT_BLOB_URL" +helm upgrade -i graphrag ./graphrag -f ./graphrag/values.yaml \ + --namespace $aksNamespace --create-namespace \ + --set "serviceAccount.name=$AZURE_AKS_SERVICE_ACCOUNT_NAME" \ + --set "serviceAccount.annotations.azure\.workload\.identity/client-id=$AZURE_WORKLOAD_IDENTITY_CLIENT_ID" \ + --set "master.image.repository=graphrag.azurecr.io/$IMAGE_NAME" \ + --set "master.image.tag=$IMAGE_VERSION" \ + --set "ingress.host=$AZURE_APP_HOSTNAME" \ + --set "graphragConfig.APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHTS_CONNECTION_STRING" \ + --set "graphragConfig.AI_SEARCH_URL=https://$AI_SEARCH_NAME.search.windows.net" \ + --set "graphragConfig.COSMOS_URI_ENDPOINT=$AZURE_COSMOSDB_ENDPOINT" \ + --set "graphragConfig.GRAPHRAG_API_BASE=$AZURE_OPENAI_ENDPOINT" \ + --set "graphragConfig.GRAPHRAG_API_VERSION=$AZURE_AOAI_LLM_MODEL_API_VERSION" \ + --set "graphragConfig.GRAPHRAG_LLM_MODEL=$AZURE_AOAI_LLM_MODEL"\ + --set "graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$AZURE_AOAI_EMBEDDING_MODEL" \ + --set "graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME" \ + --set "graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE" \ + --set "graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$AZURE_STORAGE_ACCOUNT_BLOB_URL" diff --git a/infra/managed-app/createUiDefinition.json b/infra/managed-app/createUiDefinition.json index 50a09752..cebd039b 100644 --- a/infra/managed-app/createUiDefinition.json +++ b/infra/managed-app/createUiDefinition.json @@ -159,7 +159,43 @@ "visible": true } ] + }, + { + "name": "StorageaccountSettings", + "label": "StorageAccount Settings", + "subLabel": { + "preValidation": "Configure the graphrag settings", + "postValidation": "Completed" + }, + "elements": [ + { + "name": "StorageAccountName", + "type": "Microsoft.Common.TextBox", + "label": "Storage Account", + "defaultValue": "", + "toolTip": "StorageAccountName to use", + "visible": true, + "constraints": { + "required": true + } + }, + { + "name": "StorageAccountKey", + "type": "Microsoft.Common.PasswordBox", + "label": { + "password": "Storage Account Key", + "confirmPassword": "Confirm Storage Account Key" + }, + "constraints": { + "required": true + }, + "visible": true + + } + + ] } + ], "outputs": { "resourceGroup": "[resourceGroup().name]", @@ -170,7 +206,9 @@ "embeddingModelName": "[steps('aoaiSettings').embeddingModel]", "embeddingModelQuota": "[int(steps('aoaiSettings').embeddingModelQuota)]", "llmModelVersion": "[steps('aoaiSettings').llmModelVersion]", - "embeddingModelVersion": "[steps('aoaiSettings').embeddingModelVersion]" + "embeddingModelVersion": "[steps('aoaiSettings').embeddingModelVersion]", + "publicStorageAccountName": "[steps('StorageaccountSettings').StorageAccountName]", + "publicStorageAccountKey": "[steps('StorageaccountSettings').StorageAccountKey]" } } } \ No newline at end of file diff --git a/infra/managed-app/mainTemplate.json b/infra/managed-app/mainTemplate.json index 6f46827d..e8f96874 100644 --- a/infra/managed-app/mainTemplate.json +++ b/infra/managed-app/mainTemplate.json @@ -4,8 +4,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "9931387349449043336" + "version": "0.33.93.31351", + "templateHash": "9942415607713496570" } }, "parameters": { @@ -92,6 +92,18 @@ "type": "string", "defaultValue": "" }, + "utcString": { + "type": "string", + "defaultValue": "[utcNow()]" + }, + "graphragimage": { + "type": "string", + "defaultValue": "graphragbackend" + }, + "graphragimageversion": { + "type": "string", + "defaultValue": "latest" + }, "llmModelName": { "type": "string", "defaultValue": "gpt-4o", @@ -112,7 +124,7 @@ }, "llmModelQuota": { "type": "int", - "defaultValue": 10, + "defaultValue": 1, "minValue": 1, "metadata": { "description": "Quota of the AOAI LLM model to use." @@ -135,11 +147,19 @@ }, "embeddingModelQuota": { "type": "int", - "defaultValue": 10, + "defaultValue": 1, "minValue": 1, "metadata": { "description": "Quota of the AOAI embedding model to use." } + }, + "publicStorageAccountName": { + "type": "string", + "defaultValue": "" + }, + "publicStorageAccountKey": { + "type": "securestring", + "defaultValue": "" } }, "variables": { @@ -280,6 +300,7 @@ "webSitesFunctions": "func-", "webStaticSites": "stapp-" }, + "$fxv#1": "#!/bin/bash\n# Install kubectl\nset -e\naz aks install-cli --only-show-errors\n \n\n# Get AKS credentials\naz aks get-credentials \\\n --admin \\\n --name $AZURE_AKS_NAME \\\n --resource-group $AZURE_RESOURCE_GROUP --only-show-errors\n\n# Check if the cluster is private or not\n\n# Assign a value to aksNamespace\naksNamespace=\"graphrag\"\n\n# Install Helm\ncurl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -o get_helm.sh -s\nchmod 700 get_helm.sh\n./get_helm.sh &>/dev/null\n\n# Add Helm repos\nhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts\nhelm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\n\n# Update Helm repos\nhelm repo update\n\nhelm pull oci://graphrag.azurecr.io/graphrag --untar\n\n \nhelm upgrade -i graphrag ./graphrag -f ./graphrag/values.yaml \\\n --namespace $aksNamespace --create-namespace \\\n --set \"serviceAccount.name=$AZURE_AKS_SERVICE_ACCOUNT_NAME\" \\\n --set \"serviceAccount.annotations.azure\\.workload\\.identity/client-id=$AZURE_WORKLOAD_IDENTITY_CLIENT_ID\" \\\n --set \"master.image.repository=graphrag.azurecr.io/$IMAGE_NAME\" \\\n --set \"master.image.tag=$IMAGE_VERSION\" \\\n --set \"ingress.host=$AZURE_APP_HOSTNAME\" \\\n --set \"graphragConfig.APPLICATIONINSIGHTS_CONNECTION_STRING=$APP_INSIGHTS_CONNECTION_STRING\" \\\n --set \"graphragConfig.AI_SEARCH_URL=https://$AI_SEARCH_NAME.search.windows.net\" \\\n --set \"graphragConfig.COSMOS_URI_ENDPOINT=$AZURE_COSMOSDB_ENDPOINT\" \\\n --set \"graphragConfig.GRAPHRAG_API_BASE=$AZURE_OPENAI_ENDPOINT\" \\\n --set \"graphragConfig.GRAPHRAG_API_VERSION=$AZURE_AOAI_LLM_MODEL_API_VERSION\" \\\n --set \"graphragConfig.GRAPHRAG_LLM_MODEL=$AZURE_AOAI_LLM_MODEL\"\\\n --set \"graphragConfig.GRAPHRAG_LLM_DEPLOYMENT_NAME=$AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME\" \\\n --set \"graphragConfig.GRAPHRAG_EMBEDDING_MODEL=$AZURE_AOAI_EMBEDDING_MODEL\" \\\n --set \"graphragConfig.GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=$AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME\" \\\n --set \"graphragConfig.COGNITIVE_SERVICES_AUDIENCE=$COGNITIVE_SERVICES_AUDIENCE\" \\\n --set \"graphragConfig.STORAGE_ACCOUNT_BLOB_URL=$AZURE_STORAGE_ACCOUNT_BLOB_URL\"\n\n \n\n\n\n", "resourceBaseNameFinal": "[if(not(empty(parameters('resourceBaseName'))), parameters('resourceBaseName'), toLower(uniqueString(format('{0}/resourceGroups/{1}', subscription().id, parameters('resourceGroup')))))]", "abbrs": "[variables('$fxv#0')]", "tags": { @@ -324,8 +345,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "12633129174833370467" + "version": "0.33.93.31351", + "templateHash": "15674161325892705676" } }, "parameters": { @@ -472,8 +493,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "7894561717174372245" + "version": "0.33.93.31351", + "templateHash": "13254511464568135903" } }, "parameters": { @@ -527,8 +548,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "6505063178335705329" + "version": "0.33.93.31351", + "templateHash": "11258206015777241921" } }, "parameters": { @@ -605,8 +626,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "7427556975670137358" + "version": "0.33.93.31351", + "templateHash": "16619124547797522615" } }, "parameters": { @@ -914,8 +935,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "7094004855498640344" + "version": "0.33.93.31351", + "templateHash": "9158217012658604749" } }, "parameters": { @@ -1065,8 +1086,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "3498035798180053085" + "version": "0.33.93.31351", + "templateHash": "15475380690582621771" } }, "parameters": { @@ -1112,14 +1133,14 @@ }, "llmTpmQuota": { "type": "int", - "defaultValue": 10, + "defaultValue": 1, "metadata": { "description": "TPM quota for llm model deployment (x1000)" } }, "embeddingTpmQuota": { "type": "int", - "defaultValue": 10, + "defaultValue": 1, "metadata": { "description": "TPM quota for embedding model deployment (x1000)" } @@ -1236,8 +1257,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "2055687397636798534" + "version": "0.33.93.31351", + "templateHash": "3579514199569414551" } }, "parameters": { @@ -1336,8 +1357,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "11487597397946974030" + "version": "0.33.93.31351", + "templateHash": "4262586997141187053" } }, "parameters": { @@ -1517,7 +1538,7 @@ }, "properties": { "enableRBAC": true, - "disableLocalAccounts": true, + "disableLocalAccounts": false, "dnsPrefix": "[if(not(empty(parameters('dnsPrefix'))), parameters('dnsPrefix'), toLower(parameters('clusterName')))]", "aadProfile": { "managed": true, @@ -1685,8 +1706,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "11816911936820039606" + "version": "0.33.93.31351", + "templateHash": "4114639481216656536" } }, "parameters": { @@ -1813,8 +1834,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "2376857239076024622" + "version": "0.33.93.31351", + "templateHash": "4148789917591925909" } }, "parameters": { @@ -1905,8 +1926,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "5608400408329637194" + "version": "0.33.93.31351", + "templateHash": "5352518107419090409" } }, "parameters": { @@ -2085,8 +2106,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "14280738582927740005" + "version": "0.33.93.31351", + "templateHash": "11002141915701219380" } }, "parameters": { @@ -2204,8 +2225,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "14582251664377611150" + "version": "0.33.93.31351", + "templateHash": "14843923724157327855" } }, "parameters": { @@ -2456,8 +2477,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "10620983066885906719" + "version": "0.33.93.31351", + "templateHash": "2670804874768629752" } }, "parameters": { @@ -2564,8 +2585,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "11208726344160642523" + "version": "0.33.93.31351", + "templateHash": "17962046310475786003" } }, "parameters": { @@ -2657,8 +2678,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "1285005992081263811" + "version": "0.33.93.31351", + "templateHash": "13258802455944913421" } }, "parameters": { @@ -2755,8 +2776,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "16525541988331055931" + "version": "0.33.93.31351", + "templateHash": "1905656724149562282" } }, "parameters": { @@ -2835,8 +2856,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "6113218360443805978" + "version": "0.33.93.31351", + "templateHash": "9115361788050213720" } }, "parameters": { @@ -2956,8 +2977,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "3076000571800932587" + "version": "0.33.93.31351", + "templateHash": "6906230456894515846" } }, "parameters": { @@ -3057,8 +3078,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "13518705746136222913" + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" } }, "parameters": { @@ -3168,8 +3189,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "13518705746136222913" + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" } }, "parameters": { @@ -3279,8 +3300,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "13518705746136222913" + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" } }, "parameters": { @@ -3388,8 +3409,8 @@ "metadata": { "_generator": { "name": "bicep", - "version": "0.33.13.18514", - "templateHash": "13518705746136222913" + "version": "0.33.93.31351", + "templateHash": "13335949838347044523" } }, "parameters": { @@ -3464,6 +3485,1859 @@ "[resourceId('Microsoft.Resources/deployments', 'privatelink-private-dns-zones-deployment')]", "[resourceId('Microsoft.Resources/deployments', 'vnet-deployment')]" ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "[parameters('utcString')]", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "utcValue": { + "value": "[parameters('utcString')]" + }, + "name": { + "value": "graphragscript" + }, + "location": { + "value": "[parameters('location')]" + }, + "subscriptionId": { + "value": "[subscription().id]" + }, + "tenantid": { + "value": "[tenant().tenantId]" + }, + "acrserver": { + "value": "graphrag.azure.acr.io" + }, + "azure_location": { + "value": "[parameters('location')]" + }, + "azure_acr_login_server": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.loginServer.value]" + }, + "azure_acr_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'acr-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_aks_controlplanefqdn": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.controlPlaneFqdn.value]" + }, + "azure_aks_managed_rg": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.managedResourceGroup.value]" + }, + "azure_aks_service_account_name": { + "value": "[variables('aksServiceAccountName')]" + }, + "imagename": { + "value": "[parameters('graphragimage')]" + }, + "imageversion": { + "value": "[parameters('graphragimageversion')]" + }, + "azure_apim_gateway_url": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.apimGatewayUrl.value]" + }, + "azure_apim_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "managed_identity_aks": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aks-deployment'), '2022-09-01').outputs.systemIdentity.value]" + }, + "script_file": { + "value": "[variables('$fxv#1')]" + }, + "ai_search_name": { + "value": "aisearch-deployment" + }, + "azure_aoai_endpoint": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.openAiEndpoint.value]" + }, + "azure_aoai_llm_model": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModel.value]" + }, + "azure_aoai_llm_model_deployment_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelDeploymentName.value]" + }, + "azure_aoai_llm_model_api_version": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.llmModelApiVersion.value]" + }, + "azure_aoai_embedding_model": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModel.value]" + }, + "azure_aoai_embedding_model_deployment_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelDeploymentName.value]" + }, + "azure_aoai_embedding_model_api_version": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'aoai-deployment'), '2022-09-01').outputs.textEmbeddingModelApiVersion.value]" + }, + "azure_app_hostname": { + "value": "[variables('appHostname')]" + }, + "azure_app_url": { + "value": "[variables('appUrl')]" + }, + "azure_app_insights_connection_string": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'app-insights-deployment'), '2022-09-01').outputs.connectionString.value]" + }, + "azure_cosmosdb_endpoint": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.endpoint.value]" + }, + "azure_cosmosdb_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_cosmosdb_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment'), '2022-09-01').outputs.id.value]" + }, + "azure_dns_zone_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.name.value]" + }, + "azure_storage_account_blob_url": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'storage-deployment'), '2022-09-01').outputs.primaryEndpoints.value.blob]" + }, + "azure_workload_identity_client_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.clientId.value]" + }, + "azure_workload_identity_principal_id": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.principalId.value]" + }, + "azure_workload_identity_name": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment'), '2022-09-01').outputs.name.value]" + }, + "public_storage_account_name": { + "value": "[parameters('publicStorageAccountName')]" + }, + "public_storage_account_key": { + "value": "[parameters('publicStorageAccountKey')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "17195102145442235485" + } + }, + "parameters": { + "name": { + "type": "string" + }, + "utcValue": { + "type": "string" + }, + "location": { + "type": "string" + }, + "subscriptionId": { + "type": "string" + }, + "tenantid": { + "type": "string" + }, + "acrserver": { + "type": "string" + }, + "azure_location": { + "type": "string" + }, + "azure_acr_login_server": { + "type": "string" + }, + "azure_acr_name": { + "type": "string" + }, + "azure_aks_name": { + "type": "string" + }, + "azure_aks_controlplanefqdn": { + "type": "string" + }, + "azure_aks_managed_rg": { + "type": "string" + }, + "azure_aks_service_account_name": { + "type": "string" + }, + "azure_apim_gateway_url": { + "type": "string" + }, + "azure_apim_name": { + "type": "string" + }, + "managed_identity_aks": { + "type": "string" + }, + "ai_search_name": { + "type": "string" + }, + "imagename": { + "type": "string" + }, + "imageversion": { + "type": "string" + }, + "script_file": { + "type": "string" + }, + "azure_aoai_endpoint": { + "type": "string" + }, + "azure_aoai_llm_model": { + "type": "string" + }, + "azure_aoai_llm_model_deployment_name": { + "type": "string" + }, + "azure_aoai_llm_model_api_version": { + "type": "string" + }, + "azure_aoai_embedding_model": { + "type": "string" + }, + "azure_aoai_embedding_model_deployment_name": { + "type": "string" + }, + "azure_aoai_embedding_model_api_version": { + "type": "string" + }, + "azure_app_hostname": { + "type": "string" + }, + "azure_app_url": { + "type": "string" + }, + "azure_app_insights_connection_string": { + "type": "string" + }, + "azure_cosmosdb_endpoint": { + "type": "string" + }, + "azure_cosmosdb_name": { + "type": "string" + }, + "azure_cosmosdb_id": { + "type": "string" + }, + "azure_dns_zone_name": { + "type": "string" + }, + "azure_storage_account": { + "type": "string" + }, + "azure_storage_account_blob_url": { + "type": "string" + }, + "azure_workload_identity_client_id": { + "type": "string" + }, + "azure_workload_identity_principal_id": { + "type": "string" + }, + "azure_workload_identity_name": { + "type": "string" + }, + "cognitive_services_audience": { + "type": "string", + "defaultValue": "https://cognitiveservices.azure.com/default" + }, + "public_storage_account_name": { + "type": "string" + }, + "public_storage_account_key": { + "type": "string" + } + }, + "variables": { + "clusterAdminRoleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', '0ab0b1a8-8aac-4efd-b8c2-3ee1fb270be8')]" + }, + "resources": [ + { + "type": "Microsoft.ManagedIdentity/userAssignedIdentities", + "apiVersion": "2023-01-31", + "name": "[uniqueString(resourceGroup().id)]", + "location": "[parameters('location')]" + }, + { + "type": "Microsoft.Authorization/roleAssignments", + "apiVersion": "2022-04-01", + "scope": "[format('Microsoft.ContainerService/managedClusters/{0}', parameters('azure_aks_name'))]", + "name": "[guid(parameters('managed_identity_aks'), resourceId('Microsoft.ContainerService/managedClusters', parameters('azure_aks_name')), variables('clusterAdminRoleDefinitionId'))]", + "properties": { + "roleDefinitionId": "[variables('clusterAdminRoleDefinitionId')]", + "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id)), '2023-01-31').principalId]", + "principalType": "ServicePrincipal" + }, + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id))]" + ] + }, + { + "type": "Microsoft.Resources/deploymentScripts", + "apiVersion": "2020-10-01", + "name": "[parameters('name')]", + "location": "[parameters('location')]", + "kind": "AzureCLI", + "identity": { + "type": "UserAssigned", + "userAssignedIdentities": { + "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id)))]": {} + } + }, + "properties": { + "storageAccountSettings": { + "storageAccountName": "[parameters('public_storage_account_name')]", + "storageAccountKey": "[parameters('public_storage_account_key')]" + }, + "forceUpdateTag": "[parameters('utcValue')]", + "azCliVersion": "2.7.0", + "timeout": "PT1H", + "environmentVariables": [ + { + "name": "AZURE_SUBSCRIPTION_ID", + "value": "[parameters('subscriptionId')]" + }, + { + "name": "AZURE_TENANT_ID", + "value": "[parameters('tenantid')]" + }, + { + "name": "ACR_SERVER", + "value": "[parameters('acrserver')]" + }, + { + "name": "AZURE_LOCATION", + "value": "[parameters('azure_location')]" + }, + { + "name": "AZURE_ACR_LOGIN_SERVER", + "value": "[parameters('azure_acr_login_server')]" + }, + { + "name": "AZURE_ACR_NAME", + "value": "[parameters('azure_acr_name')]" + }, + { + "name": "AZURE_AKS_NAME", + "value": "[parameters('azure_aks_name')]" + }, + { + "name": "AZURE_AKS_CONTROLPLANEFQDN", + "value": "[parameters('azure_aks_controlplanefqdn')]" + }, + { + "name": "AZURE_AKS_MANAGED_RG", + "value": "[parameters('azure_aks_managed_rg')]" + }, + { + "name": "AZURE_AKS_SERVICE_ACCOUNT_NAME", + "value": "[parameters('azure_aks_service_account_name')]" + }, + { + "name": "AZURE_APIM_GATEWAY_URL", + "value": "[parameters('azure_apim_gateway_url')]" + }, + { + "name": "AZURE_APIM_NAME", + "value": "[parameters('azure_apim_name')]" + }, + { + "name": "MANAGED_IDENTITY_AKS", + "value": "[parameters('managed_identity_aks')]" + }, + { + "name": "IMAGE_NAME", + "value": "[parameters('imagename')]" + }, + { + "name": "IMAGE_VERSION", + "value": "[parameters('imageversion')]" + }, + { + "name": "AI_SEARCH_NAME", + "value": "[parameters('ai_search_name')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL", + "value": "[parameters('azure_aoai_llm_model')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL_DEPLOYMENT_NAME", + "value": "[parameters('azure_aoai_llm_model_deployment_name')]" + }, + { + "name": "AZURE_AOAI_LLM_MODEL_API_VERSION", + "value": "[parameters('azure_aoai_llm_model_api_version')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL", + "value": "[parameters('azure_aoai_embedding_model')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL_DEPLOYMENT_NAME", + "value": "[parameters('azure_aoai_embedding_model_deployment_name')]" + }, + { + "name": "AZURE_AOAI_EMBEDDING_MODEL_API_VERSION", + "value": "[parameters('azure_aoai_embedding_model_api_version')]" + }, + { + "name": "AZURE_APP_HOSTNAME", + "value": "[parameters('azure_app_hostname')]" + }, + { + "name": "AZURE_APP_URL", + "value": "[parameters('azure_app_url')]" + }, + { + "name": "AZURE_APP_INSIGHTS_CONNECTION_STRING", + "value": "[parameters('azure_app_insights_connection_string')]" + }, + { + "name": "AZURE_COSMOSDB_ENDPOINT", + "value": "[parameters('azure_cosmosdb_endpoint')]" + }, + { + "name": "AZURE_COSMOSDB_NAME", + "value": "[parameters('azure_cosmosdb_name')]" + }, + { + "name": "AZURE_COSMOSDB_ID", + "value": "[parameters('azure_cosmosdb_id')]" + }, + { + "name": "AZURE_DNS_ZONE_NAME", + "value": "[parameters('azure_dns_zone_name')]" + }, + { + "name": "AZURE_STORAGE_ACCOUNT", + "value": "[parameters('azure_storage_account')]" + }, + { + "name": "AZURE_STORAGE_ACCOUNT_BLOB_URL", + "value": "[parameters('azure_storage_account_blob_url')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_CLIENT_ID", + "value": "[parameters('azure_workload_identity_client_id')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_PRINCIPAL_ID", + "value": "[parameters('azure_workload_identity_principal_id')]" + }, + { + "name": "AZURE_WORKLOAD_IDENTITY_NAME", + "value": "[parameters('azure_workload_identity_name')]" + }, + { + "name": "COGNITIVE_SERVICES_AUDIENCE", + "value": "[parameters('cognitive_services_audience')]" + }, + { + "name": "AZURE_OPENAI_ENDPOINT", + "value": "[parameters('azure_aoai_endpoint')]" + }, + { + "name": "AZURE_RESOURCE_GROUP", + "value": "[resourceGroup().name]" + } + ], + "cleanupPreference": "OnSuccess", + "retentionInterval": "P1D", + "scriptContent": "[parameters('script_file')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', uniqueString(resourceGroup().id))]" + ] + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'acr-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aisearch-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aks-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'aoai-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'app-insights-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'cosmosdb-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'private-dns-zone-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'storage-deployment')]", + "[resourceId('Microsoft.Resources/deployments', 'workload-identity-deployment')]" + ] + }, + { + "type": "Microsoft.Resources/deployments", + "apiVersion": "2022-09-01", + "name": "graphragservicedef-deployment", + "properties": { + "expressionEvaluationOptions": { + "scope": "inner" + }, + "mode": "Incremental", + "parameters": { + "name": { + "value": "GraphRag" + }, + "apimname": { + "value": "[reference(resourceId('Microsoft.Resources/deployments', 'apim-deployment'), '2022-09-01').outputs.name.value]" + }, + "backendUrl": { + "value": "[variables('appUrl')]" + } + }, + "template": { + "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "metadata": { + "_generator": { + "name": "bicep", + "version": "0.33.93.31351", + "templateHash": "13338625497669096861" + } + }, + "parameters": { + "backendUrl": { + "type": "string" + }, + "name": { + "type": "string" + }, + "apimname": { + "type": "string" + } + }, + "variables": { + "$fxv#0": { + "openapi": "3.1.0", + "info": { + "title": "GraphRAG", + "version": "v0.0.0" + }, + "paths": { + "/data": { + "get": { + "tags": [ + "Data Management" + ], + "summary": "Get all data storage containers.", + "description": "Retrieve a list of all data storage containers.", + "operationId": "get_all_data_storage_containers_data_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StorageNameList" + } + } + } + } + } + }, + "post": { + "tags": [ + "Data Management" + ], + "summary": "Upload data to a data storage container", + "description": "Create a data storage container in Azure and upload files to it.\n\nArgs:\n files (List[UploadFile]): A list of files to be uploaded.\n storage_name (str): The name of the Azure Blob Storage container to which files will be uploaded.\n overwrite (bool): Whether to overwrite existing files with the same name. Defaults to True. If False, files that already exist will be skipped.\n\nReturns:\n BaseResponse: An instance of the BaseResponse model with a status message indicating the result of the upload.\n\nRaises:\n HTTPException: If the container name is invalid or if any error occurs during the upload process.", + "operationId": "upload_files_data_post", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "overwrite", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": true, + "title": "Overwrite" + } + } + ], + "requestBody": { + "required": true, + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_upload_files_data_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/data/{storage_name}": { + "delete": { + "tags": [ + "Data Management" + ], + "summary": "Delete a data storage container", + "description": "Delete a specified data storage container.", + "operationId": "delete_files_data__storage_name__delete", + "parameters": [ + { + "name": "storage_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index": { + "post": { + "tags": [ + "Index Operations" + ], + "summary": "Build an index", + "operationId": "setup_indexing_pipeline_index_post", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "index_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "requestBody": { + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/Body_setup_indexing_pipeline_index_post" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + }, + "get": { + "tags": [ + "Index Operations" + ], + "summary": "Get all indexes", + "description": "Retrieve a list of all index names.", + "operationId": "get_all_indexes_index_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IndexNameList" + } + } + } + } + } + } + }, + "/index/{index_name}": { + "delete": { + "tags": [ + "Index Operations" + ], + "summary": "Delete a specified index", + "description": "Delete a specified index.", + "operationId": "delete_index_index__index_name__delete", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BaseResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index/status/{index_name}": { + "get": { + "tags": [ + "Index Operations" + ], + "summary": "Track the status of an indexing job", + "operationId": "get_index_job_status_index_status__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IndexStatusResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/global": { + "post": { + "tags": [ + "Query Operations" + ], + "summary": "Perform a global search across the knowledge graph index", + "description": "The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.", + "operationId": "global_query_query_global_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/local": { + "post": { + "tags": [ + "Query Operations" + ], + "summary": "Perform a local search across the knowledge graph index.", + "description": "The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).", + "operationId": "local_query_query_local_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/streaming/global": { + "post": { + "tags": [ + "Query Streaming Operations" + ], + "summary": "Stream a response back after performing a global search", + "description": "The global query method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole.", + "operationId": "global_search_streaming_query_streaming_global_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/query/streaming/local": { + "post": { + "tags": [ + "Query Streaming Operations" + ], + "summary": "Stream a response back after performing a local search", + "description": "The local query method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?).", + "operationId": "local_search_streaming_query_streaming_local_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/index/config/prompts": { + "get": { + "tags": [ + "Index Configuration" + ], + "summary": "Generate graphrag prompts from user-provided data.", + "description": "Generating custom prompts from user-provided data may take several minutes to run based on the amount of data used.", + "operationId": "generate_prompts_index_config_prompts_get", + "parameters": [ + { + "name": "storage_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "Storage Name" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 5, + "title": "Limit" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/report/{index_name}/{report_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single community report.", + "operationId": "get_report_info_source_report__index_name___report_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "report_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Report Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReportResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/text/{index_name}/{text_unit_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single base text unit.", + "operationId": "get_chunk_info_source_text__index_name___text_unit_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "text_unit_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Text Unit Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TextUnitResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/entity/{index_name}/{entity_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single entity.", + "operationId": "get_entity_info_source_entity__index_name___entity_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "entity_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Entity Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/EntityResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/claim/{index_name}/{claim_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single claim.", + "operationId": "get_claim_info_source_claim__index_name___claim_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "claim_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Claim Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ClaimResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/source/relationship/{index_name}/{relationship_id}": { + "get": { + "tags": [ + "Sources" + ], + "summary": "Return a single relationship.", + "operationId": "get_relationship_info_source_relationship__index_name___relationship_id__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + }, + { + "name": "relationship_id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Relationship Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RelationshipResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/graph/graphml/{index_name}": { + "get": { + "tags": [ + "Graph Operations" + ], + "summary": "Retrieve a GraphML file of the knowledge graph", + "operationId": "retrieve_graphml_file_graph_graphml__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "GraphML file successfully downloaded", + "content": { + "application/json": { + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/graph/stats/{index_name}": { + "get": { + "tags": [ + "Graph Operations" + ], + "summary": "Retrieve basic graph statistics, number of nodes and edges", + "operationId": "retrieve_graph_stats_graph_stats__index_name__get", + "parameters": [ + { + "name": "index_name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Index Name" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GraphDataResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/health": { + "get": { + "summary": "API health check", + "description": "Returns a 200 response to indicate the API is healthy.", + "operationId": "health_check_health_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + } + } + } + }, + "components": { + "schemas": { + "BaseResponse": { + "properties": { + "status": { + "type": "string", + "title": "Status" + } + }, + "type": "object", + "required": [ + "status" + ], + "title": "BaseResponse" + }, + "Body_setup_indexing_pipeline_index_post": { + "properties": { + "entity_extraction_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Entity Extraction Prompt" + }, + "community_report_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Community Report Prompt" + }, + "summarize_descriptions_prompt": { + "anyOf": [ + { + "type": "string", + "format": "binary" + }, + { + "type": "null" + } + ], + "title": "Summarize Descriptions Prompt" + } + }, + "type": "object", + "title": "Body_setup_indexing_pipeline_index_post" + }, + "Body_upload_files_data_post": { + "properties": { + "files": { + "items": { + "type": "string", + "format": "binary" + }, + "type": "array", + "title": "Files" + } + }, + "type": "object", + "required": [ + "files" + ], + "title": "Body_upload_files_data_post" + }, + "ClaimResponse": { + "properties": { + "covariate_type": { + "type": "string", + "title": "Covariate Type" + }, + "type": { + "type": "string", + "title": "Type" + }, + "description": { + "type": "string", + "title": "Description" + }, + "subject_id": { + "type": "string", + "title": "Subject Id" + }, + "object_id": { + "type": "string", + "title": "Object Id" + }, + "source_text": { + "type": "string", + "title": "Source Text" + }, + "text_unit_id": { + "type": "string", + "title": "Text Unit Id" + }, + "document_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Document Ids" + } + }, + "type": "object", + "required": [ + "covariate_type", + "type", + "description", + "subject_id", + "object_id", + "source_text", + "text_unit_id", + "document_ids" + ], + "title": "ClaimResponse" + }, + "EntityResponse": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "text_units": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Text Units" + } + }, + "type": "object", + "required": [ + "name", + "description", + "text_units" + ], + "title": "EntityResponse" + }, + "GraphDataResponse": { + "properties": { + "nodes": { + "type": "integer", + "title": "Nodes" + }, + "edges": { + "type": "integer", + "title": "Edges" + } + }, + "type": "object", + "required": [ + "nodes", + "edges" + ], + "title": "GraphDataResponse" + }, + "GraphRequest": { + "properties": { + "index_name": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "title": "Index Name" + }, + "query": { + "type": "string", + "title": "Query" + } + }, + "type": "object", + "required": [ + "index_name", + "query" + ], + "title": "GraphRequest" + }, + "GraphResponse": { + "properties": { + "result": { + "title": "Result" + }, + "context_data": { + "title": "Context Data" + } + }, + "type": "object", + "required": [ + "result", + "context_data" + ], + "title": "GraphResponse" + }, + "HTTPValidationError": { + "properties": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "IndexNameList": { + "properties": { + "index_name": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Index Name" + } + }, + "type": "object", + "required": [ + "index_name" + ], + "title": "IndexNameList" + }, + "IndexStatusResponse": { + "properties": { + "status_code": { + "type": "integer", + "title": "Status Code" + }, + "index_name": { + "type": "string", + "title": "Index Name" + }, + "storage_name": { + "type": "string", + "title": "Storage Name" + }, + "status": { + "type": "string", + "title": "Status" + }, + "percent_complete": { + "type": "number", + "title": "Percent Complete" + }, + "progress": { + "type": "string", + "title": "Progress" + } + }, + "type": "object", + "required": [ + "status_code", + "index_name", + "storage_name", + "status", + "percent_complete", + "progress" + ], + "title": "IndexStatusResponse" + }, + "RelationshipResponse": { + "properties": { + "source": { + "type": "string", + "title": "Source" + }, + "source_id": { + "type": "integer", + "title": "Source Id" + }, + "target": { + "type": "string", + "title": "Target" + }, + "target_id": { + "type": "integer", + "title": "Target Id" + }, + "description": { + "type": "string", + "title": "Description" + }, + "text_units": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Text Units" + } + }, + "type": "object", + "required": [ + "source", + "source_id", + "target", + "target_id", + "description", + "text_units" + ], + "title": "RelationshipResponse" + }, + "ReportResponse": { + "properties": { + "text": { + "type": "string", + "title": "Text" + } + }, + "type": "object", + "required": [ + "text" + ], + "title": "ReportResponse" + }, + "StorageNameList": { + "properties": { + "storage_name": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Storage Name" + } + }, + "type": "object", + "required": [ + "storage_name" + ], + "title": "StorageNameList" + }, + "TextUnitResponse": { + "properties": { + "text": { + "type": "string", + "title": "Text" + }, + "source_document": { + "type": "string", + "title": "Source Document" + } + }, + "type": "object", + "required": [ + "text", + "source_document" + ], + "title": "TextUnitResponse" + }, + "ValidationError": { + "properties": { + "loc": { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "type": "array", + "title": "Location" + }, + "msg": { + "type": "string", + "title": "Message" + }, + "type": { + "type": "string", + "title": "Error Type" + } + }, + "type": "object", + "required": [ + "loc", + "msg", + "type" + ], + "title": "ValidationError" + } + } + } + }, + "$fxv#1": "\n\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t*\n\t\t\t\n\t\t\t\n\t\t\t\t*\n\t\t\t\n\t\t\t\n\t\t\t\t
*
\n\t\t\t
\n\t\t\t\n\t\t\t\t
*
\n\t\t\t
\n\t\t
\n\t
\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n\t\n\t\t\n\t\n
" + }, + "resources": [ + { + "type": "Microsoft.ApiManagement/service/apis/policies", + "apiVersion": "2022-08-01", + "name": "[format('{0}/{1}/{2}', split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[0], split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[1], 'policy')]", + "properties": { + "format": "rawxml", + "value": "[variables('$fxv#1')]" + }, + "dependsOn": [ + "[resourceId('Microsoft.ApiManagement/service/apis', split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[0], split(format('{0}/{1}', parameters('apimname'), parameters('name')), '/')[1])]" + ] + }, + { + "type": "Microsoft.ApiManagement/service/apis", + "apiVersion": "2023-09-01-preview", + "name": "[format('{0}/{1}', parameters('apimname'), parameters('name'))]", + "properties": { + "displayName": "GraphRAG", + "apiRevision": "1", + "subscriptionRequired": true, + "serviceUrl": "[parameters('backendUrl')]", + "path": "", + "protocols": [ + "https" + ], + "authenticationSettings": { + "oAuth2AuthenticationSettings": [], + "openidAuthenticationSettings": [] + }, + "subscriptionKeyParameterNames": { + "header": "Ocp-Apim-Subscription-Key", + "query": "subscription-key" + }, + "isCurrent": true, + "format": "openapi+json", + "value": "[string(variables('$fxv#0'))]" + } + } + ] + } + }, + "dependsOn": [ + "[resourceId('Microsoft.Resources/deployments', 'apim-deployment')]" + ] } ], "outputs": { From b687cc06177b9f5d323cb52d19f7f56b7fb952fb Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Tue, 11 Feb 2025 16:04:23 -0400 Subject: [PATCH 26/28] Updated URL --- infra/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/README.md b/infra/README.md index 285f3035..24f659b2 100644 --- a/infra/README.md +++ b/infra/README.md @@ -41,5 +41,5 @@ In the Azure Portal, go to Marketplace and create a `Service Catalog Managed App In the Azure Portal, find and click on the managed app definition resource that was created in the previous step. A button option to `Deploy from definition` will be available. Click on it and proceed through the setup steps (defined by the `createUiDefinitions.json` file) that a consumer would experience when installing the managed app. -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https%3A%2F%2Fgithub.com%2FAzure-Samples%2Fgraphrag-accelerator%2Fblob%2Fharjit-managed-app%2Finfra%2FmainTemplate.json) +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure-Samples%2Fgraphrag-accelerator%2Frefs%2Fheads%2Fharjit-managed-app%2Finfra%2FmainTemplate.json) From a4dede04b22fcee65372b7400a000f25e5edd7e8 Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Tue, 11 Feb 2025 16:22:45 -0400 Subject: [PATCH 27/28] updated README --- infra/README.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/infra/README.md b/infra/README.md index 24f659b2..6753c701 100644 --- a/infra/README.md +++ b/infra/README.md @@ -2,6 +2,13 @@ This guide is a temporary document that walks through the process to convert the graphrag solution accelerator to a managed app. + ### Prerequisites + ### 1. create a ACR and push the code to a docker image. + ### 2. This managed app uses storage account to deploy, so please copy the storage account name and the SAS key. + ### 3. When publishing the managed app , please turn on anon access to the Blob where the package can be accessed. + + ### Steps to build Managed App + ### 1. Auto format the bicep code As a precaution, start by auto-formating and linting the bicep code to detect any mistakes early-on. @@ -27,8 +34,8 @@ The name of the final two files (`mainTemplate.json` and `createUiDefinition.jso ```bash cd /infra/managed-app -zip -rj managed-app.zip . -``` + tar -a -c -f managed-app.zip createUiDefinition.json mainTemplate.json openapi.json artifacts + ``` This zip file can then be uploaded to an Azure Storage location when setting up a [Service Catalog Managed Application Definition](https://ms.portal.azure.com/#view/Microsoft_Azure_Marketplace/GalleryItemDetailsBladeNopdl/id/Microsoft.ApplianceDefinition/selectionMode~/false/resourceGroupId//resourceGroupLocation//dontDiscardJourney~/false/selectedMenuId/home/launchingContext~/%7B%22galleryItemId%22%3A%22Microsoft.ApplianceDefinition%22%2C%22source%22%3A%5B%22GalleryFeaturedMenuItemPart%22%2C%22VirtualizedTileDetails%22%5D%2C%22menuItemId%22%3A%22home%22%2C%22subMenuItemId%22%3A%22Search%20results%22%2C%22telemetryId%22%3A%2220409084-39a1-4800-bbce-d0b26a6f46a4%22%7D/searchTelemetryId/d7d20e05-ca16-47f7-bed5-9c7b8d2fa641). @@ -38,8 +45,9 @@ In the Azure Portal, go to Marketplace and create a `Service Catalog Managed App ### 6. Deploy the managed app -In the Azure Portal, find and click on the managed app definition resource that was created in the previous step. A button option to `Deploy from definition` will be available. Click on it and proceed through the setup steps (defined by the `createUiDefinitions.json` file) that a consumer would experience when installing the managed app. + +You can deploy from the portal using the following steps In the Azure Portal, find and click on the managed app definition resource that was created in the previous step. A button option to `Deploy from definition` will be available. Click on it and proceed through the setup steps (defined by the `createUiDefinitions.json` file) that a consumer would experience when installing the managed app. -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure-Samples%2Fgraphrag-accelerator%2Frefs%2Fheads%2Fharjit-managed-app%2Finfra%2FmainTemplate.json) +or you can deploy to azure [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure-Samples%2Fgraphrag-accelerator%2Frefs%2Fheads%2Fharjit-managed-app%2Finfra%2FmainTemplate.json) From 9656f87ef3a8346e9faaa3ebf0f5bca70c6c46f6 Mon Sep 17 00:00:00 2001 From: harjitdotsingh Date: Wed, 12 Feb 2025 16:26:57 -0400 Subject: [PATCH 28/28] updated Config --- infra/deploy.parameters.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/infra/deploy.parameters.json b/infra/deploy.parameters.json index 7e35ce9b..8a3d629f 100644 --- a/infra/deploy.parameters.json +++ b/infra/deploy.parameters.json @@ -1,10 +1,10 @@ { - "GRAPHRAG_API_BASE": "harjsingragbase", - "GRAPHRAG_API_VERSION": "v1", - "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "graphrag-text-embedding-ada-002", - "GRAPHRAG_EMBEDDING_MODEL": "text-embedding-ada-002", - "GRAPHRAG_LLM_DEPLOYMENT_NAME": "graphrag-gpt-4o", - "GRAPHRAG_LLM_MODEL": "gpt-4o", - "LOCATION": "eastus2", - "RESOURCE_GROUP": "harjsin-grag-test" + "GRAPHRAG_API_BASE": "__GRAPHRAG_API_BASE__", + "GRAPHRAG_API_VERSION": "__GRAPHRAG_API_VERSION__", + "GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME": "__GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME__", + "GRAPHRAG_EMBEDDING_MODEL": "__GRAPHRAG_EMBEDDING_MODEL__", + "GRAPHRAG_LLM_DEPLOYMENT_NAME": "__GRAPHRAG_LLM_DEPLOYMENT_NAME__", + "GRAPHRAG_LLM_MODEL": "__GRAPHRAG_LLM_MODEL__", + "LOCATION": "__LOCATION__", + "RESOURCE_GROUP": "__RESOURCE_GROUP__" }