Skip to content

CLI, REST API, ferramentas MCP e SDK do motor de rotulagem

Controle o motor de rotulagem pelo potato label, pelas rotas REST /api/engine/v1, por cinco ferramentas MCP do motor ou pela classe Study em Python, todos sobre um único arquivo engine.sqlite.

O servidor de anotação, a linha de comando, a REST API, as ferramentas MCP e o Python SDK controlam o mesmo motor de rotulagem sobre o mesmo arquivo engine.sqlite no diretório da tarefa. Você pode iniciar um estudo pela linha de comando, servir as solicitações a pessoas com o servidor e certificar a partir de um notebook.

Só um processo controla um estudo por vez. O planejador de um servidor em execução detém o lock de escrita do estudo e, enquanto o detém, potato label run, potato label certify e Study.run() recusam e informam isso. Nesse caso, certifique pelo servidor, com POST /api/engine/v1/certify ou pela página de administração. O lock existe porque dois controladores sorteariam duas amostras de calibração e certificariam com os rótulos um do outro. O lock é liberado quando quem o detém termina. Um detentor encerrado à força na mesma máquina é substituído na hora, e um em outra máquina após dois minutos sem heartbeat. Os comandos somente leitura (status, certificate, calls, export) funcionam a qualquer momento.

Linha de comando

Todo comando do motor recebe o arquivo de configuração do estudo:

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

Os nove comandos cobrem um estudo da primeira chamada a modelo até o conjunto de dados exportado:

ComandoO que faz
runRotula todos os itens com a cascata, sorteia a amostra de calibração cega, certifica e resolve. --until predicted (o padrão) para depois de uma passagem, e --until met continua até todos os contratos estarem cumpridos ou o motor estar esperando pessoas. Aceita também --max-items N, --budget-usd X (substitui budgets.model_usd nesta execução), --max-ticks N (20 por padrão) e --json. Uma execução interrompida retoma de onde parou sem repetir chamadas a modelos. Sai com status 1, nomeando a fonte, quando a última execução de uma fonte falhou ou todas as respostas dela foram erros, ou quando nenhuma fonte consegue rotular um esquema que um contrato nomeia.
statusItens, predições, solicitações por finalidade, contratos, gasto, itens ainda sem rótulo e uma linha para cada fonte com erros ou com uma execução que falhou ou está pausada. --json.
certifyTesta todos os contratos com novos rótulos cert e novas predições. Quando só os rótulos dev mudaram, o resultado armazenado volta com uma nota, e --retest testa a regra que dev agora escolhe, na inspeção seguinte (veja Inspeções). --json.
certificateO certificado de qualidade. --format md (o padrão), html ou json, e --out FILE.
exportRótulos com proveniência, o certificado (JSON, Markdown, HTML), um dataset card e o registro de chamadas, em --out DIR (<output_annotation_dir>/labeling_engine por padrão).
callsO registro de auditoria de chamadas a modelos em JSON lines. --out FILE.
distillTreina um modelo com os rótulos até agora e o coloca em primeiro na cascata.
optimizePontua todos os subconjuntos da cascata nos rótulos dev e relata o mais barato que mantém a cobertura. Quando nenhum subconjunto mantém cobertura alguma, não recomenda nenhum. --prompts N também pede a um nível LLM N paráfrases do seu prompt e pontua cada uma nos itens dev. São chamadas a modelos, registradas e contabilizadas no orçamento, e armazenadas sob versões de fonte próprias, enquanto o prompt atual é pontuado a partir das predições armazenadas. A cascata e o certificado não são alterados.
migrate-configGrava uma cópia da configuração com um bloco labeling_engine equivalente às suas chaves de IA mais antigas. --out FILE. Veja Migrar para o motor de rotulagem.

Acompanhar o progresso não gasta nada, porque status, certificate e a página de administração leem resultados armazenados. Cada novo teste, seja de certify com novos rótulos ou de certify --retest, gasta parte do orçamento de erro de um contrato.

Arquivos gravados pela exportação

potato label export grava quatro tipos de arquivo no diretório de saída:

ArquivoConteúdo
labels.jsonl, labels.csvUma linha por item e esquema, rotulado ou não, com id, schema, label, label_origin (auto, human, adjudicated, ...), status (accepted, accepted_uncertified sob threshold_legacy, pending, pending_recert), source, model, source_version, confidence, contract_version e request_ids. Um rótulo de máquina cuja fonte mudou desde que foi aceito mostra pending_recert até que a passagem seguinte o certifique de novo.
certificate.json, .md, .htmlO certificado.
README.mdUm dataset card com front matter do Hugging Face, construído a partir do certificado.
model_calls.jsonlTodas as chamadas a modelos, com o modelo, hashes do prompt e da resposta, tokens, latência, custo, acertos de cache e categorias de mascaramento.

Os exportadores comuns (python -m potato.export e a exportação do painel) exportam as anotações das pessoas, e a página de formatos de exportação os lista. Entre eles, o formato labeling_engine grava os mesmos arquivos que potato label export e se recusa a rodar quando o motor não está habilitado. Com o motor ligado, as exportações CSV, Parquet e Hugging Face ganham duas colunas que dizem a qual solicitação do motor cada anotação respondeu. engine_purpose contém a finalidade, por exemplo calibration, e engine_request contém um JSON com a finalidade, a probabilidade de inclusão, a visibilidade, a divisão e o id da solicitação. Use essas colunas para separar a amostra aleatória cega das respostas de verificação.

REST API

Todas as rotas do motor ficam em /api/engine/v1 e devolvem JSON. Autentique-se com a chave de administrador no cabeçalho X-API-Key ou com uma sessão de administrador. As leituras exigem a permissão do painel de administração, certify e plan exigem gerenciamento de atribuições, e o certificado exige permissão de exportação.

Método e caminhoDevolve
GET /statusItens, predições, solicitações, totais de chamadas, orçamentos e, para cada esquema, a cascata, os contratos e as contagens de rótulos resolvidos
GET /schemes/<name>/contractsO resultado mais recente de cada contrato do esquema, marcado stale se a cascata mudou
GET /schemes/<name>/risk_coveragePara cada limiar do último nível, a fração aceita, o erro observado e o limite superior garantido, nos rótulos cert
GET /schemes/<name>/reliabilityFaixas de confiabilidade, ECE e Brier score por nível, nos rótulos de calibração
GET /schemes/<name>/driftO monitor de auditorias por contrato de risco seletivo
GET /schemes/<name>/optimizeO relatório de cascata mais barata, pontuado nos rótulos dev
GET /requestsContagens de solicitações por finalidade e status, e as próprias solicitações. Os filtros são purpose, status (repita o parâmetro ou separe valores com vírgulas), schema e limit (máx. 1000)
GET /callsO registro de chamadas, das mais recentes para as mais antigas, e totais por fonte. limit (máx. 500), offset
GET /certificateO certificado. format=json (o padrão), md ou html, e save=1 também o armazena
GET /crowdO último plano de crowdsourcing do planejador, uma simulação a menos que o gasto real esteja ligado
POST /certifyTesta todos os contratos agora. ?retest=1 (ou {"retest": true}) também testa uma regra que só os rótulos dev mudaram
POST /planExecuta uma passagem do planejador agora

As rotas respondem 404 quando o motor está desligado para o estudo. Respondem 400 com um erro em JSON para um parâmetro inválido, como um limit que não é número, um purpose ou status desconhecido, ou um format diferente de json, md ou html.

Por exemplo, esta requisição busca o certificado atual em Markdown de um servidor na porta 8000:

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

Ferramentas MCP

O servidor MCP expõe cinco ferramentas do motor, com as mesmas permissões das rotas REST:

  • engine_status
  • engine_requests
  • engine_run, que executa uma passagem do planejador
  • engine_certify, que aceita retest
  • engine_certificate, em json, md ou html

Conceder essas ferramentas com o motor desligado gera um aviso de validação. Via potato mcp connect, uma chamada recusada (uma permissão ausente, um parâmetro inválido) volta como um erro de ferramenta que traz a mensagem do servidor. A documentação do servidor MCP explica como conceder ferramentas e conectar um cliente.

Python SDK

A classe Study controla o motor a partir do Python, por exemplo em um 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/")

Cada método espelha um comando ou uma rota:

MétodoFaz
Study(config_path)Carrega a configuração e os itens
run(until="predicted", max_ticks=20)Como potato label run, e obtém o lock de escrita
label(item_id, scheme, value, user, request_id=None)Registra o rótulo de uma pessoa. Fecha request_id ou, na falta dele, uma solicitação que essa pessoa tem em mãos no item, e caso contrário é guardado como rótulo orgânico, que nunca certifica. Um segundo rótulo da mesma pessoa no mesmo item atualiza o primeiro
status()Como GET /status
requests(status=None, purpose=None, ...)O registro de solicitações
certify(retest=False)Como potato label certify
certificate(fmt="json")json, md ou html
export(out_dir)Como potato label export

O exemplo rotula todas as solicitações abertas como "positive" só para mostrar as chamadas. Um rótulo registrado por Study.label que não responde a nenhuma solicitação é guardado como rótulo orgânico, e rótulos orgânicos nunca certificam, então um script que rotula itens que o motor não solicitou acrescenta rótulos que nenhum contrato lê.

Leitura adicional

Para detalhes de implementação, consulte a documentação de origem.