# AI Gateway Troubleshooting Common issues when using Azure API Management as an AI Gateway. --- ## Authentication Issues ### 401 Unauthorized from Backend **Symptom**: APIM returns `401` when calling Azure OpenAI. **Causes & Solutions**: | Cause | Fix | |-------|-----| | Managed identity not enabled on APIM | `az apim update --name --resource-group --set identity.type=SystemAssigned` | | Missing RBAC role | `az role assignment create --assignee --role "Cognitive Services User" --scope ` | | Wrong auth resource | Ensure `resource="https://cognitiveservices.azure.com"` (not the endpoint URL) | | RBAC propagation delay | Wait 5-10 minutes after role assignment | **Diagnostic**: ```bash # Verify identity is enabled az apim show --name --resource-group --query "identity" -o json # Check role assignments AOAI_ID=$(az cognitiveservices account show --name --resource-group --query id -o tsv) az role assignment list --scope "$AOAI_ID" --query "[?principalType=='ServicePrincipal'].{role:roleDefinitionName, principal:principalId}" -o table ``` --- ## Rate Limiting Issues ### 429 Token Limit Exceeded **Symptom**: Requests blocked with `429 Too Many Requests` from `azure-openai-token-limit` policy. **Solutions**: 1. **Increase limit**: Raise `tokens-per-minute` value 2. **Add more backends**: Load balance across regions for higher aggregate TPM 3. **Enable semantic caching**: Reduce actual token consumption by serving cached responses 4. **Switch counter-key**: Use per-user instead of global to prevent one user from exhausting the pool ```xml ``` ### 429 from Azure OpenAI (Not APIM) **Symptom**: Backend returns `429` even though APIM token limits are not exceeded. **Cause**: Azure OpenAI's own TPM quota is exhausted. **Solutions**: 1. Increase Azure OpenAI deployment TPM quota in the portal 2. Add load balancing across multiple Azure OpenAI instances 3. Use retry with backoff: ```xml ``` --- ## Semantic Caching Issues ### No Cache Hits **Symptom**: Semantic cache is configured but cache hit rate is 0%. **Causes & Solutions**: | Cause | Fix | |-------|-----| | `score-threshold` too high | Lower from 0.9 to 0.7 (more matches) | | Embeddings backend misconfigured | Verify backend URL and auth | | Redis not configured | Deploy Azure Cache for Redis Enterprise with RediSearch | | Streaming requests | Semantic caching doesn't work with `"stream": true` | **Verify caching is working**: ```bash # Check cache-related headers in response curl -v -X POST "${GATEWAY_URL}/openai/deployments//chat/completions?api-version=2024-02-01" \ -H "Content-Type: application/json" \ -H "Ocp-Apim-Subscription-Key: " \ -d '{"messages": [{"role": "user", "content": "What is Azure?"}], "max_tokens": 100}' # Look for: x-cache-status header in response ``` ### Cache Returns Stale Data **Solution**: Reduce `duration` in `azure-openai-semantic-cache-store`: ```xml ``` --- ## Content Safety Issues ### False Positives (Legitimate Content Blocked) **Symptom**: Normal business content is being blocked by content safety policy. **Solutions**: 1. **Increase thresholds** (less strict): ```xml ``` 2. **Log blocked content** for review: ```xml @{ return new JObject( new JProperty("blocked", true), new JProperty("subscription", context.Subscription.Id), new JProperty("timestamp", DateTime.UtcNow) ).ToString(); } {"error": "Content filtered by safety policy"} ``` ### Content Safety Backend Error **Symptom**: `500` error from `llm-content-safety` policy. **Causes**: | Cause | Fix | |-------|-----| | Content Safety resource not deployed | Deploy Azure AI Content Safety resource | | Backend URL wrong | Check `contentsafety-backend` URL matches resource endpoint | | Missing RBAC | Grant APIM "Cognitive Services User" on the Content Safety resource | | Region mismatch | Content Safety must be in a supported region | --- ## Backend Configuration Issues ### Backend Not Found **Symptom**: `500` error with "Backend not found" message. ```bash # Verify backend exists az apim backend list --service-name --resource-group \ --query "[].{id:name, url:url}" -o table # Check backend ID matches policy reference ``` ### Timeout on AI Requests **Symptom**: Requests timeout, especially for large context windows or complex prompts. **Solution**: Increase timeout in ``: ```xml ``` --- ## Diagnostic Tools ### APIM Tracing Enable request tracing for debugging policy flow: ```bash # Get tracing subscription key az apim subscription list --service-name --resource-group \ --query "[?displayName=='Built-in all-access subscription'].primaryKey" -o tsv # Send request with tracing curl -X POST "${GATEWAY_URL}/..." \ -H "Ocp-Apim-Trace: true" \ -H "Ocp-Apim-Subscription-Key: " ``` ### Application Insights If APIM is connected to Application Insights: ```kql // Failed AI gateway requests requests | where success == false | where url contains "openai" | project timestamp, resultCode, duration, url | order by timestamp desc | take 20 // Token metrics over time customMetrics | where name == "Total Tokens" | summarize TotalTokens = sum(value) by bin(timestamp, 1h) | render timechart // Content safety blocks traces | where message contains "content-safety" | project timestamp, message, customDimensions | order by timestamp desc ``` ### Health Check Quick validation that the AI Gateway is functioning: ```bash # 1. Check APIM is running az apim show --name --resource-group --query "provisioningState" -o tsv # Expected: Succeeded # 2. Check backends az apim backend list --service-name --resource-group -o table # 3. Test endpoint curl -s -o /dev/null -w "%{http_code}" "${GATEWAY_URL}/openai/deployments//chat/completions?api-version=2024-02-01" \ -H "Ocp-Apim-Subscription-Key: " \ -H "Content-Type: application/json" \ -d '{"messages": [{"role": "user", "content": "ping"}], "max_tokens": 5}' # Expected: 200 ``` --- ## References - [APIM Diagnostics](https://learn.microsoft.com/azure/api-management/diagnose-solve-problems) - [AI Gateway Monitoring](https://learn.microsoft.com/azure/api-management/genai-gateway-capabilities#monitoring-and-analytics) - [APIM Error Handling](https://learn.microsoft.com/azure/api-management/api-management-error-handling-policies)