Skip to content

feat(cost-map): add azure/gpt-6-astra and azure/us/gpt-6-astra Foundry pricing - #39827

Merged
mateo-berri merged 3 commits into
litellm_internal_stagingfrom
litellm_azure_gpt_6_astra
Sep 5, 2026
Merged

mateo-berri merged 3 commits into
litellm_internal_stagingfrom
litellm_azure_gpt_6_astra

Conversation

@mateo-berri

@mateo-berri mateo-berri commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • Microsoft Foundry made gpt-6-astra GA on 2026-09-03
  • LiteLLM has no azure/gpt-6-astra entry, so every Foundry call bills $0
  • Spend, budgets, and model info all read zero for those deployments

How it solves it:

  • Adds azure/gpt-6-astra at the Foundry Standard Global rates
  • Adds azure/us/gpt-6-astra at the 10% US Data Zone uplift
  • Long-context (272K+) and cache rates match the announcement
  • Effort levels none and low through max, no minimal
  • Foundry accepts reasoning_effort: none (unlike OpenAI), which unlocks temperature
  • The Azure Responses config now reads the azure/ entry for that none gate instead of OpenAI's, so /v1/responses with reasoning.effort: none and a temperature stops 400ing
  • Regression tests fail without the two entries and without the Responses fix

Sources: Foundry GA announcement (rates), the Foundry models page (context window, capabilities), and the Foundry API itself for the effort levels: a direct call with reasoning_effort: minimal answers Supported values are: 'none', 'low', 'medium', 'high', 'xhigh', 'max', and 'disabled', none returns 200 with zero reasoning tokens and accepts temperature: 0.2, while OpenAI's own API rejects none for gpt-6-astra (Supported values are: 'low', 'medium', 'high', and 'xhigh'). The default effort is not none (a call without reasoning_effort spends 67 reasoning tokens and rejects temperature: 0.2), so no default_reasoning_effort is declared

User Flow

Before: a proxy admin who deployed gpt-6-astra on Microsoft Foundry routes it through LiteLLM and every request bills $0, so spend tracking and budgets never see it

  1. They add azure/gpt-6-astra to their config as model group gpt-6-astra and restart the proxy
  2. They send GET https://litellm-domain/v1/model/info and the entry shows input_cost_per_token: 0, output_cost_per_token: 0, max_input_tokens: null, supports_reasoning: null
  3. They send POST https://litellm-domain/v1/chat/completions with "model": "gpt-6-astra" and get a 200 with the answer, but the response headers say x-litellm-response-cost-input: 0.0 and x-litellm-response-cost-output: 0.0
  4. The same happens on POST https://litellm-domain/v1/responses and POST https://litellm-domain/v1/messages
  5. They send POST https://litellm-domain/spend/calculate with a 300K-token Astra response and get {"cost": 0.0}
  6. https://litellm-domain/ui/?page=logs shows every Astra request at $0 and a team budget on that model never trips
  7. They send POST https://litellm-domain/v1/chat/completions with "reasoning_effort": "none" and "temperature": 0.2, which Foundry itself accepts, and get a 400 Azure OpenAI does not support reasoning_effort='none' for this model
  8. They send POST https://litellm-domain/v1/responses with "reasoning": {"effort": "none"} and "temperature": 0.2 and get a 400 gpt-6-astra doesn't support temperature=0.2 while reasoning is active; POST https://litellm-domain/v1/messages with "thinking": {"type": "disabled"} and the same temperature gets the step 7 400

After: the same deployment bills at the Foundry rates on every endpoint

  1. They add azure/gpt-6-astra to their config as model group gpt-6-astra and restart the proxy
  2. They send GET https://litellm-domain/v1/model/info and the entry shows input_cost_per_token: 0.00001, output_cost_per_token: 0.00005, max_input_tokens: 922000, supports_reasoning: true
  3. They send POST https://litellm-domain/v1/chat/completions with "model": "gpt-6-astra" and get a 200 whose headers say x-litellm-response-cost: 0.00033 for 13 input and 4 output tokens
  4. POST https://litellm-domain/v1/responses and POST https://litellm-domain/v1/messages carry the same non-zero cost headers
  5. They send POST https://litellm-domain/spend/calculate with a 300K-token Astra response and get {"cost": 6.075}, the doubled long-context input rate plus 1.5x output
  6. https://litellm-domain/ui/?page=logs shows real spend per Astra request and budgets on that model enforce
  7. They send POST https://litellm-domain/v1/chat/completions with "reasoning_effort": "none" and "temperature": 0.2 and get a 200 with zero reasoning tokens and x-litellm-response-cost: 0.00033
  8. They send POST https://litellm-domain/v1/responses with "reasoning": {"effort": "none"} and "temperature": 0.2 and get a 200 with zero reasoning tokens and x-litellm-response-cost: 0.00038; POST https://litellm-domain/v1/messages with "thinking": {"type": "disabled"} and the same temperature gets a 200 too

Relevant issues

Linear ticket

Resolves LIT-6997

Pre-Submission checklist

Please complete all items before asking a LiteLLM maintainer to review your PR

  • I have added meaningful tests
  • The handful of test files covering my change pass locally, e.g. uv run pytest tests/test_litellm/<your_test_file>.py -v. Leave the suites (make test-unit-*, make test-unit) to CI: it finishes in ~15 minutes where a laptop takes an hour or more
  • My PR passes all required CI/CD checks (e.g., lint, schema.d.ts sync check, etc.)
  • My PR's scope is as isolated as possible; it only solves 1 specific problem
  • I have received a Greptile Confidence Score of at least 4/5 before requesting a maintainer review (Greptile reviews automatically once the PR is opened; only comment @greptileai to re-request a review after pushing changes)

Delays in PR merge?

If you're seeing a delay in your PR being merged, ping the LiteLLM Team on Slack (#pr-review).

Screenshots / Proof of Fix

Both legs boot the proxy from their own worktree and .venv with --num_workers 2 on a random free port, no database, reading the local cost map (LITELLM_LOCAL_MODEL_COST_MAP=True). The LLM calls go to a real gpt-6-astra GlobalStandard deployment on Microsoft Foundry. Same config, same commands, same order on both sides

Config:

model_list:
  - model_name: gpt-6-astra
    litellm_params:
      model: azure/gpt-6-astra
      api_key: os.environ/AZURE_DEVIN_FOUNDRY_QA_API_KEY
      api_base: os.environ/AZURE_DEVIN_FOUNDRY_QA_API_BASE
      api_version: "2025-04-01-preview"
  - model_name: gpt-6-astra-us
    litellm_params:
      model: azure/us/gpt-6-astra
      api_key: os.environ/AZURE_DEVIN_FOUNDRY_QA_API_KEY
      api_base: os.environ/AZURE_DEVIN_FOUNDRY_QA_API_BASE
      api_version: "2025-04-01-preview"

general_settings:
  master_key: sk-lit6997

Boot:

LITELLM_LOCAL_MODEL_COST_MAP=True python litellm/proxy/proxy_cli.py --config lit6997_config.yaml --port $PORT --num_workers 2 --use_v2_migration_resolver

Before (d23bec8)

/v1/model/info

  1. curl -s http://localhost:20710/v1/model/info -H 'Authorization: Bearer sk-lit6997' | jq -c '.data[] | {model_name, litellm_model: .litellm_params.model, input_cost_per_token: .model_info.input_cost_per_token, input_above_272k: .model_info.input_cost_per_token_above_272k_tokens, output_cost_per_token: .model_info.output_cost_per_token, cache_read: .model_info.cache_read_input_token_cost, cache_creation: .model_info.cache_creation_input_token_cost, max_input_tokens: .model_info.max_input_tokens, supports_reasoning: .model_info.supports_reasoning}'
  2. Output:
{"model_name":"gpt-6-astra","litellm_model":"azure/gpt-6-astra","input_cost_per_token":0,"input_above_272k":null,"output_cost_per_token":0,"cache_read":0.000001,"cache_creation":0.0000125,"max_input_tokens":null,"supports_reasoning":null}
{"model_name":"gpt-6-astra-us","litellm_model":"azure/us/gpt-6-astra","input_cost_per_token":0,"input_above_272k":null,"output_cost_per_token":0,"cache_read":null,"cache_creation":null,"max_input_tokens":null,"supports_reasoning":null}

/model_group/info

  1. curl -s http://localhost:20710/model_group/info -H 'Authorization: Bearer sk-lit6997' | jq -c '.data[] | {model_group, supports_reasoning, supported_reasoning_efforts, max_input_tokens, input_cost_per_token, output_cost_per_token}'
  2. Output:
{"model_group":"gpt-6-astra","supports_reasoning":false,"supported_reasoning_efforts":["low","medium","high","xhigh","max"],"max_input_tokens":null,"input_cost_per_token":0.0,"output_cost_per_token":0.0}
{"model_group":"gpt-6-astra-us","supports_reasoning":false,"supported_reasoning_efforts":null,"max_input_tokens":null,"input_cost_per_token":0.0,"output_cost_per_token":0.0}

/spend/calculate

  1. Standard request, 1000 prompt tokens of which 200 cached, 100 completion tokens: curl -s -X POST http://localhost:20710/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-1","object":"chat.completion","created":1788500000,"model":"azure/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1000,"completion_tokens":100,"total_tokens":1100,"prompt_tokens_details":{"cached_tokens":200}}}}'
  2. Output: {"cost":0.00019999999999999998} (only the 200 cached tokens bill, through a generic cache fallback; the 800 text tokens and 100 output tokens are free)
  3. Long context, 300000 prompt tokens, 1000 completion tokens: curl -s -X POST http://localhost:20710/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-2","object":"chat.completion","created":1788500000,"model":"azure/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":300000,"completion_tokens":1000,"total_tokens":301000}}}'
  4. Output: {"cost":0.0}
  5. US Data Zone, 1000 prompt tokens, 100 completion tokens: curl -s -X POST http://localhost:20710/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-3","object":"chat.completion","created":1788500000,"model":"azure/us/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1000,"completion_tokens":100,"total_tokens":1100}}}'
  6. Output: {"cost":0.0}

POST /v1/chat/completions (real Foundry call)

  1. curl -s -D - http://localhost:20710/v1/chat/completions -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","messages":[{"role":"user","content":"Reply with the single word astra"}],"reasoning_effort":"low"}'
  2. Output (headers filtered to status, upstream, and cost; body reduced with jq):
HTTP/1.1 200 OK
x-litellm-model-api-base: https://devinfoundryqa33856.services.ai.azure.com
x-litellm-response-cost-input: 0.0
x-litellm-response-cost-output: 0.0
{"model":"gpt-6-astra","content":"astra","usage":{"prompt_tokens":13,"completion_tokens":4}}

POST /v1/responses (real Foundry call)

  1. curl -s -D - http://localhost:20710/v1/responses -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","input":"Reply with the single word astra","reasoning":{"effort":"low"}}'
  2. Output:
HTTP/1.1 200 OK
x-litellm-model-api-base: https://devinfoundryqa33856.services.ai.azure.com
x-litellm-response-cost-input: 0.0
x-litellm-response-cost-output: 0.0
{"model":"gpt-6-astra","text":"astra","usage":{"input_tokens":13,"output_tokens":5}}

POST /v1/messages (real Foundry call)

  1. curl -s -D - http://localhost:20710/v1/messages -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","max_tokens":256,"messages":[{"role":"user","content":"Reply with the single word astra"}]}'
  2. Output:
HTTP/1.1 200 OK
x-litellm-response-cost-input: 0.0
x-litellm-response-cost-output: 0.0
{"model":"gpt-6-astra","text":"astra","usage":{"input_tokens":13,"output_tokens":4}}

POST /v1/chat/completions with reasoning_effort none and temperature 0.2 (real Foundry call)

  1. curl -s -D - http://localhost:20710/v1/chat/completions -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","messages":[{"role":"user","content":"Reply with the single word astra"}],"reasoning_effort":"none","temperature":0.2}'
  2. Output (LiteLLM rejects it before Foundry sees it; the same request sent straight to Foundry returns 200):
HTTP/1.1 400 Bad Request
x-litellm-response-cost: 0
{"error":"litellm.UnsupportedParamsError: Azure OpenAI does not support reasoning_effort='none' for this model. Supported values are: 'low', 'medium', and 'high'. To drop"}
  1. Same request with "model":"gpt-6-astra-us": HTTP/1.1 400 Bad Request with the same error

POST /v1/responses with reasoning.effort none and temperature 0.2 (real Foundry call)

  1. curl -s -D - http://localhost:20710/v1/responses -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","input":"Reply with the single word astra","reasoning":{"effort":"none"},"temperature":0.2}'
  2. Output (LiteLLM rejects it before Foundry sees it):
HTTP/1.1 400 Bad Request
x-litellm-response-cost: 0
{"error":"litellm.UnsupportedParamsError: gpt-6-astra doesn't support temperature=0.2 while reasoning is active. Only temperature=1 is supported unless reasoning.effort resolves to 'none', either set explicitly"}
  1. curl -s -D - http://localhost:20710/v1/messages -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","max_tokens":64,"messages":[{"role":"user","content":"Reply with the single word astra"}],"thinking":{"type":"disabled"},"temperature":0.2}'
  2. Output:
HTTP/1.1 400 Bad Request
x-litellm-response-cost: 0
{"error":"litellm.UnsupportedParamsError: Azure OpenAI does not support reasoning_effort='none' for this model. Supported values are: 'low', 'medium', and 'high'. To drop this parameter, set `litellm.drop_param"}

After (c02f198)

/v1/model/info

  1. curl -s http://localhost:27368/v1/model/info -H 'Authorization: Bearer sk-lit6997' | jq -c '.data[] | {model_name, litellm_model: .litellm_params.model, input_cost_per_token: .model_info.input_cost_per_token, input_above_272k: .model_info.input_cost_per_token_above_272k_tokens, output_cost_per_token: .model_info.output_cost_per_token, cache_read: .model_info.cache_read_input_token_cost, cache_creation: .model_info.cache_creation_input_token_cost, max_input_tokens: .model_info.max_input_tokens, supports_reasoning: .model_info.supports_reasoning}'
  2. Output:
{"model_name":"gpt-6-astra","litellm_model":"azure/gpt-6-astra","input_cost_per_token":0.00001,"input_above_272k":0.00002,"output_cost_per_token":0.00005,"cache_read":0.000001,"cache_creation":0.0000125,"max_input_tokens":922000,"supports_reasoning":true}
{"model_name":"gpt-6-astra-us","litellm_model":"azure/us/gpt-6-astra","input_cost_per_token":0.000011,"input_above_272k":0.000022,"output_cost_per_token":0.000055,"cache_read":0.0000011,"cache_creation":0.00001375,"max_input_tokens":922000,"supports_reasoning":true}

/model_group/info

  1. curl -s http://localhost:27368/model_group/info -H 'Authorization: Bearer sk-lit6997' | jq -c '.data[] | {model_group, supports_reasoning, supported_reasoning_efforts, max_input_tokens, input_cost_per_token, output_cost_per_token}'
  2. Output:
{"model_group":"gpt-6-astra","supports_reasoning":true,"supported_reasoning_efforts":["none","low","medium","high","xhigh","max"],"max_input_tokens":922000.0,"input_cost_per_token":0.00001,"output_cost_per_token":0.00005}
{"model_group":"gpt-6-astra-us","supports_reasoning":true,"supported_reasoning_efforts":["none","low","medium","high","xhigh","max"],"max_input_tokens":922000.0,"input_cost_per_token":0.000011,"output_cost_per_token":0.000055}

/spend/calculate

  1. Standard request, 1000 prompt tokens of which 200 cached, 100 completion tokens: curl -s -X POST http://localhost:27368/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-1","object":"chat.completion","created":1788500000,"model":"azure/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1000,"completion_tokens":100,"total_tokens":1100,"prompt_tokens_details":{"cached_tokens":200}}}}'
  2. Output: {"cost":0.0132} = 800 x $10/M + 200 x $1/M + 100 x $50/M
  3. Long context, 300000 prompt tokens, 1000 completion tokens: curl -s -X POST http://localhost:27368/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-2","object":"chat.completion","created":1788500000,"model":"azure/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":300000,"completion_tokens":1000,"total_tokens":301000}}}'
  4. Output: {"cost":6.075000000000001} = 300000 x $20/M + 1000 x $75/M
  5. US Data Zone, 1000 prompt tokens, 100 completion tokens: curl -s -X POST http://localhost:27368/spend/calculate -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"completion_response":{"id":"chatcmpl-azure-astra-3","object":"chat.completion","created":1788500000,"model":"azure/us/gpt-6-astra","choices":[{"index":0,"message":{"role":"assistant","content":"hi"},"finish_reason":"stop"}],"usage":{"prompt_tokens":1000,"completion_tokens":100,"total_tokens":1100}}}'
  6. Output: {"cost":0.0165} = 1000 x $11/M + 100 x $55/M

POST /v1/chat/completions (real Foundry call)

  1. curl -s -D - http://localhost:27368/v1/chat/completions -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","messages":[{"role":"user","content":"Reply with the single word astra"}],"reasoning_effort":"low"}'
  2. Output, $0.00033 = 13 x $10/M + 4 x $50/M:
HTTP/1.1 200 OK
x-litellm-model-api-base: https://devinfoundryqa33856.services.ai.azure.com
x-litellm-response-cost: 0.00033
x-litellm-response-cost-input: 0.00013000000000000002
x-litellm-response-cost-output: 0.0002
{"model":"gpt-6-astra","content":"astra","usage":{"prompt_tokens":13,"completion_tokens":4}}

POST /v1/responses (real Foundry call)

  1. curl -s -D - http://localhost:27368/v1/responses -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","input":"Reply with the single word astra","reasoning":{"effort":"low"}}'
  2. Output, $0.00038 = 13 x $10/M + 5 x $50/M:
HTTP/1.1 200 OK
x-litellm-model-api-base: https://devinfoundryqa33856.services.ai.azure.com
x-litellm-response-cost: 0.00038
x-litellm-response-cost-input: 0.00013000000000000002
x-litellm-response-cost-output: 0.00025
{"model":"gpt-6-astra","text":"astra","usage":{"input_tokens":13,"output_tokens":5}}

POST /v1/messages (real Foundry call)

  1. curl -s -D - http://localhost:27368/v1/messages -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","max_tokens":256,"messages":[{"role":"user","content":"Reply with the single word astra"}]}'
  2. Output, $0.00033 = 13 x $10/M + 4 x $50/M:
HTTP/1.1 200 OK
x-litellm-response-cost: 0.00033
x-litellm-response-cost-input: 0.00013000000000000002
x-litellm-response-cost-output: 0.0002
{"model":"gpt-6-astra","text":"astra","usage":{"input_tokens":13,"output_tokens":4}}

POST /v1/chat/completions with reasoning_effort none and temperature 0.2 (real Foundry call)

  1. curl -s -D - http://localhost:27368/v1/chat/completions -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","messages":[{"role":"user","content":"Reply with the single word astra"}],"reasoning_effort":"none","temperature":0.2}'
  2. Output:
HTTP/1.1 200 OK
x-litellm-model-api-base: https://devinfoundryqa33856.services.ai.azure.com
x-litellm-response-cost: 0.00033
x-litellm-response-cost-input: 0.00013000000000000002
x-litellm-response-cost-output: 0.0002
{"model":"gpt-6-astra","content":"astra","usage":{"prompt_tokens":13,"completion_tokens":4,"reasoning_tokens":0}}
  1. Same request with "model":"gpt-6-astra-us" (the 404 is Foundry's: azure/us/gpt-6-astra is a cost-tracking entry, not a deployment name, see the caveats):
HTTP/1.1 404 Not Found
x-litellm-response-cost: 0
{"error":"litellm.NotFoundError: AzureException NotFoundError - Resource not found. Received Model Group=gpt-6-astra-us\nAvailable Model Group Fallbacks=None"}

POST /v1/responses with reasoning.effort none and temperature 0.2 (real Foundry call)

  1. curl -s -D - http://localhost:27368/v1/responses -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","input":"Reply with the single word astra","reasoning":{"effort":"none"},"temperature":0.2}'
  2. Output:
HTTP/1.1 200 OK
x-litellm-response-cost: 0.00038
{"model":"gpt-6-astra","status":"completed","text":"astra","reasoning_tokens":0,"temperature":0.2}
  1. curl -s -D - http://localhost:27368/v1/messages -H 'Authorization: Bearer sk-lit6997' -H 'Content-Type: application/json' -d '{"model":"gpt-6-astra","max_tokens":64,"messages":[{"role":"user","content":"Reply with the single word astra"}],"thinking":{"type":"disabled"},"temperature":0.2}'
  2. Output:
HTTP/1.1 200 OK
x-litellm-response-cost: 0.00033
{"model":"gpt-6-astra","text":"astra","usage":{"input_tokens":13,"output_tokens":4}}

Type

🆕 New Feature

Caveats (if any)

Low

  • No _priority rates: Microsoft has not published a fast-mode price for Astra on Foundry
    • a service_tier: priority request bills at the standard rate until they do
    • guessing 2x from the gpt-5.6 precedent would be a made-up number, so left out
  • No azure/eu/gpt-6-astra and no batch rates: Foundry sells Astra as Standard Global and Standard US Data Zone only, with no batch SKU
  • The Azure retail prices API returns no Astra meters yet, so the rates come from the GA announcement
  • reasoning_effort: disabled, which Foundry also lists, has no cost-map flag in LiteLLM and passes through untouched
  • azure/us/gpt-6-astra is a cost-tracking entry (model_info.base_model), not a deployment name: a litellm_params.model of azure/us/gpt-6-astra hits Foundry with the deployment us/gpt-6-astra and 404s, same as every other azure/us/ entry
  • The Responses gate change was swept over all 43 azure/ gpt-5-series deployment names in the cost map: the azure/ lookup already falls back to the bare OpenAI entry when the Azure entry says nothing ([Bug]: supports_response_schema returns incorrect metadata for DeepSeek models due to unreachable complete configuration #20885), so the only other deployments whose gate moves are gpt-5.1-chat and gpt-5.1-chat-2025-11-13, and they move the right way
    • the OpenAI map has no bare gpt-5.1-chat entry (it is gpt-5.1-chat-latest), so Azure Responses used to refuse or drop temperature for those deployments while the Azure chat surface already forwarded it; now both surfaces read the same azure/gpt-5.1-chat entry (none supported, none default) and keep it
  • CI reds at the tip, none PR-caused, all optional under the base ruleset:
    • ci/circleci: proxy_store_model_in_db_tests fails test_chat_completion_bad_model_with_spend_logs (spend log model_group comes back empty on a nonexistent model), red on every staging scheduled pipeline since 89084 and tracked in LIT-6949; nothing in that test reads the cost map
    • proxy-infra / Run tests (Python 3.10) is the known staging red tracked in LIT-6947
    • Vertex AI / Run tests (Python 3.13) died before running a test (Failed to resolve action download info, a GitHub Actions download timeout); green on the rerun from failed

Final Attestation

  • The tests check the right things, including the edge cases, and regressions in the respective real-world customer use-cases are not possible after this PR
  • c02f198 passes /live-pr-risk

Note

Low Risk
Mostly cost-map and parameter-validation wiring; the Responses override affects Azure GPT-5-series temperature gates broadly but is aligned with existing Azure chat behavior.

Overview
Adds azure/gpt-6-astra and azure/us/gpt-6-astra to the bundled cost maps so Microsoft Foundry deployments bill at the published rates (global vs 10% US Data Zone), including long-context (272K+) and cache token pricing, plus capability flags for reasoning (none through max, not minimal).

AzureOpenAIResponsesAPIConfig now delegates _supports_reasoning_effort_none and _effort_resolves_to_none to AzureOpenAIGPT5Config, so /v1/responses temperature gating follows the azure/ cost-map entry for bare deployment names like gpt-6-astra instead of OpenAI’s map—allowing reasoning.effort: "none" with non-default temperature on Foundry where OpenAI rejects none.

Regression tests cover Foundry price-sheet math, chat/responses param mapping, and advertised reasoning efforts for both model keys.

Reviewed by Cursor Bugbot for commit c02f198. Bugbot is set up for automated code reviews on this repo. Configure here.

@mateo-berri
mateo-berri requested a review from a team September 5, 2026 00:02
@codspeed

codspeed Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_azure_gpt_6_astra (c02f198) with litellm_internal_staging (59d42d3)

Open in CodSpeed

@greptile-apps

greptile-apps Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds Microsoft Foundry pricing and capability metadata for global and US Data Zone GPT-6 Astra deployments.

  • Adds standard, cached, and long-context token rates to both bundled cost maps.
  • Makes Azure Responses reasoning and temperature validation use Azure-specific model capabilities.
  • Adds regression coverage for cost calculation, supported reasoning efforts, and request parameter mapping.

Confidence Score: 5/5

The PR appears safe to merge, with no outstanding actionable findings.

The cost-map entries are synchronized and covered for standard, cached, US Data Zone, and long-context billing, while the Azure Responses change reuses existing Azure capability lookup behavior. The prior reservation finding was manually resolved after Greptile agreed that it was a pre-existing platform-wide limitation rather than a regression from this PR.

Important Files Changed

Filename Overview
litellm/llms/azure/responses/transformation.py Delegates reasoning-effort capability checks to the existing Azure GPT-5-family configuration.
model_prices_and_context_window.json Adds global and US Data Zone GPT-6 Astra pricing, context limits, endpoints, modalities, and capability flags.
litellm/model_prices_and_context_window_backup.json Keeps the backup cost map synchronized with the primary GPT-6 Astra entries.
tests/test_litellm/litellm_core_utils/llm_cost_calc/test_llm_cost_calc_utils.py Verifies standard and long-context cost calculations for both Foundry pricing zones.
tests/test_litellm/llms/azure/chat/test_azure_gpt5_transformation.py Verifies Azure Astra accepts none reasoning with temperature and rejects minimal effort.
tests/test_litellm/llms/azure/response/test_azure_transformation.py Verifies Azure Responses temperature gating for none and active reasoning.
tests/test_litellm/router_utils/test_reasoning_effort_capability.py Verifies both Foundry model entries advertise the intended reasoning-effort levels.

Reviews (3): Last reviewed commit: "fix(azure): responses none-effort temper..." | Re-trigger Greptile

Comment thread model_prices_and_context_window.json
@codecov

codecov Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@mateo-berri

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri mateo-berri added run-ci and removed run-ci labels Sep 5, 2026
@mateo-berri

Copy link
Copy Markdown
Contributor Author

bugbot run

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit c02f198. Configure here.

@mateo-berri

Copy link
Copy Markdown
Contributor Author

@greptileai

@mateo-berri
mateo-berri merged commit 2f90a26 into litellm_internal_staging Sep 5, 2026
226 of 233 checks passed
@mateo-berri
mateo-berri deleted the litellm_azure_gpt_6_astra branch September 5, 2026 01:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants