Provisioned throughput sitting idle on Azure OpenAI
Reserved AI capacity you are not using
Why it happens
Reserved throughput bills by the hour whether or not you send anything through it. This one is running well under what was bought.
Provisioned throughput reserves capacity by the hour whether or not you send tokens through it. Capacity gets sized for a launch estimate and never trued up.
Paste this into Resource Graph Explorer in the Azure portal.
resources
| where type =~ 'microsoft.cognitiveservices/accounts'
// Scope below matches CloudFinOpsPro policy DEFAULTS: exclusions.protectTag, environment.tagKeys,
// environment.allowedTagValues, and allowUntagged false so an untagged resource counts as production.
// If your policy.yaml differs, edit the three lines below or this will disagree with your own agent.
| where tolower(tostring(coalesce(tags['cfop:protect'], ''))) !in ('true', 'yes', '1')
| extend cfopEnv = tolower(trim(' ', tostring(coalesce(tags['Environment'], tags['environment'], tags['env'], ''))))
| where cfopEnv in ('dev', 'development', 'test', 'qa', 'sandbox', 'nonprod', 'non-prod', 'staging')
| project account = name, resourceGroup, location,
acctKind = tostring(kind),
sku = tostring(sku.name)Resource Graph does not index microsoft.cognitiveservices/accounts/deployments, so this lists the accounts and the deployments inside them have to come from ARM: az cognitiveservices account deployment list -g <rg> -n <account>. Deliberately not filtered to kind OpenAI, because Azure AI Foundry accounts have kind AIServices and host model deployments too. A deployment on a Provisioned or ProvisionedManaged SKU bills its committed capacity by the hour whether or not a token is sent. The check decides on the AzureOpenAIProvisionedManagedUtilizationV2 metric, keeping deployments that averaged under 40 percent of purchased capacity across the previous 336 hours. It deliberately does not use the per-deployment token counts: reading ProcessedPromptTokens or GeneratedTokens per deployment needs a ModelDeploymentName dimension filter the metric collector does not send yet, so those totals are reported as null rather than as a subscription-wide figure that would not describe the deployment.
Applies to microsoft.cognitiveservices/accounts/deploymentsWhat the agent does about it
A provisioned-managed OpenAI deployment whose utilisation has stayed far below the purchased PTUs.
It will not fix this one
It reports this and takes no action. A check only earns the right to change something once the action behind it can re-read live state before it fires and knows the way back.
Related checks
PTU deployment on non-production where pay-as-you-go would be cheaper
A provisioned OpenAI deployment on an account or resource group tagged non-production, surfaced for review because PTU rarely pays off at that scale.
Idle virtual machine
A running VM whose CPU and network have been near zero for the whole window.
Oversized virtual machine
A running VM whose sustained peak fits comfortably inside the next size down.