siyuan-note/siyuan · error

prompt is required for image generation

Error message

prompt is required for image generation

What it means

GenerateImage requires a non-empty prompt. It trims the request's Prompt with strings.TrimSpace and, if nothing remains after the configured model validation passes, returns "prompt is required for image generation". The prompt is what is forwarded verbatim to the OpenAI-compatible image adapter.

Solutions

  1. Provide a non-empty Prompt field in GenerateImageRequest
  2. Trim and validate the prompt in the caller before constructing the request
  3. If the prompt comes from user input, disable the generate action until input is non-blank

Example fix

// before
req := model.GenerateImageRequest{Size: "1024x1024"}
// after
prompt := strings.TrimSpace(userInput)
if prompt == "" { return errors.New("prompt required") }
req := model.GenerateImageRequest{Prompt: prompt, Size: "1024x1024"}
Defensive patterns

Strategy: validation

Validate before calling

prompt := strings.TrimSpace(rawPrompt)
if prompt == "" {
    return errors.New("image prompt must be non-empty")
}

Try / catch

res, err := model.GenerateImage(ctx, model.GenerateImageRequest{Prompt: prompt})
if err != nil && strings.Contains(err.Error(), "prompt is required") {
    // surface 'prompt required' to the user instead of retrying
}

Prevention

When it happens

Trigger: Calling GenerateImage or GenerateDocumentImage with request.Prompt set to "", whitespace only, or left as the zero value of the struct.

Common situations: An agent pipeline passing an empty user instruction to image generation; UI code submitting the generate dialog before the prompt field is filled; a template substitution that produced an empty/whitespace string.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at kernel/model/assets.go:531

		Artifact: ImageArtifactRef{Kind: "image", Path: relativePath},
		Data:     prepared.Data,
		MIMEType: prepared.MIMEType,
		Prepared: prepared,
	}, nil
}

// GenerateImage 使用全局图片生成配置创建图片字节,可供文档资源、编辑器和其他图片入口复用。
func GenerateImage(ctx context.Context, request GenerateImageRequest) (GenerateImageResult, error) {
	if Conf == nil || Conf.AI == nil {
		return GenerateImageResult{}, errors.New("AI configuration is unavailable")
	}
	provider, generationModel := Conf.AI.GetImageGenerationModel()
	if err := validateImageModel(provider, generationModel); err != nil {
		return GenerateImageResult{}, err
	}
	prompt := strings.TrimSpace(request.Prompt)
	if prompt == "" {
		return GenerateImageResult{}, errors.New("prompt is required for image generation")
	}
	size := multimodalValueOrDefault(request.Size, Conf.AI.ImageGeneration.Size)
	quality := multimodalValueOrDefault(request.Quality, Conf.AI.ImageGeneration.Quality)
	outputFormat := strings.ToLower(multimodalValueOrDefault(request.OutputFormat, Conf.AI.ImageGeneration.OutputFormat))
	if outputFormat != "png" && outputFormat != "jpeg" && outputFormat != "webp" {
		return GenerateImageResult{}, errors.New("unsupported image output format")
	}
	generated, err := util.NewOpenAIImageAdapter(
		provider.APIKey, provider.BaseURL, generationModel.Name, Conf.AI.ImageGeneration.RequestTimeout, ResolveAIProviderHeaders(provider),
	).Generate(ctx, util.GenerateImageRequest{
		Prompt: prompt, Size: size, Quality: quality, OutputFormat: outputFormat,
	})
	if err != nil {
		return GenerateImageResult{}, markImageExecutionUnknown(fmt.Errorf("generate image failed: %w", err))
	}
	if ctx.Err() != nil {
		return GenerateImageResult{}, markImageExecutionUnknown(errors.New("image generation was cancelled"))
	}

View on GitHub (pinned to 9f775e8a12)