Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

endpoint.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. from flask_login import current_user
  2. from flask_restx import Resource, fields, reqparse
  3. from werkzeug.exceptions import Forbidden
  4. from controllers.console import api, console_ns
  5. from controllers.console.wraps import account_initialization_required, setup_required
  6. from core.model_runtime.utils.encoders import jsonable_encoder
  7. from core.plugin.impl.exc import PluginPermissionDeniedError
  8. from libs.login import login_required
  9. from services.plugin.endpoint_service import EndpointService
  10. @console_ns.route("/workspaces/current/endpoints/create")
  11. class EndpointCreateApi(Resource):
  12. @api.doc("create_endpoint")
  13. @api.doc(description="Create a new plugin endpoint")
  14. @api.expect(
  15. api.model(
  16. "EndpointCreateRequest",
  17. {
  18. "plugin_unique_identifier": fields.String(required=True, description="Plugin unique identifier"),
  19. "settings": fields.Raw(required=True, description="Endpoint settings"),
  20. "name": fields.String(required=True, description="Endpoint name"),
  21. },
  22. )
  23. )
  24. @api.response(
  25. 200,
  26. "Endpoint created successfully",
  27. api.model("EndpointCreateResponse", {"success": fields.Boolean(description="Operation success")}),
  28. )
  29. @api.response(403, "Admin privileges required")
  30. @setup_required
  31. @login_required
  32. @account_initialization_required
  33. def post(self):
  34. user = current_user
  35. if not user.is_admin_or_owner:
  36. raise Forbidden()
  37. parser = reqparse.RequestParser()
  38. parser.add_argument("plugin_unique_identifier", type=str, required=True)
  39. parser.add_argument("settings", type=dict, required=True)
  40. parser.add_argument("name", type=str, required=True)
  41. args = parser.parse_args()
  42. plugin_unique_identifier = args["plugin_unique_identifier"]
  43. settings = args["settings"]
  44. name = args["name"]
  45. try:
  46. return {
  47. "success": EndpointService.create_endpoint(
  48. tenant_id=user.current_tenant_id,
  49. user_id=user.id,
  50. plugin_unique_identifier=plugin_unique_identifier,
  51. name=name,
  52. settings=settings,
  53. )
  54. }
  55. except PluginPermissionDeniedError as e:
  56. raise ValueError(e.description) from e
  57. @console_ns.route("/workspaces/current/endpoints/list")
  58. class EndpointListApi(Resource):
  59. @api.doc("list_endpoints")
  60. @api.doc(description="List plugin endpoints with pagination")
  61. @api.expect(
  62. api.parser()
  63. .add_argument("page", type=int, required=True, location="args", help="Page number")
  64. .add_argument("page_size", type=int, required=True, location="args", help="Page size")
  65. )
  66. @api.response(
  67. 200,
  68. "Success",
  69. api.model("EndpointListResponse", {"endpoints": fields.List(fields.Raw(description="Endpoint information"))}),
  70. )
  71. @setup_required
  72. @login_required
  73. @account_initialization_required
  74. def get(self):
  75. user = current_user
  76. parser = reqparse.RequestParser()
  77. parser.add_argument("page", type=int, required=True, location="args")
  78. parser.add_argument("page_size", type=int, required=True, location="args")
  79. args = parser.parse_args()
  80. page = args["page"]
  81. page_size = args["page_size"]
  82. return jsonable_encoder(
  83. {
  84. "endpoints": EndpointService.list_endpoints(
  85. tenant_id=user.current_tenant_id,
  86. user_id=user.id,
  87. page=page,
  88. page_size=page_size,
  89. )
  90. }
  91. )
  92. @console_ns.route("/workspaces/current/endpoints/list/plugin")
  93. class EndpointListForSinglePluginApi(Resource):
  94. @api.doc("list_plugin_endpoints")
  95. @api.doc(description="List endpoints for a specific plugin")
  96. @api.expect(
  97. api.parser()
  98. .add_argument("page", type=int, required=True, location="args", help="Page number")
  99. .add_argument("page_size", type=int, required=True, location="args", help="Page size")
  100. .add_argument("plugin_id", type=str, required=True, location="args", help="Plugin ID")
  101. )
  102. @api.response(
  103. 200,
  104. "Success",
  105. api.model(
  106. "PluginEndpointListResponse", {"endpoints": fields.List(fields.Raw(description="Endpoint information"))}
  107. ),
  108. )
  109. @setup_required
  110. @login_required
  111. @account_initialization_required
  112. def get(self):
  113. user = current_user
  114. parser = reqparse.RequestParser()
  115. parser.add_argument("page", type=int, required=True, location="args")
  116. parser.add_argument("page_size", type=int, required=True, location="args")
  117. parser.add_argument("plugin_id", type=str, required=True, location="args")
  118. args = parser.parse_args()
  119. page = args["page"]
  120. page_size = args["page_size"]
  121. plugin_id = args["plugin_id"]
  122. return jsonable_encoder(
  123. {
  124. "endpoints": EndpointService.list_endpoints_for_single_plugin(
  125. tenant_id=user.current_tenant_id,
  126. user_id=user.id,
  127. plugin_id=plugin_id,
  128. page=page,
  129. page_size=page_size,
  130. )
  131. }
  132. )
  133. @console_ns.route("/workspaces/current/endpoints/delete")
  134. class EndpointDeleteApi(Resource):
  135. @api.doc("delete_endpoint")
  136. @api.doc(description="Delete a plugin endpoint")
  137. @api.expect(
  138. api.model("EndpointDeleteRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")})
  139. )
  140. @api.response(
  141. 200,
  142. "Endpoint deleted successfully",
  143. api.model("EndpointDeleteResponse", {"success": fields.Boolean(description="Operation success")}),
  144. )
  145. @api.response(403, "Admin privileges required")
  146. @setup_required
  147. @login_required
  148. @account_initialization_required
  149. def post(self):
  150. user = current_user
  151. parser = reqparse.RequestParser()
  152. parser.add_argument("endpoint_id", type=str, required=True)
  153. args = parser.parse_args()
  154. if not user.is_admin_or_owner:
  155. raise Forbidden()
  156. endpoint_id = args["endpoint_id"]
  157. return {
  158. "success": EndpointService.delete_endpoint(
  159. tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
  160. )
  161. }
  162. @console_ns.route("/workspaces/current/endpoints/update")
  163. class EndpointUpdateApi(Resource):
  164. @api.doc("update_endpoint")
  165. @api.doc(description="Update a plugin endpoint")
  166. @api.expect(
  167. api.model(
  168. "EndpointUpdateRequest",
  169. {
  170. "endpoint_id": fields.String(required=True, description="Endpoint ID"),
  171. "settings": fields.Raw(required=True, description="Updated settings"),
  172. "name": fields.String(required=True, description="Updated name"),
  173. },
  174. )
  175. )
  176. @api.response(
  177. 200,
  178. "Endpoint updated successfully",
  179. api.model("EndpointUpdateResponse", {"success": fields.Boolean(description="Operation success")}),
  180. )
  181. @api.response(403, "Admin privileges required")
  182. @setup_required
  183. @login_required
  184. @account_initialization_required
  185. def post(self):
  186. user = current_user
  187. parser = reqparse.RequestParser()
  188. parser.add_argument("endpoint_id", type=str, required=True)
  189. parser.add_argument("settings", type=dict, required=True)
  190. parser.add_argument("name", type=str, required=True)
  191. args = parser.parse_args()
  192. endpoint_id = args["endpoint_id"]
  193. settings = args["settings"]
  194. name = args["name"]
  195. if not user.is_admin_or_owner:
  196. raise Forbidden()
  197. return {
  198. "success": EndpointService.update_endpoint(
  199. tenant_id=user.current_tenant_id,
  200. user_id=user.id,
  201. endpoint_id=endpoint_id,
  202. name=name,
  203. settings=settings,
  204. )
  205. }
  206. @console_ns.route("/workspaces/current/endpoints/enable")
  207. class EndpointEnableApi(Resource):
  208. @api.doc("enable_endpoint")
  209. @api.doc(description="Enable a plugin endpoint")
  210. @api.expect(
  211. api.model("EndpointEnableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")})
  212. )
  213. @api.response(
  214. 200,
  215. "Endpoint enabled successfully",
  216. api.model("EndpointEnableResponse", {"success": fields.Boolean(description="Operation success")}),
  217. )
  218. @api.response(403, "Admin privileges required")
  219. @setup_required
  220. @login_required
  221. @account_initialization_required
  222. def post(self):
  223. user = current_user
  224. parser = reqparse.RequestParser()
  225. parser.add_argument("endpoint_id", type=str, required=True)
  226. args = parser.parse_args()
  227. endpoint_id = args["endpoint_id"]
  228. if not user.is_admin_or_owner:
  229. raise Forbidden()
  230. return {
  231. "success": EndpointService.enable_endpoint(
  232. tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
  233. )
  234. }
  235. @console_ns.route("/workspaces/current/endpoints/disable")
  236. class EndpointDisableApi(Resource):
  237. @api.doc("disable_endpoint")
  238. @api.doc(description="Disable a plugin endpoint")
  239. @api.expect(
  240. api.model("EndpointDisableRequest", {"endpoint_id": fields.String(required=True, description="Endpoint ID")})
  241. )
  242. @api.response(
  243. 200,
  244. "Endpoint disabled successfully",
  245. api.model("EndpointDisableResponse", {"success": fields.Boolean(description="Operation success")}),
  246. )
  247. @api.response(403, "Admin privileges required")
  248. @setup_required
  249. @login_required
  250. @account_initialization_required
  251. def post(self):
  252. user = current_user
  253. parser = reqparse.RequestParser()
  254. parser.add_argument("endpoint_id", type=str, required=True)
  255. args = parser.parse_args()
  256. endpoint_id = args["endpoint_id"]
  257. if not user.is_admin_or_owner:
  258. raise Forbidden()
  259. return {
  260. "success": EndpointService.disable_endpoint(
  261. tenant_id=user.current_tenant_id, user_id=user.id, endpoint_id=endpoint_id
  262. )
  263. }