{"record":{"id":"14a0990e7943174b","repo":"siyuan-note/siyuan","slug":"generate-image-failed-w","errorCode":null,"errorMessage":"generate image failed: %w","messagePattern":"generate image failed: %w","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":545,"sourceCode":"\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}\n\treturn GenerateImageResult{\n\t\tData: generated.Data, MIMEType: generated.MIMEType, Extension: generated.Extension, RevisedPrompt: generated.RevisedPrompt,\n\t}, nil\n}\n\n// GenerateDocumentImage 使用通用图片生成能力创建文档资源。\nfunc GenerateDocumentImage(ctx context.Context, request GenerateDocumentImageRequest) (GenerateDocumentImageResult, error) {\n\tbt, err := resolveMultimodalDocument(request.DocumentID)\n\tif err != nil {\n\t\treturn GenerateDocumentImageResult{}, err\n\t}\n\tgenerated, err := GenerateImage(ctx, GenerateImageRequest{\n\t\tPrompt: request.Prompt, Size: request.Size, Quality: request.Quality, OutputFormat: request.OutputFormat,\n\t})","sourceCodeStart":527,"sourceCodeEnd":563,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/assets.go#L527-L563","documentation":"GenerateImage delegates actual image synthesis to util.NewOpenAIImageAdapter(...).Generate. Any error returned by the provider call (network failure, HTTP error, auth rejection, malformed response) is wrapped as \"generate image failed: %w\" and passed through markImageExecutionUnknown, since the request may or may not have consumed provider quota.","triggerScenarios":"The OpenAI-compatible image endpoint returns a non-2xx response (401 invalid API key, 402/429 quota, 5xx), the base URL is wrong, the network is unreachable, the context deadline (RequestTimeout) expires, or the response body cannot be parsed as an image result.","commonSituations":"Expired or revoked API key; third-party relay base URL that does not implement the images API; rate limiting after bursts of generations; firewall/proxy blocking the provider host; model name not enabled for image output on the account.","solutions":["Inspect the wrapped cause (%w) for the HTTP status / provider error message and fix accordingly (key, quota, model)","Verify Settings - AI provider API key and base URL, ensuring the endpoint implements the image generation API","Check network/proxy connectivity to the provider host and retry after backoff on 429/5xx","Increase Conf.AI.ImageGeneration.RequestTimeout if timeouts are the cause"],"exampleFix":"// before\nprovider.BaseURL = \"https://relay.example.com/v1\" // no /images endpoint\n// after\nprovider.BaseURL = \"https://api.openai.com/v1\" // OpenAI-compatible image API","handlingStrategy":"retry","validationCode":"provider, m := conf.Conf.AI.GetImageGenerationModel()\nif provider == nil || provider.APIKey == \"\" || m == nil {\n    return errors.New(\"image provider/key/model not configured\")\n}","typeGuard":null,"tryCatchPattern":"var apiErr *util.APIError // or inspect wrapped error\nres, err := model.GenerateImage(ctx, req)\nif err != nil {\n    if strings.Contains(err.Error(), \"429\") {\n        time.Sleep(backoff); return model.GenerateImage(ctx, req) // retry rate limits\n    }\n    return fmt.Errorf(\"image provider failed: %w\", err)\n}","preventionTips":["Test the API key and base URL with a minimal image request before production use","Add exponential backoff for 429/5xx responses","Set Conf.AI.ImageGeneration.RequestTimeout generously for slow providers","Confirm the relay/base URL implements the images generation endpoint"],"tags":["network","api","image-generation","ai"],"backgroundTag":"upstream-api-error","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"}