fix: Ensure that we properly format data outputs in the chat (#8132)

* fix: If a list is returned, make sure we convert to string

* Prettify the data output

* Updates based on feedback, safe encoding

* Fix chat output unit test

* Ensure all starter projects are updated
This commit is contained in:
Eric Hare 2025-05-20 10:21:51 -07:00 committed by GitHub
commit 6c58c6efc3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 51 additions and 41 deletions

View file

@ -1,6 +1,9 @@
from collections.abc import Generator
from typing import Any
import orjson
from fastapi.encoders import jsonable_encoder
from langflow.base.io.chat import ChatComponent
from langflow.inputs import BoolInput
from langflow.inputs.inputs import HandleInput
@ -119,6 +122,7 @@ class ChatOutput(ChatComponent):
async def message_response(self) -> Message:
# First convert the input to string if needed
text = self.convert_to_string()
# Get source properties
source, icon, display_name, source_id = self.get_properties_from_source_component()
background_color = self.background_color
@ -176,6 +180,15 @@ class ChatOutput(ChatComponent):
msg = f"Expected Data or DataFrame or Message or str, Generator or None, got {type_name}"
raise TypeError(msg)
def _serialize_data(self, data: Data) -> str:
"""Serialize Data object to JSON string."""
# Convert data.data to JSON-serializable format
serializable_data = jsonable_encoder(data.data)
# Serialize with orjson, enabling pretty printing with indentation
json_bytes = orjson.dumps(serializable_data, option=orjson.OPT_INDENT_2)
# Convert bytes to string and wrap in Markdown code blocks
return "```json\n" + json_bytes.decode("utf-8") + "\n```"
def _safe_convert(self, data: Any) -> str:
"""Safely convert input data to string."""
try:
@ -184,10 +197,7 @@ class ChatOutput(ChatComponent):
if isinstance(data, Message):
return data.get_text()
if isinstance(data, Data):
if data.get_text() is None:
msg = "Empty Data object"
raise ValueError(msg)
return data.get_text()
return self._serialize_data(data)
if isinstance(data, DataFrame):
if self.clean_data:
# Remove empty rows

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -53,7 +53,7 @@ class TestChatOutput(ComponentTestBaseWithClient):
data = Data(text="Test data message")
component.input_value = data
result = await component.message_response()
assert result.text == "Test data message"
assert result.text == '```json\n{\n "text": "Test data message"\n}\n```'
assert result.sender == MESSAGE_SENDER_AI
async def test_process_dataframe_input(self, component_class, default_kwargs):