# File: backend/app/db/models.py (New - Database models) # Description: SQLAlchemy ORM 模型定义 from sqlalchemy import Column, String, Float, ForeignKey, Text, DateTime, Integer from sqlalchemy.orm import relationship from sqlalchemy.sql import func # For default timestamps from app.db.database import Base import uuid from datetime import datetime, timezone def generate_uuid(): return str(uuid.uuid4()) class AssistantModel(Base): __tablename__ = "assistants" id = Column(String, primary_key=True, default=generate_uuid) name = Column(String(50), nullable=False, index=True) description = Column(String(200), nullable=True) avatar = Column(String(5), nullable=True) system_prompt = Column(Text, nullable=False) model = Column(String, nullable=False) temperature = Column(Float, nullable=False, default=0.7) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) sessions = relationship("SessionModel", back_populates="assistant", cascade="all, delete-orphan") class SessionModel(Base): __tablename__ = "sessions" id = Column(String, primary_key=True, default=generate_uuid) title = Column(String(100), nullable=False, default="New Chat") assistant_id = Column(String, ForeignKey("assistants.id"), nullable=False, index=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now(), index=True) # Index for sorting assistant = relationship("AssistantModel", back_populates="sessions") messages = relationship("MessageModel", back_populates="session", cascade="all, delete-orphan", order_by="MessageModel.created_at") # Order messages by time class MessageModel(Base): __tablename__ = "messages" id = Column(String, primary_key=True, default=generate_uuid) session_id = Column(String, ForeignKey("sessions.id"), nullable=False, index=True) sender = Column(String(10), nullable=False) # 'user' or 'ai' or 'system' text = Column(Text, nullable=False) order = Column(Integer, nullable=False) # Explicit order within session created_at = Column(DateTime(timezone=True), server_default=func.now()) session = relationship("SessionModel", back_populates="messages")