You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pipeline_generate_service.py 4.2KB

5 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from collections.abc import Mapping
  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.pipeline.pipeline_generator import PipelineGenerator
  6. from core.app.apps.workflow.app_generator import WorkflowAppGenerator
  7. from core.app.entities.app_invoke_entities import InvokeFrom
  8. from models.dataset import Pipeline
  9. from models.model import Account, App, AppMode, EndUser
  10. from models.workflow import Workflow
  11. from services.rag_pipeline.rag_pipeline import RagPipelineService
  12. class PipelineGenerateService:
  13. @classmethod
  14. def generate(
  15. cls,
  16. pipeline: Pipeline,
  17. user: Union[Account, EndUser],
  18. args: Mapping[str, Any],
  19. invoke_from: InvokeFrom,
  20. streaming: bool = True,
  21. ):
  22. """
  23. Pipeline Content Generate
  24. :param pipeline: pipeline
  25. :param user: user
  26. :param args: args
  27. :param invoke_from: invoke from
  28. :param streaming: streaming
  29. :return:
  30. """
  31. try:
  32. workflow = cls._get_workflow(pipeline, invoke_from)
  33. return PipelineGenerator.convert_to_event_stream(
  34. PipelineGenerator().generate(
  35. pipeline=pipeline,
  36. workflow=workflow,
  37. user=user,
  38. args=args,
  39. invoke_from=invoke_from,
  40. streaming=streaming,
  41. call_depth=0,
  42. workflow_thread_pool_id=None,
  43. ),
  44. )
  45. except Exception:
  46. raise
  47. @staticmethod
  48. def _get_max_active_requests(app_model: App) -> int:
  49. max_active_requests = app_model.max_active_requests
  50. if max_active_requests is None:
  51. max_active_requests = int(dify_config.APP_MAX_ACTIVE_REQUESTS)
  52. return max_active_requests
  53. @classmethod
  54. def generate_single_iteration(cls, app_model: App, user: Account, node_id: str, args: Any, streaming: bool = True):
  55. if app_model.mode == AppMode.ADVANCED_CHAT.value:
  56. workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
  57. return AdvancedChatAppGenerator.convert_to_event_stream(
  58. AdvancedChatAppGenerator().single_iteration_generate(
  59. app_model=app_model, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
  60. )
  61. )
  62. elif app_model.mode == AppMode.WORKFLOW.value:
  63. workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
  64. return AdvancedChatAppGenerator.convert_to_event_stream(
  65. WorkflowAppGenerator().single_iteration_generate(
  66. app_model=app_model, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
  67. )
  68. )
  69. else:
  70. raise ValueError(f"Invalid app mode {app_model.mode}")
  71. @classmethod
  72. def generate_single_loop(cls, pipeline: Pipeline, user: Account, node_id: str, args: Any, streaming: bool = True):
  73. workflow = cls._get_workflow(pipeline, InvokeFrom.DEBUGGER)
  74. return WorkflowAppGenerator.convert_to_event_stream(
  75. WorkflowAppGenerator().single_loop_generate(
  76. app_model=pipeline, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
  77. )
  78. )
  79. @classmethod
  80. def _get_workflow(cls, pipeline: Pipeline, invoke_from: InvokeFrom) -> Workflow:
  81. """
  82. Get workflow
  83. :param pipeline: pipeline
  84. :param invoke_from: invoke from
  85. :return:
  86. """
  87. rag_pipeline_service = RagPipelineService()
  88. if invoke_from == InvokeFrom.DEBUGGER:
  89. # fetch draft workflow by app_model
  90. workflow = rag_pipeline_service.get_draft_workflow(pipeline=pipeline)
  91. if not workflow:
  92. raise ValueError("Workflow not initialized")
  93. else:
  94. # fetch published workflow by app_model
  95. workflow = rag_pipeline_service.get_published_workflow(pipeline=pipeline)
  96. if not workflow:
  97. raise ValueError("Workflow not published")
  98. return workflow