workflow.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError
  15. from core.model_runtime.errors.invoke import InvokeError
  16. from libs import helper
  17. from libs.login import current_user
  18. from models.model import AppMode, InstalledApp
  19. from services.app_generate_service import AppGenerateService
  20. logger = logging.getLogger(__name__)
  21. class InstalledAppWorkflowRunApi(InstalledAppResource):
  22. def post(self, installed_app: InstalledApp):
  23. """
  24. Run workflow
  25. """
  26. app_model = installed_app.app
  27. app_mode = AppMode.value_of(app_model.mode)
  28. if app_mode != AppMode.WORKFLOW:
  29. raise NotWorkflowAppError()
  30. parser = reqparse.RequestParser()
  31. parser.add_argument("inputs", type=dict, required=True, nullable=False, location="json")
  32. parser.add_argument("files", type=list, required=False, location="json")
  33. args = parser.parse_args()
  34. try:
  35. response = AppGenerateService.generate(
  36. app_model=app_model, user=current_user, args=args, invoke_from=InvokeFrom.EXPLORE, streaming=True
  37. )
  38. return helper.compact_generate_response(response)
  39. except ProviderTokenNotInitError as ex:
  40. raise ProviderNotInitializeError(ex.description)
  41. except QuotaExceededError:
  42. raise ProviderQuotaExceededError()
  43. except ModelCurrentlyNotSupportError:
  44. raise ProviderModelCurrentlyNotSupportError()
  45. except InvokeError as e:
  46. raise CompletionRequestError(e.description)
  47. except ValueError as e:
  48. raise e
  49. except Exception as e:
  50. logging.exception("internal server error.")
  51. raise InternalServerError()
  52. class InstalledAppWorkflowTaskStopApi(InstalledAppResource):
  53. def post(self, installed_app: InstalledApp, task_id: str):
  54. """
  55. Stop workflow task
  56. """
  57. app_model = installed_app.app
  58. app_mode = AppMode.value_of(app_model.mode)
  59. if app_mode != AppMode.WORKFLOW:
  60. raise NotWorkflowAppError()
  61. AppQueueManager.set_stop_flag(task_id, InvokeFrom.EXPLORE, current_user.id)
  62. return {"result": "success"}