Ana içeriğe geç

Veri modelleri

backend/app/models/__init__.py içindeki 25 SQLAlchemy modeli, Pydantic şemalarıyla tel şekilleriyle birlikte. Eşitleme yüzeyi 28 tablo içerir (25 model + 3 ilişki tablosu: project_subjects, project_tags, user_badges).

v0.7.0'dan itibaren olan ilk 14 model aşağıda ayrıntılı olarak belgelenmiştir; o tarihten bu yana eklenen 11 tanesi (Aşama 12+ içe aktarmalar, Aşama 22 konular/etiketler, Aşama 29-30 oyunlaştırma + anki, Aşama 32 notebooklm) en altta ad + tablo olarak listelenmiştir. Her modelin tam alanı için /api/openapi.json adresindeki OpenAPI spesifikasyonuna bakın.

User

Alan Tür Notlar
id string (UUID) Birincil anahtar
name string Gerekli
email string | null Ayarlandığında benzersiz, isteğe bağlı
language string Varsayılan "de"
created_at datetime (ISO 8601) Otomatik ayarlanır
updated_at datetime (ISO 8601) Otomatik güncellenir

İlişkiler: projects, curriculums, profiles, settings (1:1).

UserSettings

Alan Tür Notlar
id string (UUID) Birincil anahtar
user_id string (UUID) FK → User, benzersiz
language string Varsayılan "de"
active_provider enum AIProvider anthropic / openai / gemini, varsayılan anthropic
api_key_anthropic string | null Fernet şifreli; yalnızca arka uç
api_key_openai string | null Fernet şifreli; yalnızca arka uç
api_key_gemini string | null Fernet şifreli; yalnızca arka uç
model_override_anthropic string | null Varsayılan null (eklenti varsayılanını kullan)
model_override_openai string | null Varsayılan null
model_override_gemini string | null Varsayılan null

Tel şema (UserSettingsOut), üç api_key_* alanını has_<provider>_key: bool boolean'larıyla değiştirir — düz metin hiçbir zaman istemciye geri gitmez. v1.20.0 / Aşama 34'ten itibaren, tel şema ayrıca çözümleyicinin hangi katmanı seçtiğini bildiren key_source_<provider>: ApiKeySource enum'unu taşır (enum: env | secrets_yaml | settings | none).

LearningProject

Alan Tür Notlar
id string (UUID) Birincil anahtar
user_id string (UUID) FK → User
topic string Maks 500 karakter
goal string Metin, sınırsız
timeframe string Maks 100 karakter
daily_minutes integer Gerekli
current_problem string | null Metin, isteğe bağlı
active boolean Varsayılan true
created_at datetime
updated_at datetime

LearningProfile

Alan Tür Notlar
id string (UUID) Birincil anahtar
user_id string (UUID) FK → User
project_id string (UUID) FK → LearningProject
deductive float 0.0-1.0
inductive float 0.0-1.0
error_based float 0.0-1.0
dialogic float 0.0-1.0
contextual float 0.0-1.0
ai_adaptive float 0.0-1.0
assessed_at datetime
version integer Yeniden değerlendirmede artar

Tel şema, dominant_method ekler (hesaplanmış özellik, 6 ağırlık üzerinde argmax, alfabetik bağ kırma).

LearningSession

Alan Tür Notlar
id string (UUID) Birincil anahtar
project_id string (UUID) FK → LearningProject
method enum LearningMethod Altısından biri
started_at datetime Oluşturmada otomatik ayarlanır
ended_at datetime | null /end'de ayarlanır
cycle_step integer 1-7, varsayılan 1
status enum SessionStatus active / completed / abandoned

SessionMessage

Alan Tür Notlar
id string (UUID) Birincil anahtar
session_id string (UUID) FK → LearningSession
role enum MessageRole user / assistant / system
content string Metin, sınırsız
created_at datetime

SessionRating

Alan Tür Notlar
id string (UUID) Birincil anahtar
session_id string (UUID) FK → LearningSession
understanding integer 1-5
stress integer 1-5
method_fit integer 1-5
notes string | null İsteğe bağlı
created_at datetime

SessionNote

Alan Tür Notlar
id string (UUID) Birincil anahtar
session_id string (UUID) FK → LearningSession
content string Gerekli
created_at datetime

v0.7.0 arayüzü tarafından şu anda kullanılmıyor; gelecekteki bir aşamada satır içi not defteri özelliği için ayrılmış.

ProgressCommit

Alan Tür Notlar
id string (UUID) Birincil anahtar
project_id string (UUID) FK → LearningProject
session_id string (UUID) FK → LearningSession
method enum LearningMethod
understanding float 0.0-1.0 (1-5'ten yeniden ölçeklendirilmiş)
stress float 0.0-1.0
error_rate float 0.0-1.0, şu anda her zaman 0.0
duration_minutes integer ended_at - started_at'dan hesaplanır
committed_at datetime

Bir oturum puanlamayla sonlandırıldığında takip eklentisinin on_session_complete hookimpl'i tarafından yazılır.

StepEvaluation

Alan Tür Notlar
id string (UUID) Birincil anahtar
session_id string (UUID) FK → LearningSession
from_step integer Değerlendirmeden ÖNCE döngü adımı
to_step integer Değerlendirmeden SONRA (uygulanmadıysa = from_step)
advance boolean AI ilerlemeyi söyledi mi?
confidence float 0.0-1.0
applied boolean Öneri gerçekten uygulandı mı?
fallback_used boolean JSON ayrıştırması başarısız olursa True
reason string AI'nin insan tarafından okunabilir açıklaması
evaluated_at datetime

MethodSwitch

Alan Tür Notlar
id string (UUID) Birincil anahtar
project_id string (UUID) FK → LearningProject
from_method enum LearningMethod
to_method enum LearningMethod
reason string Kullanıcının geçişi neden kabul ettiği
switched_at datetime

Curriculum, LearningTopic, Lesson

Curriculum Tür Notlar
id UUID
user_id UUID FK
title, description, language string, string|null, string
LearningTopic Tür Notlar
id UUID
curriculum_id UUID FK
parent_id UUID | null Ağaç için öz-FK
title, description, order_index
Lesson Tür Notlar
id UUID
curriculum_id UUID FK
title, content, order_index

Enum'lar

class LearningMethod(str, Enum):
    DEDUCTIVE = "deductive"
    INDUCTIVE = "inductive"
    ERROR_BASED = "error_based"
    DIALOGIC = "dialogic"
    CONTEXTUAL = "contextual"
    AI_ADAPTIVE = "ai_adaptive"

class SessionStatus(str, Enum):
    ACTIVE = "active"
    COMPLETED = "completed"
    ABANDONED = "abandoned"

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

class AIProvider(str, Enum):
    ANTHROPIC = "anthropic"
    OPENAI = "openai"
    GEMINI = "gemini"

# v1.20.0 / Aşama 34'ten itibaren
class ApiKeySource(str, Enum):
    ENV = "env"
    SECRETS_YAML = "secrets_yaml"
    SETTINGS = "settings"
    NONE = "none"

# v0.9.0 / Aşama 12'den itibaren
class ImportedConversationSource(str, Enum):
    CHATGPT = "chatgpt"
    CLAUDE = "claude"
    GEMINI = "gemini"
    MANUAL = "manual"
    UNKNOWN = "unknown"

Tel formu, küçük harf dize değeridir (örn. "deductive", "DEDUCTIVE" değil).

v0.7.0 temelinden bu yana eklenen modeller (11)

Model Tablo Sürümden itibaren Amaç
ImportedConversation imported_conversations v0.9.0 İçe aktarılan tek bir sohbet (kaynak, başlık, analysis_result JSON)
ImportedMessage imported_messages v0.9.0 İçe aktarılan sohbette tek bir dönüş
Subject subjects v1.9.0 Global hiyerarşik taksonomi düğümü
Tag tags v1.9.0 Kullanıcı başına serbest metin etiketi
ProjectSubject project_subjects v1.9.0 M:N (LearningProject, Subject)
ProjectTag project_tags v1.9.0 M:N (LearningProject, Tag)
UserXP user_xp v1.16.0 Kullanıcı başına XP + seviye tekil
Badge badges v1.16.0 Rozet kataloğu (YAML'dan tohumlanmış)
UserBadge user_badges v1.16.0 Kazanılmış rozet kaydı (yalnızca ekleme)
UserStreak user_streaks v1.16.0 Seri durumu + dondurma + hafta sonu modu
AnkiCardSuggestion anki_card_suggestions v1.17.0 AI tarafından çıkarılan kart adayı
StudyQuestion study_questions v1.19.0 AI tarafından oluşturulan etkin hatırlama sorusu