Guide
Immagini, audio e video
Oloproof valuta sistemi che ricevono o producono immagini, audio e video, e i file non lasciano mai il luogo in cui il tuo sistema li conserva. Un'esecuzione registra ogni file per riferimento; i controlli deterministici misurano i byte; un giudice può vedere immagini, fotogrammi video e audio; il workbench li mostra accanto a ogni verdetto. Il tutorial percorre le immagini su un esempio eseguibile.
Registrare i media
Il tuo sistema registra i file che un caso ha ricevuto o prodotto con current_case().media(...), come un artefatto media/v1 per chiamata:
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)}In oloproof.yaml, un sistema callable dichiara records: [media/v1]. Ogni elemento contiene:
| Campo | Significato |
|---|---|
| kind | image, audio o video, dal tipo MIME |
| mime_type | image/png, audio/wav, video/mp4 e così via |
| uri | dove si trova il file: un percorso file://, un URL https://, o un percorso relativo al progetto |
| digest | lo sha256 dei byte, sha256:... |
| size_bytes | la dimensione in byte |
| role | input, output (il predefinito) o context |
| name | come lo chiama un prompt o una pagina; media_file usa il nome del file |
| width, height, duration_s | facoltativi, come li dichiara il tuo sistema |
media_file(path) compila questi campi a partire da un file locale. Nulla viene copiato nell'archivio di Oloproof. Tutto ciò che legge il file in seguito, un controllo, un giudice o il workbench, lo legge tramite read_media, che rifiuta i byte la cui dimensione o il cui sha256 differisce dal record: un contenuto modificato arresta l'esecuzione, e un file che non c'è più lascia il caso mancante. Conserva i file di un'esecuzione, invariati, per tutto il tempo in cui conservi l'esecuzione; scrivi gli output di ogni versione in un posto a sé. Nel tuo @evaluator, read_media(item) restituisce i byte verificati.
Controlli senza un modello
media_check misura ogni elemento registrato di un ruolo e passa quando ognuno soddisfa ogni condizione dichiarata:
- type: media_check
criterion: thumbnail_fits
kind: image
formats: [png, jpeg, webp]
max_width: 256
max_height: 256
max_bytes: 50000Il formato viene letto dai byte iniziali del file, quindi un JPEG salvato come .png fallisce; le dimensioni delle immagini e le durate WAV vengono lette dalle loro intestazioni; le dimensioni di un video o la durata di un MP3 vengono misurate con ffprobe. I limiti di durata valgono per audio e video, quelli di dimensione per immagini e video.
image_matches_reference passa quando ogni immagine somiglia a un riferimento: i loro hash percettivi a 64 bit differiscono al massimo di max_distance bit (8 per impostazione predefinita). Una copia ridimensionata o ricompressa resta entro pochi bit; un'immagine vuota, un file danneggiato o una scena diversa no. Il riferimento è un unico reference_file per tutti i casi, oppure un percorso che l'expected di ogni caso nomina con reference_field. L'hash legge la composizione e la luce, non il colore, quindi non sa distinguere due prodotti fotografati allo stesso modo, e la grafica piatta con ampie aree vuote lo sposta più delle fotografie. Richiede Pillow: pip install 'oloproof[media]'.
Ogni campo è nel riferimento della configurazione. Entrambi i controlli decidono dalla prima esecuzione, poiché non chiamano alcun modello.
Giudici che vedono i media
A un rubric_judge con media vengono mostrati i media registrati del caso con quel ruolo (input, output o all), ciascuno nominato nel suo prompt, così che il giudice possa distinguere un input da un output:
- 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- Le immagini sono allegate così come sono, fino a 5 MB ciascuna e 20 per giudizio.
- Il video è allegato come fotogrammi fissi, estratti con ffmpeg sulla macchina che esegue il giudice: video_frames: 4 prende il centro di quattro intervalli uguali, [0.5, 2.0] prende quegli istanti.
- L'audio viene trascritto dal transcriber (un endpoint /audio/transcriptions compatibile con OpenAI, quello di OpenAI quando base_url è omesso) e la trascrizione entra nel prompt; oppure, con audio: native, è allegato come suono per un modello che sente (wav e mp3; non quelli di Anthropic).
I digest dei media fanno parte della chiave di un giudizio, quindi media modificati vengono giudicati di nuovo e media invariati arrivano dalla cache. Il trascrittore e gli istanti dei fotogrammi fanno parte della versione del giudice, e ogni giudizio conserva le sue trascrizioni e la versione di ffmpeg. Un giudice dichiarato per l'audio senza trascrittore, o per il video su una macchina senza ffmpeg, arresta l'esecuzione anziché lasciare mancanti quei casi. Un modello ospitato fattura ogni immagine oltre a ogni parola.
Validare un giudice multimediale
Un giudice che vede i media non decide nulla finché le etichette delle persone non mostrano che è d'accordo con loro, esattamente come uno che legge testo: etichetta un campione casuale, poi oloproof evaluators validate (Giudici). In uno spazio di lavoro ospitato, la coda di revisione mostra al revisore i media di ogni caso. Cambiare il modello, la rubrica, media, i fotogrammi o il trascrittore crea un nuovo giudice, che ha bisogno della propria validazione.
I media nel workbench
I media di un caso compaiono accanto al suo output e ai suoi verdetti, nella pagina del caso e nella coda di revisione, con il tipo, la dimensione e il digest di ogni file.
- Un workbench locale legge ogni file dal punto in cui l'esecuzione lo ha registrato, sulla tua macchina, e lo mostra solo finché il suo sha256 corrisponde ancora.
- Uno spazio di lavoro ospitato non riceve mai i media. Il browser di chi guarda recupera ogni file da oloproof collect sulla tua rete, con lo stesso ticket di breve durata che la coda di revisione usa per il contenuto dei casi (Giudici), e ne verifica lo sha256 prima di mostrarlo. Senza un collector, la pagina elenca i dati di ogni file e dice perché non viene mostrato.
Un'esecuzione inviata con push porta con sé i record media/v1, con il luogo in cui è conservato ogni file, nella categoria di egress artifacts; una policy che trattiene artifacts tiene anche quei luoghi dalla tua parte.
Non supportato
- Generare media: il tuo sistema crea i suoi file, e Oloproof li valuta.
- Caricare media su Oloproof: non c'è alcun caricamento, né ospitato né locale.
- Un modello che guarda un video intero o ascolta l'audio tramite l'API di Anthropic: lì il video viene giudicato dai fotogrammi, e l'audio tramite una trascrizione.
- Controlli deterministici di ciò che contiene un audio o un video (tasso di errore sulle parole, rilevamento delle scene): scrivine uno con @evaluator e read_media.
- Hash percettivo di audio o video: image_matches_reference legge solo immagini.