siyuan-note/siyuan · error

generated image exceeds size limit

Error message

generated image exceeds size limit

What it means

Thrown by ValidateGeneratedImage (kernel/util/openai.go:701) when len(data) exceeds maxGeneratedImageBytes, which is 50 * 1024 * 1024 (openai.go:51). It is a hard ceiling on a single generated image to protect kernel memory and disk. The check fires after the empty-bytes guard and before MIME detection.

Source

Thrown at kernel/util/openai.go:701

	if maxBytes > 0 && output.Len() > maxBytes {
		return PreparedImage{}, fmt.Errorf("prepared image exceeds size limit: %d bytes", maxBytes)
	}
	return PreparedImage{
		Data:       output.Bytes(),
		MIMEType:   "image/jpeg",
		Width:      bounds.Dx(),
		Height:     bounds.Dy(),
		SourceSize: len(data),
	}, nil
}

// ValidateGeneratedImage 校验生成图片的格式、尺寸和体积。
func ValidateGeneratedImage(data []byte) (mimeType, extension string, err error) {
	if len(data) == 0 {
		return "", "", errors.New("generated image is empty")
	}
	if len(data) > maxGeneratedImageBytes {
		return "", "", errors.New("generated image exceeds size limit")
	}
	mimeType = mimetype.Detect(data).String()
	switch mimeType {
	case "image/png":
		extension = ".png"
	case "image/jpeg":
		extension = ".jpg"
	case "image/webp":
		extension = ".webp"
	default:
		return "", "", fmt.Errorf("unsupported generated image type: %s", mimeType)
	}
	config, _, decodeErr := image.DecodeConfig(bytes.NewReader(data))
	if decodeErr != nil || config.Width < 1 || config.Height < 1 || config.Width > 16384 || config.Height > 16384 ||
		int64(config.Width)*int64(config.Height) > maxGeneratedImagePixels {
		return "", "", errors.New("generated image is invalid")
	}
	return mimeType, extension, nil

View on GitHub (pinned to 251596fc0d)

Solutions

  1. Lower the requested Size / Quality in GenerateImageRequest so the model emits a smaller payload.
  2. Pre-check the buffer length before calling ValidateGeneratedImage and reject early with a domain-clear message.
  3. If the model genuinely must emit large images, re-encode/shrink (jpeg quality, downscale) on your side before validation.
  4. Verify no middleware (proxy, gateway) is re-encoding the response to a larger format.

Example fix

// before
mimeType, ext, err := ValidateGeneratedImage(data)

// after
const limit = 50 * 1024 * 1024
if len(data) > limit {
    return GeneratedImage{}, fmt.Errorf("image payload %d bytes exceeds %d limit; lower size/quality", len(data), limit)
}
mimeType, ext, err := ValidateGeneratedImage(data)
Defensive patterns

Strategy: validation

Validate before calling

const imageLimit = 50 * 1024 * 1024 // matches maxGeneratedImageBytes
if len(data) > imageLimit {
    return fmt.Errorf("image %d bytes over %d limit; reduce size/quality", len(data), imageLimit)
}

Try / catch

if _, _, err := ValidateGeneratedImage(data); err != nil {
    if strings.Contains(err.Error(), "exceeds size limit") {
        // lower Size/Quality, or downscale data, then retry
    }
    return err
}

Prevention

When it happens

Trigger: Calling ValidateGeneratedImage with a buffer > 50 MiB. Typically reached after downloading a URL-served image or decoding a large base64 PNG returned by dall-e or a compatible image model.

Common situations: Requesting very large size/quality (e.g. 1024x1024 high-quality PNG, or 4K via newer models); model returning an uncompressed PNG; misconfigured proxy that re-encodes at higher bitrate; adversarial/buggy provider inflating output.

Related errors


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