All skills
microsoft avatar

/deploy-model

@54c2a28 official

Unified Azure OpenAI model deployment skill with intelligent intent-based routing. Handles quick preset deployments, fully customized deployments (version/SKU/capacity/RAI policy), and capacity discovery across regions and projects. USE FOR: deploy model, deploy gpt, create deployment, model deployment, deploy openai model, set up model, provision model, find capacity, check model availability, where can I deploy, best region for model, capacity analysis. DO NOT USE FOR: listing existing deployments (use foundry_models_deployments_list MCP tool), deleting deployments, agent creation (use agent/create), project creation (use project/create).

Use this Skill: https://skilld.dev/gh/microsoft/github-copilot-for-azure/deploy-model

This session only. Nothing lands on disk.

presetreferencesworkflow.md

≈1.4k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Preset Deployment Workflow — Step-by-Step

Condensed implementation reference for preset (optimal region) model deployment. See SKILL.md for overview.

Table of Contents: Phase 1: Verify Authentication · Phase 2: Get Current Project · Phase 3: Get Model Name · Phase 4: Check Current Region Capacity · Phase 5: Query Multi-Region Capacity · Phase 6: Select Region and Project · Phase 7: Deploy Model


Phase 1: Verify Authentication

az account show --query "{Subscription:name, User:user.name}" -o table

If not logged in: az login

Switch subscription:

az account list --query "[].[name,id,state]" -o table
az account set --subscription <subscription-id>

Phase 2: Get Current Project

Read PROJECT_RESOURCE_ID from env or prompt user. Format: /subscriptions/{sub-id}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}

Parse ARM ID components:

SUBSCRIPTION_ID=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/subscriptions/\([^/]*\).*|\1|p')
RESOURCE_GROUP=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/resourceGroups/\([^/]*\).*|\1|p')
ACCOUNT_NAME=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/accounts/\([^/]*\)/projects.*|\1|p')
PROJECT_NAME=$(echo "$PROJECT_RESOURCE_ID" | sed -n 's|.*/projects/\([^/?]*\).*|\1|p')

Verify project exists and get region:

az account set --subscription "$SUBSCRIPTION_ID"

PROJECT_REGION=$(az cognitiveservices account show \
  --name "$PROJECT_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --query location -o tsv)

Phase 3: Get Model Name

If model not provided as parameter, list available models:

az cognitiveservices account list-models \
  --name "$PROJECT_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --query "[].name" -o tsv | sort -u

Get versions for selected model:

az cognitiveservices account list-models \
  --name "$PROJECT_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --query "[?name=='$MODEL_NAME'].{Name:name, Version:version, Format:format}" \
  -o table

Phase 4: Check Current Region Capacity

CAPACITY_JSON=$(az rest --method GET \
  --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.CognitiveServices/locations/$PROJECT_REGION/modelCapacities?api-version=2024-10-01&modelFormat=OpenAI&modelName=$MODEL_NAME&modelVersion=$MODEL_VERSION")

CURRENT_CAPACITY=$(echo "$CAPACITY_JSON" | jq -r '.value[] | select(.properties.skuName=="GlobalStandard") | .properties.availableCapacity')

If CURRENT_CAPACITY > 0 → skip to Phase 7. Otherwise continue to Phase 5.


Phase 5: Query Multi-Region Capacity

ALL_REGIONS_JSON=$(az rest --method GET \
  --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.CognitiveServices/modelCapacities?api-version=2024-10-01&modelFormat=OpenAI&modelName=$MODEL_NAME&modelVersion=$MODEL_VERSION")

Extract available regions (capacity > 0):

AVAILABLE_REGIONS=$(echo "$ALL_REGIONS_JSON" | jq -r '.value[] | select(.properties.skuName=="GlobalStandard" and .properties.availableCapacity > 0) | "\(.location)|\(.properties.availableCapacity)"')

Extract unavailable regions:

UNAVAILABLE_REGIONS=$(echo "$ALL_REGIONS_JSON" | jq -r '.value[] | select(.properties.skuName=="GlobalStandard" and (.properties.availableCapacity == 0 or .properties.availableCapacity == null)) | "\(.location)|0"')

If no regions have capacity, defer to the quota skill for increase requests. Suggest checking existing deployments or trying alternative models like gpt-4o-mini.


Phase 6: Select Region and Project

Present available regions to user. Store selection as SELECTED_REGION.

Find projects in selected region:

PROJECTS_IN_REGION=$(az cognitiveservices account list \
  --query "[?kind=='AIProject' && location=='$SELECTED_REGION'].{Name:name, ResourceGroup:resourceGroup}" \
  --output json)

If no projects exist — create new:

az cognitiveservices account create \
  --name "$HUB_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --location "$SELECTED_REGION" \
  --kind "AIServices" \
  --sku "S0" --yes

az cognitiveservices account create \
  --name "$NEW_PROJECT_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --location "$SELECTED_REGION" \
  --kind "AIProject" \
  --sku "S0" --yes

Phase 7: Deploy Model

Generate unique deployment name using scripts/generate_deployment_name.sh:

DEPLOYMENT_NAME=$(bash scripts/generate_deployment_name.sh "$ACCOUNT_NAME" "$RESOURCE_GROUP" "$MODEL_NAME")

Calculate capacity — 50% of available, minimum 50 TPM:

SELECTED_CAPACITY=$(echo "$ALL_REGIONS_JSON" | jq -r ".value[] | select(.location==\"$SELECTED_REGION\" and .properties.skuName==\"GlobalStandard\") | .properties.availableCapacity")
DEPLOY_CAPACITY=$(( SELECTED_CAPACITY / 2 ))
[ "$DEPLOY_CAPACITY" -lt 50 ] && DEPLOY_CAPACITY=50

Create deployment:

az cognitiveservices account deployment create \
  --name "$ACCOUNT_NAME" \
  --resource-group "$RESOURCE_GROUP" \
  --deployment-name "$DEPLOYMENT_NAME" \
  --model-name "$MODEL_NAME" \
  --model-version "$MODEL_VERSION" \
  --model-format "OpenAI" \
  --sku-name "GlobalStandard" \
  --sku-capacity "$DEPLOY_CAPACITY"

Monitor with az cognitiveservices account deployment show ... --query "properties.provisioningState" until Succeeded or Failed.

Source: SKILL.md on GitHub

No alerts6mo3 checks · Risk SAFE
  • Gen Agent Trust Hub6mo

    This skill provides a unified workflow for deploying Azure OpenAI models using the Azure CLI. It includes intelligent routing, capacity discovery across regions, and support for both standard OpenAI models and Anthropic models on Azure while maintaining security best practices like mandatory project confirmation.

  • Socket6mo

    No alerts

  • Snyk6mo

    Risk: LOW · No issues

Signed by skilld at 54c2a28. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 17 hours ago.

Activeupdated 2 months ago
metadata
{
  "author": "Microsoft",
  "version": "1.0.0"
}
  • azure
  • openai
  • deployment
  • model
  • capacity
  • sku
  • foundry
  • azure-cli
  • provisioning

README badge

README badge for microsoft/github-copilot-for-azure/deploy-model

Deploys Azure OpenAI models with intent-based routing to preset deployment, customized configuration, or capacity discovery workflows. Routes user requests to the appropriate mode based on whether they want quick defaults, custom SKU/capacity/RAI settings, or to find available capacity across regions and projects.

Generated from the current SKILL.md.

Does this skill handle deployments in azd-managed Foundry projects?
No. For azd projects (those scaffolded from azd-ai-starter-basic or via azd ai agent init), declare deployments in azure.yaml instead — azd provision will create them through Bicep. Use this skill only for standalone Foundry projects or ad-hoc deployments outside the azd lifecycle.
What happens if I don't specify a project?
The skill checks the PROJECT_RESOURCE_ID environment variable first, then looks for clues in your prompt. If neither exists, it queries your projects and suggests the current one, with a confirmation step before deploying.
Can this skill list or delete existing deployments?
No. This skill creates deployments only. Use the foundry_models_deployments_list MCP tool to list existing deployments, or the Azure portal to delete them.
Does this skill validate quota and SKU support before deploying?
Yes. It queries the model catalog to confirm the model supports your chosen SKU, and checks your subscription's available quota via Azure CLI before presenting any deployment options.
What should I do if I hit a quota limit?
Defer to the quota skill (quota/quota.md) for quota increase requests, usage monitoring, and troubleshooting quota errors.

Generated from the current SKILL.md. These answers refresh after source changes.