|
|
from langchain_core.documents import Document |
|
|
|
|
|
from langflow.schema import Data |
|
|
from langflow.schema.message import Message |
|
|
|
|
|
|
|
|
def docs_to_data(documents: list[Document]) -> list[Data]: |
|
|
"""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 Data. |
|
|
""" |
|
|
return [Data.from_document(document) for document in documents] |
|
|
|
|
|
|
|
|
def data_to_text_list(template: str, data: Data | list[Data]) -> tuple[list[str], list[Data]]: |
|
|
r"""Formats `text` within Data objects based on a given template. |
|
|
|
|
|
Converts a Data object or a list of Data objects into a tuple containing a list of formatted strings |
|
|
and a list of Data objects based on a given template. |
|
|
|
|
|
Args: |
|
|
template (str): The format string template to be used for formatting the data. |
|
|
data (Data | list[Data]): A single Data object or a list of Data objects to be formatted. |
|
|
|
|
|
Returns: |
|
|
tuple[list[str], list[Data]]: A tuple containing a list of formatted strings based on the |
|
|
provided template and data, and a list of Data objects. |
|
|
""" |
|
|
if data is None: |
|
|
return [], [] |
|
|
|
|
|
if template is None: |
|
|
msg = "Template must be a string, but got None." |
|
|
raise ValueError(msg) |
|
|
|
|
|
if not isinstance(template, str): |
|
|
msg = f"Template must be a string, but got {type(template)}" |
|
|
raise TypeError(msg) |
|
|
|
|
|
if isinstance(data, (Data)): |
|
|
data = [data] |
|
|
|
|
|
data_ = [ |
|
|
|
|
|
Data(text=value) if not isinstance(value, Data) else value |
|
|
for value in data |
|
|
] |
|
|
|
|
|
formatted_text = [template.format(data=value.data, **value.data) for value in data_] |
|
|
return formatted_text, data_ |
|
|
|
|
|
|
|
|
def data_to_text(template: str, data: Data | list[Data], sep: str = "\n") -> str: |
|
|
r"""Converts data into a formatted text string based on a given template. |
|
|
|
|
|
Args: |
|
|
template (str): The template string used to format each data item. |
|
|
data (Data | list[Data]): A single data item or a list of data items to be formatted. |
|
|
sep (str, optional): The separator to use between formatted data items. Defaults to "\n". |
|
|
|
|
|
Returns: |
|
|
str: A string containing the formatted data items separated by the specified separator. |
|
|
""" |
|
|
formatted_text, _ = data_to_text_list(template, data) |
|
|
sep = "\n" if sep is None else sep |
|
|
return sep.join(formatted_text) |
|
|
|
|
|
|
|
|
def messages_to_text(template: str, messages: Message | list[Message]) -> str: |
|
|
"""Converts a list of Messages to a list of texts. |
|
|
|
|
|
Args: |
|
|
template (str): The template to use for the conversion. |
|
|
messages (list[Message]): The list of Messages to convert. |
|
|
|
|
|
Returns: |
|
|
list[str]: The converted list of texts. |
|
|
""" |
|
|
if isinstance(messages, (Message)): |
|
|
messages = [messages] |
|
|
|
|
|
messages_ = [] |
|
|
for message in messages: |
|
|
|
|
|
if not isinstance(message, Message): |
|
|
msg = "All elements in the list must be of type Message." |
|
|
raise TypeError(msg) |
|
|
messages_.append(message) |
|
|
|
|
|
formated_messages = [template.format(data=message.model_dump(), **message.model_dump()) for message in messages_] |
|
|
return "\n".join(formated_messages) |
|
|
|