diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index 0c0001a08..6ca9aa67d 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -62,4 +62,6 @@ jobs: context: . push: true file: ./build_and_push.Dockerfile - tags: logspace/langflow:${{ steps.check-version.outputs.version }} + tags: | + logspace/langflow:${{ steps.check-version.outputs.version }} + logspace/langflow:latest-dev diff --git a/src/backend/base/langflow/base/io/chat.py b/src/backend/base/langflow/base/io/chat.py index 2f56a0b7a..f8ac48fb1 100644 --- a/src/backend/base/langflow/base/io/chat.py +++ b/src/backend/base/langflow/base/io/chat.py @@ -2,6 +2,7 @@ import warnings from typing import Optional, Union from langflow.field_typing import Text +from langflow.helpers.record import records_to_text from langflow.interface.custom.custom_component import CustomComponent from langflow.memory import add_messages from langflow.schema import Record @@ -34,6 +35,12 @@ class ChatComponent(CustomComponent): "info": "Return the message as a record containing the sender, sender_name, and session_id.", "advanced": True, }, + "record_template": { + "display_name": "Record Template", + "multiline": True, + "info": "In case of Message being a Record, this template will be used to convert it to text.", + "advanced": True, + }, } def store_message( @@ -76,9 +83,10 @@ class ChatComponent(CustomComponent): self, sender: Optional[str] = "User", sender_name: Optional[str] = "User", - input_value: Optional[str] = None, + input_value: Optional[Union[str, Record]] = None, session_id: Optional[str] = None, return_record: Optional[bool] = False, + record_template: Optional[str] = "Text: {text}\nData: {data}", ) -> Union[Text, Record]: input_value_record: Optional[Record] = None if return_record: @@ -96,6 +104,8 @@ class ChatComponent(CustomComponent): "session_id": session_id, }, ) + elif isinstance(input_value, Record): + input_value = records_to_text(template=record_template, records=input_value) if not input_value: input_value = "" if return_record and input_value_record: diff --git a/src/backend/base/langflow/base/io/text.py b/src/backend/base/langflow/base/io/text.py index 919acf5d5..5b1a6678b 100644 --- a/src/backend/base/langflow/base/io/text.py +++ b/src/backend/base/langflow/base/io/text.py @@ -1,18 +1,28 @@ -from typing import Optional +from typing import Optional, Union from langflow.field_typing import Text +from langflow.helpers.record import records_to_text from langflow.interface.custom.custom_component import CustomComponent +from langflow.schema.schema import Record class TextComponent(CustomComponent): display_name = "Text Component" description = "Used to pass text to the next component." - field_config = { - "input_value": {"display_name": "Value", "multiline": True}, - } + def build_config(self): + return { + "input_value": {"display_name": "Value", "input_types": ["Record"], "info": "Text or Record to be passed."}, + "record_template": {"display_name": "Record Template", "multiline": True}, + } - def build(self, input_value: Optional[str] = "") -> Text: + def build( + self, + input_value: Optional[Union[Text, Record]] = "", + record_template: Optional[str] = "Text: {text}\nData: {data}", + ) -> Text: + if isinstance(input_value, Record): + input_value = records_to_text(template=record_template, records=input_value) self.status = input_value if not input_value: input_value = "" diff --git a/src/backend/base/langflow/components/inputs/TextInput.py b/src/backend/base/langflow/components/inputs/TextInput.py index d804d1cf2..6535ba447 100644 --- a/src/backend/base/langflow/components/inputs/TextInput.py +++ b/src/backend/base/langflow/components/inputs/TextInput.py @@ -6,7 +6,21 @@ from langflow.field_typing import Text class TextInput(TextComponent): display_name = "Text Input" - description = "Capture and send text inputs." + description = "Capture Text or Record and send text inputs." - def build(self, input_value: Optional[str] = "") -> Text: - return super().build(input_value=input_value) + def build_config(self): + return { + "input_value": { + "display_name": "Value", + "input_types": ["Record"], + "info": "Text or Record to be passed as input.", + }, + "record_template": {"display_name": "Record Template", "multiline": True}, + } + + def build( + self, + input_value: Optional[str] = "", + record_template: Optional[str] = "{text}", + ) -> Text: + return super().build(input_value=input_value, record_template=record_template) diff --git a/src/backend/base/langflow/components/outputs/ChatOutput.py b/src/backend/base/langflow/components/outputs/ChatOutput.py index 24c850f80..8c1f3de77 100644 --- a/src/backend/base/langflow/components/outputs/ChatOutput.py +++ b/src/backend/base/langflow/components/outputs/ChatOutput.py @@ -17,6 +17,7 @@ class ChatOutput(ChatComponent): input_value: Optional[str] = None, session_id: Optional[str] = None, return_record: Optional[bool] = False, + record_template: Optional[str] = "{text}", ) -> Union[Text, Record]: return super().build( sender=sender, @@ -24,4 +25,5 @@ class ChatOutput(ChatComponent): input_value=input_value, session_id=session_id, return_record=return_record, + record_template=record_template, ) diff --git a/src/backend/base/langflow/components/outputs/TextOutput.py b/src/backend/base/langflow/components/outputs/TextOutput.py index 099c89b64..7dfd04fa2 100644 --- a/src/backend/base/langflow/components/outputs/TextOutput.py +++ b/src/backend/base/langflow/components/outputs/TextOutput.py @@ -8,9 +8,15 @@ class TextOutput(TextComponent): display_name = "Text Output" description = "Used to send a text output." - field_config = { - "input_value": {"display_name": "Value"}, - } + def build_config(self): + return { + "input_value": { + "display_name": "Value", + "input_types": ["Record"], + "info": "Text or Record to be passed as output.", + }, + "record_template": {"display_name": "Record Template", "multiline": True}, + } - def build(self, input_value: Optional[Text] = "") -> Text: - return super().build(input_value=input_value) + def build(self, input_value: Optional[Text] = "", record_template: str = "{text}") -> Text: + return super().build(input_value=input_value, record_template=record_template) diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index 5a64e0b3f..9e8e7a03b 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -5,7 +5,6 @@ import ShadTooltip from "../../../../components/ShadTooltipComponent"; import IconComponent from "../../../../components/genericIconComponent"; import { Input } from "../../../../components/ui/input"; import { Separator } from "../../../../components/ui/separator"; -import { PRIORITY_SIDEBAR_ORDER } from "../../../../constants/constants"; import ExportModal from "../../../../modals/exportModal"; import ShareModal from "../../../../modals/shareModal"; import useAlertStore from "../../../../stores/alertStore"; @@ -282,32 +281,7 @@ export default function ExtraSidebar(): JSX.Element { )} - {index === PRIORITY_SIDEBAR_ORDER.length - 2 && ( - <> - -
- {/* BUG ON THIS ICON */} - - - Discover More - -
-
-
- -
-
-
- - )} + {index === Object.keys(dataFilter).length - 1 && ( + <> + +
+ {/* BUG ON THIS ICON */} + + + + Discover More + +
+
+
+ +
+
+
+ + )} ) : (