siyuan-note/siyuan · error

image model returned no image

Error message

image model returned no image

What it means

Thrown by OpenAIImageAdapter.Generate (kernel/util/openai.go:759) when adapter.client.CreateImage succeeded (no Go error) but response.Data is empty. SiYuan treats this as a provider contract violation: a successful HTTP call must yield at least one image element.

Source

Thrown at kernel/util/openai.go:759

		Size:    request.Size,
		Quality: request.Quality,
	}
	if strings.HasPrefix(strings.ToLower(adapter.model), "dall-e") {
		imageRequest.ResponseFormat = openai.CreateImageResponseFormatB64JSON
		if imageRequest.Quality == "auto" {
			imageRequest.Quality = ""
		}
	} else {
		imageRequest.OutputFormat = request.OutputFormat
	}
	requestCtx, cancel := context.WithTimeout(ctx, adapter.timeout)
	defer cancel()
	response, err := adapter.client.CreateImage(requestCtx, imageRequest)
	if err != nil {
		return GeneratedImage{}, err
	}
	if len(response.Data) == 0 {
		return GeneratedImage{}, errors.New("image model returned no image")
	}
	result := response.Data[0]
	var data []byte
	if result.B64JSON != "" {
		data, err = base64.StdEncoding.DecodeString(result.B64JSON)
	} else if result.URL != "" {
		data, err = downloadGeneratedImage(requestCtx, result.URL)
	} else {
		err = errors.New("image model returned neither base64 data nor URL")
	}
	if err != nil {
		return GeneratedImage{}, err
	}
	mimeType, extension, err := ValidateGeneratedImage(data)
	if err != nil {
		return GeneratedImage{}, err
	}
	return GeneratedImage{Data: data, MIMEType: mimeType, Extension: extension, RevisedPrompt: result.RevisedPrompt}, nil

View on GitHub (pinned to 251596fc0d)

Solutions

  1. Retry once with the same or a slightly reworded prompt — content-filter empties are often prompt-specific.
  2. Inspect the raw HTTP response from CreateImage (enable client debug logging) to confirm the data array really is empty and not just misparsed.
  3. Update the openai-go client version in case of schema drift.
  4. Sanitize/soften the prompt to avoid the provider's safety filter.

Example fix

// before
response, err := adapter.client.CreateImage(requestCtx, imageRequest)
if err != nil { return GeneratedImage{}, err }
if len(response.Data) == 0 {
    return GeneratedImage{}, errors.New("image model returned no image")
}

// after (one retry, then descriptive error)
response, err := adapter.client.CreateImage(requestCtx, imageRequest)
if err != nil { return GeneratedImage{}, err }
if len(response.Data) == 0 {
    logging.LogWarnf("model %s returned empty data; retrying", adapter.model)
    response, err = adapter.client.CreateImage(requestCtx, imageRequest)
    if err != nil { return GeneratedImage{}, err }
    if len(response.Data) == 0 {
        return GeneratedImage{}, fmt.Errorf("model %s returned no image (possible content filter)", adapter.model)
    }
}
Defensive patterns

Strategy: retry

Validate before calling

// No purely client-side check; closest is to retry CreateImage once before treating as failure
// (Validation belongs around the call site, see tryCatchPattern.)

Try / catch

response, err := adapter.client.CreateImage(ctx, req)
if err != nil { return GeneratedImage{}, err }
if len(response.Data) == 0 {
    logging.LogWarnf("empty data array; retrying once")
    response, err = adapter.client.CreateImage(ctx, req)
    if err != nil { return GeneratedImage{}, err }
    if len(response.Data) == 0 {
        return GeneratedImage{}, fmt.Errorf("model %s returned no image (possible content filter)", adapter.model)
    }
}

Prevention

When it happens

Trigger: The image API returns HTTP 200 with an empty data array. Common with content-filter rejections that surface as empty rather than as errors, or with provider/schema drift where the response shape changed.

Common situations: The prompt tripped the provider's content filter (returned empty instead of an error); quota/billing edge case; provider changed its response envelope; an OpenAI-compatible shim that does not populate Data on certain model states.

Related errors


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