diff --git a/components/canvas/AiWashWorkspace.tsx b/components/canvas/AiWashWorkspace.tsx index 965ed33db..31cc089d5 100644 --- a/components/canvas/AiWashWorkspace.tsx +++ b/components/canvas/AiWashWorkspace.tsx @@ -572,17 +572,22 @@ export function AiWashWorkspace({ }), [enabledPresets, modelOptionByRef, selectedLevelIndexByControl, selectedUserModel, selectedUserModelId] ); - const shouldShowUserModelSelector = useMemo( + const selectedExecutionState = useMemo( () => - !config.hideModelSelector && - presetExecutionStates.some((item) => item.usesUserSelectableModel), - [config.hideModelSelector, presetExecutionStates] + presetExecutionStates.find((item) => item.presetId === selectedResultId) || + presetExecutionStates.find( + (item) => item.presetId === selectedPreviewResult?.presetId + ) || + presetExecutionStates.find((item) => item.preset.isDefault) || + presetExecutionStates[0] || + null, + [presetExecutionStates, selectedPreviewResult?.presetId, selectedResultId] ); - const hasExecutableModelRefs = useMemo( - () => - presetExecutionStates.length > 0 && - presetExecutionStates.every((item) => Boolean(item.effectiveModelRef)), - [presetExecutionStates] + const selectedPresetHasExecutableModel = Boolean( + selectedExecutionState?.effectiveModelRef + ); + const shouldShowUserModelSelector = Boolean( + !config.hideModelSelector && selectedExecutionState?.usesUserSelectableModel ); useEffect(() => { @@ -727,8 +732,12 @@ export function AiWashWorkspace({ toast.error("请先选择一个可用的生图模型"); return; } - if (!hasExecutableModelRefs) { - toast.error("当前没有可用的 AI洗图 生图模型,请先在系统设置中配置模型"); + if (!selectedExecutionState) { + toast.error("请先选择一个 AI洗图增强预设"); + return; + } + if (!selectedPresetHasExecutableModel) { + toast.error("当前预设没有可用的 AI洗图 生图模型,请先在系统设置中配置模型"); return; } @@ -737,31 +746,33 @@ export function AiWashWorkspace({ setHistorySourceOverride(""); setIsSubmitting(true); setLastErrorMessage(""); + const activeExecutionState = selectedExecutionState; + const activePreset = activeExecutionState.preset; setResults( - enabledPresets.map((preset) => ({ - presetId: preset.id, - title: preset.title, - description: preset.description, - prompt: - presetExecutionStates.find((item) => item.presetId === preset.id) - ?.resolvedPrompt || preset.prompt, - modelId: - presetExecutionStates.find((item) => item.presetId === preset.id) - ?.resolvedModel?.modelId || - preset.modelId, - isDefault: preset.isDefault, - status: "submitting", - })) - ); - setSelectedResultId( - (enabledPresets.find((preset) => preset.isDefault) || enabledPresets[0])?.id || - "" + enabledPresets.map((preset) => { + const executionState = + presetExecutionStates.find((item) => item.presetId === preset.id) || null; + const isActivePreset = preset.id === activePreset.id; + return { + presetId: preset.id, + title: preset.title, + description: preset.description, + prompt: executionState?.resolvedPrompt || preset.prompt, + modelId: + executionState?.resolvedModel?.modelId || + executionState?.effectiveModelRef || + preset.modelId, + isDefault: preset.isDefault, + status: isActivePreset ? ("submitting" as const) : ("idle" as const), + }; + }) ); + setSelectedResultId(activePreset.id); setComparePositionById( - enabledPresets.reduce>((accumulator, preset) => { - accumulator[preset.id] = 50; - return accumulator; - }, {}) + (current) => ({ + ...current, + [activePreset.id]: 50, + }) ); const startedAt = Date.now(); @@ -781,7 +792,7 @@ export function AiWashWorkspace({ } const taskResults = await Promise.all( - presetExecutionStates.map(async (executionState, index) => { + [activeExecutionState].map(async (executionState, index) => { const { preset } = executionState; try { if (!executionState.effectiveModelRef) { @@ -843,9 +854,7 @@ export function AiWashWorkspace({ error: "", })); - if (preset.isDefault || index === 0) { - setSelectedResultId((current) => current || preset.id); - } + setSelectedResultId(preset.id); return { presetId: preset.id, @@ -917,7 +926,7 @@ export function AiWashWorkspace({ toast.success( failedItems.length > 0 ? `AI洗图已完成 ${successfulItems.length} 组,另有 ${failedItems.length} 组失败` - : `AI洗图已完成,共生成 ${successfulItems.length} 组结果` + : `AI洗图已完成:${selected?.title || "当前预设"}` ); } else { const message = failedItems[0]?.error || "AI洗图失败"; @@ -932,10 +941,11 @@ export function AiWashWorkspace({ config.imageSize, config.promptExtend, enabledPresets, - hasExecutableModelRefs, presetExecutionStates, persistHistoryBatches, resolvedHistoryScopeKey, + selectedExecutionState, + selectedPresetHasExecutableModel, selectedUserModel, shouldShowUserModelSelector, updateResultCard, @@ -992,13 +1002,6 @@ export function AiWashWorkspace({ ? comparePositionById[selectedPreviewResult.presetId] ?? 50 : 50; const previewHasImage = Boolean(selectedPreviewResult?.imageUrl); - const selectedExecutionState = - presetExecutionStates.find( - (item) => item.presetId === selectedPreviewResult?.presetId - ) || - presetExecutionStates.find((item) => item.preset.isDefault) || - presetExecutionStates[0] || - null; return (
@@ -1378,7 +1381,7 @@ export function AiWashWorkspace({ isSubmitting || !compareSourceUrl || enabledPresets.length === 0 || - !hasExecutableModelRefs || + !selectedPresetHasExecutableModel || (shouldShowUserModelSelector && !selectedUserModel) } onClick={handleSubmit}