Updates PassMessage and StoreMessage components (#2379)

- Changed base class from CustomComponent to Component
- Added multiple input fields: message, sender, sender_name, session_id
- Included output field for stored messages
- Improved logic to handle both string and Message types
- Enhanced error handling and validation for message storage
This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-06-28 14:13:55 +00:00 committed by GitHub
commit 2b2fca46b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 108 additions and 55 deletions

View file

@ -0,0 +1,28 @@
from langflow.custom import Component
from langflow.inputs import StrInput
from langflow.schema import Data
from langflow.template import Output
class CreateListComponent(Component):
display_name = "Create List"
description = "Creates a list of texts."
icon = "list"
inputs = [
StrInput(
name="texts",
display_name="Texts",
info="Enter one or more texts.",
is_list=True,
),
]
outputs = [
Output(display_name="Data List", name="list", method="create_list"),
]
def create_list(self) -> list[Data]:
data = [Data(text=text) for text in self.texts]
self.status = data
return data

View file

@ -5,7 +5,7 @@ from langflow.custom import CustomComponent
from langflow.schema.dotdict import dotdict
class UUIDGeneratorComponent(CustomComponent):
class IDGeneratorComponent(CustomComponent):
display_name = "ID Generator"
description = "Generates a unique ID."

View file

@ -1,22 +1,47 @@
from langflow.custom import CustomComponent
from langflow.memory import get_messages, store_message
from langflow.custom import Component
from langflow.inputs import MessageInput, StrInput
from langflow.schema.message import Message
from langflow.template import Output
from langflow.memory import get_messages, store_message
class StoreMessageComponent(CustomComponent):
class StoreMessageComponent(Component):
display_name = "Store Message"
description = "Stores a chat message."
description = "Stores a chat message or text."
icon = "save"
def build_config(self):
return {
"message": {"display_name": "Message"},
}
inputs = [
MessageInput(name="message", display_name="Message", info="The chat message to be stored.", required=True),
StrInput(
name="sender",
display_name="Sender",
info="The sender of the message.",
value="AI",
advanced=True,
),
StrInput(
name="sender_name", display_name="Sender Name", info="The name of the sender.", value="AI", advanced=True
),
StrInput(
name="session_id",
display_name="Session ID",
info="The session ID of the chat.",
value="",
),
]
outputs = [
Output(display_name="Stored Messages", name="stored_messages", method="store_message"),
]
def store_message(self) -> Message:
message = self.message
message.session_id = self.session_id or message.session_id
message.sender = self.sender or message.sender
message.sender_name = self.sender_name or message.sender_name
def build(
self,
message: Message,
) -> Message:
store_message(message, flow_id=self.graph.flow_id)
self.status = get_messages()
return message
stored = get_messages(session_id=message.session_id, sender_name=message.sender_name, sender=message.sender)
self.status = stored
return stored

View file

@ -1,22 +1,25 @@
from .CombineText import CombineTextComponent
from .CustomComponent import CustomComponent
from .FilterData import FilterDataComponent
from .IDGenerator import UUIDGeneratorComponent
from .IDGenerator import IDGeneratorComponent
from .Memory import MemoryComponent
from .MergeData import MergeDataComponent
from .ParseData import ParseDataComponent
from .SplitText import SplitTextComponent
from .StoreMessage import StoreMessageComponent
from .CreateList import CreateListComponent
__all__ = [
"CreateListComponent",
"CombineTextComponent",
"CustomComponent",
"FilterDataComponent",
"UUIDGeneratorComponent",
"IDGeneratorComponent",
"MemoryComponent",
"MergeDataComponent",
"ParseDataComponent",
"SplitTextComponent",
"StoreMessageComponent",
"ListComponent",
]

View file

@ -66,21 +66,17 @@ class ConditionalRouterComponent(Component):
def true_response(self) -> Message:
result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive)
if result:
self.stop("false_result")
response = self.message if self.message else self.input_text
self.status = response
return response
self.status = self.message
return self.message
else:
self.stop("true_result")
return Message()
return None
def false_response(self) -> Message:
result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive)
if not result:
self.stop("true_result")
response = self.message if self.message else self.input_text
self.status = response
return response
self.status = self.message
return self.message
else:
self.stop("false_result")
return Message()
return None

View file

@ -1,31 +1,32 @@
from typing import Union
from langflow.custom import CustomComponent
from langflow.field_typing import Text
from langflow.schema import Data
from langflow.custom import Component
from langflow.io import MessageInput
from langflow.schema.message import Message
from langflow.template import Output
class PassComponent(CustomComponent):
class PassMessageComponent(Component):
display_name = "Pass"
description = "A pass-through component that forwards the second input while ignoring the first, used for controlling workflow direction."
field_order = ["ignored_input", "forwarded_input"]
beta = True
description = "Forwards the input message, unchanged."
icon = "arrow-right"
def build_config(self) -> dict:
return {
"ignored_input": {
"display_name": "Ignored Input",
"info": "This input is ignored. It's used to control the flow in the graph.",
"input_types": ["Text", "Data"],
},
"forwarded_input": {
"display_name": "Input",
"info": "This input is forwarded by the component.",
"input_types": ["Text", "Data"],
},
}
inputs = [
MessageInput(
name="input_message",
display_name="Input Message",
info="The message to be passed forward.",
),
MessageInput(
name="ignored_message",
display_name="Ignored Message",
info="A second message to be ignored. Used as a workaround for continuity.",
advanced=True,
),
]
def build(self, ignored_input: Text, forwarded_input: Text) -> Union[Text, Data]:
# The ignored_input is not used in the logic, it's just there for graph flow control
self.status = forwarded_input
return forwarded_input
outputs = [
Output(display_name="Output Message", name="output_message", method="pass_message"),
]
def pass_message(self) -> Message:
self.status = self.input_message
return self.input_message

View file

@ -31,7 +31,7 @@ from langflow.schema import Data
def test_uuid_generator_component():
# Arrange
uuid_generator_component = helpers.UUIDGeneratorComponent()
uuid_generator_component = helpers.IDGeneratorComponent()
uuid_generator_component.code = open(helpers.IDGenerator.__file__, "r").read()
frontend_node, _ = build_custom_component_template(uuid_generator_component)