Fusionner paquets flashcards
Fusionnez deux paquets de cartes sans questions répétées : un paquet avec photosynthèse et mitose plus un autre avec mitose et méiose donnent 3 cartes, et la première carte mitose garde sa réponse. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Les applications d'étude, les exports LMS et les dumps CSV façon Anki vous laissent souvent avec deux paquets qui se chevauchent et partagent le même énoncé sur de nombreuses cartes. Les coller à la main invite des doublons silencieux qui gaspillent le temps de révision et faussent la planification de la répétition espacée. Cet outil de fusion de paquets de flashcards accepte deux paquets comme tableaux de paires recto et verso, parcourt le paquet A puis le B, et renvoie une seule liste ordonnée où chaque recto exact n'apparaît qu'une fois : la première occurrence l'emporte et conserve son verso d'origine.
Comment fonctionnent la fusion et la déduplication par le recto seul
Ici une flashcard est une simple paire : une chaîne front (l'énoncé ou la question) et une chaîne back (la réponse ou la définition). Pour chaque carte il demande si la chaîne exacte du recto a déjà été conservée ; sinon la carte est ajoutée avec son verso inchangé et le recto est enregistré comme vu.
Exact signifie une égalité caractère par caractère : espaces en tête ou en fin, capitalisation différente ou ponctuation différente créent des rectos distincts, volontairement, pour que les quasi-correspondances restent visibles pour une revue humaine au lieu d'être fusionnées en silence. Lorsque le même recto réapparaît plus tard —dans le même paquet ou dans le second— la carte ultérieure est entièrement ignorée, y compris un verso différent.
Les compteurs de la réponse indiquent combien de cartes chaque entrée contenait, combien ont survécu et combien ont été retirées comme doublons de recto, afin que vous puissiez journaliser l'écart sans rescanner les tableaux.
Cas d’usage
Nettoyage d'exports Anki et LMS
Unissez deux exports de vocabulaire ou de quiz et supprimez les rectos en double exacts avant de réimporter dans un logiciel de répétition espacée.
Réconciliation nocturne de packs de programme
Automatisez les fusions de packs d'étude partenaires en ETL avec des compteurs déterministes et sans facturation sur les erreurs de validation de paquet vide.
Questions fréquentes
Que se passe-t-il si l'un des paquets est vide ?
Les deux paquets doivent contenir au moins une carte pour que les fusions vides ne soient jamais traitées comme un succès et ne soient pas facturées.
La détection des doublons tient-elle compte de la casse ?
Oui. Les rectos sont comparés avec une égalité exacte de chaîne, donc une capitalisation ou un espacement différent compte comme une carte distincte et est conservé.
Quel verso est conservé lorsque le même recto apparaît deux fois ?
Les cartes ultérieures avec ce recto sont entièrement écartées.
Les doublons à l'intérieur d'un même paquet sont-ils aussi supprimés ?
Oui. Toute carte dont le recto a déjà été conservé est ignorée, que la copie précédente se trouve dans le premier paquet ou plus haut dans le second. Les compteurs indiquent combien ont été retirées.
Quel paquet faut-il placer en premier ?
Celui dont la formulation vous inspire confiance, comme votre propre paquet relu, avec l'import en masse en second. La première apparition de chaque recto l'emporte : le premier paquet décide donc de la réponse conservée.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/edu/flashcard-deck-merge \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"deck_a":[{"front":"What is photosynthesis?","back":"Plants turning light into chemical energy."},{"front":"What is mitosis?","back":"Division into two identical cells."}],"deck_b":[{"front":"What is mitosis?","back":"Duplicate front: dropped, deck_a wins."},{"front":"What is meiosis?","back":"Division into four distinct gametes."}]}'const res = await fetch("https://api.kit.forhosting.com/edu/flashcard-deck-merge", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"deck_a": [
{
"front": "What is photosynthesis?",
"back": "Plants turning light into chemical energy."
},
{
"front": "What is mitosis?",
"back": "Division into two identical cells."
}
],
"deck_b": [
{
"front": "What is mitosis?",
"back": "Duplicate front: dropped, deck_a wins."
},
{
"front": "What is meiosis?",
"back": "Division into four distinct gametes."
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/flashcard-deck-merge",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"deck_a": [
{
"front": "What is photosynthesis?",
"back": "Plants turning light into chemical energy."
},
{
"front": "What is mitosis?",
"back": "Division into two identical cells."
}
],
"deck_b": [
{
"front": "What is mitosis?",
"back": "Duplicate front: dropped, deck_a wins."
},
{
"front": "What is meiosis?",
"back": "Division into four distinct gametes."
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/flashcard-deck-merge", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"deck_a":[{"front":"What is photosynthesis?","back":"Plants turning light into chemical energy."},{"front":"What is mitosis?","back":"Division into two identical cells."}],"deck_b":[{"front":"What is mitosis?","back":"Duplicate front: dropped, deck_a wins."},{"front":"What is meiosis?","back":"Division into four distinct gametes."}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"deck_a":[{"front":"What is photosynthesis?","back":"Plants turning light into chemical energy."},{"front":"What is mitosis?","back":"Division into two identical cells."}],"deck_b":[{"front":"What is mitosis?","back":"Duplicate front: dropped, deck_a wins."},{"front":"What is meiosis?","back":"Division into four distinct gametes."}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/flashcard-deck-merge", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"deck_a": [
{
"front": "What is photosynthesis?",
"back": "Plants turning light into chemical energy."
},
{
"front": "What is mitosis?",
"back": "Division into two identical cells."
}
],
"deck_b": [
{
"front": "What is mitosis?",
"back": "Duplicate front: dropped, deck_a wins."
},
{
"front": "What is meiosis?",
"back": "Division into four distinct gametes."
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.flashcard_deck_merge",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Tout paquet vide est rejeté avec invalid_input afin que l'automatisation ne prétende jamais qu'une fusion vide a réussi.
Comment fonctionnent la fusion et la déduplication par le recto seul
Le fusionneur concatène deck_a dans l'ordre puis deck_b, et construit le résultat en un seul passage sur cette séquence combinée. Cette règle du premier qui gagne correspond à la façon dont la plupart des exports d'étude ordonnent déjà la rédaction préférée : placez le paquet autoritatif en premier comme deck_a et l'import en masse ensuite comme deck_b. L'algorithme est pur et déterministe : des entrées identiques produisent toujours le même JSON, sans graines aléatoires, horloges ni services externes.
Contrat d'entrée, forme de la réponse et erreurs
Chaque tableau doit contenir au moins un objet avec les champs chaîne front et back (les côtés numériques ou booléens sont convertis en texte décimal ou true/false ; les objets imbriqués sont rejetés). Associez le résultat à votre propre écriture CSV ou Anki si vous avez besoin d'un fichier sur disque ; ce point de terminaison renvoie uniquement des cartes structurées et n'émet ni paquets binaires ni pièces jointes multimédias. Envoyez en POST un corps JSON avec deux tableaux obligatoires, deck_a et deck_b. Tableaux vides, paquets manquants, valeurs non tableaux et cartes sans les deux côtés échouent avec invalid_input en nommant le problème, et ces échecs ne sont pas facturés. En cas de succès le corps inclut merged, la liste ordonnée des cartes {front, back} survivantes ; count, la longueur de merged ; deck_a_count et deck_b_count des entrées validées ; total_input comme leur somme ; duplicates_removed comme total_input moins count ; et operation égal à flashcard_deck_merge pour un routage simple dans des pipelines multi-outils. Exemple : deck_a avec les rectos photosynthesis et mitosis, et deck_b avec un second mitosis plus meiosis, produit trois cartes —photosynthesis, mitosis de deck_a et meiosis— car le recto mitosis en double de deck_b est écarté et son verso plus récent est ignoré.
Où la fusion de paquets d'étude se justifie
Les apprenants de langues qui exportent deux paquets Anki pour la même liste de vocabulaire peuvent supprimer des lemmes en double exacts sans ouvrir une interface de bureau. Comme les échecs de validation ne consomment pas le solde, vous pouvez sonder en toute sécurité des imports vides pendant l'ETL. Les enseignants qui maintiennent un paquet maître de biologie et une extension partagée avec la classe ont souvent besoin d'une union propre avant de publier dans un LMS : placez le maître comme deck_a pour que les versos préférés restent lorsque les élèves ont reformulé la même question. Les tâches d'arrière-plan qui réconcilient chaque nuit des packs de programme partenaires peuvent appeler l'API au prix de base publié de $0.002 par élément réussi, avec un coût de parse pur tier A et sans jetons de modèle.
Cas d'intégration
Paquet maître enseignant plus extension de classe
Placez le paquet de programme autoritatif dans deck_a et un paquet apporté par la classe dans deck_b pour que les versos préférés l'emportent en cas de collision de rectos.
Questions techniques
Comment fusionner deux paquets de flashcards sans rectos en double ?
Envoyez des tableaux non vides deck_a et deck_b de cartes {front, back}. L'API parcourt deck_a puis deck_b et ne conserve que le premier recto exact, en renvoyant merged et duplicates_removed.
Combien coûte l'outil de fusion de paquets de flashcards ?
L'outil du navigateur est gratuit. Les requêtes API utilisent le solde KIT prépayé à $0.002 par appel réussi ; une entrée invalide n'est pas facturée.