Skip to content

Commit 11be973

Browse files
committed
fix: normalization functions strip default effort values instead of including them
Add normalizeEffort() helper that resolves effort and strips it when it matches the model's default. Use it in all four normalization functions instead of resolveEffort(), which always returns the effective value (including defaults). resolveEffort() is correct for resolving what effort to use at dispatch time, but normalization needs to keep stored/dispatched options minimal by omitting defaults.
1 parent 47baf02 commit 11be973

File tree

4 files changed

+21
-7
lines changed

4 files changed

+21
-7
lines changed

apps/server/src/provider/Layers/ClaudeProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import type {
99
} from "@t3tools/contracts";
1010
import { Effect, Equal, Layer, Option, Result, Stream } from "effect";
1111
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
12-
import { resolveContextWindow, resolveEffort } from "@t3tools/shared/model";
12+
import { normalizeEffort, resolveContextWindow } from "@t3tools/shared/model";
1313

1414
import {
1515
buildServerProvider,
@@ -101,7 +101,7 @@ export function normalizeClaudeModelOptions(
101101
modelOptions: ClaudeModelOptions | null | undefined,
102102
): ClaudeModelOptions | undefined {
103103
const caps = getClaudeModelCapabilities(model);
104-
const effort = resolveEffort(caps, modelOptions?.effort);
104+
const effort = normalizeEffort(caps, modelOptions?.effort);
105105
const thinking =
106106
caps.supportsThinkingToggle && modelOptions?.thinking === false ? false : undefined;
107107
const fastMode = caps.supportsFastMode && modelOptions?.fastMode === true ? true : undefined;

apps/server/src/provider/Layers/CodexProvider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type {
1010
} from "@t3tools/contracts";
1111
import { Effect, Equal, FileSystem, Layer, Option, Path, Result, Stream } from "effect";
1212
import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
13-
import { resolveEffort } from "@t3tools/shared/model";
13+
import { normalizeEffort } from "@t3tools/shared/model";
1414

1515
import {
1616
buildServerProvider,
@@ -157,7 +157,7 @@ export function normalizeCodexModelOptions(
157157
modelOptions: CodexModelOptions | null | undefined,
158158
): CodexModelOptions | undefined {
159159
const caps = getCodexModelCapabilities(model);
160-
const reasoningEffort = resolveEffort(caps, modelOptions?.reasoningEffort);
160+
const reasoningEffort = normalizeEffort(caps, modelOptions?.reasoningEffort);
161161
const fastModeEnabled = modelOptions?.fastMode === true;
162162
const nextOptions: CodexModelOptions = {
163163
...(reasoningEffort

apps/web/src/providerModels.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
type ServerProvider,
88
type ServerProviderModel,
99
} from "@t3tools/contracts";
10-
import { normalizeModelSlug, resolveContextWindow, resolveEffort } from "@t3tools/shared/model";
10+
import { normalizeEffort, normalizeModelSlug, resolveContextWindow } from "@t3tools/shared/model";
1111

1212
const EMPTY_CAPABILITIES: ModelCapabilities = {
1313
reasoningEffortLevels: [],
@@ -74,7 +74,7 @@ export function normalizeCodexModelOptionsWithCapabilities(
7474
caps: ModelCapabilities,
7575
modelOptions: CodexModelOptions | null | undefined,
7676
): CodexModelOptions | undefined {
77-
const reasoningEffort = resolveEffort(caps, modelOptions?.reasoningEffort);
77+
const reasoningEffort = normalizeEffort(caps, modelOptions?.reasoningEffort);
7878
const fastModeEnabled = modelOptions?.fastMode === true;
7979
const nextOptions: CodexModelOptions = {
8080
...(reasoningEffort
@@ -89,7 +89,7 @@ export function normalizeClaudeModelOptionsWithCapabilities(
8989
caps: ModelCapabilities,
9090
modelOptions: ClaudeModelOptions | null | undefined,
9191
): ClaudeModelOptions | undefined {
92-
const effort = resolveEffort(caps, modelOptions?.effort);
92+
const effort = normalizeEffort(caps, modelOptions?.effort);
9393
const thinking =
9494
caps.supportsThinkingToggle && modelOptions?.thinking === false ? false : undefined;
9595
const fastMode = caps.supportsFastMode && modelOptions?.fastMode === true ? true : undefined;

packages/shared/src/model.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ export function resolveEffort(
5050
return defaultValue ?? undefined;
5151
}
5252

53+
/**
54+
* Resolve effort for normalization: returns the effort only when it differs
55+
* from the model's default. Used by normalization functions that need to strip
56+
* defaults to keep stored/dispatched options minimal.
57+
*/
58+
export function normalizeEffort(
59+
caps: ModelCapabilities,
60+
raw: string | null | undefined,
61+
): string | undefined {
62+
const resolved = resolveEffort(caps, raw);
63+
const defaultValue = getDefaultEffort(caps);
64+
return resolved && resolved !== defaultValue ? resolved : undefined;
65+
}
66+
5367
// ── Context window helpers ───────────────────────────────────────────
5468

5569
/** Check whether a capabilities object includes a given context window value. */

0 commit comments

Comments
 (0)