From 3982d7f91ca41a3e8d573c8a66e81d9d95f3f21f Mon Sep 17 00:00:00 2001 From: MasterChiefCN <49179444+MasterChiefCN@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:56:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(canvas):=20=E5=B1=80=E9=83=A8=E9=87=8D?= =?UTF-8?q?=E7=BB=98=20-=20=E5=90=8C=E6=AD=A5=E9=BB=98=E8=AE=A4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=A8=A1=E5=9E=8B=E4=B8=8E=E7=94=9F=E6=88=90=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/content/docs/progress/pending-test.mdx | 7 +++++++ .../canvas/canvas-node-mask-edit-dialog.tsx | 11 +++++++---- web/src/pages/canvas/use-canvas-media-tools.ts | 4 ++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/content/docs/progress/pending-test.mdx b/docs/content/docs/progress/pending-test.mdx index 6e38a1e18..7055c238c 100644 --- a/docs/content/docs/progress/pending-test.mdx +++ b/docs/content/docs/progress/pending-test.mdx @@ -5,6 +5,13 @@ description: 当前项目已实现功能的手工验证清单与未确认边界 # 待测试 +## 局部重绘默认模型同步 + +- 已修复:局部重绘弹窗打开时,将默认显示的图片模型同步到实际请求模型;下拉框显示与提交使用同一字段,无需手动重新选择模型。 +- 已修复:局部重绘任务优先使用提交的图片模型,并将 `model` 与 `imageModel` 统一为本次选中的模型。 +- [ ] 上传图片,在全局当前模型与默认图片模型不同的情况下打开局部重绘,直接涂抹、填写修改要求并生成,确认不再出现「所选模型与任务能力不匹配」。 +- [ ] 在弹窗中切换图片模型,以及从已有生成图片打开局部重绘,确认提交模型与显示模型一致。 + ## 系统模型「拉取模型」弹窗搜索 - 已实现:后台「模型与资源 → 系统模型」点「拉取模型」后的选择弹窗新增搜索框(按模型标识做大小写不敏感的子串匹配,自动聚焦、可一键清空),因为部分上游端点会返回几百个模型。 diff --git a/web/src/components/canvas/canvas-node-mask-edit-dialog.tsx b/web/src/components/canvas/canvas-node-mask-edit-dialog.tsx index 563f37a03..1b6f8e223 100644 --- a/web/src/components/canvas/canvas-node-mask-edit-dialog.tsx +++ b/web/src/components/canvas/canvas-node-mask-edit-dialog.tsx @@ -30,7 +30,10 @@ function MaskEditor({ dataUrl, config, onClose, onConfirm }: MaskEditorProps) { const [diameter, setDiameter] = useState(100); const [mode, setMode] = useState("paint"); const [prompt, setPrompt] = useState(""); - const [settings, setSettings] = useState(config); + const [settings, setSettings] = useState(() => { + const model = config.imageModel || config.model; + return { ...config, model, imageModel: model }; + }); const [error, setError] = useState(""); const [strokeCount, setStrokeCount] = useState(0); const theme = canvasThemes[useActiveTheme()]; @@ -61,8 +64,8 @@ function MaskEditor({ dataUrl, config, onClose, onConfirm }: MaskEditorProps) { let maskDataUrl: string; try { maskDataUrl = exportEditMask(size.width, size.height, strokes.current); } catch (failure) { setError(failure instanceof Error ? failure.message : "遮罩生成失败"); return; } - const { model, imageModel, quality, count, transparentBackground } = settings; - onConfirm({ prompt: prompt.trim(), maskDataUrl, generationConfig: { model, imageModel, size: settings.size, quality, count, transparentBackground } }); + const { model, quality, count, transparentBackground } = settings; + onConfirm({ prompt: prompt.trim(), maskDataUrl, generationConfig: { model, imageModel: model, size: settings.size, quality, count, transparentBackground } }); }; return ( @@ -96,7 +99,7 @@ function MaskEditor({ dataUrl, config, onClose, onConfirm }: MaskEditorProps) { - setSettings((previous) => ({ ...previous, ...defaultImageParamsForModel(previous, model), imageModel: model, model }))} /> + setSettings((previous) => ({ ...previous, ...defaultImageParamsForModel(previous, model), imageModel: model, model }))} /> setSettings((previous) => ({ ...previous, [key]: value }))} /> }]} /> {error || loadError ?

{error || loadError}

: null} diff --git a/web/src/pages/canvas/use-canvas-media-tools.ts b/web/src/pages/canvas/use-canvas-media-tools.ts index 825405d5d..74ff62d91 100644 --- a/web/src/pages/canvas/use-canvas-media-tools.ts +++ b/web/src/pages/canvas/use-canvas-media-tools.ts @@ -681,7 +681,7 @@ export function useCanvasMediaTools({ const maskEditImageNode = useCallback(async (node: CanvasNodeData, payload: CanvasImageMaskEditPayload) => { if (!node.metadata?.content) return; const baseGenerationConfig = buildGenerationConfig(effectiveConfig, node, "image"); - const selectedModel = payload.generationConfig?.model || payload.generationConfig?.imageModel || baseGenerationConfig.model; + const selectedModel = payload.generationConfig?.imageModel || payload.generationConfig?.model || baseGenerationConfig.model; const modelDefaults = defaultImageParamsForModel(baseGenerationConfig, selectedModel); const selectedImageProfile = modelCapabilityConfigFor(baseGenerationConfig, selectedModel).image; if (!selectedImageProfile?.references.maskSupported) { @@ -692,7 +692,7 @@ export function useCanvasMediaTools({ ...baseGenerationConfig, ...payload.generationConfig, model: selectedModel, - imageModel: payload.generationConfig?.imageModel || payload.generationConfig?.model || effectiveConfig.imageModel, + imageModel: selectedModel, quality: normalizeMaskEditQuality(payload.generationConfig?.quality || node.metadata?.quality || baseGenerationConfig.quality || modelDefaults.quality, payload.generationConfig?.size || node.metadata?.size || baseGenerationConfig.size || modelDefaults.size), count: String(payload.generationConfig?.count || 1), // 原图像素尺寸不是模型的输出尺寸合同;非高级设置时使用模型默认尺寸,避免把节点尺寸误发给上游。