diff --git a/src/components/nodes/BaseNode.tsx b/src/components/nodes/BaseNode.tsx
index bb35711b..e38fc7bc 100644
--- a/src/components/nodes/BaseNode.tsx
+++ b/src/components/nodes/BaseNode.tsx
@@ -180,7 +180,7 @@ export function BaseNode({
return (
diff --git a/src/components/nodes/InlineParameterPanel.tsx b/src/components/nodes/InlineParameterPanel.tsx
index d9f6238b..a088769a 100644
--- a/src/components/nodes/InlineParameterPanel.tsx
+++ b/src/components/nodes/InlineParameterPanel.tsx
@@ -49,7 +49,7 @@ export function InlineParameterPanel({
{expanded && (
{children}
diff --git a/src/components/nodes/ModelParameters.tsx b/src/components/nodes/ModelParameters.tsx
index d95f723c..93e6a154 100644
--- a/src/components/nodes/ModelParameters.tsx
+++ b/src/components/nodes/ModelParameters.tsx
@@ -40,6 +40,20 @@ function setCachedSchema(modelId: string, provider: string, parameters: ModelPar
}
}
+/** Reorder items so they read column-first in a row-based CSS grid.
+ * e.g. [1,2,3,4,5,6,7,8] with 2 cols → [1,5,2,6,3,7,4,8] */
+function reorderColumnFirst
(items: T[], cols: number): T[] {
+ const rows = Math.ceil(items.length / cols);
+ const result: T[] = [];
+ for (let r = 0; r < rows; r++) {
+ for (let c = 0; c < cols; c++) {
+ const idx = c * rows + r;
+ if (idx < items.length) result.push(items[idx]);
+ }
+ }
+ return result;
+}
+
interface ModelParametersProps {
modelId: string;
provider: ProviderType;
@@ -162,6 +176,31 @@ export function ModelParameters({
[parameters, onParametersChange]
);
+ const sortedSchema = [...schema].sort((a, b) => {
+ // Sort order: dropdowns first, then numbers, then strings, then checkboxes last
+ const typeOrder = (p: ModelParameter) => {
+ if (p.enum && p.enum.length > 0) return 0; // dropdowns first
+ if (p.type === "number" || p.type === "integer") return 1;
+ if (p.type === "boolean") return 3; // checkboxes last
+ return 2; // string and other
+ };
+ return typeOrder(a) - typeOrder(b);
+ });
+ const useGrid = sortedSchema.length > 4;
+ const gridRef = useRef(null);
+ const [colCount, setColCount] = useState(1);
+
+ useEffect(() => {
+ const el = gridRef.current;
+ if (!el || !useGrid) { setColCount(1); return; }
+ const observer = new ResizeObserver(() => {
+ const cols = getComputedStyle(el).gridTemplateColumns.split(" ").length;
+ setColCount(cols);
+ });
+ observer.observe(el);
+ return () => observer.disconnect();
+ }, [useGrid]);
+
// Don't render anything for Gemini or if no model selected
if (provider === "gemini" || !modelId) {
return null;
@@ -172,8 +211,12 @@ export function ModelParameters({
return null;
}
+ const displaySchema = useGrid && colCount > 1
+ ? reorderColumnFirst(sortedSchema, colCount)
+ : sortedSchema;
+
return (
-
+
{error ? (
{error}
) : isLoading ? (
@@ -181,14 +224,22 @@ export function ModelParameters({
) : schema.length === 0 ? (
No parameters available
) : (
- schema.map((param) => (
-
handleParameterChange(param.name, value)}
- />
- ))
+
+ {displaySchema.map((param) => (
+
handleParameterChange(param.name, value)}
+ />
+ ))}
+
)}
);