Skip to content

feat(pricing): add GovCloud pricing for every live but unpriced Bedrock model - #39764

Merged
mateo-berri merged 5 commits into
litellm_internal_stagingfrom
litellm_govcloud_profiles_lit6421
Sep 6, 2026
Merged

feat(pricing): add GovCloud pricing for every live but unpriced Bedrock model#39764
mateo-berri merged 5 commits into
litellm_internal_stagingfrom
litellm_govcloud_profiles_lit6421

Conversation

@mateo-berri

@mateo-berri mateo-berri commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

TLDR

Problem this solves:

  • Both GovCloud regions serve 28 Bedrock models that have no gov price row
  • They bill at the commercial rate, 20% under what AWS charges on GovCloud
  • us-gov.xai.grok-4.6 has no row at all, so it prices at $0 and cannot route
  • The GovCloud Mantle catalog (grok-4.6, gemma-4, gpt-oss) 500s on /spend/calculate

How it solves it:

  • Adds the 28 rows at 1.2x commercial, matching the GovCloud offer files for every non-Claude model
  • Claude rows use the same 1.2x premium AWS quotes for Opus 4.8 on GovCloud
  • Whitelists the new in-region bedrock chat keys and extends the gov pricing tests to every row

User 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

  1. They add bedrock/us-gov.anthropic.claude-fable-5-1, bedrock/us-gov-west-1/amazon.nova-lite-v1:0, and bedrock/us-gov.xai.grok-4.6 to their config, plus bedrock_mantle/xai.grok-4.6 with aws_region_name: us-gov-east-1, and restart
  2. GET http://localhost:4000/model/info returns the Fable deployment at input_cost_per_token: 0.00001 and output_cost_per_token: 0.00005 (the commercial rate), Nova Lite at 6E-8, and the us-gov.xai.grok-4.6 deployment with no mode and 0 for both prices
  3. POST http://localhost:4000/spend/calculate for 1000 prompt + 500 completion tokens answers {"cost":0.035} for Fable, {"cost":0.0} for bedrock/us-gov.xai.grok-4.6, and 500 This model isn't mapped yet for bedrock_mantle/us-gov-east-1/xai.grok-4.6
  4. POST http://localhost:4000/v1/chat/completions to the bedrock/us-gov.xai.grok-4.6 deployment answers 404 Unknown provider=None, model=us-gov.xai.grok-4.6. Try calling via converse route

After: the same deployments carry the GovCloud rate, and the grok-4.6 profile routes like every other us-gov. profile

  1. They add bedrock/us-gov.anthropic.claude-fable-5-1, bedrock/us-gov-west-1/amazon.nova-lite-v1:0, and bedrock/us-gov.xai.grok-4.6 to their config, plus bedrock_mantle/xai.grok-4.6 with aws_region_name: us-gov-east-1, and restart
  2. GET http://localhost:4000/model/info returns Fable at input_cost_per_token: 0.000012 and output_cost_per_token: 0.00006, Nova Lite at 7.2E-8, and us-gov.xai.grok-4.6 as a chat model at 0.00000264 / 0.00000792
  3. POST http://localhost:4000/spend/calculate for the same tokens answers {"cost":0.042} for Fable and {"cost":0.0066} for both bedrock/us-gov.xai.grok-4.6 and bedrock_mantle/us-gov-east-1/xai.grok-4.6
  4. POST http://localhost:4000/v1/chat/completions to the bedrock/us-gov.xai.grok-4.6 deployment 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 404

Relevant 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-20b input 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

  • 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)

Screenshots / Proof of Fix

Shared setup: one proxy per commit (--num_workers 2), each with LITELLM_LOCAL_MODEL_COST_MAP=True so the cost map comes from the checkout, a GovCloud IAM key (AWS_GOV_ACCESS_KEY_ID / AWS_GOV_SECRET_ACCESS_KEY) with AWS_BEARER_TOKEN_BEDROCK blank so SigV4 is used, K='Authorization: Bearer sk-lit6421-qa', Before on port 23872, After on port 51707, and this config:

model_list:
  - model_name: gov-opus-5
    litellm_params: {model: bedrock/us-gov-west-1/anthropic.claude-opus-5, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-opus-5-east
    litellm_params: {model: bedrock/us-gov-east-1/anthropic.claude-opus-5, aws_region_name: us-gov-east-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-opus-5-geo
    litellm_params: {model: bedrock/us-gov.anthropic.claude-opus-5, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-fable-5-1-geo
    litellm_params: {model: bedrock/us-gov.anthropic.claude-fable-5-1, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-haiku-geo-east
    litellm_params: {model: bedrock/us-gov.anthropic.claude-3-haiku-20240307-v1:0, aws_region_name: us-gov-east-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nemotron-nano-3-30b-geo
    litellm_params: {model: bedrock/us-gov.nvidia.nemotron-nano-3-30b, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nemotron-nano-9b-v2-geo
    litellm_params: {model: bedrock/us-gov.nvidia.nemotron-nano-9b-v2, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nemotron-nano-12b-v2-geo
    litellm_params: {model: bedrock/us-gov.nvidia.nemotron-nano-12b-v2, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nemotron-super-3-120b-geo
    litellm_params: {model: bedrock/us-gov.nvidia.nemotron-super-3-120b, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-gpt-oss-20b-geo
    litellm_params: {model: bedrock/us-gov.openai.gpt-oss-20b-1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-gpt-oss-120b-geo
    litellm_params: {model: bedrock/us-gov.openai.gpt-oss-120b-1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-grok-4.6-geo
    litellm_params: {model: bedrock/us-gov.xai.grok-4.6, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nova-lite
    litellm_params: {model: bedrock/us-gov-west-1/amazon.nova-lite-v1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nova-micro
    litellm_params: {model: bedrock/us-gov-west-1/amazon.nova-micro-v1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nova-2-embed
    litellm_params: {model: bedrock/us-gov-west-1/amazon.nova-2-multimodal-embeddings-v1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-grok-4.3
    litellm_params: {model: bedrock_mantle/xai.grok-4.3, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-grok-4.6
    litellm_params: {model: bedrock_mantle/xai.grok-4.6, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-gemma-4-e2b
    litellm_params: {model: bedrock_mantle/google.gemma-4-e2b, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-gpt-oss-20b
    litellm_params: {model: bedrock_mantle/openai.gpt-oss-20b, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-grok-4.6-east
    litellm_params: {model: bedrock_mantle/xai.grok-4.6, aws_region_name: us-gov-east-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-mantle-opus-5
    litellm_params: {model: bedrock_mantle/anthropic.claude-opus-5, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
  - model_name: gov-nova-2-embed-region
    litellm_params: {model: bedrock/amazon.nova-2-multimodal-embeddings-v1:0, aws_region_name: us-gov-west-1, aws_access_key_id: os.environ/AWS_GOV_ACCESS_KEY_ID, aws_secret_access_key: os.environ/AWS_GOV_SECRET_ACCESS_KEY}
general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

Before (df3b8a6)

GET /model/info prices for the GovCloud rows

  1. 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'
  2. Every gov deployment falls back to its commercial row, and us-gov.xai.grok-4.6 has no row at all:
    gov-opus-5	bedrock_converse	chat	0.000005	0.000025	5E-7
    gov-opus-5-east	bedrock_converse	chat	0.000005	0.000025	5E-7
    gov-opus-5-geo	bedrock_converse	chat	0.000005	0.000025	5E-7
    gov-fable-5-1-geo	bedrock_converse	chat	0.00001	0.00005	2.5E-7
    gov-haiku-geo-east	bedrock	chat	2.5E-7	0.00000125	2.5E-8
    gov-nemotron-nano-3-30b-geo	bedrock_converse	chat	6E-8	2.4E-7
    gov-nemotron-nano-9b-v2-geo	bedrock_converse	chat	6E-8	2.3E-7
    gov-nemotron-nano-12b-v2-geo	bedrock_converse	chat	2E-7	6E-7
    gov-nemotron-super-3-120b-geo	bedrock_converse	chat	1.5E-7	6.5E-7
    gov-gpt-oss-20b-geo	bedrock_converse	chat	7E-8	3E-7
    gov-gpt-oss-120b-geo	bedrock_converse	chat	1.5E-7	6E-7
    gov-grok-4.6-geo	bedrock		0	0
    gov-nova-lite	bedrock_converse	chat	6E-8	2.4E-7
    gov-nova-micro	bedrock_converse	chat	3.5E-8	1.4E-7
    gov-nova-2-embed	bedrock	embedding	1.35E-7	0.0
    gov-mantle-grok-4.3	bedrock_mantle	chat	0.00000125	0.0000025	2E-7
    gov-mantle-grok-4.6	bedrock_mantle	chat	0.0000022	0.0000066	5.5E-7
    gov-mantle-gemma-4-e2b	bedrock_mantle	chat	4E-8	8E-8
    gov-mantle-gpt-oss-20b	bedrock_mantle	chat	7.5E-8	3E-7
    gov-mantle-grok-4.6-east	bedrock_mantle	chat	0.0000022	0.0000066	5.5E-7
    gov-mantle-opus-5	bedrock_converse	chat	0.000005	0.000025	5E-7
    gov-nova-2-embed-region	bedrock	embedding	1.35E-7	0.0
    

POST /spend/calculate for 1000 prompt + 500 completion tokens

  1. 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; done
  2. Commercial costs, 0.0 for us-gov.xai.grok-4.6, and a 500 for every bedrock_mantle/us-gov-* key, in the same order as the loop:
    {"cost":0.0175}
    {"cost":0.0175}
    {"cost":0.035}
    {"cost":0.035}
    {"cost":0.000875}
    {"cost":0.00017999999999999998}
    {"cost":0.000175}
    {"cost":0.0005}
    {"cost":0.00047499999999999994}
    {"cost":0.00021999999999999998}
    {"cost":0.00045}
    {"cost":0.0}
    {"cost":0.00017999999999999998}
    {"cost":0.000105}
    {"error":{"message":"This model isn't mapped yet. model=bedrock_mantle/us-gov-west-1/xai.grok-4.6, custom_llm_provider=bedrock_mantle. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
    {"error":{"message":"This model isn't mapped yet. model=bedrock_mantle/us-gov-west-1/google.gemma-4-e2b, custom_llm_provider=bedrock_mantle. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
    {"error":{"message":"This model isn't mapped yet. model=bedrock_mantle/us-gov-west-1/google.gemma-4-31b, custom_llm_provider=bedrock_mantle. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
    {"error":{"message":"This model isn't mapped yet. model=bedrock_mantle/us-gov-west-1/openai.gpt-oss-20b, custom_llm_provider=bedrock_mantle. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
    {"error":{"message":"This model isn't mapped yet. model=bedrock_mantle/us-gov-east-1/openai.gpt-oss-120b, custom_llm_provider=bedrock_mantle. Add it here - https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json.","type":"None","param":"None","code":"500"}}
    

Real completions through Bedrock Mantle in GovCloud, then GET /spend/logs

  1. 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; done
  2. gov-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"
  3. 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)
  4. 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"
  5. gov-mantle-gemma-4-e2b: HTTP/1.1 200 OK, x-litellm-response-cost: 1.72e-06, "content":"GovCloud", "id":"chatcmpl-k5nrqinks5gi63x3mpcj6hfz7hq5op4pzesgpqfmyddatv22qphq"
  6. 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"
  7. 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)
  8. 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}'
  9. One spend row per 200, each at the commercial Mantle rate because the provider looks the commercial row up (LIT-6946, untouched here):
    {"model":"bedrock_mantle/xai.grok-4.3","spend":0.00009750000000000001,"prompt_tokens":38,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/xai.grok-4.6","spend":0.0001892,"prompt_tokens":26,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/google.gemma-4-e2b","spend":0.00000172,"prompt_tokens":37,"completion_tokens":3,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/openai.gpt-oss-20b","spend":0.000011625,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    

Bedrock-native GovCloud completions (us-gov. profiles and in-region Nova), then GET /spend/logs

  1. 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; done
  2. gov-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)
  3. Every Nemotron, gpt-oss, and Nova deployment completes, billed at the commercial rate (nemotron-nano-3-30b: 24 x 6e-08 + 4 x 2.4e-07 = 2.4e-06):
    gov-nemotron-nano-3-30b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 2.4e-06	"id":"chatcmpl-90be0c76-7aa2-48f6-af9c-a87296832c0a"
    gov-nemotron-nano-9b-v2-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 5.8e-06	"id":"chatcmpl-70fbca6a-71e0-4607-8e1e-47ccc3756b27"
    gov-nemotron-nano-12b-v2-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 7.6e-06	"id":"chatcmpl-0fdba32d-8933-492f-97d0-22289462e5e1"
    gov-nemotron-super-3-120b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 6.2e-06	"id":"chatcmpl-7aa2c1f1-527a-41a5-b4fd-2dc11c91017b"
    gov-gpt-oss-20b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 1.1249999999999999e-05	"id":"chatcmpl-d408a220-e04f-4b8c-a389-6a57b6071d3a"
    gov-gpt-oss-120b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 2.3249999999999996e-05	"id":"chatcmpl-c8f8d799-de36-4fb0-97a5-3d823b0bc44e"
    gov-nova-lite	HTTP/1.1 200 OK	x-litellm-response-cost: 1.2e-06	"id":"chatcmpl-85df6502-d21d-4d3e-b00c-65179c28f03b"
    gov-nova-micro	HTTP/1.1 200 OK	x-litellm-response-cost: 7.000000000000001e-07	"id":"chatcmpl-b2ac111c-680f-4105-8266-0b5972f91485"
    
  4. 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)
  5. 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}'
  6. One spend row per 200, each at the commercial rate of the fallback row:
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-3-30b","spend":0.0000024,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-9b-v2","spend":0.0000058,"prompt_tokens":20,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-12b-v2","spend":0.0000076,"prompt_tokens":23,"completion_tokens":5,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-super-3-120b","spend":0.0000062,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.openai.gpt-oss-20b-1:0","spend":0.00001125,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.openai.gpt-oss-120b-1:0","spend":0.00002325,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-lite-v1:0","spend":0.0000012,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-micro-v1:0","spend":7.000000000000001E-7,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock"}
    

Embeddings through Nova 2 multimodal embeddings in us-gov-west-1

  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; done
  2. gov-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)
  3. 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

  1. 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; done
  2. Both endpoints bill the commercial row for the same token counts as the chat completions above:
    gov-nemotron-nano-3-30b-geo	/v1/messages	HTTP/1.1 200 OK	x-litellm-response-cost: 2.4e-06	"usage":{"input_tokens":24,"output_tokens":4}	"id":"chatcmpl-9206e67e-7c98-4a8f-a490-164976765d5f"
    gov-nemotron-nano-3-30b-geo	/v1/responses	HTTP/1.1 200 OK	x-litellm-response-cost: 2.4e-06	"text":"GovCloud"	"id":"resp_AKKNTVxfhOhk9KhLrFKyP6SncR5TUL3tQq8..."
    gov-nova-micro	/v1/messages	HTTP/1.1 200 OK	x-litellm-response-cost: 7.000000000000001e-07	"usage":{"input_tokens":8,"output_tokens":3}	"id":"chatcmpl-060bac80-4146-48b4-92c7-325162756998"
    gov-nova-micro	/v1/responses	HTTP/1.1 200 OK	x-litellm-response-cost: 7.000000000000001e-07	"text":"GovCloud"	"id":"resp_jlGiIeG8_oG9YHKEMqI7ui5YWN98rliDKwj..."
    
  3. 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, call_type}'
  4. The /v1/messages rows carry the same spend; the /v1/responses lookups by resp_ id return [] on both legs (the spend row is keyed by the litellm call id there, pre-existing):
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-3-30b","spend":0.0000024,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock","call_type":"anthropic_messages"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-micro-v1:0","spend":7.000000000000001E-7,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock","call_type":"anthropic_messages"}
    

GET /model_group/info prices for the GovCloud groups

  1. 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'
  2. The same per-token prices as /model/info above, group by group (commercial row on every gov group)

After (036d104)

GET /model/info prices for the GovCloud rows

  1. 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'
  2. Every gov deployment resolves to its own 1.2x row (in-region keys are bedrock rows, us-gov. profiles are bedrock_converse); the gov-mantle-* deployments still show the commercial row (LIT-6946):
    gov-opus-5	bedrock	chat	0.000006	0.00003	6E-7
    gov-opus-5-east	bedrock	chat	0.000006	0.00003	6E-7
    gov-opus-5-geo	bedrock_converse	chat	0.000006	0.00003	6E-7
    gov-fable-5-1-geo	bedrock_converse	chat	0.000012	0.00006	3E-7
    gov-haiku-geo-east	bedrock_converse	chat	3E-7	0.0000015	3E-8
    gov-nemotron-nano-3-30b-geo	bedrock_converse	chat	7.2E-8	2.88E-7
    gov-nemotron-nano-9b-v2-geo	bedrock_converse	chat	7.2E-8	2.76E-7
    gov-nemotron-nano-12b-v2-geo	bedrock_converse	chat	2.4E-7	7.2E-7
    gov-nemotron-super-3-120b-geo	bedrock_converse	chat	1.8E-7	7.8E-7
    gov-gpt-oss-20b-geo	bedrock_converse	chat	8.4E-8	3.6E-7
    gov-gpt-oss-120b-geo	bedrock_converse	chat	1.8E-7	7.2E-7
    gov-grok-4.6-geo	bedrock_converse	chat	0.00000264	0.00000792	6.6E-7
    gov-nova-lite	bedrock	chat	7.2E-8	2.88E-7
    gov-nova-micro	bedrock	chat	4.2E-8	1.68E-7
    gov-nova-2-embed	bedrock	embedding	1.62E-7	0.0
    gov-mantle-grok-4.3	bedrock_mantle	chat	0.00000125	0.0000025	2E-7
    gov-mantle-grok-4.6	bedrock_mantle	chat	0.0000022	0.0000066	5.5E-7
    gov-mantle-gemma-4-e2b	bedrock_mantle	chat	4E-8	8E-8
    gov-mantle-gpt-oss-20b	bedrock_mantle	chat	7.5E-8	3E-7
    gov-mantle-grok-4.6-east	bedrock_mantle	chat	0.0000022	0.0000066	5.5E-7
    gov-mantle-opus-5	bedrock_converse	chat	0.000005	0.000025	5E-7
    gov-nova-2-embed-region	bedrock	embedding	1.35E-7	0.0
    

POST /spend/calculate for 1000 prompt + 500 completion tokens

  1. 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; done
  2. GovCloud costs, 1.2x the Before values in the same order (Fable: 1000 x 1.2e-05 + 500 x 6e-05 = 0.042; grok-4.6: 1000 x 2.64e-06 + 500 x 7.92e-06 = 0.0066), and the five bedrock_mantle/us-gov-* keys now price:
    {"cost":0.021}
    {"cost":0.021}
    {"cost":0.042}
    {"cost":0.042}
    {"cost":0.00105}
    {"cost":0.000216}
    {"cost":0.00021}
    {"cost":0.0006}
    {"cost":0.00057}
    {"cost":0.00026399999999999997}
    {"cost":0.0005399999999999999}
    {"cost":0.0066}
    {"cost":0.000216}
    {"cost":0.000126}
    {"cost":0.0066}
    {"cost":9.6e-05}
    {"cost":0.00040799999999999994}
    {"cost":0.00026399999999999997}
    {"cost":0.0005399999999999999}
    

Real completions through Bedrock Mantle in GovCloud, then GET /spend/logs

  1. 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; done
  2. gov-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"
  3. 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)
  4. 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"
  5. gov-mantle-gemma-4-e2b: HTTP/1.1 200 OK, x-litellm-response-cost: 1.72e-06, "content":"GovCloud", "id":"chatcmpl-dv3ujxr4mzuqpcaip3cb64hupyxujm7vxkiof3p6nfkfuamaudva"
  6. 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"
  7. 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)
  8. 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}'
  9. One spend row per 200, each at the commercial Mantle rate because the provider looks the commercial row up (LIT-6946, untouched here):
    {"model":"bedrock_mantle/xai.grok-4.3","spend":0.00009750000000000001,"prompt_tokens":38,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/xai.grok-4.6","spend":0.0001892,"prompt_tokens":26,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/google.gemma-4-e2b","spend":0.00000172,"prompt_tokens":37,"completion_tokens":3,"custom_llm_provider":"bedrock_mantle"}
    {"model":"bedrock_mantle/openai.gpt-oss-20b","spend":0.000011625,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock_mantle"}
    

Bedrock-native GovCloud completions (us-gov. profiles and in-region Nova), then GET /spend/logs

  1. 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; done
  2. gov-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)
  3. Every Nemotron, gpt-oss, and Nova deployment completes, billed at exactly 1.2x the Before cost for the same token counts (nemotron-nano-3-30b: 24 x 7.2e-08 + 4 x 2.88e-07 = 2.88e-06):
    gov-nemotron-nano-3-30b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 2.8799999999999995e-06	"id":"chatcmpl-7af325aa-4ba6-4c57-8e43-3ec73a51d085"
    gov-nemotron-nano-9b-v2-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 6.9599999999999994e-06	"id":"chatcmpl-f5078b8e-bf70-4d9e-a68a-01d81da15212"
    gov-nemotron-nano-12b-v2-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 9.119999999999999e-06	"id":"chatcmpl-0c0d97e8-ca08-4a40-949f-2383a4baefa8"
    gov-nemotron-super-3-120b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 7.44e-06	"id":"chatcmpl-b8237133-19a2-4e9b-a15f-29ec46bed928"
    gov-gpt-oss-20b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 1.35e-05	"id":"chatcmpl-b86006f5-9ff0-4068-a56a-f7186d503402"
    gov-gpt-oss-120b-geo	HTTP/1.1 200 OK	x-litellm-response-cost: 2.79e-05	"id":"chatcmpl-d97c8db2-5cfc-4b23-a4f3-958befc0506c"
    gov-nova-lite	HTTP/1.1 200 OK	x-litellm-response-cost: 1.4399999999999998e-06	"id":"chatcmpl-cfe7ee88-3732-49a7-87c3-ed616411a7ba"
    gov-nova-micro	HTTP/1.1 200 OK	x-litellm-response-cost: 8.4e-07	"id":"chatcmpl-31207d27-603b-41da-bc05-81a8f10660e3"
    
  4. 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)
  5. 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}'
  6. One spend row per 200, each 1.2x its Before row:
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-3-30b","spend":0.00000288,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-9b-v2","spend":0.000006959999999999999,"prompt_tokens":20,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-12b-v2","spend":0.000009119999999999999,"prompt_tokens":23,"completion_tokens":5,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.nvidia.nemotron-super-3-120b","spend":0.00000744,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.openai.gpt-oss-20b-1:0","spend":0.0000135,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov.openai.gpt-oss-120b-1:0","spend":0.0000279,"prompt_tokens":75,"completion_tokens":20,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-lite-v1:0","spend":0.00000144,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-micro-v1:0","spend":8.4E-7,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock"}
    

Embeddings through Nova 2 multimodal embeddings in us-gov-west-1

  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; done
  2. gov-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)
  3. 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

  1. 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; done
  2. Both endpoints bill the 1.2x GovCloud row for the same token counts as the chat completions above:
    gov-nemotron-nano-3-30b-geo	/v1/messages	HTTP/1.1 200 OK	x-litellm-response-cost: 2.8799999999999995e-06	"usage":{"input_tokens":24,"output_tokens":4}	"id":"chatcmpl-8a2e4b8a-16b1-436c-9608-b6f24d24c393"
    gov-nemotron-nano-3-30b-geo	/v1/responses	HTTP/1.1 200 OK	x-litellm-response-cost: 2.8799999999999995e-06	"text":"GovCloud"	"id":"resp_045ok0ZzrR86zc0nPUa7v-VCSiibJ_jf9pW..."
    gov-nova-micro	/v1/messages	HTTP/1.1 200 OK	x-litellm-response-cost: 8.4e-07	"usage":{"input_tokens":8,"output_tokens":3}	"id":"chatcmpl-faf5fad8-320f-49ca-ba81-a61aa5b81d2b"
    gov-nova-micro	/v1/responses	HTTP/1.1 200 OK	x-litellm-response-cost: 8.4e-07	"text":"GovCloud"	"id":"resp_7IZNihni6_OQcupzJpGIthhpu7BLtAUS0IX..."
    
  3. 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, call_type}'
  4. The /v1/messages rows carry the same spend; the /v1/responses lookups by resp_ id return [] on both legs (the spend row is keyed by the litellm call id there, pre-existing):
    {"model":"bedrock/us-gov.nvidia.nemotron-nano-3-30b","spend":0.00000288,"prompt_tokens":24,"completion_tokens":4,"custom_llm_provider":"bedrock","call_type":"anthropic_messages"}
    {"model":"bedrock/us-gov-west-1/amazon.nova-micro-v1:0","spend":8.4E-7,"prompt_tokens":8,"completion_tokens":3,"custom_llm_provider":"bedrock","call_type":"anthropic_messages"}
    

GET /model_group/info prices for the GovCloud groups

  1. 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'
  2. The same per-token prices as /model/info above, group by group (1.2x GovCloud row on every gov group)

Type

🆕 New Feature

Caveats (if any)

Medium

  • The Anthropic GovCloud rows (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
    • They resolve through the same /model/info and /spend/calculate paths the proof exercises for every row, and the Nemotron, gpt-oss, and Nova completions prove the live 1.2x spend rows through the same lookup
  • GovCloud embeddings still bill the commercial rate live: the region-prefixed key 400s on the model id (LIT-6969, pre-existing, also hits the existing titan-embed-text-v2 gov row) and the region-only key resolves the commercial row, so the new us-gov-west-1/amazon.nova-2-multimodal-embeddings-v1:0 row is reachable through /spend/calculate and base_model only until LIT-6969 lands
  • Bedrock Mantle calls in a GovCloud region still bill the commercial row (LIT-6946, pre-existing, untouched here)
    • The new bedrock_mantle/us-gov-* rows are reachable through /spend/calculate and base_model only

Low

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

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 the us-gov. profile, Nova Lite/Micro and Nova 2 multimodal embeddings (west only), Nemotron nano-9b-v2, and regional bedrock, bedrock_converse, and bedrock_mantle keys 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.json and its backup. whitelisted_bedrock_models.txt gains the new in-region chat keys (Nova lite/micro, Nemotron 9b, Opus 5, Fable 5.1).

tests/test_litellm/test_bedrock_usgov_pricing.py is 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.

@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds comprehensive GovCloud pricing metadata for live Bedrock models that previously lacked regional rows or fell back to commercial pricing.

  • Adds 1.2× GovCloud rates for regional Bedrock, inference-profile, and Bedrock Mantle model identifiers.
  • Enables routing metadata for the us-gov.xai.grok-4.6 inference profile.
  • Whitelists newly supported in-region Bedrock chat models.
  • Expands tests to validate prices, provider mappings, regional coverage, capability parity, and synchronization of the primary and backup cost maps.

Confidence Score: 5/5

The 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.

Important Files Changed

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

@codspeed-hq

codspeed-hq Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 31 untouched benchmarks


Comparing litellm_govcloud_profiles_lit6421 (036d104) with litellm_internal_staging (df3b8a6)

Open in CodSpeed

@codecov

codecov Bot commented Sep 4, 2026

Copy link
Copy Markdown

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.
@mateo-berri mateo-berri added run-ci and removed run-ci labels Sep 4, 2026
@mateo-berri mateo-berri changed the title feat(pricing): add GovCloud Claude Opus 5 and us-gov. inference profile rows feat(pricing): add GovCloud pricing for every live but unpriced Bedrock model Sep 4, 2026
@mateo-berri

Copy link
Copy Markdown
Contributor Author

@greptileai

@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.

Stale Bugbot comment from a previous run.

@mateo-berri
mateo-berri requested a review from a team September 5, 2026 03:12
@mateo-berri mateo-berri added run-ci and removed run-ci labels Sep 5, 2026
@mateo-berri

Copy link
Copy Markdown
Contributor Author

@greptileai

@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 036d104. Configure here.

@mateo-berri
mateo-berri merged commit 56a61cf into litellm_internal_staging Sep 6, 2026
232 of 237 checks passed
@mateo-berri
mateo-berri deleted the litellm_govcloud_profiles_lit6421 branch September 6, 2026 00:15
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