# Cost Tracking & Chargeback via APIM Policies
**Last updated:** 2026-02
**Status:** GA
**Category:** API Management & AI Gateway
---
## Introduksjon
Når organisasjoner skalerer sin bruk av Azure OpenAI og andre AI-tjenester, blir kostnadssynlighet og tildeling av kostnader til riktig avdeling, prosjekt eller team en kritisk utfordring. Azure API Management (APIM) fungerer som et naturlig punkt for å samle inn kostnadsdata fra AI-modeller gjennom policyer som fanger token-bruk, modell-informasjon og forbruker-identitet. Denne informasjonen kan deretter brukes for intern fakturering (chargeback) og kostnadsoptimalisering.
For norsk offentlig sektor med stramme budsjetter og krav om transparens i ressursbruk er APIM-basert kostnadssporing spesielt verdifull. Mange statlige virksomheter deler AI-infrastruktur på tvers av avdelinger og prosjekter, og trenger mekanismer for å fordele kostnader rettferdig. Denne referansen dekker token-telling fra responser, modell-routing-tracking, chargeback-tagging, integrasjon med Azure Cost Management, og egendefinerte metriker.
APIM tilbyr innebygde policyer for å emittere token-metriker (`llm-emit-token-metric`) og logge LLM API-requests med fullstendig token-bruk. Kombinert med Azure Monitor, Application Insights og Cost Management gir dette en komplett pipeline for AI-kostnadssporing fra request til faktura.
---
## Token Counting from Responses
### Azure OpenAI Token Usage
Hver Azure OpenAI-respons inkluderer token-bruk i `usage`-feltet:
```json
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"usage": {
"prompt_tokens": 150,
"completion_tokens": 250,
"total_tokens": 400
}
}
```
### llm-emit-token-metric Policy
Den primære policyen for å emittere token-metriker til Azure Monitor:
```xml
```
### Token-typer og Kostnader
| Token-type | Beskrivelse | Kostnadsandel |
|-----------|-------------|---------------|
| Prompt tokens | Input-tokens (brukerens melding + system prompt) | Typisk 30-50% av kostnad |
| Completion tokens | Output-tokens (modellens svar) | Typisk 50-70% av kostnad |
| Cached tokens | Tokens fra prompt caching | Rabattert (opptil 50%) |
| Total tokens | Sum av prompt + completion | Grunnlag for fakturering |
### Kostnadsberegning per Request
```xml
() ?? 0;
var completionTokens = usage["completion_tokens"]?.Value() ?? 0;
var cost = (promptTokens / 1000m * promptRate) +
(completionTokens / 1000m * completionRate);
return cost.ToString("F4");
}" />
@((string)context.Variables["estimated-cost-nok"])
```
---
## Model Routing Tracking
### Spore Hvilken Modell som Brukes
Når backend pools med forskjellige modeller brukes, er det viktig å spore hvilken modell og deployment som faktisk betjener requesten:
```xml
```
### Modell-pris-mapping
| Modell | Prompt (kr/1K tokens) | Completion (kr/1K tokens) | Type |
|--------|----------------------|--------------------------|------|
| GPT-4o | 0.025 | 0.10 | Standard |
| GPT-4o-mini | 0.0015 | 0.006 | Standard |
| GPT-4 Turbo | 0.10 | 0.30 | Standard |
| text-embedding-ada-002 | 0.001 | N/A | Embedding |
| text-embedding-3-large | 0.0013 | N/A | Embedding |
| PTU (alle modeller) | Fast pris/time | Fast pris/time | Provisioned |
**Merk:** Priser varierer og bør oppdateres jevnlig. PTU faktureres per time uavhengig av faktisk bruk.
---
## Chargeback Tagging
### Implementere Chargeback-modell
En effektiv chargeback-modell krever at hver AI-request tagges med identifiserbar informasjon:
```xml
@((string)context.Variables["department"])
@{
var body = context.Response.Body.As(preserveContent: true);
return body?["usage"]?["total_tokens"]?.ToString() ?? "0";
}
```
### APIM Products for Chargeback
Bruk APIM Products for å gruppere API-tilgang per avdeling:
| Product | Beskrivelse | Rate Limit | Chargeback |
|---------|-------------|-----------|-----------|
| AI-Standard | Standard AI-tilgang | 10K TPM | Avdelingsbudsjett |
| AI-Premium | Utvidet AI-tilgang | 50K TPM | Prosjektbudsjett |
| AI-Unlimited | Full tilgang (admin) | Ubegrenset | Sentralt budsjett |
```xml
```
---
## Azure Cost Management Integration
### Log Analytics for Kostnadsdata
Token-bruk logges til Azure Monitor via LLM API-logging:
```
APIM → Diagnostic Settings → "Logs related to generative AI gateway"
→ Log Analytics Workspace → ApiManagementGatewayLlmLog
```
### KQL Query: Daglig Kostnad per Avdeling
```kusto
ApiManagementGatewayLlmLog
| where TimeGenerated > ago(30d)
| extend Department = tostring(CustomDimensions["Department"])
| extend Model = tostring(ModelDeployment)
| extend PromptTokens = toint(PromptTokens)
| extend CompletionTokens = toint(CompletionTokens)
// Pris-mapping (oppdater etter faktiske priser)
| extend PromptCostNOK = case(
Model contains "gpt-4o-mini", PromptTokens * 0.0000015,
Model contains "gpt-4o", PromptTokens * 0.000025,
Model contains "gpt-4", PromptTokens * 0.0001,
PromptTokens * 0.00001 // Default
)
| extend CompletionCostNOK = case(
Model contains "gpt-4o-mini", CompletionTokens * 0.000006,
Model contains "gpt-4o", CompletionTokens * 0.0001,
Model contains "gpt-4", CompletionTokens * 0.0003,
CompletionTokens * 0.00003 // Default
)
| extend TotalCostNOK = PromptCostNOK + CompletionCostNOK
| summarize
DailyCostNOK = sum(TotalCostNOK),
TotalTokens = sum(toint(TotalTokens)),
RequestCount = count()
by Department, bin(TimeGenerated, 1d)
| order by TimeGenerated desc, DailyCostNOK desc
```
### KQL Query: Månedlig Chargeback-rapport
```kusto
ApiManagementGatewayLlmLog
| where TimeGenerated > startofmonth(ago(0d))
| extend CostCenter = tostring(CustomDimensions["CostCenter"])
| extend Department = tostring(CustomDimensions["Department"])
| extend Model = tostring(ModelDeployment)
| summarize
TotalPromptTokens = sum(toint(PromptTokens)),
TotalCompletionTokens = sum(toint(CompletionTokens)),
TotalTokens = sum(toint(TotalTokens)),
RequestCount = count(),
UniqueUsers = dcount(tostring(CustomDimensions["UserId"]))
by CostCenter, Department, Model
| extend EstimatedCostNOK =
TotalPromptTokens * 0.000025 + TotalCompletionTokens * 0.0001
| order by EstimatedCostNOK desc
```
### Azure Workbook for Kostnadsdashboard
APIM tilbyr et innebygd Analytics-dashboard for LLM-APIer:
```
1. APIM → Monitoring → Analytics → Language models
2. Viser: Token consumption, Request count, Modell-fordeling
3. Filtrer etter tidsperiode og API
```
For egendefinert dashboard:
```
1. Azure Monitor → Workbooks → New
2. Legg til KQL-queries for chargeback
3. Visualiser med tabeller, grafer, kart
4. Del med stakeholders via Azure RBAC
```
---
## Custom Metrics
### Emit Custom Metriker med Policy Expressions
```xml
() ?? 0;
var completion = usage["completion_tokens"]?.Value() ?? 0;
return (prompt * 0.000025) + (completion * 0.0001);
}"
namespace="ai-cost">
```
### Azure Monitor Alerts for Kostnadsoverskridelse
```bicep
resource costAlert 'Microsoft.Insights/metricAlerts@2018-03-01' = {
name: 'ai-cost-threshold-alert'
location: 'global'
properties: {
severity: 2
evaluationFrequency: 'PT1H'
windowSize: 'PT24H'
criteria: {
'odata.type': 'Microsoft.Azure.Monitor.SingleResourceMultipleMetricCriteria'
allOf: [
{
name: 'DailyTokenBudgetExceeded'
metricNamespace: 'ai-tokens'
metricName: 'Total Tokens'
operator: 'GreaterThan'
threshold: 1000000 // 1M tokens per dag
timeAggregation: 'Total'
}
]
}
actions: [
{ actionGroupId: actionGroup.id }
]
}
}
```
### Eksport til Power BI for Rapportering
```kusto
// Eksporter data til Power BI via Log Analytics
ApiManagementGatewayLlmLog
| where TimeGenerated > ago(90d)
| project
Timestamp = TimeGenerated,
Department = tostring(CustomDimensions["Department"]),
CostCenter = tostring(CustomDimensions["CostCenter"]),
Model = ModelDeployment,
PromptTokens = toint(PromptTokens),
CompletionTokens = toint(CompletionTokens),
TotalTokens = toint(TotalTokens),
SubscriptionName = tostring(CustomDimensions["Subscription"])
```
---
## FinOps Integrasjon
### Azure Cost Management Tags
Kombiner APIM-metriker med Azure resource tags for helhetlig kostnadsbilde:
| Tag | Formål | Eksempel |
|-----|--------|---------|
| `Department` | Avdelingstilhørighet | "IT-seksjonen" |
| `CostCenter` | Kostnadssenter-kode | "KS-4210" |
| `Environment` | Miljø | "production" |
| `Project` | Prosjektkode | "AI-chatbot-2026" |
### Kostnadsmodeller for AI
| Modell | Fordeler | Ulemper |
|--------|---------|--------|
| Per-token chargeback | Presis, rettferdig | Kompleks å administrere |
| Flat rate per avdeling | Enkelt, forutsigbart | Urettferdig for lavbrukere |
| Tier-basert (freemium) | Balansert, insentiverer effektivitet | Krever grensehåndtering |
| PTU-allokering | Fast kostnad, forutsigbart | Ingen fleksibilitet |
---
## Referanser
- [AI gateway in Azure API Management - Observability and governance](https://learn.microsoft.com/en-us/azure/api-management/genai-gateway-capabilities#observability-and-governance) — Oversikt over token-metriker
- [llm-emit-token-metric policy](https://learn.microsoft.com/en-us/azure/api-management/llm-emit-token-metric-policy) — Policy-referanse for token-metriker
- [Log token usage, prompts, and completions](https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-llm-logs) — LLM API-logging
- [Plan and manage costs for API Management](https://learn.microsoft.com/en-us/azure/api-management/plan-manage-costs) — APIM-kostnader i Cost Management
- [Azure Cost Management overview](https://learn.microsoft.com/en-us/azure/cost-management-billing/costs/overview-cost-management) — Helhetlig kostnadsadministrasjon
---
## For Cosmo
- **Bruk denne referansen** når kunder trenger å implementere kostnadssporing og intern fakturering for AI-tjenester gjennom APIM.
- Start med `llm-emit-token-metric` policy med Department- og CostCenter-dimensjoner — dette gir umiddelbar synlighet i token-bruk per avdeling.
- For norsk offentlig sektor: Anbefal tier-basert chargeback-modell med APIM Products som mapper til avdelingsbudsjetter. Flat rate er for enkelt, per-token er for komplekst for de fleste.
- Husk at PTU-kostnader er faste per time — chargeback for PTU bør baseres på allokert kapasitet, ikke faktisk bruk.
- Kombiner APIM-metriker med Azure resource tags for å gi et helhetlig bilde i Cost Management. APIM-metriker alene viser kun token-bruk, ikke infrastrukturkostnader.