Skip to content

Commit 5a72219

Browse files
perf: Optimize performance by changing cyclic data retrieval to batch retrieval
1 parent d2e9ea4 commit 5a72219

1 file changed

Lines changed: 37 additions & 18 deletions

File tree

apps/application/flow/common.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -248,33 +248,52 @@ def is_valid_start_node(self):
248248
def is_valid_model_params(self):
249249
node_list = [node for node in self.nodes if (
250250
node.type == 'ai-chat-node' or node.type == 'question-node' or node.type == 'parameter-extraction-node')]
251+
252+
model_ids = []
253+
nodes_requiring_validation = []
251254
for node in node_list:
252255
if (node.properties.get('node_data', {}).get('model_id_type') or 'custom') == 'reference':
253256
continue
254-
model = QuerySet(Model).filter(id=node.properties.get('node_data', {}).get('model_id')).first()
255-
if model is None:
256-
raise ValidationError(ErrorDetail(
257-
_('The node {node} model does not exist').format(node=node.properties.get("stepName"))))
258-
credential = get_model_credential(model.provider, model.model_type, model.model_name)
259-
model_params_setting = node.properties.get('node_data', {}).get('model_params_setting')
260-
model_params_setting_form = credential.get_model_params_setting_form(
261-
model.model_name)
262-
if model_params_setting is None:
263-
model_params_setting = model_params_setting_form.get_default_form_data()
264-
node.properties.get('node_data', {})['model_params_setting'] = model_params_setting
265-
if node.properties.get('status', 200) != 200:
266-
raise ValidationError(
267-
ErrorDetail(_("Node {node} is unavailable").format(node=node.properties.get("stepName"))))
257+
model_id = node.properties.get('node_data', {}).get('model_id')
258+
if model_id:
259+
model_ids.append(model_id)
260+
nodes_requiring_validation.append((node, model_id))
261+
if model_ids:
262+
models_map = {str(model.id): model for model in QuerySet(Model).filter(id__in=model_ids)}
263+
for node, model_id in nodes_requiring_validation:
264+
model = models_map.get(model_id)
265+
if model is None:
266+
raise ValidationError(ErrorDetail(
267+
_('The node {node} model does not exist').format(node=node.properties.get("stepName"))))
268+
credential = get_model_credential(model.provider, model.model_type, model.model_name)
269+
model_params_setting = node.properties.get('node_data', {}).get('model_params_setting')
270+
model_params_setting_form = credential.get_model_params_setting_form(
271+
model.model_name)
272+
if model_params_setting is None:
273+
model_params_setting = model_params_setting_form.get_default_form_data()
274+
node.properties.get('node_data', {})['model_params_setting'] = model_params_setting
275+
if node.properties.get('status', 200) != 200:
276+
raise ValidationError(
277+
ErrorDetail(_("Node {node} is unavailable").format(node=node.properties.get("stepName"))))
278+
268279
node_list = [node for node in self.nodes if (node.type == 'function-lib-node')]
280+
281+
function_lib_ids = []
282+
nodes_requiring_tool_validation = []
269283
for node in node_list:
270284
function_lib_id = node.properties.get('node_data', {}).get('function_lib_id')
271285
if function_lib_id is None:
272286
raise ValidationError(ErrorDetail(
273287
_('The library ID of node {node} cannot be empty').format(node=node.properties.get("stepName"))))
274-
f_lib = QuerySet(Tool).filter(id=function_lib_id).first()
275-
if f_lib is None:
276-
raise ValidationError(ErrorDetail(_("The function library for node {node} is not available").format(
277-
node=node.properties.get("stepName"))))
288+
function_lib_ids.append(function_lib_id)
289+
nodes_requiring_tool_validation.append((node, function_lib_id))
290+
if function_lib_ids:
291+
tools_map = {str(tool.id): tool for tool in QuerySet(Tool).filter(id__in=function_lib_ids)}
292+
for node, function_lib_id in nodes_requiring_tool_validation:
293+
f_lib = tools_map.get(function_lib_id)
294+
if f_lib is None:
295+
raise ValidationError(ErrorDetail(_("The function library for node {node} is not available").format(
296+
node=node.properties.get("stepName"))))
278297

279298
def is_valid_base_node(self):
280299
base_node_list = [node for node in self.nodes if node.id == 'base-node']

0 commit comments

Comments
 (0)