siyuan-note/siyuan · warning

unsupported image output format

Error message

unsupported image output format

What it means

Returned by GenerateImage when outputFormat (after lowercasing and fallback to config default) is not one of png, jpeg, webp. The OpenAI image-generation API only accepts these three formats, so any other value is rejected before the network call.

Source

Thrown at kernel/model/assets.go:429

// 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,
	).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 251596fc0d)

Solutions

  1. Normalize "jpg" to "jpeg" at the call site before passing the request.
  2. Constrain the UI dropdown to exactly png/jpeg/webp.
  3. If the config default is wrong, reset ImageGeneration.OutputFormat to one of the three accepted values.

Example fix

// before
req.OutputFormat = "jpg" // rejected
res, err := model.GenerateImage(ctx, req)

// after
switch strings.ToLower(strings.TrimSpace(req.OutputFormat)) {
case "jpg": req.OutputFormat = "jpeg"
case "", "png", "jpeg", "webp": // ok
default: return fmt.Errorf("bad format %q", req.OutputFormat)
}
res, err := model.GenerateImage(ctx, req)
Defensive patterns

Strategy: validation

Validate before calling

switch strings.ToLower(strings.TrimSpace(request.OutputFormat)) {
case "", "png", "jpeg", "webp": // ok
case "jpg": request.OutputFormat = "jpeg"
default:
    return fmt.Errorf("unsupported output format %q", request.OutputFormat)
}

Prevention

When it happens

Trigger: Passing request.OutputFormat = "gif", "jpg", "bmp", "tiff", or a typo like "PNG " (note: leading/trailing space is not trimmed for format, only lowercased); the config default itself was set to an unsupported value.

Common situations: A caller maps a generic mime type to extension and passes "jpg" instead of "jpeg"; a user-edited conf.json has ImageGeneration.OutputFormat = "gif"; a copy/paste typo.

Related errors


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/15516d1c1bf4266a. Report an issue: GitHub.