@@ -3,6 +3,7 @@ import type { Model } from '@renderer/types'
33import { beforeEach , describe , expect , it , vi } from 'vitest'
44
55import {
6+ isGPT5FamilyModel ,
67 isGPT5ProModel ,
78 isGPT5SeriesModel ,
89 isGPT5SeriesReasoningModel ,
@@ -175,13 +176,46 @@ describe('model utils', () => {
175176 } )
176177
177178 describe ( 'GPT-5 family detection' , ( ) => {
179+ describe ( 'isGPT5FamilyModel' , ( ) => {
180+ it ( 'returns true for GPT-5 base models' , ( ) => {
181+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5' } ) ) ) . toBe ( true )
182+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5-preview' } ) ) ) . toBe ( true )
183+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5-pro' } ) ) ) . toBe ( true )
184+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5-chat' } ) ) ) . toBe ( true )
185+ } )
186+
187+ it ( 'returns true for GPT-5.x sub-version models' , ( ) => {
188+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5.1' } ) ) ) . toBe ( true )
189+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5.1-mini' } ) ) ) . toBe ( true )
190+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5.2-pro' } ) ) ) . toBe ( true )
191+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-5.4' } ) ) ) . toBe ( true )
192+ } )
193+
194+ it ( 'returns false for non-GPT-5 models' , ( ) => {
195+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-4o' } ) ) ) . toBe ( false )
196+ expect ( isGPT5FamilyModel ( createModel ( { id : 'gpt-4.1' } ) ) ) . toBe ( false )
197+ expect ( isGPT5FamilyModel ( createModel ( { id : 'claude-3.5' } ) ) ) . toBe ( false )
198+ expect ( isGPT5FamilyModel ( createModel ( { id : 'o3-mini' } ) ) ) . toBe ( false )
199+ } )
200+ } )
201+
178202 describe ( 'isGPT5SeriesModel' , ( ) => {
179- it ( 'returns true for GPT-5 models' , ( ) => {
203+ it ( 'returns true for GPT-5 base models' , ( ) => {
204+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5' } ) ) ) . toBe ( true )
180205 expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5-preview' } ) ) ) . toBe ( true )
206+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5-pro' } ) ) ) . toBe ( true )
181207 } )
182208
183- it ( 'returns false for GPT-5.1 models' , ( ) => {
209+ it ( 'returns false for GPT-5.x sub-version models' , ( ) => {
184210 expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5.1-preview' } ) ) ) . toBe ( false )
211+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5.2' } ) ) ) . toBe ( false )
212+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5.4' } ) ) ) . toBe ( false )
213+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-5.9-turbo' } ) ) ) . toBe ( false )
214+ } )
215+
216+ it ( 'returns false for non-GPT-5 models' , ( ) => {
217+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-4o' } ) ) ) . toBe ( false )
218+ expect ( isGPT5SeriesModel ( createModel ( { id : 'gpt-4.1' } ) ) ) . toBe ( false )
185219 } )
186220 } )
187221
@@ -217,33 +251,65 @@ describe('model utils', () => {
217251 expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5' } ) ) ) . toBe ( true )
218252 } )
219253
220- it ( 'returns false for GPT-5 chat models' , ( ) => {
221- expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5-chat' } ) ) ) . toBe ( false )
254+ it ( 'returns true for GPT-5.x sub-version models' , ( ) => {
255+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.1-preview' } ) ) ) . toBe ( true )
256+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.2' } ) ) ) . toBe ( true )
257+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.4' } ) ) ) . toBe ( true )
258+ } )
259+
260+ it ( 'returns true for GPT-5 chat and codex models (granular exclusion handled by validators)' , ( ) => {
261+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5-chat' } ) ) ) . toBe ( true )
262+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.1-chat' } ) ) ) . toBe ( true )
263+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.1-codex' } ) ) ) . toBe ( true )
222264 } )
223265
224- it ( 'returns true for GPT-5.1 models' , ( ) => {
225- expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-5.1-preview ' } ) ) ) . toBe ( true )
266+ it ( 'returns false for non- GPT-5 models' , ( ) => {
267+ expect ( isSupportVerbosityModel ( createModel ( { id : 'gpt-4o ' } ) ) ) . toBe ( false )
226268 } )
227269 } )
228270
229271 describe ( 'getModelSupportedVerbosity' , ( ) => {
230- it ( 'returns only "high" for GPT-5 Pro models' , ( ) => {
231- expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-pro' } ) ) ) . toEqual ( [ undefined , null , 'high' ] )
232- expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-pro-2025-10-06' } ) ) ) . toEqual ( [
233- undefined ,
234- null ,
235- 'high'
236- ] )
272+ const allLevels = [ undefined , null , 'low' , 'medium' , 'high' ]
273+ const mediumOnly = [ undefined , null , 'medium' ]
274+
275+ it ( 'GPT-5 models' , ( ) => {
276+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5' } ) ) ) . toEqual ( allLevels )
277+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-mini' } ) ) ) . toEqual ( allLevels )
278+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-nano' } ) ) ) . toEqual ( allLevels )
279+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-pro' } ) ) ) . toEqual ( allLevels )
280+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5-chat' } ) ) ) . toEqual ( mediumOnly )
281+ } )
282+
283+ it ( 'GPT-5.1 models' , ( ) => {
284+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.1' } ) ) ) . toEqual ( allLevels )
285+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.1-chat-latest' } ) ) ) . toEqual ( mediumOnly )
286+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.1-codex' } ) ) ) . toEqual ( mediumOnly )
287+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.1-codex-mini' } ) ) ) . toEqual ( mediumOnly )
288+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.1-codex-max' } ) ) ) . toEqual ( mediumOnly )
289+ } )
290+
291+ it ( 'GPT-5.2 models' , ( ) => {
292+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.2' } ) ) ) . toEqual ( allLevels )
293+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.2-pro' } ) ) ) . toEqual ( allLevels )
294+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.2-codex' } ) ) ) . toEqual ( mediumOnly )
295+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.2-chat-latest' } ) ) ) . toEqual ( mediumOnly )
296+ } )
297+
298+ it ( 'GPT-5.3 models' , ( ) => {
299+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.3-codex' } ) ) ) . toEqual ( allLevels )
300+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.3-chat-latest' } ) ) ) . toEqual ( mediumOnly )
237301 } )
238302
239- it ( 'returns all levels for non-Pro GPT-5 models' , ( ) => {
240- const previewModel = createModel ( { id : 'gpt-5-preview ' } )
241- expect ( getModelSupportedVerbosity ( previewModel ) ) . toEqual ( [ undefined , null , 'low' , 'medium' , 'high' ] )
303+ it ( 'GPT-5.4 models' , ( ) => {
304+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.4 ' } ) ) ) . toEqual ( allLevels )
305+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.4-pro' } ) ) ) . toEqual ( allLevels )
242306 } )
243307
244- it ( 'returns all levels for GPT-5.1 models' , ( ) => {
245- const gpt51Model = createModel ( { id : 'gpt-5.1-preview' } )
246- expect ( getModelSupportedVerbosity ( gpt51Model ) ) . toEqual ( [ undefined , null , 'low' , 'medium' , 'high' ] )
308+ it ( 'future GPT-5.5+ models fallback correctly' , ( ) => {
309+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.5' } ) ) ) . toEqual ( allLevels )
310+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.5-pro' } ) ) ) . toEqual ( allLevels )
311+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.5-codex' } ) ) ) . toEqual ( allLevels )
312+ expect ( getModelSupportedVerbosity ( createModel ( { id : 'gpt-5.5-chat-latest' } ) ) ) . toEqual ( mediumOnly )
247313 } )
248314
249315 it ( 'returns only undefined for non-GPT-5 models' , ( ) => {
0 commit comments