{"record":{"id":"8f035f386cc1dace","repo":"spring-projects/spring-ai","slug":"unsupported-image-mime-type","errorCode":null,"errorMessage":"Unsupported image mime type: ","messagePattern":"Unsupported image mime type: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java","lineNumber":194,"sourceCode":"\t\tMedia media = document.getMedia();\n\t\tif (media != null) {\n\t\t\tif (media.getMimeType().isCompatibleWith(TEXT_MIME_TYPE)) {\n\t\t\t\tinstanceBuilder.text(media.getData().toString());\n\t\t\t\tdocumentMetadata.put(ModalityType.TEXT,\n\t\t\t\t\t\tnew DocumentMetadata(document.getId(), MimeTypeUtils.TEXT_PLAIN, media.getData()));\n\t\t\t\tif (logger.isWarnEnabled() && StringUtils.hasText(documentText)) {\n\t\t\t\t\tlogger.warn(\"Media type String overrides the Document text content!\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (media.getMimeType().isCompatibleWith(IMAGE_MIME_TYPE)) {\n\t\t\t\tif (SUPPORTED_IMAGE_MIME_SUB_TYPES.contains(media.getMimeType())) {\n\t\t\t\t\tinstanceBuilder.image(ImageBuilder.of(media.getMimeType()).imageData(media.getData()).build());\n\t\t\t\t\tdocumentMetadata.put(ModalityType.IMAGE,\n\t\t\t\t\t\t\tnew DocumentMetadata(document.getId(), media.getMimeType(), media.getData()));\n\t\t\t\t}\n\t\t\t\telse if (logger.isWarnEnabled()) {\n\t\t\t\t\tlogger.warn(\"Unsupported image mime type: \" + media.getMimeType());\n\t\t\t\t\tthrow new IllegalArgumentException(\"Unsupported image mime type: \" + media.getMimeType());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (media.getMimeType().isCompatibleWith(VIDEO_MIME_TYPE)) {\n\t\t\t\tinstanceBuilder.video(VideoBuilder.of(media.getMimeType())\n\t\t\t\t\t.videoData(media.getData())\n\t\t\t\t\t.startOffsetSec(mergedOptions.getVideoStartOffsetSec())\n\t\t\t\t\t.endOffsetSec(mergedOptions.getVideoEndOffsetSec())\n\t\t\t\t\t.intervalSec(mergedOptions.getVideoIntervalSec())\n\t\t\t\t\t.build());\n\t\t\t\tdocumentMetadata.put(ModalityType.VIDEO,\n\t\t\t\t\t\tnew DocumentMetadata(document.getId(), media.getMimeType(), media.getData()));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (logger.isWarnEnabled()) {\n\t\t\t\t\tlogger.warn(\"Unsupported media type: \" + media.getMimeType());\n\t\t\t\t}\n\t\t\t\tthrow new IllegalArgumentException(\"Unsupported media type: \" + media.getMimeType());\n\t\t\t}","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java#L176-L212","documentation":"Vertex AI multimodal embeddings only support a fixed set of image mime types (image/png, image/jpeg, etc.). If a Media in the document has an image-ish mime type not in the supported list, the model throws IllegalArgumentException after logging a warning. It is an eager fail-fast validation of unsupported input content.","triggerScenarios":"Passing a Document containing Media whose MimeType is neither a supported image type nor video/text (e.g. image/webp, image/bmp, image/heic) via VertexAiMultimodalEmbeddingModel.call().","commonSituations":"Users embedding modern formats like WebP or HEIC that the multimodalembedding API does not accept; wrong mime type detected for a file; passing generic application/octet-stream data mislabeled as an image.","solutions":["Convert the image to a supported format (PNG or JPEG) before building the Document","Set an explicit MimeType on Media instead of relying on detection","Filter/validate media mime types against the supported image list before calling the model","Check the Vertex AI multimodalembedding docs for the current supported mime type list"],"exampleFix":"// before\nImage image = new Image(ClassPathResource(\"photo.webp\")); // image/webp -> throws\n// after\nBufferedImage img = ImageIO.read(new File(\"photo.webp\"));\nImageIO.write(img, \"png\", new File(\"photo.png\"));\nImage image = new Image(new FileSystemResource(\"photo.png\")); // image/png supported","handlingStrategy":"validation","validationCode":"static final Set<String> SUPPORTED = Set.of(\"image/png\",\"image/jpeg\",\"image/webp\",\"image/heic\",\"image/heif\"); boolean ok = doc.getMedia().stream().allMatch(m -> SUPPORTED.contains(m.getMimeType().toString()));","typeGuard":"static boolean isSupportedImage(MimeType mt) { return MediaType.parseMediaType(\"image/*\").isCompatibleWith(mt) && Set.of(\"png\",\"jpeg\").contains(mt.getSubtype()); }","tryCatchPattern":"try { response = model.call(request); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Unsupported image mime type\")) { /* convert media and retry */ } throw e; }","preventionTips":["Convert images to PNG/JPEG during ingestion","Set explicit MimeType on Media objects","Check Vertex AI multimodalembedding supported formats per API version"],"tags":["java","google-vertex-ai","mime-type","unsupported-media"],"backgroundTag":"unsupported-operation","analyzedSha":"98a7beda4f29d80a71c5837eb4053b03a93a46f7","analyzedAt":"2026-09-11T14:15:49.441Z","contentChangedAt":"2026-09-11T14:15:49.441Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}