Ir para o conteúdo

Modelos de dados

Os 25 modelos SQLAlchemy em backend/app/models/__init__.py, com os seus esquemas Pydantic na forma de transferência. A superfície de sincronização inclui 28 tabelas (os 25 modelos + 3 tabelas de associação: project_subjects, project_tags, user_badges).

Os 14 modelos originais do v0.7.0 estão documentados em detalhe abaixo; os 11 adicionados desde então (importações Phase 12+, assuntos/etiquetas Phase 22, gamificação + anki Phase 29-30, notebooklm Phase 32) são listados no final por nome + tabela. Consulte a especificação OpenAPI em /api/openapi.json para todos os campos de todos os modelos.

User

Campo Tipo Notas
id string (UUID) Chave primária
name string Obrigatório
email string | null Único quando definido, opcional
language string Padrão "de"
created_at datetime (ISO 8601) Definido automaticamente
updated_at datetime (ISO 8601) Atualizado automaticamente

Relações: projects, curriculums, profiles, settings (1:1).

UserSettings

Campo Tipo Notas
id string (UUID) Chave primária
user_id string (UUID) FK → User, único
language string Padrão "de"
active_provider enum AIProvider anthropic / openai / gemini, padrão anthropic
api_key_anthropic string | null Encriptado com Fernet; apenas backend
api_key_openai string | null Encriptado com Fernet; apenas backend
api_key_gemini string | null Encriptado com Fernet; apenas backend
model_override_anthropic string | null Padrão null (usar padrão do plugin)
model_override_openai string | null Padrão null
model_override_gemini string | null Padrão null

O esquema de transferência (UserSettingsOut) substitui os três campos api_key_* por booleanos has_<provider>_key: bool — texto simples nunca viaja de volta ao cliente. Desde v1.20.0 / Phase 34, o esquema de transferência também transporta key_source_<provider>: ApiKeySource (enum: env | secrets_yaml | settings | none) que indica qual camada o resolvedor escolheu.

LearningProject

Campo Tipo Notas
id string (UUID) Chave primária
user_id string (UUID) FK → User
topic string Máx. 500 caracteres
goal string Texto, ilimitado
timeframe string Máx. 100 caracteres
daily_minutes integer Obrigatório
current_problem string | null Texto, opcional
active boolean Padrão true
created_at datetime
updated_at datetime

LearningProfile

Campo Tipo Notas
id string (UUID) Chave primária
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 Incrementa na reavaliação

O esquema de transferência adiciona dominant_method (propriedade calculada, argmax sobre os 6 pesos, desempate alfabético).

LearningSession

Campo Tipo Notas
id string (UUID) Chave primária
project_id string (UUID) FK → LearningProject
method enum LearningMethod Um dos seis
started_at datetime Definido automaticamente na criação
ended_at datetime | null Definido em /end
cycle_step integer 1-7, padrão 1
status enum SessionStatus active / completed / abandoned

SessionMessage

Campo Tipo Notas
id string (UUID) Chave primária
session_id string (UUID) FK → LearningSession
role enum MessageRole user / assistant / system
content string Texto, ilimitado
created_at datetime

SessionRating

Campo Tipo Notas
id string (UUID) Chave primária
session_id string (UUID) FK → LearningSession
understanding integer 1-5
stress integer 1-5
method_fit integer 1-5
notes string | null Opcional
created_at datetime

SessionNote

Campo Tipo Notas
id string (UUID) Chave primária
session_id string (UUID) FK → LearningSession
content string Obrigatório
created_at datetime

Atualmente não utilizado pela interface do v0.7.0; reservado para uma funcionalidade de bloco de notas incorporado numa fase futura.

ProgressCommit

Campo Tipo Notas
id string (UUID) Chave primária
project_id string (UUID) FK → LearningProject
session_id string (UUID) FK → LearningSession
method enum LearningMethod
understanding float 0.0-1.0 (reescalado de 1-5)
stress float 0.0-1.0
error_rate float 0.0-1.0, atualmente sempre 0.0
duration_minutes integer Calculado a partir de ended_at - started_at
committed_at datetime

Escrito pelo hookimpl on_session_complete do plugin tracking quando uma sessão é encerrada com uma classificação.

StepEvaluation

Campo Tipo Notas
id string (UUID) Chave primária
session_id string (UUID) FK → LearningSession
from_step integer Passo do ciclo ANTES da avaliação
to_step integer Passo do ciclo APÓS (= from_step se não aplicado)
advance boolean A IA disse para avançar?
confidence float 0.0-1.0
applied boolean A sugestão foi realmente aplicada?
fallback_used boolean True se a análise JSON falhou
reason string Explicação legível da IA
evaluated_at datetime

MethodSwitch

Campo Tipo Notas
id string (UUID) Chave primária
project_id string (UUID) FK → LearningProject
from_method enum LearningMethod
to_method enum LearningMethod
reason string Porque o utilizador aceitou a mudança
switched_at datetime

Curriculum, LearningTopic, Lesson

Curriculum Tipo Notas
id UUID
user_id UUID FK
title, description, language string, string|null, string
LearningTopic Tipo Notas
id UUID
curriculum_id UUID FK
parent_id UUID | null Auto-FK para árvore
title, description, order_index
Lesson Tipo Notas
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"

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

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

A forma de transferência é o valor de string em minúsculas (por exemplo, "deductive", não "DEDUCTIVE").

Modelos adicionados desde a linha de base v0.7.0 (11)

Modelo Tabela Desde Finalidade
ImportedConversation imported_conversations v0.9.0 Uma conversa importada (fonte, título, JSON analysis_result)
ImportedMessage imported_messages v0.9.0 Um turno numa conversa importada
Subject subjects v1.9.0 Nó de taxonomia hierárquica global
Tag tags v1.9.0 Etiqueta de texto livre por utilizador
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 + nível singleton por utilizador
Badge badges v1.16.0 Catálogo de emblemas (semeado a partir de YAML)
UserBadge user_badges v1.16.0 Registo de emblema obtido (apenas anexar)
UserStreak user_streaks v1.16.0 Estado de sequência + congelamentos + modo fim de semana
AnkiCardSuggestion anki_card_suggestions v1.17.0 Candidato a cartão de flashcard extraído por IA
StudyQuestion study_questions v1.19.0 Pergunta de recordação ativa gerada por IA