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 3.4KB

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