Tous les paquets open source
IASwift

educationai

Package Swift pour les apps d'étude : répétition espacée FSRS-6, file d'étude, comparaison des réponses saisies et quiz.

2ÉtoilesDernière version: v2.0.0 · Mis à jour: 15 octobre 2026
Plateformes:iOS 17macOS 14tvOS 17watchOS 10visionOS 1

Licence: MIT

Résumé

  • Logique d'apprentissage pour les apps de flashcards : répétition espacée FSRS-6, file d'étude, notation des réponses saisies et quiz.
  • Les tests rejouent 2 400 révisions issues de py-fsrs 6.3.2 sur huit configurations et comparent les résultats après chaque révision.
  • SM2Scheduler garde les données SM-2 utilisables et convertit les cartes SM-2 en FSRS en conservant la date d'échéance de chaque carte.
  • Il s'exécute sur l'appareil avec Foundation uniquement, vise la strict concurrency de Swift 6 et ne contient aucun réseau de neurones.
  • 124 tests répartis en 11 suites sont passés au tag v2.0.0 avec Swift 6.4 sur macOS 27.0.1.

EducationAI porte la logique d'apprentissage d'une app de flashcards ou d'étude. FSRSScheduler décide quand chaque carte revient grâce à FSRS-6, le modèle de mémoire derrière le planificateur FSRS d'Anki, et ses tests comparent 2 400 révisions à l'implémentation de référence, py-fsrs 6.3.2. SM2Scheduler maintient les données SM-2 en état de marche et les convertit en FSRS. Autour du planificateur se trouvent une file d'étude, la notation des réponses saisies avec tolérance aux fautes de frappe, des quiz, un ajusteur de difficulté, une prévision de charge de travail, des statistiques de révision et des séries d'étude. Il s'exécute sur l'appareil, n'utilise que Foundation et est écrit pour Swift 6 strict concurrency. Il ne contient aucun réseau de neurones : FSRS est un modèle statistique de la mémoire.

Fonctionnalités

  • FSRS-6 vérifié par rapport à la référence : les tests rejouent 2 400 révisions calculées par py-fsrs 6.3.2 sur huit configurations et comparent stabilité, difficulté, échéance et récupérabilité après chaque révision
  • Étapes d'apprentissage et de réapprentissage, rétention souhaitée, intervalle maximal, fuzz d'intervalle et poids personnalisés (21 de FSRS-6 ou 19 de FSRS-5) ; un aperçu des quatre évaluations pour les boutons de réponse
  • SM-2 tel que publié, et une conversion des cartes SM-2 en FSRS qui conserve l'échéance de chaque carte
  • Notation des réponses saisies qui ignore la casse, les accents, la largeur des caractères et la ponctuation sans dépendre de la langue de l'appareil, pardonne les fautes de frappe selon la longueur de la réponse et fournit un travail borné face à des entrées hostiles
  • Quiz à choix multiples et à réponse saisie construits à partir des cartes ; chaque résultat suggère une évaluation pour le planificateur, et un quiz enregistré est noté à nouveau lorsqu'il est chargé
  • Une file d'étude avec limites quotidiennes, une prévision par jour, des statistiques de rétention, des séries comptées en jours calendaires de l'apprenant et un ajusteur de difficulté qui maintient la précision dans une plage cible
  • Types valeur Sendable et Codable : chaque fonction reçoit la date avec laquelle elle travaille, l'aléatoire provient d'un générateur que vous pouvez initialiser avec une graine, et les valeurs stockées sont vérifiées avant usage au lieu de provoquer un plantage
  • Aucune dépendance, uniquement Foundation ; référence DocC avec quatre guides et l'app d'exemple StudyDeck pour iOS et macOS

Démarrage rapide

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}

Installation

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]

Captures d'écran

L'écran de révision de l'app d'exemple : la carte Capital of Vietnam avec sa réponse Hanoi, mémoire à 90 % et quatre boutons d'évaluation intitulés 10m Again, 1mo Hard, 2mo Good et 3mo Easy
Une question de quiz à réponse saisie, Capital of Morocco, avec la réponse Raba : le retour indique Almost, cela s'écrit Rabat avec une faute de frappe, et la carte est planifiée comme Hard
L'écran de progression : une série de 21 jours, meilleure série 21, rétention 91 %, 84 révisions et un histogramme des cartes à réviser chacun des 14 prochains jours
La liste des paquets : chaque capitale avec son pays, son échéance et son niveau de mémorisation actuel, par exemple Hanoi à réviser maintenant à 90 %

Chronologie

  1. Dépôt ouvert ; 1.0.0 étiquetée le 7 août : une classe EducationAI avec des modèles d'apprentissage, dépendant d'Alamofire, RxSwift, SnapKit et SDWebImage

  2. Réécrit sans dépendances sous forme de planificateur SM-2 et de moteurs de quiz, de progression, de recommandation et de ludification

  3. Une dépendance vers un dossier local (../SwiftAI) et des types fictifs « neural tutor » et « enterprise » ont été ajoutés ; le package ne se résolvait plus pour personne d'autre

  4. 2.0.0 : reconstruit autour d'un planificateur FSRS-6 conforme à py-fsrs 6.3.2 ; le code de juin et tous les types de la 1.x supprimés

Liens

Article associé

Lire l'article (English)