From 9f9f4497ccaeee355f421f36f7e02e4ce147442a Mon Sep 17 00:00:00 2001 From: shrimbly Date: Sat, 14 Feb 2026 23:34:59 +1300 Subject: [PATCH] feat: route 3D models to generate3d in ModelSearchDialog Add "3d" capability filter, update handleSelectModel to detect 3D models and create generate3d nodes with capabilities passed through, update recent models filter for 3D. Co-Authored-By: Claude Opus 4.6 --- src/components/modals/ModelSearchDialog.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/modals/ModelSearchDialog.tsx b/src/components/modals/ModelSearchDialog.tsx index f6ef7246..cddae617 100644 --- a/src/components/modals/ModelSearchDialog.tsx +++ b/src/components/modals/ModelSearchDialog.tsx @@ -89,7 +89,7 @@ function getPaneCenter() { } // Capability filter options -type CapabilityFilter = "all" | "image" | "video"; +type CapabilityFilter = "all" | "image" | "video" | "3d"; // API response type interface ModelsResponse { @@ -200,7 +200,9 @@ export function ModelSearchDialog({ const capabilities = capabilityFilter === "image" ? "text-to-image,image-to-image" - : "text-to-video,image-to-video"; + : capabilityFilter === "video" + ? "text-to-video,image-to-video" + : "text-to-3d,image-to-3d"; params.set("capabilities", capabilities); } if (bypassCache) { @@ -315,14 +317,18 @@ export function ModelSearchDialog({ const isVideoModel = model.capabilities.some( (cap) => cap === "text-to-video" || cap === "image-to-video" ); + const is3DModel = model.capabilities.some( + (cap) => cap === "text-to-3d" || cap === "image-to-3d" + ); - const nodeType = isVideoModel ? "generateVideo" : "nanoBanana"; + const nodeType = isVideoModel ? "generateVideo" : is3DModel ? "generate3d" : "nanoBanana"; addNode(nodeType, position, { selectedModel: { provider: model.provider, modelId: model.id, displayName: model.name, + capabilities: model.capabilities, }, }); @@ -413,9 +419,13 @@ export function ModelSearchDialog({ const isVideo = matchingModel.capabilities.some( (cap) => cap === "text-to-video" || cap === "image-to-video" ); + const is3D = matchingModel.capabilities.some( + (cap) => cap === "text-to-3d" || cap === "image-to-3d" + ); if (capabilityFilter === "image") return isImage; if (capabilityFilter === "video") return isVideo; + if (capabilityFilter === "3d") return is3D; return true; }) .slice(0, 4); // Show max 4 @@ -635,6 +645,7 @@ export function ModelSearchDialog({ + {/* Refresh Cache */}