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.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 extensions.ext_database import db
  7. from models.dataset import Document, Pipeline
  8. from models.model import Account, App, EndUser
  9. from models.workflow import Workflow
  10. from services.rag_pipeline.rag_pipeline import RagPipelineService
  11. class PipelineGenerateService:
  12. @classmethod
  13. def generate(
  14. cls,
  15. pipeline: Pipeline,
  16. user: Union[Account, EndUser],
  17. args: Mapping[str, Any],
  18. invoke_from: InvokeFrom,
  19. streaming: bool = True,
  20. ):
  21. """
  22. Pipeline Content Generate
  23. :param pipeline: pipeline
  24. :param user: user
  25. :param args: args
  26. :param invoke_from: invoke from
  27. :param streaming: streaming
  28. :return:
  29. """
  30. try:
  31. workflow = cls._get_workflow(pipeline, invoke_from)
  32. if original_document_id := args.get("original_document_id"):
  33. # update document status to waiting
  34. cls.update_document_status(original_document_id)
  35. return PipelineGenerator.convert_to_event_stream(
  36. PipelineGenerator().generate(
  37. pipeline=pipeline,
  38. workflow=workflow,
  39. user=user,
  40. args=args,
  41. invoke_from=invoke_from,
  42. streaming=streaming,
  43. call_depth=0,
  44. workflow_thread_pool_id=None,
  45. ),
  46. )
  47. except Exception:
  48. raise
  49. @staticmethod
  50. def _get_max_active_requests(app_model: App) -> int:
  51. max_active_requests = app_model.max_active_requests
  52. if max_active_requests is None:
  53. max_active_requests = int(dify_config.APP_MAX_ACTIVE_REQUESTS)
  54. return max_active_requests
  55. @classmethod
  56. def generate_single_iteration(
  57. cls, pipeline: Pipeline, user: Account, node_id: str, args: Any, streaming: bool = True
  58. ):
  59. workflow = cls._get_workflow(pipeline, InvokeFrom.DEBUGGER)
  60. return PipelineGenerator.convert_to_event_stream(
  61. PipelineGenerator().single_iteration_generate(
  62. pipeline=pipeline, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
  63. )
  64. )
  65. @classmethod
  66. def generate_single_loop(cls, pipeline: Pipeline, user: Account, node_id: str, args: Any, streaming: bool = True):
  67. workflow = cls._get_workflow(pipeline, InvokeFrom.DEBUGGER)
  68. return PipelineGenerator.convert_to_event_stream(
  69. PipelineGenerator().single_loop_generate(
  70. pipeline=pipeline, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
  71. )
  72. )
  73. @classmethod
  74. def _get_workflow(cls, pipeline: Pipeline, invoke_from: InvokeFrom) -> Workflow:
  75. """
  76. Get workflow
  77. :param pipeline: pipeline
  78. :param invoke_from: invoke from
  79. :return:
  80. """
  81. rag_pipeline_service = RagPipelineService()
  82. if invoke_from == InvokeFrom.DEBUGGER:
  83. # fetch draft workflow by app_model
  84. workflow = rag_pipeline_service.get_draft_workflow(pipeline=pipeline)
  85. if not workflow:
  86. raise ValueError("Workflow not initialized")
  87. else:
  88. # fetch published workflow by app_model
  89. workflow = rag_pipeline_service.get_published_workflow(pipeline=pipeline)
  90. if not workflow:
  91. raise ValueError("Workflow not published")
  92. return workflow
  93. @classmethod
  94. def update_document_status(cls, document_id: str):
  95. """
  96. Update document status to waiting
  97. :param document_id: document id
  98. """
  99. document = db.session.query(Document).where(Document.id == document_id).first()
  100. if document:
  101. document.indexing_status = "waiting"
  102. db.session.add(document)
  103. db.session.commit()