siyuan-note/siyuan · error

image model returned no image

Error message

image model returned no image

What it means

After CreateImage succeeds at the HTTP level, the adapter checks that the response contains at least one item in response.Data. When the provider returns an empty Data array, there is nothing to decode, so Generate returns this error. It guards against providers/proxies that answer 200 with no image payload.

Solutions

  1. Verify the configured image model is actually an image-capable model (e.g. dall-e-2/3, not a chat model)
  2. Call the provider directly once (curl) to confirm it returns a non-empty data array — if not, fix the proxy/gateway
  3. Check provider response for content-policy filtering and surface it to the user
  4. Retry the generation; transient provider issues can yield empty results

Example fix

// before
resp, err := adapter.client.CreateImage(ctx, req) // resp.Data empty -> 'image model returned no image'
// after
resp, err := adapter.client.CreateImage(ctx, req)
if err != nil { return err }
if len(resp.Data) == 0 {
    return fmt.Errorf("image model %s returned no image; check model ID and provider response", adapter.model)
}
Defensive patterns

Strategy: validation

Validate before calling

if len(response.Data) == 0 {
    // surface a retry/fallback path instead of indexing Data[0]
}

Try / catch

if err != nil {
    return fmt.Errorf("image generation failed: %w", err)
}
if len(response.Data) == 0 {
    return retryOrFail() // handle empty Data explicitly
}

Prevention

When it happens

Trigger: adapter.client.CreateImage returns a response whose Data slice has length 0 — e.g. the model produced no image, a proxy/gateway stripped the data array, or the configured model ID is not an image model and returned an empty success payload.

Common situations: Pointing the image model setting at a chat model via a compatible proxy; a self-hosted gateway returning an empty JSON body parsed as an empty Data array; provider-side content filtering that silently drops the image; API version mismatch returning a different response shape.

Understand the failure class

Background: "empty response", "returned no data", "empty embeddings": what HTTP 200-with-empty-body errors mean across libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19). Data as JSON: /api/errors/a36227152637e60d. Report an issue: GitHub.

Appendix: source

Thrown at kernel/util/openai.go:906

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