Μετάβαση στο περιεχόμενο

Μοντέλα δεδομένων

Τα 25 μοντέλα SQLAlchemy στο backend/app/models/__init__.py, με τα σχήματα Pydantic για τη μεταφορά δεδομένων. Η επιφάνεια συγχρονισμού περιλαμβάνει 28 πίνακες (τα 25 μοντέλα + 3 πίνακες σύνδεσης: project_subjects, project_tags, user_badges).

Τα 14 αρχικά μοντέλα της v0.7.0 τεκμηριώνονται λεπτομερώς παρακάτω· τα 11 που προστέθηκαν έκτοτε (Phase 12+ imports, Phase 22 subjects/tags, Phase 29-30 gamification + anki, Phase 32 notebooklm) αναφέρονται στο τέλος με ονομασία + πίνακα. Βλ. το OpenAPI spec στο /api/openapi.json για κάθε πεδίο κάθε μοντέλου.

User

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
name string Υποχρεωτικό
email string | null Μοναδικό όταν ορίζεται, προαιρετικό
language string Προεπιλογή "de"
created_at datetime (ISO 8601) Ορίζεται αυτόματα
updated_at datetime (ISO 8601) Ενημερώνεται αυτόματα

Σχέσεις: projects, curriculums, profiles, settings (1:1).

UserSettings

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
user_id string (UUID) FK → User, μοναδικό
language string Προεπιλογή "de"
active_provider enum AIProvider anthropic / openai / gemini, προεπιλογή anthropic
api_key_anthropic string | null Κρυπτογραφημένο με Fernet· μόνο για backend
api_key_openai string | null Κρυπτογραφημένο με Fernet· μόνο για backend
api_key_gemini string | null Κρυπτογραφημένο με Fernet· μόνο για backend
model_override_anthropic string | null Προεπιλογή null (χρήση προεπιλογής plugin)
model_override_openai string | null Προεπιλογή null
model_override_gemini string | null Προεπιλογή null

Το σχήμα μεταφοράς (UserSettingsOut) αντικαθιστά τα τρία πεδία api_key_* με booleans has_<provider>_key: bool — το απλό κείμενο δεν μεταφέρεται ποτέ πίσω στον client. Από την v1.20.0 / Phase 34, το σχήμα μεταφοράς φέρει επίσης key_source_<provider>: ApiKeySource (enum: env | secrets_yaml | settings | none) που αναφέρει ποιο επίπεδο επέλεξε ο resolver.

LearningProject

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
user_id string (UUID) FK → User
topic string Έως 500 χαρακτήρες
goal string Κείμενο, απεριόριστο
timeframe string Έως 100 χαρακτήρες
daily_minutes integer Υποχρεωτικό
current_problem string | null Κείμενο, προαιρετικό
active boolean Προεπιλογή true
created_at datetime
updated_at datetime

LearningProfile

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
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 Αυξάνεται κατά την επαναξιολόγηση

Το σχήμα μεταφοράς προσθέτει dominant_method (υπολογιζόμενη ιδιότητα, argmax επί των 6 βαρών, αλφαβητική σειρά σε ισοπαλία).

LearningSession

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
project_id string (UUID) FK → LearningProject
method enum LearningMethod Μία από τις έξι
started_at datetime Ορίζεται αυτόματα κατά τη δημιουργία
ended_at datetime | null Ορίζεται κατά το /end
cycle_step integer 1-7, προεπιλογή 1
status enum SessionStatus active / completed / abandoned

SessionMessage

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
session_id string (UUID) FK → LearningSession
role enum MessageRole user / assistant / system
content string Κείμενο, απεριόριστο
created_at datetime

SessionRating

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
session_id string (UUID) FK → LearningSession
understanding integer 1-5
stress integer 1-5
method_fit integer 1-5
notes string | null Προαιρετικό
created_at datetime

SessionNote

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
session_id string (UUID) FK → LearningSession
content string Υποχρεωτικό
created_at datetime

Προς το παρόν δεν χρησιμοποιείται από το UI της v0.7.0· διατηρείται για μελλοντική δυνατότητα ενσωματωμένου σημειωματάριου.

ProgressCommit

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
project_id string (UUID) FK → LearningProject
session_id string (UUID) FK → LearningSession
method enum LearningMethod
understanding float 0.0-1.0 (αναλλοίωτα από 1-5)
stress float 0.0-1.0
error_rate float 0.0-1.0, προς το παρόν πάντα 0.0
duration_minutes integer Υπολογίζεται από ended_at - started_at
committed_at datetime

Γράφεται από το hookimpl on_session_complete του tracking plugin όταν μια συνεδρία τελειώνει με αξιολόγηση.

StepEvaluation

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
session_id string (UUID) FK → LearningSession
from_step integer Βήμα κύκλου ΠΡΙΝ την αξιολόγηση
to_step integer Βήμα κύκλου ΜΕΤΑ (= from_step αν δεν εφαρμόστηκε)
advance boolean Η ΤΝ είπε να προχωρήσει;
confidence float 0.0-1.0
applied boolean Εφαρμόστηκε τελικά η πρόταση;
fallback_used boolean True αν η ανάλυση JSON απέτυχε
reason string Αναγνώσιμη εξήγηση από την ΤΝ
evaluated_at datetime

MethodSwitch

Πεδίο Τύπος Σημειώσεις
id string (UUID) Πρωτεύον κλειδί
project_id string (UUID) FK → LearningProject
from_method enum LearningMethod
to_method enum LearningMethod
reason string Γιατί ο χρήστης αποδέχτηκε την αλλαγή
switched_at datetime

Curriculum, LearningTopic, Lesson

Curriculum Τύπος Σημειώσεις
id UUID
user_id UUID FK
title, description, language string, string|null, string
LearningTopic Τύπος Σημειώσεις
id UUID
curriculum_id UUID FK
parent_id UUID | null Self-FK για δέντρο
title, description, order_index
Lesson Τύπος Σημειώσεις
id UUID
curriculum_id UUID FK
title, content, order_index

Enums

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"

# Since v1.20.0 / Phase 34
class ApiKeySource(str, Enum):
    ENV = "env"
    SECRETS_YAML = "secrets_yaml"
    SETTINGS = "settings"
    NONE = "none"

# Since v0.9.0 / Phase 12
class ImportedConversationSource(str, Enum):
    CHATGPT = "chatgpt"
    CLAUDE = "claude"
    GEMINI = "gemini"
    MANUAL = "manual"
    UNKNOWN = "unknown"

Η μορφή μεταφοράς είναι η τιμή συμβολοσειράς πεζών γραμμάτων (π.χ. "deductive", όχι "DEDUCTIVE").

Μοντέλα που προστέθηκαν μετά τη βάση v0.7.0 (11)

Μοντέλο Πίνακας Από Σκοπός
ImportedConversation imported_conversations v0.9.0 Μία εισαγόμενη συνομιλία (πηγή, τίτλος, analysis_result JSON)
ImportedMessage imported_messages v0.9.0 Μία σειρά σε εισαγόμενη συνομιλία
Subject subjects v1.9.0 Κόμβος παγκόσμιας ιεραρχικής ταξινόμησης
Tag tags v1.9.0 Ετικέτα ελεύθερου κειμένου ανά χρήστη
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 XP + singleton επιπέδου ανά χρήστη
Badge badges v1.16.0 Κατάλογος badge (σπαρμένος από YAML)
UserBadge user_badges v1.16.0 Εγγραφή κερδισμένου badge (μόνο προσθήκη)
UserStreak user_streaks v1.16.0 Κατάσταση streak + παγώματα + λειτουργία Σαββατοκύριακου
AnkiCardSuggestion anki_card_suggestions v1.17.0 Υποψήφια κάρτα flashcard που εξήχθη από ΤΝ
StudyQuestion study_questions v1.19.0 Ερώτηση ενεργής ανάκλησης που δημιουργήθηκε από ΤΝ