siyuan-note/siyuan · error
unsupported image output format
Error message
unsupported image output format
What it means
GenerateImage normalizes request.OutputFormat (falling back to the configured Conf.AI.ImageGeneration.OutputFormat) with strings.ToLower, then requires it to be exactly "png", "jpeg", or "webp". Any other value — or a case that lower-cases to something else — is rejected with "unsupported image output format".
Solutions
- Change OutputFormat to one of "png", "jpeg", or "webp" (use "jpeg", not "jpg")
- Fix the default in Settings - AI - Image generation so the fallback value is a supported format
- Normalize/whitelist user-provided format strings (e.g. map "jpg" -> "jpeg") before calling
Example fix
// before req.OutputFormat = "jpg" // rejected // after req.OutputFormat = "jpeg"
Defensive patterns
Strategy: validation
Validate before calling
var allowed = map[string]bool{"png": true, "jpeg": true, "webp": true}
fmt_ := strings.ToLower(strings.TrimSpace(req.OutputFormat))
if !allowed[fmt_] { return errors.New("output format must be png, jpeg, or webp") } Try / catch
_, err := model.GenerateImage(ctx, req)
if err != nil && strings.Contains(err.Error(), "unsupported image output format") {
req.OutputFormat = "png" // safe default, retry once
} Prevention
- Map "jpg" to "jpeg" in any user-facing format selector
- Never pass MIME types like "image/png" as OutputFormat
- Keep Conf.AI.ImageGeneration.OutputFormat within the supported trio
When it happens
Trigger: Passing OutputFormat values such as "jpg", "gif", "PNG " (with whitespace), "svg", or an empty string when the configured default OutputFormat is also invalid.
Common situations: Users typing "jpg" assuming JPEG aliasing; storing a format from an older config schema; copying adapter code that passes a MIME type like "image/png" instead of the bare format name.
Related errors
- AI editor action must not be empty
- AI editor input is empty
- assetPath is required for analyze
- capability validator unavailable
- capability was not exposed in this model round
AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19).
Data as JSON: /api/errors/15516d1c1bf4266a.
Report an issue: GitHub.
Appendix: source
Thrown at kernel/model/assets.go:537
// GenerateImage 使用全局图片生成配置创建图片字节,可供文档资源、编辑器和其他图片入口复用。
func GenerateImage(ctx context.Context, request GenerateImageRequest) (GenerateImageResult, error) {
if Conf == nil || Conf.AI == nil {
return GenerateImageResult{}, errors.New("AI configuration is unavailable")
}
provider, generationModel := Conf.AI.GetImageGenerationModel()
if err := validateImageModel(provider, generationModel); err != nil {
return GenerateImageResult{}, err
}
prompt := strings.TrimSpace(request.Prompt)
if prompt == "" {
return GenerateImageResult{}, errors.New("prompt is required for image generation")
}
size := multimodalValueOrDefault(request.Size, Conf.AI.ImageGeneration.Size)
quality := multimodalValueOrDefault(request.Quality, Conf.AI.ImageGeneration.Quality)
outputFormat := strings.ToLower(multimodalValueOrDefault(request.OutputFormat, Conf.AI.ImageGeneration.OutputFormat))
if outputFormat != "png" && outputFormat != "jpeg" && outputFormat != "webp" {
return GenerateImageResult{}, errors.New("unsupported image output format")
}
generated, err := util.NewOpenAIImageAdapter(
provider.APIKey, provider.BaseURL, generationModel.Name, Conf.AI.ImageGeneration.RequestTimeout, ResolveAIProviderHeaders(provider),
).Generate(ctx, util.GenerateImageRequest{
Prompt: prompt, Size: size, Quality: quality, OutputFormat: outputFormat,
})
if err != nil {
return GenerateImageResult{}, markImageExecutionUnknown(fmt.Errorf("generate image failed: %w", err))
}
if ctx.Err() != nil {
return GenerateImageResult{}, markImageExecutionUnknown(errors.New("image generation was cancelled"))
}
return GenerateImageResult{
Data: generated.Data, MIMEType: generated.MIMEType, Extension: generated.Extension, RevisedPrompt: generated.RevisedPrompt,
}, nil
}
// GenerateDocumentImage 使用通用图片生成能力创建文档资源。View on GitHub (pinned to 9f775e8a12)