,

Azure OpenAI in Foundry Models, and How to Choose One (Azure Gen AI Series, Part 3)

Azure OpenAI in Foundry Models is the set of OpenAI models you deploy inside a Foundry resource. Here is which models you get in 2026, how to pick one, and how the call goes out with the v1 API.

Input context window by modelThousands of tokens the model accepts in one request02505007501000128gpt-4o200o4-mini1048gpt-4.11050gpt-5.4-progpt-4.1 shown in solid red: the long-context default most teams should start on.
Context windows in thousands of tokens. GPT-4.1 and the GPT-5 top tier clear a million; GPT-4o and the o-series sit far below.

Which model should you actually pick?

Here is my rule, and I will defend it. Start on gpt-4.1. It handles the large majority of chat, extraction, summarization, and agent work, takes a million tokens of context, and costs a fraction of the frontier tier. Prove it fails before you upgrade. Most teams never need to.

When do you move up? Three cases. First, hard multi-step reasoning where the answer depends on the model working through steps it does not show you: math, planning, tricky debugging. That is o-series or GPT-5 territory. Second, cost pressure at high volume, where gpt-4.1-mini or gpt-4.1-nano shave the bill on simple classification and routing. Third, media, where you need Sora for video or an image model. Everything else, gpt-4.1 first.

When should you not jump to a reasoning model? When latency matters and the task is not actually multi-step. Reasoning models think before they answer, which adds seconds and bills you for tokens you never see. I have watched a team put o3 behind a live chat widget and wonder why every reply took nine seconds. The task was FAQ lookup. It should have been gpt-4.1-mini.

Gotcha: a bigger or newer model is not a free upgrade. Reasoning models reject temperature and top_p, use max_completion_tokens instead of max_tokens, and bill hidden reasoning tokens as output. Swap a chat model for a reasoning model without changing those parameters and you get a 400, or a bill that surprises you. Validate cost and latency on your own traffic before you switch a production route.

Your first call with the v1 API

Microsoft opened the v1 Azure OpenAI API in August 2025, and it is the path I use now. Two things changed that matter. You use the plain OpenAI() client instead of the Azure-specific AzureOpenAI() client, and you stop passing a dated api-version on every call. You point base_url at your resource with /openai/v1/ on the end, and for new work you call the Responses API, which Microsoft recommends over Chat Completions.

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# Entra ID auth, no static key. Role needed: Cognitive Services OpenAI User.
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), 'https://ai.azure.com/.default'
)

client = OpenAI(
    base_url='https://my-foundry-resource.openai.azure.com/openai/v1/',
    api_key=token_provider,
)

resp = client.responses.create(
    model='gpt-4.1',   # this is your DEPLOYMENT name, not the catalog name
    input='Give me one sentence on why deployment names matter.',
)

print(resp.output_text)

Expected output: one sentence, for example: Deployment names matter because your code calls the deployment, not the underlying model, so a mismatch returns a 404 rather than a fallback.

Failure modes: if your deployment is named gpt41-prod but you pass model='gpt-4.1', you get the 404 DeploymentNotFound from the top of this post. Point the same code at an o-series deployment and add temperature=0.2 and you get a 400, because reasoning models reject that parameter.

Disclaimer: creating or changing a model deployment is a production change. It affects live quota and billing on the resource. Do it in a non-production Foundry project first, confirm the deployment name and version, then promote. Nothing in this part should run against a resource serving real traffic without that check.

Deployment types set the price, not the model

Same model, four ways to buy it. The deployment type you pick when you create the deployment decides how you are billed and how the request is routed. Part 6 goes deep on this; here is what you need to make a first choice.

TypeWhat it isBilling basisReach for it when
Global Standardpay per token, routed to any region with capacityper 1M tokensdev and most variable traffic
Data Zoneper token, kept inside a US or EU data zoneper 1M tokens, small premiumresidency inside a zone
Provisioned managedreserved throughput in PTUsper PTU per hour or monthsteady high volume, latency floor
Global Batchasync, 24 hour windowper token, about half priceoffline jobs, evals, bulk

One trap specific to provisioned throughput: on GPT-4.1 a provisioned deployment caps context under 128,000 tokens, and a longer request returns HTTP 400. If you need the full million-token window on a provisioned deployment, turn on spillover, which routes the oversized requests to a matching standard deployment. That is the kind of detail that only bites you in production.

What a request costs

Token pricing is where a model choice turns into a monthly number. On Global Standard, gpt-4.1 runs about 2.00 US dollars per million input tokens and 8.00 per million output tokens as I write this. Prices move and vary by region, so treat these as the shape, not a quote, and check the pricing page before you budget.

Worked example

A support assistant sends 30 million input tokens and 6 million output tokens a month on gpt-4.1, Global Standard. Input: 30 times 2.00 equals 60 dollars. Output: 6 times 8.00 equals 48 dollars. Total about 108 dollars a month.

A provisioned deployment for the same model starts near 2,448 dollars a month. At 108 dollars of usage, standard wins by a wide margin. The two only cross once monthly volume climbs into the hundreds of millions of output tokens. Do not buy PTUs for a workload this size.

Standard versus provisioned, monthly costgpt-4.1, input held at five times output. Where the lines cross is where PTUs start to pay off0120024003600US dollars per month50100150200Output tokens per month, millionsProvisioned floor, about 2,448 per monthGlobal Standard108 dollars at 6M outputcross near 136M output
The worked example sits at the black dot, far under the provisioned floor. Standard billing stays cheaper until output volume reaches roughly 136 million tokens a month.

Responses API or Chat Completions?

You will see both APIs in Azure samples, and the split confuses people. Chat Completions is the older interface: you send a list of messages and get one reply. It still works, and every model here supports it. The Responses API is the newer one Microsoft steers new projects toward. It keeps the same message style but folds stateful multi-turn handling, background tasks, hosted tools, and remote MCP servers into one call.

My rule is short. New code starts on Responses. It is where new features land first, and the built-in state and tool calling save you from stitching that together by hand. Keep Chat Completions when you are calling a partner model that only speaks that syntax, when you are porting OpenAI code that already uses it and there is no reason to churn, or when a library you depend on has not moved yet. Do not rewrite a working Chat Completions service just to be current. Rewrite it when you need a Responses feature.

One practical difference to plan for: content filter results come back in a different shape. Chat Completions returns prompt_filter_results and content_filter_results fields, while the Responses API puts a top-level content_filters array on the response object. If you have logging or safety tooling reading those fields, it needs a change when you switch. Small edit, but the kind that slips through until a filtered response quietly breaks a downstream job.

My take

On a greenfield Azure project in 2026 I have not reached for Chat Completions once. The only times I keep it are legacy ports and the odd partner model. If you are choosing today, choose Responses and move on.

Model retirements will bite you

Every model in the catalog has a lifecycle, and older snapshots carry retirement dates. When a version retires, deployments that pin it stop serving, and if you let Azure auto-upgrade you, your model can change under you between one week and the next. Both failure modes are real. I have been paged for each.

My practice: pin an explicit model version on every production deployment, subscribe to the retirement notices, and keep a newer version deployed in a staging project so the migration is a config flip, not a scramble. Preview models, the ones tagged Preview in the catalog, get upgraded on Microsoft schedule and should never sit behind production traffic. Check the retirements page each quarter and diff it against what you have deployed.

For contrast across clouds, the same model-choice problem on AWS is covered in the Bedrock model catalog part of the AWS series. The vendors differ in naming and lifecycle policy, but the discipline of pinning versions is identical.

Default to gpt-4.1, upgrade only on evidence

If you take one deployment away from this part, make it a gpt-4.1 deployment on Global Standard, called through the v1 API with the Responses call. It covers most of what a team needs, its million-token window removes a whole class of chunking work, and at real volumes it stays far cheaper than provisioned throughput. Move to a reasoning model when a task proves it needs steps, drop to mini or nano when volume proves you can, and pin your versions either way.

Deploy that model in a scratch project this week and run the code above against it. Next up, Part 4 opens the other half of the catalog, the partner and open models sold through Models-as-a-Service, and when it is worth reaching past the OpenAI family at all.

Azure Gen AI Series · Part 3 of 30
« Previous: Part 2  |  Guide  |  Next: Part 4 »

References

How a call reaches a modelOpenAI client, v1 endpoint, your deployment, the catalog modelYour appOpenAI() clientv1 endpoint/openai/v1/Entra ID or keyDeploymentname you chosee.g. gpt-4.1Catalog modelsold by AzureYou call the deployment name. The deployment points at one catalog model and version.
A request never names a catalog model directly. It names your deployment, which resolves to a model and a pinned version.

Key takeaways

Deploy gpt-4.1 as your default and only move off it when a task proves it needs more. Reach for an o-series or GPT-5 reasoning model when the work is genuinely multi-step, not because it is newer. Use the v1 API with the plain OpenAI() client and the Responses API; the dated api-version era is over. Deployment type, not model choice, is what moves your bill the most.

The model families you can deploy

The catalog moves fast. As I write this in 2026, the OpenAI half of Foundry Models spans several families, and you rarely need most of them. Here is the shape of it, with the numbers that actually drive a choice: context window (how much you can send in) and max output (how much comes back in one call).

FamilyExample IDsContext (input)Max outputWhere it fits
GPT-5 seriesgpt-5.5, gpt-5.4, gpt-5.4-proup to ~1.05Mup to 128Kfrontier reasoning, hard coding
GPT-4.1 seriesgpt-4.1, gpt-4.1-mini, gpt-4.1-nano1,047,57632,768default workhorse, long context, agents
GPT-4ogpt-4o, gpt-4o-mini128,00016,384multimodal chat, low cost
o-serieso3, o4-mini, o3-pro, codex-mini200,000100,000step by step reasoning, tool use
Mediasora-2, gpt-image-1, audio modelsn/an/avideo, image, speech

Numbers from the Foundry Models catalog. GPT-5 max output and the exact GPT-5 member list shift as new versions land, so treat the top row as a range and confirm on the catalog page before you commit.

The context window is the number worth staring at. GPT-4.1 accepts just over a million tokens, roughly eight times what GPT-4o takes. That is the difference between feeding a model a whole codebase or a long contract, versus chunking it. The reasoning o-series sits in the middle at 200,000, which is plenty for most agent loops.

Input context window by modelThousands of tokens the model accepts in one request02505007501000128gpt-4o200o4-mini1048gpt-4.11050gpt-5.4-progpt-4.1 shown in solid red: the long-context default most teams should start on.
Context windows in thousands of tokens. GPT-4.1 and the GPT-5 top tier clear a million; GPT-4o and the o-series sit far below.

Which model should you actually pick?

Here is my rule, and I will defend it. Start on gpt-4.1. It handles the large majority of chat, extraction, summarization, and agent work, takes a million tokens of context, and costs a fraction of the frontier tier. Prove it fails before you upgrade. Most teams never need to.

When do you move up? Three cases. First, hard multi-step reasoning where the answer depends on the model working through steps it does not show you: math, planning, tricky debugging. That is o-series or GPT-5 territory. Second, cost pressure at high volume, where gpt-4.1-mini or gpt-4.1-nano shave the bill on simple classification and routing. Third, media, where you need Sora for video or an image model. Everything else, gpt-4.1 first.

When should you not jump to a reasoning model? When latency matters and the task is not actually multi-step. Reasoning models think before they answer, which adds seconds and bills you for tokens you never see. I have watched a team put o3 behind a live chat widget and wonder why every reply took nine seconds. The task was FAQ lookup. It should have been gpt-4.1-mini.

Gotcha: a bigger or newer model is not a free upgrade. Reasoning models reject temperature and top_p, use max_completion_tokens instead of max_tokens, and bill hidden reasoning tokens as output. Swap a chat model for a reasoning model without changing those parameters and you get a 400, or a bill that surprises you. Validate cost and latency on your own traffic before you switch a production route.

Your first call with the v1 API

Microsoft opened the v1 Azure OpenAI API in August 2025, and it is the path I use now. Two things changed that matter. You use the plain OpenAI() client instead of the Azure-specific AzureOpenAI() client, and you stop passing a dated api-version on every call. You point base_url at your resource with /openai/v1/ on the end, and for new work you call the Responses API, which Microsoft recommends over Chat Completions.

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# Entra ID auth, no static key. Role needed: Cognitive Services OpenAI User.
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), 'https://ai.azure.com/.default'
)

client = OpenAI(
    base_url='https://my-foundry-resource.openai.azure.com/openai/v1/',
    api_key=token_provider,
)

resp = client.responses.create(
    model='gpt-4.1',   # this is your DEPLOYMENT name, not the catalog name
    input='Give me one sentence on why deployment names matter.',
)

print(resp.output_text)

Expected output: one sentence, for example: Deployment names matter because your code calls the deployment, not the underlying model, so a mismatch returns a 404 rather than a fallback.

Failure modes: if your deployment is named gpt41-prod but you pass model='gpt-4.1', you get the 404 DeploymentNotFound from the top of this post. Point the same code at an o-series deployment and add temperature=0.2 and you get a 400, because reasoning models reject that parameter.

Disclaimer: creating or changing a model deployment is a production change. It affects live quota and billing on the resource. Do it in a non-production Foundry project first, confirm the deployment name and version, then promote. Nothing in this part should run against a resource serving real traffic without that check.

Deployment types set the price, not the model

Same model, four ways to buy it. The deployment type you pick when you create the deployment decides how you are billed and how the request is routed. Part 6 goes deep on this; here is what you need to make a first choice.

TypeWhat it isBilling basisReach for it when
Global Standardpay per token, routed to any region with capacityper 1M tokensdev and most variable traffic
Data Zoneper token, kept inside a US or EU data zoneper 1M tokens, small premiumresidency inside a zone
Provisioned managedreserved throughput in PTUsper PTU per hour or monthsteady high volume, latency floor
Global Batchasync, 24 hour windowper token, about half priceoffline jobs, evals, bulk

One trap specific to provisioned throughput: on GPT-4.1 a provisioned deployment caps context under 128,000 tokens, and a longer request returns HTTP 400. If you need the full million-token window on a provisioned deployment, turn on spillover, which routes the oversized requests to a matching standard deployment. That is the kind of detail that only bites you in production.

What a request costs

Token pricing is where a model choice turns into a monthly number. On Global Standard, gpt-4.1 runs about 2.00 US dollars per million input tokens and 8.00 per million output tokens as I write this. Prices move and vary by region, so treat these as the shape, not a quote, and check the pricing page before you budget.

Worked example

A support assistant sends 30 million input tokens and 6 million output tokens a month on gpt-4.1, Global Standard. Input: 30 times 2.00 equals 60 dollars. Output: 6 times 8.00 equals 48 dollars. Total about 108 dollars a month.

A provisioned deployment for the same model starts near 2,448 dollars a month. At 108 dollars of usage, standard wins by a wide margin. The two only cross once monthly volume climbs into the hundreds of millions of output tokens. Do not buy PTUs for a workload this size.

Standard versus provisioned, monthly costgpt-4.1, input held at five times output. Where the lines cross is where PTUs start to pay off0120024003600US dollars per month50100150200Output tokens per month, millionsProvisioned floor, about 2,448 per monthGlobal Standard108 dollars at 6M outputcross near 136M output
The worked example sits at the black dot, far under the provisioned floor. Standard billing stays cheaper until output volume reaches roughly 136 million tokens a month.

Responses API or Chat Completions?

You will see both APIs in Azure samples, and the split confuses people. Chat Completions is the older interface: you send a list of messages and get one reply. It still works, and every model here supports it. The Responses API is the newer one Microsoft steers new projects toward. It keeps the same message style but folds stateful multi-turn handling, background tasks, hosted tools, and remote MCP servers into one call.

My rule is short. New code starts on Responses. It is where new features land first, and the built-in state and tool calling save you from stitching that together by hand. Keep Chat Completions when you are calling a partner model that only speaks that syntax, when you are porting OpenAI code that already uses it and there is no reason to churn, or when a library you depend on has not moved yet. Do not rewrite a working Chat Completions service just to be current. Rewrite it when you need a Responses feature.

One practical difference to plan for: content filter results come back in a different shape. Chat Completions returns prompt_filter_results and content_filter_results fields, while the Responses API puts a top-level content_filters array on the response object. If you have logging or safety tooling reading those fields, it needs a change when you switch. Small edit, but the kind that slips through until a filtered response quietly breaks a downstream job.

My take

On a greenfield Azure project in 2026 I have not reached for Chat Completions once. The only times I keep it are legacy ports and the odd partner model. If you are choosing today, choose Responses and move on.

Model retirements will bite you

Every model in the catalog has a lifecycle, and older snapshots carry retirement dates. When a version retires, deployments that pin it stop serving, and if you let Azure auto-upgrade you, your model can change under you between one week and the next. Both failure modes are real. I have been paged for each.

My practice: pin an explicit model version on every production deployment, subscribe to the retirement notices, and keep a newer version deployed in a staging project so the migration is a config flip, not a scramble. Preview models, the ones tagged Preview in the catalog, get upgraded on Microsoft schedule and should never sit behind production traffic. Check the retirements page each quarter and diff it against what you have deployed.

For contrast across clouds, the same model-choice problem on AWS is covered in the Bedrock model catalog part of the AWS series. The vendors differ in naming and lifecycle policy, but the discipline of pinning versions is identical.

Default to gpt-4.1, upgrade only on evidence

If you take one deployment away from this part, make it a gpt-4.1 deployment on Global Standard, called through the v1 API with the Responses call. It covers most of what a team needs, its million-token window removes a whole class of chunking work, and at real volumes it stays far cheaper than provisioned throughput. Move to a reasoning model when a task proves it needs steps, drop to mini or nano when volume proves you can, and pin your versions either way.

Deploy that model in a scratch project this week and run the code above against it. Next up, Part 4 opens the other half of the catalog, the partner and open models sold through Models-as-a-Service, and when it is worth reaching past the OpenAI family at all.

Azure Gen AI Series · Part 3 of 30
« Previous: Part 2  |  Guide  |  Next: Part 4 »

References

Azure Gen AI Series · Part 3 of 30

The first thing I check on any Azure OpenAI project I inherit is the client constructor. If it still reads AzureOpenAI(api_version='2024-something'), the team is at least one release behind the API Microsoft now recommends, and half the time they are passing a model name that no longer deploys. Azure OpenAI in Foundry Models is the set of OpenAI models you deploy and call inside a Foundry resource. That is the whole topic of this part: which models you actually get in 2026, how to pick one without guessing, and how the request leaves your code.

Point a fresh client at a resource that has no deployment yet and you meet the error that opens every Azure OpenAI project:

openai.NotFoundError: Error code: 404
{'error': {'code': 'DeploymentNotFound',
 'message': 'The API deployment for this resource does not exist.'}}
Who this is for: You have read Part 1 on the stack and Part 2 on the Foundry platform, so you have a Foundry resource and a project. You can read Python. You have not yet decided which model to deploy or how to call it. No fine-tuning or agents knowledge assumed; those come later in the series.

What Azure OpenAI in Foundry Models means

Foundry Models is the catalog that sits inside a Foundry resource. It has two halves. Models sold directly by Azure are billed and supported by Microsoft on Azure infrastructure, and that half is where the OpenAI models live: the GPT-5 series, GPT-4.1, GPT-4o, the o-series reasoning models, plus media models for image, audio, and video. The other half is a marketplace of partner and open models, which Part 4 covers. When people say Azure OpenAI, they mean the OpenAI models in that first half.

A term that trips people up: a model is the catalog entry (say gpt-4.1), and a deployment is the named instance you create from it inside your resource. You call the deployment name, not the catalog name. They can match, and I usually make them match, but nothing forces that. The 404 above happens because the code calls a deployment that was never created.

How a call reaches a modelOpenAI client, v1 endpoint, your deployment, the catalog modelYour appOpenAI() clientv1 endpoint/openai/v1/Entra ID or keyDeploymentname you chosee.g. gpt-4.1Catalog modelsold by AzureYou call the deployment name. The deployment points at one catalog model and version.
A request never names a catalog model directly. It names your deployment, which resolves to a model and a pinned version.

Key takeaways

Deploy gpt-4.1 as your default and only move off it when a task proves it needs more. Reach for an o-series or GPT-5 reasoning model when the work is genuinely multi-step, not because it is newer. Use the v1 API with the plain OpenAI() client and the Responses API; the dated api-version era is over. Deployment type, not model choice, is what moves your bill the most.

The model families you can deploy

The catalog moves fast. As I write this in 2026, the OpenAI half of Foundry Models spans several families, and you rarely need most of them. Here is the shape of it, with the numbers that actually drive a choice: context window (how much you can send in) and max output (how much comes back in one call).

FamilyExample IDsContext (input)Max outputWhere it fits
GPT-5 seriesgpt-5.5, gpt-5.4, gpt-5.4-proup to ~1.05Mup to 128Kfrontier reasoning, hard coding
GPT-4.1 seriesgpt-4.1, gpt-4.1-mini, gpt-4.1-nano1,047,57632,768default workhorse, long context, agents
GPT-4ogpt-4o, gpt-4o-mini128,00016,384multimodal chat, low cost
o-serieso3, o4-mini, o3-pro, codex-mini200,000100,000step by step reasoning, tool use
Mediasora-2, gpt-image-1, audio modelsn/an/avideo, image, speech

Numbers from the Foundry Models catalog. GPT-5 max output and the exact GPT-5 member list shift as new versions land, so treat the top row as a range and confirm on the catalog page before you commit.

The context window is the number worth staring at. GPT-4.1 accepts just over a million tokens, roughly eight times what GPT-4o takes. That is the difference between feeding a model a whole codebase or a long contract, versus chunking it. The reasoning o-series sits in the middle at 200,000, which is plenty for most agent loops.

Input context window by modelThousands of tokens the model accepts in one request02505007501000128gpt-4o200o4-mini1048gpt-4.11050gpt-5.4-progpt-4.1 shown in solid red: the long-context default most teams should start on.
Context windows in thousands of tokens. GPT-4.1 and the GPT-5 top tier clear a million; GPT-4o and the o-series sit far below.

Which model should you actually pick?

Here is my rule, and I will defend it. Start on gpt-4.1. It handles the large majority of chat, extraction, summarization, and agent work, takes a million tokens of context, and costs a fraction of the frontier tier. Prove it fails before you upgrade. Most teams never need to.

When do you move up? Three cases. First, hard multi-step reasoning where the answer depends on the model working through steps it does not show you: math, planning, tricky debugging. That is o-series or GPT-5 territory. Second, cost pressure at high volume, where gpt-4.1-mini or gpt-4.1-nano shave the bill on simple classification and routing. Third, media, where you need Sora for video or an image model. Everything else, gpt-4.1 first.

When should you not jump to a reasoning model? When latency matters and the task is not actually multi-step. Reasoning models think before they answer, which adds seconds and bills you for tokens you never see. I have watched a team put o3 behind a live chat widget and wonder why every reply took nine seconds. The task was FAQ lookup. It should have been gpt-4.1-mini.

Gotcha: a bigger or newer model is not a free upgrade. Reasoning models reject temperature and top_p, use max_completion_tokens instead of max_tokens, and bill hidden reasoning tokens as output. Swap a chat model for a reasoning model without changing those parameters and you get a 400, or a bill that surprises you. Validate cost and latency on your own traffic before you switch a production route.

Your first call with the v1 API

Microsoft opened the v1 Azure OpenAI API in August 2025, and it is the path I use now. Two things changed that matter. You use the plain OpenAI() client instead of the Azure-specific AzureOpenAI() client, and you stop passing a dated api-version on every call. You point base_url at your resource with /openai/v1/ on the end, and for new work you call the Responses API, which Microsoft recommends over Chat Completions.

import os
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

# Entra ID auth, no static key. Role needed: Cognitive Services OpenAI User.
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), 'https://ai.azure.com/.default'
)

client = OpenAI(
    base_url='https://my-foundry-resource.openai.azure.com/openai/v1/',
    api_key=token_provider,
)

resp = client.responses.create(
    model='gpt-4.1',   # this is your DEPLOYMENT name, not the catalog name
    input='Give me one sentence on why deployment names matter.',
)

print(resp.output_text)

Expected output: one sentence, for example: Deployment names matter because your code calls the deployment, not the underlying model, so a mismatch returns a 404 rather than a fallback.

Failure modes: if your deployment is named gpt41-prod but you pass model='gpt-4.1', you get the 404 DeploymentNotFound from the top of this post. Point the same code at an o-series deployment and add temperature=0.2 and you get a 400, because reasoning models reject that parameter.

Disclaimer: creating or changing a model deployment is a production change. It affects live quota and billing on the resource. Do it in a non-production Foundry project first, confirm the deployment name and version, then promote. Nothing in this part should run against a resource serving real traffic without that check.

Deployment types set the price, not the model

Same model, four ways to buy it. The deployment type you pick when you create the deployment decides how you are billed and how the request is routed. Part 6 goes deep on this; here is what you need to make a first choice.

TypeWhat it isBilling basisReach for it when
Global Standardpay per token, routed to any region with capacityper 1M tokensdev and most variable traffic
Data Zoneper token, kept inside a US or EU data zoneper 1M tokens, small premiumresidency inside a zone
Provisioned managedreserved throughput in PTUsper PTU per hour or monthsteady high volume, latency floor
Global Batchasync, 24 hour windowper token, about half priceoffline jobs, evals, bulk

One trap specific to provisioned throughput: on GPT-4.1 a provisioned deployment caps context under 128,000 tokens, and a longer request returns HTTP 400. If you need the full million-token window on a provisioned deployment, turn on spillover, which routes the oversized requests to a matching standard deployment. That is the kind of detail that only bites you in production.

What a request costs

Token pricing is where a model choice turns into a monthly number. On Global Standard, gpt-4.1 runs about 2.00 US dollars per million input tokens and 8.00 per million output tokens as I write this. Prices move and vary by region, so treat these as the shape, not a quote, and check the pricing page before you budget.

Worked example

A support assistant sends 30 million input tokens and 6 million output tokens a month on gpt-4.1, Global Standard. Input: 30 times 2.00 equals 60 dollars. Output: 6 times 8.00 equals 48 dollars. Total about 108 dollars a month.

A provisioned deployment for the same model starts near 2,448 dollars a month. At 108 dollars of usage, standard wins by a wide margin. The two only cross once monthly volume climbs into the hundreds of millions of output tokens. Do not buy PTUs for a workload this size.

Standard versus provisioned, monthly costgpt-4.1, input held at five times output. Where the lines cross is where PTUs start to pay off0120024003600US dollars per month50100150200Output tokens per month, millionsProvisioned floor, about 2,448 per monthGlobal Standard108 dollars at 6M outputcross near 136M output
The worked example sits at the black dot, far under the provisioned floor. Standard billing stays cheaper until output volume reaches roughly 136 million tokens a month.

Responses API or Chat Completions?

You will see both APIs in Azure samples, and the split confuses people. Chat Completions is the older interface: you send a list of messages and get one reply. It still works, and every model here supports it. The Responses API is the newer one Microsoft steers new projects toward. It keeps the same message style but folds stateful multi-turn handling, background tasks, hosted tools, and remote MCP servers into one call.

My rule is short. New code starts on Responses. It is where new features land first, and the built-in state and tool calling save you from stitching that together by hand. Keep Chat Completions when you are calling a partner model that only speaks that syntax, when you are porting OpenAI code that already uses it and there is no reason to churn, or when a library you depend on has not moved yet. Do not rewrite a working Chat Completions service just to be current. Rewrite it when you need a Responses feature.

One practical difference to plan for: content filter results come back in a different shape. Chat Completions returns prompt_filter_results and content_filter_results fields, while the Responses API puts a top-level content_filters array on the response object. If you have logging or safety tooling reading those fields, it needs a change when you switch. Small edit, but the kind that slips through until a filtered response quietly breaks a downstream job.

My take

On a greenfield Azure project in 2026 I have not reached for Chat Completions once. The only times I keep it are legacy ports and the odd partner model. If you are choosing today, choose Responses and move on.

Model retirements will bite you

Every model in the catalog has a lifecycle, and older snapshots carry retirement dates. When a version retires, deployments that pin it stop serving, and if you let Azure auto-upgrade you, your model can change under you between one week and the next. Both failure modes are real. I have been paged for each.

My practice: pin an explicit model version on every production deployment, subscribe to the retirement notices, and keep a newer version deployed in a staging project so the migration is a config flip, not a scramble. Preview models, the ones tagged Preview in the catalog, get upgraded on Microsoft schedule and should never sit behind production traffic. Check the retirements page each quarter and diff it against what you have deployed.

For contrast across clouds, the same model-choice problem on AWS is covered in the Bedrock model catalog part of the AWS series. The vendors differ in naming and lifecycle policy, but the discipline of pinning versions is identical.

Default to gpt-4.1, upgrade only on evidence

If you take one deployment away from this part, make it a gpt-4.1 deployment on Global Standard, called through the v1 API with the Responses call. It covers most of what a team needs, its million-token window removes a whole class of chunking work, and at real volumes it stays far cheaper than provisioned throughput. Move to a reasoning model when a task proves it needs steps, drop to mini or nano when volume proves you can, and pin your versions either way.

Deploy that model in a scratch project this week and run the code above against it. Next up, Part 4 opens the other half of the catalog, the partner and open models sold through Models-as-a-Service, and when it is worth reaching past the OpenAI family at all.

Azure Gen AI Series · Part 3 of 30
« Previous: Part 2  |  Guide  |  Next: Part 4 »

References

About The Author


Discover more from Journal of Intelligent Infrastructure – By Dr Pranay Jha

Subscribe to get the latest posts sent to your email.

Leave a Reply

Your email address will not be published. Required fields are marked *

Architect’s Toolkit

About the Author

Dr. Pranay Jha is a Cloud and AI Consultant with 18+ years of experience in hybrid cloud, virtualization, and enterprise infrastructure transformation. He specializes in VMware technologies, multi-cloud strategy, and Generative AI solutions. He holds a PhD in Computer Applications with research focused on Cloud and AI, has published multiple research papers, and has been a VMware vExpert since 2016 and a VMUG Community Leader.

Discover more from Journal of Intelligent Infrastructure - By Dr Pranay Jha

Subscribe now to keep reading and get access to the full archive.

Continue reading