refactor(models): unify preset names
This commit is contained in:
@@ -44,7 +44,6 @@ export interface AgentSettingsDraft {
|
||||
model: string;
|
||||
provider: string;
|
||||
modelPreset: string;
|
||||
presetLabel: string;
|
||||
maxTokens: number;
|
||||
contextWindowTokens: number;
|
||||
temperature: number;
|
||||
@@ -67,7 +66,6 @@ export const DEFAULT_AGENT_SETTINGS_DRAFT: AgentSettingsDraft = {
|
||||
model: "",
|
||||
provider: "",
|
||||
modelPreset: "",
|
||||
presetLabel: "",
|
||||
maxTokens: 8192,
|
||||
contextWindowTokens: 200_000,
|
||||
temperature: 0.1,
|
||||
@@ -89,7 +87,6 @@ export function agentDraftFromPayload(
|
||||
model: activePreset?.model ?? payload.agent.model,
|
||||
provider: activePreset?.provider ?? payload.agent.provider ?? payload.agent.resolved_provider ?? "",
|
||||
modelPreset: activePresetName,
|
||||
presetLabel: activePreset?.label ?? activePresetName,
|
||||
maxTokens: activePreset?.max_tokens ?? payload.agent.max_tokens,
|
||||
contextWindowTokens: normalizeContextWindowTokens(
|
||||
activePreset?.context_window_tokens ?? payload.agent.context_window_tokens,
|
||||
@@ -126,7 +123,7 @@ export function ModelPresetDeleteDialog({
|
||||
{tx(
|
||||
"settings.models.deletePresetHelp",
|
||||
"This removes the preset “{{name}}”. Provider credentials are not affected.",
|
||||
{ name: preset?.label ?? "" },
|
||||
{ name: preset?.name ?? "" },
|
||||
)}
|
||||
</DialogDescription>
|
||||
</DialogHeader>
|
||||
@@ -266,7 +263,7 @@ export function ModelsSettings({
|
||||
const modelFieldsMissing =
|
||||
!form.model.trim() ||
|
||||
!form.provider.trim() ||
|
||||
!form.presetLabel.trim() ||
|
||||
(creating && !form.modelPreset.trim()) ||
|
||||
form.maxTokens <= 0 ||
|
||||
form.temperature < 0 ||
|
||||
form.temperature > 2;
|
||||
@@ -290,7 +287,6 @@ export function ModelsSettings({
|
||||
modelPreset: preset.name,
|
||||
model: preset.model,
|
||||
provider: preset.provider,
|
||||
presetLabel: preset.label,
|
||||
maxTokens: preset.max_tokens,
|
||||
contextWindowTokens: normalizeContextWindowTokens(preset.context_window_tokens),
|
||||
temperature: preset.temperature,
|
||||
@@ -351,30 +347,29 @@ export function ModelsSettings({
|
||||
</div>
|
||||
) : null}
|
||||
<SettingsRow
|
||||
title={
|
||||
creating
|
||||
? tx("settings.models.presetName", "Preset name")
|
||||
: tx("settings.models.presetDisplayName", "Display name")
|
||||
}
|
||||
title={tx("settings.models.presetName", "Preset name")}
|
||||
description={
|
||||
creating
|
||||
? undefined
|
||||
: tx(
|
||||
"settings.models.presetDisplayNameHelp",
|
||||
"Shown in the interface. The command name stays /model {{name}}.",
|
||||
{ name: form.modelPreset },
|
||||
? tx(
|
||||
"settings.models.presetNameHelp",
|
||||
"Used everywhere, including /model commands. Names must be unique.",
|
||||
)
|
||||
: undefined
|
||||
}
|
||||
>
|
||||
<Input
|
||||
autoFocus={creating}
|
||||
value={form.presetLabel}
|
||||
placeholder={tx("settings.models.presetNamePlaceholder", "Fast writing")}
|
||||
onChange={(event) =>
|
||||
setForm((prev) => ({ ...prev, presetLabel: event.target.value }))
|
||||
}
|
||||
className="h-8 w-[min(280px,70vw)] rounded-full text-[13px]"
|
||||
/>
|
||||
{creating ? (
|
||||
<Input
|
||||
autoFocus
|
||||
value={form.modelPreset}
|
||||
placeholder={tx("settings.models.presetNamePlaceholder", "Fast writing")}
|
||||
onChange={(event) =>
|
||||
setForm((prev) => ({ ...prev, modelPreset: event.target.value }))
|
||||
}
|
||||
className="h-8 w-[min(280px,70vw)] rounded-full text-[13px]"
|
||||
/>
|
||||
) : (
|
||||
<span className="text-[13px] font-medium text-foreground">{form.modelPreset}</span>
|
||||
)}
|
||||
</SettingsRow>
|
||||
<SettingsRow title={t("settings.rows.provider")}>
|
||||
<ProviderPicker
|
||||
@@ -604,11 +599,11 @@ export function ModelsSettings({
|
||||
draggable={ordered && !callOrderBusy}
|
||||
aria-label={
|
||||
ordered
|
||||
? `${preset?.label ?? name}. ${tx(
|
||||
? `${name}. ${tx(
|
||||
"settings.models.dragToReorder",
|
||||
"Drag to reorder",
|
||||
)}`
|
||||
: preset?.label ?? name
|
||||
: name
|
||||
}
|
||||
data-testid={`model-call-order-row-${name}`}
|
||||
onDragStart={(event) => {
|
||||
@@ -704,7 +699,7 @@ export function ModelsSettings({
|
||||
<span className="min-w-0 flex-1">
|
||||
<span className="flex min-w-0 flex-wrap items-center gap-2">
|
||||
<span className="truncate text-[14px] font-medium text-foreground">
|
||||
{preset?.label ?? name}
|
||||
{name}
|
||||
</span>
|
||||
{orderIndex === 0 ? (
|
||||
<StatusPill tone="success">
|
||||
|
||||
@@ -128,11 +128,11 @@ export function useModelSettingsActions({
|
||||
}
|
||||
|
||||
if (modelPresetCreating) {
|
||||
const label = form.presetLabel.trim();
|
||||
const name = form.modelPreset.trim();
|
||||
const provider = form.provider.trim();
|
||||
const model = form.model.trim();
|
||||
if (
|
||||
!label ||
|
||||
!name ||
|
||||
!provider ||
|
||||
!model ||
|
||||
form.maxTokens <= 0 ||
|
||||
@@ -145,7 +145,7 @@ export function useModelSettingsActions({
|
||||
setModelConfigurationSaving(true);
|
||||
try {
|
||||
const payload = await createModelConfiguration(client, {
|
||||
label,
|
||||
name,
|
||||
provider,
|
||||
model,
|
||||
maxTokens: form.maxTokens,
|
||||
@@ -190,10 +190,6 @@ export function useModelSettingsActions({
|
||||
try {
|
||||
const payload = await updateModelConfiguration(client, {
|
||||
name: selectedPreset.name,
|
||||
label:
|
||||
form.presetLabel.trim() !== selectedPreset.label
|
||||
? form.presetLabel.trim()
|
||||
: undefined,
|
||||
model: form.model !== selectedPreset.model ? form.model : undefined,
|
||||
provider: form.provider !== selectedPreset.provider ? form.provider : undefined,
|
||||
maxTokens:
|
||||
@@ -235,7 +231,6 @@ export function useModelSettingsActions({
|
||||
setForm((prev) => ({
|
||||
...prev,
|
||||
modelPreset: "",
|
||||
presetLabel: "",
|
||||
provider,
|
||||
model: "",
|
||||
maxTokens: primaryPreset?.max_tokens ?? settings.agent.max_tokens,
|
||||
|
||||
@@ -58,7 +58,7 @@ export function OverviewSettings({
|
||||
const activePresetName = settings.agent.model_preset;
|
||||
const activePreset =
|
||||
activePresetName && activePresetName !== "default"
|
||||
? settings.model_presets.find((preset) => preset.name === activePresetName)?.label ??
|
||||
? settings.model_presets.find((preset) => preset.name === activePresetName)?.name ??
|
||||
activePresetName
|
||||
: null;
|
||||
const activeProvider = settings.agent.resolved_provider ?? settings.agent.provider;
|
||||
|
||||
@@ -261,8 +261,7 @@ export function useSettingsController({
|
||||
form.maxTokens !== selectedPreset.max_tokens ||
|
||||
form.contextWindowTokens !== normalizeContextWindowTokens(selectedPreset.context_window_tokens) ||
|
||||
form.temperature !== selectedPreset.temperature ||
|
||||
form.reasoningEffort !== (selectedPreset.reasoning_effort ?? "") ||
|
||||
form.presetLabel.trim() !== selectedPreset.label
|
||||
form.reasoningEffort !== (selectedPreset.reasoning_effort ?? "")
|
||||
);
|
||||
}, [form, settings]);
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ import { cn } from "@/lib/utils";
|
||||
|
||||
export interface ModelPresetOption {
|
||||
name: string;
|
||||
label: string;
|
||||
model?: string | null;
|
||||
provider?: string | null;
|
||||
}
|
||||
@@ -99,7 +98,6 @@ export function ModelPresetBadge({
|
||||
const activePreset: ModelPresetOption = {
|
||||
...(listedIndex >= 0 ? modelPresets[listedIndex] : undefined),
|
||||
name: activeName,
|
||||
label: label || modelPresets[listedIndex]?.label || activeName,
|
||||
model: modelDetail ?? modelPresets[listedIndex]?.model,
|
||||
provider: provider || modelPresets[listedIndex]?.provider,
|
||||
};
|
||||
@@ -225,7 +223,7 @@ export function ModelPresetBadge({
|
||||
aria-valuemax={canSwitch ? presets.length - 1 : undefined}
|
||||
aria-valuemin={canSwitch ? 0 : undefined}
|
||||
aria-valuenow={canSwitch ? previewIndex : undefined}
|
||||
aria-valuetext={canSwitch ? previewPreset?.label || label : undefined}
|
||||
aria-valuetext={canSwitch ? previewPreset?.name || label : undefined}
|
||||
role={canSwitch ? "spinbutton" : undefined}
|
||||
type={interactive || canSwitch ? "button" : undefined}
|
||||
onClick={interactive ? onClick : undefined}
|
||||
@@ -290,7 +288,7 @@ export function ModelPresetBadge({
|
||||
return (
|
||||
<PresetPill
|
||||
key={virtualIndex}
|
||||
label={preset.label || preset.name}
|
||||
label={preset.name}
|
||||
modelDetail={preset.model}
|
||||
provider={preset.provider}
|
||||
isHero={isHero}
|
||||
|
||||
@@ -378,7 +378,11 @@ function toModelBadgeInfo(
|
||||
const model = scopedPreset
|
||||
? preset?.model || null
|
||||
: settings?.agent.model || modelName || null;
|
||||
const label = preset?.label?.trim() || scopedPreset || toModelBadgeLabel(model);
|
||||
const label = preset
|
||||
? preset.is_default
|
||||
? preset.label?.trim() || "Default"
|
||||
: preset.name.trim()
|
||||
: scopedPreset || toModelBadgeLabel(model);
|
||||
const rawProvider = preset?.provider
|
||||
|| (!scopedPreset ? settings?.agent.provider : null)
|
||||
|| null;
|
||||
@@ -419,7 +423,6 @@ function modelPresetOptionsFromSettings(
|
||||
const name = preset.name.trim();
|
||||
return {
|
||||
name,
|
||||
label: preset.label?.trim() || name,
|
||||
model: preset.model,
|
||||
provider: preset.resolved_provider || preset.provider,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user