From f46b06a75dfbae55193ff29bc2cb106ac8b5b0c1 Mon Sep 17 00:00:00 2001 From: yun Date: Wed, 1 Jul 2026 09:40:04 +0800 Subject: [PATCH] =?UTF-8?q?=20=E5=88=A0=E9=99=A4=E6=97=A7=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/nodes/ControlPanel.tsx | 159 +----------------------- src/store/generationPreferenceStore.ts | 17 +-- src/store/utils/nodeDefaults.ts | 18 +-- src/types/nodes.ts | 12 +- src/utils/defaultGenerationNodeModel.ts | 7 -- 5 files changed, 12 insertions(+), 201 deletions(-) diff --git a/src/components/nodes/ControlPanel.tsx b/src/components/nodes/ControlPanel.tsx index 16b81897..e636bba2 100644 --- a/src/components/nodes/ControlPanel.tsx +++ b/src/components/nodes/ControlPanel.tsx @@ -4,7 +4,7 @@ import { useMemo, useState, useCallback, useEffect, useRef } from "react"; import { createPortal } from "react-dom"; import { Node } from "@xyflow/react"; import { useWorkflowStore, saveNanoBananaDefaults, useProviderApiKeys } from "@/store/workflowStore"; -import { NodeType, NanoBananaNodeData, GenerateVideoNodeData, Generate3DNodeData, GenerateAudioNodeData, EaseCurveNodeData, ConditionalSwitchNodeData, AspectRatio, Resolution, ModelType, MODEL_DISPLAY_NAMES, ProviderType, SelectedModel, MatchMode, ConditionalSwitchRule } from "@/types"; +import { NodeType, NanoBananaNodeData, Generate3DNodeData, GenerateAudioNodeData, EaseCurveNodeData, ConditionalSwitchNodeData, AspectRatio, Resolution, ModelType, MODEL_DISPLAY_NAMES, ProviderType, SelectedModel, MatchMode, ConditionalSwitchRule } from "@/types"; import { ProviderModel, ModelCapability } from "@/lib/providers/types"; import { ModelSearchDialog } from "@/components/modals/ModelSearchDialog"; import { ModelParameters } from "./ModelParameters"; @@ -21,8 +21,6 @@ import { isPopiProviderMode, POPI_PROVIDER_ID } from "@/lib/providerMode"; import { appendPopiModelQueryParams } from "@/utils/popiModelFilters"; import { SINGLE_INPUT_HANDLE_ID } from "@/utils/nodeHandles"; import { toSelectedModel } from "@/utils/selectedModel"; -import { -} from "@/utils/videoGenerationSettings"; // List of node types that have configurable parameters const CONFIGURABLE_NODE_TYPES: NodeType[] = [ @@ -150,9 +148,6 @@ export function ControlPanel() { {(selectedNode.type === "smartImage" || selectedNode.type === "nanoBanana") && ( )} - {selectedNode.type === "generateVideo" && ( - - )} {selectedNode.type === "generate3d" && ( )} @@ -510,158 +505,6 @@ function GenerateImageControls({ node }: { node: Node }) { ); } -// Generate Video Controls -function GenerateVideoControls({ node }: { node: Node }) { - const nodeData = node.data as GenerateVideoNodeData; - const { t } = useI18n(); - const updateNodeData = useWorkflowStore((state) => state.updateNodeData); - const regenerateNode = useWorkflowStore((state) => state.regenerateNode); - const isRunning = useWorkflowStore((state) => state.isRunning); - const [isBrowseDialogOpen, setIsBrowseDialogOpen] = useState(false); - const popiProviderMode = isPopiProviderMode(); - - const currentProvider: ProviderType = nodeData.selectedModel?.provider || (popiProviderMode ? POPI_PROVIDER_ID : "fal"); - - const handleParametersChange = useCallback( - (parameters: Record) => { - updateNodeData(node.id, { parameters }); - }, - [node.id, updateNodeData] - ); - - const handleBrowseModelSelect = useCallback((model: ProviderModel) => { - const newSelectedModel: SelectedModel = toSelectedModel(model); - updateNodeData(node.id, { - selectedModel: newSelectedModel, - resolution: nodeData.resolution ?? DEFAULT_VIDEO_RESOLUTION, - durationSeconds: nodeData.durationSeconds ?? DEFAULT_VIDEO_DURATION_SECONDS, - soundEnabled: getDefaultVideoSoundEnabled(newSelectedModel), - parameters: {}, - }); - setIsBrowseDialogOpen(false); - }, [node.id, nodeData.durationSeconds, nodeData.resolution, updateNodeData]); - - const videoSoundSupported = modelSupportsVideoSound(nodeData.selectedModel); - const hiddenVideoParameterNames = videoSoundSupported - ? VIDEO_FIRST_CLASS_PARAMETER_NAMES - : [...VIDEO_DURATION_PARAMETER_NAMES, ...VIDEO_RESOLUTION_PARAMETER_NAMES]; - - return ( - <> -
- {/* Model name + provider with link */} -
-
-
-
- {nodeData.selectedModel?.displayName || t("node.selectModel")} -
- {!popiProviderMode && ( -
- - {getProviderDisplayName(currentProvider)} - - {nodeData.selectedModel?.modelId && ( - { - if (!getModelPageUrl(currentProvider, nodeData.selectedModel?.modelId || "")) { - e.preventDefault(); - } - }} - > - - - - - )} -
- )} -
- -
-
- -
- - - {videoSoundSupported && ( - - )} -
- - {nodeData.selectedModel?.modelId && ( - - )} -
- -
- -
- - {isBrowseDialogOpen && ( - setIsBrowseDialogOpen(false)} - onModelSelected={handleBrowseModelSelect} - initialCapabilityFilter="video" - /> - )} - - ); -} - // Generate 3D Controls function Generate3DControls({ node }: { node: Node }) { const nodeData = node.data as Generate3DNodeData; diff --git a/src/store/generationPreferenceStore.ts b/src/store/generationPreferenceStore.ts index 3852cc1b..1d70a5c8 100644 --- a/src/store/generationPreferenceStore.ts +++ b/src/store/generationPreferenceStore.ts @@ -5,10 +5,6 @@ import { createPopiserverDefaultImageModel, createPopiserverDefaultVideoModel, } from "@/store/utils/defaultImageModel"; -import { - DEFAULT_VIDEO_DURATION_SECONDS, - DEFAULT_VIDEO_RESOLUTION, -} from "@/utils/videoGenerationSettings"; export type GenerationPreferenceType = "image" | "video" | "audio"; @@ -25,10 +21,9 @@ export interface VideoGenerationPreference { [key: string]: unknown; type: "video"; model: SelectedModel; - aspectRatio: string; - resolution: string; - durationSeconds: number; - soundEnabled?: boolean; + parameters?: Record; + extraTaskParams?: Record; + subType?: number; } export interface AudioGenerationPreference { @@ -61,10 +56,8 @@ function createInitialVideoPreference(): VideoGenerationPreference { return { type: "video", model: createPopiserverDefaultVideoModel(), - aspectRatio: "9:16", - resolution: DEFAULT_VIDEO_RESOLUTION, - durationSeconds: DEFAULT_VIDEO_DURATION_SECONDS, - soundEnabled: true, + parameters: {}, + extraTaskParams: {}, }; } diff --git a/src/store/utils/nodeDefaults.ts b/src/store/utils/nodeDefaults.ts index d336cd8d..a0318f42 100644 --- a/src/store/utils/nodeDefaults.ts +++ b/src/store/utils/nodeDefaults.ts @@ -37,10 +37,6 @@ import { import { loadNodeDefaults } from "./localStorage"; import { POPISERVER_DEFAULT_IMAGE_MODEL_ID } from "./defaultImageModel"; import { DEFAULT_POPISERVER_LLM_MODEL_ID } from "@/lib/llmModels"; -import { - getDefaultVideoSoundEnabled, - normalizeVideoDurationSeconds, -} from "@/utils/videoGenerationSettings"; import { useGenerationPreferenceStore } from "@/store/generationPreferenceStore"; export { DEFAULT_NODE_DIMENSIONS, @@ -154,8 +150,6 @@ export const createDefaultNodeData = (type: NodeType): WorkflowNodeData => { case "smartVideo": { const videoPreference = useGenerationPreferenceStore.getState().video; const selectedModel = videoPreference.model; - const durationSeconds = normalizeVideoDurationSeconds(videoPreference.durationSeconds); - const soundEnabled = videoPreference.soundEnabled ?? getDefaultVideoSoundEnabled(selectedModel); return { video: null, uploadStatus: "idle", @@ -167,11 +161,8 @@ export const createDefaultNodeData = (type: NodeType): WorkflowNodeData => { inputImages: [], inputPrompt: null, outputVideo: null, - aspectRatio: videoPreference.aspectRatio as AspectRatio, - resolution: videoPreference.resolution, - durationSeconds, - soundEnabled, selectedModel, + parameters: videoPreference.parameters ?? {}, status: "idle", error: null, videoHistory: [], @@ -252,17 +243,12 @@ export const createDefaultNodeData = (type: NodeType): WorkflowNodeData => { case "generateVideo": { const videoPreference = useGenerationPreferenceStore.getState().video; const selectedModel = videoPreference.model; - const durationSeconds = normalizeVideoDurationSeconds(videoPreference.durationSeconds); - const soundEnabled = videoPreference.soundEnabled ?? getDefaultVideoSoundEnabled(selectedModel); return { inputImages: [], inputPrompt: null, outputVideo: null, - aspectRatio: videoPreference.aspectRatio as AspectRatio, - resolution: videoPreference.resolution, - durationSeconds, - soundEnabled, selectedModel, + parameters: videoPreference.parameters ?? {}, status: "idle", error: null, videoHistory: [], diff --git a/src/types/nodes.ts b/src/types/nodes.ts index e872d5fd..2faaaada 100644 --- a/src/types/nodes.ts +++ b/src/types/nodes.ts @@ -269,15 +269,11 @@ export interface GenerateVideoNodeData extends BaseNodeData { outputVideoRemoteUrl?: string; // Original provider URL retained for fallback/re-download outputVideoRemoteExpiresAt?: string; // Best-effort expiry timestamp for signed provider URLs outputVideoStorageStatus?: MediaStorageStatus; // Local persistence state for provider URLs - aspectRatio?: AspectRatio; - resolution?: string; - durationSeconds?: number; fps?: number; - soundEnabled?: boolean; selectedModel?: SelectedModel; // Required for video generation (no legacy fallback) lastUsedModel?: SelectedModel; // The model that produced the current output referenceSubjectList?: ComposerReferenceSubject[]; - parameters?: Record; // Legacy mirror of config.parameters; model-specific dynamic parameters only + parameters?: Record; // Model-specific dynamic parameters only extraTaskParams?: Record; subType?: number; modelSchemaLoading?: boolean; @@ -630,9 +626,9 @@ export interface GenerateVideoNodeDefaults { modelId: string; displayName: string; }; - resolution?: string; - durationSeconds?: number; - soundEnabled?: boolean; + parameters?: Record; + extraTaskParams?: Record; + subType?: number; } export interface Generate3DNodeDefaults { diff --git a/src/utils/defaultGenerationNodeModel.ts b/src/utils/defaultGenerationNodeModel.ts index fe779f94..afc88bbd 100644 --- a/src/utils/defaultGenerationNodeModel.ts +++ b/src/utils/defaultGenerationNodeModel.ts @@ -11,7 +11,6 @@ import { POPISERVER_DEFAULT_VIDEO_MODEL_ID, } from "@/store/utils/defaultImageModel"; import { useGenerationPreferenceStore } from "@/store/generationPreferenceStore"; -import { normalizeVideoDurationSeconds } from "@/utils/videoGenerationSettings"; import { toSelectedModel } from "@/utils/selectedModel"; type GenerationNodeType = "smartImage" | "smartVideo" | "smartAudio" | "smartText" | "nanoBanana" | "generateVideo" | "generateAudio" | "llmGenerate"; @@ -90,15 +89,9 @@ async function buildGenerationPreferenceNodeData(type: NodeType): Promise;