11# coding=utf-8
22"""
3- @project: MaxKB
4- @Author:虎虎虎
5- @file: workflow.py
6- @date:2026/6/29 10:58
7- @desc:
3+ @project: MaxKB
4+ @Author:虎虎虎
5+ @file: workflow.py
6+ @date:2026/6/29 10:58
7+ @desc:
88"""
9+
910from enum import Enum
1011from typing import List , Dict
1112
1213from common .utils .common import group_by
1314
1415
1516class Node :
16-
1717 def __init__ (self , _id : str , _type : str , x : int , y : int , properties : dict , ** kwargs ):
1818 """
1919
@@ -64,29 +64,29 @@ def init_fields(workflow):
6464 result = []
6565 for node in workflow .nodes :
6666 properties = node .properties
67- node_name = properties .get (' stepName' )
67+ node_name = properties .get (" stepName" )
6868 node_id = node .id
69- node_config = properties .get (' config' )
70- result .append (NodeField (node_id , node_name , ' 异常信息' , ' exception_message' ))
69+ node_config = properties .get (" config" )
70+ result .append (NodeField (node_id , node_name , " 异常信息" , " exception_message" ))
7171 if node_config is not None :
72- fields = node_config .get (' fields' )
72+ fields = node_config .get (" fields" )
7373 if fields is not None :
7474 for field in fields :
75- result .append (NodeField (node_id , node_name , field .get (' label' ), field .get (' value' )))
76- global_fields = node_config .get (' globalFields' )
75+ result .append (NodeField (node_id , node_name , field .get (" label" ), field .get (" value" )))
76+ global_fields = node_config .get (" globalFields" )
7777 if global_fields is not None :
7878 for global_field in global_fields :
79- result .append (NodeField (' global' , ' 全局变量' , global_field .get (' label' ), global_field .get (' value' )))
80- chat_fields = node_config .get (' chatFields' )
79+ result .append (NodeField (" global" , " 全局变量" , global_field .get (" label" ), global_field .get (" value" )))
80+ chat_fields = node_config .get (" chatFields" )
8181 if chat_fields is not None :
8282 for chat_field in chat_fields :
83- result .append (NodeField (' chat' , ' chat' , chat_field .get (' label' ), chat_field .get (' value' )))
83+ result .append (NodeField (" chat" , " chat" , chat_field .get (" label" ), chat_field .get (" value" )))
8484 result .sort (key = lambda f : len (f .node_name + f .value ), reverse = True )
8585 return result
8686
8787
8888def get_node_parameters (node ):
89- return node .properties .get (' node_data' , {})
89+ return node .properties .get (" node_data" , {})
9090
9191
9292class NodeField :
@@ -99,13 +99,18 @@ def __init__(self, node_id, node_name, label, value):
9999 def reset_variable (self , prompt : str ):
100100 userVariable = self .node_name + "." + self .value
101101 systemVariable = f"context.get('{ self .node_id } ').get('{ self .value } ','')"
102- return prompt .replace (userVariable , systemVariable )
102+ prompt = prompt .replace (userVariable , systemVariable )
103+ # 全局变量:前端用 global.xxx 引用,也要能解析到 context['global']
104+ if self .node_id == "global" :
105+ prompt = prompt .replace (f"global.{ self .value } " , systemVariable )
106+ return prompt
103107
104108
105109class Workflow :
106110 """
107111 节点列表
108112 """
113+
109114 nodes : List [Node ]
110115 """
111116 线列表
@@ -133,14 +138,15 @@ def __init__(self, nodes: List[Node], edges: List[Edge]):
133138 self .edges = edges
134139 self .node_map = {node .id : node for node in nodes }
135140
136- self .up_node_map = {key : [ EdgeNode ( edge , self . node_map . get ( edge . sourceNodeId )) for
137- edge in edges ] for
138- key , edges in
139- group_by ( edges , key = lambda edge : edge . targetNodeId ). items () }
141+ self .up_node_map = {
142+ key : [ EdgeNode ( edge , self . node_map . get ( edge . sourceNodeId )) for edge in edges ]
143+ for key , edges in group_by ( edges , key = lambda edge : edge . targetNodeId ). items ()
144+ }
140145
141- self .next_node_map = {key : [EdgeNode (edge , self .node_map .get (edge .targetNodeId )) for edge in edges ] for
142- key , edges in
143- group_by (edges , key = lambda edge : edge .sourceNodeId ).items ()}
146+ self .next_node_map = {
147+ key : [EdgeNode (edge , self .node_map .get (edge .targetNodeId )) for edge in edges ]
148+ for key , edges in group_by (edges , key = lambda edge : edge .sourceNodeId ).items ()
149+ }
144150 self .node_field_list = init_fields (self )
145151
146152 def get_node (self , node_id ):
@@ -199,8 +205,8 @@ class WorkflowType(Enum):
199205
200206
201207def new_instance (flow_obj : Dict , workflow_type : WorkflowType = WorkflowType .APPLICATION ):
202- nodes = flow_obj .get (' nodes' )
203- edges = flow_obj .get (' edges' )
204- nodes = [Node (node .get ('id' ), node .get (' type' ), ** node ) for node in nodes ]
205- edges = [Edge (edge .get ('id' ), edge .get (' type' ), ** edge ) for edge in edges ]
208+ nodes = flow_obj .get (" nodes" )
209+ edges = flow_obj .get (" edges" )
210+ nodes = [Node (node .get ("id" ), node .get (" type" ), ** node ) for node in nodes ]
211+ edges = [Edge (edge .get ("id" ), edge .get (" type" ), ** edge ) for edge in edges ]
206212 return Workflow (nodes , edges )
0 commit comments