File size: 3,731 Bytes
65ed8c3 | 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | """
ORBIT – SQLAlchemy Models
Tables: User, UserSettings
"""
from datetime import datetime
from extensions import db
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
google_id = db.Column(db.String(128), unique=True, nullable=False, index=True)
email = db.Column(db.String(254), unique=True, nullable=False)
name = db.Column(db.String(200), nullable=False)
picture = db.Column(db.String(1000), default="")
created_at = db.Column(db.DateTime, default=datetime.utcnow)
last_login = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationship
settings = db.relationship("UserSettings", back_populates="user", uselist=False, cascade="all, delete-orphan")
sessions = db.relationship("ChatSession", back_populates="user", cascade="all, delete-orphan")
def to_dict(self):
return {
"id": self.id,
"email": self.email,
"name": self.name,
"picture": self.picture,
}
class UserSettings(db.Model):
__tablename__ = "user_settings"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), unique=True, nullable=False)
# Active provider & endpoint
provider = db.Column(db.String(64), default="OpenRouter")
base_url = db.Column(db.String(512), default="https://openrouter.ai/api/v1/chat/completions")
api_key = db.Column(db.String(512), default="")
current_model = db.Column(db.String(256), default="baidu/cobuddy:free")
# Per-provider model libraries (JSON arrays)
models_openrouter = db.Column(db.JSON, nullable=False, default=list)
models_nvidia = db.Column(db.JSON, nullable=False, default=list)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationship
user = db.relationship("User", back_populates="settings")
def active_models(self):
"""Return the model list for the currently selected provider."""
if self.provider == "Nvidia NIM":
return self.models_nvidia or []
return self.models_openrouter or []
def to_dict(self, mask_key: bool = False):
key = self.api_key or ""
if mask_key and key:
key = key[:8] + "…" + key[-4:]
return {
"provider": self.provider,
"base_url": self.base_url,
"api_key": key,
"current_model": self.current_model,
"models_openrouter": self.models_openrouter or [],
"models_nvidia": self.models_nvidia or [],
"active_models": self.active_models(),
}
class ChatSession(db.Model):
__tablename__ = "chat_session"
id = db.Column(db.String(36), primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
title = db.Column(db.String(255), default="New Chat")
messages = db.Column(db.JSON, nullable=False, default=list)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationship
user = db.relationship("User", back_populates="sessions")
def to_dict(self):
return {
"id": self.id,
"title": self.title,
"messages": self.messages or [],
"created_at": self.created_at.isoformat() if self.created_at else None,
"updated_at": self.updated_at.isoformat() if self.updated_at else None,
}
|