authorgravatar for me@maxkatz.meMax Katz <me@maxkatz.me> 2026-07-30 06:35:53+04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-07-29 22:35:53-04:00
logb125b7635170ec0c33f8ddf39299155a21f8c9b9
treeddf97e570a0d90db4b12d03c1c980954c8bbd2f8
parent758decaa565f021f85af756669b18bd9f80cacf5
signature Signed by PGP key B5690EEEBB952194

fix(composer): hide default Codex service tier (#4784)


2 files changed, 33 insertions(+), 5 deletions(-)

apps/web/src/components/chat/TraitsPicker.test.ts+19-5
...@@ -1,10 +1,10 @@...@@ -1,10 +1,10 @@
1import { describe, expect, it } from "vite-plus/test";1import { describe, expect, it } from "vite-plus/test";
2import type { ProviderOptionDescriptor } from "@t3tools/contracts";2import { ProviderDriverKind, type ProviderOptionDescriptor } from "@t3tools/contracts";
3import { buildTraitsTriggerDisplay } from "./TraitsPicker";3import { buildTraitsTriggerDisplay } from "./TraitsPicker";
44
5function selectDescriptor(5function selectDescriptor(
6 id: string,6 id: string,
7 options: ReadonlyArray<{ id: string; label: string }>,7 options: ReadonlyArray<{ id: string; label: string; isDefault?: boolean }>,
8 currentValue: string,8 currentValue: string,
9): Extract<ProviderOptionDescriptor, { type: "select" }> {9): Extract<ProviderOptionDescriptor, { type: "select" }> {
10 return { id, label: id, type: "select", options: [...options], currentValue };10 return { id, label: id, type: "select", options: [...options], currentValue };
...@@ -17,7 +17,7 @@ function fastModeDescriptor(...@@ -17,7 +17,7 @@ function fastModeDescriptor(
17}17}
1818
19const EFFORT = selectDescriptor(19const EFFORT = selectDescriptor(
20 "effort",20 "reasoningEffort",
21 [21 [
22 { id: "high", label: "High" },22 { id: "high", label: "High" },
23 { id: "max", label: "Max" },23 { id: "max", label: "Max" },
...@@ -33,10 +33,13 @@ const CONTEXT_WINDOW = selectDescriptor(...@@ -33,10 +33,13 @@ const CONTEXT_WINDOW = selectDescriptor(
33 "1m",33 "1m",
34);34);
3535
36const CODEX = ProviderDriverKind.make("codex");
37
36function display(descriptors: ReadonlyArray<ProviderOptionDescriptor>, fastModeEnabled: boolean) {38function display(descriptors: ReadonlyArray<ProviderOptionDescriptor>, fastModeEnabled: boolean) {
37 return buildTraitsTriggerDisplay({39 return buildTraitsTriggerDisplay({
40 provider: CODEX,
38 descriptors,41 descriptors,
39 primarySelectDescriptorId: "effort",42 primarySelectDescriptorId: "reasoningEffort",
40 ultrathinkPromptControlled: false,43 ultrathinkPromptControlled: false,
41 fastModeEnabled,44 fastModeEnabled,
42 });45 });
...@@ -57,6 +60,16 @@ describe("buildTraitsTriggerDisplay", () => {...@@ -57,6 +60,16 @@ describe("buildTraitsTriggerDisplay", () => {
57 });60 });
58 });61 });
5962
63 it("omits Codex's default Standard tier beside reasoning", () => {
64 const serviceTier = selectDescriptor(
65 "serviceTier",
66 [{ id: "default", label: "Standard", isDefault: true }],
67 "default",
68 );
69
70 expect(display([EFFORT, serviceTier], false).label).toBe("High");
71 });
72
60 it("keeps non-fastMode booleans as text labels", () => {73 it("keeps non-fastMode booleans as text labels", () => {
61 const thinking: Extract<ProviderOptionDescriptor, { type: "boolean" }> = {74 const thinking: Extract<ProviderOptionDescriptor, { type: "boolean" }> = {
62 id: "thinking",75 id: "thinking",
...@@ -100,8 +113,9 @@ describe("buildTraitsTriggerDisplay", () => {...@@ -100,8 +113,9 @@ describe("buildTraitsTriggerDisplay", () => {
100 it("still renders the prompt-controlled ultrathink label alongside the bolt", () => {113 it("still renders the prompt-controlled ultrathink label alongside the bolt", () => {
101 expect(114 expect(
102 buildTraitsTriggerDisplay({115 buildTraitsTriggerDisplay({
116 provider: CODEX,
103 descriptors: [EFFORT, fastModeDescriptor(true)],117 descriptors: [EFFORT, fastModeDescriptor(true)],
104 primarySelectDescriptorId: "effort",118 primarySelectDescriptorId: "reasoningEffort",
105 ultrathinkPromptControlled: true,119 ultrathinkPromptControlled: true,
106 fastModeEnabled: true,120 fastModeEnabled: true,
107 }),121 }),
apps/web/src/components/chat/TraitsPicker.tsx+14
...@@ -388,6 +388,7 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({...@@ -388,6 +388,7 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({
388 * chevron) would leave the trigger unreadable.388 * chevron) would leave the trigger unreadable.
389 */389 */
390export function buildTraitsTriggerDisplay(input: {390export function buildTraitsTriggerDisplay(input: {
391 provider: ProviderDriverKind;
391 descriptors: ReadonlyArray<ProviderOptionDescriptor>;392 descriptors: ReadonlyArray<ProviderOptionDescriptor>;
392 primarySelectDescriptorId: string | null;393 primarySelectDescriptorId: string | null;
393 ultrathinkPromptControlled: boolean;394 ultrathinkPromptControlled: boolean;
...@@ -400,6 +401,18 @@ export function buildTraitsTriggerDisplay(input: {...@@ -400,6 +401,18 @@ export function buildTraitsTriggerDisplay(input: {
400 hasFastMode = true;401 hasFastMode = true;
401 continue;402 continue;
402 }403 }
404 if (
405 input.provider === "codex" &&
406 descriptor.id === "serviceTier" &&
407 descriptor.type === "select" &&
408 input.descriptors.some(({ id }) => id === "reasoningEffort")
409 ) {
410 const currentValue = getProviderOptionCurrentValue(descriptor);
411 const currentOption = descriptor.options.find((option) => option.id === currentValue);
412 if (currentOption?.id === "default" && currentOption.isDefault === true) {
413 continue;
414 }
415 }
403 const label =416 const label =
404 input.ultrathinkPromptControlled && descriptor.id === input.primarySelectDescriptorId417 input.ultrathinkPromptControlled && descriptor.id === input.primarySelectDescriptorId
405 ? "Ultrathink"418 ? "Ultrathink"
...@@ -457,6 +470,7 @@ export const TraitsPicker = memo(function TraitsPicker({...@@ -457,6 +470,7 @@ export const TraitsPicker = memo(function TraitsPicker({
457 }470 }
458471
459 const { label: triggerLabel, showFastModeIcon } = buildTraitsTriggerDisplay({472 const { label: triggerLabel, showFastModeIcon } = buildTraitsTriggerDisplay({
473 provider,
460 descriptors,474 descriptors,
461 primarySelectDescriptorId: primarySelectDescriptor?.id ?? null,475 primarySelectDescriptorId: primarySelectDescriptor?.id ?? null,
462 ultrathinkPromptControlled,476 ultrathinkPromptControlled,