feat(pricing): add GovCloud pricing for every live but unpriced Bedrock model - #39764
Conversation
Greptile SummaryAdds comprehensive GovCloud pricing metadata for live Bedrock models that previously lacked regional rows or fell back to commercial pricing.
Confidence Score: 5/5The PR appears safe to merge; no actionable correctness, security, or repository-rule violations were identified. The current changes consistently add the intended GovCloud cost-map rows to both copies of the pricing catalog, preserve the expected provider distinctions between regional and inference-profile keys, and include focused regression coverage for pricing and routing metadata.
|
| Filename | Overview |
|---|---|
| model_prices_and_context_window.json | Adds GovCloud Bedrock pricing and capability rows with consistent regional and inference-profile mappings. |
| litellm/model_prices_and_context_window_backup.json | Mirrors the primary model cost-map changes without detected divergence. |
| tests/test_litellm/test_bedrock_usgov_pricing.py | Broadens pricing tests across Claude, Nemotron, GPT-OSS, Grok, Nova, and Mantle GovCloud entries. |
| whitelisted_bedrock_models.txt | Whitelists the new regional Bedrock chat model identifiers needed for routing. |
Reviews (3): Last reviewed commit: "Merge remote-tracking branch 'origin/lit..." | Re-trigger Greptile
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
…model Every model bedrock list-foundation-models and list-inference-profiles report as live in us-gov-west-1 or us-gov-east-1 now has a priced row: Claude Fable 5.1 (profile plus in-region), Nemotron Nano 9B (profile plus in-region), Grok 4.6 (profile plus Mantle in both regions), the us-gov. Claude 3 Haiku profile in the east, Nova Lite, Micro and the Nova 2 multimodal embeddings in the west, and the Gemma 4 and gpt-oss Mantle SKUs the GovCloud offer files price. Offer-file rates are used where AWS publishes them; Claude rows carry the 1.2x GovCloud premium.
|
bugbot run |
…itellm_govcloud_profiles_lit6421
|
bugbot run |
There was a problem hiding this comment.
✅ 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 036d104. Configure here.
56a61cf
into
litellm_internal_staging
TLDR
Problem this solves:
us-gov.xai.grok-4.6has no row at all, so it prices at $0 and cannot route/spend/calculateHow it solves it:
bedrockchat keys and extends the gov pricing tests to every rowUser Flow
Before: a proxy admin running on GovCloud sees the models both GovCloud regions serve priced at the commercial rate, or not priced at all
bedrock/us-gov.anthropic.claude-fable-5-1,bedrock/us-gov-west-1/amazon.nova-lite-v1:0, andbedrock/us-gov.xai.grok-4.6to their config, plusbedrock_mantle/xai.grok-4.6withaws_region_name: us-gov-east-1, and restartinput_cost_per_token: 0.00001andoutput_cost_per_token: 0.00005(the commercial rate), Nova Lite at6E-8, and theus-gov.xai.grok-4.6deployment with nomodeand0for both prices{"cost":0.035}for Fable,{"cost":0.0}forbedrock/us-gov.xai.grok-4.6, and 500This model isn't mapped yetforbedrock_mantle/us-gov-east-1/xai.grok-4.6bedrock/us-gov.xai.grok-4.6deployment answers 404Unknown provider=None, model=us-gov.xai.grok-4.6. Try calling via converse routeAfter: the same deployments carry the GovCloud rate, and the grok-4.6 profile routes like every other
us-gov.profilebedrock/us-gov.anthropic.claude-fable-5-1,bedrock/us-gov-west-1/amazon.nova-lite-v1:0, andbedrock/us-gov.xai.grok-4.6to their config, plusbedrock_mantle/xai.grok-4.6withaws_region_name: us-gov-east-1, and restartinput_cost_per_token: 0.000012andoutput_cost_per_token: 0.00006, Nova Lite at7.2E-8, andus-gov.xai.grok-4.6as achatmodel at0.00000264/0.00000792{"cost":0.042}for Fable and{"cost":0.0066}for bothbedrock/us-gov.xai.grok-4.6andbedrock_mantle/us-gov-east-1/xai.grok-4.6bedrock/us-gov.xai.grok-4.6deployment reaches Bedrock's converse route and returns Bedrock's own answer (a completion, or the account's own 403 or 429) instead of the routing 404Relevant issues
Follow-up to #39170, which added the Sonnet 5, Opus 4.8, Nemotron, and gpt-oss in-region rows. Pre-existing gaps the QA surfaced are tracked on their own: LIT-6946 (Mantle GovCloud calls bill the commercial row), LIT-6950 (commercial
bedrock_mantle/openai.gpt-oss-20binput rate), LIT-6969 (region-prefixed Bedrock embedding deployments 400)Linear ticket
Resolves LIT-6421
Pre-Submission checklist
Please complete all items before asking a LiteLLM maintainer to review your PR
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@greptileaito re-request a review after pushing changes)Screenshots / Proof of Fix
Shared setup: one proxy per commit (
--num_workers 2), each withLITELLM_LOCAL_MODEL_COST_MAP=Trueso the cost map comes from the checkout, a GovCloud IAM key (AWS_GOV_ACCESS_KEY_ID/AWS_GOV_SECRET_ACCESS_KEY) withAWS_BEARER_TOKEN_BEDROCKblank so SigV4 is used,K='Authorization: Bearer sk-lit6421-qa', Before on port 23872, After on port 51707, and this config:Before (df3b8a6)
GET /model/info prices for the GovCloud rows
curl -s http://127.0.0.1:23872/model/info -H "$K" | jq -r '.data[] | select(.model_name|startswith("gov-")) | [.model_name, .model_info.litellm_provider, .model_info.mode, .model_info.input_cost_per_token, .model_info.output_cost_per_token, .model_info.cache_read_input_token_cost] | @tsv'us-gov.xai.grok-4.6has no row at all:POST /spend/calculate for 1000 prompt + 500 completion tokens
for m in bedrock/us-gov-west-1/anthropic.claude-opus-5 bedrock/us-gov.anthropic.claude-opus-5 bedrock/us-gov.anthropic.claude-fable-5-1 bedrock/us-gov-east-1/anthropic.claude-fable-5-1 bedrock/us-gov.anthropic.claude-3-haiku-20240307-v1:0 bedrock/us-gov.nvidia.nemotron-nano-3-30b bedrock/us-gov.nvidia.nemotron-nano-9b-v2 bedrock/us-gov.nvidia.nemotron-nano-12b-v2 bedrock/us-gov.nvidia.nemotron-super-3-120b bedrock/us-gov.openai.gpt-oss-20b-1:0 bedrock/us-gov.openai.gpt-oss-120b-1:0 bedrock/us-gov.xai.grok-4.6 bedrock/us-gov-west-1/amazon.nova-lite-v1:0 bedrock/us-gov-west-1/amazon.nova-micro-v1:0 bedrock_mantle/us-gov-west-1/xai.grok-4.6 bedrock_mantle/us-gov-west-1/google.gemma-4-e2b bedrock_mantle/us-gov-west-1/google.gemma-4-31b bedrock_mantle/us-gov-west-1/openai.gpt-oss-20b bedrock_mantle/us-gov-east-1/openai.gpt-oss-120b; do curl -s http://127.0.0.1:23872/spend/calculate -H "$K" -H 'Content-Type: application/json' -d "{\"completion_response\": {\"model\": \"$m\", \"usage\": {\"prompt_tokens\": 1000, \"completion_tokens\": 500, \"total_tokens\": 1500}}}"; echo; done0.0forus-gov.xai.grok-4.6, and a 500 for everybedrock_mantle/us-gov-*key, in the same order as the loop:Real completions through Bedrock Mantle in GovCloud, then GET /spend/logs
for m in gov-mantle-grok-4.3 gov-mantle-grok-4.6 gov-mantle-grok-4.6-east gov-mantle-gemma-4-e2b gov-mantle-gpt-oss-20b gov-mantle-opus-5; do curl -s -D - http://127.0.0.1:23872/v1/chat/completions -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}], \"max_tokens\": 20}"; echo; donegov-mantle-grok-4.3:HTTP/1.1 200 OK,x-litellm-response-cost: 9.750000000000001e-05,"usage":{"completion_tokens":20,"prompt_tokens":38,...},"id":"chatcmpl-fuhtipduhoztii5cm3so2lfu4h7y5tl5w2iyxc3j4in5bofmlndq"gov-mantle-grok-4.6(us-gov-west-1):HTTP/1.1 404 Not Found,The model 'xai.grok-4.6' does not exist(west Mantle does not serve it, see Caveats)gov-mantle-grok-4.6-east(us-gov-east-1):HTTP/1.1 200 OK,x-litellm-response-cost: 0.00018920000000000002,"usage":{"completion_tokens":20,"prompt_tokens":26,...},"id":"chatcmpl-waucf3ymnroihjskcfbzfxx3vypnt2zklmirfyxok3mwxib5sxpq"gov-mantle-gemma-4-e2b:HTTP/1.1 200 OK,x-litellm-response-cost: 1.72e-06,"content":"GovCloud","id":"chatcmpl-k5nrqinks5gi63x3mpcj6hfz7hq5op4pzesgpqfmyddatv22qphq"gov-mantle-gpt-oss-20b:HTTP/1.1 200 OK,x-litellm-response-cost: 1.1625e-05,"usage":{"completion_tokens":20,"prompt_tokens":75,...},"id":"chatcmpl-0fd7d281-91a0-4927-b246-d8c79c1f647e"gov-mantle-opus-5:HTTP/1.1 400 Bad Request,The model 'anthropic.claude-opus-5' does not support the '/v1/chat/completions' API(Mantle serves Claude over its messages API only, see Caveats)curl -s "http://127.0.0.1:23872/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider}'Bedrock-native GovCloud completions (us-gov. profiles and in-region Nova), then GET /spend/logs
for m in gov-opus-5-geo gov-fable-5-1-geo gov-haiku-geo-east gov-nemotron-nano-3-30b-geo gov-nemotron-nano-9b-v2-geo gov-nemotron-nano-12b-v2-geo gov-nemotron-super-3-120b-geo gov-gpt-oss-20b-geo gov-gpt-oss-120b-geo gov-grok-4.6-geo gov-nova-lite gov-nova-micro; do curl -s -D - http://127.0.0.1:23872/v1/chat/completions -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}], \"max_tokens\": 20}"; echo; donegov-opus-5-geo,gov-fable-5-1-geo,gov-haiku-geo-east:HTTP/1.1 403 Forbidden,You don't have access to the model with the specified model ID.(Bedrock only grants the Anthropic agreement from the associated standard account, see Caveats)nemotron-nano-3-30b: 24 x 6e-08 + 4 x 2.4e-07 = 2.4e-06):gov-grok-4.6-geo:HTTP/1.1 404 Not Found,Bedrock Invoke HTTPX: Unknown provider=None, model=us-gov.xai.grok-4.6. Try calling via converse route(no row, so the proxy cannot route it)curl -s "http://127.0.0.1:23872/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider}'Embeddings through Nova 2 multimodal embeddings in us-gov-west-1
for m in gov-nova-2-embed gov-nova-2-embed-region; do curl -s -D - http://127.0.0.1:23872/v1/embeddings -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"input\": \"GovCloud\"}"; echo; donegov-nova-2-embed(bedrock/us-gov-west-1/amazon.nova-2-multimodal-embeddings-v1:0):HTTP/1.1 400 Bad Request,The provided model identifier is invalid.(the embedding path sends the region prefix to Bedrock, LIT-6969, pre-existing)gov-nova-2-embed-region(bedrock/amazon.nova-2-multimodal-embeddings-v1:0+aws_region_name: us-gov-west-1):HTTP/1.1 200 OK,x-litellm-response-cost: 0.00010368000000000001(768 x 1.35e-07, the commercial row: a region-only key never resolves the gov row, so the new embedding row is not reachable live until LIT-6969, see Caveats)The same deployments through POST /v1/messages and POST /v1/responses, then GET /spend/logs
for m in gov-nemotron-nano-3-30b-geo gov-nova-micro; do curl -s -D - http://127.0.0.1:23872/v1/messages -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"max_tokens\": 20, \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}]}"; echo; curl -s -D - http://127.0.0.1:23872/v1/responses -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"max_output_tokens\": 20, \"input\": \"Reply with the single word GovCloud.\"}"; echo; donecurl -s "http://127.0.0.1:23872/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider, call_type}'/v1/messagesrows carry the same spend; the/v1/responseslookups byresp_id return[]on both legs (the spend row is keyed by the litellm call id there, pre-existing):GET /model_group/info prices for the GovCloud groups
curl -s http://127.0.0.1:23872/model_group/info -H "$K" | jq -r '.data[] | select(.model_group|startswith("gov-")) | [.model_group, .input_cost_per_token, .output_cost_per_token, (.providers|join(","))] | @tsv'/model/infoabove, group by group (commercial row on every gov group)After (036d104)
GET /model/info prices for the GovCloud rows
curl -s http://127.0.0.1:51707/model/info -H "$K" | jq -r '.data[] | select(.model_name|startswith("gov-")) | [.model_name, .model_info.litellm_provider, .model_info.mode, .model_info.input_cost_per_token, .model_info.output_cost_per_token, .model_info.cache_read_input_token_cost] | @tsv'bedrockrows,us-gov.profiles arebedrock_converse); thegov-mantle-*deployments still show the commercial row (LIT-6946):POST /spend/calculate for 1000 prompt + 500 completion tokens
for m in bedrock/us-gov-west-1/anthropic.claude-opus-5 bedrock/us-gov.anthropic.claude-opus-5 bedrock/us-gov.anthropic.claude-fable-5-1 bedrock/us-gov-east-1/anthropic.claude-fable-5-1 bedrock/us-gov.anthropic.claude-3-haiku-20240307-v1:0 bedrock/us-gov.nvidia.nemotron-nano-3-30b bedrock/us-gov.nvidia.nemotron-nano-9b-v2 bedrock/us-gov.nvidia.nemotron-nano-12b-v2 bedrock/us-gov.nvidia.nemotron-super-3-120b bedrock/us-gov.openai.gpt-oss-20b-1:0 bedrock/us-gov.openai.gpt-oss-120b-1:0 bedrock/us-gov.xai.grok-4.6 bedrock/us-gov-west-1/amazon.nova-lite-v1:0 bedrock/us-gov-west-1/amazon.nova-micro-v1:0 bedrock_mantle/us-gov-west-1/xai.grok-4.6 bedrock_mantle/us-gov-west-1/google.gemma-4-e2b bedrock_mantle/us-gov-west-1/google.gemma-4-31b bedrock_mantle/us-gov-west-1/openai.gpt-oss-20b bedrock_mantle/us-gov-east-1/openai.gpt-oss-120b; do curl -s http://127.0.0.1:51707/spend/calculate -H "$K" -H 'Content-Type: application/json' -d "{\"completion_response\": {\"model\": \"$m\", \"usage\": {\"prompt_tokens\": 1000, \"completion_tokens\": 500, \"total_tokens\": 1500}}}"; echo; donebedrock_mantle/us-gov-*keys now price:Real completions through Bedrock Mantle in GovCloud, then GET /spend/logs
for m in gov-mantle-grok-4.3 gov-mantle-grok-4.6 gov-mantle-grok-4.6-east gov-mantle-gemma-4-e2b gov-mantle-gpt-oss-20b gov-mantle-opus-5; do curl -s -D - http://127.0.0.1:51707/v1/chat/completions -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}], \"max_tokens\": 20}"; echo; donegov-mantle-grok-4.3:HTTP/1.1 200 OK,x-litellm-response-cost: 9.750000000000001e-05,"usage":{"completion_tokens":20,"prompt_tokens":38,...},"id":"chatcmpl-taws6jqclxgxu3k3z7in2dh5qt54igltdqdl5snoywjmp2rl5ahq"gov-mantle-grok-4.6(us-gov-west-1):HTTP/1.1 404 Not Found,The model 'xai.grok-4.6' does not exist(west Mantle does not serve it, see Caveats)gov-mantle-grok-4.6-east(us-gov-east-1):HTTP/1.1 200 OK,x-litellm-response-cost: 0.00018920000000000002,"usage":{"completion_tokens":20,"prompt_tokens":26,...},"id":"chatcmpl-eikwzhip6qiihl4lk5ubysy777cakaiubclihcvbcgffj3ubr6ua"gov-mantle-gemma-4-e2b:HTTP/1.1 200 OK,x-litellm-response-cost: 1.72e-06,"content":"GovCloud","id":"chatcmpl-dv3ujxr4mzuqpcaip3cb64hupyxujm7vxkiof3p6nfkfuamaudva"gov-mantle-gpt-oss-20b:HTTP/1.1 200 OK,x-litellm-response-cost: 1.1625e-05,"usage":{"completion_tokens":20,"prompt_tokens":75,...},"id":"chatcmpl-94943338-d131-413e-9ef0-85548b884df4"gov-mantle-opus-5:HTTP/1.1 400 Bad Request,The model 'anthropic.claude-opus-5' does not support the '/v1/chat/completions' API(Mantle serves Claude over its messages API only, see Caveats)curl -s "http://127.0.0.1:51707/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider}'Bedrock-native GovCloud completions (us-gov. profiles and in-region Nova), then GET /spend/logs
for m in gov-opus-5-geo gov-fable-5-1-geo gov-haiku-geo-east gov-nemotron-nano-3-30b-geo gov-nemotron-nano-9b-v2-geo gov-nemotron-nano-12b-v2-geo gov-nemotron-super-3-120b-geo gov-gpt-oss-20b-geo gov-gpt-oss-120b-geo gov-grok-4.6-geo gov-nova-lite gov-nova-micro; do curl -s -D - http://127.0.0.1:51707/v1/chat/completions -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}], \"max_tokens\": 20}"; echo; donegov-opus-5-geo,gov-fable-5-1-geo,gov-haiku-geo-east:HTTP/1.1 403 Forbidden,You don't have access to the model with the specified model ID.(Bedrock only grants the Anthropic agreement from the associated standard account, see Caveats)nemotron-nano-3-30b: 24 x 7.2e-08 + 4 x 2.88e-07 = 2.88e-06):gov-grok-4.6-geo:HTTP/1.1 429 Too Many Requests,Too many tokens per day, please wait before trying again.(the new row routes it through converse like the other profiles, so it now reaches Bedrock, which throttles the freshly enabled model, see Caveats)curl -s "http://127.0.0.1:51707/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider}'Embeddings through Nova 2 multimodal embeddings in us-gov-west-1
for m in gov-nova-2-embed gov-nova-2-embed-region; do curl -s -D - http://127.0.0.1:51707/v1/embeddings -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"input\": \"GovCloud\"}"; echo; donegov-nova-2-embed(bedrock/us-gov-west-1/amazon.nova-2-multimodal-embeddings-v1:0):HTTP/1.1 400 Bad Request,The provided model identifier is invalid.(the embedding path sends the region prefix to Bedrock, LIT-6969, pre-existing)gov-nova-2-embed-region(bedrock/amazon.nova-2-multimodal-embeddings-v1:0+aws_region_name: us-gov-west-1):HTTP/1.1 200 OK,x-litellm-response-cost: 0.00010368000000000001(768 x 1.35e-07, the commercial row: a region-only key never resolves the gov row, so the new embedding row is not reachable live until LIT-6969, see Caveats)The same deployments through POST /v1/messages and POST /v1/responses, then GET /spend/logs
for m in gov-nemotron-nano-3-30b-geo gov-nova-micro; do curl -s -D - http://127.0.0.1:51707/v1/messages -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"max_tokens\": 20, \"messages\": [{\"role\": \"user\", \"content\": \"Reply with the single word GovCloud.\"}]}"; echo; curl -s -D - http://127.0.0.1:51707/v1/responses -H "$K" -H 'Content-Type: application/json' -d "{\"model\": \"$m\", \"max_output_tokens\": 20, \"input\": \"Reply with the single word GovCloud.\"}"; echo; donecurl -s "http://127.0.0.1:51707/spend/logs?request_id=<the id field of each 200 response>" -H "$K" | jq -c '.[] | {model, spend, prompt_tokens, completion_tokens, custom_llm_provider, call_type}'/v1/messagesrows carry the same spend; the/v1/responseslookups byresp_id return[]on both legs (the spend row is keyed by the litellm call id there, pre-existing):GET /model_group/info prices for the GovCloud groups
curl -s http://127.0.0.1:51707/model_group/info -H "$K" | jq -r '.data[] | select(.model_group|startswith("gov-")) | [.model_group, .input_cost_per_token, .output_cost_per_token, (.providers|join(","))] | @tsv'/model/infoabove, group by group (1.2x GovCloud row on every gov group)Type
🆕 New Feature
Caveats (if any)
Medium
us-gov.anthropic.*,bedrock/us-gov-*/anthropic.*) have no live completion in the proof: Bedrock refuses the Anthropic access agreement from a GovCloud account (You must use your associated standard AWS account to establish a model access agreement), so every Claude deployment 403s on both legs/model/infoand/spend/calculatepaths the proof exercises for every row, and the Nemotron, gpt-oss, and Nova completions prove the live 1.2x spend rows through the same lookuptitan-embed-text-v2gov row) and the region-only key resolves the commercial row, so the newus-gov-west-1/amazon.nova-2-multimodal-embeddings-v1:0row is reachable through/spend/calculateandbase_modelonly until LIT-6969 landsbedrock_mantle/us-gov-*rows are reachable through/spend/calculateandbase_modelonlyLow
search_context_cost_per_querylike every existing gov Claude row (Bedrock has no Anthropic web search tool)bedrock_mantle/anthropic.*400s on chat completionsus-gov.xai.grok-4.6reaches Bedrock on the After leg but Bedrock throttles it (Too many tokens per day) right after the model was enabled, so its live spend row is unproven;/spend/calculateand/model/infocover its 1.2x rowbedrock_mantle/openai.gpt-oss-20binput rate is 7.5e-08 where the offer file says 7e-08 (LIT-6950); the gov row is 1.2x the offer fileresponses-caching-types3.10/3.11 andproxy-infra3.10 that were red at the previous tip: this tip merges staging at df3b8a6, which carries their fixes test(caching): drive the redis stall burst off the clock, not asyncio.wait_for #39773 and fix(proxy): strip every TypedDict qualifier before numeric form-field detection #39780 (LIT-6947) and test: repair four chronically failing CI tests #39770 for the CircleCI reds at that tip (build_and_test,litellm_router_unit_testingLIT-6911,proxy_store_model_in_db_testsLIT-6949); CircleCI pipeline 89155 at this tip has one red,proxy_store_model_in_db_testsontest_chat_completion_bad_model_with_spend_logs, which fails the same way on every staging scheduled run since test: repair four chronically failing CI tests #39770 landed (89097 through 89149 at the merge base, LIT-6949): the request is rejected before the router, nothing this PR touches, and test(store_model_in_db): assert the 400 contract in the unknown-model spend log test #39842 (merged 03:29Z, after this merge ref) repaired the test, so the landing merge onto staging carries itgemma-4-e2bbilled 1.72e-06 for 37+3 tokens on both legs (1.08e-06 in the previous run against the same 4e-08/8e-08 commercial row): a staging change between merge bases corrected the arithmetic; this PR leaves it aloneFinal Attestation
Note
Low Risk
Data-only pricing and whitelist updates with strong regression tests; wrong numbers would mis-bill GovCloud usage but do not change core auth or request handling.
Overview
Adds GovCloud (1.2× commercial) cost-map rows for Bedrock models that were live in GovCloud but missing or falling back to commercial rates—including
us-gov.xai.grok-4.6, Claude Opus 5 / Fable 5.1, Claude 3 Haiku on theus-gov.profile, Nova Lite/Micro and Nova 2 multimodal embeddings (west only), Nemotron nano-9b-v2, and regionalbedrock,bedrock_converse, andbedrock_mantlekeys in us-gov-east-1 and us-gov-west-1 where AWS offer files list SKUs.The same entries are mirrored in
model_prices_and_context_window.jsonand its backup.whitelisted_bedrock_models.txtgains the new in-region chat keys (Nova lite/micro, Nemotron 9b, Opus 5, Fable 5.1).tests/test_litellm/test_bedrock_usgov_pricing.pyis expanded to assert absolute GovCloud rates, the 1.2× ratio vs commercial bases, provider/key shapes, region-only vs profile rows, Mantle/Grok/Nova embedding meters, and that gov rows keep commercial limits/capabilities aside from price.Reviewed by Cursor Bugbot for commit bef3585. Bugbot is set up for automated code reviews on this repo. Configure here.