workflow.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import logging
  2. from flask_restful import reqparse # type: ignore
  3. from werkzeug.exceptions import InternalServerError
  4. from controllers.console.app.error import (
  5. CompletionRequestError,
  6. ProviderModelCurrentlyNotSupportError,
  7. ProviderNotInitializeError,
  8. ProviderQuotaExceededError,
  9. )
  10. from controllers.console.explore.error import NotWorkflowAppError
  11. from controllers.console.explore.wraps import InstalledAppResource
  12. from core.app.apps.base_app_queue_manager import AppQueueManager
  13. from core.app.entities.app_invoke_entities import InvokeFrom
  14. from core.errors.error import (
  15. ModelCurrentlyNotSupportError,
  16. ProviderTokenNotInitError,
  17. QuotaExceededError,
  18. )
  19. from core.model_runtime.errors.invoke import InvokeError
  20. from libs import helper
  21. from libs.login import current_user
  22. from models.model import AppMode, InstalledApp
  23. from services.app_generate_service import AppGenerateService
  24. logger = logging.getLogger(__name__)
  25. class InstalledAppWorkflowRunApi(InstalledAppResource):
  26. def post(self, installed_app: InstalledApp):
  27. """
  28. Run workflow
  29. """
  30. app_model = installed_app.app
  31. app_mode = AppMode.value_of(app_model.mode)
  32. if app_mode != AppMode.WORKFLOW:
  33. raise NotWorkflowAppError()
  34. parser = reqparse.RequestParser()
  35. parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json")
  36. parser.add_argument("files", type=list, required=False, location="json")
  37. args = parser.parse_args()
  38. try:
  39. response = AppGenerateService.generate(
  40. app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True
  41. )
  42. return helper.compact_generate_response(response)
  43. except ProviderTokenNotInitError as ex:
  44. raise ProviderNotInitializeError(ex.description)
  45. except QuotaExceededError:
  46. raise ProviderQuotaExceededError()
  47. except ModelCurrentlyNotSupportError:
  48. raise ProviderModelCurrentlyNotSupportError()
  49. except InvokeError as e:
  50. raise CompletionRequestError(e.description)
  51. except ValueError as e:
  52. raise e
  53. except Exception as e:
  54. logging.exception("internal server error.")
  55. raise InternalServerError()
  56. class InstalledAppWorkflowTaskStopApi(InstalledAppResource):
  57. def post(self, installed_app: InstalledApp, task_id: str):
  58. """
  59. Stop workflow task
  60. """
  61. app_model = installed_app.app
  62. app_mode = AppMode.value_of(app_model.mode)
  63. if app_mode != AppMode.WORKFLOW:
  64. raise NotWorkflowAppError()
  65. AppQueueManager.set_stop_flag(task_id, InvokeFrom.EXPLORE, current_user.id)
  66. return {"result": "success"}