diff --git a/src/backend/base/langflow/components/helpers/MessageHistory.py b/src/backend/base/langflow/components/helpers/MessageHistory.py index 0a1724267..c36fa4e0e 100644 --- a/src/backend/base/langflow/components/helpers/MessageHistory.py +++ b/src/backend/base/langflow/components/helpers/MessageHistory.py @@ -26,6 +26,12 @@ class MessageHistoryComponent(CustomComponent): "info": "Session ID of the chat history.", "input_types": ["Text"], }, + "order": { + "options": ["Ascending", "Descending"], + "display_name": "Order", + "info": "Order of the messages.", + "advanced": True, + }, } def build( @@ -34,7 +40,9 @@ class MessageHistoryComponent(CustomComponent): sender_name: Optional[str] = None, session_id: Optional[str] = None, n_messages: int = 5, + order: Optional[str] = "Descending", ) -> List[Record]: + order = "DESC" if order == "Descending" else "ASC" if sender == "Machine and User": sender = None messages = get_messages( @@ -42,6 +50,7 @@ class MessageHistoryComponent(CustomComponent): sender_name=sender_name, session_id=session_id, limit=n_messages, + order=order, ) self.status = messages return messages diff --git a/src/backend/base/langflow/components/helpers/SplitText.py b/src/backend/base/langflow/components/helpers/SplitText.py new file mode 100644 index 000000000..ad80c4947 --- /dev/null +++ b/src/backend/base/langflow/components/helpers/SplitText.py @@ -0,0 +1,87 @@ +from typing import Optional + +from langchain.text_splitter import ( + RecursiveCharacterTextSplitter, + CharacterTextSplitter, +) +from langchain_core.documents import Document + +from langflow.interface.custom.custom_component import CustomComponent +from langflow.schema import Record +from langflow.field_typing import Text +from langflow.utils.util import build_loader_repr_from_records, unescape_string + + +class SplitTextComponent(CustomComponent): + display_name: str = "Split Text" + description: str = "Split text into chunks of a specified length." + + def build_config(self): + return { + "texts": { + "display_name": "Texts", + "info": "Texts to split.", + "input_types": ["Text"], + }, + "separators": { + "display_name": "Separators", + "info": 'The characters to split on.\nIf left empty defaults to [" "].', + "is_list": True, + }, + "chunk_size": { + "display_name": "Chunk Size", + "info": "The maximum length of each chunk.", + "field_type": "int", + "value": 1000, + }, + "chunk_overlap": { + "display_name": "Chunk Overlap", + "info": "The amount of overlap between chunks.", + "field_type": "int", + "value": 200, + }, + "recursive": { + "display_name": "Recursive", + }, + "code": {"show": False}, + } + + def build( + self, + texts: list[Text], + separators: Optional[list[str]] = [" "], + chunk_size: Optional[int] = 1000, + chunk_overlap: Optional[int] = 200, + recursive: bool = False, + ) -> list[Record]: + + separators = [unescape_string(x) for x in separators] + + # Make sure chunk_size and chunk_overlap are ints + if isinstance(chunk_size, str): + chunk_size = int(chunk_size) + if isinstance(chunk_overlap, str): + chunk_overlap = int(chunk_overlap) + + if recursive: + splitter = RecursiveCharacterTextSplitter( + separators=separators, + chunk_size=chunk_size, + chunk_overlap=chunk_overlap, + ) + + else: + splitter = CharacterTextSplitter( + separator=separators[0], + chunk_size=chunk_size, + chunk_overlap=chunk_overlap, + ) + + documents = [] + for _text in texts: + # documents.append(_input.to_lc_document()) + documents.append(Document(page_content=_text)) + + records = self.to_records(splitter.split_documents(documents)) + self.status = records + return records diff --git a/src/backend/base/langflow/memory.py b/src/backend/base/langflow/memory.py index b0ec04f1c..a1c21f243 100644 --- a/src/backend/base/langflow/memory.py +++ b/src/backend/base/langflow/memory.py @@ -12,6 +12,7 @@ def get_messages( sender_name: Optional[str] = None, session_id: Optional[str] = None, order_by: Optional[str] = "timestamp", + order: Optional[str] = "DESC", limit: Optional[int] = None, ): """ @@ -34,6 +35,7 @@ def get_messages( session_id=session_id, order_by=order_by, limit=limit, + order=order, ) records: list[Record] = [] diff --git a/src/backend/base/langflow/services/monitor/service.py b/src/backend/base/langflow/services/monitor/service.py index ecf710eea..68cf839e5 100644 --- a/src/backend/base/langflow/services/monitor/service.py +++ b/src/backend/base/langflow/services/monitor/service.py @@ -113,6 +113,7 @@ class MonitorService(Service): sender_name: Optional[str] = None, session_id: Optional[str] = None, order_by: Optional[str] = "timestamp", + order: Optional[str] = "DESC", limit: Optional[int] = None, ): query = "SELECT sender_name, sender, session_id, message, artifacts, timestamp FROM messages" @@ -128,7 +129,8 @@ class MonitorService(Service): query += " WHERE " + " AND ".join(conditions) if order_by: - query += f" ORDER BY {order_by}" + # Make sure the order is from newest to oldest + query += f" ORDER BY {order_by} {order.upper()}" if limit is not None: query += f" LIMIT {limit}" diff --git a/src/backend/base/langflow/services/monitor/utils.py b/src/backend/base/langflow/services/monitor/utils.py index 1febdd589..a71653e82 100644 --- a/src/backend/base/langflow/services/monitor/utils.py +++ b/src/backend/base/langflow/services/monitor/utils.py @@ -86,7 +86,7 @@ def add_row_to_table( validated_data = model(**monitor_data) # Extract data for the insert statement - validated_dict = validated_data.model_dump(exclude_unset=True) + validated_dict = validated_data.model_dump() keys = [key for key in validated_dict.keys() if key != INDEX_KEY] columns = ", ".join(keys) diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index f2d3a1886..347bbbb20 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -402,9 +402,7 @@ export default function ParameterComponent({ {title} )} - + {required ? "*" : ""}
diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index a31147128..38f6ecb91 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -106,13 +106,7 @@ export default function IOModal({ return ( )} - {haveChat || selectedViewField ? ( -
- {selectedViewField && ( -
-
- - { - nodes.find((node) => node.id === selectedViewField.id) - ?.data.node.display_name - } -
-
- {inputs.some( - (input) => input.id === selectedViewField.id - ) ? ( - - ) : ( - - )} -
-
- )} +
+ {selectedViewField && (
+
+ + { + nodes.find((node) => node.id === selectedViewField.id) + ?.data.node.display_name + } +
+
+ {inputs.some( + (input) => input.id === selectedViewField.id + ) ? ( + + ) : ( + + )} +
+
+ )} +
+ {haveChat ? ( -
+ ) : ( + + Select an IO component to view + + )}
- ) : ( -
- )} +