from datetime import datetime, timezone from sqlalchemy import String, Text, DateTime, ForeignKey, Integer from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.database import Base class Session(Base): __tablename__ = "sessions" id: Mapped[str] = mapped_column(String, primary_key=True) title: Mapped[str] = mapped_column(String, default="New Chat") model: Mapped[str] = mapped_column(String, default="") created_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.now(timezone.utc)) updated_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.now(timezone.utc), onupdate=lambda: datetime.now(timezone.utc)) messages: Mapped[list["Message"]] = relationship(back_populates="session", cascade="all, delete-orphan", order_by="Message.created_at") memories: Mapped[list["Memory"]] = relationship(back_populates="session", cascade="all, delete-orphan") class Message(Base): __tablename__ = "messages" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) session_id: Mapped[str] = mapped_column(ForeignKey("sessions.id", ondelete="CASCADE")) role: Mapped[str] = mapped_column(String) # "user" | "assistant" | "system" content: Mapped[str] = mapped_column(Text) created_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.now(timezone.utc)) session: Mapped["Session"] = relationship(back_populates="messages") class Memory(Base): __tablename__ = "memories" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) session_id: Mapped[str] = mapped_column(ForeignKey("sessions.id", ondelete="CASCADE")) summary: Mapped[str] = mapped_column(Text) embedding_json: Mapped[str | None] = mapped_column(Text, nullable=True) # 将来のベクトル検索用 created_at: Mapped[datetime] = mapped_column(DateTime, default=lambda: datetime.now(timezone.utc)) session: Mapped["Session"] = relationship(back_populates="memories")