@@ -30,6 +30,38 @@ def _get_provider(provider):
3030 return ModelProvideConstants [provider ]
3131
3232
33+ def _is_empty_credential_value (value ):
34+ return value is None or (isinstance (value , str ) and not value .strip ())
35+
36+
37+ def _validate_model_type (provider_handler , model_type ):
38+ if not model_type :
39+ raise BadRequest400 (400 , _ ("model_type is required" ))
40+ model_type_list = [item .get ("value" ) for item in provider_handler .get_model_type_list ()]
41+ if model_type not in model_type_list :
42+ raise BadRequest400 (400 , _ ("model_type is invalid" ))
43+
44+
45+ def _validate_required_credential (provider_handler , model_type , credential ):
46+ """按供应商自己的凭证表单校验模型列表查询所需的必填参数。"""
47+ model_credential = provider_handler .get_model_credential (model_type , "" )
48+ if model_credential is None :
49+ return
50+ missing_fields = []
51+ for field in model_credential .to_form_list ():
52+ if not field .get ("required" ) or not _is_empty_credential_value (credential .get (field .get ("field" ))):
53+ continue
54+ label = field .get ("label" )
55+ if isinstance (label , dict ):
56+ label = label .get ("label" )
57+ missing_fields .append (str (label or field .get ("field" )))
58+ if missing_fields :
59+ raise BadRequest400 (
60+ 400 ,
61+ _ ("The following fields are required: {keys}" ).format (keys = ", " .join (missing_fields )),
62+ )
63+
64+
3365class Provide (APIView ):
3466 authentication_classes = [TokenAuth ]
3567
@@ -116,11 +148,7 @@ def _filter_model_list(model_list, search):
116148 @staticmethod
117149 def _get_model_list (provider , model_type , api_key , api_base , credential , allow_builtin_fallback = True ):
118150 provider_handler = _get_provider (provider )
119- if not model_type :
120- raise BadRequest400 (400 , _ ("model_type is required" ))
121- model_type_list = [item .get ("value" ) for item in provider_handler .get_model_type_list ()]
122- if model_type not in model_type_list :
123- raise BadRequest400 (400 , _ ("model_type is invalid" ))
151+ _validate_model_type (provider_handler , model_type )
124152 if allow_builtin_fallback :
125153 return provider_handler .get_model_list (
126154 model_type , api_key = api_key , api_base = api_base , credential = credential
@@ -161,6 +189,15 @@ def post(self, request: Request):
161189 credential = data .get ("credential" )
162190 search = data .get ("search" )
163191
192+ provider_handler = _get_provider (provider )
193+ credential = dict (credential ) if isinstance (credential , dict ) else {}
194+ if api_key and not credential .get ("api_key" ):
195+ credential ["api_key" ] = api_key
196+ if api_base and not credential .get ("api_base" ):
197+ credential ["api_base" ] = api_base
198+ _validate_model_type (provider_handler , model_type )
199+ _validate_required_credential (provider_handler , model_type , credential )
200+
164201 if not (api_key or credential ):
165202 # 未提供凭证:直接返回内置列表,无缓存语义。
166203 model_list = self ._get_model_list (provider , model_type , api_key , api_base , credential )
0 commit comments