CherryHQ/cherry-studio · error · Error
Image generation for '${sdkConfig.modelId}' completed but re
Error message
Image generation for '${sdkConfig.modelId}' completed but returned no image URLs What it means
Error "Image generation for '${sdkConfig.modelId}' completed but returned no image URLs" thrown in CherryHQ/cherry-studio.
Source
Thrown at src/main/ai/provider/custom/tasks/imageGenerationJobHandler.ts:132
if (captureContext) {
const completedAt = Date.now()
aiUsageRecordService.recordInvocation({
requestId: `custom-image:${ctx.jobId}`,
context: captureContext,
modality: 'image',
imageCount: urls.length,
metrics: { timeCompletionMs: Math.max(0, completedAt - usageStartedAt) },
completedAt
})
}
// An empty URL list from a *successful* submit/poll (e.g. content moderation
// or a degraded vendor response that still charged) must fail rather than
// complete as a silent zero-image "success". Covers both submit.imageUrls === []
// and poll() === []; the malformed-submit (neither field) case threw above.
// Recorded above with imageCount=0 because the provider invocation did complete.
if (urls.length === 0) {
throw new Error(`Image generation for '${sdkConfig.modelId}' completed but returned no image URLs`)
}
const files = await downloadAndPersistImageUrls(urls, ctx.signal, input.cleanupPolicy)
ctx.reportProgress(100, { stage: 'done' })
return { files } satisfies ImageGenerationJobOutput
}
}
async function buildSubmitInput(
input: ImageGenerationJobPayload,
modelId: string,
signal: AbortSignal
): Promise<ImageGenerationSubmitInput> {
const files = input.inputFileIds?.length ? await Promise.all(input.inputFileIds.map(readImageFile)) : undefined
const mask = input.maskFileId ? await readImageFile(input.maskFileId) : undefined
return {
modelId,
prompt: input.prompt,View on GitHub (pinned to 726446b54c)
Solutions
- Inspect the raw provider response to see which field carries the generated images and update the transport parser accordingly.
- Retry the request; some providers intermittently return empty result sets under load.
- Check the provider dashboard for content-filter rejections that yield a success status with no URLs.
Example fix
Map the provider's result field correctly, e.g. imageUrls: data.output.results.map(r => r.url), instead of assuming data.images.
When it happens
Trigger: The provider invocation completes successfully but yields an empty image URL list — either submit.imageUrls === [] or poll() resolves with [].
Common situations: Typical when content moderation blocks the generation or the vendor returns a degraded success response while still charging. The handler records the invocation with imageCount=0, then fails the job rather than reporting a silent zero-image success.
AI-assisted analysis of CherryHQ/cherry-studio@726446b54c (2026-08-12).
Data as JSON: /api/errors/c0ba4385f3cfe896.
Report an issue: GitHub.