| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | # defines how core data types in autogenstudio are serialized and stored in the database | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from datetime import datetime | 
					
						
							|  |  |  | from enum import Enum | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | from typing import List, Optional, Tuple, Type, Union | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | from uuid import UUID, uuid4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | from loguru import logger | 
					
						
							|  |  |  | from pydantic import BaseModel | 
					
						
							|  |  |  | from sqlalchemy import ForeignKey, Integer, UniqueConstraint | 
					
						
							|  |  |  | from sqlmodel import JSON, Column, DateTime, Field, Relationship, SQLModel, func | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .types import AgentConfig, MessageConfig, MessageMeta, ModelConfig, TeamConfig, TeamResult, ToolConfig | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | # added for python3.11 and sqlmodel 0.0.22 incompatibility | 
					
						
							|  |  |  | if hasattr(SQLModel, "model_config"): | 
					
						
							|  |  |  |     SQLModel.model_config["protected_namespaces"] = () | 
					
						
							|  |  |  | elif hasattr(SQLModel, "Config"): | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     class CustomSQLModel(SQLModel): | 
					
						
							|  |  |  |         class Config: | 
					
						
							|  |  |  |             protected_namespaces = () | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SQLModel = CustomSQLModel | 
					
						
							|  |  |  | else: | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     logger.warning("Unable to set protected_namespaces.") | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | # pylint: disable=protected-access | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ComponentTypes(Enum): | 
					
						
							|  |  |  |     TEAM = "team" | 
					
						
							|  |  |  |     AGENT = "agent" | 
					
						
							|  |  |  |     MODEL = "model" | 
					
						
							|  |  |  |     TOOL = "tool" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def model_class(self) -> Type[SQLModel]: | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             ComponentTypes.TEAM: Team, | 
					
						
							|  |  |  |             ComponentTypes.AGENT: Agent, | 
					
						
							|  |  |  |             ComponentTypes.MODEL: Model, | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |             ComponentTypes.TOOL: Tool, | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |         }[self] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class LinkTypes(Enum): | 
					
						
							|  |  |  |     AGENT_MODEL = "agent_model" | 
					
						
							|  |  |  |     AGENT_TOOL = "agent_tool" | 
					
						
							|  |  |  |     TEAM_AGENT = "team_agent" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     # type: ignore | 
					
						
							|  |  |  |     def link_config(self) -> Tuple[Type[SQLModel], Type[SQLModel], Type[SQLModel]]: | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             LinkTypes.AGENT_MODEL: (Agent, Model, AgentModelLink), | 
					
						
							|  |  |  |             LinkTypes.AGENT_TOOL: (Agent, Tool, AgentToolLink), | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |             LinkTypes.TEAM_AGENT: (Team, Agent, TeamAgentLink), | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |         }[self] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def primary_class(self) -> Type[SQLModel]:  # type: ignore | 
					
						
							|  |  |  |         return self.link_config[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def secondary_class(self) -> Type[SQLModel]:  # type: ignore | 
					
						
							|  |  |  |         return self.link_config[1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def link_table(self) -> Type[SQLModel]:  # type: ignore | 
					
						
							|  |  |  |         return self.link_config[2] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # link models | 
					
						
							|  |  |  | class AgentToolLink(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = ( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         UniqueConstraint("agent_id", "sequence", name="unique_agent_tool_sequence"), | 
					
						
							|  |  |  |         {"sqlite_autoincrement": True}, | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agent_id: int = Field(default=None, primary_key=True, foreign_key="agent.id") | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     tool_id: int = Field(default=None, primary_key=True, foreign_key="tool.id") | 
					
						
							|  |  |  |     sequence: Optional[int] = Field(default=0, primary_key=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AgentModelLink(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = ( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         UniqueConstraint("agent_id", "sequence", name="unique_agent_tool_sequence"), | 
					
						
							|  |  |  |         {"sqlite_autoincrement": True}, | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agent_id: int = Field(default=None, primary_key=True, foreign_key="agent.id") | 
					
						
							|  |  |  |     model_id: int = Field(default=None, primary_key=True, foreign_key="model.id") | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     sequence: Optional[int] = Field(default=0, primary_key=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TeamAgentLink(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = ( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         UniqueConstraint("agent_id", "sequence", name="unique_agent_tool_sequence"), | 
					
						
							|  |  |  |         {"sqlite_autoincrement": True}, | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     team_id: int = Field(default=None, primary_key=True, foreign_key="team.id") | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agent_id: int = Field(default=None, primary_key=True, foreign_key="agent.id") | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     sequence: Optional[int] = Field(default=0, primary_key=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | # database models | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Tool(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-12-16 13:17:42 -08:00
										 |  |  |     config: Union[ToolConfig, dict] = Field(sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agents: List["Agent"] = Relationship(back_populates="tools", link_model=AgentToolLink) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Model(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-12-16 13:17:42 -08:00
										 |  |  |     config: Union[ModelConfig, dict] = Field(sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agents: List["Agent"] = Relationship(back_populates="models", link_model=AgentModelLink) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Team(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-12-16 13:17:42 -08:00
										 |  |  |     config: Union[TeamConfig, dict] = Field(sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     agents: List["Agent"] = Relationship(back_populates="teams", link_model=TeamAgentLink) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Agent(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-12-16 13:17:42 -08:00
										 |  |  |     config: Union[AgentConfig, dict] = Field(sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     tools: List[Tool] = Relationship(back_populates="agents", link_model=AgentToolLink) | 
					
						
							|  |  |  |     models: List[Model] = Relationship(back_populates="agents", link_model=AgentModelLink) | 
					
						
							|  |  |  |     teams: List[Team] = Relationship(back_populates="agents", link_model=TeamAgentLink) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Message(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     config: Union[MessageConfig, dict] = Field(default_factory=MessageConfig, sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     session_id: Optional[int] = Field( | 
					
						
							|  |  |  |         default=None, sa_column=Column(Integer, ForeignKey("session.id", ondelete="CASCADE")) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     run_id: Optional[UUID] = Field(default=None, foreign_key="run.id") | 
					
						
							|  |  |  |     message_meta: Optional[Union[MessageMeta, dict]] = Field(default={}, sa_column=Column(JSON)) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Session(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     )  # pylint: disable=not-callable | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							|  |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     team_id: Optional[int] = Field(default=None, sa_column=Column(Integer, ForeignKey("team.id", ondelete="CASCADE"))) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     name: Optional[str] = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RunStatus(str, Enum): | 
					
						
							|  |  |  |     CREATED = "created" | 
					
						
							|  |  |  |     ACTIVE = "active" | 
					
						
							|  |  |  |     COMPLETE = "complete" | 
					
						
							|  |  |  |     ERROR = "error" | 
					
						
							|  |  |  |     STOPPED = "stopped" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Run(SQLModel, table=True): | 
					
						
							|  |  |  |     """Represents a single execution run within a session""" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     id: UUID = Field(default_factory=uuid4, primary_key=True, index=True) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     created_at: datetime = Field( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         default_factory=datetime.now, sa_column=Column(DateTime(timezone=True), server_default=func.now()) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         default_factory=datetime.now, sa_column=Column(DateTime(timezone=True), onupdate=func.now()) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     session_id: Optional[int] = Field( | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |         default=None, sa_column=Column(Integer, ForeignKey("session.id", ondelete="CASCADE"), nullable=False) | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     status: RunStatus = Field(default=RunStatus.CREATED) | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Store the original user task | 
					
						
							|  |  |  |     task: Union[MessageConfig, dict] = Field(default_factory=MessageConfig, sa_column=Column(JSON)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Store TeamResult which contains TaskResult | 
					
						
							|  |  |  |     team_result: Union[TeamResult, dict] = Field(default=None, sa_column=Column(JSON)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     error_message: Optional[str] = None | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							|  |  |  |     messages: Union[List[Message], List[dict]] = Field(default_factory=list, sa_column=Column(JSON)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Config: | 
					
						
							|  |  |  |         json_encoders = {UUID: str, datetime: lambda v: v.isoformat()} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class GalleryConfig(SQLModel, table=False): | 
					
						
							|  |  |  |     id: UUID = Field(default_factory=uuid4, primary_key=True, index=True) | 
					
						
							|  |  |  |     title: Optional[str] = None | 
					
						
							|  |  |  |     description: Optional[str] = None | 
					
						
							|  |  |  |     run: Run | 
					
						
							|  |  |  |     team: TeamConfig = None | 
					
						
							|  |  |  |     tags: Optional[List[str]] = None | 
					
						
							|  |  |  |     visibility: str = "public"  # public, private, shared | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     class Config: | 
					
						
							|  |  |  |         json_encoders = {UUID: str, datetime: lambda v: v.isoformat()} | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Gallery(SQLModel, table=True): | 
					
						
							|  |  |  |     __table_args__ = {"sqlite_autoincrement": True} | 
					
						
							|  |  |  |     id: Optional[int] = Field(default=None, primary_key=True) | 
					
						
							|  |  |  |     created_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), server_default=func.now()), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     updated_at: datetime = Field( | 
					
						
							|  |  |  |         default_factory=datetime.now, | 
					
						
							|  |  |  |         sa_column=Column(DateTime(timezone=True), onupdate=func.now()), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     user_id: Optional[str] = None | 
					
						
							| 
									
										
										
										
											2024-11-09 14:32:24 -08:00
										 |  |  |     version: Optional[str] = "0.0.1" | 
					
						
							| 
									
										
										
										
											2024-11-26 15:39:36 -08:00
										 |  |  |     config: Union[GalleryConfig, dict] = Field(default_factory=GalleryConfig, sa_column=Column(JSON)) |