File size: 1,477 Bytes
edda8af
ad4369d
edda8af
 
 
 
ad4369d
edda8af
 
 
 
ad4369d
 
 
edda8af
 
 
 
 
 
 
 
 
 
 
 
 
ad4369d
 
edda8af
 
 
 
 
 
ae7bbe9
edda8af
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from sqlmodel import Field, SQLModel, Relationship
from datetime import datetime, timezone
from typing import Optional, List, TYPE_CHECKING
import uuid
from sqlalchemy import Text
from enum import Enum


if TYPE_CHECKING:
    from src.api.models.user import User

def utc_now() -> datetime:
    return datetime.now(timezone.utc).replace(tzinfo=None)

class ChatMessageRole(str, Enum):
    USER = "user"
    ASSISTANT = "assistant"
    SYSTEM = "system"

class ChatSession(SQLModel, table=True):
    __tablename__ = "chat_sessions"
    id: Optional[uuid.UUID] = Field(default_factory=uuid.uuid4, primary_key=True)
    title: str = Field(nullable=False)
    user_id: Optional[int] = Field(default=None, foreign_key="users.id", nullable=True)
    user: Optional["User"] = Relationship(back_populates="sessions")
    messages: List["ChatMessage"] = Relationship(back_populates="session", cascade_delete=True)
    is_active: bool = Field(default=True)
    created_at: datetime = Field(default_factory=utc_now)
    updated_at: datetime = Field(default_factory=utc_now)

class ChatMessage(SQLModel, table=True):
    __tablename__ = "chat_messages"
    id: Optional[int] = Field(default=None, primary_key=True)
    content: str = Field(sa_type=Text)
    role: ChatMessageRole = Field(index=True)
    timestamp: datetime = Field(default_factory=utc_now)
    session_id: uuid.UUID = Field(foreign_key="chat_sessions.id")
    session: ChatSession = Relationship(back_populates="messages")