Guias
Imagens, áudio e vídeo
O Oloproof avalia sistemas que recebem ou produzem imagens, áudio e vídeo, e os arquivos nunca saem do lugar onde o seu sistema os guarda. Uma execução registra cada arquivo por referência; verificações determinísticas medem os bytes; um juiz pode ver imagens, quadros de vídeo e áudio; o workbench os mostra ao lado de cada veredito. O tutorial percorre as imagens com um exemplo executável.
Registrando mídia
O seu sistema registra os arquivos que um caso recebeu ou produziu com current_case().media(...), como um artefato media/v1 por chamada:
from oloproof import current_case, media_file, system
@system(name="captioner", version="v2", records=("media/v1",))
def caption(case):
image = render(case["prompt"]) # your system writes its own file
current_case().media([
media_file(case["photo"], role="input"),
media_file(image), # role="output" by default
])
return {"caption": describe(image)}No oloproof.yaml, um sistema callable declara records: [media/v1]. Cada item contém:
| Campo | Significado |
|---|---|
| kind | image, audio ou video, a partir do tipo MIME |
| mime_type | image/png, audio/wav, video/mp4 e assim por diante |
| uri | onde o arquivo está: um caminho file://, uma URL https:// ou um caminho relativo ao projeto |
| digest | o sha256 dos bytes, sha256:... |
| size_bytes | o tamanho em bytes |
| role | input, output (o padrão) ou context |
| name | como um prompt ou uma página o chama; media_file usa o nome do arquivo |
| width, height, duration_s | opcionais, conforme o seu sistema os declara |
media_file(path) preenche esses campos a partir de um arquivo local. Nada é copiado para o armazenamento do Oloproof. Tudo o que lê o arquivo depois, uma verificação, um juiz ou o workbench, o lê por meio de read_media, que recusa bytes cujo tamanho ou sha256 difere do registro: conteúdo alterado interrompe a execução, e um arquivo que sumiu deixa o caso faltante. Guarde os arquivos de uma execução, sem alterá-los, enquanto guardar a execução; grave as saídas de cada versão em um lugar próprio. No seu próprio @evaluator, read_media(item) retorna os bytes verificados.
Verificações sem modelo
media_check mede cada item registrado de um papel e passa quando todos cumprem todas as condições declaradas:
- type: media_check
criterion: thumbnail_fits
kind: image
formats: [png, jpeg, webp]
max_width: 256
max_height: 256
max_bytes: 50000O formato é lido dos bytes iniciais do arquivo, então um JPEG salvo como .png falha; tamanhos de imagens e durações de WAV são lidos dos seus cabeçalhos; o tamanho de um vídeo ou a duração de um MP3 são medidos com ffprobe. Limites de duração se aplicam a áudio e vídeo, limites de dimensão a imagens e vídeo.
image_matches_reference passa quando cada imagem se parece com uma referência: os seus hashes perceptuais de 64 bits diferem em no máximo max_distance bits (8 por padrão). Uma cópia redimensionada ou recomprimida fica a poucos bits; uma imagem em branco, um arquivo corrompido ou uma cena diferente, não. A referência é um reference_file para todos os casos, ou um caminho que o expected de cada caso nomeia com reference_field. O hash lê composição e luz, não cor, então não consegue distinguir dois produtos fotografados do mesmo jeito, e gráficos planos com grandes áreas em branco o deslocam mais do que fotografias. Ele precisa do Pillow: pip install 'oloproof[media]'.
Todos os campos estão na referência de configuração. As duas verificações decidem desde a primeira execução, já que não chamam nenhum modelo.
Juízes que veem mídia
Um rubric_judge com media recebe a mídia registrada do caso com esse papel (input, output ou all), cada item nomeado no seu prompt para que o juiz distinga uma entrada de uma saída:
- type: rubric_judge
criterion: caption_matches
provider: openai_compatible
base_url: http://localhost:11434/v1
model: qwen2.5vl
rubric_text: Pass only if the caption truthfully describes the attached image.
media: output
video_frames: 4
transcriber:
model: whisper-1- Imagens são anexadas como estão, até 5 MB cada e 20 por julgamento.
- Vídeo é anexado como quadros estáticos, extraídos com ffmpeg na máquina que executa o juiz: video_frames: 4 pega o meio de quatro trechos iguais, [0.5, 2.0] pega esses instantes.
- Áudio é transcrito pelo transcriber (um endpoint /audio/transcriptions compatível com OpenAI, o da OpenAI quando base_url é omitido) e a transcrição entra no prompt; ou, com audio: native, é anexado como som para um modelo que ouve (wav e mp3; não o da Anthropic).
Os digests da mídia fazem parte da chave de um julgamento, então mídia alterada é julgada de novo e mídia inalterada vem do cache. O transcritor e os tempos dos quadros fazem parte da versão do juiz, e cada julgamento guarda as suas transcrições e a versão do ffmpeg. Um juiz declarado para áudio sem transcritor, ou para vídeo em uma máquina sem ffmpeg, interrompe a execução em vez de deixar esses casos faltantes. Um modelo hospedado cobra cada imagem assim como cada palavra.
Validando um juiz de mídia
Um juiz que vê mídia não decide nada até que os rótulos das pessoas mostrem que ele concorda com elas, exatamente como um que lê texto: rotule uma amostra aleatória e depois execute oloproof evaluators validate (Juízes). Em um espaço de trabalho hospedado, a fila de revisão mostra a mídia de cada caso ao revisor. Mudar o modelo, a rubrica, media, os quadros ou o transcritor cria um novo juiz, que precisa da sua própria validação.
Mídia no workbench
A mídia de um caso aparece ao lado da sua saída e dos seus vereditos, na página do caso e na fila de revisão, com o tipo, o tamanho e o digest de cada arquivo.
- Um workbench local lê cada arquivo de onde a execução o registrou, na sua máquina, e só o mostra enquanto o seu sha256 ainda corresponder.
- Um espaço de trabalho hospedado nunca recebe mídia. O navegador de quem vê busca cada arquivo do oloproof collect na sua rede, com o mesmo ticket de curta duração que a fila de revisão usa para o conteúdo dos casos (Juízes), e verifica o seu sha256 antes de mostrá-lo. Sem um coletor, a página lista os dados de cada arquivo e diz por que ele não é mostrado.
Uma execução enviada com push carrega os registros media/v1, com o lugar onde cada arquivo é guardado, na categoria de egress artifacts; uma política que retém artifacts também mantém esses locais do seu lado.
Sem suporte
- Gerar mídia: o seu sistema cria os próprios arquivos, e o Oloproof os avalia.
- Enviar mídia ao Oloproof: não há upload, nem hospedado nem local.
- Um modelo que assiste a um vídeo inteiro ou ouve áudio pela API da Anthropic: ali, o vídeo é julgado a partir de quadros, e o áudio por meio de uma transcrição.
- Verificações determinísticas do que um áudio ou vídeo contém (taxa de erro de palavras, detecção de cenas): escreva uma com @evaluator e read_media.
- Hash perceptual de áudio ou vídeo: image_matches_reference lê apenas imagens.