Another batch of renaming Record to Data

This commit is contained in:
ogabrielluiz 2024-06-12 18:18:03 -03:00
commit 16089ea5b2
61 changed files with 283 additions and 441 deletions

View file

@ -82,7 +82,7 @@ def retrieve_file_paths(
# ! Removing unstructured dependency until
# ! 3.12 is supported
# def partition_file_to_record(file_path: str, silent_errors: bool) -> Optional[Data]:
# def partition_file_to_data(file_path: str, silent_errors: bool) -> Optional[Data]:
# # Use the partition function to load the file
# from unstructured.partition.auto import partition # type: ignore
@ -129,7 +129,7 @@ def parse_pdf_to_text(file_path: str) -> str:
return "\n\n".join([page.extract_text() for page in reader.pages])
def parse_text_file_to_record(file_path: str, silent_errors: bool) -> Optional[Data]:
def parse_text_file_to_data(file_path: str, silent_errors: bool) -> Optional[Data]:
try:
if file_path.endswith(".pdf"):
text = parse_pdf_to_text(file_path)
@ -171,7 +171,7 @@ def parse_text_file_to_record(file_path: str, silent_errors: bool) -> Optional[D
# if use_multithreading:
# data = parallel_load_data(file_paths, silent_errors, max_concurrency)
# else:
# data = [partition_file_to_record(file_path, silent_errors) for file_path in file_paths]
# data = [partition_file_to_data(file_path, silent_errors) for file_path in file_paths]
# data = list(filter(None, data))
# return data
@ -180,7 +180,7 @@ def parallel_load_data(
file_paths: List[str],
silent_errors: bool,
max_concurrency: int,
load_function: Callable = parse_text_file_to_record,
load_function: Callable = parse_text_file_to_data,
) -> List[Optional[Data]]:
with futures.ThreadPoolExecutor(max_workers=max_concurrency) as executor:
loaded_files = executor.map(

View file

@ -34,7 +34,7 @@ class ChatComponent(Component):
"info": "Return the message as a Message containing the sender, sender_name, and session_id.",
"advanced": True,
},
"record_template": {
"data_template": {
"display_name": "Data Template",
"multiline": True,
"info": "In case of Message being a Data, this template will be used to convert it to text.",
@ -61,7 +61,7 @@ class ChatComponent(Component):
self.status = messages
return messages
def build_with_record(
def build_with_data(
self,
sender: Optional[str] = "User",
sender_name: Optional[str] = "User",
@ -74,7 +74,7 @@ class ChatComponent(Component):
if isinstance(input_value, Data):
# Update the data of the record
message = Message.from_record(input_value)
message = Message.from_data(input_value)
else:
message = Message(
text=input_value, sender=sender, sender_name=sender_name, files=files, session_id=session_id

View file

@ -2,7 +2,7 @@ from typing import Optional
from langflow.custom import Component
from langflow.field_typing import Text
from langflow.helpers.record import data_to_text
from langflow.helpers.data import data_to_text
from langflow.schema import Data
@ -17,7 +17,7 @@ class TextComponent(Component):
"input_types": ["Text", "Data"],
"info": "Text or Data to be passed.",
},
"record_template": {
"data_template": {
"display_name": "Data Template",
"multiline": True,
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
@ -28,14 +28,14 @@ class TextComponent(Component):
def build(
self,
input_value: Optional[Text] = "",
record_template: Optional[str] = "{text}",
data_template: Optional[str] = "{text}",
) -> Text:
if isinstance(input_value, Data):
if record_template == "":
if data_template == "":
# it should be dynamically set to the Data's .text_key value
# meaning, if text_key = "bacon", then record_template = "{bacon}"
record_template = "{" + input_value.text_key + "}"
input_value = data_to_text(template=record_template, data=input_value)
# meaning, if text_key = "bacon", then data_template = "{bacon}"
data_template = "{" + input_value.text_key + "}"
input_value = data_to_text(template=data_template, data=input_value)
self.status = input_value
if not input_value:
input_value = ""

View file

@ -32,7 +32,7 @@ class BaseMemoryComponent(CustomComponent):
"info": "Order of the messages.",
"advanced": True,
},
"record_template": {
"data_template": {
"display_name": "Data Template",
"multiline": True,
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",

View file

@ -6,7 +6,7 @@ from langflow.schema import Data
from langflow.schema.message import Message
def record_to_string(record: Data) -> str:
def data_to_string(record: Data) -> str:
"""
Convert a record to a string.
@ -38,13 +38,13 @@ def dict_values_to_string(d: dict) -> dict:
if isinstance(item, Message):
d_copy[key][i] = item.text
elif isinstance(item, Data):
d_copy[key][i] = record_to_string(item)
d_copy[key][i] = data_to_string(item)
elif isinstance(item, Document):
d_copy[key][i] = document_to_string(item)
elif isinstance(value, Message):
d_copy[key] = value.text
elif isinstance(value, Data):
d_copy[key] = record_to_string(value)
d_copy[key] = data_to_string(value)
elif isinstance(value, Document):
d_copy[key] = document_to_string(value)
return d_copy

View file

@ -13,12 +13,12 @@ def chroma_collection_to_data(collection_dict: dict):
"""
data = []
for i, doc in enumerate(collection_dict["documents"]):
record_dict = {
data_dict = {
"id": collection_dict["ids"][i],
"text": doc,
}
if "metadatas" in collection_dict:
for key, value in collection_dict["metadatas"][i].items():
record_dict[key] = value
data.append(Data(**record_dict))
data_dict[key] = value
data.append(Data(**data_dict))
return data

View file

@ -1,6 +1,6 @@
from typing import Any, Dict, List, Optional
from langflow.base.data.utils import parallel_load_data, parse_text_file_to_record, retrieve_file_paths
from langflow.base.data.utils import parallel_load_data, parse_text_file_to_data, retrieve_file_paths
from langflow.custom import CustomComponent
from langflow.schema import Data
@ -57,7 +57,7 @@ class DirectoryComponent(CustomComponent):
if use_multithreading:
loaded_data = parallel_load_data(file_paths, silent_errors, max_concurrency)
else:
loaded_data = [parse_text_file_to_record(file_path, silent_errors) for file_path in file_paths]
loaded_data = [parse_text_file_to_data(file_path, silent_errors) for file_path in file_paths]
loaded_data = list(filter(None, loaded_data))
self.status = loaded_data
return loaded_data

View file

@ -1,7 +1,7 @@
from pathlib import Path
from typing import Any, Dict
from langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_record
from langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data
from langflow.custom import CustomComponent
from langflow.schema import Data
@ -34,7 +34,7 @@ class FileComponent(CustomComponent):
raise ValueError("doc files are not supported. Please save as .docx")
if extension not in TEXT_FILE_TYPES:
raise ValueError(f"Unsupported file type: {extension}")
record = parse_text_file_to_record(resolved_path, silent_errors)
record = parse_text_file_to_data(resolved_path, silent_errors)
self.status = record if record else "No data"
return record or Data()

View file

@ -2,16 +2,16 @@ from langflow.custom import CustomComponent
from langflow.schema import Data
class ExtractKeyFromRecordComponent(CustomComponent):
class ExtractKeyFromdataComponent(CustomComponent):
display_name = "Extract Key From Data"
description = "Extracts a key from a record."
description = "Extracts a key from a data."
beta: bool = True
field_config = {
"record": {"display_name": "Data"},
"data": {"display_name": "Data"},
"keys": {
"display_name": "Keys",
"info": "The keys to extract from the record.",
"info": "The keys to extract from the data.",
"input_types": [],
},
"silent_error": {
@ -21,13 +21,13 @@ class ExtractKeyFromRecordComponent(CustomComponent):
},
}
def build(self, record: Data, keys: list[str], silent_error: bool = True) -> Data:
def build(self, data: Data, keys: list[str], silent_error: bool = True) -> Data:
"""
Extracts the keys from a record.
Extracts the keys from a data.
Args:
record (Data): The record from which to extract the keys.
keys (list[str]): The keys to extract from the record.
data (Data): The data from which to extract the keys.
keys (list[str]): The keys to extract from the data.
silent_error (bool): If True, errors will not be raised.
Returns:
@ -36,10 +36,10 @@ class ExtractKeyFromRecordComponent(CustomComponent):
extracted_keys = {}
for key in keys:
try:
extracted_keys[key] = getattr(record, key)
extracted_keys[key] = getattr(data, key)
except AttributeError:
if not silent_error:
raise KeyError(f"The key '{key}' does not exist in the record.")
return_record = Data(data=extracted_keys)
self.status = return_record
return return_record
raise KeyError(f"The key '{key}' does not exist in the data.")
return_data = Data(data=extracted_keys)
self.status = return_data
return return_data

View file

@ -18,7 +18,7 @@ class FlowToolComponent(CustomComponent):
def get_flow_names(self) -> List[str]:
flow_data = self.list_flows()
return [flow_record.data["name"] for flow_record in flow_data]
return [flow_data.data["name"] for flow_data in flow_data]
def get_flow(self, flow_name: str) -> Optional[Data]:
"""
@ -31,9 +31,9 @@ class FlowToolComponent(CustomComponent):
Optional[Text]: The flow record if found, None otherwise.
"""
flow_data = self.list_flows()
for flow_record in flow_data:
if flow_record.data["name"] == flow_name:
return flow_record
for flow_data in flow_data:
if flow_data.data["name"] == flow_name:
return flow_data
return None
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
@ -69,10 +69,10 @@ class FlowToolComponent(CustomComponent):
async def build(self, flow_name: str, name: str, description: str, return_direct: bool = False) -> Tool:
FlowTool.update_forward_refs()
flow_record = self.get_flow(flow_name)
if not flow_record:
flow_data = self.get_flow(flow_name)
if not flow_data:
raise ValueError("Flow not found.")
graph = Graph.from_payload(flow_record.data["data"])
graph = Graph.from_payload(flow_data.data["data"])
inputs = get_flow_inputs(graph)
tool = FlowTool(
name=name,
@ -80,7 +80,7 @@ class FlowToolComponent(CustomComponent):
graph=graph,
return_direct=return_direct,
inputs=inputs,
flow_id=str(flow_record.id),
flow_id=str(flow_data.id),
user_id=str(self._user_id),
)
description_repr = repr(tool.description).strip("'")

View file

@ -2,13 +2,13 @@ from langflow.custom import CustomComponent
from langflow.schema import Data
class MergeRecordsComponent(CustomComponent):
display_name = "Merge Records"
class MergeDataComponent(CustomComponent):
display_name = "Merge Data"
description = "Merges data."
beta: bool = True
field_config = {
"data": {"display_name": "Records"},
"data": {"display_name": "Data"},
}
def build(self, data: list[Data]) -> Data:
@ -16,14 +16,14 @@ class MergeRecordsComponent(CustomComponent):
return Data()
if len(data) == 1:
return data[0]
merged_record = Data()
merged_data = Data()
for value in data:
if merged_record is None:
merged_record = value
if merged_data is None:
merged_data = value
else:
merged_record += value
self.status = merged_record
return merged_record
merged_data += value
self.status = merged_data
return merged_data
if __name__ == "__main__":
@ -31,6 +31,6 @@ if __name__ == "__main__":
Data(data={"key1": "value1"}),
Data(data={"key2": "value2"}),
]
component = MergeRecordsComponent()
component = MergeDataComponent()
result = component.build(data)
print(result)

View file

@ -13,29 +13,29 @@ class NotifyComponent(CustomComponent):
def build_config(self):
return {
"name": {"display_name": "Name", "info": "The name of the notification."},
"record": {"display_name": "Data", "info": "The record to store."},
"data": {"display_name": "Data", "info": "The data to store."},
"append": {
"display_name": "Append",
"info": "If True, the record will be appended to the notification.",
},
}
def build(self, name: str, record: Optional[Data] = None, append: bool = False) -> Data:
if record and not isinstance(record, Data):
if isinstance(record, str):
record = Data(text=record)
elif isinstance(record, dict):
record = Data(data=record)
def build(self, name: str, data: Optional[Data] = None, append: bool = False) -> Data:
if data and not isinstance(data, Data):
if isinstance(data, str):
data = Data(text=data)
elif isinstance(data, dict):
data = Data(data=data)
else:
record = Data(text=str(record))
elif not record:
record = Data(text="")
if record:
data = Data(text=str(data))
elif not data:
data = Data(text="")
if data:
if append:
self.append_state(name, record)
self.append_state(name, data)
else:
self.update_state(name, record)
self.update_state(name, data)
else:
self.status = "No record provided."
self.status = record
return record
self.status = data
return data

View file

@ -14,7 +14,7 @@ class RunFlowComponent(CustomComponent):
def get_flow_names(self) -> List[str]:
flow_data = self.list_flows()
return [flow_record.data["name"] for flow_record in flow_data]
return [flow_data.data["name"] for flow_data in flow_data]
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
if field_name == "flow_name":

View file

@ -23,13 +23,13 @@ class SubFlowComponent(CustomComponent):
def get_flow_names(self) -> List[str]:
flow_data = self.list_flows()
return [flow_record.data["name"] for flow_record in flow_data]
return [flow_data.data["name"] for flow_data in flow_data]
def get_flow(self, flow_name: str) -> Optional[Data]:
flow_data = self.list_flows()
for flow_record in flow_data:
if flow_record.data["name"] == flow_name:
return flow_record
for flow_data in flow_data:
if flow_data.data["name"] == flow_name:
return flow_data
return None
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
@ -42,10 +42,10 @@ class SubFlowComponent(CustomComponent):
del build_config[key]
if field_value is not None and field_name == "flow_name":
try:
flow_record = self.get_flow(field_value)
if not flow_record:
flow_data = self.get_flow(field_value)
if not flow_data:
raise ValueError(f"Flow {field_value} not found.")
graph = Graph.from_payload(flow_record.data["data"])
graph = Graph.from_payload(flow_data.data["data"])
# Get all inputs from the graph
inputs = get_flow_inputs(graph)
# Add inputs to the build config

View file

@ -1,25 +1,24 @@
from .AgentComponent import AgentComponent
from .ClearMessageHistory import ClearMessageHistoryComponent
from .ExtractDataFromRecord import ExtractKeyFromRecordComponent
from .ExtractDataFromData import ExtractKeyFromDataComponent
from .FlowTool import FlowToolComponent
from .ListFlows import ListFlowsComponent
from .Listen import ListenComponent
from .MergeRecords import MergeRecordsComponent
from .ListFlows import ListFlowsComponent
from .Notify import NotifyComponent
from .PythonFunction import PythonFunctionComponent
from .RunFlow import RunFlowComponent
from .RunnableExecutor import RunnableExecComponent
from .SQLExecutor import SQLExecutorComponent
from .SubFlow import SubFlowComponent
from .AgentComponent import AgentComponent
__all__ = [
"AgentComponent",
"ClearMessageHistoryComponent",
"ExtractKeyFromRecordComponent",
"ExtractKeyFromDataComponent",
"FlowToolComponent",
"ListFlowsComponent",
"ListenComponent",
"MergeRecordsComponent",
"MergeDataComponent",
"NotifyComponent",
"PythonFunctionComponent",
"RunFlowComponent",

View file

@ -7,7 +7,7 @@ from langflow.schema.dotdict import dotdict
from langflow.template.field.base import Input
class CreateRecordComponent(CustomComponent):
class CreateDataComponent(CustomComponent):
display_name = "Create Data"
description = "Dynamically create a Data with a specified number of fields."
field_order = ["number_of_fields", "text_key"]
@ -22,7 +22,7 @@ class CreateRecordComponent(CustomComponent):
existing_fields = {}
if field_value_int > 15:
build_config["number_of_fields"]["value"] = 15
raise ValueError("Number of fields cannot exceed 15. Try using a Component to combine two Records.")
raise ValueError("Number of fields cannot exceed 15. Try using a Component to combine two Data.")
if len(build_config) > len(default_keys) + field_value_int:
# back up the existing template fields
for key in build_config.copy():
@ -76,6 +76,6 @@ class CreateRecordComponent(CustomComponent):
key: value.get_text() if isinstance(value, Data) else value for key, value in value_dict.items()
}
data.update(value_dict)
return_record = Data(data=data, text_key=text_key)
self.status = return_record
return return_record
return_data = Data(data=data, text_key=text_key)
self.status = return_data
return return_data

View file

@ -1,17 +1,17 @@
from langflow.custom import CustomComponent
from langflow.field_typing import Text
from langflow.helpers.record import data_to_text
from langflow.helpers.data import data_to_text
from langflow.schema import Data
class RecordsToTextComponent(CustomComponent):
display_name = "Records To Text"
description = "Convert Records into plain text following a specified template."
class DataToTextComponent(CustomComponent):
display_name = "Data To Text"
description = "Convert Data into plain text following a specified template."
def build_config(self):
return {
"data": {
"display_name": "Records",
"display_name": "Data",
"info": "The data to convert to text.",
},
"template": {

View file

@ -6,9 +6,9 @@ from langflow.custom import CustomComponent
from langflow.schema import Data
class DocumentToRecordComponent(CustomComponent):
display_name = "Documents To Records"
description = "Convert LangChain Documents into Records."
class DocumentToDataComponent(CustomComponent):
display_name = "Documents To Data"
description = "Convert LangChain Documents into Data."
field_config = {
"documents": {"display_name": "Documents"},

View file

@ -2,7 +2,7 @@ from typing import Optional
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.field_typing import Text
from langflow.helpers.record import messages_to_text
from langflow.helpers.data import messages_to_text
from langflow.memory import get_messages
from langflow.schema.message import Message
@ -35,7 +35,7 @@ class MemoryComponent(BaseMemoryComponent):
"info": "Order of the messages.",
"advanced": True,
},
"record_template": {
"data_template": {
"display_name": "Data Template",
"multiline": True,
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
@ -68,7 +68,7 @@ class MemoryComponent(BaseMemoryComponent):
session_id: Optional[str] = None,
n_messages: int = 5,
order: Optional[str] = "Descending",
record_template: Optional[str] = "{sender_name}: {text}",
data_template: Optional[str] = "{sender_name}: {text}",
) -> Text:
messages = self.get_messages(
sender=sender,
@ -77,6 +77,6 @@ class MemoryComponent(BaseMemoryComponent):
limit=n_messages,
order=order,
)
messages_str = messages_to_text(template=record_template or "", messages=messages)
messages_str = messages_to_text(template=data_template or "", messages=messages)
self.status = messages_str
return messages_str

View file

@ -2,13 +2,13 @@ from langflow.custom import CustomComponent
from langflow.schema import Data
class UpdateRecordComponent(CustomComponent):
class UpdateDataComponent(CustomComponent):
display_name = "Update Data"
description = "Update Data with text-based key/value pairs, similar to updating a Python dictionary."
def build_config(self):
return {
"record": {
"data": {
"display_name": "Data",
"info": "The record to update.",
},
@ -21,7 +21,7 @@ class UpdateRecordComponent(CustomComponent):
def build(
self,
record: Data,
data: Data,
new_data: dict,
) -> Data:
"""
@ -34,6 +34,6 @@ class UpdateRecordComponent(CustomComponent):
Returns:
Data: The updated record.
"""
record.data.update(new_data)
self.status = record
return record
data.data.update(new_data)
self.status = data
return data

View file

@ -1,17 +1,17 @@
from .CreateRecord import CreateRecordComponent
from .CreateData import CreateDataComponent
from .CustomComponent import Component
from .DocumentToRecord import DocumentToRecordComponent
from .DataToText import DataToTextComponent
from .DocumentToData import DocumentToDataComponent
from .IDGenerator import UUIDGeneratorComponent
from .MessageHistory import MessageHistoryComponent
from .UpdateRecord import UpdateRecordComponent
from .RecordsToText import RecordsToTextComponent
from .UpdateData import UpdateDataComponent
__all__ = [
"Component",
"UpdateRecordComponent",
"DocumentToRecordComponent",
"UpdateDataComponent",
"DocumentToDataComponent",
"UUIDGeneratorComponent",
"RecordsToTextComponent",
"CreateRecordComponent",
"DataToTextComponent",
"CreateDataComponent",
"MessageHistoryComponent",
]

View file

@ -17,7 +17,7 @@ class TextInput(TextComponent):
input_types=["Data", "Text"],
),
Input(
name="record_template",
name="data_template",
type=str,
display_name="Data Template",
multiline=True,
@ -30,4 +30,4 @@ class TextInput(TextComponent):
]
def text_response(self) -> Text:
return self.build(input_value=self.input_value, record_template=self.record_template)
return self.build(input_value=self.input_value, data_template=self.data_template)

View file

@ -29,7 +29,7 @@ class ChatOutput(ChatComponent):
StrInput(name="sender_name", display_name="Sender Name", info="Name of the sender.", value="AI", advanced=True),
StrInput(name="session_id", display_name="Session ID", info="Session ID for the message.", advanced=True),
BoolInput(
name="record_template",
name="data_template",
display_name="Data Template",
value="{text}",
advanced=True,

View file

@ -3,17 +3,17 @@ from langflow.schema import Data
from langflow.template import Input, Output
class RecordsOutput(Component):
display_name = "Records Output"
description = "Display Records as a Table"
class DataOutput(Component):
display_name = "Data Output"
description = "Display Data as a Table"
inputs = [
Input(name="input_value", type=Data, display_name="Data Input"),
]
outputs = [
Output(display_name="Data", name="record", method="record_response"),
Output(display_name="Data", name="data", method="data_response"),
]
def record_response(self) -> Data:
def data_response(self) -> Data:
self.status = self.input_value
return self.input_value

View file

@ -17,7 +17,7 @@ class TextOutput(TextComponent):
input_types=["Data", "Text"],
),
Input(
name="record_template",
name="data_template",
type=str,
display_name="Data Template",
multiline=True,
@ -30,4 +30,4 @@ class TextOutput(TextComponent):
]
def text_response(self) -> Text:
return self.build(input_value=self.input_value, record_template=self.record_template)
return self.build(input_value=self.input_value, data_template=self.data_template)

View file

@ -6,7 +6,7 @@ from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import Text
from langflow.helpers.record import docs_to_data
from langflow.helpers.data import docs_to_data
from langflow.schema import Data

View file

@ -53,7 +53,7 @@ class InterfaceComponentTypes(str, Enum, metaclass=ContainsEnumMeta):
ChatOutput = "ChatOutput"
TextInput = "TextInput"
TextOutput = "TextOutput"
RecordsOutput = "RecordsOutput"
DataOutput = "DataOutput"
def __contains__(cls, item):
try:
@ -65,7 +65,7 @@ class InterfaceComponentTypes(str, Enum, metaclass=ContainsEnumMeta):
CHAT_COMPONENTS = [InterfaceComponentTypes.ChatInput, InterfaceComponentTypes.ChatOutput]
RECORDS_COMPONENTS = [InterfaceComponentTypes.RecordsOutput]
RECORDS_COMPONENTS = [InterfaceComponentTypes.DataOutput]
INPUT_COMPONENTS = [
InterfaceComponentTypes.ChatInput,
InterfaceComponentTypes.TextInput,

View file

@ -12,7 +12,7 @@ from langflow.schema import Data
from langflow.schema.artifact import ArtifactType
from langflow.schema.schema import INPUT_FIELD_NAME, build_logs_from_artifacts
from langflow.services.monitor.utils import log_transaction, log_vertex_build
from langflow.utils.schemas import ChatOutputResponse, RecordOutputResponse
from langflow.utils.schemas import ChatOutputResponse, DataOutputResponse
from langflow.utils.util import unescape_string
if TYPE_CHECKING:
@ -259,7 +259,7 @@ class InterfaceVertex(ComponentVertex):
return message
def _process_record_component(self):
def _process_data_component(self):
"""
Process the record component of the vertex.
@ -291,7 +291,7 @@ class InterfaceVertex(ComponentVertex):
logger.error(f"Data expected, but got {value} of type {type(value)}")
else:
raise ValueError(f"Data expected, but got {value} of type {type(value)}")
self.artifacts = RecordOutputResponse(data=artifacts)
self.artifacts = DataOutputResponse(data=artifacts)
return self._built_object
async def _run(self, *args, **kwargs):
@ -299,9 +299,9 @@ class InterfaceVertex(ComponentVertex):
if self.vertex_type in CHAT_COMPONENTS:
message = self._process_chat_component()
elif self.vertex_type in RECORDS_COMPONENTS:
message = self._process_record_component()
message = self._process_data_component()
if isinstance(self._built_object, (AsyncIterator, Iterator)):
if self.params.get("return_record", False):
if self.params.get("return_data", False):
self._built_object = Data(text=message, data=self.artifacts)
else:
self._built_object = message

View file

@ -1,3 +1,3 @@
from .record import data_to_text, docs_to_data, messages_to_text
from .data import data_to_text, docs_to_data, messages_to_text
__all__ = ["docs_to_data", "data_to_text", "messages_to_text"]

View file

@ -8,23 +8,23 @@ from langflow.schema.message import Message
def docs_to_data(documents: list[Document]) -> list[Data]:
"""
Converts a list of Documents to a list of Records.
Converts a list of Documents to a list of Data.
Args:
documents (list[Document]): The list of Documents to convert.
Returns:
list[Data]: The converted list of Records.
list[Data]: The converted list of Data.
"""
return [Data.from_document(document) for document in documents]
def data_to_text(template: str, data: Union[Data, list[Data]]) -> str:
"""
Converts a list of Records to a list of texts.
Converts a list of Data to a list of texts.
Args:
data (list[Data]): The list of Records to convert.
data (list[Data]): The list of Data to convert.
Returns:
list[str]: The converted list of texts.

View file

@ -31,7 +31,7 @@ def list_flows(*, user_id: Optional[str] = None) -> List[Data]:
select(Flow).where(Flow.user_id == user_id).where(Flow.is_component == False) # noqa
).all()
flows_data = [flow.to_record() for flow in flows]
flows_data = [flow.to_data() for flow in flows]
return flows_data
except Exception as e:
raise ValueError(f"Error listing flows: {e}")
@ -170,22 +170,22 @@ async def flow_function({func_args}):
def build_function_and_schema(
flow_record: Data, graph: "Graph", user_id: str | UUID | None
flow_data: Data, graph: "Graph", user_id: str | UUID | None
) -> Tuple[Callable[..., Awaitable[Any]], Type[BaseModel]]:
"""
Builds a dynamic function and schema for a given flow.
Args:
flow_record (Data): The flow record containing information about the flow.
flow_data (Data): The flow record containing information about the flow.
graph (Graph): The graph representing the flow.
Returns:
Tuple[Callable, BaseModel]: A tuple containing the dynamic function and the schema.
"""
flow_id = flow_record.id
flow_id = flow_data.id
inputs = get_flow_inputs(graph)
dynamic_flow_function = generate_function_for_flow(inputs, flow_id, user_id=user_id)
schema = build_schema_from_inputs(flow_record.name, inputs)
schema = build_schema_from_inputs(flow_data.name, inputs)
return dynamic_flow_function, schema

View file

@ -618,7 +618,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -643,28 +643,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",

View file

@ -520,7 +520,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -545,28 +545,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",

View file

@ -652,7 +652,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -677,28 +677,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",

View file

@ -396,7 +396,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -421,28 +421,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",
@ -593,7 +571,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from typing import Optional\n\nfrom langflow.base.memory.memory import BaseMemoryComponent\nfrom langflow.field_typing import Text\nfrom langflow.helpers.record import messages_to_text\nfrom langflow.memory import get_messages\nfrom langflow.schema.message import Message\n\n\nclass MemoryComponent(BaseMemoryComponent):\n display_name = \"Chat Memory\"\n description = \"Retrieves stored chat messages given a specific Session ID.\"\n beta: bool = True\n icon = \"history\"\n\n def build_config(self):\n return {\n \"sender\": {\n \"options\": [\"Machine\", \"User\", \"Machine and User\"],\n \"display_name\": \"Sender Type\",\n },\n \"sender_name\": {\"display_name\": \"Sender Name\", \"advanced\": True},\n \"n_messages\": {\n \"display_name\": \"Number of Messages\",\n \"info\": \"Number of messages to retrieve.\",\n },\n \"session_id\": {\n \"display_name\": \"Session ID\",\n \"info\": \"Session ID of the chat history.\",\n \"input_types\": [\"Text\"],\n },\n \"order\": {\n \"options\": [\"Ascending\", \"Descending\"],\n \"display_name\": \"Order\",\n \"info\": \"Order of the messages.\",\n \"advanced\": True,\n },\n \"record_template\": {\n \"display_name\": \"Data Template\",\n \"multiline\": True,\n \"info\": \"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n \"advanced\": True,\n },\n }\n\n def get_messages(self, **kwargs) -> list[Message]:\n # Validate kwargs by checking if it contains the correct keys\n if \"sender\" not in kwargs:\n kwargs[\"sender\"] = None\n if \"sender_name\" not in kwargs:\n kwargs[\"sender_name\"] = None\n if \"session_id\" not in kwargs:\n kwargs[\"session_id\"] = None\n if \"limit\" not in kwargs:\n kwargs[\"limit\"] = 5\n if \"order\" not in kwargs:\n kwargs[\"order\"] = \"Descending\"\n\n kwargs[\"order\"] = \"DESC\" if kwargs[\"order\"] == \"Descending\" else \"ASC\"\n if kwargs[\"sender\"] == \"Machine and User\":\n kwargs[\"sender\"] = None\n return get_messages(**kwargs)\n\n def build(\n self,\n sender: Optional[str] = \"Machine and User\",\n sender_name: Optional[str] = None,\n session_id: Optional[str] = None,\n n_messages: int = 5,\n order: Optional[str] = \"Descending\",\n record_template: Optional[str] = \"{sender_name}: {text}\",\n ) -> Text:\n messages = self.get_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n messages_str = messages_to_text(template=record_template or \"\", messages=messages)\n self.status = messages_str\n return messages_str\n"
"value": "from typing import Optional\n\nfrom langflow.base.memory.memory import BaseMemoryComponent\nfrom langflow.field_typing import Text\nfrom langflow.helpers.data import messages_to_text\nfrom langflow.memory import get_messages\nfrom langflow.schema.message import Message\n\n\nclass MemoryComponent(BaseMemoryComponent):\n display_name = \"Chat Memory\"\n description = \"Retrieves stored chat messages given a specific Session ID.\"\n beta: bool = True\n icon = \"history\"\n\n def build_config(self):\n return {\n \"sender\": {\n \"options\": [\"Machine\", \"User\", \"Machine and User\"],\n \"display_name\": \"Sender Type\",\n },\n \"sender_name\": {\"display_name\": \"Sender Name\", \"advanced\": True},\n \"n_messages\": {\n \"display_name\": \"Number of Messages\",\n \"info\": \"Number of messages to retrieve.\",\n },\n \"session_id\": {\n \"display_name\": \"Session ID\",\n \"info\": \"Session ID of the chat history.\",\n \"input_types\": [\"Text\"],\n },\n \"order\": {\n \"options\": [\"Ascending\", \"Descending\"],\n \"display_name\": \"Order\",\n \"info\": \"Order of the messages.\",\n \"advanced\": True,\n },\n \"data_template\": {\n \"display_name\": \"Data Template\",\n \"multiline\": True,\n \"info\": \"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n \"advanced\": True,\n },\n }\n\n def get_messages(self, **kwargs) -> list[Message]:\n # Validate kwargs by checking if it contains the correct keys\n if \"sender\" not in kwargs:\n kwargs[\"sender\"] = None\n if \"sender_name\" not in kwargs:\n kwargs[\"sender_name\"] = None\n if \"session_id\" not in kwargs:\n kwargs[\"session_id\"] = None\n if \"limit\" not in kwargs:\n kwargs[\"limit\"] = 5\n if \"order\" not in kwargs:\n kwargs[\"order\"] = \"Descending\"\n\n kwargs[\"order\"] = \"DESC\" if kwargs[\"order\"] == \"Descending\" else \"ASC\"\n if kwargs[\"sender\"] == \"Machine and User\":\n kwargs[\"sender\"] = None\n return get_messages(**kwargs)\n\n def build(\n self,\n sender: Optional[str] = \"Machine and User\",\n sender_name: Optional[str] = None,\n session_id: Optional[str] = None,\n n_messages: int = 5,\n order: Optional[str] = \"Descending\",\n data_template: Optional[str] = \"{sender_name}: {text}\",\n ) -> Text:\n messages = self.get_messages(\n sender=sender,\n sender_name=sender_name,\n session_id=session_id,\n limit=n_messages,\n order=order,\n )\n messages_str = messages_to_text(template=data_template or \"\", messages=messages)\n self.status = messages_str\n return messages_str\n"
},
"n_messages": {
"advanced": false,
@ -640,28 +618,6 @@
"type": "str",
"value": "Descending"
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": "{sender_name}: {text}"
},
"sender": {
"advanced": false,
"display_name": "Sender Type",

View file

@ -598,7 +598,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -623,28 +623,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",
@ -799,7 +777,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -824,28 +802,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",
@ -983,7 +939,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.field_typing import Text\nfrom langflow.template import Input, Output\n\n\nclass TextInput(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n\n inputs = [\n Input(\n name=\"input_value\",\n type=str,\n display_name=\"Value\",\n info=\"Text or Data to be passed as input.\",\n input_types=[\"Data\", \"Text\"],\n ),\n Input(\n name=\"record_template\",\n type=str,\n display_name=\"Data Template\",\n multiline=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Text:\n return self.build(input_value=self.input_value, record_template=self.record_template)\n"
"value": "from langflow.base.io.text import TextComponent\nfrom langflow.field_typing import Text\nfrom langflow.template import Input, Output\n\n\nclass TextInput(TextComponent):\n display_name = \"Text Input\"\n description = \"Get text inputs from the Playground.\"\n icon = \"type\"\n\n inputs = [\n Input(\n name=\"input_value\",\n type=str,\n display_name=\"Value\",\n info=\"Text or Data to be passed as input.\",\n input_types=[\"Data\", \"Text\"],\n ),\n Input(\n name=\"data_template\",\n type=str,\n display_name=\"Data Template\",\n multiline=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n advanced=True,\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n ]\n\n def text_response(self) -> Text:\n return self.build(input_value=self.input_value, data_template=self.data_template)\n"
},
"input_value": {
"advanced": false,
@ -1007,28 +963,6 @@
"title_case": false,
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": true,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
}
}
},

View file

@ -1652,7 +1652,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"record_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
"value": "from langflow.base.io.chat import ChatComponent\nfrom langflow.field_typing import Text\nfrom langflow.inputs import BoolInput, DropdownInput, StrInput\nfrom langflow.schema.message import Message\nfrom langflow.template import Output\n\n\nclass ChatOutput(ChatComponent):\n display_name = \"Chat Output\"\n description = \"Display a chat message in the Playground.\"\n icon = \"ChatOutput\"\n\n inputs = [\n StrInput(\n name=\"input_value\",\n display_name=\"Text\",\n multiline=True,\n info=\"Message to be passed as output.\",\n input_types=[\"Text\", \"Message\"],\n ),\n DropdownInput(\n name=\"sender\",\n display_name=\"Sender Type\",\n options=[\"Machine\", \"User\"],\n value=\"Machine\",\n advanced=True,\n info=\"Type of sender.\",\n ),\n StrInput(name=\"sender_name\", display_name=\"Sender Name\", info=\"Name of the sender.\", value=\"AI\", advanced=True),\n StrInput(name=\"session_id\", display_name=\"Session ID\", info=\"Session ID for the message.\", advanced=True),\n BoolInput(\n name=\"data_template\",\n display_name=\"Data Template\",\n value=\"{text}\",\n advanced=True,\n info=\"Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.\",\n ),\n ]\n outputs = [\n Output(display_name=\"Text\", name=\"text\", method=\"text_response\"),\n Output(display_name=\"Message\", name=\"message\", method=\"message_response\"),\n ]\n\n def text_response(self) -> Text:\n result = self.input_value\n if self.session_id:\n self.message_response()\n self.status = result\n return result\n\n def message_response(self) -> Message:\n message = Message(\n text=self.input_value,\n sender=self.sender,\n sender_name=self.sender_name,\n session_id=self.session_id,\n )\n if self.session_id and isinstance(message, Message) and isinstance(message.text, str):\n self.store_message(message)\n self.message.value = message\n\n self.status = message\n return message\n"
},
"input_value": {
"advanced": false,
@ -1677,28 +1677,6 @@
"type": "str",
"value": ""
},
"record_template": {
"advanced": true,
"display_name": "Data Template",
"dynamic": false,
"fileTypes": [],
"file_path": "",
"info": "Template to convert Data to Text. If left empty, it will be dynamically set to the Data's text key.",
"input_types": [
"Text"
],
"list": false,
"load_from_db": false,
"multiline": false,
"name": "record_template",
"password": false,
"placeholder": "",
"required": false,
"show": true,
"title_case": false,
"type": "str",
"value": ""
},
"sender": {
"advanced": true,
"display_name": "Sender Type",
@ -1841,7 +1819,7 @@
"show": true,
"title_case": false,
"type": "code",
"value": "from pathlib import Path\nfrom typing import Any, Dict\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_record\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Data\n\n\nclass FileComponent(CustomComponent):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n def build_config(self) -> Dict[str, Any]:\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": TEXT_FILE_TYPES,\n \"info\": f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n },\n \"silent_errors\": {\n \"display_name\": \"Silent Errors\",\n \"advanced\": True,\n \"info\": \"If true, errors will not raise an exception.\",\n },\n }\n\n def load_file(self, path: str, silent_errors: bool = False) -> Data:\n resolved_path = self.resolve_path(path)\n path_obj = Path(resolved_path)\n extension = path_obj.suffix[1:].lower()\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n record = parse_text_file_to_record(resolved_path, silent_errors)\n self.status = record if record else \"No data\"\n return record or Data()\n\n def build(\n self,\n path: str,\n silent_errors: bool = False,\n ) -> Data:\n record = self.load_file(path, silent_errors)\n self.status = record\n return record\n"
"value": "from pathlib import Path\nfrom typing import Any, Dict\n\nfrom langflow.base.data.utils import TEXT_FILE_TYPES, parse_text_file_to_data\nfrom langflow.custom import CustomComponent\nfrom langflow.schema import Data\n\n\nclass FileComponent(CustomComponent):\n display_name = \"File\"\n description = \"A generic file loader.\"\n icon = \"file-text\"\n\n def build_config(self) -> Dict[str, Any]:\n return {\n \"path\": {\n \"display_name\": \"Path\",\n \"field_type\": \"file\",\n \"file_types\": TEXT_FILE_TYPES,\n \"info\": f\"Supported file types: {', '.join(TEXT_FILE_TYPES)}\",\n },\n \"silent_errors\": {\n \"display_name\": \"Silent Errors\",\n \"advanced\": True,\n \"info\": \"If true, errors will not raise an exception.\",\n },\n }\n\n def load_file(self, path: str, silent_errors: bool = False) -> Data:\n resolved_path = self.resolve_path(path)\n path_obj = Path(resolved_path)\n extension = path_obj.suffix[1:].lower()\n if extension == \"doc\":\n raise ValueError(\"doc files are not supported. Please save as .docx\")\n if extension not in TEXT_FILE_TYPES:\n raise ValueError(f\"Unsupported file type: {extension}\")\n record = parse_text_file_to_data(resolved_path, silent_errors)\n self.status = record if record else \"No data\"\n return record or Data()\n\n def build(\n self,\n path: str,\n silent_errors: bool = False,\n ) -> Data:\n record = self.load_file(path, silent_errors)\n self.status = record\n return record\n"
},
"path": {
"advanced": false,

View file

@ -7,7 +7,7 @@ from langflow.schema.message import Message
class ArtifactType(str, Enum):
TEXT = "text"
RECORD = "record"
DATA = "data"
OBJECT = "object"
ARRAY = "array"
STREAM = "stream"
@ -19,7 +19,7 @@ def get_artifact_type(value, build_result=None) -> str:
result = ArtifactType.UNKNOWN
match value:
case Data():
result = ArtifactType.RECORD
result = ArtifactType.DATA
case str():
result = ArtifactType.TEXT

View file

@ -6,8 +6,8 @@ from langchain_core.prompt_values import ImagePromptValue
from langchain_core.prompts.image import ImagePromptTemplate
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, field_serializer
from langflow.schema.image import Image, get_file_paths, is_image_file
from langflow.schema.data import Data
from langflow.schema.image import Image, get_file_paths, is_image_file
def _timestamp_to_str(timestamp: datetime) -> str:
@ -68,7 +68,7 @@ class Message(BaseModel):
return AIMessage(content=self.text)
@classmethod
def from_record(cls, record: Data) -> "Message":
def from_data(cls, record: Data) -> "Message":
"""
Converts a BaseMessage to a Data.

View file

@ -142,7 +142,7 @@ class Flow(FlowBase, table=True):
folder_id: Optional[UUID] = Field(default=None, foreign_key="folder.id", nullable=True, index=True)
folder: Optional["Folder"] = Relationship(back_populates="flows")
def to_record(self):
def to_data(self):
serialized = self.model_dump()
data = {
"id": serialized.pop("id"),

View file

@ -97,7 +97,7 @@ class ChatOutputResponse(BaseModel):
return self
class RecordOutputResponse(BaseModel):
class DataOutputResponse(BaseModel):
"""Data output response schema."""
data: List[Optional[Dict]]

View file

@ -415,7 +415,7 @@ def build_loader_repr_from_data(data: List[Data]) -> str:
avg_length = sum(len(doc.text) for doc in data) / len(data)
return f"""{len(data)} data
\nAvg. Data Length (characters): {int(avg_length)}
Records: {data[:3]}..."""
Data: {data[:3]}..."""
return "0 data"

View file

@ -1,4 +1,4 @@
import RecordsOutputComponent from "../../../../../../components/dataOutputComponent";
import DataOutputComponent from "../../../../../../components/dataOutputComponent";
import ForwardedIconComponent from "../../../../../../components/genericIconComponent";
import {
Alert,
@ -29,7 +29,7 @@ const SwitchOutputView: React.FC<SwitchOutputViewProps> = ({
const results = flowPoolNode?.data?.logs[outputName] ?? "";
const resultType = results?.type;
let resultMessage = results?.message;
const RECORD_TYPES = ["record", "object", "array", "message"];
const RECORD_TYPES = ["data", "object", "array", "message"];
if (resultMessage?.raw) {
resultMessage = resultMessage.raw;
}
@ -47,7 +47,7 @@ const SwitchOutputView: React.FC<SwitchOutputViewProps> = ({
</Case>
<Case condition={RECORD_TYPES.includes(resultType)}>
<RecordsOutputComponent
<DataOutputComponent
rows={
Array.isArray(resultMessage)
? (resultMessage as Array<any>).every((item) => item.data)

View file

@ -4,7 +4,7 @@ import "ag-grid-community/styles/ag-theme-balham.css"; // Optional Theme applied
import { extractColumnsFromRows } from "../../utils/utils";
import TableComponent from "../tableComponent";
function RecordsOutputComponent({
function DataOutputComponent({
pagination,
rows,
columnMode = "union",
@ -35,4 +35,4 @@ function RecordsOutputComponent({
);
}
export default RecordsOutputComponent;
export default DataOutputComponent;

View file

@ -654,7 +654,7 @@ export const OUTPUT_TYPES = new Set([
"JsonOutput",
"KeyPairOutput",
"StringListOutput",
"RecordsOutput",
"DataOutput",
"TableOutput",
]);

View file

@ -2,7 +2,7 @@ import { cloneDeep } from "lodash";
import { useState } from "react";
import ImageViewer from "../../../../components/ImageViewer";
import CsvOutputComponent from "../../../../components/csvOutputComponent";
import RecordsOutputComponent from "../../../../components/dataOutputComponent";
import DataOutputComponent from "../../../../components/dataOutputComponent";
import InputListComponent from "../../../../components/inputListComponent";
import PdfViewer from "../../../../components/pdfViewer";
import { Textarea } from "../../../../components/ui/textarea";
@ -245,10 +245,10 @@ export default function IOFieldView({
/>
</>
);
case "RecordsOutput":
case "DataOutput":
return (
<div className={left ? "h-56" : "h-full"}>
<RecordsOutputComponent
<DataOutputComponent
pagination={!left}
rows={
Array.isArray(flowPoolNode?.data?.artifacts)

View file

@ -272,7 +272,7 @@ export const nodeColors: { [char: string]: string } = {
retrievers: "#e6b25a",
unknown: "#9CA3AF",
custom_components: "#ab11ab",
Records: "#31a3cc",
Data: "#31a3cc",
Data: "#31a3cc",
Message: "#4367BF",
};