您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

app_generate_service.py 6.3KB

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