{"record":{"id":"84ea8771134adba7","repo":"invoke-ai/InvokeAI","slug":"request-model-name-does-not-support-aspect-ratio","errorCode":null,"errorMessage":"{request.model.name} does not support aspect ratio {ratio_label}","messagePattern":"(.+?) does not support aspect ratio (.+?)","errorType":"exception","errorClass":"ExternalProviderCapabilityError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/external_generation/external_generation_default.py","lineNumber":136,"sourceCode":"            raise ExternalProviderCapabilityError(\n                f\"{request.model.name} supports at most {capabilities.max_images_per_request} images per request\"\n            )\n\n        if capabilities.max_image_size is not None:\n            if request.width > capabilities.max_image_size.width or request.height > capabilities.max_image_size.height:\n                raise ExternalProviderCapabilityError(\n                    f\"{request.model.name} supports a maximum size of {capabilities.max_image_size.width}x{capabilities.max_image_size.height}\"\n                )\n\n        if capabilities.allowed_aspect_ratios:\n            aspect_ratio = _format_aspect_ratio(request.width, request.height)\n            if aspect_ratio not in capabilities.allowed_aspect_ratios:\n                size_ratio = None\n                if capabilities.aspect_ratio_sizes:\n                    size_ratio = _ratio_for_size(request.width, request.height, capabilities.aspect_ratio_sizes)\n                if size_ratio is None or size_ratio not in capabilities.allowed_aspect_ratios:\n                    ratio_label = size_ratio or aspect_ratio\n                    raise ExternalProviderCapabilityError(\n                        f\"{request.model.name} does not support aspect ratio {ratio_label}\"\n                    )\n\n        required_modes = capabilities.input_image_required_for or [\"img2img\", \"inpaint\"]\n        if request.mode in required_modes and request.init_image is None:\n            raise ExternalProviderCapabilityError(\n                f\"Mode '{request.mode}' requires an init image for {request.model.name}\"\n            )\n\n        if request.mode == \"inpaint\" and request.mask_image is None:\n            raise ExternalProviderCapabilityError(\n                f\"Mode '{request.mode}' requires a mask image for {request.model.name}\"\n            )\n\n    def _drop_unsupported_capabilities(self, request: ExternalGenerationRequest) -> ExternalGenerationRequest:\n        \"\"\"Silently drop request fields the selected model does not support so workflow-editor runs don't fail\n        when users wire them in regardless.\"\"\"\n        capabilities = request.model.capabilities","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/external_generation/external_generation_default.py#L118-L154","documentation":"ExternalProviderCapabilityError raised by _validate_request when the request's aspect ratio (exact or size-derived, via _format_aspect_ratio / _ratio_for_size) is not in capabilities.allowed_aspect_ratios. The model only generates images at a fixed set of aspect ratios.","triggerScenarios":"generate() called with width/height whose formatted aspect ratio is not allowed, and even the size-derived ratio from capabilities.aspect_ratio_sizes is None or not allowed.","commonSituations":"Custom canvas sizes in the UI (e.g. 1200x700) sent to a model that only accepts 1:1, 3:2, 2:3, etc.; portrait/landscape presets from one model used with a more restrictive model.","solutions":["Round width/height to the nearest allowed aspect ratio from capabilities.allowed_aspect_ratios (use capabilities.aspect_ratio_sizes for concrete dimensions)","Generate at the closest allowed ratio and crop/extend locally","Select a model without the allowed_aspect_ratios restriction","Constrain the size picker UI to the model's allowed ratios"],"exampleFix":"// before\nrequest.width, request.height = 1200, 700  # unsupported ratio\n\n// after\nratios = model.capabilities.allowed_aspect_ratios\nnearest = min(ratios, key=lambda r: abs(eval_ratio(r) - request.width / request.height))\nrequest.width, request.height = dims_for_ratio(nearest, base=1024)","handlingStrategy":"validation","validationCode":"ratios = request.model.capabilities.allowed_aspect_ratios\nif ratios:\n    target = request.width / request.height\n    best = min(ratios, key=lambda r: abs(eval_ratio(r) - target))\n    request.width, request.height = dims_for_ratio(best, base=request.model.capabilities.aspect_ratio_sizes or {})","typeGuard":"def aspect_ratio_allowed(model, width: int, height: int) -> bool:\n    allowed = model.capabilities.allowed_aspect_ratios\n    if not allowed:\n        return True\n    from invokeai.app.services.external_generation.external_generation_default import _format_aspect_ratio\n    return _format_aspect_ratio(width, height) in allowed","tryCatchPattern":"try:\n    result = service.generate(request)\nexcept ExternalProviderCapabilityError as e:\n    if \"aspect ratio\" in str(e):\n        snap_request_to_nearest_allowed_ratio(request)\n        result = service.generate(request)\n    else:\n        raise","preventionTips":["Restrict the size/aspect picker to capabilities.allowed_aspect_ratios","Snap arbitrary canvas sizes to the nearest allowed ratio before submit","Use capabilities.aspect_ratio_sizes to offer concrete allowed dimensions","Crop or outpaint locally when an exact custom ratio is required"],"tags":["validation","capability-mismatch","aspect-ratio","image-size"],"backgroundTag":"unsupported-capability","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}