models.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import logging
  2. from flask_login import current_user
  3. from flask_restful import Resource, reqparse
  4. from werkzeug.exceptions import Forbidden
  5. from controllers.console import api
  6. from controllers.console.setup import setup_required
  7. from controllers.console.wraps import account_initialization_required
  8. from core.model_runtime.entities.model_entities import ModelType
  9. from core.model_runtime.errors.validate import CredentialsValidateFailedError
  10. from core.model_runtime.utils.encoders import jsonable_encoder
  11. from libs.login import login_required
  12. from services.model_provider_service import ModelProviderService
  13. class DefaultModelApi(Resource):
  14. @setup_required
  15. @login_required
  16. @account_initialization_required
  17. def get(self):
  18. parser = reqparse.RequestParser()
  19. parser.add_argument('model_type', type=str, required=True, nullable=False,
  20. choices=[mt.value for mt in ModelType], location='args')
  21. args = parser.parse_args()
  22. tenant_id = current_user.current_tenant_id
  23. model_provider_service = ModelProviderService()
  24. default_model_entity = model_provider_service.get_default_model_of_model_type(
  25. tenant_id=tenant_id,
  26. model_type=args['model_type']
  27. )
  28. return jsonable_encoder({
  29. "data": default_model_entity
  30. })
  31. @setup_required
  32. @login_required
  33. @account_initialization_required
  34. def post(self):
  35. parser = reqparse.RequestParser()
  36. parser.add_argument('model_settings', type=list, required=True, nullable=False, location='json')
  37. args = parser.parse_args()
  38. tenant_id = current_user.current_tenant_id
  39. model_provider_service = ModelProviderService()
  40. model_settings = args['model_settings']
  41. for model_setting in model_settings:
  42. if 'model_type' not in model_setting or model_setting['model_type'] not in [mt.value for mt in ModelType]:
  43. raise ValueError('invalid model type')
  44. if 'provider' not in model_setting:
  45. continue
  46. if 'model' not in model_setting:
  47. raise ValueError('invalid model')
  48. try:
  49. model_provider_service.update_default_model_of_model_type(
  50. tenant_id=tenant_id,
  51. model_type=model_setting['model_type'],
  52. provider=model_setting['provider'],
  53. model=model_setting['model']
  54. )
  55. except Exception:
  56. logging.warning(f"{model_setting['model_type']} save error")
  57. return {'result': 'success'}
  58. class ModelProviderModelApi(Resource):
  59. @setup_required
  60. @login_required
  61. @account_initialization_required
  62. def get(self, provider):
  63. tenant_id = current_user.current_tenant_id
  64. model_provider_service = ModelProviderService()
  65. models = model_provider_service.get_models_by_provider(
  66. tenant_id=tenant_id,
  67. provider=provider
  68. )
  69. return jsonable_encoder({
  70. "data": models
  71. })
  72. @setup_required
  73. @login_required
  74. @account_initialization_required
  75. def post(self, provider: str):
  76. if current_user.current_tenant.current_role not in ['admin', 'owner']:
  77. raise Forbidden()
  78. tenant_id = current_user.current_tenant_id
  79. parser = reqparse.RequestParser()
  80. parser.add_argument('model', type=str, required=True, nullable=False, location='json')
  81. parser.add_argument('model_type', type=str, required=True, nullable=False,
  82. choices=[mt.value for mt in ModelType], location='json')
  83. parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json')
  84. args = parser.parse_args()
  85. model_provider_service = ModelProviderService()
  86. try:
  87. model_provider_service.save_model_credentials(
  88. tenant_id=tenant_id,
  89. provider=provider,
  90. model=args['model'],
  91. model_type=args['model_type'],
  92. credentials=args['credentials']
  93. )
  94. except CredentialsValidateFailedError as ex:
  95. raise ValueError(str(ex))
  96. return {'result': 'success'}, 200
  97. @setup_required
  98. @login_required
  99. @account_initialization_required
  100. def delete(self, provider: str):
  101. if current_user.current_tenant.current_role not in ['admin', 'owner']:
  102. raise Forbidden()
  103. tenant_id = current_user.current_tenant_id
  104. parser = reqparse.RequestParser()
  105. parser.add_argument('model', type=str, required=True, nullable=False, location='json')
  106. parser.add_argument('model_type', type=str, required=True, nullable=False,
  107. choices=[mt.value for mt in ModelType], location='json')
  108. args = parser.parse_args()
  109. model_provider_service = ModelProviderService()
  110. model_provider_service.remove_model_credentials(
  111. tenant_id=tenant_id,
  112. provider=provider,
  113. model=args['model'],
  114. model_type=args['model_type']
  115. )
  116. return {'result': 'success'}, 204
  117. class ModelProviderModelCredentialApi(Resource):
  118. @setup_required
  119. @login_required
  120. @account_initialization_required
  121. def get(self, provider: str):
  122. tenant_id = current_user.current_tenant_id
  123. parser = reqparse.RequestParser()
  124. parser.add_argument('model', type=str, required=True, nullable=False, location='args')
  125. parser.add_argument('model_type', type=str, required=True, nullable=False,
  126. choices=[mt.value for mt in ModelType], location='args')
  127. args = parser.parse_args()
  128. model_provider_service = ModelProviderService()
  129. credentials = model_provider_service.get_model_credentials(
  130. tenant_id=tenant_id,
  131. provider=provider,
  132. model_type=args['model_type'],
  133. model=args['model']
  134. )
  135. return {
  136. "credentials": credentials
  137. }
  138. class ModelProviderModelValidateApi(Resource):
  139. @setup_required
  140. @login_required
  141. @account_initialization_required
  142. def post(self, provider: str):
  143. tenant_id = current_user.current_tenant_id
  144. parser = reqparse.RequestParser()
  145. parser.add_argument('model', type=str, required=True, nullable=False, location='json')
  146. parser.add_argument('model_type', type=str, required=True, nullable=False,
  147. choices=[mt.value for mt in ModelType], location='json')
  148. parser.add_argument('credentials', type=dict, required=True, nullable=False, location='json')
  149. args = parser.parse_args()
  150. model_provider_service = ModelProviderService()
  151. result = True
  152. error = None
  153. try:
  154. model_provider_service.model_credentials_validate(
  155. tenant_id=tenant_id,
  156. provider=provider,
  157. model=args['model'],
  158. model_type=args['model_type'],
  159. credentials=args['credentials']
  160. )
  161. except CredentialsValidateFailedError as ex:
  162. result = False
  163. error = str(ex)
  164. response = {'result': 'success' if result else 'error'}
  165. if not result:
  166. response['error'] = error
  167. return response
  168. class ModelProviderModelParameterRuleApi(Resource):
  169. @setup_required
  170. @login_required
  171. @account_initialization_required
  172. def get(self, provider: str):
  173. parser = reqparse.RequestParser()
  174. parser.add_argument('model', type=str, required=True, nullable=False, location='args')
  175. args = parser.parse_args()
  176. tenant_id = current_user.current_tenant_id
  177. model_provider_service = ModelProviderService()
  178. parameter_rules = model_provider_service.get_model_parameter_rules(
  179. tenant_id=tenant_id,
  180. provider=provider,
  181. model=args['model']
  182. )
  183. return jsonable_encoder({
  184. "data": parameter_rules
  185. })
  186. class ModelProviderAvailableModelApi(Resource):
  187. @setup_required
  188. @login_required
  189. @account_initialization_required
  190. def get(self, model_type):
  191. tenant_id = current_user.current_tenant_id
  192. model_provider_service = ModelProviderService()
  193. models = model_provider_service.get_models_by_model_type(
  194. tenant_id=tenant_id,
  195. model_type=model_type
  196. )
  197. return jsonable_encoder({
  198. "data": models
  199. })
  200. api.add_resource(ModelProviderModelApi, '/workspaces/current/model-providers/<string:provider>/models')
  201. api.add_resource(ModelProviderModelCredentialApi,
  202. '/workspaces/current/model-providers/<string:provider>/models/credentials')
  203. api.add_resource(ModelProviderModelValidateApi,
  204. '/workspaces/current/model-providers/<string:provider>/models/credentials/validate')
  205. api.add_resource(ModelProviderModelParameterRuleApi,
  206. '/workspaces/current/model-providers/<string:provider>/models/parameter-rules')
  207. api.add_resource(ModelProviderAvailableModelApi, '/workspaces/current/models/model-types/<string:model_type>')
  208. api.add_resource(DefaultModelApi, '/workspaces/current/default-model')