node_mapping.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from collections.abc import Mapping
  2. from core.workflow.nodes.agent.agent_node import AgentNode
  3. from core.workflow.nodes.answer import AnswerNode
  4. from core.workflow.nodes.base import BaseNode
  5. from core.workflow.nodes.code import CodeNode
  6. from core.workflow.nodes.document_extractor import DocumentExtractorNode
  7. from core.workflow.nodes.end import EndNode
  8. from core.workflow.nodes.enums import NodeType
  9. from core.workflow.nodes.http_request import HttpRequestNode
  10. from core.workflow.nodes.if_else import IfElseNode
  11. from core.workflow.nodes.iteration import IterationNode, IterationStartNode
  12. from core.workflow.nodes.knowledge_retrieval import KnowledgeRetrievalNode
  13. from core.workflow.nodes.list_operator import ListOperatorNode
  14. from core.workflow.nodes.llm import LLMNode
  15. from core.workflow.nodes.loop import LoopEndNode, LoopNode, LoopStartNode
  16. from core.workflow.nodes.parameter_extractor import ParameterExtractorNode
  17. from core.workflow.nodes.question_classifier import QuestionClassifierNode
  18. from core.workflow.nodes.start import StartNode
  19. from core.workflow.nodes.template_transform import TemplateTransformNode
  20. from core.workflow.nodes.tool import ToolNode
  21. from core.workflow.nodes.variable_aggregator import VariableAggregatorNode
  22. from core.workflow.nodes.variable_assigner.v1 import VariableAssignerNode as VariableAssignerNodeV1
  23. from core.workflow.nodes.variable_assigner.v2 import VariableAssignerNode as VariableAssignerNodeV2
  24. LATEST_VERSION = "latest"
  25. # NOTE(QuantumGhost): This should be in sync with subclasses of BaseNode.
  26. # Specifically, if you have introduced new node types, you should add them here.
  27. #
  28. # TODO(QuantumGhost): This could be automated with either metaclass or `__init_subclass__`
  29. # hook. Try to avoid duplication of node information.
  30. NODE_TYPE_CLASSES_MAPPING: Mapping[NodeType, Mapping[str, type[BaseNode]]] = {
  31. NodeType.START: {
  32. LATEST_VERSION: StartNode,
  33. "1": StartNode,
  34. },
  35. NodeType.END: {
  36. LATEST_VERSION: EndNode,
  37. "1": EndNode,
  38. },
  39. NodeType.ANSWER: {
  40. LATEST_VERSION: AnswerNode,
  41. "1": AnswerNode,
  42. },
  43. NodeType.LLM: {
  44. LATEST_VERSION: LLMNode,
  45. "1": LLMNode,
  46. },
  47. NodeType.KNOWLEDGE_RETRIEVAL: {
  48. LATEST_VERSION: KnowledgeRetrievalNode,
  49. "1": KnowledgeRetrievalNode,
  50. },
  51. NodeType.IF_ELSE: {
  52. LATEST_VERSION: IfElseNode,
  53. "1": IfElseNode,
  54. },
  55. NodeType.CODE: {
  56. LATEST_VERSION: CodeNode,
  57. "1": CodeNode,
  58. },
  59. NodeType.TEMPLATE_TRANSFORM: {
  60. LATEST_VERSION: TemplateTransformNode,
  61. "1": TemplateTransformNode,
  62. },
  63. NodeType.QUESTION_CLASSIFIER: {
  64. LATEST_VERSION: QuestionClassifierNode,
  65. "1": QuestionClassifierNode,
  66. },
  67. NodeType.HTTP_REQUEST: {
  68. LATEST_VERSION: HttpRequestNode,
  69. "1": HttpRequestNode,
  70. },
  71. NodeType.TOOL: {
  72. LATEST_VERSION: ToolNode,
  73. # This is an issue that caused problems before.
  74. # Logically, we shouldn't use two different versions to point to the same class here,
  75. # but in order to maintain compatibility with historical data, this approach has been retained.
  76. "2": ToolNode,
  77. "1": ToolNode,
  78. },
  79. NodeType.VARIABLE_AGGREGATOR: {
  80. LATEST_VERSION: VariableAggregatorNode,
  81. "1": VariableAggregatorNode,
  82. },
  83. NodeType.LEGACY_VARIABLE_AGGREGATOR: {
  84. LATEST_VERSION: VariableAggregatorNode,
  85. "1": VariableAggregatorNode,
  86. }, # original name of VARIABLE_AGGREGATOR
  87. NodeType.ITERATION: {
  88. LATEST_VERSION: IterationNode,
  89. "1": IterationNode,
  90. },
  91. NodeType.ITERATION_START: {
  92. LATEST_VERSION: IterationStartNode,
  93. "1": IterationStartNode,
  94. },
  95. NodeType.LOOP: {
  96. LATEST_VERSION: LoopNode,
  97. "1": LoopNode,
  98. },
  99. NodeType.LOOP_START: {
  100. LATEST_VERSION: LoopStartNode,
  101. "1": LoopStartNode,
  102. },
  103. NodeType.LOOP_END: {
  104. LATEST_VERSION: LoopEndNode,
  105. "1": LoopEndNode,
  106. },
  107. NodeType.PARAMETER_EXTRACTOR: {
  108. LATEST_VERSION: ParameterExtractorNode,
  109. "1": ParameterExtractorNode,
  110. },
  111. NodeType.VARIABLE_ASSIGNER: {
  112. LATEST_VERSION: VariableAssignerNodeV2,
  113. "1": VariableAssignerNodeV1,
  114. "2": VariableAssignerNodeV2,
  115. },
  116. NodeType.DOCUMENT_EXTRACTOR: {
  117. LATEST_VERSION: DocumentExtractorNode,
  118. "1": DocumentExtractorNode,
  119. },
  120. NodeType.LIST_OPERATOR: {
  121. LATEST_VERSION: ListOperatorNode,
  122. "1": ListOperatorNode,
  123. },
  124. NodeType.AGENT: {
  125. LATEST_VERSION: AgentNode,
  126. # This is an issue that caused problems before.
  127. # Logically, we shouldn't use two different versions to point to the same class here,
  128. # but in order to maintain compatibility with historical data, this approach has been retained.
  129. "2": AgentNode,
  130. "1": AgentNode,
  131. },
  132. }