Skip to content

Commit

Permalink
Adding Managed Identity (#117)
Browse files Browse the repository at this point in the history
Co-authored-by: Andre Dewes <[email protected]>
  • Loading branch information
andredewes and Andre Dewes authored May 14, 2024
1 parent 76b0d10 commit aaa704c
Show file tree
Hide file tree
Showing 19 changed files with 763 additions and 106 deletions.
3 changes: 0 additions & 3 deletions .github/workflows/evaluations.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,11 @@ jobs:
AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}
AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
AZURE_OPENAI_API_VERSION: ${{ secrets.AZURE_OPENAI_API_VERSION }}
AZURE_DEPLOYMENT_NAME: "gpt-4"
AZURE_EMBEDDING_NAME: "text-embedding-ada-002"
COSMOS_ENDPOINT: "${{ secrets.CONTOSO_SEARCH_ENDPOINT }}"
COSMOS_KEY: "${{ secrets.CONTOSO_SEARCH_KEY }}"
AZURE_SEARCH_ENDPOINT: "${{ secrets.AZURE_SEARCH_ENDPOINT }}"
AZURE_SEARCH_KEY: "${{ secrets.AZURE_SEARCH_KEY }}"

steps:
- name: checkout repo content
Expand Down
6 changes: 1 addition & 5 deletions azure.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ services:
overrides:
environment_variables.PRT_CONFIG_OVERRIDE: deployment.subscription_id=${AZURE_SUBSCRIPTION_ID},deployment.resource_group=${AZURE_RESOURCE_GROUP},deployment.workspace_name=${AZUREAI_PROJECT_NAME},deployment.endpoint_name=${AZUREAI_ENDPOINT_NAME},deployment.deployment_name=${AZUREAI_DEPLOYMENT_NAME}
environment_variables.AZURE_OPENAI_ENDPOINT: ${AZURE_OPENAI_ENDPOINT}
environment_variables.AZURE_OPENAI_API_KEY: ${AZURE_OPENAI_API_KEY}
environment_variables.AZURE_OPENAI_KEY: ${AZURE_OPENAI_KEY}
environment_variables.AZURE_OPENAI_API_VERSION: ${AZURE_OPENAI_API_VERSION}
environment_variables.COSMOS_ENDPOINT: ${COSMOS_ENDPOINT}
environment_variables.COSMOS_KEY: ${COSMOS_KEY}
environment_variables.AZURE_SEARCH_ENDPOINT: ${AZURE_SEARCH_ENDPOINT}
environment_variables.AZURE_SEARCH_KEY: ${AZURE_SEARCH_KEY}
environment_variables.AZURE_SEARCH_ENDPOINT: ${AZURE_SEARCH_ENDPOINT}
3 changes: 1 addition & 2 deletions contoso_chat/ai_search.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from typing import List
import os
from azure.identity import DefaultAzureCredential
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
from azure.search.documents.models import (
VectorizedQuery,
Expand All @@ -20,7 +19,7 @@ def retrieve_documentation(
search_client = SearchClient(
endpoint=os.environ["AZURE_SEARCH_ENDPOINT"],
index_name=index_name,
credential=AzureKeyCredential(os.environ["AZURE_SEARCH_KEY"]),
credential=DefaultAzureCredential()
)

vector_query = VectorizedQuery(
Expand Down
6 changes: 2 additions & 4 deletions contoso_chat/chat_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@
def get_customer(customerId: str) -> str:
try:
url = os.environ["COSMOS_ENDPOINT"]
credential = os.environ["COSMOS_KEY"]
client = CosmosClient(url=url, credential=credential)
client = CosmosClient(url=url, credential=DefaultAzureCredential())
db = client.get_database_client("contoso-outdoor")
container = db.get_container_client("customers")
response = container.read_item(item=str(customerId), partition_key=str(customerId))
Expand All @@ -28,8 +27,7 @@ def get_customer(customerId: str) -> str:
def get_product(productId: str) -> str:
try:
url = os.environ["COSMOS_ENDPOINT"]
credential = os.environ["COSMOS_KEY"]
client = CosmosClient(url=url, credential=credential)
client = CosmosClient(url=url, credential=DefaultAzureCredential())
db = client.get_database_client("contoso-outdoor")
container = db.get_container_client("products")
response = container.read_item(item=str(productId), partition_key=str(productId))
Expand Down
98 changes: 63 additions & 35 deletions data/customer_info/create-cosmos-db.ipynb

Large diffs are not rendered by default.

564 changes: 554 additions & 10 deletions data/manual_info/contoso-manuals-index.ipynb

Large diffs are not rendered by default.

73 changes: 58 additions & 15 deletions data/product_info/create-azure-search.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,25 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 1,
"metadata": {},
"outputs": [],
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"import pandas as pd\n",
"from azure.core.credentials import AzureKeyCredential\n",
"from azure.identity import DefaultAzureCredential\n",
"from azure.identity import DefaultAzureCredential, get_bearer_token_provider\n",
"from azure.search.documents import SearchClient\n",
"from azure.search.documents.indexes import SearchIndexClient\n",
"from azure.search.documents.indexes.models import (\n",
Expand Down Expand Up @@ -54,7 +66,7 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -65,7 +77,7 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
Expand Down Expand Up @@ -152,7 +164,7 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
Expand All @@ -162,12 +174,13 @@
" openai_service_endoint = os.environ[\"AZURE_OPENAI_ENDPOINT\"]\n",
" openai_deployment = \"text-embedding-ada-002\"\n",
"\n",
" token_provider = get_bearer_token_provider(DefaultAzureCredential(), \"https://cognitiveservices.azure.com/.default\")\n",
" # openai.Embedding.create() -> client.embeddings.create()\n",
" client = AzureOpenAI(\n",
" api_version=\"2023-07-01-preview\",\n",
" azure_endpoint=openai_service_endoint,\n",
" azure_deployment=openai_deployment,\n",
" api_key=os.environ[\"AZURE_OPENAI_KEY\"],\n",
" azure_ad_token_provider=token_provider\n",
" )\n",
"\n",
" products = pd.read_csv(path)\n",
Expand All @@ -193,16 +206,25 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 5,
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"deleting index contoso-products\n",
"creating index contoso-products\n",
"index contoso-products created\n"
]
}
],
"source": [
"contoso_search = os.environ[\"AZURE_SEARCH_ENDPOINT\"]\n",
"contoso_search_key = os.environ[\"AZURE_SEARCH_KEY\"]\n",
"index_name = \"contoso-products\"\n",
"\n",
"search_index_client = SearchIndexClient(\n",
" contoso_search, AzureKeyCredential(contoso_search_key)\n",
" contoso_search, DefaultAzureCredential()\n",
")\n",
"\n",
"delete_index(search_index_client, index_name)\n",
Expand All @@ -214,17 +236,38 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 6,
"metadata": {},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"indexing documents\n"
]
},
{
"ename": "OpenAIError",
"evalue": "Missing credentials. Please pass one of `api_key`, `azure_ad_token`, `azure_ad_token_provider`, or the `AZURE_OPENAI_API_KEY` or `AZURE_OPENAI_AD_TOKEN` environment variables.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mOpenAIError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[6], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindexing documents\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m docs \u001b[38;5;241m=\u001b[39m \u001b[43mgen_contoso_products\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mproducts.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m# Upload our data to the index.\u001b[39;00m\n\u001b[0;32m 4\u001b[0m search_client \u001b[38;5;241m=\u001b[39m SearchClient(\n\u001b[0;32m 5\u001b[0m endpoint\u001b[38;5;241m=\u001b[39mcontoso_search,\n\u001b[0;32m 6\u001b[0m index_name\u001b[38;5;241m=\u001b[39mindex_name,\n\u001b[0;32m 7\u001b[0m credential\u001b[38;5;241m=\u001b[39mDefaultAzureCredential(),\n\u001b[0;32m 8\u001b[0m )\n",
"Cell \u001b[1;32mIn[4], line 8\u001b[0m, in \u001b[0;36mgen_contoso_products\u001b[1;34m(path)\u001b[0m\n\u001b[0;32m 5\u001b[0m openai_deployment \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext-embedding-ada-002\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;66;03m# openai.Embedding.create() -> client.embeddings.create()\u001b[39;00m\n\u001b[1;32m----> 8\u001b[0m client \u001b[38;5;241m=\u001b[39m \u001b[43mAzureOpenAI\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 9\u001b[0m \u001b[43m \u001b[49m\u001b[43mapi_version\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m2023-07-01-preview\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 10\u001b[0m \u001b[43m \u001b[49m\u001b[43mazure_endpoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mopenai_service_endoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[43mazure_deployment\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mopenai_deployment\u001b[49m\n\u001b[0;32m 12\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 14\u001b[0m products \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(path)\n\u001b[0;32m 15\u001b[0m items \u001b[38;5;241m=\u001b[39m []\n",
"File \u001b[1;32me:\\github\\azure-samples\\contoso-chat-1\\.venv\\Lib\\site-packages\\openai\\lib\\azure.py:169\u001b[0m, in \u001b[0;36mAzureOpenAI.__init__\u001b[1;34m(self, api_version, azure_endpoint, azure_deployment, api_key, azure_ad_token, azure_ad_token_provider, organization, project, base_url, timeout, max_retries, default_headers, default_query, http_client, _strict_response_validation)\u001b[0m\n\u001b[0;32m 166\u001b[0m azure_ad_token \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAZURE_OPENAI_AD_TOKEN\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 168\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m api_key \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m azure_ad_token \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m azure_ad_token_provider \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 169\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m OpenAIError(\n\u001b[0;32m 170\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMissing credentials. Please pass one of `api_key`, `azure_ad_token`, `azure_ad_token_provider`, or the `AZURE_OPENAI_API_KEY` or `AZURE_OPENAI_AD_TOKEN` environment variables.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 171\u001b[0m )\n\u001b[0;32m 173\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m api_version \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 174\u001b[0m api_version \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39menviron\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOPENAI_API_VERSION\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"\u001b[1;31mOpenAIError\u001b[0m: Missing credentials. Please pass one of `api_key`, `azure_ad_token`, `azure_ad_token_provider`, or the `AZURE_OPENAI_API_KEY` or `AZURE_OPENAI_AD_TOKEN` environment variables."
]
}
],
"source": [
"print(f\"indexing documents\")\n",
"docs = gen_contoso_products(\"products.csv\")\n",
"# Upload our data to the index.\n",
"search_client = SearchClient(\n",
" endpoint=contoso_search,\n",
" index_name=index_name,\n",
" credential=AzureKeyCredential(contoso_search_key),\n",
" credential=DefaultAzureCredential(),\n",
")\n",
"print(f\"uploading {len(docs)} documents to index {index_name}\")\n",
"ds = search_client.upload_documents(docs)"
Expand All @@ -247,7 +290,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.6"
"version": "3.12.2"
}
},
"nbformat": 4,
Expand Down
2 changes: 0 additions & 2 deletions docs/TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,12 +122,10 @@ AZURE_OPENAI_KEY="#########"
AZURE_SEARCH_NAME="srch-gcdxl#########"
AZURE_SEARCH_ENDPOINT="https://srch-gcdx#########.search.windows.net/"
AZURE_SEARCH_KEY="#########"
CONTOSO_SEARCH_ENDPOINT="https://srch-gcdx#########.search.windows.net/"
AZURE_COSMOS_NAME="cosmos-gcdx#########"
COSMOS_ENDPOINT="https://cosmos-gcdx#########.documents.azure.com:443/"
COSMOS_KEY="#########"
```
---
1 change: 0 additions & 1 deletion evaluations/evaluate-chat-flow-custom-no-sdk.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"# Initialize Azure OpenAI Connection\n",
"model_config = AzureOpenAIModelConfiguration(\n",
" azure_deployment=\"gpt-4\",\n",
" api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n",
" api_version=os.environ[\"AZURE_OPENAI_API_VERSION\"],\n",
" azure_endpoint=os.environ[\"AZURE_OPENAI_ENDPOINT\"]\n",
" )"
Expand Down
1 change: 0 additions & 1 deletion evaluations/evaluate-chat-flow-custom.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
"# Initialize Azure OpenAI Connection\n",
"model_config = AzureOpenAIModelConfiguration(\n",
" azure_deployment=\"gpt-4\",\n",
" api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n",
" api_version=os.environ[\"AZURE_OPENAI_API_VERSION\"],\n",
" azure_endpoint=os.environ[\"AZURE_OPENAI_ENDPOINT\"]\n",
" )"
Expand Down
1 change: 0 additions & 1 deletion evaluations/evaluate-chat-flow-sdk.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
"# Initialize Azure OpenAI Connection\n",
"model_config = AzureOpenAIModelConfiguration(\n",
" azure_deployment=\"gpt-4\",\n",
" api_key=os.environ[\"AZURE_OPENAI_API_KEY\"],\n",
" api_version=os.environ[\"AZURE_OPENAI_API_VERSION\"],\n",
" azure_endpoint=os.environ[\"AZURE_OPENAI_ENDPOINT\"]\n",
" )"
Expand Down
1 change: 0 additions & 1 deletion evaluations/evaluations_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
# Initialize Azure OpenAI Connection
model_config = AzureOpenAIModelConfiguration(
azure_deployment="gpt-4",
# api_key=os.environ["AZURE_OPENAI_API_KEY"],
api_version=os.environ["AZURE_OPENAI_API_VERSION"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"]
)
Expand Down
1 change: 1 addition & 0 deletions infra/core/ai/hub-dependencies.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ module search '../search/search-services.bicep' =
tags: tags
name: searchName
semanticSearch: 'free'
disableLocalAuth: true
}
}

Expand Down
2 changes: 1 addition & 1 deletion infra/core/search/search-services.bicep
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ resource search 'Microsoft.Search/searchServices@2021-04-01-preview' = {
// The free tier does not support managed identity
identity: searchIdentityProvider
properties: {
authOptions: authOptions
authOptions: disableLocalAuth ? null : authOptions
disableLocalAuth: disableLocalAuth
disabledDataExfiltrationOptions: disabledDataExfiltrationOptions
encryptionWithCmk: encryptionWithCmk
Expand Down
21 changes: 21 additions & 0 deletions infra/core/security/role-cosmos.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
metadata description = 'Creates a role assignment for a service principal.'
param principalId string
param databaseAccountId string
param databaseAccountName string

var roleDefinitionContributor = '00000000-0000-0000-0000-000000000002' // Cosmos DB Built-in Data Contributor

var roleDefinitionId = guid('sql-role-definition-', principalId, databaseAccountId)
var roleAssignmentId = guid(roleDefinitionId, principalId, databaseAccountId)
///subscriptions/070de2d1-125e-447f-8caf-511f7a99f764/resourceGroups/chatcontoso-rg/providers/Microsoft.DocumentDB/databaseAccounts/cosmos-contoso-qceliatc7cgpq/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002

resource sqlRoleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2023-04-15' = {
name: '${databaseAccountName}/${roleAssignmentId}'
//parent: databaseAccount
properties:{
principalId: principalId
//roleDefinitionId: '/${subscription().id}/resourceGroups/<databaseAccountResourceGroup>/providers/Microsoft.DocumentDB/databaseAccounts/<myCosmosAccount>/sqlRoleDefinitions/<roleDefinitionId>'
roleDefinitionId: '/${subscription().id}/resourceGroups/${resourceGroup().name}/providers/Microsoft.DocumentDB/databaseAccounts/${databaseAccountName}/sqlRoleDefinitions/${roleDefinitionContributor}'
scope: databaseAccountId
}
}
12 changes: 0 additions & 12 deletions infra/hooks/postprovision.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -26,23 +26,11 @@ if ([string]::IsNullOrEmpty($resourceGroupName) -or [string]::IsNullOrEmpty($ope
exit 1
}

# Retrieve the keys
$searchKey=$(az search admin-key show --service-name $searchService --resource-group $resourceGroupName --query primaryKey --output tsv)
$apiKey=$(az cognitiveservices account keys list --name $openAiService --resource-group $resourceGroupName --query key1 --output tsv)
$cosmosKey=$(az cosmosdb keys list --name $cosmosService --resource-group $resourceGroupName --query primaryMasterKey --output tsv)

# Set the environment variables using azd env set
# TODO: Remove these once we have MI integration
azd env set AZURE_SEARCH_KEY $searchKey
azd env set AZURE_OPENAI_KEY $apiKey
azd env set COSMOS_KEY $cosmosKey

# Set additional environment variables expected by app
# TODO: Standardize these and remove need for setting here
azd env set AZURE_OPENAI_API_VERSION 2023-03-15-preview
azd env set AZURE_OPENAI_CHAT_DEPLOYMENT gpt-35-turbo
azd env set AZURE_SEARCH_ENDPOINT $AZURE_SEARCH_ENDPOINT
azd env set AZURE_SEARCH_KEY $AZURE_SEARCH_KEY

# Output environment variables to .env file using azd env get-values
azd env get-values > .env
Expand Down
12 changes: 0 additions & 12 deletions infra/hooks/postprovision.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,11 @@ if [ -z "$resourceGroupName" ] || [ -z "$searchService" ] || [ -z "$openAiServic
exit 1
fi

# Retrieve the keys
searchKey=$(az search admin-key show --service-name $searchService --resource-group $resourceGroupName --query primaryKey --output tsv)
apiKey=$(az cognitiveservices account keys list --name $openAiService --resource-group $resourceGroupName --query key1 --output tsv)
cosmosKey=$(az cosmosdb keys list --name $cosmosService --resource-group $resourceGroupName --query primaryMasterKey --output tsv)

# Set the environment variables using azd env set
# TODO: Remove these once we have MI integration
azd env set AZURE_SEARCH_KEY $searchKey
azd env set AZURE_OPENAI_KEY $apiKey
azd env set COSMOS_KEY $cosmosKey

# Set additional environment variables expected by app
# TODO: Standardize these and remove need for setting here
azd env set AZURE_OPENAI_API_VERSION 2023-03-15-preview
azd env set AZURE_OPENAI_CHAT_DEPLOYMENT gpt-35-turbo
azd env set AZURE_SEARCH_ENDPOINT $AZURE_SEARCH_ENDPOINT
azd env set AZURE_SEARCH_KEY $AZURE_SEARCH_KEY

# Output environment variables to .env file using azd env get-values
azd env get-values >.env
Expand Down
Loading

0 comments on commit aaa704c

Please sign in to comment.