diff --git a/src/backend/base/langflow/services/monitor/schema.py b/src/backend/base/langflow/services/monitor/schema.py index ca267ac2b..4491fd0c5 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 @@ -18,10 +37,6 @@ class TransactionModel(BaseModel): 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): @@ -36,7 +51,7 @@ class TransactionModel(BaseModel): 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 @@ -48,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): @@ -69,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) @@ -79,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): @@ -125,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 @@ -135,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): @@ -148,7 +151,7 @@ class VertexBuildModel(BaseModel): 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