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