diff --git a/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx b/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx index dc53dd505..2e198b6ff 100644 --- a/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx +++ b/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx @@ -58,8 +58,10 @@ import { getAgentWorkflowSpecialModuleRootOptions, getEnabledAgentWorkflowOptionTree, getAgentWorkflowCategoryLabels, + getAgentWorkflowBusinessModeSettings, getAgentWorkflowConstraintSettings, getAgentWorkflowPageFeatureSettings, + normalizeAgentWorkflowBusinessModeSettings, normalizeAgentWorkflowOptionOrdering, flattenAgentWorkflowSteps, normalizeAgentWorkflowStepOrdering, @@ -129,6 +131,8 @@ import type { AgentPresetLibraryConfig, AgentPsdTextColorBrandConfig, AgentPresetLibrarySection, + AgentWorkflowBusinessModeConfig, + AgentWorkflowBusinessModeKey, AgentWorkflowBrandModelConfig, AgentWorkflowBrandStoreEntry, AgentWorkflowCategoryLabels, @@ -2046,6 +2050,10 @@ export function AgentWorkflowSettingsClient({ () => getAgentWorkflowPageFeatureSettings(config), [config] ); + const workflowBusinessModeSettings = useMemo( + () => getAgentWorkflowBusinessModeSettings(config), + [config] + ); const firstCategoryLabel = categoryLabels.firstCategory; const secondCategoryLabel = categoryLabels.secondCategory; const thirdCategoryLabel = categoryLabels.thirdCategory; @@ -3535,6 +3543,61 @@ export function AgentWorkflowSettingsClient({ } }; + const updateBusinessMode = ( + modeKey: AgentWorkflowBusinessModeKey, + updater: (current: AgentWorkflowBusinessModeConfig) => AgentWorkflowBusinessModeConfig + ) => { + setConfig((prev) => { + const currentSettings = normalizeAgentWorkflowBusinessModeSettings( + prev.businessModeSettings + ); + return { + ...prev, + businessModeSettings: { + modes: currentSettings.modes.map((mode) => + mode.key === modeKey ? updater(mode) : mode + ), + }, + }; + }); + }; + + const handleUploadBusinessModeSvg = async ( + modeKey: AgentWorkflowBusinessModeKey, + file: File + ) => { + const isSvg = + file.type === "image/svg+xml" || file.name.toLowerCase().endsWith(".svg"); + if (!isSvg) { + toast.error("请上传 SVG 图标"); + return; + } + + const refKey = `business-mode:${modeKey}`; + try { + setUploadingKey(refKey); + const formData = new FormData(); + formData.append("file", file); + + const response = await fetchUploadWithRetry(formData); + const result = await response.json(); + + if (!response.ok || !result?.url) { + throw new Error(result?.error || "上传失败"); + } + + updateBusinessMode(modeKey, (mode) => ({ + ...mode, + customSvgUrl: result.url, + })); + toast.success("SVG 图标上传成功"); + } catch (error) { + toast.error(error instanceof Error ? error.message : "SVG 图标上传失败"); + } finally { + setUploadingKey(null); + } + }; + const updateSelectedBrandPsdTextColorConfig = ( updater: (current: AgentPsdTextColorBrandConfig | AgentPsdTextColorConfig) => { enabled: boolean; @@ -5654,7 +5717,7 @@ export function AgentWorkflowSettingsClient({ onChange={(e) => setShowcaseConfig((prev) => ({ ...prev, subtitle: e.target.value })) } - placeholder="选择生图模式、查询商品图、完成风格配置并实时查看结果" + placeholder="选择品牌、配置风格化提示词、选择生图模式并查看结果" /> @@ -5866,7 +5929,7 @@ export function AgentWorkflowSettingsClient({
- 先选择一个生图模式,系统会按模板配置展示对应的产品图和模特图槽位。 + 先选择风格化模板,系统会按模板配置展示对应的产品图和模特图槽位。
)}- 先确定本次使用的模式,并完成品牌和店铺选择,后续的商品图、品牌模特、参考图和结果展示都会随之联动。 + 先确定品牌、店铺和类目,让后续风格化提示词、素材搜索和 PSD 模板都能拿到同一套业务上下文。
- {isDetailReplacementPreset || isSkuReplacementPreset ? ( -- {isDetailReplacementPreset - ? isDetailAiGenerationMethod - ? "当前模板已切换到 AI详情生成,系统会直接复用智能规划详情链路生成整套详情图。" - : "当前模板属于参考图替换模式,结果区会按参考图顺序逐屏展示。" - : "当前模板属于 SKU 替换模式,结果区会按参考图顺序一对一展示。"} -
- ) : null} -+ 先完成风格、空间、光线、机位、人群等通用提示词配置;这些配置会被后面的不同生图模式共用。 +
++ 这里沿用现有模板库作为生成执行配置;后续固定业务模式会接管前台入口展示。 +
++ 生图模式只决定输出链路和素材规则,前面配置好的风格化提示词会在不同模式中共用。 +
+ {isBusinessModePresetMismatch ? ( ++ 当前风格化模板与所选生图模式不匹配,请在上方模板库切换到对应类型后再生成。 +
+ ) : null} +- 先搜索商品白底图与搭配图,再继续完成风格步骤和生成参数配置。 + 根据当前生图模式选择商品白底图、SKU 图、详情参考图或手动上传素材,素材确认后再进入结果生成。
- 先完成风格步骤卡片,再继续选择品牌模特,方便后续做人群联动,不再跳转第二个页面。 -
-{!requiresPresetSelection || selectedAgentPresetId ? `${getResultModeLabel(activeResultModeType)}结果暂为空` - : "请选择生图模式"} + : "请选择风格化模板"}
{!requiresPresetSelection || selectedAgentPresetId ? "选择模型并开始生成后,结果会保留在当前项目的对应分类中。" - : "请先从顶部流程线选择一个生图模式"} + : "请先完成上方风格化模板配置"}
{isPsdTemplateEnabled ? ( <> diff --git a/components/agents/AgentPresetPanelDarkV2.tsx b/components/agents/AgentPresetPanelDarkV2.tsx index 1b298f148..d2092a575 100644 --- a/components/agents/AgentPresetPanelDarkV2.tsx +++ b/components/agents/AgentPresetPanelDarkV2.tsx @@ -512,7 +512,7 @@ export function AgentPresetPanelDarkV2({