diff --git a/src/components/nodes/ControlPanel.tsx b/src/components/nodes/ControlPanel.tsx index 93d795a0..da2f28bb 100644 --- a/src/components/nodes/ControlPanel.tsx +++ b/src/components/nodes/ControlPanel.tsx @@ -587,80 +587,10 @@ function GenerateVideoControls({ node }: { node: Node }) { function Generate3DControls({ node }: { node: Node }) { const nodeData = node.data as Generate3DNodeData; const updateNodeData = useWorkflowStore((state) => state.updateNodeData); - const { replicateApiKey, falApiKey, kieApiKey, replicateEnabled, kieEnabled } = useProviderApiKeys(); - const [externalModels, setExternalModels] = useState([]); - const [isLoadingModels, setIsLoadingModels] = useState(false); const [isBrowseDialogOpen, setIsBrowseDialogOpen] = useState(false); const currentProvider: ProviderType = nodeData.selectedModel?.provider || "fal"; - const enabledProviders = useMemo(() => { - const providers: { id: ProviderType; name: string }[] = []; - providers.push({ id: "fal", name: "fal.ai" }); - if (replicateEnabled && replicateApiKey) { - providers.push({ id: "replicate", name: "Replicate" }); - } - if (kieEnabled && kieApiKey) { - providers.push({ id: "kie", name: "Kie.ai" }); - } - return providers; - }, [replicateEnabled, replicateApiKey, kieEnabled, kieApiKey]); - - const fetchModels = useCallback(async () => { - setIsLoadingModels(true); - try { - const capabilities = MODEL_3D_CAPABILITIES.join(","); - const headers: HeadersInit = {}; - if (replicateApiKey) headers["X-Replicate-Key"] = replicateApiKey; - if (falApiKey) headers["X-Fal-Key"] = falApiKey; - if (kieApiKey) headers["X-Kie-Key"] = kieApiKey; - - const response = await deduplicatedFetch(`/api/models?provider=${currentProvider}&capabilities=${capabilities}`, { headers }); - if (response.ok) { - const data = await response.json(); - setExternalModels(data.models || []); - } - } catch (error) { - console.error("Failed to fetch models:", error); - } finally { - setIsLoadingModels(false); - } - }, [currentProvider, replicateApiKey, falApiKey, kieApiKey]); - - useEffect(() => { - fetchModels(); - }, [fetchModels]); - - const handleProviderChange = useCallback( - (e: React.ChangeEvent) => { - const provider = e.target.value as ProviderType; - updateNodeData(node.id, { - selectedModel: { provider, modelId: "", displayName: "Select model..." }, - parameters: {} - }); - }, - [node.id, updateNodeData] - ); - - const handleModelChange = useCallback( - (e: React.ChangeEvent) => { - const modelId = e.target.value; - const model = externalModels.find(m => m.id === modelId); - if (model) { - updateNodeData(node.id, { - selectedModel: { - provider: currentProvider, - modelId: model.id, - displayName: model.name, - capabilities: model.capabilities, - }, - parameters: {} - }); - } - }, - [node.id, currentProvider, externalModels, updateNodeData] - ); - const handleParametersChange = useCallback( (parameters: Record) => { updateNodeData(node.id, { parameters }); @@ -684,36 +614,40 @@ function Generate3DControls({ node }: { node: Node }) { return ( <>
-
- - -
- -
- -
- + {/* Model name + provider with link */} +
+
+
+
+ {nodeData.selectedModel?.displayName || "Select model..."} +
+
+ + {getProviderDisplayName(currentProvider)} + + {nodeData.selectedModel?.modelId && ( + { + if (!getModelPageUrl(currentProvider, nodeData.selectedModel?.modelId || "")) { + e.preventDefault(); + } + }} + > + + + + + )} +
+