{"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":"warning","filePath":"kernel/model/assets.go","lineNumber":423,"sourceCode":"\t\tArtifact: ImageArtifactRef{Kind: \"image\", Path: assetPath, DocumentID: bt.RootID},\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,\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":405,"sourceCodeEnd":441,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/251596fc0de2f9528c00c224252fd073a99973f4/kernel/model/assets.go#L405-L441","documentation":"Returned by GenerateImage when strings.TrimSpace(request.Prompt) is empty. Pure input validation, checked after AI config and model validation but before any provider call. A non-empty prompt is mandatory because the image model has nothing to render otherwise.","triggerScenarios":"Calling GenerateImage with request.Prompt = \"\" or whitespace; a UI that submits the form before the user types; a caller that forwards a request whose prompt field was omitted in JSON.","commonSituations":"An empty form submit; a programmatic caller that builds the request conditionally and skipped the prompt; whitespace-only prompt after a failed template substitution.","solutions":["Validate prompt is non-empty after trimming at the API/UI boundary and return a 400 there.","Disable the generate button until the user has typed at least one non-whitespace character."],"exampleFix":"// before\nres, err := model.GenerateImage(ctx, model.GenerateImageRequest{Prompt: prompt})\n\n// after\nif strings.TrimSpace(prompt) == \"\" {\n    return errors.New(\"prompt is required\")\n}\nres, err := model.GenerateImage(ctx, model.GenerateImageRequest{Prompt: prompt})","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(request.Prompt) == \"\" {\n    return errors.New(\"prompt is required\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Disable the generate button until non-whitespace prompt text exists.","Return a 400 at the HTTP boundary for empty prompts rather than reaching the kernel."],"tags":["validation","ai","input-validation"],"backgroundTag":null,"analyzedSha":"251596fc0de2f9528c00c224252fd073a99973f4","analyzedAt":"2026-08-12T21:18:37.123Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}