{"record":{"id":"f24da5f45988998d","repo":"BerriAI/litellm","slug":"image-url-not-in-expected-format-example-expected-f24da5","errorCode":null,"errorMessage":"Image url not in expected format. Example Expected input - \"image_url\": \"data:image/jpeg;base64,{base64_image}\". Supported formats - ['image/jpeg', 'image/png', 'image/gif', 'image/webp']. Error: {e}","messagePattern":"Image url not in expected format\\. Example Expected input - \"image_url\": \"data:image/jpeg;base64,(.+?)\"\\. Supported formats - \\['image/jpeg', 'image/png', 'image/gif', 'image/webp'\\]\\. Error: (.+?)","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"litellm/litellm_core_utils/prompt_templates/factory.py","lineNumber":858,"sourceCode":"        if openai_image_url.startswith(\"http\"):\n            openai_image_url = convert_url_to_base64(url=openai_image_url)\n        # Extract the media type and base64 data\n        media_type, base64_data = openai_image_url.split(\"data:\")[1].split(\";base64,\")\n\n        if format:\n            media_type = format\n        else:\n            media_type = media_type.replace(\"\\\\/\", \"/\")\n\n        return GenericImageParsingChunk(\n            type=\"base64\",\n            media_type=media_type,\n            data=base64_data,\n        )\n    except litellm.ImageFetchError:\n        raise\n    except Exception as e:\n        raise Exception(\n            f\"\"\"Image url not in expected format. Example Expected input - \"image_url\": \"data:image/jpeg;base64,{{base64_image}}\". Supported formats - ['image/jpeg', 'image/png', 'image/gif', 'image/webp']. Error: {e}\"\"\"\n        )\n\n\ndef create_anthropic_image_param(\n    image_url_input: str | dict,\n    format: str | None = None,\n    is_bedrock_invoke: bool = False,\n) -> AnthropicMessagesImageParam:\n    \"\"\"\n    Create an AnthropicMessagesImageParam from an image URL input.\n\n    Supports both URL references (for HTTP/HTTPS URLs) and base64 encoding.\n    \"\"\"\n    # Extract URL and format from input\n    if isinstance(image_url_input, str):\n        image_url = image_url_input\n    else:","sourceCodeStart":840,"sourceCodeEnd":876,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/litellm_core_utils/prompt_templates/factory.py#L840-L876","documentation":"Raised while building a GenericImageParsingChunk from an image_url: the extraction of media_type/base64 data failed for any reason other than an ImageFetchError (which is re-raised untouched). Common causes are data URIs whose media type is not image/jpeg, png, gif, or webp, or a malformed base64 payload after the ';base64,' marker.","triggerScenarios":"Vision input with media types like image/tiff, image/bmp, image/heic, image/svg+xml, or an empty/corrupt base64 segment; passing a dict where url/format keys are unexpected; hitting this on Anthropic/Bedrock image conversion paths that use the generic chunk builder.","commonSituations":"iPhone HEIC photos or BMP/TIFF screenshots fed directly to the API; SVG logos; WebP variants labelled 'image/jp2'; base64 strings with data-URI whitespace or truncated padding.","solutions":["Convert the image to a supported type (jpeg/png/gif/webp) before sending, e.g. with Pillow: img.convert('RGB').save(buf, 'JPEG')","Fix the data URI so it reads data:image/<jpeg|png|gif|webp>;base64,<clean base64>","For SVG, rasterize to PNG first","Strip whitespace/newlines from base64 payloads introduced by copy-paste or line wrapping"],"exampleFix":"# before\ncontent = [{\"type\": \"image_url\", \"image_url\": {\"url\": \"data:image/heic;base64,<b64>\"}}]\n\n# after\nfrom PIL import Image\nimport io, base64\nimg = Image.open(\"photo.heic\").convert(\"RGB\")\nbuf = io.BytesIO(); img.save(buf, format=\"JPEG\")\nb64 = base64.b64encode(buf.getvalue()).decode()\ncontent = [{\"type\": \"image_url\", \"image_url\": {\"url\": f\"data:image/jpeg;base64,{b64}\"}}]","handlingStrategy":"validation","validationCode":"import re\n\nSUPPORTED = {\"jpeg\", \"jpg\", \"png\", \"gif\", \"webp\"}\n_DATA = re.compile(r\"^data:image/([a-z0-9.+-]+);base64,\")\n\ndef check_image_block(block: dict) -> None:\n    url = block.get(\"image_url\", {}).get(\"url\", \"\")\n    m = _DATA.match(url)\n    if m and m.group(1).lower() not in SUPPORTED:\n        raise ValueError(f\"convert {m.group(1)} to jpeg/png/gif/webp before sending\")","typeGuard":"import re\nfrom typing import Any\n\n_OK = {\"jpeg\", \"jpg\", \"png\", \"gif\", \"webp\"}\n_RE = re.compile(r\"^data:image/([a-z0-9.+-]+);base64,[A-Za-z0-9+/=]+$\")\n\ndef is_supported_data_uri(v: Any) -> bool:\n    if not isinstance(v, str):\n        return False\n    m = _RE.match(v)\n    return bool(m and m.group(1).lower() in _OK)","tryCatchPattern":"try:\n    litellm.completion(model=model, messages=messages)\nexcept Exception as e:\n    if \"Image url not in expected format\" in str(e) and \"Supported formats\" in str(e):\n        messages = [convert_block_to_jpeg(m) for m in messages]  # Pillow re-encode\n        litellm.completion(model=model, messages=messages)\n    else:\n        raise","preventionTips":["Normalize every image to jpeg/png/gif/webp at ingest time","Re-encode HEIC/TIFF/BMP uploads with Pillow before storage","Rasterize SVGs to PNG"],"tags":["vision","image","media-type","validation"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}