app_generate_service.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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_more_like_this(cls, app_model: App, user: Union[Account, EndUser],
  75. message_id: str, invoke_from: InvokeFrom, streaming: bool = True) \
  76. -> Union[dict, Generator]:
  77. """
  78. Generate more like this
  79. :param app_model: app model
  80. :param user: user
  81. :param message_id: message id
  82. :param invoke_from: invoke from
  83. :param streaming: streaming
  84. :return:
  85. """
  86. return CompletionAppGenerator().generate_more_like_this(
  87. app_model=app_model,
  88. message_id=message_id,
  89. user=user,
  90. invoke_from=invoke_from,
  91. stream=streaming
  92. )
  93. @classmethod
  94. def _get_workflow(cls, app_model: App, invoke_from: InvokeFrom) -> Any:
  95. """
  96. Get workflow
  97. :param app_model: app model
  98. :param invoke_from: invoke from
  99. :return:
  100. """
  101. workflow_service = WorkflowService()
  102. if invoke_from == InvokeFrom.DEBUGGER:
  103. # fetch draft workflow by app_model
  104. workflow = workflow_service.get_draft_workflow(app_model=app_model)
  105. if not workflow:
  106. raise ValueError('Workflow not initialized')
  107. else:
  108. # fetch published workflow by app_model
  109. workflow = workflow_service.get_published_workflow(app_model=app_model)
  110. if not workflow:
  111. raise ValueError('Workflow not published')
  112. return workflow