@@ -25,7 +25,7 @@ describe("Model filtering", () => {
2525 supportedReasoningEfforts : efforts ,
2626 defaultReasoningEffort : "medium" ,
2727 supportsPersonality : false ,
28- additionalSpeedTiers : [ ] ,
28+ additionalSpeedTiers : [ "fast" ] ,
2929 isDefault : false ,
3030 inputModalities : [ ]
3131 } ,
@@ -95,4 +95,88 @@ 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+ } ) ;
98182} ) ;
0 commit comments