From d4d83c0edb4ddac7de69317b0c2f9e8a9c366873 Mon Sep 17 00:00:00 2001 From: Tim Elfrink Date: Mon, 15 Sep 2025 16:54:24 +0200 Subject: [PATCH] Fix Bedrock inference profiles for Nova Canvas image generation - Replace naive model.split('.')[0] with ARN-aware provider detection - Use existing get_bedrock_invoke_provider() method for inference profile ARNs - Filter model_id parameter to prevent 'extraneous key' API errors - Support ARN format: arn:aws:bedrock:region:account:application-inference-profile/id - Support cross-region format: us.amazon.nova-canvas-v1:0 - Maintain backward compatibility with regular amazon.nova-canvas-v1:0 format --- .../image/amazon_nova_canvas_transformation.py | 4 ++++ litellm/llms/bedrock/image/image_handler.py | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/litellm/llms/bedrock/image/amazon_nova_canvas_transformation.py b/litellm/llms/bedrock/image/amazon_nova_canvas_transformation.py index 3ef7a40e9a9..39f97699d49 100644 --- a/litellm/llms/bedrock/image/amazon_nova_canvas_transformation.py +++ b/litellm/llms/bedrock/image/amazon_nova_canvas_transformation.py @@ -67,6 +67,10 @@ class AmazonNovaCanvasConfig: """ task_type = optional_params.pop("taskType", "TEXT_IMAGE") image_generation_config = optional_params.pop("imageGenerationConfig", {}) + + # Filter out model_id parameter to prevent "extraneous key" error from Bedrock API + optional_params.pop("model_id", None) + image_generation_config = {**image_generation_config, **optional_params} if task_type == "TEXT_IMAGE": text_to_image_params: Dict[str, Any] = image_generation_config.pop( diff --git a/litellm/llms/bedrock/image/image_handler.py b/litellm/llms/bedrock/image/image_handler.py index 55d94675d14..0103f190d36 100644 --- a/litellm/llms/bedrock/image/image_handler.py +++ b/litellm/llms/bedrock/image/image_handler.py @@ -233,7 +233,17 @@ class BedrockImageGeneration(BaseAWSLLM): Returns: dict: The request body to use for the Bedrock Image Generation API """ - provider = model.split(".")[0] + # Use the existing ARN-aware provider detection method + bedrock_provider = self.get_bedrock_invoke_provider(model) + + if bedrock_provider == "amazon" or bedrock_provider == "nova": + # Handle Amazon Nova Canvas models + provider = "amazon" + elif bedrock_provider == "stability": + provider = "stability" + else: + # Fallback to original logic for backward compatibility + provider = model.split(".")[0] inference_params = copy.deepcopy(optional_params) inference_params.pop( "user", None