From a5bd766626aa5f7a64cc5d3c25f75e3a04be9be4 Mon Sep 17 00:00:00 2001 From: Jordan Frazier <122494242+jordanrfrazier@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:05:35 -0700 Subject: [PATCH] ref: refactor csv output parser to dynamic single component (#3963) * refactor csv output parser to dynamic single component * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .../output_parsers/CSVOutputParser.py | 31 ------------- .../components/output_parsers/OutputParser.py | 44 +++++++++++++++++++ .../components/output_parsers/__init__.py | 4 +- ...output_parser.py => test_output_parser.py} | 6 +-- 4 files changed, 49 insertions(+), 36 deletions(-) delete mode 100644 src/backend/base/langflow/components/output_parsers/CSVOutputParser.py create mode 100644 src/backend/base/langflow/components/output_parsers/OutputParser.py rename src/backend/tests/integration/components/output_parsers/{test_csv_output_parser.py => test_output_parser.py} (87%) diff --git a/src/backend/base/langflow/components/output_parsers/CSVOutputParser.py b/src/backend/base/langflow/components/output_parsers/CSVOutputParser.py deleted file mode 100644 index 3652342a3..000000000 --- a/src/backend/base/langflow/components/output_parsers/CSVOutputParser.py +++ /dev/null @@ -1,31 +0,0 @@ -from langchain_core.output_parsers import CommaSeparatedListOutputParser - -from langflow.custom.custom_component.component import Component -from langflow.field_typing.constants import OutputParser -from langflow.io import Output -from langflow.schema.message import Message - - -class CSVOutputParserComponent(Component): - display_name = "CSV Output Parser" - description = "Use with an LLM to return a comma separated list." - icon = "type" - name = "CSVOutputParser" - - inputs = [] # no inputs necessary - - outputs = [ - Output( - display_name="Format Instructions", - name="format_instructions", - info="Pass to a prompt template to include formatting instructions for LLM responses.", - method="format_instructions", - ), - Output(display_name="Output Parser", name="output_parser", method="build_parser"), - ] - - def build_parser(self) -> OutputParser: - return CommaSeparatedListOutputParser() - - def format_instructions(self) -> Message: - return Message(text=CommaSeparatedListOutputParser().get_format_instructions()) diff --git a/src/backend/base/langflow/components/output_parsers/OutputParser.py b/src/backend/base/langflow/components/output_parsers/OutputParser.py new file mode 100644 index 000000000..ce32700a0 --- /dev/null +++ b/src/backend/base/langflow/components/output_parsers/OutputParser.py @@ -0,0 +1,44 @@ +from langchain_core.output_parsers import CommaSeparatedListOutputParser + +from langflow.custom.custom_component.component import Component +from langflow.field_typing.constants import OutputParser +from langflow.io import DropdownInput, Output +from langflow.schema.message import Message + + +class OutputParserComponent(Component): + display_name = "Output Parser" + description = "Transforms the output of an LLM into a specified format." + icon = "type" + name = "OutputParser" + + inputs = [ + DropdownInput( + name="parser_type", + display_name="Parser", + options=["CSV"], + value="CSV", + ), + ] + + outputs = [ + Output( + display_name="Format Instructions", + name="format_instructions", + info="Pass to a prompt template to include formatting instructions for LLM responses.", + method="format_instructions", + ), + Output(display_name="Output Parser", name="output_parser", method="build_parser"), + ] + + def build_parser(self) -> OutputParser: + if self.parser_type == "CSV": + return CommaSeparatedListOutputParser() + else: + raise ValueError("Unsupported or missing parser") + + def format_instructions(self) -> Message: + if self.parser_type == "CSV": + return Message(text=CommaSeparatedListOutputParser().get_format_instructions()) + else: + raise ValueError("Unsupported or missing parser") diff --git a/src/backend/base/langflow/components/output_parsers/__init__.py b/src/backend/base/langflow/components/output_parsers/__init__.py index a06d332c7..9af69c443 100644 --- a/src/backend/base/langflow/components/output_parsers/__init__.py +++ b/src/backend/base/langflow/components/output_parsers/__init__.py @@ -1,3 +1,3 @@ -from .CSVOutputParser import CSVOutputParserComponent +from .OutputParser import OutputParserComponent -__all__ = ["CSVOutputParserComponent"] +__all__ = ["OutputParserComponent"] diff --git a/src/backend/tests/integration/components/output_parsers/test_csv_output_parser.py b/src/backend/tests/integration/components/output_parsers/test_output_parser.py similarity index 87% rename from src/backend/tests/integration/components/output_parsers/test_csv_output_parser.py rename to src/backend/tests/integration/components/output_parsers/test_output_parser.py index fc03578a8..c4668ef22 100644 --- a/src/backend/tests/integration/components/output_parsers/test_csv_output_parser.py +++ b/src/backend/tests/integration/components/output_parsers/test_output_parser.py @@ -2,7 +2,7 @@ import os import pytest from langflow.components.models.OpenAIModel import OpenAIModelComponent -from langflow.components.output_parsers.CSVOutputParser import CSVOutputParserComponent +from langflow.components.output_parsers.OutputParser import OutputParserComponent from langflow.components.prompts.Prompt import PromptComponent from tests.integration.utils import ComponentInputHandle, run_single_component @@ -11,12 +11,12 @@ from tests.integration.utils import ComponentInputHandle, run_single_component @pytest.mark.api_key_required async def test_csv_output_parser_openai(): format_instructions = ComponentInputHandle( - clazz=CSVOutputParserComponent, + clazz=OutputParserComponent, inputs={}, output_name="format_instructions", ) output_parser_handle = ComponentInputHandle( - clazz=CSVOutputParserComponent, + clazz=OutputParserComponent, inputs={}, output_name="output_parser", )