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

  1. Change OutputFormat to one of "png", "jpeg", or "webp" (use "jpeg", not "jpg")
  2. Fix the default in Settings - AI - Image generation so the fallback value is a supported format
  3. 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

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-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)