diff --git a/src/backend/langflow/initial_setup/setup.py b/src/backend/langflow/initial_setup/setup.py index f1e3fd9ce..040ae2594 100644 --- a/src/backend/langflow/initial_setup/setup.py +++ b/src/backend/langflow/initial_setup/setup.py @@ -6,8 +6,9 @@ from emoji import demojize, purely_emoji from loguru import logger from sqlmodel import select +from langflow.interface.types import get_all_components from langflow.services.database.models.flow.model import Flow, FlowCreate -from langflow.services.deps import session_scope +from langflow.services.deps import get_settings_service, session_scope STARTER_FOLDER_NAME = "Starter Projects" @@ -17,6 +18,23 @@ STARTER_FOLDER_NAME = "Starter Projects" # can use them as a starting point for their own projects. +def update_projects_components_with_latest_component_versions( + project_data, all_types_dict +): + + # project data has a nodes key, which is a list of nodes + # we want to run through each node and see if it exists in the all_types_dict + # if so, we go into the template key and also get the template from all_types_dict + # and update it all + for node in project_data.get("nodes", []): + node_data = node.get("data").get("node") + if node_data.get("display_name") in all_types_dict: + latest_node = all_types_dict.get(node_data.get("display_name")) + latest_template = latest_node.get("template") + node_data["template"]["code"] = latest_template["code"] + return project_data + + def load_starter_projects(): starter_projects = [] folder = Path(__file__).parent / "starter_projects" @@ -115,6 +133,8 @@ def delete_start_projects(session): def create_or_update_starter_projects(): + components_paths = get_settings_service().settings.COMPONENTS_PATH + all_types_dict = get_all_components(components_paths, as_dict=True) with session_scope() as session: starter_projects = load_starter_projects() delete_start_projects(session) @@ -128,6 +148,9 @@ def create_or_update_starter_projects(): project_icon, project_icon_bg_color, ) = get_project_data(project) + project_data = update_projects_components_with_latest_component_versions( + project_data, all_types_dict + ) if project_name and project_data: for existing_project in get_all_flows_similar_to_project( session, project_name diff --git a/src/backend/langflow/interface/types.py b/src/backend/langflow/interface/types.py index 32e8c2987..4908a60e3 100644 --- a/src/backend/langflow/interface/types.py +++ b/src/backend/langflow/interface/types.py @@ -72,3 +72,17 @@ def get_all_types_dict(components_paths): return merge_nested_dicts_with_renaming( native_components, custom_components_from_file ) + + +def get_all_components(components_paths, as_dict=False): + """Get all components names combining native and custom components.""" + all_types_dict = get_all_types_dict(components_paths) + components = [] if not as_dict else {} + for category in all_types_dict.values(): + for component in category.values(): + component["name"] = component["display_name"] + if as_dict: + components[component["name"]] = component + else: + components.append(component) + return components