Skip to content

Commit 3df76f9

Browse files
fix: review
1 parent 9467938 commit 3df76f9

2 files changed

Lines changed: 63 additions & 5 deletions

File tree

src/CodexAcpClient.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -355,18 +355,31 @@ export class CodexAcpClient {
355355
reasoningEffort: ReasoningEffort | null,
356356
serviceTier: ServiceTier | null,
357357
): ModelSelection {
358-
const selectedModel =
359-
availableModels.find(m => m.id === modelId) ??
360-
availableModels.find(m => m.isDefault);
358+
const requestedModel = availableModels.find(m => m.id === modelId);
359+
const selectedModel = requestedModel ?? availableModels.find(m => m.isDefault);
361360

362361
if (!selectedModel) {
363362
throw new Error(`Model selection failed: No model found for ID "${modelId}" and no default model is defined.`);
364363
}
365364

365+
const supportedReasoningEfforts = selectedModel.supportedReasoningEfforts ?? [];
366+
const additionalSpeedTiers = selectedModel.additionalSpeedTiers ?? [];
367+
const selectedReasoningEffort = reasoningEffort !== null && supportedReasoningEfforts.some(
368+
option => option.reasoningEffort === reasoningEffort
369+
)
370+
? reasoningEffort
371+
: selectedModel.defaultReasoningEffort;
372+
const didSelectRequestedModel = requestedModel !== undefined;
373+
const supportsServiceTier = serviceTier !== null && additionalSpeedTiers.includes(serviceTier);
374+
const selectedServiceTier =
375+
didSelectRequestedModel && supportsServiceTier
376+
? serviceTier
377+
: null;
378+
366379
return {
367380
currentModelId: selectedModel.id,
368-
currentReasoningEffort: reasoningEffort ?? selectedModel.defaultReasoningEffort,
369-
currentServiceTier: serviceTier ?? null,
381+
currentReasoningEffort: selectedReasoningEffort,
382+
currentServiceTier: selectedServiceTier,
370383
};
371384
}
372385

src/__tests__/CodexACPAgent/CodexAcpClient.test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,51 @@ describe('ACP server test', { timeout: 40_000 }, () => {
757757
});
758758
});
759759

760+
it('should fallback to the model-specific effort when reasoningEffort is unsupported', () => {
761+
const result = fixture.getCodexAcpClient().createModelSelection(mockModels, '5.2-codex', 'low', null);
762+
expect(result).toEqual({
763+
currentModelId: "5.2-codex",
764+
currentReasoningEffort: "medium",
765+
currentServiceTier: null,
766+
});
767+
});
768+
769+
it('should drop stale service tier when falling back to the default model', () => {
770+
const [codexModel, defaultModel] = mockModels as [Model, Model];
771+
const models = [
772+
{
773+
...codexModel,
774+
additionalSpeedTiers: ["fast"],
775+
},
776+
defaultModel,
777+
];
778+
779+
const result = fixture.getCodexAcpClient().createModelSelection(models, 'unavailable-model', 'high', 'fast');
780+
expect(result).toEqual({
781+
currentModelId: "5.1",
782+
currentReasoningEffort: "low",
783+
currentServiceTier: null,
784+
});
785+
});
786+
787+
it('should retain service tier when selected model supports it', () => {
788+
const [codexModel, defaultModel] = mockModels as [Model, Model];
789+
const models = [
790+
{
791+
...codexModel,
792+
additionalSpeedTiers: ["fast"],
793+
},
794+
defaultModel,
795+
];
796+
797+
const result = fixture.getCodexAcpClient().createModelSelection(models, '5.2-codex', 'high', 'fast');
798+
expect(result).toEqual({
799+
currentModelId: "5.2-codex",
800+
currentReasoningEffort: "high",
801+
currentServiceTier: "fast",
802+
});
803+
});
804+
760805
/**
761806
* Sets up a mock fixture with turnStart/awaitTurnCompleted spied on,
762807
* and a given session state. Returns the fixture and turnStart spy.

0 commit comments

Comments
 (0)