diff --git a/src/backend/base/langflow/graph/edge/base.py b/src/backend/base/langflow/graph/edge/base.py index 219f2f285454..9a1e8c7965ed 100644 --- a/src/backend/base/langflow/graph/edge/base.py +++ b/src/backend/base/langflow/graph/edge/base.py @@ -23,7 +23,23 @@ def __init__(self, source: "Vertex", target: "Vertex", edge: EdgeData): self._target_handle = cast(TargetHandleDict, data.get("targetHandle", {})) self.source_handle: SourceHandle = SourceHandle(**self._source_handle) if isinstance(self._target_handle, dict): - self.target_handle: TargetHandle = TargetHandle(**self._target_handle) + try: + self.target_handle: TargetHandle = TargetHandle(**self._target_handle) + except Exception as e: + if "inputTypes" in self._target_handle and self._target_handle["inputTypes"] is None: + # Check if self._target_handle['fieldName'] + if hasattr(target, "_custom_component"): + display_name = getattr(target._custom_component, "display_name", "") + raise ValueError( + f"Component {display_name} field '{self._target_handle['fieldName']}' might not be a valid input." + ) from e + else: + raise ValueError( + f"Field '{self._target_handle['fieldName']}' on {target.display_name} might not be a valid input." + ) from e + else: + raise e + else: raise ValueError("Target handle is not a dictionary") self.target_param = self.target_handle.field_name diff --git a/src/backend/tests/unit/graph/edge/test_edge_base.py b/src/backend/tests/unit/graph/edge/test_edge_base.py new file mode 100644 index 000000000000..62676c4fbc94 --- /dev/null +++ b/src/backend/tests/unit/graph/edge/test_edge_base.py @@ -0,0 +1,35 @@ +import pytest + +from langflow.components.inputs.ChatInput import ChatInput +from langflow.components.models.OpenAIModel import OpenAIModelComponent +from langflow.components.outputs.ChatOutput import ChatOutput +from langflow.components.prompts.Prompt import PromptComponent +from langflow.graph.graph.base import Graph + + +@pytest.fixture +def client(): + pass + + +def test_edge_raises_error_on_invalid_target_handle(client): + template = """Answer the user as if you were a pirate. + +User: {user_input} + +Answer: +""" + chat_input = ChatInput() + prompt_component = PromptComponent() + prompt_component.set( + template=template, + user_input=chat_input.message_response, + ) + + openai_component = OpenAIModelComponent() + openai_component.set(input_values=prompt_component.build_prompt) + + chat_output = ChatOutput() + chat_output.set(input_value=openai_component.text_response) + with pytest.raises(ValueError, match="Component OpenAI field 'input_values' might not be a valid input."): + Graph(start=chat_input, end=chat_output)