Todos los paquetes de código abierto
IASwift

educationai

Paquete Swift para apps de estudio: repetición espaciada FSRS-6, cola de estudio, comparación de respuestas escritas y cuestionarios.

2EstrellasÚltima versión: v2.0.0 · Actualizado: 15 de octubre de 2026
Plataformas:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

Licencia: MIT

Resumen

  • Lógica de aprendizaje para apps de flashcards: repetición espaciada FSRS-6, cola de estudio, calificación de respuestas escritas y cuestionarios.
  • Los tests reproducen 2.400 repasos de py-fsrs 6.3.2 en ocho configuraciones y comparan los resultados tras cada repaso.
  • SM2Scheduler mantiene operativos los datos SM-2 y convierte tarjetas SM-2 a FSRS conservando la fecha de vencimiento de cada tarjeta.
  • Se ejecuta en el dispositivo solo con Foundation, está pensado para Swift 6 strict concurrency y no contiene ninguna red neuronal.
  • 124 tests en 11 suites pasaron en la etiqueta v2.0.0 con Swift 6.4 en macOS 27.0.1.

EducationAI contiene la lógica de aprendizaje de una app de flashcards o de estudio. FSRSScheduler decide cuándo vuelve cada tarjeta con FSRS-6, el modelo de memoria detrás del planificador FSRS de Anki, y sus tests comparan 2.400 repeticiones con la implementación de referencia, py-fsrs 6.3.2. SM2Scheduler mantiene en funcionamiento los datos SM-2 y los convierte a FSRS. Alrededor del planificador hay una cola de estudio, la calificación de respuestas escritas con tolerancia a erratas, cuestionarios, un ajustador de dificultad, una previsión de carga de trabajo, estadísticas de repaso y rachas de estudio. Se ejecuta en el dispositivo, usa solo Foundation y está escrito para Swift 6 strict concurrency. No contiene ninguna red neuronal: FSRS es un modelo estadístico de la memoria.

Características

  • FSRS-6 verificado contra la referencia: los tests reproducen 2.400 repeticiones calculadas por py-fsrs 6.3.2 en ocho configuraciones y comparan estabilidad, dificultad, fecha de vencimiento y recuperabilidad tras cada repetición
  • Pasos de aprendizaje y reaprendizaje, retención deseada, intervalo máximo, fuzz de intervalos y pesos personalizados (21 de FSRS-6 o 19 de FSRS-5); una vista previa de las cuatro valoraciones para los botones de respuesta
  • SM-2 tal como se publicó y una conversión de tarjetas SM-2 a FSRS que conserva la fecha de vencimiento de cada tarjeta
  • Calificación de respuestas escritas que ignora mayúsculas, acentos, ancho de carácter y puntuación sin depender del idioma del dispositivo, perdona erratas según la longitud de la respuesta y hace un trabajo acotado ante entradas hostiles
  • Cuestionarios de opción múltiple y de respuesta escrita generados a partir de tarjetas; cada resultado sugiere una valoración para el planificador, y un cuestionario guardado se vuelve a calificar al cargarlo
  • Una cola de estudio con límites diarios, una previsión por día, estadísticas de retención, rachas contadas en los días naturales del estudiante y un ajustador de dificultad que mantiene la precisión dentro de una banda objetivo
  • Tipos de valor Sendable y Codable: cada función recibe la fecha con la que trabaja, la aleatoriedad procede de un generador que puede inicializar con una semilla, y los valores almacenados se comprueban antes de usarse en lugar de provocar un fallo
  • Sin dependencias, solo Foundation; referencia DocC con cuatro guías y la app de ejemplo StudyDeck para iOS y macOS

Inicio rápido

swift
1struct FlashcardsView: View {
2 @State private var cards = [
3 Flashcard(front: "Capital of Japan", back: "Tokyo"),
4 Flashcard(front: "Capital of Kenya", back: "Nairobi"),
5 Flashcard(front: "Capital of Peru", back: "Lima")
6 ]
7 @State private var showsAnswer = false
8 private let scheduler = FSRSScheduler.default
9 
10 var body: some View {
11 if let card = StudyQueue.cards(from: cards).first,
12 let index = cards.firstIndex(where: { $0.id == card.id }) {
13 VStack(spacing: 24) {
14 Text(card.front).font(.title)
15 if showsAnswer {
16 Text(card.back).font(.title2).bold()
17 HStack {
18 ForEach(Rating.allCases, id: \.self) { rating in
19 Button(String(describing: rating).capitalized) {
20 if let outcome = try? scheduler.review(card.review, rating: rating) {
21 cards[index].review = outcome.state
22 }
23 showsAnswer = false
24 }
25 .buttonStyle(.bordered)
26 }
27 }
28 } else {
29 Button("Show Answer") { showsAnswer = true }
30 .buttonStyle(.borderedProminent)
31 }
32 }
33 .padding()
34 } else {
35 Text("All done for now")
36 }
37 }
38}

Instalación

Xcode (File › Add Package Dependencies…)

text
1https://github.com/muhittincamdali/educationai.git

Swift Package Manager (Package.swift)

swift
1dependencies: [
2 .package(url: "https://github.com/muhittincamdali/educationai.git", from: "2.0.0")
3],
4targets: [
5 .target(name: "YourApp", dependencies: [
6 .product(name: "EducationAI", package: "educationai")
7 ])
8]

Capturas de pantalla

La pantalla de repaso de la app de ejemplo: la tarjeta Capital of Vietnam con su respuesta Hanoi, memoria al 90 % y cuatro botones de valoración con las etiquetas 10m Again, 1mo Hard, 2mo Good y 3mo Easy
Una pregunta de cuestionario de respuesta escrita, Capital of Morocco, respondida con Raba: el comentario dice Almost, se escribe Rabat con una errata, y la tarjeta se programa como Hard
La pantalla de progreso: una racha de 21 días, mejor racha 21, retención 91 %, 84 repasos y un gráfico de barras con las tarjetas que vencen cada uno de los próximos 14 días
La lista de mazos: cada capital con su país, cuándo vence y cuánto se recuerda ahora, por ejemplo Hanoi vence ahora al 90 %

Cronología

  1. Repositorio abierto; 1.0.0 etiquetada el 7 de agosto: una clase EducationAI con modelos de aprendizaje, dependiente de Alamofire, RxSwift, SnapKit y SDWebImage

  2. Reescrito sin dependencias como planificador SM-2 y motores de cuestionarios, progreso, recomendaciones y gamificación

  3. Se añadieron una dependencia a una carpeta local (../SwiftAI) y tipos de relleno «neural tutor» y «enterprise»; el paquete dejó de resolverse para cualquier otra persona

  4. 2.0.0: reconstruido en torno a un planificador FSRS-6 que coincide con py-fsrs 6.3.2; se eliminaron el código de junio y todos los tipos de 1.x

Enlaces

Artículo relacionado

Leer el artículo (English)