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: