diff --git a/src/backend/langflow/api/validate.py b/src/backend/langflow/api/validate.py index 3a64080a3..de50896cb 100644 --- a/src/backend/langflow/api/validate.py +++ b/src/backend/langflow/api/validate.py @@ -9,6 +9,7 @@ from langflow.api.base import ( PromptValidationResponse, validate_prompt, ) +from langflow.graph.nodes import VectorStoreNode from langflow.interface.run import build_graph from langflow.utils.logger import logger from langflow.utils.validate import validate_code @@ -46,10 +47,11 @@ def post_validate_node(node_id: str, data: dict): graph = build_graph(data) # validate node node = graph.get_node(node_id) - if node is not None: - _ = node.build() - return json.dumps({"valid": True, "params": str(node.params)}) - else: - return json.dumps({"valid": False}) + if node is None: + raise ValueError(f"Node {node_id} not found") + if not isinstance(node, VectorStoreNode): + node.build() + return json.dumps({"valid": True, "params": str(node._built_object_repr())}) except Exception as e: - logger.error(e) + logger.exception(e) + return json.dumps({"valid": False}) diff --git a/src/backend/langflow/graph/base.py b/src/backend/langflow/graph/base.py index e661fec69..976a9c1cf 100644 --- a/src/backend/langflow/graph/base.py +++ b/src/backend/langflow/graph/base.py @@ -232,6 +232,9 @@ class Node: def __hash__(self) -> int: return id(self) + def _built_object_repr(self): + return repr(self._built_object) + class Edge: def __init__(self, source: "Node", target: "Node"): diff --git a/src/backend/langflow/graph/nodes.py b/src/backend/langflow/graph/nodes.py index 018174334..79930487a 100644 --- a/src/backend/langflow/graph/nodes.py +++ b/src/backend/langflow/graph/nodes.py @@ -139,6 +139,13 @@ class DocumentLoaderNode(Node): def __init__(self, data: Dict): super().__init__(data, base_type="documentloaders") + def _built_object_repr(self): + # This built_object is a list of documents. Maybe we should + # show how many documents are in the list? + if self._built_object: + return f"""{self.node_type}({len(self._built_object)} documents)\nDocuments: {self._built_object[:3]}...""" + return f"{self.node_type}()" + class EmbeddingNode(Node): def __init__(self, data: Dict): @@ -149,6 +156,9 @@ class VectorStoreNode(Node): def __init__(self, data: Dict): super().__init__(data, base_type="vectorstores") + def _built_object_repr(self): + return "Vector stores can take time to build. It will build on the first query." + class MemoryNode(Node): def __init__(self, data: Dict): @@ -158,3 +168,10 @@ class MemoryNode(Node): class TextSplitterNode(Node): def __init__(self, data: Dict): super().__init__(data, base_type="textsplitters") + + def _built_object_repr(self): + # This built_object is a list of documents. Maybe we should + # show how many documents are in the list? + if self._built_object: + return f"""{self.node_type}({len(self._built_object)} documents)\nDocuments: {self._built_object[:3]}...""" + return f"{self.node_type}()"