Skip to content

CLI, REST API, outils MCP et SDK du moteur d'étiquetage

Pilotez le moteur d'étiquetage avec potato label, les routes REST /api/engine/v1, cinq outils MCP du moteur ou la classe Python Study, tous sur un même fichier engine.sqlite.

Le serveur d'annotation, la ligne de commande, la REST API, les outils MCP et le Python SDK pilotent tous le même moteur d'étiquetage à travers le même fichier engine.sqlite, dans le répertoire de la tâche. Vous pouvez lancer une étude en ligne de commande, servir les demandes humaines avec le serveur et certifier depuis un notebook.

Un seul processus pilote une étude à la fois. Le planificateur d'un serveur en cours d'exécution détient le verrou d'écriture de l'étude, et tant qu'il le détient, potato label run, potato label certify et Study.run() refusent de s'exécuter et le disent. Certifiez alors par le serveur, avec POST /api/engine/v1/certify ou la page d'administration. Le verrou existe parce que deux pilotes tireraient deux échantillons de calibration et certifieraient chacun sur les étiquettes de l'autre. Le verrou est libéré quand son détenteur se termine. Un détenteur tué sur la même machine est remplacé immédiatement, et un détenteur sur une autre machine au bout de deux minutes sans signal de vie. Les commandes en lecture seule (status, certificate, calls, export) fonctionnent à tout moment.

Ligne de commande

Chaque commande du moteur prend le fichier de configuration de l'étude :

bash
potato label <command> <config.yaml> [options]

Les neuf commandes couvrent une étude du premier appel de modèle jusqu'au jeu de données exporté :

CommandeCe qu'elle fait
runÉtiquette chaque item avec la cascade, tire l'échantillon de calibration en aveugle, certifie et résout. --until predicted (le défaut) s'arrête après un passage, et --until met continue jusqu'à ce que chaque contrat soit respecté ou que le moteur attende des personnes. Accepte aussi --max-items N, --budget-usd X (remplace budgets.model_usd pour cette exécution), --max-ticks N (20 par défaut) et --json. Une exécution interrompue reprend là où elle s'est arrêtée sans répéter d'appels de modèle. Se termine avec le statut 1, en nommant la source, quand la dernière exécution d'une source a échoué ou que chacune de ses réponses était une erreur, ou quand aucune source ne peut étiqueter un schéma nommé par un contrat.
statusItems, prédictions, demandes par motif, contrats, dépenses, items encore sans étiquette, et une ligne pour chaque source qui présente des erreurs ou une exécution échouée ou en pause. --json.
certifyTeste chaque contrat sur les nouvelles étiquettes cert et les nouvelles prédictions. Quand seules les étiquettes dev ont changé, le résultat enregistré revient avec une note, et --retest teste la règle que dev choisit désormais, à l'examen suivant (voir Examens successifs). --json.
certificateLe certificat de qualité. --format md (le défaut), html ou json, et --out FILE.
exportLes étiquettes avec leur provenance, le certificat (JSON, Markdown, HTML), une fiche de jeu de données et le journal des appels, dans --out DIR (<output_annotation_dir>/labeling_engine par défaut).
callsLe journal d'audit des appels aux modèles, en lignes JSON. --out FILE.
distillEntraîne un modèle sur les étiquettes recueillies jusque-là et le place en tête de la cascade.
optimizeÉvalue chaque sous-ensemble de la cascade sur les étiquettes dev et indique le moins coûteux qui conserve la couverture. Quand aucun sous-ensemble ne conserve de couverture, il n'en recommande aucun. --prompts N demande en plus à un niveau LLM N reformulations de son prompt et évalue chacune sur les items dev. Ce sont des appels de modèle, journalisés et comptés dans le budget, et enregistrés sous leurs propres versions de source, tandis que le prompt actuel est évalué à partir de ses prédictions enregistrées. La cascade et le certificat ne changent pas.
migrate-configÉcrit une copie de la configuration avec un bloc labeling_engine équivalent à ses anciennes clés IA. --out FILE. Voir Migrer vers le moteur d'étiquetage.

Suivre l'avancement ne dépense rien, car status, certificate et la page d'administration lisent des résultats enregistrés. Chaque nouveau test, qu'il vienne de certify sur de nouvelles étiquettes ou de certify --retest, consomme une partie du budget d'erreur d'un contrat.

Fichiers écrits par l'export

potato label export écrit quatre sortes de fichiers dans le répertoire de sortie :

FichierContenu
labels.jsonl, labels.csvUne ligne par item et par schéma, étiqueté ou non, avec id, schema, label, label_origin (auto, human, adjudicated, ...), status (accepted, accepted_uncertified sous threshold_legacy, pending, pending_recert), source, model, source_version, confidence, contract_version et request_ids. Une étiquette machine dont la source a changé depuis son acceptation indique pending_recert jusqu'à ce que le passage suivant la recertifie.
certificate.json, .md, .htmlLe certificat.
README.mdUne fiche de jeu de données avec un en-tête Hugging Face, construite à partir du certificat.
model_calls.jsonlChaque appel de modèle, avec le modèle, les hachages du prompt et de la réponse, les tokens, la latence, le coût, les accès au cache et les catégories masquées.

Les exporteurs habituels (python -m potato.export et l'export de l'administration) exportent les annotations des personnes, et la page Formats d'export les liste. Parmi eux, le format labeling_engine écrit les mêmes fichiers que potato label export, et il refuse de s'exécuter quand le moteur n'est pas activé. Quand le moteur est activé, les exports CSV, Parquet et Hugging Face ajoutent deux colonnes qui indiquent à quelle demande du moteur chaque annotation a répondu. engine_purpose contient le motif, par exemple calibration, et engine_request contient un JSON avec le motif, la probabilité d'inclusion, la visibilité, la partition et l'identifiant de la demande. Utilisez ces colonnes pour séparer l'échantillon aléatoire en aveugle des réponses de vérification.

REST API

Toutes les routes du moteur se trouvent sous /api/engine/v1 et renvoient du JSON. Authentifiez-vous avec la clé d'administration dans l'en-tête X-API-Key ou avec une session d'administration. Les lectures exigent la permission du tableau de bord d'administration, certify et plan exigent la gestion de l'attribution, et le certificat exige la permission d'export.

Méthode et cheminRenvoie
GET /statusItems, prédictions, demandes, totaux d'appels, budgets, et pour chaque schéma sa cascade, ses contrats et le nombre d'étiquettes résolues
GET /schemes/<name>/contractsLe dernier résultat de chaque contrat du schéma, marqué stale si la cascade a changé
GET /schemes/<name>/risk_coveragePour chaque seuil du dernier niveau, la part acceptée, l'erreur observée et la borne supérieure garantie, sur les étiquettes cert
GET /schemes/<name>/reliabilityClasses de fiabilité, ECE et score de Brier par niveau, sur les étiquettes de calibration
GET /schemes/<name>/driftLe suivi des audits pour chaque contrat de risque sélectif
GET /schemes/<name>/optimizeLe rapport sur une cascade moins coûteuse, évalué sur les étiquettes dev
GET /requestsLe décompte des demandes par motif et par statut, et les demandes elles-mêmes. Les filtres sont purpose, status (répétez le paramètre ou séparez les valeurs par des virgules), schema et limit (1000 au maximum)
GET /callsLe journal des appels, du plus récent au plus ancien, et les totaux par source. limit (500 au maximum), offset
GET /certificateLe certificat. format=json (le défaut), md ou html, et save=1 l'enregistre aussi
GET /crowdLe dernier plan de crowdsourcing du planificateur, une simulation sauf si la dépense réelle est activée
POST /certifyTeste immédiatement chaque contrat. ?retest=1 (ou {"retest": true}) teste aussi une règle que seules les étiquettes dev ont modifiée
POST /planLance immédiatement un passage du planificateur

Les routes répondent 404 quand le moteur est désactivé pour l'étude. Elles répondent 400 avec une erreur JSON pour un paramètre invalide, comme un limit qui n'est pas un nombre, un purpose ou un status inconnu, ou un format autre que json, md ou html.

Par exemple, cette requête récupère le certificat actuel en Markdown depuis un serveur sur le port 8000 :

bash
curl -H "X-API-Key: $ADMIN_API_KEY" \
  "http://localhost:8000/api/engine/v1/certificate?format=md"

Outils MCP

Le serveur MCP expose cinq outils du moteur, avec les mêmes permissions que les routes REST :

  • engine_status
  • engine_requests
  • engine_run, qui lance un passage du planificateur
  • engine_certify, qui accepte retest
  • engine_certificate, en json, md ou html

Accorder ces outils alors que le moteur est désactivé provoque un avertissement de validation. Via potato mcp connect, un appel refusé (permission manquante, paramètre invalide) revient comme une erreur d'outil qui porte le message du serveur. La documentation du serveur MCP explique comment accorder des outils et connecter un client.

Python SDK

La classe Study pilote le moteur depuis Python, par exemple dans un notebook :

python
from potato.labeling_engine.sdk import Study
 
study = Study("examples/labeling-engine/text-certified-sentiment/config.yaml")
study.run()                                   # label, sample, certify, resolve
for req in study.requests(status="open")[:5]:
    study.label(req.item_id, req.schema, "positive", user="me")
study.certify()
print(study.certificate(fmt="md"))
study.export("out/")

Chaque méthode correspond à une commande ou à une route :

MéthodeRôle
Study(config_path)Charge la configuration et les items
run(until="predicted", max_ticks=20)Comme potato label run, et prend le verrou d'écriture
label(item_id, scheme, value, user, request_id=None)Enregistre l'étiquette d'une personne. Elle clôt request_id, à défaut une demande que cette personne détient sur l'item, et sinon elle est conservée comme étiquette organique, qui ne certifie jamais. Une deuxième étiquette de la même personne sur le même item met à jour la première
status()Comme GET /status
requests(status=None, purpose=None, ...)Le registre des demandes
certify(retest=False)Comme potato label certify
certificate(fmt="json")json, md ou html
export(out_dir)Comme potato label export

L'exemple attribue « positive » à chaque demande ouverte uniquement pour montrer les appels. Une étiquette enregistrée par Study.label qui ne répond à aucune demande est conservée comme étiquette organique, et les étiquettes organiques ne certifient jamais, donc un script qui étiquette des items que le moteur n'a pas demandés ajoute des étiquettes qu'aucun contrat ne lit.

Pour aller plus loin

Pour les détails d'implémentation, consultez la documentation source.