CLI, REST API, MCP-Tools und SDK der Labeling-Engine
Die Labeling-Engine über potato label, die REST-Routen unter /api/engine/v1, fünf MCP-Tools der Engine oder die Python-Klasse Study steuern, alle über eine einzige engine.sqlite-Datei.
Der Annotationsserver, die Kommandozeile, die REST API, die MCP-Tools und das Python SDK steuern alle dieselbe Labeling-Engine über dieselbe Datei engine.sqlite im Aufgabenverzeichnis. Sie können eine Studie auf der Kommandozeile starten, die Anfragen an Menschen mit dem Server ausliefern und aus einem Notebook heraus zertifizieren.
Eine Studie wird immer nur von einem Prozess gesteuert. Der Planer eines laufenden Servers hält die Schreibsperre der Studie, und solange er sie hält, verweigern potato label run, potato label certify und Study.run() den Dienst und sagen das. Zertifizieren Sie dann über den Server, mit POST /api/engine/v1/certify oder über die Admin-Seite. Die Sperre gibt es, weil zwei steuernde Prozesse zwei Kalibrierungsstichproben ziehen und gegen die Labels des jeweils anderen zertifizieren würden. Die Sperre wird freigegeben, wenn ihr Halter endet. Ein abgebrochener Halter auf demselben Rechner wird sofort abgelöst, einer auf einem anderen Rechner nach zwei Minuten ohne Heartbeat. Lesende Befehle (status, certificate, calls, export) funktionieren jederzeit.
Kommandozeile
Jeder Befehl der Engine nimmt die Konfigurationsdatei der Studie:
potato label <command> <config.yaml> [options]Die neun Befehle decken eine Studie vom ersten Modellaufruf bis zum exportierten Datensatz ab:
| Befehl | Was er tut |
|---|---|
run | Jedes Item mit der Kaskade labeln, die verblindete Kalibrierungsstichprobe ziehen, zertifizieren, auflösen. --until predicted (der Standard) stoppt nach einem Durchlauf, und --until met läuft weiter, bis jeder Vertrag erfüllt ist oder die Engine auf Menschen wartet. Nimmt außerdem --max-items N, --budget-usd X (überschreibt budgets.model_usd für diesen Lauf), --max-ticks N (standardmäßig 20) und --json. Ein abgebrochener Lauf setzt dort fort, wo er aufgehört hat, ohne Modellaufrufe zu wiederholen. Endet mit Status 1 und nennt die Quelle, wenn der letzte Lauf einer Quelle gescheitert ist oder jede ihrer Antworten ein Fehler war, oder wenn keine Quelle ein Schema labeln kann, das ein Vertrag nennt. |
status | Items, Vorhersagen, Anfragen nach Zweck, Verträge, Ausgaben, Items ohne Label und eine Zeile für jede Quelle mit Fehlern oder einem gescheiterten oder pausierten Lauf. --json. |
certify | Jeden Vertrag auf neuen cert-Labels und neuen Vorhersagen testen. Wenn sich nur dev-Labels geändert haben, kommt das gespeicherte Ergebnis mit einem Hinweis zurück, und --retest testet die Regel, die dev jetzt wählt, beim nächsten Look (siehe Looks). --json. |
certificate | Das Qualitätszertifikat. --format md (der Standard), html oder json, und --out FILE. |
export | Labels mit Herkunft, das Zertifikat (JSON, Markdown, HTML), eine Dataset Card und das Aufrufprotokoll, nach --out DIR (standardmäßig <output_annotation_dir>/labeling_engine). |
calls | Das Audit-Protokoll der Modellaufrufe als JSON Lines. --out FILE. |
distill | Ein Modell auf den bisherigen Labels trainieren und an die erste Stelle der Kaskade setzen. |
optimize | Jede Teilmenge der Kaskade auf dev-Labels bewerten und die günstigste melden, die die Abdeckung hält. Hält keine Teilmenge irgendeine Abdeckung, empfiehlt der Befehl keine. --prompts N bittet außerdem eine LLM-Stufe um N Paraphrasen ihres Prompts und bewertet jede auf den dev-Items. Das sind Modellaufrufe, protokolliert und auf das Budget angerechnet und unter eigenen Quellversionen gespeichert, während der aktuelle Prompt anhand seiner gespeicherten Vorhersagen bewertet wird. Kaskade und Zertifikat werden nicht verändert. |
migrate-config | Eine Kopie der Konfiguration schreiben, mit einem labeling_engine-Block, der ihren älteren KI-Schlüsseln entspricht. --out FILE. Siehe Migration zur Labeling-Engine. |
Den Fortschritt zu prüfen, kostet nichts, denn status, certificate und die Admin-Seite lesen gespeicherte Ergebnisse. Jeder neue Test, ob von certify auf neuen Labels oder von certify --retest, verbraucht einen Teil des Fehlerbudgets eines Vertrags.
Vom Export geschriebene Dateien
potato label export schreibt vier Arten von Dateien in das Ausgabeverzeichnis:
| Datei | Inhalt |
|---|---|
labels.jsonl, labels.csv | Eine Zeile pro Item und Schema, gelabelt oder nicht, mit id, schema, label, label_origin (auto, human, adjudicated, ...), status (accepted, accepted_uncertified unter threshold_legacy, pending, pending_recert), source, model, source_version, confidence, contract_version und request_ids. Ein Maschinenlabel, dessen Quelle sich seit der Akzeptanz geändert hat, steht auf pending_recert, bis der nächste Durchlauf es neu zertifiziert. |
certificate.json, .md, .html | Das Zertifikat. |
README.md | Eine Dataset Card mit Hugging-Face-Front-Matter, aus dem Zertifikat erzeugt. |
model_calls.jsonl | Jeder Modellaufruf, mit Modell, Hashes von Prompt und Antwort, Tokens, Latenz, Kosten, Cache-Treffern und Maskierungskategorien. |
Die regulären Exporter (python -m potato.export und der Admin-Export) exportieren die Annotationen der Menschen, und die Seite Exportformate führt sie auf. Unter ihnen schreibt das Format labeling_engine dieselben Dateien wie potato label export und läuft nicht, wenn die Engine nicht aktiviert ist. Ist die Engine aktiv, fügen die Exporte nach CSV, Parquet und Hugging Face zwei Spalten hinzu, die angeben, auf welche Anfrage der Engine eine Annotation geantwortet hat. engine_purpose enthält den Zweck, zum Beispiel calibration, und engine_request enthält JSON mit Zweck, Einschlusswahrscheinlichkeit, Sichtbarkeit, Split und Anfrage-ID. Mit diesen Spalten trennen Sie die verblindete Zufallsstichprobe von den Antworten auf Prüfanfragen.
REST API
Alle Routen der Engine liegen unter /api/engine/v1 und geben JSON zurück. Authentifizieren Sie sich mit dem Admin-Schlüssel im Header X-API-Key oder mit einer Admin-Sitzung. Lesezugriffe brauchen die Berechtigung für das Admin-Dashboard, certify und plan brauchen die Verwaltung von Zuweisungen, und das Zertifikat braucht die Exportberechtigung.
| Methode und Pfad | Liefert |
|---|---|
GET /status | Items, Vorhersagen, Anfragen, Aufrufsummen, Budgets sowie für jedes Schema Kaskade, Verträge und die Zahl aufgelöster Labels |
GET /schemes/<name>/contracts | Das jüngste Ergebnis jedes Vertrags auf dem Schema, als stale markiert, wenn sich die Kaskade geändert hat |
GET /schemes/<name>/risk_coverage | Für jeden Schwellenwert der letzten Stufe den akzeptierten Anteil, den beobachteten Fehler und die garantierte obere Schranke, auf cert-Labels |
GET /schemes/<name>/reliability | Zuverlässigkeits-Bins, ECE und Brier-Score pro Stufe, auf Kalibrierungslabels |
GET /schemes/<name>/drift | Die Audit-Überwachung pro Selective-Risk-Vertrag |
GET /schemes/<name>/optimize | Der Bericht über günstigere Kaskaden, bewertet auf dev-Labels |
GET /requests | Anzahl der Anfragen nach Zweck und Status sowie die Anfragen selbst. Filter sind purpose, status (Parameter wiederholen oder Werte mit Kommas trennen), schema und limit (höchstens 1000) |
GET /calls | Das Aufrufprotokoll, die neuesten zuerst, und Summen nach Quelle. limit (höchstens 500), offset |
GET /certificate | Das Zertifikat. format=json (der Standard), md oder html, und save=1 speichert es zusätzlich |
GET /crowd | Der letzte Crowd-Plan des Planers, ein Probelauf, solange echte Ausgaben nicht an sind |
POST /certify | Jeden Vertrag jetzt testen. ?retest=1 (oder {"retest": true}) testet auch eine Regel, die sich nur durch dev-Labels geändert hat |
POST /plan | Jetzt einen Durchlauf des Planers ausführen |
Die Routen antworten mit 404, wenn die Engine für die Studie aus ist. Mit 400 und einem JSON-Fehler antworten sie auf einen ungültigen Parameter, etwa ein limit, das keine Zahl ist, einen unbekannten purpose oder status oder ein anderes format als json, md oder html.
Diese Anfrage holt zum Beispiel das aktuelle Zertifikat als Markdown von einem Server auf Port 8000:
curl -H "X-API-Key: $ADMIN_API_KEY" \
"http://localhost:8000/api/engine/v1/certificate?format=md"MCP-Tools
Der MCP-Server stellt fünf Tools der Engine bereit, mit denselben Berechtigungen wie die REST-Routen:
engine_statusengine_requestsengine_run, das einen Durchlauf des Planers ausführtengine_certify, dasretestnimmtengine_certificate, alsjson,mdoderhtml
Diese Tools freizugeben, während die Engine aus ist, ergibt eine Validierungswarnung. Über potato mcp connect kommt ein abgelehnter Aufruf (eine fehlende Berechtigung, ein fehlerhafter Parameter) als Tool-Fehler zurück, der die Meldung des Servers enthält. Wie Sie Tools freigeben und einen Client verbinden, beschreibt die Dokumentation des MCP-Servers.
Python SDK
Die Klasse Study steuert die Engine aus Python, zum Beispiel in einem Notebook:
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/")Jede Methode entspricht einem Befehl oder einer Route:
| Methode | Tut |
|---|---|
Study(config_path) | Konfiguration und Items laden |
run(until="predicted", max_ticks=20) | Wie potato label run, und nimmt die Schreibsperre |
label(item_id, scheme, value, user, request_id=None) | Das Label einer Person speichern. Es schließt request_id oder sonst eine Anfrage, die diese Person auf dem Item hält, und andernfalls wird es als organisches Label behalten, das nie zertifiziert. Ein zweites Label derselben Person auf demselben Item aktualisiert ihr erstes |
status() | Wie GET /status |
requests(status=None, purpose=None, ...) | Das Anfragenregister |
certify(retest=False) | Wie potato label certify |
certificate(fmt="json") | json, md oder html |
export(out_dir) | Wie potato label export |
Das Beispiel labelt jede offene Anfrage nur deshalb mit „positive“, um die Aufrufe zu zeigen. Ein über Study.label gespeichertes Label, das keine Anfrage beantwortet, wird als organisches Label behalten, und organische Labels zertifizieren nie. Ein Skript, das Items labelt, die die Engine nicht angefordert hat, fügt also Labels hinzu, die kein Vertrag liest.
Weiterführende Lektüre
- Die Labeling-Engine
- Konfiguration der Labeling-Engine
- Verträge der Labeling-Engine
- Admin-Dashboard, das auf die Admin-Seite der Engine verlinkt
Implementierungsdetails stehen in der Quelldokumentation.