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}, nilView on GitHub (pinned to 251596fc0d)
Solutions
- Retry once with the same or a slightly reworded prompt — content-filter empties are often prompt-specific.
- Inspect the raw HTTP response from CreateImage (enable client debug logging) to confirm the data array really is empty and not just misparsed.
- Update the openai-go client version in case of schema drift.
- 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
- Treat 'no image but 200 OK' as a likely content-filter rejection and reword the prompt.
- Keep the openai-go client up to date to track provider schema changes.
- Log the full response when Data is empty so root cause is captured.
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
- image model returned neither base64 data nor URL
- download generated image failed with status %d
- generated image is empty
- generated image exceeds size limit
- unsupported generated image type: %s
AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12).
Data as JSON: /api/errors/a36227152637e60d.
Report an issue: GitHub.