refactor(models): unify preset names

This commit is contained in:
Xubin Ren
2026-08-16 11:50:56 +08:00
parent 8dc08853e4
commit 3dc38f6396
37 changed files with 239 additions and 209 deletions
@@ -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}
+5 -2
View File
@@ -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,
};