{"record":{"id":"7c7c94e9f79f9c94","repo":"siyuan-note/siyuan","slug":"prompt-is-required-for-image-generation","errorCode":null,"errorMessage":"prompt is required for image generation","messagePattern":"prompt is required for image generation","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":531,"sourceCode":"\t\tArtifact: ImageArtifactRef{Kind: \"image\", Path: relativePath},\n\t\tData:     prepared.Data,\n\t\tMIMEType: prepared.MIMEType,\n\t\tPrepared: prepared,\n\t}, nil\n}\n\n// GenerateImage 使用全局图片生成配置创建图片字节，可供文档资源、编辑器和其他图片入口复用。\nfunc GenerateImage(ctx context.Context, request GenerateImageRequest) (GenerateImageResult, error) {\n\tif Conf == nil || Conf.AI == nil {\n\t\treturn GenerateImageResult{}, errors.New(\"AI configuration is unavailable\")\n\t}\n\tprovider, generationModel := Conf.AI.GetImageGenerationModel()\n\tif err := validateImageModel(provider, generationModel); err != nil {\n\t\treturn GenerateImageResult{}, err\n\t}\n\tprompt := strings.TrimSpace(request.Prompt)\n\tif prompt == \"\" {\n\t\treturn GenerateImageResult{}, errors.New(\"prompt is required for image generation\")\n\t}\n\tsize := multimodalValueOrDefault(request.Size, Conf.AI.ImageGeneration.Size)\n\tquality := multimodalValueOrDefault(request.Quality, Conf.AI.ImageGeneration.Quality)\n\toutputFormat := strings.ToLower(multimodalValueOrDefault(request.OutputFormat, Conf.AI.ImageGeneration.OutputFormat))\n\tif outputFormat != \"png\" && outputFormat != \"jpeg\" && outputFormat != \"webp\" {\n\t\treturn GenerateImageResult{}, errors.New(\"unsupported image output format\")\n\t}\n\tgenerated, err := util.NewOpenAIImageAdapter(\n\t\tprovider.APIKey, provider.BaseURL, generationModel.Name, Conf.AI.ImageGeneration.RequestTimeout, ResolveAIProviderHeaders(provider),\n\t).Generate(ctx, util.GenerateImageRequest{\n\t\tPrompt: prompt, Size: size, Quality: quality, OutputFormat: outputFormat,\n\t})\n\tif err != nil {\n\t\treturn GenerateImageResult{}, markImageExecutionUnknown(fmt.Errorf(\"generate image failed: %w\", err))\n\t}\n\tif ctx.Err() != nil {\n\t\treturn GenerateImageResult{}, markImageExecutionUnknown(errors.New(\"image generation was cancelled\"))\n\t}","sourceCodeStart":513,"sourceCodeEnd":549,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/assets.go#L513-L549","documentation":"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.","triggerScenarios":"Calling GenerateImage or GenerateDocumentImage with request.Prompt set to \"\", whitespace only, or left as the zero value of the struct.","commonSituations":"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.","solutions":["Provide a non-empty Prompt field in GenerateImageRequest","Trim and validate the prompt in the caller before constructing the request","If the prompt comes from user input, disable the generate action until input is non-blank"],"exampleFix":"// before\nreq := model.GenerateImageRequest{Size: \"1024x1024\"}\n// after\nprompt := strings.TrimSpace(userInput)\nif prompt == \"\" { return errors.New(\"prompt required\") }\nreq := model.GenerateImageRequest{Prompt: prompt, Size: \"1024x1024\"}","handlingStrategy":"validation","validationCode":"prompt := strings.TrimSpace(rawPrompt)\nif prompt == \"\" {\n    return errors.New(\"image prompt must be non-empty\")\n}","typeGuard":null,"tryCatchPattern":"res, err := model.GenerateImage(ctx, model.GenerateImageRequest{Prompt: prompt})\nif err != nil && strings.Contains(err.Error(), \"prompt is required\") {\n    // surface 'prompt required' to the user instead of retrying\n}","preventionTips":["Validate prompt non-blank at the UI layer before enabling the generate action","Check template substitutions for empty output","Trim whitespace before constructing GenerateImageRequest"],"tags":["validation","ai","image-generation"],"backgroundTag":"empty-required-field","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}