From b5743ff980ecd8c154b6cb737dd1db754a192150 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 25 Feb 2025 12:10:45 -0300 Subject: [PATCH] fix: Enhance edge update logic and refactor edge data handling (#6808) * feat: Enhance edge update logic with robust node reconciliation and type handling Improves the `update_edges_with_latest_component_versions` function by: - Adding comprehensive node reconciliation for missing nodes - Implementing more robust type and handle matching - Improving error logging and edge state tracking - Adding detailed docstring explaining the function's complex logic - Handling edge cases with null or missing node data - Enhancing type conversion and handle escaping mechanisms * refactor: update edge data --- .../base/langflow/initial_setup/setup.py | 180 ++++- .../Graph Vector Store RAG.json | 674 +++++++++++++----- 2 files changed, 661 insertions(+), 193 deletions(-) diff --git a/src/backend/base/langflow/initial_setup/setup.py b/src/backend/base/langflow/initial_setup/setup.py index 5db1acac8..b0ea40430 100644 --- a/src/backend/base/langflow/initial_setup/setup.py +++ b/src/backend/base/langflow/initial_setup/setup.py @@ -244,14 +244,50 @@ def update_new_output(data): def update_edges_with_latest_component_versions(project_data): + """Update edges in a project with the latest component versions. + + This function processes each edge in the project data and ensures that the source and target handles + are updated to match the latest component versions. It tracks all changes made to edges in a log + for debugging purposes. + + Args: + project_data (dict): The project data containing nodes and edges to be updated. + + Returns: + dict: A deep copy of the project data with updated edges. + + The function performs the following operations: + 1. Creates a deep copy of the project data to avoid modifying the original + 2. For each edge, extracts and parses the source and target handles + 3. Finds the corresponding source and target nodes + 4. Updates output types in the source handle based on the node's outputs + 5. Updates input types in the target handle based on the node's template + 6. Escapes and updates the handles in the edge data + 7. Logs all changes made to the edges + """ + # Initialize a dictionary to track changes for logging edge_changes_log = defaultdict(list) + # Create a deep copy to avoid modifying the original data project_data_copy = deepcopy(project_data) + + # Create a mapping of node types to node IDs for node reconciliation + node_type_map = {} + for node in project_data_copy.get("nodes", []): + node_type = node.get("data", {}).get("type", "") + if node_type: + if node_type not in node_type_map: + node_type_map[node_type] = [] + node_type_map[node_type].append(node.get("id")) + + # Process each edge in the project for edge in project_data_copy.get("edges", []): - source_handle = edge.get("data").get("sourceHandle") + # Extract and parse source and target handles + source_handle = edge.get("data", {}).get("sourceHandle") source_handle = scape_json_parse(source_handle) - target_handle = edge.get("data").get("targetHandle") + target_handle = edge.get("data", {}).get("targetHandle") target_handle = scape_json_parse(target_handle) - # Now find the source and target nodes in the nodes list + + # Find the corresponding source and target nodes source_node = next( (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("source")), None, @@ -260,27 +296,95 @@ def update_edges_with_latest_component_versions(project_data): (node for node in project_data.get("nodes", []) if node.get("id") == edge.get("target")), None, ) + + # Try to reconcile missing nodes by type + if source_node is None and source_handle and "dataType" in source_handle: + node_type = source_handle.get("dataType") + if node_type_map.get(node_type): + # Use the first node of matching type as replacement + new_node_id = node_type_map[node_type][0] + logger.info(f"Reconciling missing source node: replacing {edge.get('source')} with {new_node_id}") + + # Update edge source + edge["source"] = new_node_id + + # Update source handle ID + source_handle["id"] = new_node_id + + # Find the new source node + source_node = next( + (node for node in project_data.get("nodes", []) if node.get("id") == new_node_id), + None, + ) + + # Update edge ID (complex as it contains encoded handles) + # This is a simplified approach - in production you'd need to parse and rebuild the ID + old_id_prefix = edge.get("id", "").split("{")[0] + if old_id_prefix: + new_id_prefix = old_id_prefix.replace(edge.get("source"), new_node_id) + edge["id"] = edge.get("id", "").replace(old_id_prefix, new_id_prefix) + + if target_node is None and target_handle and "id" in target_handle: + # Extract node type from target handle ID (e.g., "AstraDBGraph-jr8pY" -> "AstraDBGraph") + id_parts = target_handle.get("id", "").split("-") + if len(id_parts) > 0: + node_type = id_parts[0] + if node_type_map.get(node_type): + # Use the first node of matching type as replacement + new_node_id = node_type_map[node_type][0] + logger.info(f"Reconciling missing target node: replacing {edge.get('target')} with {new_node_id}") + + # Update edge target + edge["target"] = new_node_id + + # Update target handle ID + target_handle["id"] = new_node_id + + # Find the new target node + target_node = next( + (node for node in project_data.get("nodes", []) if node.get("id") == new_node_id), + None, + ) + + # Update edge ID (simplified approach) + old_id_suffix = edge.get("id", "").split("}-")[1] if "}-" in edge.get("id", "") else "" + if old_id_suffix: + new_id_suffix = old_id_suffix.replace(edge.get("target"), new_node_id) + edge["id"] = edge.get("id", "").replace(old_id_suffix, new_id_suffix) + if source_node and target_node: - source_node_data = source_node.get("data").get("node") - target_node_data = target_node.get("data").get("node") + # Extract node data for easier access + source_node_data = source_node.get("data", {}).get("node", {}) + target_node_data = target_node.get("data", {}).get("node", {}) + + # Find the output data that matches the source handle name output_data = next( - (output for output in source_node_data.get("outputs", []) if output["name"] == source_handle["name"]), + ( + output + for output in source_node_data.get("outputs", []) + if output.get("name") == source_handle.get("name") + ), None, ) + + # If not found by name, try to find by display_name if not output_data: output_data = next( ( output for output in source_node_data.get("outputs", []) - if output["display_name"] == source_handle["name"] + if output.get("display_name") == source_handle.get("name") ), None, ) + # Update source handle name if found by display_name if output_data: - source_handle["name"] = output_data["name"] + source_handle["name"] = output_data.get("name") + + # Determine the new output types based on the output data if output_data: - if len(output_data.get("types")) == 1: - new_output_types = output_data.get("types") + if len(output_data.get("types", [])) == 1: + new_output_types = output_data.get("types", []) elif output_data.get("selected"): new_output_types = [output_data.get("selected")] else: @@ -288,42 +392,51 @@ def update_edges_with_latest_component_versions(project_data): else: new_output_types = [] - if source_handle["output_types"] != new_output_types: - edge_changes_log[source_node_data["display_name"]].append( + # Update output types if they've changed and log the change + if source_handle.get("output_types", []) != new_output_types: + edge_changes_log[source_node_data.get("display_name", "unknown")].append( { "attr": "output_types", - "old_value": source_handle["output_types"], + "old_value": source_handle.get("output_types", []), "new_value": new_output_types, } ) source_handle["output_types"] = new_output_types + # Update input types if they've changed and log the change field_name = target_handle.get("fieldName") - if field_name in target_node_data.get("template") and target_handle["inputTypes"] != target_node_data.get( - "template" - ).get(field_name).get("input_types"): - edge_changes_log[target_node_data["display_name"]].append( + if field_name in target_node_data.get("template", {}) and target_handle.get( + "inputTypes", [] + ) != target_node_data.get("template", {}).get(field_name, {}).get("input_types", []): + edge_changes_log[target_node_data.get("display_name", "unknown")].append( { "attr": "inputTypes", - "old_value": target_handle["inputTypes"], - "new_value": target_node_data.get("template").get(field_name).get("input_types"), + "old_value": target_handle.get("inputTypes", []), + "new_value": target_node_data.get("template", {}).get(field_name, {}).get("input_types", []), } ) - target_handle["inputTypes"] = target_node_data.get("template").get(field_name).get("input_types") + target_handle["inputTypes"] = ( + target_node_data.get("template", {}).get(field_name, {}).get("input_types", []) + ) + + # Escape the updated handles for JSON storage escaped_source_handle = escape_json_dump(source_handle) escaped_target_handle = escape_json_dump(target_handle) - try: - old_escape_source_handle = escape_json_dump(json.loads(edge["sourceHandle"])) - except json.JSONDecodeError: - old_escape_source_handle = edge["sourceHandle"] + # Try to parse and escape the old handles for comparison + try: + old_escape_source_handle = escape_json_dump(json.loads(edge.get("sourceHandle", "{}"))) + except (json.JSONDecodeError, TypeError): + old_escape_source_handle = edge.get("sourceHandle", "") try: - old_escape_target_handle = escape_json_dump(json.loads(edge["targetHandle"])) - except json.JSONDecodeError: - old_escape_target_handle = edge["targetHandle"] + old_escape_target_handle = escape_json_dump(json.loads(edge.get("targetHandle", "{}"))) + except (json.JSONDecodeError, TypeError): + old_escape_target_handle = edge.get("targetHandle", "") + + # Update source handle if it's changed and log the change if old_escape_source_handle != escaped_source_handle: - edge_changes_log[source_node_data["display_name"]].append( + edge_changes_log[source_node_data.get("display_name", "unknown")].append( { "attr": "sourceHandle", "old_value": old_escape_source_handle, @@ -331,8 +444,12 @@ def update_edges_with_latest_component_versions(project_data): } ) edge["sourceHandle"] = escaped_source_handle + if "data" in edge: + edge["data"]["sourceHandle"] = source_handle + + # Update target handle if it's changed and log the change if old_escape_target_handle != escaped_target_handle: - edge_changes_log[target_node_data["display_name"]].append( + edge_changes_log[target_node_data.get("display_name", "unknown")].append( { "attr": "targetHandle", "old_value": old_escape_target_handle, @@ -340,9 +457,14 @@ def update_edges_with_latest_component_versions(project_data): } ) edge["targetHandle"] = escaped_target_handle + if "data" in edge: + edge["data"]["targetHandle"] = target_handle else: + # Log an error if source or target node is not found after reconciliation attempt logger.error(f"Source or target node not found for edge: {edge}") + + # Log all the changes that were made log_node_changes(edge_changes_log) return project_data_copy diff --git a/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json b/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json index 4db206300..52c4bd8c5 100644 --- a/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json +++ b/src/backend/base/langflow/initial_setup/starter_projects/Graph Vector Store RAG.json @@ -7,21 +7,25 @@ "data": { "sourceHandle": { "dataType": "OpenAIEmbeddings", - "id": "OpenAIEmbeddings-jyvkr", + "id": "OpenAIEmbeddings-fcwMC", "name": "embeddings", - "output_types": ["Embeddings"] + "output_types": [ + "Embeddings" + ] }, "targetHandle": { "fieldName": "embedding_model", "id": "AstraDBGraph-jr8pY", - "inputTypes": ["Embeddings"], + "inputTypes": [ + "Embeddings" + ], "type": "other" } }, "id": "reactflow__edge-OpenAIEmbeddings-jyvkr{œdataTypeœ:œOpenAIEmbeddingsœ,œidœ:œOpenAIEmbeddings-jyvkrœ,œnameœ:œembeddingsœ,œoutput_typesœ:[œEmbeddingsœ]}-AstraDBGraph-jr8pY{œfieldNameœ:œembedding_modelœ,œidœ:œAstraDBGraph-jr8pYœ,œinputTypesœ:[œEmbeddingsœ],œtypeœ:œotherœ}", "selected": false, - "source": "OpenAIEmbeddings-jyvkr", - "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-jyvkrœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", + "source": "OpenAIEmbeddings-fcwMC", + "sourceHandle": "{œdataTypeœ: œOpenAIEmbeddingsœ, œidœ: œOpenAIEmbeddings-fcwMCœ, œnameœ: œembeddingsœ, œoutput_typesœ: [œEmbeddingsœ]}", "target": "AstraDBGraph-jr8pY", "targetHandle": "{œfieldNameœ: œembedding_modelœ, œidœ: œAstraDBGraph-jr8pYœ, œinputTypesœ: [œEmbeddingsœ], œtypeœ: œotherœ}" }, @@ -31,21 +35,25 @@ "data": { "sourceHandle": { "dataType": "ChatInput", - "id": "ChatInput-ZCSfi", + "id": "ChatInput-DA114", "name": "message", - "output_types": ["Message"] + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "search_query", "id": "AstraDBGraph-jr8pY", - "inputTypes": ["Message"], + "inputTypes": [ + "Message" + ], "type": "str" } }, "id": "reactflow__edge-ChatInput-ZCSfi{œdataTypeœ:œChatInputœ,œidœ:œChatInput-ZCSfiœ,œnameœ:œmessageœ,œoutput_typesœ:[œMessageœ]}-AstraDBGraph-jr8pY{œfieldNameœ:œsearch_queryœ,œidœ:œAstraDBGraph-jr8pYœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "ChatInput-ZCSfi", - "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-ZCSfiœ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", + "source": "ChatInput-DA114", + "sourceHandle": "{œdataTypeœ: œChatInputœ, œidœ: œChatInput-DA114œ, œnameœ: œmessageœ, œoutput_typesœ: [œMessageœ]}", "target": "AstraDBGraph-jr8pY", "targetHandle": "{œfieldNameœ: œsearch_queryœ, œidœ: œAstraDBGraph-jr8pYœ, œinputTypesœ: [œMessageœ], œtypeœ: œstrœ}" }, @@ -57,12 +65,16 @@ "dataType": "AstraDBGraph", "id": "AstraDBGraph-jr8pY", "name": "search_results", - "output_types": ["Data"] + "output_types": [ + "Data" + ] }, "targetHandle": { "fieldName": "data", - "id": "ParseData-T6FGT", - "inputTypes": ["Data"], + "id": "ParseData-alciW", + "inputTypes": [ + "Data" + ], "type": "other" } }, @@ -70,8 +82,8 @@ "selected": false, "source": "AstraDBGraph-jr8pY", "sourceHandle": "{œdataTypeœ: œAstraDBGraphœ, œidœ: œAstraDBGraph-jr8pYœ, œnameœ: œsearch_resultsœ, œoutput_typesœ: [œDataœ]}", - "target": "ParseData-T6FGT", - "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-T6FGTœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}" + "target": "ParseData-alciW", + "targetHandle": "{œfieldNameœ: œdataœ, œidœ: œParseData-alciWœ, œinputTypesœ: [œDataœ], œtypeœ: œotherœ}" }, { "animated": false, @@ -81,12 +93,17 @@ "dataType": "ParseData", "id": "ParseData-alciW", "name": "text", - "output_types": ["Message"] + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "context", "id": "Prompt-2M2d5", - "inputTypes": ["Message", "Text"], + "inputTypes": [ + "Message", + "Text" + ], "type": "str" } }, @@ -105,12 +122,17 @@ "dataType": "ChatInput", "id": "ChatInput-DA114", "name": "message", - "output_types": ["Message"] + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "question", "id": "Prompt-2M2d5", - "inputTypes": ["Message", "Text"], + "inputTypes": [ + "Message", + "Text" + ], "type": "str" } }, @@ -129,12 +151,16 @@ "dataType": "Prompt", "id": "Prompt-rmO8w", "name": "prompt", - "output_types": ["Message"] + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "input_value", "id": "OpenAIModel-a26gL", - "inputTypes": ["Message"], + "inputTypes": [ + "Message" + ], "type": "str" } }, @@ -153,21 +179,27 @@ "dataType": "OpenAIModel", "id": "OpenAIModel-LnWKb", "name": "text_output", - "output_types": ["Message"] + "output_types": [ + "Message" + ] }, "targetHandle": { "fieldName": "input_value", - "id": "ChatOutput-XL9ho", - "inputTypes": ["Data", "DataFrame", "Message"], + "id": "ChatOutput-KIkbc", + "inputTypes": [ + "Data", + "DataFrame", + "Message" + ], "type": "str" } }, "id": "reactflow__edge-OpenAIModel-LnWKb{œdataTypeœ:œOpenAIModelœ,œidœ:œOpenAIModel-LnWKbœ,œnameœ:œtext_outputœ,œoutput_typesœ:[œMessageœ]}-ChatOutput-KIkbc{œfieldNameœ:œinput_valueœ,œidœ:œChatOutput-KIkbcœ,œinputTypesœ:[œMessageœ],œtypeœ:œstrœ}", "selected": false, - "source": "OpenAIModel-a26gL", - "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-a26gLœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", - "target": "ChatOutput-XL9ho", - "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-XL9hoœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œstrœ}" + "source": "OpenAIModel-LnWKb", + "sourceHandle": "{œdataTypeœ: œOpenAIModelœ, œidœ: œOpenAIModel-LnWKbœ, œnameœ: œtext_outputœ, œoutput_typesœ: [œMessageœ]}", + "target": "ChatOutput-KIkbc", + "targetHandle": "{œfieldNameœ: œinput_valueœ, œidœ: œChatOutput-KIkbcœ, œinputTypesœ: [œDataœ, œDataFrameœ, œMessageœ], œtypeœ: œstrœ}" }, { "animated": false, @@ -177,12 +209,17 @@ "dataType": "URL", "id": "URL-qOh1r", "name": "data", - "output_types": ["Data"] + "output_types": [ + "Data" + ] }, "targetHandle": { "fieldName": "data_input", "id": "LanguageRecursiveTextSplitter-jefpx", - "inputTypes": ["Document", "Data"], + "inputTypes": [ + "Document", + "Data" + ], "type": "other" } }, @@ -201,12 +238,17 @@ "dataType": "LanguageRecursiveTextSplitter", "id": "LanguageRecursiveTextSplitter-KDtC3", "name": "data", - "output_types": ["Data"] + "output_types": [ + "Data" + ] }, "targetHandle": { "fieldName": "data_input", "id": "HtmlLinkExtractor-exHgk", - "inputTypes": ["Document", "Data"], + "inputTypes": [ + "Document", + "Data" + ], "type": "other" } }, @@ -228,7 +270,9 @@ "targetHandle": { "fieldName": "ingest_data", "id": "AstraDBGraph-FX0tA", - "inputTypes": ["Data"], + "inputTypes": [ + "Data" + ], "type": "other" } }, @@ -244,12 +288,16 @@ "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-fcwMC", "name": "embeddings", - "output_types": ["Embeddings"] + "output_types": [ + "Embeddings" + ] }, "targetHandle": { "fieldName": "embedding_model", "id": "AstraDBGraph-FX0tA", - "inputTypes": ["Embeddings"], + "inputTypes": [ + "Embeddings" + ], "type": "other" } }, @@ -265,12 +313,16 @@ "dataType": "AstraDBGraph", "id": "AstraDBGraph-xJiDN", "name": "search_results", - "output_types": ["Data"] + "output_types": [ + "Data" + ] }, "targetHandle": { "fieldName": "data", "id": "ParseData-alciW", - "inputTypes": ["Data"], + "inputTypes": [ + "Data" + ], "type": "other" } }, @@ -286,12 +338,16 @@ "dataType": "OpenAIEmbeddings", "id": "OpenAIEmbeddings-XKhhV", "name": "embeddings", - "output_types": ["Embeddings"] + "output_types": [ + "Embeddings" + ] }, "targetHandle": { "fieldName": "embedding_model", "id": "AstraDBGraph-uza6S", - "inputTypes": ["Embeddings"], + "inputTypes": [ + "Embeddings" + ], "type": "other" } }, @@ -307,12 +363,16 @@ "dataType": "HtmlLinkExtractor", "id": "HtmlLinkExtractor-LWuvQ", "name": "data", - "output_types": ["Data"] + "output_types": [ + "Data" + ] }, "targetHandle": { "fieldName": "ingest_data", "id": "AstraDBGraph-uza6S", - "inputTypes": ["Data"], + "inputTypes": [ + "Data" + ], "type": "other" } }, @@ -328,7 +388,9 @@ "data": { "id": "ChatInput-DA114", "node": { - "base_classes": ["Message"], + "base_classes": [ + "Message" + ], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -362,7 +424,9 @@ "name": "message", "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" } ], @@ -375,7 +439,9 @@ "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "background_color", @@ -395,7 +461,9 @@ "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "chat_icon", @@ -498,7 +566,10 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "placeholder": "", "required": false, "show": true, @@ -514,7 +585,9 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "sender_name", @@ -534,7 +607,9 @@ "display_name": "Session ID", "dynamic": false, "info": "The session ID of the chat. If empty, the current session ID parameter will be used.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "session_id", @@ -570,7 +645,9 @@ "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "text_color", @@ -612,7 +689,9 @@ "data": { "id": "OpenAIEmbeddings-fcwMC", "node": { - "base_classes": ["Embeddings"], + "base_classes": [ + "Embeddings" + ], "beta": false, "category": "embeddings", "conditional_paths": [], @@ -658,10 +737,14 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": ["openai_api_key"], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "tool_mode": true, - "types": ["Embeddings"], + "types": [ + "Embeddings" + ], "value": "__UNDEFINED__" } ], @@ -691,7 +774,9 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "client", @@ -761,7 +846,9 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "deployment", @@ -867,7 +954,9 @@ "display_name": "OpenAI API Base", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_base", @@ -887,7 +976,9 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "openai_api_key", "password": true, @@ -904,7 +995,9 @@ "display_name": "OpenAI API Type", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_type", @@ -924,7 +1017,9 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -944,7 +1039,9 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_organization", @@ -964,7 +1061,9 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -1048,7 +1147,9 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -1092,7 +1193,9 @@ "display_name": "Astra DB Graph", "id": "AstraDBGraph-jr8pY", "node": { - "base_classes": ["Data"], + "base_classes": [ + "Data" + ], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1138,10 +1241,16 @@ "display_name": "Search Results", "method": "search_documents", "name": "search_results", - "required_inputs": ["api_endpoint", "collection_name", "token"], + "required_inputs": [ + "api_endpoint", + "collection_name", + "token" + ], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" }, { @@ -1153,7 +1262,9 @@ "required_inputs": [], "selected": "DataFrame", "tool_mode": true, - "types": ["DataFrame"], + "types": [ + "DataFrame" + ], "value": "__UNDEFINED__" } ], @@ -1166,7 +1277,9 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": false, "name": "api_endpoint", "password": true, @@ -1305,7 +1418,9 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": ["Embeddings"], + "input_types": [ + "Embeddings" + ], "list": false, "name": "embedding_model", "placeholder": "", @@ -1322,7 +1437,9 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": ["Data"], + "input_types": [ + "Data" + ], "list": false, "name": "ingest_data", "placeholder": "", @@ -1387,7 +1504,9 @@ "tool_mode": false, "trace_as_metadata": true, "type": "str", - "value": [""] + "value": [ + "" + ] }, "metadata_indexing_include": { "_input_type": "StrInput", @@ -1415,7 +1534,11 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": ["cosine", "dot_product", "euclidean"], + "options": [ + "cosine", + "dot_product", + "euclidean" + ], "placeholder": "", "required": false, "show": true, @@ -1483,7 +1606,9 @@ "display_name": "Search Query", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "multiline": true, @@ -1548,7 +1673,10 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.", "name": "setup_mode", - "options": ["Sync", "Off"], + "options": [ + "Sync", + "Off" + ], "placeholder": "", "required": false, "show": true, @@ -1582,7 +1710,9 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": false, "name": "token", "password": true, @@ -1617,7 +1747,10 @@ "display_name": "Parse Data", "id": "ParseData-alciW", "node": { - "base_classes": ["Data", "Message"], + "base_classes": [ + "Data", + "Message" + ], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1625,7 +1758,11 @@ "display_name": "Parse Data", "documentation": "", "edited": false, - "field_order": ["data", "template", "sep"], + "field_order": [ + "data", + "template", + "sep" + ], "frozen": false, "icon": "message-square", "legacy": false, @@ -1644,7 +1781,9 @@ "name": "text", "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" }, { @@ -1655,7 +1794,9 @@ "name": "data_list", "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" } ], @@ -1686,7 +1827,9 @@ "display_name": "Data", "dynamic": false, "info": "The data to convert to text.", - "input_types": ["Data"], + "input_types": [ + "Data" + ], "list": true, "name": "data", "placeholder": "", @@ -1723,7 +1866,9 @@ "display_name": "Template", "dynamic": false, "info": "The template to use for formatting the data. It can contain the keys {text}, {data} or any other key in the Data.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "multiline": true, @@ -1760,17 +1905,25 @@ "data": { "id": "Prompt-rmO8w", "node": { - "base_classes": ["Message"], + "base_classes": [ + "Message" + ], "beta": false, "conditional_paths": [], "custom_fields": { - "template": ["context", "question"] + "template": [ + "context", + "question" + ] }, "description": "Create a prompt template with dynamic variables.", "display_name": "Prompt", "documentation": "", "edited": false, - "field_order": ["template", "tool_placeholder"], + "field_order": [ + "template", + "tool_placeholder" + ], "frozen": false, "icon": "prompts", "legacy": false, @@ -1786,7 +1939,9 @@ "name": "prompt", "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" } ], @@ -1819,7 +1974,10 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": ["Message", "Text"], + "input_types": [ + "Message", + "Text" + ], "list": false, "load_from_db": false, "multiline": true, @@ -1839,7 +1997,10 @@ "fileTypes": [], "file_path": "", "info": "", - "input_types": ["Message", "Text"], + "input_types": [ + "Message", + "Text" + ], "list": false, "load_from_db": false, "multiline": true, @@ -1875,7 +2036,9 @@ "display_name": "Tool Placeholder", "dynamic": false, "info": "A placeholder input for tool mode.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "tool_placeholder", @@ -1911,7 +2074,10 @@ "data": { "id": "OpenAIModel-LnWKb", "node": { - "base_classes": ["LanguageModel", "Message"], + "base_classes": [ + "LanguageModel", + "Message" + ], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -1948,7 +2114,9 @@ "required_inputs": [], "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" }, { @@ -1957,10 +2125,14 @@ "display_name": "Language Model", "method": "build_model", "name": "model_output", - "required_inputs": ["api_key"], + "required_inputs": [ + "api_key" + ], "selected": "LanguageModel", "tool_mode": true, - "types": ["LanguageModel"], + "types": [ + "LanguageModel" + ], "value": "__UNDEFINED__" } ], @@ -1973,7 +2145,9 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "The OpenAI API Key to use for the OpenAI model.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "api_key", "password": true, @@ -2008,7 +2182,9 @@ "display_name": "Input", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "input_value", @@ -2174,7 +2350,9 @@ "display_name": "System Message", "dynamic": false, "info": "System message to pass to the model.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "system_message", @@ -2255,7 +2433,9 @@ "data": { "id": "ChatOutput-KIkbc", "node": { - "base_classes": ["Message"], + "base_classes": [ + "Message" + ], "beta": false, "conditional_paths": [], "custom_fields": {}, @@ -2289,7 +2469,9 @@ "name": "message", "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" } ], @@ -2302,7 +2484,9 @@ "display_name": "Background Color", "dynamic": false, "info": "The background color of the icon.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "background_color", @@ -2322,7 +2506,9 @@ "display_name": "Icon", "dynamic": false, "info": "The icon of the message.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "chat_icon", @@ -2378,7 +2564,9 @@ "display_name": "Data Template", "dynamic": false, "info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "data_template", @@ -2398,7 +2586,11 @@ "display_name": "Text", "dynamic": false, "info": "Message to be passed as output.", - "input_types": ["Data", "DataFrame", "Message"], + "input_types": [ + "Data", + "DataFrame", + "Message" + ], "list": false, "load_from_db": false, "name": "input_value", @@ -2419,7 +2611,10 @@ "dynamic": false, "info": "Type of sender.", "name": "sender", - "options": ["Machine", "User"], + "options": [ + "Machine", + "User" + ], "placeholder": "", "required": false, "show": true, @@ -2435,7 +2630,9 @@ "display_name": "Sender Name", "dynamic": false, "info": "Name of the sender.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "sender_name", @@ -2455,7 +2652,9 @@ "display_name": "Session ID", "dynamic": false, "info": "The session ID of the chat. If empty, the current session ID parameter will be used.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "session_id", @@ -2491,7 +2690,9 @@ "display_name": "Text Color", "dynamic": false, "info": "The text color of the name", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "text_color", @@ -2527,7 +2728,10 @@ "data": { "id": "URL-qOh1r", "node": { - "base_classes": ["Data", "Message"], + "base_classes": [ + "Data", + "Message" + ], "beta": false, "category": "data", "conditional_paths": [], @@ -2536,7 +2740,10 @@ "display_name": "URL", "documentation": "", "edited": false, - "field_order": ["urls", "format"], + "field_order": [ + "urls", + "format" + ], "frozen": false, "icon": "layout-template", "key": "URL", @@ -2554,7 +2761,9 @@ "name": "data", "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" }, { @@ -2565,7 +2774,9 @@ "name": "text", "selected": "Message", "tool_mode": true, - "types": ["Message"], + "types": [ + "Message" + ], "value": "__UNDEFINED__" }, { @@ -2576,7 +2787,9 @@ "name": "dataframe", "selected": "DataFrame", "tool_mode": true, - "types": ["DataFrame"], + "types": [ + "DataFrame" + ], "value": "__UNDEFINED__" } ], @@ -2610,7 +2823,10 @@ "dynamic": false, "info": "Output Format. Use 'Text' to extract the text from the HTML or 'Raw HTML' for the raw HTML content.", "name": "format", - "options": ["Text", "Raw HTML"], + "options": [ + "Text", + "Raw HTML" + ], "placeholder": "", "required": false, "show": true, @@ -2626,7 +2842,9 @@ "display_name": "URLs", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": true, "load_from_db": false, "name": "urls", @@ -2678,7 +2896,9 @@ "data": { "id": "LanguageRecursiveTextSplitter-KDtC3", "node": { - "base_classes": ["Data"], + "base_classes": [ + "Data" + ], "beta": false, "category": "vectorstores", "conditional_paths": [], @@ -2726,10 +2946,16 @@ "display_name": "Search Results", "method": "search_documents", "name": "search_results", - "required_inputs": ["api_endpoint", "collection_name", "token"], + "required_inputs": [ + "api_endpoint", + "collection_name", + "token" + ], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" }, { @@ -2741,7 +2967,9 @@ "required_inputs": [], "selected": "DataFrame", "tool_mode": true, - "types": ["DataFrame"], + "types": [ + "DataFrame" + ], "value": "__UNDEFINED__" } ], @@ -2755,7 +2983,9 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": false, "name": "api_endpoint", "password": true, @@ -2894,7 +3124,9 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": ["Embeddings"], + "input_types": [ + "Embeddings" + ], "list": false, "name": "embedding_model", "placeholder": "", @@ -2911,7 +3143,9 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": ["Data"], + "input_types": [ + "Data" + ], "list": false, "name": "ingest_data", "placeholder": "", @@ -3004,7 +3238,11 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": ["cosine", "dot_product", "euclidean"], + "options": [ + "cosine", + "dot_product", + "euclidean" + ], "placeholder": "", "required": false, "show": true, @@ -3071,7 +3309,9 @@ "display_name": "Search Query", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "multiline": true, @@ -3135,7 +3375,10 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.", "name": "setup_mode", - "options": ["Sync", "Off"], + "options": [ + "Sync", + "Off" + ], "placeholder": "", "required": false, "show": true, @@ -3169,7 +3412,9 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": false, "name": "token", "password": true, @@ -3203,7 +3448,9 @@ "data": { "id": "LanguageRecursiveTextSplitter-jefpx", "node": { - "base_classes": ["Data"], + "base_classes": [ + "Data" + ], "beta": false, "category": "langchain_utilities", "conditional_paths": [], @@ -3236,7 +3483,9 @@ "required_inputs": [], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" } ], @@ -3347,7 +3596,10 @@ "display_name": "Input", "dynamic": false, "info": "The texts to split.", - "input_types": ["Document", "Data"], + "input_types": [ + "Document", + "Data" + ], "list": false, "name": "data_input", "placeholder": "", @@ -3383,7 +3635,9 @@ "data": { "id": "HtmlLinkExtractor-LWuvQ", "node": { - "base_classes": ["Data"], + "base_classes": [ + "Data" + ], "beta": false, "category": "langchain_utilities", "conditional_paths": [], @@ -3392,7 +3646,11 @@ "display_name": "HTML Link Extractor", "documentation": "https://python.langchain.com/v0.2/api_reference/community/graph_vectorstores/langchain_community.graph_vectorstores.extractors.html_link_extractor.HtmlLinkExtractor.html", "edited": false, - "field_order": ["kind", "drop_fragments", "data_input"], + "field_order": [ + "kind", + "drop_fragments", + "data_input" + ], "frozen": false, "icon": "LangChain", "key": "HtmlLinkExtractor", @@ -3411,7 +3669,9 @@ "required_inputs": [], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" } ], @@ -3443,7 +3703,10 @@ "display_name": "Input", "dynamic": false, "info": "The texts from which to extract links.", - "input_types": ["Document", "Data"], + "input_types": [ + "Document", + "Data" + ], "list": false, "name": "data_input", "placeholder": "", @@ -3514,7 +3777,9 @@ "data": { "id": "OpenAIEmbeddings-XKhhV", "node": { - "base_classes": ["Embeddings"], + "base_classes": [ + "Embeddings" + ], "beta": false, "category": "embeddings", "conditional_paths": [], @@ -3561,10 +3826,14 @@ "display_name": "Embeddings", "method": "build_embeddings", "name": "embeddings", - "required_inputs": ["openai_api_key"], + "required_inputs": [ + "openai_api_key" + ], "selected": "Embeddings", "tool_mode": true, - "types": ["Embeddings"], + "types": [ + "Embeddings" + ], "value": "__UNDEFINED__" } ], @@ -3595,7 +3864,9 @@ "display_name": "Client", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "client", @@ -3667,7 +3938,9 @@ "display_name": "Deployment", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "deployment", @@ -3777,7 +4050,9 @@ "display_name": "OpenAI API Base", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_base", @@ -3797,7 +4072,9 @@ "display_name": "OpenAI API Key", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "openai_api_key", "password": true, @@ -3814,7 +4091,9 @@ "display_name": "OpenAI API Type", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_type", @@ -3834,7 +4113,9 @@ "display_name": "OpenAI API Version", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_api_version", @@ -3854,7 +4135,9 @@ "display_name": "OpenAI Organization", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_organization", @@ -3874,7 +4157,9 @@ "display_name": "OpenAI Proxy", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "openai_proxy", @@ -3962,7 +4247,9 @@ "display_name": "TikToken Model Name", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "load_from_db": false, "name": "tiktoken_model_name", @@ -4077,7 +4364,10 @@ "data": { "id": "AstraDBGraph-xJiDN", "node": { - "base_classes": ["Data", "DataFrame"], + "base_classes": [ + "Data", + "DataFrame" + ], "beta": false, "category": "vectorstores", "conditional_paths": [], @@ -4125,10 +4415,16 @@ "display_name": "Search Results", "method": "search_documents", "name": "search_results", - "required_inputs": ["api_endpoint", "collection_name", "token"], + "required_inputs": [ + "api_endpoint", + "collection_name", + "token" + ], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" }, { @@ -4140,7 +4436,9 @@ "required_inputs": [], "selected": "DataFrame", "tool_mode": true, - "types": ["DataFrame"], + "types": [ + "DataFrame" + ], "value": "__UNDEFINED__" } ], @@ -4154,7 +4452,9 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "api_endpoint", "password": true, @@ -4299,7 +4599,9 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": ["Embeddings"], + "input_types": [ + "Embeddings" + ], "list": false, "list_add_label": "Add More", "name": "embedding_model", @@ -4317,7 +4619,9 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": ["Data"], + "input_types": [ + "Data" + ], "list": false, "list_add_label": "Add More", "name": "ingest_data", @@ -4416,7 +4720,11 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": ["cosine", "dot_product", "euclidean"], + "options": [ + "cosine", + "dot_product", + "euclidean" + ], "options_metadata": [], "placeholder": "", "required": false, @@ -4487,7 +4795,9 @@ "display_name": "Search Query", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "list_add_label": "Add More", "load_from_db": false, @@ -4556,7 +4866,10 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.", "name": "setup_mode", - "options": ["Sync", "Off"], + "options": [ + "Sync", + "Off" + ], "options_metadata": [], "placeholder": "", "required": false, @@ -4591,7 +4904,9 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "token", "password": true, @@ -4625,7 +4940,10 @@ "data": { "id": "AstraDBGraph-uza6S", "node": { - "base_classes": ["Data", "DataFrame"], + "base_classes": [ + "Data", + "DataFrame" + ], "beta": false, "category": "vectorstores", "conditional_paths": [], @@ -4673,10 +4991,16 @@ "display_name": "Search Results", "method": "search_documents", "name": "search_results", - "required_inputs": ["api_endpoint", "collection_name", "token"], + "required_inputs": [ + "api_endpoint", + "collection_name", + "token" + ], "selected": "Data", "tool_mode": true, - "types": ["Data"], + "types": [ + "Data" + ], "value": "__UNDEFINED__" }, { @@ -4688,7 +5012,9 @@ "required_inputs": [], "selected": "DataFrame", "tool_mode": true, - "types": ["DataFrame"], + "types": [ + "DataFrame" + ], "value": "__UNDEFINED__" } ], @@ -4702,7 +5028,9 @@ "display_name": "API Endpoint", "dynamic": false, "info": "API endpoint URL for the Astra DB service.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "api_endpoint", "password": true, @@ -4847,7 +5175,9 @@ "display_name": "Embedding Model", "dynamic": false, "info": "Allows an embedding model configuration.", - "input_types": ["Embeddings"], + "input_types": [ + "Embeddings" + ], "list": false, "list_add_label": "Add More", "name": "embedding_model", @@ -4865,7 +5195,9 @@ "display_name": "Ingest Data", "dynamic": false, "info": "", - "input_types": ["Data"], + "input_types": [ + "Data" + ], "list": false, "list_add_label": "Add More", "name": "ingest_data", @@ -4964,7 +5296,11 @@ "dynamic": false, "info": "Optional distance metric for vector comparisons in the vector store.", "name": "metric", - "options": ["cosine", "dot_product", "euclidean"], + "options": [ + "cosine", + "dot_product", + "euclidean" + ], "options_metadata": [], "placeholder": "", "required": false, @@ -5035,7 +5371,9 @@ "display_name": "Search Query", "dynamic": false, "info": "", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "list": false, "list_add_label": "Add More", "load_from_db": false, @@ -5104,7 +5442,10 @@ "dynamic": false, "info": "Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.", "name": "setup_mode", - "options": ["Sync", "Off"], + "options": [ + "Sync", + "Off" + ], "options_metadata": [], "placeholder": "", "required": false, @@ -5139,7 +5480,9 @@ "display_name": "Astra DB Application Token", "dynamic": false, "info": "Authentication token for accessing Astra DB.", - "input_types": ["Message"], + "input_types": [ + "Message" + ], "load_from_db": true, "name": "token", "password": true, @@ -5183,5 +5526,8 @@ "is_component": false, "last_tested_version": "1.1.1", "name": "Graph RAG", - "tags": ["rag", "q-a"] -} + "tags": [ + "rag", + "q-a" + ] +} \ No newline at end of file