From eedabbe50f595fd80f3e9c2dea5f1e685ac2e405 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Wed, 22 Jan 2025 23:00:24 -0300 Subject: [PATCH] fix: make sure tool mode is not lost on component validation (#5875) --- src/backend/base/langflow/api/v1/endpoints.py | 7 ++++ src/backend/base/langflow/template/utils.py | 35 ++++++++----------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/backend/base/langflow/api/v1/endpoints.py b/src/backend/base/langflow/api/v1/endpoints.py index be2b8f12e..89a31daa0 100644 --- a/src/backend/base/langflow/api/v1/endpoints.py +++ b/src/backend/base/langflow/api/v1/endpoints.py @@ -667,6 +667,13 @@ async def custom_component( if raw_code.frontend_node is not None: built_frontend_node = await component_instance.update_frontend_node(built_frontend_node, raw_code.frontend_node) + tool_mode: bool = built_frontend_node.get("tool_mode", False) + if isinstance(component_instance, Component): + await component_instance.run_and_validate_update_outputs( + frontend_node=built_frontend_node, + field_name="tool_mode", + field_value=tool_mode, + ) type_ = get_instance_name(component_instance) return CustomComponentResponse(data=built_frontend_node, type=type_) diff --git a/src/backend/base/langflow/template/utils.py b/src/backend/base/langflow/template/utils.py index fe91529b7..10d6a2bf5 100644 --- a/src/backend/base/langflow/template/utils.py +++ b/src/backend/base/langflow/template/utils.py @@ -67,7 +67,7 @@ def update_frontend_node_with_template_values(frontend_node, raw_frontend_node): """Updates the given frontend node with values from the raw template data. :param frontend_node: A dict representing a built frontend node. - :param raw_template_data: A dict representing raw template data. + :param raw_frontend_node: A dict representing raw template data. :return: Updated frontend node. """ if not is_valid_data(frontend_node, raw_frontend_node): @@ -77,29 +77,22 @@ def update_frontend_node_with_template_values(frontend_node, raw_frontend_node): old_code = raw_frontend_node["template"]["code"]["value"] new_code = frontend_node["template"]["code"]["value"] - frontend_node["edited"] = raw_frontend_node["edited"] or (old_code != new_code) - frontend_node["tool_mode"] = raw_frontend_node.get("tool_mode", False) + frontend_node["edited"] = raw_frontend_node.get("edited", False) or (old_code != new_code) - if any(extract_tool_modes(raw_frontend_node["template"])): + # Compute tool modes from template + tool_modes = [ + value.get("tool_mode") + for key, value in raw_frontend_node["template"].items() + if key != "_type" and isinstance(value, dict) + ] + + if any(tool_modes): + frontend_node["tool_mode"] = raw_frontend_node.get("tool_mode", False) + else: frontend_node["tool_mode"] = False if not frontend_node.get("edited", False): - frontend_node["display_name"] = raw_frontend_node["display_name"] - frontend_node["description"] = raw_frontend_node["description"] + frontend_node["display_name"] = raw_frontend_node.get("display_name", frontend_node.get("display_name", "")) + frontend_node["description"] = raw_frontend_node.get("description", frontend_node.get("description", "")) return frontend_node - - -def extract_tool_modes(data: dict | list) -> list[bool | None]: - tool_models = [] - if isinstance(data, dict): - for key, value in data.items(): - if key == "tool_mode": - tool_models.append(value) - else: - tool_models.extend(extract_tool_modes(value)) - elif isinstance(data, list): - for item in data: - tool_models.extend(extract_tool_modes(item)) - - return tool_models