Skip to content

Commit 4869630

Browse files
committed
restore fast mode for nightly gpt models
1 parent fcefe13 commit 4869630

2 files changed

Lines changed: 66 additions & 2 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { describe, expect, it } from "vitest";
2+
import type * as CodexSchema from "effect-codex-app-server/schema";
3+
4+
import { parseCodexModelListResponse } from "./CodexProvider.ts";
5+
6+
function makeModel(
7+
overrides: Partial<CodexSchema.V2ModelListResponse__Model> = {},
8+
): CodexSchema.V2ModelListResponse__Model {
9+
return {
10+
id: "gpt-5.4",
11+
model: "gpt-5.4",
12+
upgrade: null,
13+
upgradeInfo: null,
14+
availabilityNux: null,
15+
displayName: "gpt-5.4",
16+
description: "Latest frontier agentic coding model.",
17+
hidden: false,
18+
supportedReasoningEfforts: [
19+
{
20+
reasoningEffort: "medium",
21+
description: "Balances speed and reasoning depth for everyday tasks",
22+
},
23+
],
24+
defaultReasoningEffort: "medium",
25+
inputModalities: ["text", "image"],
26+
supportsPersonality: true,
27+
isDefault: true,
28+
...overrides,
29+
};
30+
}
31+
32+
describe("parseCodexModelListResponse", () => {
33+
it("preserves fast mode for GPT-5 models when app-server omits additionalSpeedTiers", () => {
34+
const [model] = parseCodexModelListResponse({
35+
data: [makeModel()],
36+
nextCursor: null,
37+
});
38+
39+
expect(model).toBeDefined();
40+
expect(model?.capabilities).toBeDefined();
41+
expect(model?.capabilities?.optionDescriptors).toContainEqual(
42+
expect.objectContaining({ id: "fastMode", type: "boolean" }),
43+
);
44+
});
45+
46+
it("honors an explicit empty additionalSpeedTiers list", () => {
47+
const [model] = parseCodexModelListResponse({
48+
data: [
49+
makeModel({
50+
additionalSpeedTiers: [],
51+
}),
52+
],
53+
nextCursor: null,
54+
});
55+
56+
expect(model).toBeDefined();
57+
expect(model?.capabilities).toBeDefined();
58+
expect(model?.capabilities?.optionDescriptors).not.toContainEqual(
59+
expect.objectContaining({ id: "fastMode" }),
60+
);
61+
});
62+
});

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ function mapCodexModelCapabilities(
106106
},
107107
);
108108
const defaultReasoning = reasoningOptions.find((option) => option.isDefault)?.id;
109-
const supportsFastMode = (model.additionalSpeedTiers ?? []).includes("fast");
109+
const supportsFastMode = globalThis.Array.isArray(model.additionalSpeedTiers)
110+
? model.additionalSpeedTiers.includes("fast")
111+
: /^gpt-5(?:[.-]|$)/.test(model.model);
110112
return createModelCapabilities({
111113
optionDescriptors: [
112114
...(reasoningOptions.length > 0
@@ -140,7 +142,7 @@ const toDisplayName = (model: CodexSchema.V2ModelListResponse__Model): string =>
140142
.replace(/-([a-z])/g, (_, c) => "-" + c.toUpperCase());
141143
};
142144

143-
function parseCodexModelListResponse(
145+
export function parseCodexModelListResponse(
144146
response: CodexSchema.V2ModelListResponse,
145147
): ReadonlyArray<ServerProviderModel> {
146148
return response.data.map((model) => ({

0 commit comments

Comments
 (0)