Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Build and deploy AI applications on Azure AI Foundry using Microsoft's model catalog and AI services
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
models/deploy-model/preset/references/preset-workflow.md
1# Preset Deployment Workflow - Detailed Implementation23This file contains the full step-by-step bash/PowerShell scripts for preset (optimal region) model deployment. Referenced from the main [SKILL.md](../SKILL.md).45---67## Phase 1: Verify Authentication89Check if user is logged into Azure CLI:1011```bash12az account show --query "{Subscription:name, User:user.name}" -o table13```1415**If not logged in:**16```bash17az login18```1920**Verify subscription is correct:**21```bash22# List all subscriptions23az account list --query "[].[name,id,state]" -o table2425# Set active subscription if needed26az account set --subscription <subscription-id>27```2829---3031## Phase 2: Get Current Project3233**Check for PROJECT_RESOURCE_ID environment variable first:**3435```bash36if [ -n "$PROJECT_RESOURCE_ID" ]; then37echo "Using project resource ID from environment: $PROJECT_RESOURCE_ID"38else39echo "PROJECT_RESOURCE_ID not set. Please provide your Azure AI Foundry project resource ID."40echo ""41echo "You can find this in:"42echo " • Azure AI Foundry portal → Project → Overview → Resource ID"43echo " • Format: /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}"44echo ""45echo "Example: /subscriptions/abc123.../resourceGroups/rg-prod/providers/Microsoft.CognitiveServices/accounts/my-account/projects/my-project"46echo ""47read -p "Enter project resource ID: " PROJECT_RESOURCE_ID48fi49```5051**Parse the ARM resource ID to extract components:**5253```bash54# Extract components from ARM resource ID55# Format: /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}5657SUBSCRIPTION_ID=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/subscriptions/\([^/]*\).*|\1|p')58RESOURCE_GROUP=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/resourceGroups/\([^/]*\).*|\1|p')59ACCOUNT_NAME=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/accounts/\([^/]*\)/projects.*|\1|p')60PROJECT_NAME=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/projects/\([^/?]*\).*|\1|p')6162if [ -z "$SUBSCRIPTION_ID" ] || [ -z "$RESOURCE_GROUP" ] || [ -z "$ACCOUNT_NAME" ] || [ -z "$PROJECT_NAME" ]; then63echo "❌ Invalid project resource ID format"64echo "Expected format: /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}"65exit 166fi6768echo "Parsed project details:"69echo " Subscription: $SUBSCRIPTION_ID"70echo " Resource Group: $RESOURCE_GROUP"71echo " Account: $ACCOUNT_NAME"72echo " Project: $PROJECT_NAME"73```7475**Verify the project exists and get its region:**7677```bash78# Set active subscription79az account set --subscription "$SUBSCRIPTION_ID"8081# Get project details to verify it exists and extract region82PROJECT_REGION=$(az cognitiveservices account show \83--name "$PROJECT_NAME" \84--resource-group "$RESOURCE_GROUP" \85--query location -o tsv 2>/dev/null)8687if [ -z "$PROJECT_REGION" ]; then88echo "❌ Project '$PROJECT_NAME' not found in resource group '$RESOURCE_GROUP'"89echo ""90echo "Please verify the resource ID is correct."91echo ""92echo "List available projects:"93echo " az cognitiveservices account list --query \"[?kind=='AIProject'].{Name:name, Location:location, ResourceGroup:resourceGroup}\" -o table"94exit 195fi9697echo "✓ Project found"98echo " Region: $PROJECT_REGION"99```100101---102103## Phase 3: Get Model Name104105**If model name provided as skill parameter, skip this phase.**106107Ask user which model to deploy. **Fetch available models dynamically** from the account rather than using a hardcoded list:108109```bash110# List available models in the account111az cognitiveservices account list-models \112--name "$PROJECT_NAME" \113--resource-group "$RESOURCE_GROUP" \114--query "[].name" -o tsv | sort -u115```116117Present the results to the user and let them choose, or enter a custom model name.118119**Store model:**120```bash121MODEL_NAME="<selected-model>"122```123124**Get model version (latest stable):**125```bash126# List available models and versions in the account127az cognitiveservices account list-models \128--name "$PROJECT_NAME" \129--resource-group "$RESOURCE_GROUP" \130--query "[?name=='$MODEL_NAME'].{Name:name, Version:version, Format:format}" \131-o table132```133134**Use latest version or let user specify:**135```bash136MODEL_VERSION="<version-or-latest>"137```138139**Detect model format:**140141```bash142# Get model format from model catalog (e.g., OpenAI, Anthropic, Meta-Llama, Mistral, Cohere)143MODEL_FORMAT=$(az cognitiveservices account list-models \144--name "$ACCOUNT_NAME" \145--resource-group "$RESOURCE_GROUP" \146--query "[?name=='$MODEL_NAME'].format" -o tsv | head -1)147148# Default to OpenAI if not found149MODEL_FORMAT=${MODEL_FORMAT:-"OpenAI"}150151echo "Model format: $MODEL_FORMAT"152```153154> 💡 **Model format determines the deployment path:**155> - `OpenAI` — Standard CLI deployment, TPM-based capacity, RAI policies apply156> - `Anthropic` — REST API deployment with `modelProviderData`, capacity=1, no RAI157> - All other formats (`Meta-Llama`, `Mistral`, `Cohere`, etc.) — Standard CLI deployment, capacity=1 (MaaS), no RAI158159---160161## Phase 4: Check Current Region Capacity162163Before checking other regions, see if the current project's region has capacity:164165```bash166# Query capacity for current region167CAPACITY_JSON=$(az rest --method GET \168--url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.CognitiveServices/locations/$PROJECT_REGION/modelCapacities?api-version=2024-10-01&modelFormat=$MODEL_FORMAT&modelName=$MODEL_NAME&modelVersion=$MODEL_VERSION")169170# Extract available capacity for GlobalStandard SKU171CURRENT_CAPACITY=$(echo "$CAPACITY_JSON" | jq -r '.value[] | select(.properties.skuName=="GlobalStandard") | .properties.availableCapacity')172```173174**Check result:**175```bash176if [ -n "$CURRENT_CAPACITY" ] && [ "$CURRENT_CAPACITY" -gt 0 ]; then177echo "✓ Current region ($PROJECT_REGION) has capacity: $CURRENT_CAPACITY TPM"178echo "Proceeding with deployment..."179# Skip to Phase 7 (Deploy)180else181echo "⚠ Current region ($PROJECT_REGION) has no available capacity"182echo "Checking alternative regions..."183# Continue to Phase 5184fi185```186187---188189## Phase 5: Query Multi-Region Capacity (If Needed)190191Only execute this phase if current region has no capacity.192193**Query capacity across all regions:**194```bash195# Get capacity for all regions in subscription196ALL_REGIONS_JSON=$(az rest --method GET \197--url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.CognitiveServices/modelCapacities?api-version=2024-10-01&modelFormat=$MODEL_FORMAT&modelName=$MODEL_NAME&modelVersion=$MODEL_VERSION")198199# Save to file for processing200echo "$ALL_REGIONS_JSON" > /tmp/capacity_check.json201```202203**Parse and categorize regions:**204```bash205# Extract available regions (capacity > 0)206AVAILABLE_REGIONS=$(jq -r '.value[] | select(.properties.skuName=="GlobalStandard" and .properties.availableCapacity > 0) | "\(.location)|\(.properties.availableCapacity)"' /tmp/capacity_check.json)207208# Extract unavailable regions (capacity = 0 or undefined)209UNAVAILABLE_REGIONS=$(jq -r '.value[] | select(.properties.skuName=="GlobalStandard" and (.properties.availableCapacity == 0 or .properties.availableCapacity == null)) | "\(.location)|0"' /tmp/capacity_check.json)210```211212**Format and display regions:**213```bash214# Format capacity (e.g., 120000 -> 120K)215format_capacity() {216local capacity=$1217if [ "$capacity" -ge 1000000 ]; then218echo "$(awk "BEGIN {printf \"%.1f\", $capacity/1000000}")M TPM"219elif [ "$capacity" -ge 1000 ]; then220echo "$(awk "BEGIN {printf \"%.0f\", $capacity/1000}")K TPM"221else222echo "$capacity TPM"223fi224}225226echo ""227echo "⚠ No Capacity in Current Region"228echo ""229echo "The current project's region ($PROJECT_REGION) does not have available capacity for $MODEL_NAME."230echo ""231echo "Available Regions (with capacity):"232echo ""233234# Display available regions with formatted capacity235echo "$AVAILABLE_REGIONS" | while IFS='|' read -r region capacity; do236formatted_capacity=$(format_capacity "$capacity")237# Get region display name (capitalize and format)238region_display=$(echo "$region" | sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g; s/\([a-z]\)\([0-9]\)/\1 \2/g')239echo " • $region_display - $formatted_capacity"240done241242echo ""243echo "Unavailable Regions:"244echo ""245246# Display unavailable regions247echo "$UNAVAILABLE_REGIONS" | while IFS='|' read -r region capacity; do248region_display=$(echo "$region" | sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g; s/\([a-z]\)\([0-9]\)/\1 \2/g')249if [ "$capacity" = "0" ]; then250echo " ✗ $region_display (Insufficient quota - 0 TPM available)"251else252echo " ✗ $region_display (Model not supported)"253fi254done255```256257**Handle no capacity anywhere:**258```bash259if [ -z "$AVAILABLE_REGIONS" ]; then260echo ""261echo "❌ No Available Capacity in Any Region"262echo ""263echo "No regions have available capacity for $MODEL_NAME with GlobalStandard SKU."264echo ""265echo "Next Steps:"266echo "1. Request quota increase — use the quota skill (../../../quota/quota.md)"267echo ""268echo "2. Check existing deployments (may be using quota):"269echo " az cognitiveservices account deployment list \\"270echo " --name $PROJECT_NAME \\"271echo " --resource-group $RESOURCE_GROUP"272echo ""273echo "3. Consider alternative models with lower capacity requirements:"274echo " • gpt-4o-mini (cost-effective, lower capacity requirements)"275echo " List available models: az cognitiveservices account list-models --name \$PROJECT_NAME --resource-group \$RESOURCE_GROUP --output table"276exit 1277fi278```279280---281282## Phase 6: Select Region and Project283284**Ask user to select region from available options.**285286Example using AskUserQuestion:287- Present available regions as options288- Show capacity for each289- User selects preferred region290291**Store selection:**292```bash293SELECTED_REGION="<user-selected-region>" # e.g., "eastus2"294```295296**Find projects in selected region:**297```bash298PROJECTS_IN_REGION=$(az cognitiveservices account list \299--query "[?kind=='AIProject' && location=='$SELECTED_REGION'].{Name:name, ResourceGroup:resourceGroup}" \300--output json)301302PROJECT_COUNT=$(echo "$PROJECTS_IN_REGION" | jq '. | length')303304if [ "$PROJECT_COUNT" -eq 0 ]; then305echo "No projects found in $SELECTED_REGION"306echo "Would you like to create a new project? (yes/no)"307# If yes, continue to project creation308# If no, exit or select different region309else310echo "Projects in $SELECTED_REGION:"311echo "$PROJECTS_IN_REGION" | jq -r '.[] | " • \(.Name) (\(.ResourceGroup))"'312echo ""313echo "Select a project or create new project"314fi315```316317**Option A: Use existing project**318```bash319PROJECT_NAME="<selected-project-name>"320RESOURCE_GROUP="<resource-group>"321```322323**Option B: Create new project**324```bash325# Generate project name326USER_ALIAS=$(az account show --query user.name -o tsv | cut -d'@' -f1 | tr '.' '-')327RANDOM_SUFFIX=$(openssl rand -hex 2)328NEW_PROJECT_NAME="${USER_ALIAS}-aiproject-${RANDOM_SUFFIX}"329330# Prompt for resource group331echo "Resource group for new project:"332echo " 1. Use existing resource group: $RESOURCE_GROUP"333echo " 2. Create new resource group"334335# If existing resource group336NEW_RESOURCE_GROUP="$RESOURCE_GROUP"337338# Create AI Services account (hub)339HUB_NAME="${NEW_PROJECT_NAME}-hub"340341echo "Creating AI Services hub: $HUB_NAME in $SELECTED_REGION..."342343az cognitiveservices account create \344--name "$HUB_NAME" \345--resource-group "$NEW_RESOURCE_GROUP" \346--location "$SELECTED_REGION" \347--kind "AIServices" \348--sku "S0" \349--yes350351# Create AI Foundry project352echo "Creating AI Foundry project: $NEW_PROJECT_NAME..."353354az cognitiveservices account create \355--name "$NEW_PROJECT_NAME" \356--resource-group "$NEW_RESOURCE_GROUP" \357--location "$SELECTED_REGION" \358--kind "AIProject" \359--sku "S0" \360--yes361362echo "✓ Project created successfully"363PROJECT_NAME="$NEW_PROJECT_NAME"364RESOURCE_GROUP="$NEW_RESOURCE_GROUP"365```366367---368369## Phase 7: Deploy Model370371**Generate unique deployment name:**372373The deployment name should match the model name (e.g., "gpt-4o"), but if a deployment with that name already exists, append a numeric suffix (e.g., "gpt-4o-2", "gpt-4o-3"). This follows the same UX pattern as Azure AI Foundry portal.374375Use the `generate_deployment_name` script to check existing deployments and generate a unique name:376377*Bash version:*378```bash379DEPLOYMENT_NAME=$(bash scripts/generate_deployment_name.sh \380"$ACCOUNT_NAME" \381"$RESOURCE_GROUP" \382"$MODEL_NAME")383384echo "Generated deployment name: $DEPLOYMENT_NAME"385```386387*PowerShell version:*388```powershell389$DEPLOYMENT_NAME = & .\scripts\generate_deployment_name.ps1 `390-AccountName $ACCOUNT_NAME `391-ResourceGroup $RESOURCE_GROUP `392-ModelName $MODEL_NAME393394Write-Host "Generated deployment name: $DEPLOYMENT_NAME"395```396397**Calculate deployment capacity:**398399Follow UX capacity calculation logic. For OpenAI models, use 50% of available capacity (minimum 50 TPM). For all other models (MaaS), capacity is always 1:400401```bash402if [ "$MODEL_FORMAT" = "OpenAI" ]; then403# OpenAI models: TPM-based capacity (50% of available, minimum 50)404SELECTED_CAPACITY=$(echo "$ALL_REGIONS_JSON" | jq -r ".value[] | select(.location==\"$SELECTED_REGION\" and .properties.skuName==\"GlobalStandard\") | .properties.availableCapacity")405406if [ "$SELECTED_CAPACITY" -gt 50 ]; then407DEPLOY_CAPACITY=$((SELECTED_CAPACITY / 2))408if [ "$DEPLOY_CAPACITY" -lt 50 ]; then409DEPLOY_CAPACITY=50410fi411else412DEPLOY_CAPACITY=$SELECTED_CAPACITY413fi414415echo "Deploying with capacity: $DEPLOY_CAPACITY TPM (50% of available: $SELECTED_CAPACITY TPM)"416else417# Non-OpenAI models (MaaS): capacity is always 1418DEPLOY_CAPACITY=1419echo "MaaS model — deploying with capacity: 1 (pay-per-token billing)"420fi421```422423### If MODEL_FORMAT is NOT "Anthropic" — Standard CLI Deployment424425> 💡 **Note:** The Azure CLI supports all non-Anthropic model formats directly.426427*Bash version:*428```bash429echo "Creating deployment..."430431az cognitiveservices account deployment create \432--name "$ACCOUNT_NAME" \433--resource-group "$RESOURCE_GROUP" \434--deployment-name "$DEPLOYMENT_NAME" \435--model-name "$MODEL_NAME" \436--model-version "$MODEL_VERSION" \437--model-format "$MODEL_FORMAT" \438--sku-name "GlobalStandard" \439--sku-capacity "$DEPLOY_CAPACITY"440```441442*PowerShell version:*443```powershell444Write-Host "Creating deployment..."445446az cognitiveservices account deployment create `447--name $ACCOUNT_NAME `448--resource-group $RESOURCE_GROUP `449--deployment-name $DEPLOYMENT_NAME `450--model-name $MODEL_NAME `451--model-version $MODEL_VERSION `452--model-format $MODEL_FORMAT `453--sku-name "GlobalStandard" `454--sku-capacity $DEPLOY_CAPACITY455```456457> 💡 **Note:** For non-OpenAI MaaS models (Meta-Llama, Mistral, Cohere, etc.), `$DEPLOY_CAPACITY` is `1` (set in capacity calculation above).458459### If MODEL_FORMAT is "Anthropic" — REST API Deployment with modelProviderData460461The Azure CLI does not support `--model-provider-data`. You must use the ARM REST API directly.462463**Step 1: Prompt user to select industry**464465Present the following list and ask the user to choose one:466467```4681. None (API value: none)4692. Biotechnology (API value: biotechnology)4703. Consulting (API value: consulting)4714. Education (API value: education)4725. Finance (API value: finance)4736. Food & Beverage (API value: food_and_beverage)4747. Government (API value: government)4758. Healthcare (API value: healthcare)4769. Insurance (API value: insurance)47710. Law (API value: law)47811. Manufacturing (API value: manufacturing)47912. Media (API value: media)48013. Nonprofit (API value: nonprofit)48114. Technology (API value: technology)48215. Telecommunications (API value: telecommunications)48316. Sport & Recreation (API value: sport_and_recreation)48417. Real Estate (API value: real_estate)48518. Retail (API value: retail)48619. Other (API value: other)487```488489> ⚠️ **Do NOT pick a default industry or hardcode a value. Always ask the user.** This is required by Anthropic's terms of service. The industry list is static — there is no REST API that provides it.490491Store selection as `SELECTED_INDUSTRY` (use the API value, e.g., `technology`).492493**Step 2: Fetch tenant info (country code and organization name)**494495```bash496TENANT_INFO=$(az rest --method GET \497--url "https://management.azure.com/tenants?api-version=2024-11-01" \498--query "value[0].{countryCode:countryCode, displayName:displayName}" -o json)499500COUNTRY_CODE=$(echo "$TENANT_INFO" | jq -r '.countryCode')501ORG_NAME=$(echo "$TENANT_INFO" | jq -r '.displayName')502```503504*PowerShell version:*505```powershell506$tenantInfo = az rest --method GET `507--url "https://management.azure.com/tenants?api-version=2024-11-01" `508--query "value[0].{countryCode:countryCode, displayName:displayName}" -o json | ConvertFrom-Json509510$countryCode = $tenantInfo.countryCode511$orgName = $tenantInfo.displayName512```513514**Step 3: Deploy via ARM REST API**515516*Bash version:*517```bash518echo "Creating Anthropic model deployment via REST API..."519520az rest --method PUT \521--url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$ACCOUNT_NAME/deployments/$DEPLOYMENT_NAME?api-version=2024-10-01" \522--body "{523\"sku\": {524\"name\": \"GlobalStandard\",525\"capacity\": 1526},527\"properties\": {528\"model\": {529\"format\": \"Anthropic\",530\"name\": \"$MODEL_NAME\",531\"version\": \"$MODEL_VERSION\"532},533\"modelProviderData\": {534\"industry\": \"$SELECTED_INDUSTRY\",535\"countryCode\": \"$COUNTRY_CODE\",536\"organizationName\": \"$ORG_NAME\"537}538}539}"540```541542*PowerShell version:*543```powershell544Write-Host "Creating Anthropic model deployment via REST API..."545546$body = @{547sku = @{548name = "GlobalStandard"549capacity = 1550}551properties = @{552model = @{553format = "Anthropic"554name = $MODEL_NAME555version = $MODEL_VERSION556}557modelProviderData = @{558industry = $SELECTED_INDUSTRY559countryCode = $countryCode560organizationName = $orgName561}562}563} | ConvertTo-Json -Depth 5564565az rest --method PUT `566--url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$ACCOUNT_NAME/deployments/${DEPLOYMENT_NAME}?api-version=2024-10-01" `567--body $body568```569570> 💡 **Note:** Anthropic models use `capacity: 1` (MaaS billing model), not TPM-based capacity.571572**Monitor deployment progress:**573```bash574echo "Monitoring deployment status..."575576MAX_WAIT=300 # 5 minutes577ELAPSED=0578INTERVAL=10579580while [ $ELAPSED -lt $MAX_WAIT ]; do581STATUS=$(az cognitiveservices account deployment show \582--name "$ACCOUNT_NAME" \583--resource-group "$RESOURCE_GROUP" \584--deployment-name "$DEPLOYMENT_NAME" \585--query "properties.provisioningState" -o tsv 2>/dev/null)586587case "$STATUS" in588"Succeeded")589echo "✓ Deployment successful!"590break591;;592"Failed")593echo "❌ Deployment failed"594# Get error details595az cognitiveservices account deployment show \596--name "$ACCOUNT_NAME" \597--resource-group "$RESOURCE_GROUP" \598--deployment-name "$DEPLOYMENT_NAME" \599--query "properties"600exit 1601;;602"Creating"|"Accepted"|"Running")603echo "Status: $STATUS... (${ELAPSED}s elapsed)"604sleep $INTERVAL605ELAPSED=$((ELAPSED + INTERVAL))606;;607*)608echo "Unknown status: $STATUS"609sleep $INTERVAL610ELAPSED=$((ELAPSED + INTERVAL))611;;612esac613done614615if [ $ELAPSED -ge $MAX_WAIT ]; then616echo "⚠ Deployment timeout after ${MAX_WAIT}s"617echo "Check status manually:"618echo " az cognitiveservices account deployment show \\"619echo " --name $ACCOUNT_NAME \\"620echo " --resource-group $RESOURCE_GROUP \\"621echo " --deployment-name $DEPLOYMENT_NAME"622exit 1623fi624```625626---627628## Phase 8: Display Deployment Details629630**Show deployment information:**631```bash632echo ""633echo "═══════════════════════════════════════════"634echo "✓ Deployment Successful!"635echo "═══════════════════════════════════════════"636echo ""637638# Get endpoint information639ENDPOINT=$(az cognitiveservices account show \640--name "$ACCOUNT_NAME" \641--resource-group "$RESOURCE_GROUP" \642--query "properties.endpoint" -o tsv)643644# Get deployment details645DEPLOYMENT_INFO=$(az cognitiveservices account deployment show \646--name "$ACCOUNT_NAME" \647--resource-group "$RESOURCE_GROUP" \648--deployment-name "$DEPLOYMENT_NAME" \649--query "properties.model")650651echo "Deployment Name: $DEPLOYMENT_NAME"652echo "Model: $MODEL_NAME"653echo "Version: $MODEL_VERSION"654echo "Region: $SELECTED_REGION"655echo "SKU: GlobalStandard"656echo "Capacity: $(format_capacity $DEPLOY_CAPACITY)"657echo "Endpoint: $ENDPOINT"658echo ""659660# Generate direct link to deployment in Azure AI Foundry portal661DEPLOYMENT_URL=$(bash "$(dirname "$0")/scripts/generate_deployment_url.sh" \662--subscription "$SUBSCRIPTION_ID" \663--resource-group "$RESOURCE_GROUP" \664--foundry-resource "$ACCOUNT_NAME" \665--project "$PROJECT_NAME" \666--deployment "$DEPLOYMENT_NAME")667668echo "🔗 View in Azure AI Foundry Portal:"669echo ""670echo "$DEPLOYMENT_URL"671echo ""672echo "═══════════════════════════════════════════"673echo ""674675echo "Test your deployment:"676echo ""677echo "# View deployment details"678echo "az cognitiveservices account deployment show \\"679echo " --name $ACCOUNT_NAME \\"680echo " --resource-group $RESOURCE_GROUP \\"681echo " --deployment-name $DEPLOYMENT_NAME"682echo ""683echo "# List all deployments"684echo "az cognitiveservices account deployment list \\"685echo " --name $ACCOUNT_NAME \\"686echo " --resource-group $RESOURCE_GROUP \\"687echo " --output table"688echo ""689690echo "Next steps:"691echo "• Click the link above to test in Azure AI Foundry playground"692echo "• Integrate into your application"693echo "• Set up monitoring and alerts"694```695