diff --git a/src/backend/base/langflow/components/experimental/TextOperator.py b/src/backend/base/langflow/components/experimental/TextOperator.py index ac2d65941..0b9821240 100644 --- a/src/backend/base/langflow/components/experimental/TextOperator.py +++ b/src/backend/base/langflow/components/experimental/TextOperator.py @@ -43,8 +43,8 @@ class TextOperatorComponent(Component): ), ] outputs = [ - Output(name="True Result", method="result_response"), - Output(name="False Result", method="result_response"), + Output(display_name="True Result", name="true_result", method="result_response"), + Output(display_name="False Result", name="false_result", method="result_response"), ] def true_response(self) -> Union[Text, Record]: diff --git a/src/backend/base/langflow/components/inputs/ChatInput.py b/src/backend/base/langflow/components/inputs/ChatInput.py index ae08a7a20..1de364364 100644 --- a/src/backend/base/langflow/components/inputs/ChatInput.py +++ b/src/backend/base/langflow/components/inputs/ChatInput.py @@ -33,8 +33,8 @@ class ChatInput(ChatComponent): ), ] outputs = [ - Output(name="Message", method="text_response"), - Output(name="Record", method="record_response"), + Output(display_name="Message", name="message", method="text_response"), + Output(display_name="Record", name="record", method="record_response"), ] def text_response(self) -> Text: diff --git a/src/backend/base/langflow/components/inputs/TextInput.py b/src/backend/base/langflow/components/inputs/TextInput.py index 596edf0ec..7fdcbb501 100644 --- a/src/backend/base/langflow/components/inputs/TextInput.py +++ b/src/backend/base/langflow/components/inputs/TextInput.py @@ -26,7 +26,7 @@ class TextInput(TextComponent): ), ] outputs = [ - Output(name="Text", method="text_response"), + Output(display_name="Text", name="text", method="text_response"), ] def text_response(self) -> Text: diff --git a/src/backend/base/langflow/components/outputs/ChatOutput.py b/src/backend/base/langflow/components/outputs/ChatOutput.py index 064cd92f1..d1506310b 100644 --- a/src/backend/base/langflow/components/outputs/ChatOutput.py +++ b/src/backend/base/langflow/components/outputs/ChatOutput.py @@ -36,8 +36,8 @@ class ChatOutput(ChatComponent): ), ] outputs = [ - Output(name="Message", method="text_response"), - Output(name="Record", method="record_response"), + Output(display_name="Message", name="message", method="text_response"), + Output(display_name="Record", name="record", method="record_response"), ] def text_response(self) -> Text: diff --git a/src/backend/base/langflow/components/outputs/RecordsOutput.py b/src/backend/base/langflow/components/outputs/RecordsOutput.py index 7af2a0c7e..f03b0ccd6 100644 --- a/src/backend/base/langflow/components/outputs/RecordsOutput.py +++ b/src/backend/base/langflow/components/outputs/RecordsOutput.py @@ -11,7 +11,7 @@ class RecordsOutput(Component): Input(name="input_value", type=Record, display_name="Record Input"), ] outputs = [ - Output(name="Record", method="record_response"), + Output(display_name="Record", name="record", method="record_response"), ] def record_response(self) -> Record: diff --git a/src/backend/base/langflow/components/outputs/TextOutput.py b/src/backend/base/langflow/components/outputs/TextOutput.py index bc71b3a27..d4615b418 100644 --- a/src/backend/base/langflow/components/outputs/TextOutput.py +++ b/src/backend/base/langflow/components/outputs/TextOutput.py @@ -26,7 +26,7 @@ class TextOutput(TextComponent): ), ] outputs = [ - Output(name="Text", method="text_response"), + Output(display_name="Text", name="text", method="text_response"), ] def text_response(self) -> Text: diff --git a/src/backend/base/langflow/custom/custom_component/component.py b/src/backend/base/langflow/custom/custom_component/component.py index 9816fe6b0..6c88e51be 100644 --- a/src/backend/base/langflow/custom/custom_component/component.py +++ b/src/backend/base/langflow/custom/custom_component/component.py @@ -60,6 +60,8 @@ class Component(CustomComponent): def _set_outputs(self, outputs: List[dict]): self.outputs = [Output(**output) for output in outputs] + for output in self.outputs: + setattr(self, output.name, output) async def build_results(self, vertex: "Vertex"): _results = {} @@ -69,14 +71,13 @@ class Component(CustomComponent): for output in self.outputs: # Build the output if it's connected to some other vertex # or if it's not connected to any vertex - self.output = output - if not vertex.outgoing_edges or output.name in vertex.edges_source_names: + if not vertex.outgoing_edges or output.display_name in vertex.edges_source_names: method: Callable | Awaitable = getattr(self, output.method) result = method() # If the method is asynchronous, we need to await it if inspect.iscoroutinefunction(method): result = await result - _results[output.name] = result + _results[output.display_name] = result self._results = _results return _results diff --git a/src/backend/base/langflow/template/field/base.py b/src/backend/base/langflow/template/field/base.py index ff3e669bb..4e9f059fa 100644 --- a/src/backend/base/langflow/template/field/base.py +++ b/src/backend/base/langflow/template/field/base.py @@ -152,7 +152,10 @@ class Output(BaseModel): selected: Optional[str] = Field(default=None, serialization_alias="selected") """The selected output type for the field.""" - name: str = Field(default="", serialization_alias="name") + display_name: Optional[str] = Field(default=None, serialization_alias="name") + """The display name of the field.""" + + name: str = Field(default=None, serialization_alias="name") """The name of the field.""" method: Optional[str] = Field(default=None, serialization_alias="method") @@ -168,3 +171,12 @@ class Output(BaseModel): def set_selected(self): if not self.selected: self.selected = self.types[0] + + @field_validator("display_name", mode="before") + def validate_display_name(cls, v, info): + if not v: + if info.data.get("name"): + return info.data["name"] + else: + raise ValueError("If display_name is not set, name must be set") + return v diff --git a/tests/data/component_multiple_outputs.py b/tests/data/component_multiple_outputs.py index 6970ab305..5cdff8773 100644 --- a/tests/data/component_multiple_outputs.py +++ b/tests/data/component_multiple_outputs.py @@ -8,8 +8,8 @@ class MultipleOutputsComponent(Component): Input(display_name="Number", name="number", field_type=int), ] outputs = [ - Output(name="Certain Output", method="certain_output"), - Output(name="Other Output", method="other_output"), + Output(display_name="Certain Output", name="certain_output", method="certain_output"), + Output(display_name="Other Output", name="other_output", method="other_output"), ] def certain_output(self) -> str: diff --git a/tests/data/component_nested_call.py b/tests/data/component_nested_call.py index 0eef5566f..6cf64944a 100644 --- a/tests/data/component_nested_call.py +++ b/tests/data/component_nested_call.py @@ -1,6 +1,7 @@ +from random import randint + from langflow.custom import Component from langflow.template.field.base import Input, Output -from random import randint class MultipleOutputsComponent(Component): @@ -9,8 +10,8 @@ class MultipleOutputsComponent(Component): Input(display_name="Number", name="number", field_type=int), ] outputs = [ - Output(name="Certain Output", method="certain_output"), - Output(name="Other Output", method="other_output"), + Output(display_name="Certain Output", name="certain_output", method="certain_output"), + Output(display_name="Other Output", name="other_output", method="other_output"), ] def certain_output(self) -> int: