Skip to content

Commit bf71f6a

Browse files
Revert "feat: LLM-26878 Add “Fast” mode for Codex-agent"
This reverts commit 9614375.
1 parent 688f479 commit bf71f6a

8 files changed

Lines changed: 24 additions & 192 deletions

File tree

src/CodexAcpClient.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,6 @@ export class CodexAcpClient {
412412
cwd: null,
413413
effort: effort,
414414
model: modelId.model,
415-
serviceTier: modelId.serviceTier,
416415
});
417416
}
418417

src/CodexAcpServer.ts

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -310,16 +310,13 @@ export class CodexAcpServer implements acp.Agent {
310310
const sessionState = this.sessions.get(params.sessionId);
311311
if (!sessionState) throw new Error(`Session ${params.sessionId} not found`);
312312

313-
const requestedModelId = ModelId.fromString(params.modelId);
313+
const requestedModelId= ModelId.fromString(params.modelId);
314314
const requestedModelName = requestedModelId.model;
315315
const requestedEffort = requestedModelId.effort;
316316

317317
const models = await this.codexAcpClient.fetchAvailableModels();
318318
const model = models.find(m => m.id === requestedModelName);
319319
if (!model) throw new Error(`Unknown model ${params.modelId}`);
320-
if (requestedModelId.serviceTier === "fast" && !model.additionalSpeedTiers.includes("fast")) {
321-
throw new Error(`Unsupported service tier fast for model ${requestedModelName}`);
322-
}
323320

324321
const requestedEffortValue = requestedEffort as ReasoningEffort | undefined;
325322
let reasoningEffort: ReasoningEffort;
@@ -337,7 +334,7 @@ export class CodexAcpServer implements acp.Agent {
337334
reasoningEffort = model.defaultReasoningEffort;
338335
}
339336

340-
sessionState.currentModelId = ModelId.fromComponents(model, reasoningEffort, requestedModelId.serviceTier).toString();
337+
sessionState.currentModelId = ModelId.fromComponents(model, reasoningEffort).toString();
341338
sessionState.supportedReasoningEfforts = model.supportedReasoningEfforts;
342339
sessionState.supportedInputModalities = model.inputModalities;
343340

@@ -356,24 +353,11 @@ export class CodexAcpServer implements acp.Agent {
356353
private createModelState(availableModels: Model[], selectedModelId: string): SessionModelState {
357354
const allowedModels = availableModels
358355
.flatMap((model) =>
359-
model.supportedReasoningEfforts.flatMap((effort) => {
360-
const standardModel = {
361-
modelId: ModelId.fromComponents(model, effort.reasoningEffort).toString(),
362-
name: `${model.displayName} (${effort.reasoningEffort})`,
363-
description: `${model.description} ${effort.description}`,
364-
};
365-
if (!model.additionalSpeedTiers.includes("fast")) {
366-
return [standardModel];
367-
}
368-
return [
369-
standardModel,
370-
{
371-
modelId: ModelId.fromComponents(model, effort.reasoningEffort, "fast").toString(),
372-
name: `${model.displayName} (${effort.reasoningEffort}, fast)`,
373-
description: `${model.description} ${effort.description} Fast service tier.`,
374-
},
375-
];
376-
})
356+
model.supportedReasoningEfforts.map((effort) => ({
357+
modelId: ModelId.fromComponents(model, effort.reasoningEffort).toString(),
358+
name: `${model.displayName} (${effort.reasoningEffort})`,
359+
description: `${model.description} ${effort.description}`,
360+
}))
377361
);
378362
return {
379363
availableModels: allowedModels,
@@ -828,7 +812,8 @@ export class CodexAcpServer implements acp.Agent {
828812
private buildQuotaMeta(sessionState: SessionState): { quota: QuotaMeta } {
829813
const lastTokenUsage = sessionState.lastTokenUsage;
830814

831-
const modelName = ModelId.fromString(sessionState.currentModelId).model;
815+
// Remove the "[reasoning-level]" suffix from currentModelId if present
816+
const modelName = sessionState.currentModelId.replace(/\[.*?]$/, '');
832817

833818
// FIXME: currently all tokens are reported for the current model
834819
const modelUsage = (lastTokenUsage != null)

src/ModelId.ts

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,42 @@
1-
import type {ReasoningEffort, ServiceTier} from "./app-server";
1+
import type {ReasoningEffort} from "./app-server";
22
import type {Model} from "./app-server/v2";
33

44
/**
5-
* ACP Model ID, combining the base model ID, reasoning effort level, and optional service tier.
5+
* ACP Model ID, combining the base model ID and its reasoning effort level.
66
* @example
77
* const id = ModelId.fromString("gpt-5.2[high]");
8-
* const fastId = ModelId.fromString("gpt-5.2[high]@fast");
98
*/
109
export class ModelId {
1110
private constructor(
1211
public readonly model: string,
13-
public readonly effort: string,
14-
public readonly serviceTier: ServiceTier | null = null
12+
public readonly effort: string
1513
) {}
1614

17-
static fromComponents(model: Model, effort: ReasoningEffort, serviceTier: ServiceTier | null = null): ModelId {
18-
return new ModelId(model.id, effort, serviceTier);
15+
static fromComponents(model: Model, effort: ReasoningEffort): ModelId {
16+
return new ModelId(model.id, effort);
1917
}
2018

21-
static create(modelId: string, effort: ReasoningEffort, serviceTier: ServiceTier | null = null): ModelId {
22-
return new ModelId(modelId, effort, serviceTier);
19+
static create(modelId: string, effort: ReasoningEffort): ModelId {
20+
return new ModelId(modelId, effort);
2321
}
2422

2523
static fromString(modelId: string): ModelId {
26-
const bracketMatch = modelId.match(/^(?<model>[^\[]+)\[(?<effort>[^\]]+)](?:@(?<serviceTier>.+))?$/);
24+
const bracketMatch = modelId.match(/^(?<model>[^\[]+?)(?:\[(?<effort>[^\]]+)\])?$/);
2725
const model = bracketMatch?.groups?.["model"];
2826
const effort = bracketMatch?.groups?.["effort"];
29-
const serviceTier = bracketMatch?.groups?.["serviceTier"] ?? null;
3027

3128
if (!model || !effort) {
32-
throw new Error(`Unsupported format of modelId: ${modelId}. Expected: modelId[effort] or modelId[effort]@fast.`);
29+
throw new Error(`Unsupported format of modelId: ${modelId}. Expected: modelId[effort].`);
3330
}
3431

35-
// The generated app-server ServiceTier type also includes "flex", but ACP model IDs
36-
// only expose Fast variants for now because model/list advertises Fast support.
37-
if (serviceTier !== null && serviceTier !== "fast") {
38-
throw new Error(`Unsupported service tier ${serviceTier} for modelId: ${modelId}.`);
32+
if (model) {
33+
return new ModelId(model, effort);
3934
}
4035

41-
return new ModelId(model, effort, serviceTier);
36+
throw new Error(`Invalid modelId format: ${modelId}`);
4237
}
4338

4439
toString(): string {
45-
const suffix = this.serviceTier === null ? "" : `@${this.serviceTier}`;
46-
return `${this.model}[${this.effort}]${suffix}`;
40+
return `${this.model}[${this.effort}]`;
4741
}
4842
}

src/__tests__/CodexACPAgent/CodexAcpClient.test.ts

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -914,34 +914,6 @@ describe('ACP server test', { timeout: 40_000 }, () => {
914914
expect(turnStartSpy).toHaveBeenCalledWith(expect.objectContaining({ summary: null }));
915915
});
916916

917-
it ('should send null service tier for normal model selections', async () => {
918-
const { mockFixture, turnStartSpy } = setupPromptFixture({
919-
currentModelId: "model-id[effort]",
920-
});
921-
922-
await mockFixture.getCodexAcpAgent().prompt({ sessionId: "id", prompt: [{ type: "text", text: "test" }] });
923-
924-
expect(turnStartSpy).toHaveBeenCalledWith(expect.objectContaining({
925-
model: "model-id",
926-
effort: "effort",
927-
serviceTier: null,
928-
}));
929-
});
930-
931-
it ('should send fast service tier for fast model selections', async () => {
932-
const { mockFixture, turnStartSpy } = setupPromptFixture({
933-
currentModelId: "model-id[effort]@fast",
934-
});
935-
936-
await mockFixture.getCodexAcpAgent().prompt({ sessionId: "id", prompt: [{ type: "text", text: "test" }] });
937-
938-
expect(turnStartSpy).toHaveBeenCalledWith(expect.objectContaining({
939-
model: "model-id",
940-
effort: "effort",
941-
serviceTier: "fast",
942-
}));
943-
});
944-
945917
it ('should disable reasoning.summary when model lacks reasoning', async () => {
946918
const { mockFixture, turnStartSpy } = setupPromptFixture({
947919
account: { type: "chatgpt", email: "test@example.com", planType: "pro" },

src/__tests__/CodexACPAgent/data/model-filtering.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,11 @@
44
"name": "GPT-5.2 (medium)",
55
"description": "Allowed by id. Default effort."
66
},
7-
{
8-
"modelId": "gpt-5.2[medium]@fast",
9-
"name": "GPT-5.2 (medium, fast)",
10-
"description": "Allowed by id. Default effort. Fast service tier."
11-
},
127
{
138
"modelId": "gpt-5.2[low]",
149
"name": "GPT-5.2 (low)",
1510
"description": "Allowed by id. Fast effort."
1611
},
17-
{
18-
"modelId": "gpt-5.2[low]@fast",
19-
"name": "GPT-5.2 (low, fast)",
20-
"description": "Allowed by id. Fast effort. Fast service tier."
21-
},
2212
{
2313
"modelId": "other-id[medium]",
2414
"name": "gpt-5.2 (medium)",

src/__tests__/CodexACPAgent/data/send-attachments-turn-start.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@
5656
"personality": null,
5757
"cwd": "cwd",
5858
"effort": "effort",
59-
"model": "model",
60-
"serviceTier": null
59+
"model": "model"
6160
}
6261
}
6362
{

src/__tests__/CodexACPAgent/model-filtering.test.ts

Lines changed: 1 addition & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ describe("Model filtering", () => {
2525
supportedReasoningEfforts: efforts,
2626
defaultReasoningEffort: "medium",
2727
supportsPersonality: false,
28-
additionalSpeedTiers: ["fast"],
28+
additionalSpeedTiers: [],
2929
isDefault: false,
3030
inputModalities: []
3131
},
@@ -95,88 +95,4 @@ describe("Model filtering", () => {
9595
"data/model-filtering.json"
9696
);
9797
});
98-
99-
it("rejects fast model selections when the model does not support fast", async () => {
100-
const fixture = createCodexMockTestFixture();
101-
const codexAcpAgent = fixture.getCodexAcpAgent();
102-
const codexAcpClient = fixture.getCodexAcpClient();
103-
104-
const models: Model[] = [
105-
{
106-
id: "gpt-5.2",
107-
model: "gpt-5.2",
108-
upgrade: null,
109-
upgradeInfo: null,
110-
availabilityNux: null,
111-
displayName: "GPT-5.2",
112-
description: "No fast tier.",
113-
hidden: false,
114-
supportedReasoningEfforts: [{reasoningEffort: "medium", description: "Default effort."}],
115-
defaultReasoningEffort: "medium",
116-
supportsPersonality: false,
117-
additionalSpeedTiers: [],
118-
isDefault: true,
119-
inputModalities: ["text"]
120-
},
121-
];
122-
123-
vi.spyOn(codexAcpClient, "authRequired").mockResolvedValue(false);
124-
vi.spyOn(codexAcpClient, "newSession").mockResolvedValue({
125-
sessionId: "session-id",
126-
currentModelId: "gpt-5.2[medium]",
127-
models,
128-
});
129-
vi.spyOn(codexAcpClient, "fetchAvailableModels").mockResolvedValue(models);
130-
vi.spyOn(codexAcpClient, "getAccount").mockResolvedValue({account: null, requiresOpenaiAuth: false});
131-
132-
await codexAcpAgent.newSession({ cwd: "", mcpServers: [] });
133-
134-
await expect(codexAcpAgent.unstable_setSessionModel({
135-
sessionId: "session-id",
136-
modelId: "gpt-5.2[medium]@fast",
137-
})).rejects.toThrow("Unsupported service tier fast for model gpt-5.2");
138-
});
139-
140-
it("stores fast model selections when the model supports fast", async () => {
141-
const fixture = createCodexMockTestFixture();
142-
const codexAcpAgent = fixture.getCodexAcpAgent();
143-
const codexAcpClient = fixture.getCodexAcpClient();
144-
145-
const models: Model[] = [
146-
{
147-
id: "gpt-5.2",
148-
model: "gpt-5.2",
149-
upgrade: null,
150-
upgradeInfo: null,
151-
availabilityNux: null,
152-
displayName: "GPT-5.2",
153-
description: "Fast tier.",
154-
hidden: false,
155-
supportedReasoningEfforts: [{reasoningEffort: "medium", description: "Default effort."}],
156-
defaultReasoningEffort: "medium",
157-
supportsPersonality: false,
158-
additionalSpeedTiers: ["fast"],
159-
isDefault: true,
160-
inputModalities: ["text"]
161-
},
162-
];
163-
164-
vi.spyOn(codexAcpClient, "authRequired").mockResolvedValue(false);
165-
vi.spyOn(codexAcpClient, "newSession").mockResolvedValue({
166-
sessionId: "session-id",
167-
currentModelId: "gpt-5.2[medium]",
168-
models,
169-
});
170-
vi.spyOn(codexAcpClient, "fetchAvailableModels").mockResolvedValue(models);
171-
vi.spyOn(codexAcpClient, "getAccount").mockResolvedValue({account: null, requiresOpenaiAuth: false});
172-
173-
await codexAcpAgent.newSession({ cwd: "", mcpServers: [] });
174-
await codexAcpAgent.unstable_setSessionModel({
175-
sessionId: "session-id",
176-
modelId: "gpt-5.2[medium]@fast",
177-
});
178-
179-
expect(codexAcpAgent.getSessionState("session-id").currentModelId)
180-
.toBe("gpt-5.2[medium]@fast");
181-
});
18298
});

src/__tests__/ModelId.test.ts

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)