{"record":{"id":"3bf823f69a275563","repo":"spring-projects/spring-ai","slug":"unsupported-media-data-type-3bf823","errorCode":null,"errorMessage":"Unsupported media data type: ","messagePattern":"Unsupported media data type: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java","lineNumber":511,"sourceCode":"\tprivate Stream<ChatCompletionMessage.ImageUrlChunk> mapToImageUrlChunks(UserMessage userMessage) {\n\t\treturn userMessage.getMedia().stream().map(this::mapToImageUrlChunk);\n\t}\n\n\tprivate ChatCompletionMessage.ImageUrlChunk mapToImageUrlChunk(Media media) {\n\t\treturn new ChatCompletionMessage.ImageUrlChunk(this.fromMediaData(media.getMimeType(), media.getData()));\n\t}\n\n\tprivate ChatCompletionMessage.ImageUrlChunk.ImageUrl fromMediaData(MimeType mimeType, Object mediaData) {\n\t\tif (mediaData instanceof byte[] bytes) {\n\t\t\t// Assume the bytes are an image.\n\t\t\treturn ChatCompletionMessage.ImageUrlChunk.ImageUrl.fromImageData(mimeType, bytes);\n\t\t}\n\t\telse if (mediaData instanceof String text) {\n\t\t\t// Assume the text is a URL or a base64 encoded image prefixed by the user.\n\t\t\treturn new ChatCompletionMessage.ImageUrlChunk.ImageUrl(text, null);\n\t\t}\n\t\telse {\n\t\t\tthrow new IllegalArgumentException(\"Unsupported media data type: \" + mediaData.getClass().getSimpleName());\n\t\t}\n\t}\n\n\tprivate List<MistralAiApi.FunctionTool> getFunctionTools(List<ToolDefinition> toolDefinitions) {\n\t\treturn toolDefinitions.stream().map(toolDefinition -> {\n\t\t\tvar function = new MistralAiApi.FunctionTool.Function(toolDefinition.description(), toolDefinition.name(),\n\t\t\t\t\ttoolDefinition.inputSchema());\n\t\t\treturn new MistralAiApi.FunctionTool(function);\n\t\t}).toList();\n\t}\n\n\t/**\n\t * @since 2.0.0\n\t */\n\t@Override\n\tpublic MistralAiChatOptions getOptions() {\n\t\treturn this.options;\n\t}","sourceCodeStart":493,"sourceCodeEnd":529,"githubUrl":"https://github.com/spring-projects/spring-ai/blob/98a7beda4f29d80a71c5837eb4053b03a93a46f7/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java#L493-L529","documentation":"fromMediaData(Object) maps user media to Mistral's ImageUrlChunk and supports byte[] (base64-encoded) and String (URL or base64 text); any other runtime type is rejected with IllegalArgumentException listing the class's simple name. Called via mapToImageUrlChunk when building multimodal user content.","triggerScenarios":"Including Media with data of a type other than byte[] or String (e.g., URL, URI, Resource, InputStream, BufferedImage) in a UserMessage passed to MistralAiChatModel.","commonSituations":"Building multimodal prompts using Media.builder().data(URL) or a Resource loaded from classpath instead of pre-converting to a URL string or raw bytes.","solutions":["Pass the media as byte[] (raw image bytes) or String (public URL / base64)","Convert URL/Resource/InputStream inputs: read bytes or call url.toString() before building Media","Use Media.builder().url(...) handling or pre-fetch remote media into bytes"],"exampleFix":"// before\nMedia media = Media.builder().mimeType(MimeTypeUtils.IMAGE_PNG).data(resource).build();\n// after\nbyte[] bytes = resource.getContentAsByteArray();\nMedia media = Media.builder().mimeType(MimeTypeUtils.IMAGE_PNG).data(bytes).build();","handlingStrategy":"type-guard","validationCode":"Object data = media.getData();\nif (!(data instanceof byte[] || data instanceof String)) {\n    throw new IllegalArgumentException(\"media data must be byte[] or String url/base64, got \" + data.getClass());\n}","typeGuard":"boolean isSupportedMediaData(Object data) {\n    return data instanceof byte[] || data instanceof String;\n}","tryCatchPattern":"try {\n    model.call(new Prompt(userMessage));\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Unsupported media data type\")) {\n        logger.error(\"convert media to byte[]/String: {}\", e.getMessage());\n    } else throw e;\n}","preventionTips":["Pass media data only as byte[] or String","Read Resource/InputStream contents into byte[] before building Media","Prefer passing a public URL string for remote images","Unit-test multimodal prompts with the exact data types you ship"],"tags":["mistral","media","multimodal","type-mismatch"],"backgroundTag":"type-mismatch","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"}