Add experimental components for message history, record extraction, and record merging
This commit is contained in:
parent
14aaf6559b
commit
f8dfb69f08
5 changed files with 0 additions and 51 deletions
|
|
@ -0,0 +1,24 @@
|
|||
from langflow import CustomComponent
|
||||
from langflow.memory import delete_messages, get_messages
|
||||
|
||||
|
||||
class ClearMessageHistoryComponent(CustomComponent):
|
||||
display_name = "Clear Message History"
|
||||
description = "A component to clear the message history."
|
||||
|
||||
def build_config(self):
|
||||
return {
|
||||
"session_id": {
|
||||
"display_name": "Session ID",
|
||||
"info": "The session ID to clear the message history.",
|
||||
}
|
||||
}
|
||||
|
||||
def build(
|
||||
self,
|
||||
session_id: str,
|
||||
) -> None:
|
||||
delete_messages(session_id=session_id)
|
||||
records = get_messages(session_id=session_id)
|
||||
self.records = records
|
||||
return records
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
from langflow import CustomComponent
|
||||
from langflow.schema import Record
|
||||
|
||||
|
||||
class ExtractKeyFromRecordComponent(CustomComponent):
|
||||
display_name = "Extract Key From Record"
|
||||
description = "Extracts a key from a record."
|
||||
|
||||
field_config = {
|
||||
"record": {"display_name": "Record"},
|
||||
}
|
||||
|
||||
def build(self, record: Record, key: str, silent_error: bool = True) -> dict:
|
||||
data = getattr(record, key)
|
||||
self.status = data
|
||||
return data
|
||||
25
src/backend/langflow/components/experimental/MergeRecords.py
Normal file
25
src/backend/langflow/components/experimental/MergeRecords.py
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
from langflow import CustomComponent
|
||||
from langflow.schema import Record
|
||||
|
||||
|
||||
class MergeRecordsComponent(CustomComponent):
|
||||
display_name = "Merge Records"
|
||||
description = "Merges records."
|
||||
|
||||
field_config = {
|
||||
"records": {"display_name": "Records"},
|
||||
}
|
||||
|
||||
def build(self, records: list[Record]) -> Record:
|
||||
if not records:
|
||||
return records
|
||||
if len(records) == 1:
|
||||
return records[0]
|
||||
merged_record = None
|
||||
for record in records:
|
||||
if merged_record is None:
|
||||
merged_record = record
|
||||
else:
|
||||
merged_record += record
|
||||
self.status = merged_record
|
||||
return merged_record
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
from typing import List, Optional
|
||||
|
||||
from langflow import CustomComponent
|
||||
from langflow.memory import get_messages
|
||||
from langflow.schema import Record
|
||||
|
||||
|
||||
class MessageHistoryComponent(CustomComponent):
|
||||
display_name = "Message History"
|
||||
description = "Used to retrieve stored messages."
|
||||
|
||||
def build_config(self):
|
||||
return {
|
||||
"sender": {
|
||||
"options": ["Machine", "User", "Machine and User"],
|
||||
"display_name": "Sender Type",
|
||||
},
|
||||
"sender_name": {"display_name": "Sender Name"},
|
||||
"n_messages": {
|
||||
"display_name": "Number of Messages",
|
||||
"info": "Number of messages to retrieve.",
|
||||
},
|
||||
"session_id": {
|
||||
"display_name": "Session ID",
|
||||
"info": "Session ID of the chat history.",
|
||||
"input_types": ["Text"],
|
||||
},
|
||||
}
|
||||
|
||||
def build(
|
||||
self,
|
||||
sender: Optional[str] = None,
|
||||
sender_name: Optional[str] = None,
|
||||
session_id: Optional[str] = None,
|
||||
n_messages: int = 5,
|
||||
) -> List[Record]:
|
||||
if sender == "Machine and User":
|
||||
sender = None
|
||||
messages = get_messages(
|
||||
sender=sender,
|
||||
sender_name=sender_name,
|
||||
session_id=session_id,
|
||||
limit=n_messages,
|
||||
)
|
||||
self.status = messages
|
||||
return messages
|
||||
|
|
@ -1,51 +0,0 @@
|
|||
from typing import Any, List
|
||||
|
||||
from langflow import CustomComponent
|
||||
from langflow.schema import Record
|
||||
from langflow.template.field.base import TemplateField
|
||||
|
||||
|
||||
class RecordComponent2(CustomComponent):
|
||||
display_name = "Record Text"
|
||||
description = "A component to create a record from key-value pairs."
|
||||
field_order = ["keys"]
|
||||
|
||||
def update_build_config(self, build_config: dict, field_name: str, field_value: Any):
|
||||
if field_value is None:
|
||||
field_value = []
|
||||
if field_name is None:
|
||||
return build_config
|
||||
elif len(field_value) == 0:
|
||||
keep = ["keys", "code"]
|
||||
for key in build_config.copy():
|
||||
if key in keep:
|
||||
continue
|
||||
del build_config[key]
|
||||
build_config[field_name]["value"] = field_value
|
||||
|
||||
# Add new fields depending on the field value
|
||||
for val in field_value:
|
||||
if not isinstance(val, str) or val == "":
|
||||
continue
|
||||
field = TemplateField(
|
||||
name=val,
|
||||
field_type="str",
|
||||
display_name="",
|
||||
info="The key for the record.",
|
||||
)
|
||||
build_config[field.name] = field.to_dict()
|
||||
|
||||
def build_config(self):
|
||||
return {
|
||||
"keys": {
|
||||
"display_name": "Keys",
|
||||
"refresh": True,
|
||||
"info": "The number of keys to create in the record.",
|
||||
"input_types": [],
|
||||
},
|
||||
}
|
||||
|
||||
def build(self, keys: List[str], **kwargs) -> Record:
|
||||
record = Record(data=kwargs)
|
||||
self.status = record
|
||||
return record
|
||||
Loading…
Reference in a new issue