app_generate_service.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from collections.abc import Generator
  2. from typing import Any, Union
  3. from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator
  4. from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator
  5. from core.app.apps.chat.app_generator import ChatAppGenerator
  6. from core.app.apps.completion.app_generator import CompletionAppGenerator
  7. from core.app.apps.workflow.app_generator import WorkflowAppGenerator
  8. from core.app.entities.app_invoke_entities import InvokeFrom
  9. from models.model import Account, App, AppMode, EndUser
  10. from services.workflow_service import WorkflowService
  11. class AppGenerateService:
  12. @classmethod
  13. def generate(cls, app_model: App,
  14. user: Union[Account, EndUser],
  15. args: Any,
  16. invoke_from: InvokeFrom,
  17. streaming: bool = True) -> Union[dict, Generator[dict, None, None]]:
  18. """
  19. App Content Generate
  20. :param app_model: app model
  21. :param user: user
  22. :param args: args
  23. :param invoke_from: invoke from
  24. :param streaming: streaming
  25. :return:
  26. """
  27. if app_model.mode == AppMode.COMPLETION.value:
  28. return CompletionAppGenerator().generate(
  29. app_model=app_model,
  30. user=user,
  31. args=args,
  32. invoke_from=invoke_from,
  33. stream=streaming
  34. )
  35. elif app_model.mode == AppMode.AGENT_CHAT.value or app_model.is_agent:
  36. return AgentChatAppGenerator().generate(
  37. app_model=app_model,
  38. user=user,
  39. args=args,
  40. invoke_from=invoke_from,
  41. stream=streaming
  42. )
  43. elif app_model.mode == AppMode.CHAT.value:
  44. return ChatAppGenerator().generate(
  45. app_model=app_model,
  46. user=user,
  47. args=args,
  48. invoke_from=invoke_from,
  49. stream=streaming
  50. )
  51. elif app_model.mode == AppMode.ADVANCED_CHAT.value:
  52. workflow = cls._get_workflow(app_model, invoke_from)
  53. return AdvancedChatAppGenerator().generate(
  54. app_model=app_model,
  55. workflow=workflow,
  56. user=user,
  57. args=args,
  58. invoke_from=invoke_from,
  59. stream=streaming
  60. )
  61. elif app_model.mode == AppMode.WORKFLOW.value:
  62. workflow = cls._get_workflow(app_model, invoke_from)
  63. return WorkflowAppGenerator().generate(
  64. app_model=app_model,
  65. workflow=workflow,
  66. user=user,
  67. args=args,
  68. invoke_from=invoke_from,
  69. stream=streaming
  70. )
  71. else:
  72. raise ValueError(f'Invalid app mode {app_model.mode}')
  73. @classmethod
  74. def generate_single_iteration(cls, app_model: App,
  75. user: Union[Account, EndUser],
  76. node_id: str,
  77. args: Any,
  78. streaming: bool = True):
  79. if app_model.mode == AppMode.ADVANCED_CHAT.value:
  80. workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
  81. return AdvancedChatAppGenerator().single_iteration_generate(
  82. app_model=app_model,
  83. workflow=workflow,
  84. node_id=node_id,
  85. user=user,
  86. args=args,
  87. stream=streaming
  88. )
  89. elif app_model.mode == AppMode.WORKFLOW.value:
  90. workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
  91. return WorkflowAppGenerator().single_iteration_generate(
  92. app_model=app_model,
  93. workflow=workflow,
  94. node_id=node_id,
  95. user=user,
  96. args=args,
  97. stream=streaming
  98. )
  99. else:
  100. raise ValueError(f'Invalid app mode {app_model.mode}')
  101. @classmethod
  102. def generate_more_like_this(cls, app_model: App, user: Union[Account, EndUser],
  103. message_id: str, invoke_from: InvokeFrom, streaming: bool = True) \
  104. -> Union[dict, Generator]:
  105. """
  106. Generate more like this
  107. :param app_model: app model
  108. :param user: user
  109. :param message_id: message id
  110. :param invoke_from: invoke from
  111. :param streaming: streaming
  112. :return:
  113. """
  114. return CompletionAppGenerator().generate_more_like_this(
  115. app_model=app_model,
  116. message_id=message_id,
  117. user=user,
  118. invoke_from=invoke_from,
  119. stream=streaming
  120. )
  121. @classmethod
  122. def _get_workflow(cls, app_model: App, invoke_from: InvokeFrom) -> Any:
  123. """
  124. Get workflow
  125. :param app_model: app model
  126. :param invoke_from: invoke from
  127. :return:
  128. """
  129. workflow_service = WorkflowService()
  130. if invoke_from == InvokeFrom.DEBUGGER:
  131. # fetch draft workflow by app_model
  132. workflow = workflow_service.get_draft_workflow(app_model=app_model)
  133. if not workflow:
  134. raise ValueError('Workflow not initialized')
  135. else:
  136. # fetch published workflow by app_model
  137. workflow = workflow_service.get_published_workflow(app_model=app_model)
  138. if not workflow:
  139. raise ValueError('Workflow not published')
  140. return workflow