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 @@
11import { describe, expect, it } from "vite-plus/test";
2import type { ProviderOptionDescriptor } from "@t3tools/contracts";
2import { ProviderDriverKind, type ProviderOptionDescriptor } from "@t3tools/contracts";
33import { buildTraitsTriggerDisplay } from "./TraitsPicker";
44
55function selectDescriptor(
66 id: string,
7 options: ReadonlyArray<{ id: string; label: string }>,
7 options: ReadonlyArray<{ id: string; label: string; isDefault?: boolean }>,
88 currentValue: string,
99): Extract<ProviderOptionDescriptor, { type: "select" }> {
1010 return { id, label: id, type: "select", options: [...options], currentValue };
......@@ -17,7 +17,7 @@ function fastModeDescriptor(
1717}
1818
1919const EFFORT = selectDescriptor(
20 "effort",
20 "reasoningEffort",
2121 [
2222 { id: "high", label: "High" },
2323 { id: "max", label: "Max" },
......@@ -33,10 +33,13 @@ const CONTEXT_WINDOW = selectDescriptor(
3333 "1m",
3434);
3535
36const CODEX = ProviderDriverKind.make("codex");
37
3638function display(descriptors: ReadonlyArray<ProviderOptionDescriptor>, fastModeEnabled: boolean) {
3739 return buildTraitsTriggerDisplay({
40 provider: CODEX,
3841 descriptors,
39 primarySelectDescriptorId: "effort",
42 primarySelectDescriptorId: "reasoningEffort",
4043 ultrathinkPromptControlled: false,
4144 fastModeEnabled,
4245 });
......@@ -57,6 +60,16 @@ describe("buildTraitsTriggerDisplay", () => {
5760 });
5861 });
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
6073 it("keeps non-fastMode booleans as text labels", () => {
6174 const thinking: Extract<ProviderOptionDescriptor, { type: "boolean" }> = {
6275 id: "thinking",
......@@ -100,8 +113,9 @@ describe("buildTraitsTriggerDisplay", () => {
100113 it("still renders the prompt-controlled ultrathink label alongside the bolt", () => {
101114 expect(
102115 buildTraitsTriggerDisplay({
116 provider: CODEX,
103117 descriptors: [EFFORT, fastModeDescriptor(true)],
104 primarySelectDescriptorId: "effort",
118 primarySelectDescriptorId: "reasoningEffort",
105119 ultrathinkPromptControlled: true,
106120 fastModeEnabled: true,
107121 }),
apps/web/src/components/chat/TraitsPicker.tsx+14
......@@ -388,6 +388,7 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({
388388 * chevron) would leave the trigger unreadable.
389389 */
390390export function buildTraitsTriggerDisplay(input: {
391 provider: ProviderDriverKind;
391392 descriptors: ReadonlyArray<ProviderOptionDescriptor>;
392393 primarySelectDescriptorId: string | null;
393394 ultrathinkPromptControlled: boolean;
......@@ -400,6 +401,18 @@ export function buildTraitsTriggerDisplay(input: {
400401 hasFastMode = true;
401402 continue;
402403 }
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 }
403416 const label =
404417 input.ultrathinkPromptControlled && descriptor.id === input.primarySelectDescriptorId
405418 ? "Ultrathink"
......@@ -457,6 +470,7 @@ export const TraitsPicker = memo(function TraitsPicker({
457470 }
458471
459472 const { label: triggerLabel, showFastModeIcon } = buildTraitsTriggerDisplay({
473 provider,
460474 descriptors,
461475 primarySelectDescriptorId: primarySelectDescriptor?.id ?? null,
462476 ultrathinkPromptControlled,