Skip to content

CLI, REST API, strumenti MCP e SDK del motore di etichettatura

Pilota il motore di etichettatura da potato label, dalle route REST /api/engine/v1, da cinque strumenti MCP del motore o dalla classe Python Study, tutti sullo stesso file engine.sqlite.

Il server di annotazione, la riga di comando, la REST API, gli strumenti MCP e il Python SDK pilotano tutti lo stesso motore di etichettatura sullo stesso file engine.sqlite nella directory del task. Puoi avviare uno studio dalla riga di comando, servire le richieste umane con il server e certificare da un notebook.

Un solo processo alla volta pilota uno studio. Il planner di un server in esecuzione detiene il lock di scrittura dello studio e, finché lo detiene, potato label run, potato label certify e Study.run() si rifiutano di procedere e lo dicono. In quel caso certifica tramite il server, con POST /api/engine/v1/certify o dalla pagina di amministrazione. Il lock esiste perché due processi estrarrebbero due campioni di calibrazione e certificherebbero ciascuno sulle etichette dell'altro. Il lock viene rilasciato quando il processo che lo detiene termina. Se quel processo viene ucciso sulla stessa macchina, il lock viene ripreso subito; se viene ucciso su un'altra macchina, dopo due minuti senza heartbeat. I comandi di sola lettura (status, certificate, calls, export) funzionano in qualsiasi momento.

Riga di comando

Ogni comando del motore accetta il file di configurazione dello studio:

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

I nove comandi coprono uno studio dalla prima chiamata a un modello fino al dataset esportato:

ComandoChe cosa fa
runEtichetta ogni item con la cascata, estrae il campione di calibrazione in cieco, certifica, risolve. --until predicted (il default) si ferma dopo un passaggio, e --until met continua finché ogni contratto è soddisfatto o il motore è in attesa delle persone. Accetta anche --max-items N, --budget-usd X (sostituisce budgets.model_usd per questa esecuzione), --max-ticks N (20 per default) e --json. Un'esecuzione interrotta riprende da dove si era fermata senza ripetere chiamate ai modelli. Termina con stato 1, nominando la fonte, quando l'ultima esecuzione di una fonte è fallita o tutte le sue risposte erano errori, o quando nessuna fonte può etichettare uno schema nominato da un contratto.
statusItem, predizioni, richieste per scopo, contratti, spesa, item ancora senza etichetta e una riga per ogni fonte con errori o con un'esecuzione fallita o in pausa. --json.
certifyTesta ogni contratto sulle nuove etichette cert e sulle nuove predizioni. Quando sono cambiate solo le etichette dev, restituisce il risultato memorizzato con una nota, e --retest testa la regola che dev ora sceglie, all'analisi successiva (vedi Analisi successive). --json.
certificateIl certificato di qualità. --format md (il default), html o json, e --out FILE.
exportEtichette con provenienza, il certificato (JSON, Markdown, HTML), una dataset card e il log delle chiamate, in --out DIR (<output_annotation_dir>/labeling_engine per default).
callsIl log di audit delle chiamate ai modelli come righe JSON. --out FILE.
distillAddestra un modello sulle etichette raccolte finora e lo mette per primo nella cascata.
optimizeValuta ogni sottoinsieme della cascata sulle etichette dev e riporta il più economico che mantiene la copertura. Quando nessun sottoinsieme mantiene alcuna copertura, non ne raccomanda nessuno. --prompts N chiede anche a un livello LLM N parafrasi del suo prompt e valuta ciascuna sugli item dev. Sono chiamate ai modelli, registrate nel log e conteggiate nel budget, e salvate sotto versioni proprie della fonte, mentre il prompt attuale viene valutato dalle sue predizioni memorizzate. La cascata e il certificato non vengono modificati.
migrate-configScrive una copia della configurazione con un blocco labeling_engine equivalente alle sue chiavi IA più vecchie. --out FILE. Vedi Migrare al motore di etichettatura.

Controllare l'avanzamento non consuma nulla, perché status, certificate e la pagina di amministrazione leggono risultati memorizzati. Ogni nuovo test, che venga da certify su nuove etichette o da certify --retest, consuma una parte del budget di errore di un contratto.

File scritti dall'export

potato label export scrive quattro tipi di file nella directory di output:

FileContenuto
labels.jsonl, labels.csvUna riga per item e schema, etichettato o no, con id, schema, label, label_origin (auto, human, adjudicated, ...), status (accepted, accepted_uncertified con threshold_legacy, pending, pending_recert), source, model, source_version, confidence, contract_version e request_ids. Un'etichetta automatica la cui fonte è cambiata da quando è stata accettata risulta pending_recert finché il passaggio successivo non la ricertifica.
certificate.json, .md, .htmlIl certificato.
README.mdUna dataset card con front matter di Hugging Face, costruita dal certificato.
model_calls.jsonlOgni chiamata a un modello, con il modello, gli hash di prompt e risposta, token, latenza, costo, hit della cache e categorie di mascheramento.

Gli exporter normali (python -m potato.export e l'export dell'amministrazione) esportano le annotazioni delle persone, e la pagina dei formati di export li elenca. Tra questi, il formato labeling_engine scrive gli stessi file di potato label export, e si rifiuta di funzionare quando il motore non è attivo. Quando il motore è attivo, gli export CSV, Parquet e Hugging Face aggiungono due colonne che indicano a quale richiesta del motore ha risposto ogni annotazione. engine_purpose contiene lo scopo, per esempio calibration, e engine_request contiene un JSON con scopo, probabilità di inclusione, visibilità, partizione e id della richiesta. Usa queste colonne per separare il campione casuale in cieco dalle risposte di verifica.

REST API

Tutte le route del motore stanno sotto /api/engine/v1 e restituiscono JSON. Autenticati con la chiave di amministrazione nell'header X-API-Key o con una sessione di amministrazione. Le letture richiedono il permesso per la dashboard di amministrazione, certify e plan richiedono la gestione delle assegnazioni, e il certificato richiede il permesso di export.

Metodo e percorsoRestituisce
GET /statusItem, predizioni, richieste, totali delle chiamate, budget e, per ogni schema, cascata, contratti e conteggi delle etichette risolte
GET /schemes/<name>/contractsL'ultimo risultato di ogni contratto sullo schema, segnato stale se la cascata è cambiata
GET /schemes/<name>/risk_coveragePer ogni soglia dell'ultimo livello, la quota accettata, l'errore osservato e il limite superiore garantito, sulle etichette cert
GET /schemes/<name>/reliabilityBin di affidabilità, ECE e Brier score per livello, sulle etichette di calibrazione
GET /schemes/<name>/driftIl monitor degli audit per ogni contratto di rischio selettivo
GET /schemes/<name>/optimizeIl report sulla cascata più economica, valutato sulle etichette dev
GET /requestsConteggi delle richieste per scopo e stato, e le richieste stesse. I filtri sono purpose, status (ripeti il parametro o separa i valori con virgole), schema e limit (max 1000)
GET /callsIl log delle chiamate, dalle più recenti, e i totali per fonte. limit (max 500), offset
GET /certificateIl certificato. format=json (il default), md o html, e save=1 lo salva anche
GET /crowdL'ultimo piano di crowdsourcing del planner, una simulazione a meno che la spesa reale non sia attiva
POST /certifyTesta ogni contratto subito. ?retest=1 (o {"retest": true}) testa anche una regola cambiata solo per effetto delle etichette dev
POST /planEsegue subito un passaggio del planner

Le route rispondono 404 quando il motore è disattivato per lo studio. Rispondono 400 con un errore JSON per un parametro non valido, come un limit che non è un numero, un purpose o uno status sconosciuto, o un format diverso da json, md o html.

Per esempio, questa richiesta recupera il certificato attuale in Markdown da un server sulla porta 8000:

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

Strumenti MCP

Il server MCP espone cinque strumenti del motore, con gli stessi permessi delle route REST:

  • engine_status
  • engine_requests
  • engine_run, che esegue un passaggio del planner
  • engine_certify, che accetta retest
  • engine_certificate, in json, md o html

Concedere questi strumenti mentre il motore è disattivato produce un avviso di validazione. Tramite potato mcp connect, una chiamata rifiutata (un permesso mancante, un parametro errato) torna come errore dello strumento con il messaggio del server. La documentazione del server MCP spiega come concedere gli strumenti e collegare un client.

Python SDK

La classe Study pilota il motore da Python, per esempio in 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/")

Ogni metodo corrisponde a un comando o a una route:

MetodoChe cosa fa
Study(config_path)Carica la configurazione e gli item
run(until="predicted", max_ticks=20)Come potato label run, e prende il lock di scrittura
label(item_id, scheme, value, user, request_id=None)Registra l'etichetta di una persona. Chiude request_id, oppure una richiesta che questa persona ha in carico sull'item, e altrimenti viene conservata come etichetta organica, che non certifica mai. Una seconda etichetta della stessa persona sullo stesso item aggiorna la prima
status()Come GET /status
requests(status=None, purpose=None, ...)Il registro delle richieste
certify(retest=False)Come potato label certify
certificate(fmt="json")json, md o html
export(out_dir)Come potato label export

L'esempio etichetta ogni richiesta aperta come "positive" solo per mostrare le chiamate. Un'etichetta registrata con Study.label che non risponde a nessuna richiesta viene conservata come etichetta organica, e le etichette organiche non certificano mai, quindi uno script che etichetta item che il motore non ha richiesto aggiunge etichette che nessun contratto legge.

Approfondimenti

Per i dettagli di implementazione, consulta la documentazione sorgente.