Merge branch 'cz/fix-messages-deleting-error' of https://github.com/langflow-ai/langflow into cz/fix-messages-deleting-error

This commit is contained in:
cristhianzl 2024-06-28 14:26:25 -03:00
commit 5cf24f0ea4
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 from langflow.schema.dotdict import dotdict
class UUIDGeneratorComponent(CustomComponent): class IDGeneratorComponent(CustomComponent):
display_name = "ID Generator" display_name = "ID Generator"
description = "Generates a unique ID." description = "Generates a unique ID."

View file

@ -1,22 +1,47 @@
from langflow.custom import CustomComponent from langflow.custom import Component
from langflow.memory import get_messages, store_message from langflow.inputs import MessageInput, StrInput
from langflow.schema.message import Message 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" display_name = "Store Message"
description = "Stores a chat message." description = "Stores a chat message or text."
icon = "save"
def build_config(self): inputs = [
return { MessageInput(name="message", display_name="Message", info="The chat message to be stored.", required=True),
"message": {"display_name": "Message"}, 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) store_message(message, flow_id=self.graph.flow_id)
self.status = get_messages() stored = get_messages(session_id=message.session_id, sender_name=message.sender_name, sender=message.sender)
self.status = stored
return message return stored

View file

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

View file

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

View file

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