feat(agent): make model presets session-scoped (#4866)

This commit is contained in:
chengyongru
2026-07-23 00:38:49 +08:00
committed by GitHub
parent 66690fdb0c
commit c22efb5f7a
41 changed files with 1140 additions and 155 deletions
+28 -15
View File
@@ -170,8 +170,14 @@ interface ModelBadgeInfo {
needsSetup: boolean;
}
function activeModelPreset(settings: SettingsPayload | null): SettingsPayload["model_presets"][number] | null {
function modelPresetForBadge(
settings: SettingsPayload | null,
scopedPreset: string | null,
): SettingsPayload["model_presets"][number] | null {
if (!settings) return null;
if (scopedPreset) {
return settings.model_presets.find((preset) => preset.name === scopedPreset) ?? null;
}
const configured = settings.agent.model_preset || "default";
return (
settings.model_presets.find((preset) => preset.name === configured)
@@ -180,19 +186,25 @@ function activeModelPreset(settings: SettingsPayload | null): SettingsPayload["m
);
}
function resolvedModelProvider(settings: SettingsPayload | null, modelName: string | null): string | null {
const preset = activeModelPreset(settings);
const rawProvider = preset?.provider || settings?.agent.provider || null;
if (rawProvider === "auto") {
return settings?.agent.resolved_provider || inferProviderFromModelName(modelName) || null;
}
return rawProvider || inferProviderFromModelName(modelName);
}
function toModelBadgeInfo(modelName: string | null, settings: SettingsPayload | null): ModelBadgeInfo {
const model = modelName || settings?.agent.model || null;
function toModelBadgeInfo(
modelName: string | null,
settings: SettingsPayload | null,
modelPreset: string | null = null,
): ModelBadgeInfo {
const scopedPreset = modelPreset?.trim() || null;
const preset = modelPresetForBadge(settings, scopedPreset);
const model = scopedPreset
? preset?.model || null
: modelName || settings?.agent.model || null;
const label = toModelBadgeLabel(model);
const provider = resolvedModelProvider(settings, model);
const rawProvider = preset?.provider
|| (!scopedPreset ? settings?.agent.provider : null)
|| null;
const provider = rawProvider === "auto"
? preset?.resolved_provider
|| (!scopedPreset ? settings?.agent.resolved_provider : null)
|| null
: rawProvider || inferProviderFromModelName(model);
const providerRow = provider
? settings?.providers.find((item) => item.name === provider)
: null;
@@ -459,9 +471,10 @@ export function ThreadShell({
const showHeroComposer = messages.length === 0 && !loading;
const wasShowingHeroComposerRef = useRef(showHeroComposer);
const sessionModelPreset = session?.modelPreset?.trim() || null;
const modelBadge = useMemo(
() => toModelBadgeInfo(modelName, settings),
[modelName, settings],
() => toModelBadgeInfo(modelName, settings, sessionModelPreset),
[modelName, sessionModelPreset, settings],
);
const modelBadgeLabel = modelBadge.needsSetup
? t("thread.composer.modelNotConfigured", { defaultValue: "Model not configured" })