scripts/rai/raipolicies.ps1 (75 lines of code) (raw):

param ( [string]$Tenant, [string]$Subscription, [string]$ResourceGroup, [string]$AoaiResourceName, [string]$AoaiModelName, [string]$RaiPolicyName, [string]$RaiBlocklistName ) Write-Host "RAI Script: Setting up AOAI content filters & blocklist" $token = az account get-access-token --tenant "$Tenant" --query accessToken --output tsv if ([string]::IsNullOrWhiteSpace($token)) { Write-Host "Failed to get access token. Please manually sign-in to Azure account" az login --use-device-code $token = az account get-access-token --tenant "$Tenant" --query accessToken --output tsv } $headers = @{ Authorization = "Bearer $token" "Content-Type" = "application/json" } $baseURI = "https://management.azure.com/subscriptions/$Subscription/resourceGroups/$ResourceGroup/providers/Microsoft.CognitiveServices/accounts/$AoaiResourceName" # Creating a blocklist for AOAI account $filePath = Join-Path -Path $PSScriptRoot -ChildPath 'raiblocklist.json' $blocklistJson = (Get-Content -Path $filePath -Raw).Replace("{{BlocklistName}}", $RaiBlocklistName) | ConvertFrom-Json $blocklistName = $blocklistJson.blocklistname $blocklistItems = $blocklistJson.blocklistItems $blocklistBody = [PSCustomObject]@{ properties = [PSCustomObject]@{ description = "$($blocklistName) blocklist policy" } } $blocklistURI = $baseURI + "/raiBlocklists/$($blocklistName)?api-version=2023-10-01-preview" Invoke-RestMethod -Uri $blocklistURI -Method Put -Body ($blocklistBody | ConvertTo-Json) -Headers $headers | Out-Null $blocklistItemsURI = $baseURI + "/raiBlocklists/$($blocklistName)/raiBlocklistItems/$($blocklistName)Items?api-version=2023-10-01-preview" # Remove previous items from blocklist # - This covers scenario where blocklist items get updated in existing deployment do { Try { Invoke-RestMethod -Uri $blocklistItemsURI -Method Delete -Headers $headers | Out-Null } Catch { break } } while ($true) # Add items into blocklist foreach ($item in $blocklistItems) { if ($item.pattern) { $blocklistItemsBody = [PSCustomObject]@{ properties = [PSCustomObject]@{ pattern = $item.pattern isRegex = $item.isRegex } } Invoke-RestMethod -Uri $blocklistItemsURI -Method Put -Body ($blocklistItemsBody | ConvertTo-Json) -Headers $headers | Out-Null } } # Creating a content filter policy for AOAI account $filePath = Join-Path -Path $PSScriptRoot -ChildPath 'raipolicies.json' $policyBody = (Get-Content -Path $filePath -Raw).Replace("{{PolicyName}}", $RaiPolicyName).Replace("{{BlocklistName}}", $blocklistName) $policyURI = $baseURI + "/raiPolicies/$($RaiPolicyName)?api-version=2023-10-01-preview" Invoke-RestMethod -Uri $policyURI -Method Put -Body $policyBody -Headers $headers | Out-Null # Getting deployed AOAI model profile $modelURI = $baseURI + "/deployments/$($AoaiModelName)?api-version=2023-10-01-preview" $modelDeployments = Invoke-RestMethod -Uri $modelURI -Method Get -Headers $headers $model = $modelDeployments | Where-Object name -eq $AoaiModelName | Select-Object -First 1 # Assign created policy to model profile $updatedModel = [PSCustomObject]@{ displayName = $ModelName sku = $model.sku properties = [PSCustomObject]@{ model = $model.properties.model versionUpgradeOption = $model.properties.versionUpgradeOption raiPolicyName = $RaiPolicyName } } Invoke-RestMethod -Uri $modelURI -Method Put -Body ($updatedModel | ConvertTo-Json) -Headers $headers | Out-Null