🎨 refactor(schemas.py): add FlowListRead schema and SQLModelSerializable base model
The FlowListRead schema is added to support reading a list of flows with their styles. The SQLModelSerializable base model is added to support serialization of SQLModel objects to JSON using orjson. This improves performance and reduces memory usage. 🐛 fix(flow.py): add optional style relationship to Flow model The style relationship is now optional to allow for flows without styles. This is achieved by setting the uselist parameter of the sa_relationship_kwargs to False. ✨ feat(flow.py): add FlowReadWithStyle and FlowUpdate models The FlowReadWithStyle model is added to support reading a flow with its style. The FlowUpdate model is added to support updating a flow.
This commit is contained in:
parent
32ae6fe0ef
commit
ce9b3bfbd3
3 changed files with 39 additions and 17 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
from typing import Any, Dict, List, Union
|
from typing import Any, Dict, List, Union
|
||||||
from langflow.database.models.flow import FlowCreate
|
from langflow.database.models.flow import FlowCreate, FlowRead
|
||||||
|
|
||||||
from pydantic import BaseModel, validator
|
from pydantic import BaseModel, validator
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -73,3 +72,7 @@ class FileResponse(ChatMessage):
|
||||||
|
|
||||||
class FlowListCreate(BaseModel):
|
class FlowListCreate(BaseModel):
|
||||||
flows: List[FlowCreate]
|
flows: List[FlowCreate]
|
||||||
|
|
||||||
|
|
||||||
|
class FlowListRead(BaseModel):
|
||||||
|
flows: List[FlowRead]
|
||||||
|
|
|
||||||
14
src/backend/langflow/database/models/base.py
Normal file
14
src/backend/langflow/database/models/base.py
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
from sqlmodel import SQLModel
|
||||||
|
import orjson
|
||||||
|
|
||||||
|
|
||||||
|
def orjson_dumps(v, *, default):
|
||||||
|
# orjson.dumps returns bytes, to match standard json.dumps we need to decode
|
||||||
|
return orjson.dumps(v, default=default).decode()
|
||||||
|
|
||||||
|
|
||||||
|
class SQLModelSerializable(SQLModel):
|
||||||
|
class Config:
|
||||||
|
orm_mode = True
|
||||||
|
json_loads = orjson.loads
|
||||||
|
json_dumps = orjson_dumps
|
||||||
|
|
@ -1,16 +1,18 @@
|
||||||
|
# Path: src/backend/langflow/database/models/flow.py
|
||||||
|
|
||||||
|
from langflow.database.models.base import SQLModelSerializable
|
||||||
from pydantic import validator
|
from pydantic import validator
|
||||||
from sqlmodel import Field, SQLModel, Relationship, JSON, Column
|
from sqlmodel import Field, Relationship, JSON, Column
|
||||||
from uuid import UUID, uuid4
|
from uuid import UUID, uuid4
|
||||||
from typing import TYPE_CHECKING, Dict
|
from typing import Dict, Optional
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
# if TYPE_CHECKING:
|
||||||
from langflow.database.models.flowstyle import FlowStyle
|
from langflow.database.models.flow_style import FlowStyle, FlowStyleRead
|
||||||
|
|
||||||
|
|
||||||
class FlowBase(SQLModel):
|
class FlowBase(SQLModelSerializable):
|
||||||
name: str = Field(index=True)
|
name: str = Field(index=True)
|
||||||
flow: Dict = Field(default_factory=dict, sa_column=Column(JSON))
|
flow: Dict = Field(default_factory=dict, sa_column=Column(JSON))
|
||||||
style: "FlowStyle" = Relationship(back_populates="flow")
|
|
||||||
|
|
||||||
@validator("flow")
|
@validator("flow")
|
||||||
def validate_json(v):
|
def validate_json(v):
|
||||||
|
|
@ -30,18 +32,12 @@ class FlowBase(SQLModel):
|
||||||
|
|
||||||
return v
|
return v
|
||||||
|
|
||||||
# @validator("flow")
|
|
||||||
# def flow_must_be_json(cls, v):
|
|
||||||
# try:
|
|
||||||
# valid_json = json.loads(v)
|
|
||||||
|
|
||||||
# except Exception as e:
|
|
||||||
# raise ValueError(f"Flow must be a valid JSON: {e}") from e
|
|
||||||
# return v
|
|
||||||
|
|
||||||
|
|
||||||
class Flow(FlowBase, table=True):
|
class Flow(FlowBase, table=True):
|
||||||
id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True)
|
id: UUID = Field(default_factory=uuid4, primary_key=True, unique=True)
|
||||||
|
style: Optional["FlowStyle"] = Relationship(
|
||||||
|
back_populates="flow", sa_relationship_kwargs={"uselist": False}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class FlowCreate(FlowBase):
|
class FlowCreate(FlowBase):
|
||||||
|
|
@ -50,3 +46,12 @@ class FlowCreate(FlowBase):
|
||||||
|
|
||||||
class FlowRead(FlowBase):
|
class FlowRead(FlowBase):
|
||||||
id: UUID
|
id: UUID
|
||||||
|
|
||||||
|
|
||||||
|
class FlowReadWithStyle(FlowRead):
|
||||||
|
style: Optional["FlowStyleRead"] = None
|
||||||
|
|
||||||
|
|
||||||
|
class FlowUpdate(SQLModelSerializable):
|
||||||
|
name: Optional[str] = None
|
||||||
|
flow: Optional[Dict] = None
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue