@@ -17,7 +17,7 @@ import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
1717import { TagInput } from "@/components/ui/tag-input" ;
1818import { Textarea } from "@/components/ui/textarea" ;
1919import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from "@/components/ui/tooltip" ;
20- import { DEFAULT_ALLOWED_REQUESTS , DEFAULT_NETWORK_CONFIG , DEFAULT_PERFORMANCE_CONFIG } from "@/lib/constants/config" ;
20+ import { DEFAULT_NETWORK_CONFIG , DEFAULT_PERFORMANCE_CONFIG , getProviderDefaultAllowedRequests } from "@/lib/constants/config" ;
2121import { ProviderIconType , RenderProviderIcon } from "@/lib/constants/icons" ;
2222import { PROVIDER_LABELS , PROVIDERS as Providers } from "@/lib/constants/logs" ;
2323import { getErrorMessage , useCreateProviderMutation , useUpdateProviderMutation } from "@/lib/store" ;
@@ -111,11 +111,12 @@ const createInitialState = (provider?: ProviderResponse | null, defaultProvider?
111111
112112 // Check if this is a custom provider
113113 const isCustomProvider = provider && ! Providers . includes ( provider . name as any ) ;
114+ const baseProviderType = provider ?. custom_provider_config ?. base_provider_type || "" ;
114115
115116 return {
116117 selectedProvider : providerName ,
117118 customProviderName : isCustomProvider ? provider . name : "" ,
118- baseProviderType : provider ?. custom_provider_config ?. base_provider_type || "" ,
119+ baseProviderType,
119120 keys : isNewProvider && keysRequired ? [ createDefaultKey ( ) ] : ! isNewProvider && keysRequired && provider ?. keys ? provider . keys : [ ] ,
120121 networkConfig : provider ?. network_config || DEFAULT_NETWORK_CONFIG ,
121122 performanceConfig : provider ?. concurrency_and_buffer_size || DEFAULT_PERFORMANCE_CONFIG ,
@@ -126,7 +127,7 @@ const createInitialState = (provider?: ProviderResponse | null, defaultProvider?
126127 password : "" ,
127128 } ,
128129 sendBackRawResponse : provider ?. send_back_raw_response || false ,
129- allowedRequests : provider ?. custom_provider_config ?. allowed_requests || DEFAULT_ALLOWED_REQUESTS ,
130+ allowedRequests : provider ?. custom_provider_config ?. allowed_requests || getProviderDefaultAllowedRequests ( baseProviderType ) ,
130131 } ;
131132} ;
132133
@@ -189,6 +190,18 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
189190 const isCustomProvider =
190191 selectedProvider === "custom" || ! ! customProviderName || ! ! baseProviderType || ! Providers . includes ( selectedProvider as any ) ;
191192
193+ // Update allowed requests when base provider type changes for custom providers
194+ useEffect ( ( ) => {
195+ if ( baseProviderType && isCustomProvider && ! isEditingExisting ) {
196+ const newAllowedRequests = getProviderDefaultAllowedRequests ( baseProviderType ) ;
197+ setFormData ( ( prev ) => ( {
198+ ...prev ,
199+ allowedRequests : newAllowedRequests ,
200+ isDirty : true ,
201+ } ) ) ;
202+ }
203+ } , [ baseProviderType , isCustomProvider , isEditingExisting ] ) ;
204+
192205 const performanceValid =
193206 performanceConfig . concurrency > 0 && performanceConfig . buffer_size > 0 && performanceConfig . concurrency < performanceConfig . buffer_size ;
194207
@@ -410,10 +423,15 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
410423 / ^ [ a - z 0 - 9 _ - ] + $ / ,
411424 "Custom provider name must be lowercase alphanumeric and may include ‘-’ or ‘_’ (no spaces)" ,
412425 ) ,
413- Validator . custom (
414- ! allProviders . some ( ( p ) => p . name === customProviderName . trim ( ) && p . name !== ( provider ?. name || "" ) ) ,
415- "A provider with this name already exists" ,
416- ) ,
426+ // Only check for duplicate names when creating new providers, not when updating existing ones
427+ ...( provider
428+ ? [ ]
429+ : [
430+ Validator . custom (
431+ ! allProviders . some ( ( p ) => p . name === customProviderName . trim ( ) ) ,
432+ "A provider with this name already exists" ,
433+ ) ,
434+ ] ) ,
417435 Validator . required ( baseProviderType , "Base provider type is required for custom providers" ) ,
418436 Validator . custom (
419437 ! Providers . includes ( customProviderName . trim ( ) as any ) ,
@@ -646,7 +664,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
646664 password : "" ,
647665 } ,
648666 sendBackRawResponse : false ,
649- allowedRequests : DEFAULT_ALLOWED_REQUESTS ,
667+ allowedRequests : getProviderDefaultAllowedRequests ( "openai" ) ,
650668 } ) ;
651669
652670 const [ selectedTab , setSelectedTab ] = useState ( tabs [ 0 ] ?. id || "api-keys" ) ;
@@ -843,7 +861,10 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
843861 { /* Allowed Requests Configuration */ }
844862 < div className = "space-y-2" >
845863 < div className = "text-sm font-medium" > Allowed Request Types</ div >
846- < p className = "text-muted-foreground text-xs" > Select which request types this custom provider can handle</ p >
864+ < p className = "text-muted-foreground text-xs" >
865+ Select which request types this custom provider can handle. Automatically disabled for features not supported by the
866+ underlying provider.
867+ </ p >
847868
848869 < div className = "grid grid-cols-2 gap-4" >
849870 < div className = "space-y-3" >
@@ -853,6 +874,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
853874 size = "md"
854875 checked = { allowedRequests . text_completion }
855876 onCheckedChange = { ( checked ) => updateAllowedRequest ( "text_completion" , checked ) }
877+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . text_completion }
856878 />
857879 </ div >
858880 < div className = "flex items-center justify-between" >
@@ -861,6 +883,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
861883 size = "md"
862884 checked = { allowedRequests . chat_completion }
863885 onCheckedChange = { ( checked ) => updateAllowedRequest ( "chat_completion" , checked ) }
886+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . chat_completion }
864887 />
865888 </ div >
866889 < div className = "flex items-center justify-between" >
@@ -869,6 +892,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
869892 size = "md"
870893 checked = { allowedRequests . chat_completion_stream }
871894 onCheckedChange = { ( checked ) => updateAllowedRequest ( "chat_completion_stream" , checked ) }
895+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . chat_completion_stream }
872896 />
873897 </ div >
874898 < div className = "flex items-center justify-between" >
@@ -877,6 +901,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
877901 size = "md"
878902 checked = { allowedRequests . embedding }
879903 onCheckedChange = { ( checked ) => updateAllowedRequest ( "embedding" , checked ) }
904+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . embedding }
880905 />
881906 </ div >
882907 </ div >
@@ -887,6 +912,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
887912 size = "md"
888913 checked = { allowedRequests . speech }
889914 onCheckedChange = { ( checked ) => updateAllowedRequest ( "speech" , checked ) }
915+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . speech }
890916 />
891917 </ div >
892918 < div className = "flex items-center justify-between" >
@@ -895,6 +921,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
895921 size = "md"
896922 checked = { allowedRequests . speech_stream }
897923 onCheckedChange = { ( checked ) => updateAllowedRequest ( "speech_stream" , checked ) }
924+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . speech_stream }
898925 />
899926 </ div >
900927 < div className = "flex items-center justify-between" >
@@ -903,6 +930,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
903930 size = "md"
904931 checked = { allowedRequests . transcription }
905932 onCheckedChange = { ( checked ) => updateAllowedRequest ( "transcription" , checked ) }
933+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . transcription }
906934 />
907935 </ div >
908936 < div className = "flex items-center justify-between" >
@@ -911,6 +939,7 @@ export default function ProviderForm({ provider, onSave, onCancel, existingProvi
911939 size = "md"
912940 checked = { allowedRequests . transcription_stream }
913941 onCheckedChange = { ( checked ) => updateAllowedRequest ( "transcription_stream" , checked ) }
942+ disabled = { ! getProviderDefaultAllowedRequests ( baseProviderType || "openai" ) . transcription_stream }
914943 />
915944 </ div >
916945 </ div >
0 commit comments