feat: add Hugging Face dataset pull/push provider#36
Conversation
Read and write the benchmark corpus from a single HF Dataset repo with audio + ground_truth files. Writes require HF_TOKEN and refuse to push to a public dataset repo. The provider is read/write only; ASR inference stays with the existing oMLX, Albert, Scaleway, and ElevenLabs providers. Closes #28 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: be7c963f86
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Code Review
This pull request introduces Hugging Face Hub integration to manage the benchmark corpus, adding CLI commands to list, pull, and push datasets. Feedback on the implementation focuses on optimizing file uploads by batching them into a single atomic commit using create_commit rather than uploading files individually, and updating the associated protocol and test mocks. Additionally, the reviewer suggests improving memory efficiency during downloads by streaming files with shutil.copy, catching the specific RepositoryNotFoundError instead of a generic exception, simplifying path parsing with pathlib.Path, and removing the unused file_sha256 helper function.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Module-level hf_hub_download, corpus-folder scope for sample discovery, single atomic create_commit push, shutil.copy streaming download, and RepositoryNotFoundError-only missing-repo branch. Remove the unused file_sha256 helper. 👾 Generated with [Letta Code](https://letta.com) Co-Authored-By: Letta Code <[email protected]>
|
@kaaloo j'ai relu en détail l'état post- 🟠 P1 —
|
benoitvx
left a comment
There was a problem hiding this comment.
Review (Benoit) : super base, mais une décision de design à acter avant merge
Merci Luis, le provider est propre et bien testé. Avant de merger, un point de stratégie produit qu'on a tranché côté éval cette semaine et qui inverse une hypothèse de la PR.
Décision actée côté éval
On utilisera Hugging Face pour de la donnée publique uniquement : le corpus des discours officiels (déjà en ligne sur info.gouv.fr, référence lissée), dans un dataset HF public et assumé. Double objectif : partage sur un outil ouvert + transparence sur les jeux de données qu'on emploie pour nos évaluations.
En face :
- Les réunions internes (voix + verbatim = données personnelles, RGPD) ne vont jamais sur HF, même en privé (HF = société US, CLOUD Act).
- Pour l'instant on n'utilise rien d'autre que HF : pas de S3 souverain ni de DVC. Les réunions internes restent locales (gitignorées), non versionnées en remote.
Conséquence : le garde-fou actuel bloque le cas d'usage visé
_ensure_private_repo refuse les repos publics et crée en private=True :
if not is_private:
raise HuggingFaceError(
f"Refusing to push to public dataset repo: {self.repo_id}. "
"Benchmark corpora must stay private."
)Or c'est exactement le dataset public qu'on veut publier. La PR est conçue pour un scénario souverain qu'on abandonne (pour le moment). Donc ce n'est pas un petit fix, c'est un changement de design :
- Autoriser (voire viser par défaut) un repo public pour ce corpus. Idéalement un
--public/--privateexplicite, défaut public pour ce dataset. - Déplacer la sécurité côté contenu, pas côté repo. Comme il n'y a plus de séparation privé/public au niveau du repo, le vrai risque devient l'upload accidentel des réunions internes.
pushutilise aujourd'huiglob("*")sur toutdata/audio+data/ground_truth: il faut le restreindre aux samples officiels explicitement listés (allowlist, sous-dossier dédié, ou manifestepublic). C'est le point dur à câbler proprement. - Mettre à jour la doc : README et
.env.exampledisent « refuses to push to a public repo » etprivate=True, ce qui devient faux.
Autres remarques (code-level, indépendantes de la décision)
- Bug d'aide CLI :
--repoaffichedefaults to ${HF_DEFAULT_DATASET_REPO}, interpolé sur la valeur, donc rendudefaults to $eval-transcript-corpus(ressemble à tort à une variable d'env). Mettre le littéral ou$HF_DATASET_REPO. Le--token->$HF_TOKENest correct, lui. pushest add-only, jamais delete : supprimer un sample en local puispushlaisse le fichier obsolète sur le remote, alors que le README dit « Push the local corpus » (laisse croire à une synchro complète). À documenter, ou ajouter unCommitOperationDeleteoptionnel.- Ambiguïté multi-extension :
_write_oneprendcandidates[0]sans tri si un sample a.wavet.mp3(ordre delist_repo_filesnon garanti, donc non déterministe). Trier ou lever une erreur. - Sample partiel silencieux : audio sans ground truth (ou l'inverse) donne un
PulledSampleavecNone, sans avertissement. Pour un corpus de bench, un sample sans référence est inexploitable : un warning serait utile. --tokenen argument CLI : fuite possible via historique shell /ps/ logs CI. Privilégier l'env ; un mot dans le README ne nuirait pas.- Incohérence de constantes :
os.getenv("HF_DATASET_REPO", ...)utilise un littéral alors queDEFAULT_ORG_ENV/DEFAULT_API_KEY_ENVsont des constantes. Ajouter unDEFAULT_DATASET_REPO_ENVpar symétrie. uv.lock: la PR retire des wheelsgreenlet(s390x, riscv64). Probablement un refresh collatéral, mais c'est du bruit dans le diff : à confirmer que c'est voulu.
Points forts
- Design testable via
Protocol(HfApiLike) + injectionapi=, tests sans dépendance dure àhuggingface_hub. Propre. - Garde-fous bien couverts (refus public, token requis, commit unique atomique, pull idempotent, filtrage des fichiers hors
audio/etground_truth/). - Très bonne couverture de tests (constructeur, logique
repo_id/org, list, pull streaming, push create+commit, helper download). - Lazy imports de
huggingface_hub, erreurs typées, intégration CLI cohérente avec les autres providers.
En résumé : la mécanique est bonne, il faut surtout retourner la logique privé/public (public assumé pour les officiels) et garantir que les réunions internes ne puissent pas partir (allowlist côté contenu). Heureux d'en discuter de vive voix si tu veux.
Summary
eval-transcript huggingface dataset {ls,pull,push}subcommands for sharing the benchmark corpus on a single HF Dataset repoHuggingFaceClientwith token-aware constructor, public-repo push guard, and idempotent pullhuggingface-hubadded to core dependencies.env.exampledocumentsHF_TOKEN/HF_ORG/HF_DATASET_REPOCloses #28
Verification
uv run python -m compileall -q src testsuv run python -m unittest discover -s tests -vuv run pre-commit run --all-files👾 Generated with Letta Code