Skip to content

Commit 533eee5

Browse files
committed
Merge remote-tracking branch 'upstream/main'
# Conflicts: # apps/server/src/orchestration/Layers/ProviderCommandReactor.ts # apps/web/src/appSettings.ts # apps/web/src/components/ChatView.tsx # apps/web/src/components/Sidebar.tsx
2 parents 26a86c9 + 24122b1 commit 533eee5

File tree

15 files changed

+390
-239
lines changed

15 files changed

+390
-239
lines changed

apps/server/src/orchestration/Layers/ProviderCommandReactor.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
type OrchestrationEvent,
66
type ProviderModelOptions,
77
ProviderKind,
8-
type ProviderServiceTier,
98
type ProviderStartOptions,
109
type OrchestrationSession,
1110
ThreadId,
@@ -205,7 +204,6 @@ const make = Effect.gen(function* () {
205204
readonly provider?: ProviderKind;
206205
readonly model?: string;
207206
readonly modelOptions?: ProviderModelOptions;
208-
readonly serviceTier?: ProviderServiceTier | null;
209207
readonly providerOptions?: ProviderStartOptions;
210208
},
211209
) {
@@ -243,7 +241,6 @@ const make = Effect.gen(function* () {
243241
: {}),
244242
...(effectiveCwd ? { cwd: effectiveCwd } : {}),
245243
...(desiredModel ? { model: desiredModel } : {}),
246-
...(options?.serviceTier !== undefined ? { serviceTier: options.serviceTier } : {}),
247244
...(options?.modelOptions !== undefined ? { modelOptions: options.modelOptions } : {}),
248245
...(options?.providerOptions !== undefined ? { providerOptions: options.providerOptions } : {}),
249246
...(input?.resumeCursor !== undefined ? { resumeCursor: input.resumeCursor } : {}),
@@ -330,7 +327,6 @@ const make = Effect.gen(function* () {
330327
readonly attachments?: ReadonlyArray<ChatAttachment>;
331328
readonly provider?: ProviderKind;
332329
readonly model?: string;
333-
readonly serviceTier?: ProviderServiceTier | null;
334330
readonly modelOptions?: ProviderModelOptions;
335331
readonly providerOptions?: ProviderStartOptions;
336332
readonly interactionMode?: "default" | "plan";
@@ -346,7 +342,6 @@ const make = Effect.gen(function* () {
346342
yield* ensureSessionForThread(input.threadId, input.createdAt, {
347343
...(input.provider !== undefined ? { provider: input.provider } : {}),
348344
...(input.model !== undefined ? { model: input.model } : {}),
349-
...(input.serviceTier !== undefined ? { serviceTier: input.serviceTier } : {}),
350345
...(input.modelOptions !== undefined ? { modelOptions: input.modelOptions } : {}),
351346
...(input.providerOptions !== undefined ? { providerOptions: input.providerOptions } : {}),
352347
});
@@ -367,7 +362,6 @@ const make = Effect.gen(function* () {
367362
...(normalizedInput ? { input: normalizedInput } : {}),
368363
...(normalizedAttachments.length > 0 ? { attachments: normalizedAttachments } : {}),
369364
...(modelForTurn !== undefined ? { model: modelForTurn } : {}),
370-
...(input.serviceTier !== undefined ? { serviceTier: input.serviceTier } : {}),
371365
...(input.modelOptions !== undefined ? { modelOptions: input.modelOptions } : {}),
372366
...(input.interactionMode !== undefined ? { interactionMode: input.interactionMode } : {}),
373367
});
@@ -482,7 +476,6 @@ const make = Effect.gen(function* () {
482476
...(message.attachments !== undefined ? { attachments: message.attachments } : {}),
483477
...(event.payload.provider !== undefined ? { provider: event.payload.provider } : {}),
484478
...(event.payload.model !== undefined ? { model: event.payload.model } : {}),
485-
...(event.payload.serviceTier !== undefined ? { serviceTier: event.payload.serviceTier } : {}),
486479
...(event.payload.modelOptions !== undefined ? { modelOptions: event.payload.modelOptions } : {}),
487480
...(event.payload.providerOptions !== undefined ? { providerOptions: event.payload.providerOptions } : {}),
488481
interactionMode: event.payload.interactionMode,
@@ -641,9 +634,13 @@ const make = Effect.gen(function* () {
641634
return;
642635
}
643636
const cachedProviderOptions = threadProviderOptions.get(event.payload.threadId);
644-
yield* ensureSessionForThread(event.payload.threadId, event.occurredAt, {
645-
...(cachedProviderOptions !== undefined ? { providerOptions: cachedProviderOptions } : {}),
646-
});
637+
yield* ensureSessionForThread(
638+
event.payload.threadId,
639+
event.occurredAt,
640+
cachedProviderOptions !== undefined
641+
? { providerOptions: cachedProviderOptions }
642+
: undefined,
643+
);
647644
return;
648645
}
649646
case "thread.turn-start-requested":

apps/server/src/orchestration/decider.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,6 @@ export const decideOrchestrationCommand = Effect.fn("decideOrchestrationCommand"
301301
messageId: command.message.messageId,
302302
...(command.provider !== undefined ? { provider: command.provider } : {}),
303303
...(command.model !== undefined ? { model: command.model } : {}),
304-
...(command.serviceTier !== undefined ? { serviceTier: command.serviceTier } : {}),
305304
...(command.modelOptions !== undefined ? { modelOptions: command.modelOptions } : {}),
306305
...(command.providerOptions !== undefined ? { providerOptions: command.providerOptions } : {}),
307306
assistantDeliveryMode: command.assistantDeliveryMode ?? DEFAULT_ASSISTANT_DELIVERY_MODE,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1354,7 +1354,6 @@ const makeCodexAdapter = (options?: CodexAdapterLiveOptions) =>
13541354
threadId: input.threadId,
13551355
...(input.input !== undefined ? { input: input.input } : {}),
13561356
...(input.model !== undefined ? { model: input.model } : {}),
1357-
...(input.serviceTier !== undefined ? { serviceTier: input.serviceTier } : {}),
13581357
...(input.modelOptions?.codex?.reasoningEffort !== undefined
13591358
? { effort: input.modelOptions.codex.reasoningEffort }
13601359
: {}),

apps/web/src/appSettings.test.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import {
44
getAppModelOptions,
55
getSlashModelOptions,
66
normalizeCustomModelSlugs,
7-
resolveAppServiceTier,
8-
shouldShowFastTierIcon,
97
resolveAppModelSelection,
108
} from "./appSettings";
119

@@ -84,22 +82,3 @@ describe("getSlashModelOptions", () => {
8482
expect(options.map((option) => option.slug)).toEqual(["openai/gpt-oss-120b"]);
8583
});
8684
});
87-
88-
describe("resolveAppServiceTier", () => {
89-
it("maps automatic to no override", () => {
90-
expect(resolveAppServiceTier("auto")).toBeNull();
91-
});
92-
93-
it("preserves explicit service tier overrides", () => {
94-
expect(resolveAppServiceTier("fast")).toBe("fast");
95-
expect(resolveAppServiceTier("flex")).toBe("flex");
96-
});
97-
});
98-
99-
describe("shouldShowFastTierIcon", () => {
100-
it("shows the fast-tier icon only for gpt-5.4 on fast tier", () => {
101-
expect(shouldShowFastTierIcon("gpt-5.4", "fast")).toBe(true);
102-
expect(shouldShowFastTierIcon("gpt-5.4", "auto")).toBe(false);
103-
expect(shouldShowFastTierIcon("gpt-5.3-codex", "fast")).toBe(false);
104-
});
105-
});

apps/web/src/appSettings.ts

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,11 @@
11
import { useCallback, useSyncExternalStore } from "react";
22
import { Option, Schema } from "effect";
3-
import { type ProviderKind, type ProviderServiceTier } from "@t3tools/contracts";
3+
import { type ProviderKind } from "@t3tools/contracts";
44
import { getDefaultModel, getModelOptions, normalizeModelSlug } from "@t3tools/shared/model";
55

66
const APP_SETTINGS_STORAGE_KEY = "t3code:app-settings:v1";
77
const MAX_CUSTOM_MODEL_COUNT = 32;
88
export const MAX_CUSTOM_MODEL_LENGTH = 256;
9-
export const APP_SERVICE_TIER_OPTIONS = [
10-
{
11-
value: "auto",
12-
label: "Automatic",
13-
description: "Use Codex defaults without forcing a service tier.",
14-
},
15-
{
16-
value: "fast",
17-
label: "Fast",
18-
description: "Request the fast service tier when the model supports it.",
19-
},
20-
{
21-
value: "flex",
22-
label: "Flex",
23-
description: "Request the flex service tier when the model supports it.",
24-
},
25-
] as const;
26-
export type AppServiceTier = (typeof APP_SERVICE_TIER_OPTIONS)[number]["value"];
27-
const AppServiceTierSchema = Schema.Literals(["auto", "fast", "flex"]);
28-
const MODELS_WITH_FAST_SUPPORT = new Set(["gpt-5.4"]);
299
const BUILT_IN_MODEL_SLUGS_BY_PROVIDER: Record<ProviderKind, ReadonlySet<string>> = {
3010
codex: new Set(getModelOptions("codex").map((option) => option.slug)),
3111
copilot: new Set(getModelOptions("copilot").map((option) => option.slug)),
@@ -48,7 +28,6 @@ const AppSettingsSchema = Schema.Struct({
4828
enableAssistantStreaming: Schema.Boolean.pipe(
4929
Schema.withConstructorDefault(() => Option.some(false)),
5030
),
51-
codexServiceTier: AppServiceTierSchema.pipe(Schema.withConstructorDefault(() => Option.some("auto"))),
5231
customCodexModels: Schema.Array(Schema.String).pipe(
5332
Schema.withConstructorDefault(() => Option.some([])),
5433
),
@@ -67,23 +46,6 @@ export interface BuiltInAppModelOption {
6746
slug: string;
6847
name: string;
6948
}
70-
71-
export function resolveAppServiceTier(serviceTier: AppServiceTier): ProviderServiceTier | null {
72-
return serviceTier === "auto" ? null : serviceTier;
73-
}
74-
75-
export function shouldShowFastTierIcon(
76-
model: string | null | undefined,
77-
serviceTier: AppServiceTier,
78-
): boolean {
79-
const normalizedModel = normalizeModelSlug(model);
80-
return (
81-
resolveAppServiceTier(serviceTier) === "fast" &&
82-
normalizedModel !== null &&
83-
MODELS_WITH_FAST_SUPPORT.has(normalizedModel)
84-
);
85-
}
86-
8749
const DEFAULT_APP_SETTINGS = AppSettingsSchema.makeUnsafe({});
8850

8951
let listeners: Array<() => void> = [];

apps/web/src/components/ChatView.tsx

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -219,9 +219,6 @@ import { readNativeApi } from "~/nativeApi";
219219
import {
220220
getAppModelOptions,
221221
resolveAppModelSelection,
222-
resolveAppServiceTier,
223-
shouldShowFastTierIcon,
224-
type AppServiceTier,
225222
type BuiltInAppModelOption,
226223
useAppSettings,
227224
} from "../appSettings";
@@ -528,7 +525,6 @@ type ComposerCommandItem =
528525
model: ModelSlug;
529526
label: string;
530527
description: string;
531-
showFastBadge: boolean;
532528
};
533529

534530
type SendPhase = "idle" | "preparing-worktree" | "sending-turn";
@@ -639,9 +635,6 @@ const ComposerCommandMenuItem = memo(function ComposerCommandMenuItem(props: {
639635
</Badge>
640636
) : null}
641637
<span className="flex min-w-0 items-center gap-1.5 truncate">
642-
{props.item.type === "model" && props.item.showFastBadge ? (
643-
<ZapIcon className="size-3.5 shrink-0 text-amber-500" />
644-
) : null}
645638
<span className="truncate">{props.item.label}</span>
646639
</span>
647640
<span className="truncate text-muted-foreground/70 text-xs">{props.item.description}</span>
@@ -910,13 +903,10 @@ export default function ChatView({ threadId }: ChatViewProps) {
910903
activeThread.messages.length > 0 ||
911904
activeThread.session !== null),
912905
);
913-
const selectedServiceTierSetting = settings.codexServiceTier;
914906
const lockedProvider: ProviderKind | null = hasThreadStarted
915907
? (sessionProvider ?? selectedProviderByThreadId ?? null)
916908
: null;
917909
const selectedProvider: ProviderKind = lockedProvider ?? selectedProviderByThreadId ?? "codex";
918-
const selectedServiceTier =
919-
selectedProvider === "codex" ? resolveAppServiceTier(selectedServiceTierSetting) : null;
920910
const copilotProviderStatus =
921911
providerStatuses.find((status) => status.provider === "copilot") ?? null;
922912
const copilotProviderModels = copilotProviderStatus?.models ?? EMPTY_PROVIDER_MODELS;
@@ -1417,10 +1407,8 @@ export default function ChatView({ threadId }: ChatViewProps) {
14171407
model: slug,
14181408
label: name,
14191409
description: `${providerLabel} · ${slug}`,
1420-
showFastBadge:
1421-
provider === "codex" && shouldShowFastTierIcon(slug, selectedServiceTierSetting),
14221410
}));
1423-
}, [composerTrigger, searchableModelOptions, selectedServiceTierSetting, workspaceEntries]);
1411+
}, [composerTrigger, searchableModelOptions, workspaceEntries]);
14241412
const composerMenuOpen = Boolean(composerTrigger);
14251413
const activeComposerMenuItem = useMemo(
14261414
() =>
@@ -1942,6 +1930,7 @@ export default function ChatView({ threadId }: ChatViewProps) {
19421930
"button, summary, [role='button'], [data-scroll-anchor-target]",
19431931
);
19441932
if (!trigger || !scrollContainer.contains(trigger)) return;
1933+
if (trigger.closest("[data-scroll-anchor-ignore]")) return;
19451934

19461935
pendingInteractionAnchorRef.current = {
19471936
element: trigger,
@@ -2823,7 +2812,6 @@ export default function ChatView({ threadId }: ChatViewProps) {
28232812
attachments: turnAttachments,
28242813
},
28252814
model: selectedModel || undefined,
2826-
serviceTier: selectedServiceTier,
28272815
...(selectedModelOptionsForDispatch
28282816
? { modelOptions: selectedModelOptionsForDispatch }
28292817
: {}),
@@ -3855,7 +3843,6 @@ export default function ChatView({ threadId }: ChatViewProps) {
38553843
modelOptionsByProvider={modelOptionsByProvider}
38563844
copilotModels={copilotProviderModels}
38573845
copilotQuotaSummary={copilotQuotaSummary}
3858-
serviceTierSetting={selectedServiceTierSetting}
38593846
onProviderModelChange={onProviderModelSelect}
38603847
/>
38613848

@@ -4983,7 +4970,12 @@ const ProposedPlanCard = memo(function ProposedPlanCard({
49834970
</div>
49844971
{canCollapse ? (
49854972
<div className="mt-4 flex justify-center">
4986-
<Button size="sm" variant="outline" onClick={() => setExpanded((value) => !value)}>
4973+
<Button
4974+
size="sm"
4975+
variant="outline"
4976+
data-scroll-anchor-ignore
4977+
onClick={() => setExpanded((value) => !value)}
4978+
>
49874979
{expanded ? "Collapse plan" : "Expand plan"}
49884980
</Button>
49894981
</div>
@@ -5807,7 +5799,6 @@ const ProviderModelPicker = memo(function ProviderModelPicker(props: {
58075799
modelOptionsByProvider: Record<ProviderKind, ReadonlyArray<{ slug: string; name: string }>>;
58085800
copilotModels: ReadonlyArray<ServerProviderModel>;
58095801
copilotQuotaSummary: { title: string; detail: string } | null;
5810-
serviceTierSetting: AppServiceTier;
58115802
disabled?: boolean;
58125803
onProviderModelChange: (provider: ProviderKind, model: ModelSlug) => void;
58135804
}) {
@@ -5846,9 +5837,6 @@ const ProviderModelPicker = memo(function ProviderModelPicker(props: {
58465837
>
58475838
<span className="flex min-w-0 items-center gap-2">
58485839
<ProviderIcon aria-hidden="true" className="size-4 shrink-0 text-muted-foreground/70" />
5849-
{props.provider === "codex" && shouldShowFastTierIcon(props.model, props.serviceTierSetting) ? (
5850-
<ZapIcon className="size-3.5 shrink-0 text-amber-500" />
5851-
) : null}
58525840
<span className="truncate">{selectedModelLabel}</span>
58535841
{selectedCopilotModel?.billingMultiplier != null ? (
58545842
<span className="shrink-0 rounded-full border border-border/70 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-[0.08em] text-muted-foreground/80">
@@ -5915,10 +5903,6 @@ const ProviderModelPicker = memo(function ProviderModelPicker(props: {
59155903
onClick={() => setIsMenuOpen(false)}
59165904
>
59175905
<span className="flex min-w-0 items-center gap-2">
5918-
{option.value === "codex" &&
5919-
shouldShowFastTierIcon(modelOption.slug, props.serviceTierSetting) ? (
5920-
<ZapIcon className="size-3.5 shrink-0 text-amber-500" />
5921-
) : null}
59225906
<span className="truncate">{modelOption.name}</span>
59235907
{copilotModel?.billingMultiplier != null ? (
59245908
<span className="ms-auto shrink-0 text-[11px] font-medium uppercase tracking-[0.08em] text-muted-foreground/80">

0 commit comments

Comments
 (0)