From 01af92a22fa72b02abe2b82f1be4b2dc1ba3bbd1 Mon Sep 17 00:00:00 2001 From: Andrey Tatarinov Date: Sat, 28 Dec 2024 20:25:36 +0000 Subject: [PATCH 1/3] feat: StructuredOutput returns list of Data objects when multiple=True --- .../base/langflow/components/helpers/structured_output.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/components/helpers/structured_output.py b/src/backend/base/langflow/components/helpers/structured_output.py index f09dec332360..057a32139f92 100644 --- a/src/backend/base/langflow/components/helpers/structured_output.py +++ b/src/backend/base/langflow/components/helpers/structured_output.py @@ -92,7 +92,7 @@ class StructuredOutputComponent(Component): Output(name="structured_output", display_name="Structured Output", method="build_structured_output"), ] - def build_structured_output(self) -> Data: + def build_structured_output(self) -> list[Data]: if not hasattr(self.llm, "with_structured_output"): msg = "Language model does not support structured output." raise TypeError(msg) @@ -125,4 +125,8 @@ def build_structured_output(self) -> Data: else: msg = f"Output should be a Pydantic BaseModel, got {type(output)} ({output})" raise TypeError(msg) - return Data(data=output_dict) + + if self.multiple: + return [Data(data=item) for item in output_dict["objects"]] + else: # noqa: RET505 + return [Data(data=output_dict)] From 2c579a2b9c57dcc20ac26f7e29255fd6c24adb7f Mon Sep 17 00:00:00 2001 From: Andrey Tatarinov Date: Wed, 15 Jan 2025 17:51:35 +0000 Subject: [PATCH 2/3] feat: enhance StructuredOutputComponent with new output methods for list and DataFrame --- .../components/helpers/structured_output.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/components/helpers/structured_output.py b/src/backend/base/langflow/components/helpers/structured_output.py index ee97f750926b..0e54f4ae2eed 100644 --- a/src/backend/base/langflow/components/helpers/structured_output.py +++ b/src/backend/base/langflow/components/helpers/structured_output.py @@ -7,6 +7,7 @@ from langflow.helpers.base_model import build_model_from_schema from langflow.io import BoolInput, HandleInput, MessageTextInput, Output, StrInput, TableInput from langflow.schema.data import Data +from langflow.schema.dataframe import DataFrame if TYPE_CHECKING: from langflow.field_typing.constants import LanguageModel @@ -90,9 +91,11 @@ class StructuredOutputComponent(Component): outputs = [ Output(name="structured_output", display_name="Structured Output", method="build_structured_output"), + Output(name="structured_output_list", display_name="Structured Output List", method="build_structured_output_list"), + Output(name="structured_output_df", display_name="Structured Output DataFrame", method="build_structured_output_df"), ] - def build_structured_output(self) -> list[Data]: + def _build_structured_output(self) -> dict: schema_name = self.schema_name or "OutputModel" if not hasattr(self.llm, "with_structured_output"): @@ -128,7 +131,25 @@ def build_structured_output(self) -> list[Data]: msg = f"Output should be a Pydantic BaseModel, got {type(output)} ({output})" raise TypeError(msg) + return output_dict + + def build_structured_output(self) -> Data: + output_dict = self._build_structured_output() + + return Data(data=output_dict) + + def build_structured_output_list(self) -> list[Data]: + output_dict = self._build_structured_output() + if self.multiple: return [Data(data=item) for item in output_dict["objects"]] else: # noqa: RET505 return [Data(data=output_dict)] + + def build_structured_output_df(self) -> DataFrame: + output_dict = self._build_structured_output() + + if self.multiple: + return DataFrame(data=output_dict["objects"]) + else: # noqa: RET505 + return DataFrame(data=[output_dict]) From 734d4590217d32f76511be7147e8d7fb2a8ad9fd Mon Sep 17 00:00:00 2001 From: Andrey Tatarinov Date: Wed, 15 Jan 2025 17:59:11 +0000 Subject: [PATCH 3/3] apply ruff formatting --- .../base/langflow/components/helpers/structured_output.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/components/helpers/structured_output.py b/src/backend/base/langflow/components/helpers/structured_output.py index 0e54f4ae2eed..66a33fc6bf0d 100644 --- a/src/backend/base/langflow/components/helpers/structured_output.py +++ b/src/backend/base/langflow/components/helpers/structured_output.py @@ -91,8 +91,12 @@ class StructuredOutputComponent(Component): outputs = [ Output(name="structured_output", display_name="Structured Output", method="build_structured_output"), - Output(name="structured_output_list", display_name="Structured Output List", method="build_structured_output_list"), - Output(name="structured_output_df", display_name="Structured Output DataFrame", method="build_structured_output_df"), + Output( + name="structured_output_list", display_name="Structured Output List", method="build_structured_output_list" + ), + Output( + name="structured_output_df", display_name="Structured Output DataFrame", method="build_structured_output_df" + ), ] def _build_structured_output(self) -> dict: