Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion litellm/llms/bedrock/common_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1132,6 +1132,10 @@ def get_bedrock_route(
"agentcore/": "agentcore",
"async_invoke/": "async_invoke",
"openai/": "openai",
"global.openai.": "openai",
"eu.openai.": "openai",
"apac.openai.": "openai",
"us.openai.": "openai",
"mantle/": "mantle",
}

Expand Down Expand Up @@ -1256,7 +1260,13 @@ def _explicit_openai_route(model: str) -> bool:
Check if the model is an explicit openai route.
Used for Bedrock imported models that use OpenAI Chat Completions format.
"""
return BedrockModelInfo._model_has_route_prefix(model, "openai/")
return (
BedrockModelInfo._model_has_route_prefix(model, "openai/")
or BedrockModelInfo._model_has_route_prefix(model, "global.openai.")
or BedrockModelInfo._model_has_route_prefix(model, "eu.openai.")
or BedrockModelInfo._model_has_route_prefix(model, "apac.openai.")
or BedrockModelInfo._model_has_route_prefix(model, "us.openai.")
)

@staticmethod
def get_bedrock_provider_config_for_messages_api(
Expand Down
55 changes: 55 additions & 0 deletions tests/test_litellm/llms/bedrock/test_bedrock_common_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -871,3 +871,58 @@ def test_every_bedrock_config_get_error_class_keeps_provider_headers(config):

def test_bedrock_get_error_class_audit_covers_every_surface():
assert len(_bedrock_configs_with_get_error_class()) >= 30


@pytest.mark.parametrize(
"model",
[
"bedrock/global.openai.gpt-5.6-sol",
"bedrock/global.openai.gpt-5.6-terra",
"bedrock/global.openai.gpt-5.6-luna",
"bedrock/eu.openai.gpt-5.6-sol",
"bedrock/eu.openai.gpt-5.6-terra",
"bedrock/eu.openai.gpt-5.6-luna",
"bedrock/apac.openai.gpt-5.6-sol",
"bedrock/apac.openai.gpt-5.6-terra",
"bedrock/apac.openai.gpt-5.6-luna",
"bedrock/us.openai.gpt-5.6-sol",
"bedrock/us.openai.gpt-5.6-terra",
"bedrock/us.openai.gpt-5.6-luna",
],
)


def test_bedrock_cross_region_openai_routing(model: str):
"""
Ensure cross-region OpenAI inference profiles on Bedrock route to the
OpenAI-compatible config instead of falling back to Bedrock Converse.
"""
import litellm
from litellm.llms.bedrock.common_utils import get_bedrock_chat_config

assert BedrockModelInfo.get_bedrock_route(model) == "openai"
assert BedrockModelInfo._explicit_openai_route(model) is True

config = get_bedrock_chat_config(model)
assert isinstance(config, litellm.AmazonBedrockOpenAIConfig)
Comment thread
anton-codes-iac marked this conversation as resolved.


@pytest.mark.parametrize(
"model",
[
"bedrock/converse/global.openai.gpt-5.6-sol",
"bedrock/converse/eu.openai.gpt-5.6-terra",
"bedrock/converse/us.openai.gpt-5.6-luna",
],
)


def test_explicit_converse_prefix_overrides_openai_routing(model: str):
"""
Ensure that a user can still explicitly force the Converse API for an OpenAI model
by using the `converse/` prefix, which takes precedence in route_mappings.
"""
from litellm.llms.bedrock.common_utils import BedrockModelInfo

# Verify the explicit prefix intercepts the routing before the openai mapping
assert BedrockModelInfo.get_bedrock_route(model) == "converse"
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ def test_proxy_cost_calculation_scenario():


@pytest.mark.parametrize("profile", GPT_5_6_PROFILES, ids=lambda p: p.model_id)
def test_bedrock_gpt_5_6_profiles_route_to_converse(profile, local_model_cost_map):
"""GPT-5.6 is served by Converse on bedrock-runtime, never by Invoke."""
assert BedrockModelInfo.get_bedrock_route(f"bedrock/{profile.model_id}") == "converse"
def test_bedrock_gpt_5_6_profiles_route_to_openai(profile, local_model_cost_map):
"""GPT-5.6 is served by Openai on bedrock-runtime."""
assert BedrockModelInfo.get_bedrock_route(f"bedrock/{profile.model_id}") == "openai"


def test_bedrock_gpt_5_6_above_272k_tier_applies_to_cost(local_model_cost_map):
Expand Down
Loading