{"record":{"id":"0f589837dd0d3d37","repo":"siyuan-note/siyuan","slug":"save-generated-image-failed-w","errorCode":null,"errorMessage":"save generated image failed: %w","messagePattern":"save generated image failed: %w","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/assets.go","lineNumber":569,"sourceCode":"\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})\n\tif err != nil {\n\t\treturn GenerateDocumentImageResult{}, err\n\t}\n\tassetPath, _, err := InsertAssetBytes(bt.RootID, \"ai-image\"+generated.Extension, generated.Data)\n\tif err != nil {\n\t\treturn GenerateDocumentImageResult{}, markImageExecutionUnknown(fmt.Errorf(\"save generated image failed: %w\", err))\n\t}\n\treturn GenerateDocumentImageResult{\n\t\tArtifact: ImageArtifactRef{\n\t\t\tKind: \"image\", Path: assetPath, MIMEType: generated.MIMEType, DocumentID: bt.RootID,\n\t\t},\n\t\tRevisedPrompt: generated.RevisedPrompt,\n\t}, nil\n}\n\nfunc resolveMultimodalDocument(documentID string) (*treenode.BlockTree, error) {\n\tbt := treenode.GetBlockTree(strings.TrimSpace(documentID))\n\tif bt == nil {\n\t\treturn nil, errors.New(\"document not found: \" + documentID)\n\t}\n\treturn bt, nil\n}\n\nfunc validateImageModel(provider *conf.Provider, imageModel *conf.Model) error {","sourceCodeStart":551,"sourceCodeEnd":587,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/assets.go#L551-L587","documentation":"After a successful GenerateImage call, GenerateDocumentImage persists the resulting bytes into the document's assets via InsertAssetBytes(bt.RootID, \"ai-image\"+generated.Extension, generated.Data). If that insertion fails (write error, invalid root block, asset storage problem), the failure is wrapped as \"save generated image failed: %w\" and marked execution-unknown because the provider already produced the image.","triggerScenarios":"InsertAssetBytes fails: the document root block (bt.RootID) no longer exists or its tree cannot be written, the assets directory is not writable, the disk is full, or the file lock cannot be acquired.","commonSituations":"The target document was deleted by another client while generation was in flight; running the kernel with a read-only workspace; disk quota exhaustion; concurrent sync writing the same asset path.","solutions":["Check the wrapped cause: restore the document if it was deleted, or retry against an existing document","Verify the workspace data/assets directory is writable and has free space","Retry the generation; since the image already exists upstream, prefer re-saving with InsertAssetBytes using the cached bytes if available","Resolve sync conflicts on the target document before retrying"],"exampleFix":"// before\nbt := resolve doc by stale ID; InsertAssetBytes(bt.RootID, ...) // document deleted\n// after\nif treenode.GetBlockTree(docID) == nil { return errors.New(\"document missing; reselect target\") }\nassetPath, _, err := model.InsertAssetBytes(bt.RootID, \"ai-image\"+ext, data)","handlingStrategy":"try-catch","validationCode":"if treenode.GetBlockTree(docID) == nil {\n    return errors.New(\"target document missing; aborting image save\")\n}\nif err := util.IsWorkspaceReadOnly(); err != nil { return err } // if applicable","typeGuard":null,"tryCatchPattern":"res, err := model.GenerateDocumentImage(docID, req)\nif err != nil && strings.Contains(err.Error(), \"save generated image failed\") {\n    // image bytes were already generated; check disk space/permissions, then retry save\n}","preventionTips":["Keep the target document open/unchanged during generation","Ensure data/ is writable with sufficient free disk space","Resolve sync conflicts before launching generation against a document"],"tags":["file-write","assets","ai"],"backgroundTag":"file-write-failed","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"}