@@ -3,6 +3,7 @@ import * as environmentModule from '@/lib/core/config/feature-flags'
33import {
44 calculateCost ,
55 extractAndParseJSON ,
6+ filterBlacklistedModels ,
67 formatCost ,
78 generateStructuredOutputInstructions ,
89 getAllModelProviders ,
@@ -17,6 +18,7 @@ import {
1718 getProviderConfigFromModel ,
1819 getProviderFromModel ,
1920 getProviderModels ,
21+ isProviderBlacklisted ,
2022 MODELS_TEMP_RANGE_0_1 ,
2123 MODELS_TEMP_RANGE_0_2 ,
2224 MODELS_WITH_REASONING_EFFORT ,
@@ -976,3 +978,46 @@ describe('Tool Management', () => {
976978 } )
977979 } )
978980} )
981+
982+ describe ( 'Provider/Model Blacklist' , ( ) => {
983+ describe ( 'isProviderBlacklisted' , ( ) => {
984+ it . concurrent ( 'should return false when no providers are blacklisted' , ( ) => {
985+ expect ( isProviderBlacklisted ( 'openai' ) ) . toBe ( false )
986+ expect ( isProviderBlacklisted ( 'anthropic' ) ) . toBe ( false )
987+ } )
988+ } )
989+
990+ describe ( 'filterBlacklistedModels' , ( ) => {
991+ it . concurrent ( 'should return all models when no blacklist is set' , ( ) => {
992+ const models = [ 'gpt-4o' , 'claude-sonnet-4-5' , 'gemini-2.5-pro' ]
993+ const result = filterBlacklistedModels ( models )
994+ expect ( result ) . toEqual ( models )
995+ } )
996+
997+ it . concurrent ( 'should return empty array for empty input' , ( ) => {
998+ const result = filterBlacklistedModels ( [ ] )
999+ expect ( result ) . toEqual ( [ ] )
1000+ } )
1001+ } )
1002+
1003+ describe ( 'getBaseModelProviders blacklist filtering' , ( ) => {
1004+ it . concurrent ( 'should return providers when no blacklist is set' , ( ) => {
1005+ const providers = getBaseModelProviders ( )
1006+ expect ( Object . keys ( providers ) . length ) . toBeGreaterThan ( 0 )
1007+ expect ( providers [ 'gpt-4o' ] ) . toBe ( 'openai' )
1008+ expect ( providers [ 'claude-sonnet-4-5' ] ) . toBe ( 'anthropic' )
1009+ } )
1010+ } )
1011+
1012+ describe ( 'getProviderFromModel execution-time enforcement' , ( ) => {
1013+ it . concurrent ( 'should return provider for non-blacklisted models' , ( ) => {
1014+ expect ( getProviderFromModel ( 'gpt-4o' ) ) . toBe ( 'openai' )
1015+ expect ( getProviderFromModel ( 'claude-sonnet-4-5' ) ) . toBe ( 'anthropic' )
1016+ } )
1017+
1018+ it . concurrent ( 'should be case insensitive' , ( ) => {
1019+ expect ( getProviderFromModel ( 'GPT-4O' ) ) . toBe ( 'openai' )
1020+ expect ( getProviderFromModel ( 'CLAUDE-SONNET-4-5' ) ) . toBe ( 'anthropic' )
1021+ } )
1022+ } )
1023+ } )
0 commit comments