From 876b26e1acd5f01c2cf4eacbbca92837f6284241 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Mon, 10 Jun 2024 16:04:38 -0300 Subject: [PATCH 1/3] Add class with custom JSON serialization --- .../base/langflow/services/monitor/schema.py | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py index ca267ac2b..f3261c559 100644 --- a/src/backend/base/langflow/services/monitor/schema.py +++ b/src/backend/base/langflow/services/monitor/schema.py @@ -7,7 +7,26 @@ from pydantic import BaseModel, Field, field_serializer, field_validator from langflow.schema.message import Message -class TransactionModel(BaseModel): +class DefaultModel(BaseModel): + class Config: + from_attributes = True + populate_by_name = True + json_encoders = { + datetime: lambda v: v.isoformat(), + } + + def json(self, **kwargs): + # Usa a função de serialização personalizada + return super().json(**kwargs, encoder=self.custom_encoder) + + @staticmethod + def custom_encoder(obj): + if isinstance(obj, datetime): + return obj.isoformat() + raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable") + + +class TransactionModel(DefaultModel): index: Optional[int] = Field(default=None) timestamp: Optional[datetime] = Field(default_factory=datetime.now, alias="timestamp") vertex_id: str From 118da0d482cfce379b81f83106f82fb1e51ac264 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Mon, 10 Jun 2024 16:06:40 -0300 Subject: [PATCH 2/3] refactor to use DefaultModel as base class --- .../base/langflow/services/monitor/schema.py | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/src/backend/base/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py index f3261c559..f39e41e21 100644 --- a/src/backend/base/langflow/services/monitor/schema.py +++ b/src/backend/base/langflow/services/monitor/schema.py @@ -37,10 +37,6 @@ class TransactionModel(DefaultModel): error: Optional[str] = None flow_id: Optional[str] = Field(default=None, alias="flow_id") - class Config: - from_attributes = True - populate_by_name = True - # validate target_args in case it is a JSON @field_validator("outputs", "inputs", mode="before") def validate_target_args(cls, v): @@ -55,7 +51,7 @@ class TransactionModel(DefaultModel): return v -class TransactionModelResponse(BaseModel): +class TransactionModelResponse(DefaultModel): index: Optional[int] = Field(default=None) timestamp: Optional[datetime] = Field(default_factory=datetime.now, alias="timestamp") vertex_id: str @@ -67,10 +63,6 @@ class TransactionModelResponse(BaseModel): source: Optional[str] = None target: Optional[str] = None - class Config: - from_attributes = True - populate_by_name = True - # validate target_args in case it is a JSON @field_validator("outputs", "inputs", mode="before") def validate_target_args(cls, v): @@ -88,7 +80,7 @@ class TransactionModelResponse(BaseModel): return v -class MessageModel(BaseModel): +class MessageModel(DefaultModel): index: Optional[int] = Field(default=None) flow_id: Optional[str] = Field(default=None, alias="flow_id") timestamp: datetime = Field(default_factory=datetime.now) @@ -98,10 +90,6 @@ class MessageModel(BaseModel): text: str files: list[str] = [] - class Config: - from_attributes = True - populate_by_name = True - @field_validator("files", mode="before") def validate_files(cls, v): if isinstance(v, str): @@ -144,7 +132,7 @@ class MessageModelRequest(MessageModel): session_id: str = Field(default="") -class VertexBuildModel(BaseModel): +class VertexBuildModel(DefaultModel): index: Optional[int] = Field(default=None, alias="index", exclude=True) id: Optional[str] = Field(default=None, alias="id") flow_id: str @@ -154,10 +142,6 @@ class VertexBuildModel(BaseModel): artifacts: dict timestamp: datetime = Field(default_factory=datetime.now) - class Config: - from_attributes = True - populate_by_name = True - @field_serializer("data", "artifacts") def serialize_dict(v): if isinstance(v, dict): From 827aec5139aeb934448b0bb9b747e2923ac20184 Mon Sep 17 00:00:00 2001 From: italojohnny Date: Mon, 10 Jun 2024 16:07:39 -0300 Subject: [PATCH 3/3] fix: PydanticSerializationError --- src/backend/base/langflow/services/monitor/schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backend/base/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py index f39e41e21..4491fd0c5 100644 --- a/src/backend/base/langflow/services/monitor/schema.py +++ b/src/backend/base/langflow/services/monitor/schema.py @@ -151,7 +151,7 @@ class VertexBuildModel(DefaultModel): v[key] = value.model_dump() elif isinstance(value, list) and all(isinstance(i, BaseModel) for i in value): v[key] = [i.model_dump() for i in value] - return json.dumps(v) + return json.dumps(v, default=str) elif isinstance(v, BaseModel): return v.model_dump_json() return v