Files
fusion/packages/dashboard/app/utils/modelPresets.ts
gsxdsm af41f4424c feat(FN-800): auto-generate model preset IDs and remove manual ID editing
- Add slugify and generatePresetId utilities with collision handling for unique preset IDs
- Remove manual ID input field from preset editor UI in SettingsModal
- Auto-generate preset IDs server-side from name on creation
- Simplify Header tests by removing ID-related test cases
- Deduplicate tablet header controls tests by importing from shared Header tests
- Remove unused CSS rules for removed ID input field
- Update reviewer to pass through preset ID generation logic
2026-04-03 18:33:23 -07:00

71 lines
2.1 KiB
TypeScript

import type { ModelPreset } from "@fusion/core";
export function getPresetByName(presets: ModelPreset[], name: string): ModelPreset | undefined {
const normalizedName = name.trim().toLowerCase();
return presets.find((preset) => preset.name.trim().toLowerCase() === normalizedName);
}
export function applyPresetToSelection(preset: ModelPreset | undefined): {
executorValue: string;
validatorValue: string;
} {
return {
executorValue: preset?.executorProvider && preset?.executorModelId
? `${preset.executorProvider}/${preset.executorModelId}`
: "",
validatorValue: preset?.validatorProvider && preset?.validatorModelId
? `${preset.validatorProvider}/${preset.validatorModelId}`
: "",
};
}
export function getRecommendedPresetForSize(
size: "S" | "M" | "L" | undefined,
defaultPresetBySize: Record<string, string>,
presets: ModelPreset[],
): ModelPreset | undefined {
if (!size) return undefined;
const presetId = defaultPresetBySize[size];
if (!presetId) return undefined;
return presets.find((preset) => preset.id === presetId);
}
export function validatePresetId(id: string): boolean {
return /^[A-Za-z0-9_-]{1,32}$/.test(id);
}
export function generatePresetId(name: string): string {
const slug = name
.trim()
.toLowerCase()
.replace(/[^a-z0-9_-]+/g, "-")
.replace(/-+/g, "-")
.replace(/^[-_]+|[-_]+$/g, "")
.slice(0, 32);
return slug || "preset";
}
/**
* Generate a unique preset ID derived from the preset name, avoiding collisions
* with existing preset IDs. If the base slug is already taken, appends `-1`,
* `-2`, etc. until a unique ID is found.
*/
export function generateUniquePresetId(name: string, existingPresets: ModelPreset[]): string {
const baseId = generatePresetId(name);
const takenIds = new Set(existingPresets.map((p) => p.id));
if (!takenIds.has(baseId)) return baseId;
// Leave room for the numeric suffix (-N)
const maxBase = 30;
let candidate = baseId;
let idx = 1;
while (takenIds.has(candidate) && idx < 100) {
const suffix = `-${idx}`;
candidate = `${baseId.slice(0, maxBase - suffix.length)}${suffix}`;
idx++;
}
return candidate;
}