Skip to content

Commit 076df47

Browse files
committed
feat(settings): clamp default effort to nearest supported level
If the user's defaultReasoningEffort isn't supported by the current model, fall to the nearest available level by rank (low < medium < high < xhigh < max) instead of silently no-opping. So 'max' on a model that caps at 'high' becomes 'high'; 'low' on a model that only supports 'medium+' becomes 'medium'. Generated-By: PostHog Code Task-Id: c5674c04-c95c-4bfe-bfcf-248a921b4aae
1 parent bc740e0 commit 076df47

3 files changed

Lines changed: 213 additions & 161 deletions

File tree

apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { useAuthStateValue } from "@features/auth/hooks/authQueries";
22
import { SettingRow } from "@features/settings/components/SettingRow";
33
import {
4-
type AutoConvertLongText,
5-
type CompletionSound,
6-
type DefaultInitialTaskMode,
7-
type DefaultReasoningEffort,
8-
type DiffOpenMode,
4+
type AutoConvertLongText,
5+
type CompletionSound,
6+
type DefaultInitialTaskMode,
7+
type DefaultReasoningEffort,
8+
type DiffOpenMode,
99
type SendMessagesWith,
1010
useSettingsStore,
1111
} from "@features/settings/stores/settingsStore";
@@ -76,21 +76,21 @@ export function GeneralSettings() {
7676
dockBounceNotifications,
7777
completionSound,
7878
completionVolume,
79-
autoConvertLongText,
80-
defaultInitialTaskMode,
81-
defaultReasoningEffort,
82-
diffOpenMode,
83-
sendMessagesWith,
84-
hedgehogMode,
85-
setDesktopNotifications,
86-
setDockBadgeNotifications,
87-
setDockBounceNotifications,
88-
setCompletionSound,
89-
setCompletionVolume,
90-
setAutoConvertLongText,
91-
setDefaultInitialTaskMode,
92-
setDefaultReasoningEffort,
93-
setDiffOpenMode,
79+
autoConvertLongText,
80+
defaultInitialTaskMode,
81+
defaultReasoningEffort,
82+
diffOpenMode,
83+
sendMessagesWith,
84+
hedgehogMode,
85+
setDesktopNotifications,
86+
setDockBadgeNotifications,
87+
setDockBounceNotifications,
88+
setCompletionSound,
89+
setCompletionVolume,
90+
setAutoConvertLongText,
91+
setDefaultInitialTaskMode,
92+
setDefaultReasoningEffort,
93+
setDiffOpenMode,
9494
setSendMessagesWith,
9595
setHedgehogMode,
9696
} = useSettingsStore();
@@ -181,31 +181,31 @@ export function GeneralSettings() {
181181
[diffOpenMode, setDiffOpenMode],
182182
);
183183

184-
const handleDefaultInitialTaskModeChange = useCallback(
185-
(value: DefaultInitialTaskMode) => {
186-
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
187-
setting_name: "default_initial_task_mode",
188-
new_value: value,
189-
old_value: defaultInitialTaskMode,
190-
});
191-
setDefaultInitialTaskMode(value);
192-
},
193-
[defaultInitialTaskMode, setDefaultInitialTaskMode],
194-
);
195-
196-
const handleDefaultReasoningEffortChange = useCallback(
197-
(value: DefaultReasoningEffort) => {
198-
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
199-
setting_name: "default_reasoning_effort",
200-
new_value: value,
201-
old_value: defaultReasoningEffort,
202-
});
203-
setDefaultReasoningEffort(value);
204-
},
205-
[defaultReasoningEffort, setDefaultReasoningEffort],
206-
);
207-
208-
const handleSendMessagesWithChange = useCallback(
184+
const handleDefaultInitialTaskModeChange = useCallback(
185+
(value: DefaultInitialTaskMode) => {
186+
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
187+
setting_name: "default_initial_task_mode",
188+
new_value: value,
189+
old_value: defaultInitialTaskMode,
190+
});
191+
setDefaultInitialTaskMode(value);
192+
},
193+
[defaultInitialTaskMode, setDefaultInitialTaskMode],
194+
);
195+
196+
const handleDefaultReasoningEffortChange = useCallback(
197+
(value: DefaultReasoningEffort) => {
198+
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
199+
setting_name: "default_reasoning_effort",
200+
new_value: value,
201+
old_value: defaultReasoningEffort,
202+
});
203+
setDefaultReasoningEffort(value);
204+
},
205+
[defaultReasoningEffort, setDefaultReasoningEffort],
206+
);
207+
208+
const handleSendMessagesWithChange = useCallback(
209209
(value: SendMessagesWith) => {
210210
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
211211
setting_name: "send_messages_with",
@@ -396,36 +396,36 @@ export function GeneralSettings() {
396396
<Select.Trigger className="min-w-[100px]" />
397397
<Select.Content>
398398
<Select.Item value="plan">Plan</Select.Item>
399-
<Select.Item value="last_used">Last used</Select.Item>
400-
</Select.Content>
401-
</Select.Root>
402-
</SettingRow>
403-
404-
<SettingRow
405-
label="Default effort level"
406-
description="Choose the default reasoning effort for new tasks, or remember your last-used level"
407-
>
408-
<Select.Root
409-
value={defaultReasoningEffort}
410-
onValueChange={(value) =>
411-
handleDefaultReasoningEffortChange(value as DefaultReasoningEffort)
412-
}
413-
size="1"
414-
>
415-
<Select.Trigger className="min-w-[100px]" />
416-
<Select.Content>
417-
<Select.Item value="last_used">Last used</Select.Item>
418-
<Select.Item value="low">Low</Select.Item>
419-
<Select.Item value="medium">Medium</Select.Item>
420-
<Select.Item value="high">High</Select.Item>
421-
<Select.Item value="xhigh">Extra High</Select.Item>
422-
<Select.Item value="max">Max</Select.Item>
423-
</Select.Content>
424-
</Select.Root>
425-
</SettingRow>
426-
427-
<SettingRow
428-
label="Send messages with"
399+
<Select.Item value="last_used">Last used</Select.Item>
400+
</Select.Content>
401+
</Select.Root>
402+
</SettingRow>
403+
404+
<SettingRow
405+
label="Default effort level"
406+
description="Choose the default reasoning effort for new tasks, or remember your last-used level"
407+
>
408+
<Select.Root
409+
value={defaultReasoningEffort}
410+
onValueChange={(value) =>
411+
handleDefaultReasoningEffortChange(value as DefaultReasoningEffort)
412+
}
413+
size="1"
414+
>
415+
<Select.Trigger className="min-w-[100px]" />
416+
<Select.Content>
417+
<Select.Item value="last_used">Last used</Select.Item>
418+
<Select.Item value="low">Low</Select.Item>
419+
<Select.Item value="medium">Medium</Select.Item>
420+
<Select.Item value="high">High</Select.Item>
421+
<Select.Item value="xhigh">Extra High</Select.Item>
422+
<Select.Item value="max">Max</Select.Item>
423+
</Select.Content>
424+
</Select.Root>
425+
</SettingRow>
426+
427+
<SettingRow
428+
label="Send messages with"
429429
description="Choose which key combination sends messages. Use Shift+Enter for new lines"
430430
>
431431
<Select.Root

apps/code/src/renderer/features/settings/stores/settingsStore.ts

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ export type CompletionSound =
2424
export type AgentAdapter = "claude" | "codex";
2525
export type AutoConvertLongText = "off" | "1000" | "2500" | "5000" | "10000";
2626
export type DefaultInitialTaskMode = "plan" | "last_used";
27-
export type DefaultReasoningEffort = "low" | "medium" | "high" | "xhigh" | "max" | "last_used";
27+
export type DefaultReasoningEffort =
28+
| "low"
29+
| "medium"
30+
| "high"
31+
| "xhigh"
32+
| "max"
33+
| "last_used";
2834

2935
export interface HintState {
3036
count: number;
@@ -54,10 +60,10 @@ interface SettingsStore {
5460
preventSleepWhileRunning: boolean;
5561
debugLogsCloudRuns: boolean;
5662
customInstructions: string;
57-
defaultInitialTaskMode: DefaultInitialTaskMode;
58-
lastUsedInitialTaskMode: ExecutionMode;
59-
defaultReasoningEffort: DefaultReasoningEffort;
60-
diffOpenMode: DiffOpenMode;
63+
defaultInitialTaskMode: DefaultInitialTaskMode;
64+
lastUsedInitialTaskMode: ExecutionMode;
65+
defaultReasoningEffort: DefaultReasoningEffort;
66+
diffOpenMode: DiffOpenMode;
6167
hedgehogMode: boolean;
6268
mcpAppsDisabledServers: string[];
6369
hints: Record<string, HintState>;
@@ -91,10 +97,10 @@ interface SettingsStore {
9197
setPreventSleepWhileRunning: (enabled: boolean) => void;
9298
setDebugLogsCloudRuns: (enabled: boolean) => void;
9399
setCustomInstructions: (instructions: string) => void;
94-
setDefaultInitialTaskMode: (mode: DefaultInitialTaskMode) => void;
95-
setLastUsedInitialTaskMode: (mode: ExecutionMode) => void;
96-
setDefaultReasoningEffort: (effort: DefaultReasoningEffort) => void;
97-
setDiffOpenMode: (mode: DiffOpenMode) => void;
100+
setDefaultInitialTaskMode: (mode: DefaultInitialTaskMode) => void;
101+
setLastUsedInitialTaskMode: (mode: ExecutionMode) => void;
102+
setDefaultReasoningEffort: (effort: DefaultReasoningEffort) => void;
103+
setDiffOpenMode: (mode: DiffOpenMode) => void;
98104
setHedgehogMode: (enabled: boolean) => void;
99105
setMcpAppsDisabledServers: (servers: string[]) => void;
100106
}
@@ -123,10 +129,10 @@ export const useSettingsStore = create<SettingsStore>()(
123129
preventSleepWhileRunning: false,
124130
debugLogsCloudRuns: false,
125131
customInstructions: "",
126-
defaultInitialTaskMode: "plan",
127-
lastUsedInitialTaskMode: "plan",
128-
defaultReasoningEffort: "last_used",
129-
diffOpenMode: "auto",
132+
defaultInitialTaskMode: "plan",
133+
lastUsedInitialTaskMode: "plan",
134+
defaultReasoningEffort: "last_used",
135+
diffOpenMode: "auto",
130136
hedgehogMode: false,
131137
mcpAppsDisabledServers: [],
132138
hints: {},
@@ -198,13 +204,13 @@ export const useSettingsStore = create<SettingsStore>()(
198204
setDebugLogsCloudRuns: (enabled) => set({ debugLogsCloudRuns: enabled }),
199205
setCustomInstructions: (instructions) =>
200206
set({ customInstructions: instructions }),
201-
setDefaultInitialTaskMode: (mode) =>
202-
set({ defaultInitialTaskMode: mode }),
203-
setLastUsedInitialTaskMode: (mode) =>
204-
set({ lastUsedInitialTaskMode: mode }),
205-
setDefaultReasoningEffort: (effort) =>
206-
set({ defaultReasoningEffort: effort }),
207-
setDiffOpenMode: (mode) => set({ diffOpenMode: mode }),
207+
setDefaultInitialTaskMode: (mode) =>
208+
set({ defaultInitialTaskMode: mode }),
209+
setLastUsedInitialTaskMode: (mode) =>
210+
set({ lastUsedInitialTaskMode: mode }),
211+
setDefaultReasoningEffort: (effort) =>
212+
set({ defaultReasoningEffort: effort }),
213+
setDiffOpenMode: (mode) => set({ diffOpenMode: mode }),
208214
setHedgehogMode: (enabled) => set({ hedgehogMode: enabled }),
209215
setMcpAppsDisabledServers: (servers) =>
210216
set({ mcpAppsDisabledServers: servers }),
@@ -234,10 +240,10 @@ export const useSettingsStore = create<SettingsStore>()(
234240
preventSleepWhileRunning: state.preventSleepWhileRunning,
235241
debugLogsCloudRuns: state.debugLogsCloudRuns,
236242
customInstructions: state.customInstructions,
237-
defaultInitialTaskMode: state.defaultInitialTaskMode,
238-
lastUsedInitialTaskMode: state.lastUsedInitialTaskMode,
239-
defaultReasoningEffort: state.defaultReasoningEffort,
240-
diffOpenMode: state.diffOpenMode,
243+
defaultInitialTaskMode: state.defaultInitialTaskMode,
244+
lastUsedInitialTaskMode: state.lastUsedInitialTaskMode,
245+
defaultReasoningEffort: state.defaultReasoningEffort,
246+
diffOpenMode: state.diffOpenMode,
241247
hedgehogMode: state.hedgehogMode,
242248
hints: state.hints,
243249
mcpAppsDisabledServers: state.mcpAppsDisabledServers,

0 commit comments

Comments
 (0)