fix: changed serializations to use serialize function to not compromise json structure (#6673)

* Changed truncate_json to serialize to not lose json structure

* Removed truncate_json and its tests

* [autofix.ci] apply automated fixes

* Added max_length and max_items to serialize calls

* [autofix.ci] apply automated fixes

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
Lucas Oliveira 2025-02-17 18:45:44 -03:00 • committed by GitHub
commit 1912b08232
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 9 additions and 164 deletions

View file

@ -5,7 +5,8 @@ from uuid import UUID, uuid4
from pydantic import field_serializer, field_validator
from sqlmodel import JSON, Column, Field, Relationship, SQLModel
from langflow.services.database.utils import truncate_json
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
from langflow.serialization.serialization import serialize
if TYPE_CHECKING:
from langflow.services.database.models.flow.model import Flow
@ -36,11 +37,11 @@ class TransactionBase(SQLModel):
@field_serializer("inputs")
def serialize_inputs(self, data) -> dict:
return truncate_json(data)
return serialize(data, max_length=MAX_TEXT_LENGTH, max_items=MAX_ITEMS_LENGTH)
@field_serializer("outputs")
def serialize_outputs(self, data) -> dict:
return truncate_json(data)
return serialize(data, max_length=MAX_TEXT_LENGTH, max_items=MAX_ITEMS_LENGTH)
class TransactionTable(TransactionBase, table=True): # type: ignore[call-arg]

View file

@ -6,13 +6,12 @@ from pydantic import BaseModel, field_serializer, field_validator
from sqlalchemy import Text
from sqlmodel import JSON, Column, Field, Relationship, SQLModel
from langflow.services.database.utils import truncate_json
from langflow.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
from langflow.serialization.serialization import serialize
if TYPE_CHECKING:
from langflow.services.database.models.flow.model import Flow
from langflow.utils.util_strings import truncate_long_strings
class VertexBuildBase(SQLModel):
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
@ -45,15 +44,15 @@ class VertexBuildBase(SQLModel):
@field_serializer("data")
def serialize_data(self, data) -> dict:
return truncate_json(data)
return serialize(data, max_length=MAX_TEXT_LENGTH, max_items=MAX_ITEMS_LENGTH)
@field_serializer("artifacts")
def serialize_artifacts(self, data) -> dict:
return truncate_json(data)
return serialize(data, max_length=MAX_TEXT_LENGTH, max_items=MAX_ITEMS_LENGTH)
@field_serializer("params")
def serialize_params(self, data) -> str:
return truncate_long_strings(data)
return serialize(data, max_length=MAX_TEXT_LENGTH, max_items=MAX_ITEMS_LENGTH)
class VertexBuildTable(VertexBuildBase, table=True): # type: ignore[call-arg]

View file

@ -1,6 +1,5 @@
from __future__ import annotations
import json
from contextlib import asynccontextmanager
from dataclasses import dataclass
from typing import TYPE_CHECKING
@ -10,54 +9,10 @@ from loguru import logger
from sqlmodel import text
from sqlmodel.ext.asyncio.session import AsyncSession
from langflow.serialization import constants
if TYPE_CHECKING:
from langflow.services.database.service import DatabaseService
def truncate_json(data, *, max_size: int = constants.MAX_TEXT_LENGTH):
def calculate_size(data):
return len(json.dumps(data))
def shrink_to_size(data, remaining_size):
if isinstance(data, dict):
truncated = {}
for key, value in data.items():
key_size = len(json.dumps(key))
if remaining_size - key_size <= 0:
break
truncated[key] = shrink_to_size(value, remaining_size - key_size)
remaining_size -= len(json.dumps({key: value})) - key_size
return truncated
if isinstance(data, list):
truncated = []
for item in data:
if remaining_size <= len('""'):
break
truncated.append(shrink_to_size(item, remaining_size))
remaining_size -= len(json.dumps(item)) + 1
return truncated
if isinstance(data, str):
max_string_length = max(remaining_size - 2, 0)
return data[:max_string_length] + "…" if max_string_length > 0 else "…"
return data
try:
json.dumps(data)
is_serialized = True
except Exception: # noqa: BLE001
is_serialized = False
if calculate_size(data) <= max_size or not is_serialized:
return data
return shrink_to_size(data, max_size)
async def initialize_database(*, fix_migration: bool = False) -> None:
logger.debug("Initializing database")
from langflow.services.deps import get_db_service