Fix pydantic field serialization and error handling
This commit is contained in:
parent
05b088cdfe
commit
b32485a6fa
3 changed files with 39 additions and 6 deletions
|
|
@ -2,7 +2,7 @@ import json
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel, Field, validator
|
from pydantic import BaseModel, Field, field_serializer, validator
|
||||||
|
|
||||||
|
|
||||||
class TransactionModel(BaseModel):
|
class TransactionModel(BaseModel):
|
||||||
|
|
@ -60,6 +60,13 @@ class VertexBuildModel(BaseModel):
|
||||||
from_attributes = True
|
from_attributes = True
|
||||||
populate_by_name = True
|
populate_by_name = True
|
||||||
|
|
||||||
|
@field_serializer("data", "artifacts")
|
||||||
|
def serialize_dict(v):
|
||||||
|
if isinstance(v, dict):
|
||||||
|
# map_dict = to_map(v)
|
||||||
|
return json.dumps(v)
|
||||||
|
return v
|
||||||
|
|
||||||
@validator("params", pre=True)
|
@validator("params", pre=True)
|
||||||
def validate_params(cls, v):
|
def validate_params(cls, v):
|
||||||
if isinstance(v, str):
|
if isinstance(v, str):
|
||||||
|
|
@ -82,6 +89,24 @@ class VertexBuildModel(BaseModel):
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
# create a function that turns dicts into a
|
||||||
|
# dict like this:
|
||||||
|
# my_map_dict = {
|
||||||
|
# "key": [
|
||||||
|
# 1, 2, 3
|
||||||
|
# ],
|
||||||
|
# "value": [
|
||||||
|
# "one", "two", "three"
|
||||||
|
# ]
|
||||||
|
# }
|
||||||
|
# so map has a "key" and a "value" list
|
||||||
|
# containing the keys and values of the dict
|
||||||
|
def to_map(value: dict):
|
||||||
|
keys = list(value.keys())
|
||||||
|
values = list(value.values())
|
||||||
|
return {"key": keys, "value": values}
|
||||||
|
|
||||||
|
|
||||||
class VertexBuildMapModel(BaseModel):
|
class VertexBuildMapModel(BaseModel):
|
||||||
vertex_builds: dict[str, list[VertexBuildModel]]
|
vertex_builds: dict[str, list[VertexBuildModel]]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class MonitorService(Service):
|
||||||
try:
|
try:
|
||||||
self.ensure_tables_exist()
|
self.ensure_tables_exist()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error initializing monitor service: {e}")
|
logger.exception(f"Error initializing monitor service: {e}")
|
||||||
|
|
||||||
def to_df(self, table_name):
|
def to_df(self, table_name):
|
||||||
return self.load_table_as_dataframe(table_name)
|
return self.load_table_as_dataframe(table_name)
|
||||||
|
|
@ -145,3 +145,4 @@ class MonitorService(Service):
|
||||||
df = conn.execute(query).df()
|
df = conn.execute(query).df()
|
||||||
|
|
||||||
return df.to_dict(orient="records")
|
return df.to_dict(orient="records")
|
||||||
|
return df.to_dict(orient="records")
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
from typing import TYPE_CHECKING, Any, Dict, Optional, Type
|
from typing import TYPE_CHECKING, Any, Dict, Optional, Type
|
||||||
|
|
||||||
import duckdb
|
import duckdb
|
||||||
|
from langflow.services.deps import get_monitor_service
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from langflow.services.deps import get_monitor_service
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from langflow.api.v1.schemas import ResultDict
|
from langflow.api.v1.schemas import ResultDict
|
||||||
|
|
||||||
|
|
@ -35,7 +34,7 @@ def model_to_sql_column_definitions(model: Type[BaseModel]) -> dict:
|
||||||
elif field_info.__name__ == "bool":
|
elif field_info.__name__ == "bool":
|
||||||
sql_type = "BOOLEAN"
|
sql_type = "BOOLEAN"
|
||||||
elif field_info.__name__ == "dict":
|
elif field_info.__name__ == "dict":
|
||||||
sql_type = "JSON"
|
sql_type = "VARCHAR"
|
||||||
elif field_info.__name__ == "Any":
|
elif field_info.__name__ == "Any":
|
||||||
sql_type = "VARCHAR"
|
sql_type = "VARCHAR"
|
||||||
else:
|
else:
|
||||||
|
|
@ -91,7 +90,14 @@ def add_row_to_table(
|
||||||
insert_sql = f"INSERT INTO {table_name} ({columns}) VALUES ({values_placeholders})"
|
insert_sql = f"INSERT INTO {table_name} ({columns}) VALUES ({values_placeholders})"
|
||||||
|
|
||||||
# Execute the insert statement
|
# Execute the insert statement
|
||||||
|
try:
|
||||||
conn.execute(insert_sql, values)
|
conn.execute(insert_sql, values)
|
||||||
|
except Exception as e:
|
||||||
|
# Log values types
|
||||||
|
for key, value in validated_dict.items():
|
||||||
|
logger.error(f"{key}: {type(value)}")
|
||||||
|
|
||||||
|
logger.error(f"Error adding row to table: {e}")
|
||||||
|
|
||||||
|
|
||||||
async def log_message(
|
async def log_message(
|
||||||
|
|
@ -131,6 +137,7 @@ async def log_vertex_build(
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
monitor_service = get_monitor_service()
|
monitor_service = get_monitor_service()
|
||||||
|
|
||||||
row = {
|
row = {
|
||||||
"flow_id": flow_id,
|
"flow_id": flow_id,
|
||||||
"id": vertex_id,
|
"id": vertex_id,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue