#pragma once #include "types.hpp" #include // Load/save the actor gallery. HDF5 (.h5/.hdf5) is the only format written; // legacy gallery.json files are still readable for backward compatibility but // save_gallery always writes HDF5 regardless of the requested extension. // // GR-005 is preserved here by absence: this is the only path that serialises a // gallery, and it reads and writes the local filesystem only. There is no // upload, no client, and no encoder that could put an embedding on a wire — the // public server refuses to carry one (SR-004/UR-012), and the prohibition holds // on this side by there being nothing that would try. // /// TRACES: GR-005 | SR-005 // // HDF5 layout: // /embeddings float32 [N, 512] all actors' refs concatenated, row-major // /offset int64 [A] first row of actor a in /embeddings // /count int32 [A] number of refs for actor a // /imdb_id /tmdb_id /jellyfin_id /name : variable-length string [A] // /source_images : variable-length string [N], parallel to /embeddings rows // /embedder/model_name : scalar var-len string attr — embedder file basename // /embedder/model_sha256 : scalar var-len string attr — SHA-256 of that file // /embedder/embed_dim : scalar int32 attr // The GR-004 model binding. Absent group == unstamped // (pre-GR-004 file); see gallery/embedder_stamp.hpp. // /calibration/a, /b : scalar float32 attrs — Platt-sigmoid P(match|sim) fit // /calibration/valid : scalar int8 attr (0/1) // /calibration/hash : scalar uint64 attr — hash of the embeddings the fit // was computed from; a mismatch means "recompute" // // Legacy JSON format (read-only): // { // "embedder": {"model_name": "...", "model_sha256": "...", "embed_dim": 512}, // "actors": [ // { // "imdb_id": "nm0000093", // optional, "" if unknown // "tmdb_id": "287", // optional, "" if unknown // "jellyfin_id": "abc123-guid", // optional, "" unless from make_jellyfin_gallery.py // "name": "Brad Pitt", // "source_images": ["img1.jpg", "img2.jpg"], // "embeddings": [[0.012, -0.034, ...], ...] // one 512-float array per image // } // ] // } ActorGallery load_gallery(const std::string& path); void save_gallery(const std::string& path, const ActorGallery& gallery);