Model catalog and deployments
Export PDFBefore you can call a model in Foundry you must deploy it, and the choices you make — which model, which deployment type, how much capacity, which version policy — decide your latency, data residency, reliability, and bill. This lesson explains the catalog, every deployment type, how quotas really work, provisioned throughput, model versions, and the model router.
The model catalog
The searchable list of models available in Foundry, each with a model card describing capabilities, context window, supported regions and deployment types, pricing, license, and intended use.
| Category | Examples | Billed and supported by |
|---|---|---|
| Models sold directly by Azure | OpenAI GPT and o-series, GPT image and audio models, embeddings; Microsoft Phi and MAI; DeepSeek; Meta Llama; Mistral; xAI Grok; Black Forest Labs | Microsoft, under Azure terms and SLAs |
| Models from partners and community | Thousands of models from Hugging Face and vendors such as Cohere, NVIDIA, and others | The provider's terms; often deployed to managed compute you pay for by the hour |
| Anthropic Claude | Claude models deployed in Foundry | Through Foundry, with its own endpoint and SDK |
How to choose a model
- Start from the task. Classification and extraction rarely need the biggest model. Multi-step reasoning, coding, and agents benefit from stronger reasoning models.
- Check the hard constraints. Context window, modalities (text, image, audio), tool-calling support, structured output support, and region availability.
- Use the leaderboards in the catalog to compare quality, cost, and throughput side by side — then confirm on your data with an evaluation (lesson 9).
- Prefer the smallest model that passes your evaluation. It is cheaper, faster, and usually has more available quota.
Deployments: the thing you actually call
A named instance of a specific model version on your Foundry resource, with its own deployment type, capacity (quota), guardrail policy, and version-upgrade policy. Your code sends the deployment name in the model field — not the model's catalog name.
You can name a deployment anything. Many teams use the model name (gpt-5-mini) for simplicity, while others use purpose names (chat-default, summariser) so they can swap the underlying model without changing code.
Deployment types
The deployment type controls where inference runs and how you pay. This is one of the most important decisions in this course.
| Type | Where inference runs | Billing | Best for |
|---|---|---|---|
| Global Standard | Any Azure region worldwide, routed for capacity | Pay per token | The default: highest quota, newest models first |
| Data Zone Standard | Only within a data zone (US or EU) | Pay per token | Data residency requirements with good capacity |
| Standard (regional) | Only the resource's region | Pay per token | Strict single-region processing; lower quota |
| Global / Data Zone / Regional Provisioned | As named | Reserved PTUs, hourly or monthly/yearly reservation | Predictable high volume, latency-sensitive production |
| Global / Data Zone Batch | As named | About 50% cheaper per token; results within 24 hours | Large offline jobs: classification, enrichment, evaluations |
| Developer | Global | Per token, no SLA | Testing fine-tuned models cheaply |
For all types, data at rest (files, conversations, fine-tuning data) stays in your resource's geography. The type only controls where processing may happen. If your compliance team says “EU only”, use Data Zone (EU) or regional deployments in an EU region.
Quota: TPM and RPM
The rate-limit quota for a Standard-family deployment. You assign capacity in units of 1,000 TPM. The total of all your deployments of a model cannot exceed your subscription's quota for that model, region, and deployment type.
A second limit derived from TPM. For many chat models it is 6 RPM per 1,000 TPM, but the ratio varies by model — check the quota page.
Two details trip people up. First, the limiter estimates each request's cost before it runs, using prompt tokens plus max_output_tokens — so setting a huge maximum output wastes quota even if the reply is short. Second, limits are enforced over short windows (seconds), so bursts can hit 429 even when the per-minute average looks fine.
def capacity(tpm_units: int, rpm_per_1k_tpm: int = 6) -> dict:
"""Standard deployments: capacity is set in units of 1,000 tokens per minute."""
tpm = tpm_units * 1_000
return {"TPM": tpm, "RPM": tpm_units * rpm_per_1k_tpm}
def requests_that_fit(tpm: int, avg_in: int, max_out: int) -> int:
"""The limiter counts prompt tokens plus max output tokens per request."""
return tpm // (avg_in + max_out)
for units in (10, 50, 250):
cap = capacity(units)
fit = requests_that_fit(cap["TPM"], avg_in=1_500, max_out=500)
print(f"{units:>4} units -> {cap['TPM']:>7,} TPM, {cap['RPM']:>5,} RPM, "
f"~{fit:>4} req/min at 1.5k in + 500 max out")
Notice that a deployment with 60 RPM can only serve about 5 requests a minute of this size — tokens, not requests, are the binding limit. Size capacity from your real prompt sizes and set max_output_tokens realistically.
# deploy a model (check names/versions with: az cognitiveservices account list-models -n $RES -g $RG -o table)
az cognitiveservices account deployment create \
--name $RES \
--resource-group $RG \
--deployment-name gpt-5-mini \
--model-name gpt-5-mini \
--model-version "2025-08-07" \
--model-format OpenAI \
--sku-name GlobalStandard \
--sku-capacity 50 # 50 x 1,000 = 50,000 TPM
# see what you have and how much quota is used
az cognitiveservices account deployment list -n $RES -g $RG -o table
az cognitiveservices usage list --location $LOC -o table
Provisioned throughput (PTU)
A unit of reserved model processing capacity. You buy a number of PTUs for a deployment and get a predictable throughput and latency, billed by the hour (or at a discount with monthly or yearly reservations) regardless of how many tokens you use.
| Standard (pay per token) | Provisioned (PTU) | |
|---|---|---|
| Cost model | Variable: pay for what you use | Fixed: pay for capacity whether used or not |
| Latency | Can vary with platform load | Consistent and lower at high utilisation |
| When over capacity | 429 rate-limit errors | 429 once your PTUs are saturated (you can spill over to a Standard deployment) |
| Good for | Spiky, small, or unknown traffic | Steady, high, latency-sensitive traffic |
Use the capacity calculator in the portal to estimate how many PTUs your traffic needs. The cost lesson shows a break-even calculation between the two.
Model versions and upgrades
Models get new versions (for example, a dated snapshot) and old versions are eventually retired. Each deployment has a version-upgrade policy:
| Policy | Behaviour | Use when |
|---|---|---|
| Auto-update to default | Moves to the new default version automatically | Dev and test; you want the latest |
| Upgrade when expired | Stays on the pinned version until it retires, then upgrades | Most production apps |
| No auto-upgrade | Stops working when the version retires | Strict validation; you upgrade manually after re-evaluation |
Every model version has a retirement date listed on the model lifecycle page. Put these dates in your team calendar. Re-run your evaluation set on the new version before the retirement forces an upgrade.
Model router
A deployable model in Foundry that, for each request, picks one of several underlying models (from small to large, and across vendors) based on the prompt's complexity, aiming to keep quality while lowering cost. You call it like any deployment; the response tells you which model actually answered.
A router is useful for general chat traffic where many requests are simple. For tasks with strict output formats or evaluated prompts, pin a specific model so behaviour stays predictable.
Fine-tuning in one paragraph
Foundry supports supervised fine-tuning, preference fine-tuning (DPO), and reinforcement fine-tuning for selected models. You upload training data as JSONL in chat format, start a job, and deploy the resulting model (often with the cheap Developer type first). Fine-tune only after prompt engineering and RAG are exhausted — it is best for consistent style, format, or narrow domain behaviour, not for teaching new facts.
- Deploy
gpt-5-mini(or any available chat model) as Global Standard with 10K TPM. - Open the deployment in the portal and find its rate limits, version, upgrade policy, and guardrail.
- Change
requests_that_fitto your own prompt sizes and decide how much capacity you would request for 100 requests per minute.
- The catalog has models sold directly by Azure (Microsoft-supported) and partner/community models.
- You call a deployment name; a deployment fixes model, version, type, capacity, and guardrail.
- Global Standard is the default; Data Zone keeps processing in the US or EU; Batch halves cost for offline work; Provisioned reserves capacity.
- Quota is TPM (and derived RPM) per subscription, region, model, and type; requests are charged prompt +
max_output_tokensagainst it. - Pin versions in production, track retirement dates, and re-evaluate before upgrading.