SuZeAI
feat: add token usage tracking for AI recommendations and subscription management
ff5991d
Raw
History Blame Contribute Delete
1.77 kB
from sqlalchemy import Column, String, DateTime, func, ForeignKey, Text, Integer
from sqlalchemy.dialects.postgresql import UUID, ARRAY
from app.core.database import Base
import uuid
class Conversation(Base):
"""Một cuộc trò chuyện (session) với AI Stylist."""
__tablename__ = "chat_conversations"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
title = Column(String(120), nullable=False, default="Cuộc trò chuyện mới")
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
class ChatMessage(Base):
"""Một tin nhắn trong lịch sử trò chuyện với AI Stylist."""
__tablename__ = "chat_messages"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
conversation_id = Column(
UUID(as_uuid=True), ForeignKey("chat_conversations.id", ondelete="CASCADE"), nullable=True
)
role = Column(String(10), nullable=False) # "user" | "ai"
content = Column(Text, nullable=False)
# Với tin nhắn "ai" là gợi ý phối đồ: các ID sản phẩm được chọn (để dựng lại thumbnail).
selected_item_ids = Column(ARRAY(UUID(as_uuid=True)), nullable=True)
# Số token LLM tiêu tốn cho tin nhắn "ai" này (dùng để tính quota trợ lý AI theo token).
tokens_used = Column(Integer, nullable=False, server_default="0", default=0)
created_at = Column(DateTime(timezone=True), server_default=func.now())