Que fait JSONL Store ?
Utilisez cette compétence lorsqu'une tâche planifiée a besoin de se souvenir de ce qu'elle a déjà fait - alertes émises, identifiants traités, événements capturés - mais qu'une base de données est excessive. Le format JSON Lines (un objet JSON par ligne) est adapté aux appends, lisible par un humain, facilement explorable avec grep, et se lit en flux sans charger tout le fichier en mémoire. Cet assistant ajoute des appends atomiques, des lectures en flux qui survivent à une ligne corrompue, et append_unique(record, key) pour qu'un même identifiant ne soit jamais écrit deux fois entre les exécutions.
Quand l'invoquer
- L'utilisateur dit : "journaliser les résultats dans un fichier JSONL", "ajouter des événements sur le disque", "dédupliquer par identifiant entre les exécutions", "garder un historique simple sans base de données".
- Un script cron ou planifié a besoin d'un état persistant entre les exécutions dans un fichier plat.
Quand NE PAS l'invoquer
- Vous avez besoin de requêtes, d'index ou d'écritures concurrentes - utilisez SQLite (
sqlite-state) ou une vraie base de données. - Les enregistrements sont volumineux ou binaires - JSONL est conçu pour de petites lignes structurées.
Exemple concret
Entrée utilisateur :
Après chaque exécution, ajoute les nouvelles alertes à alerts.jsonl mais jamais le même identifiant d'alerte deux fois.
Sortie :
# Copiez assets/store.py dans votre projet, puis :
from store import JsonlStore
store = JsonlStore("data/alerts.jsonl")
for alert in new_alerts:
if store.append_unique(alert, key="id"):
send(alert) # ne se déclenche que pour les identifiants non vus dans les exécutions précédentes
print("taille de l'historique :", store.count())
La lecture se fait ligne par ligne, donc une année d'historique ne se charge jamais complètement en mémoire, et une dernière ligne partiellement écrite à cause d'un crash est ignorée sans casser l'exécution suivante.
Patron à appliquer
- Un objet JSON par ligne ; faire l'append avec
ensure_ascii=Falsepour que le texte reste lisible. - Lecture en flux avec un générateur ; ignorer les lignes vides/corrompues plutôt que de lever une exception.
- Déduplication avec
seen_keys(key)/append_unique(record, key)pour rendre les exécutions idempotentes. - Associer à un planificateur pour que le fichier soit la mémoire durable entre les invocations.
Référence : assets/store.py.
Source
Tiré de la gestion d'état de bots planifiés de l'auteur. v1.0.0. Voir aussi : [[sqlite-state]], [[cron-dispatch]], [[pipeline-orchestrator]].
→ Construisez le bot complet avec Trawlkit.