The metadata cache keeps a failed read forever and --no-metadata returns
nothing, and in both cases the head loader returned None silently while
the backbone still applied. The grid is now read from the file's own
header when the cached metadata lacks it, and head-shaped tensors
without a grid log a warning.
add_network keys available_networks by the basename with dots mangled to
underscores, and create_item looked the name up in that table using the
name as loaded, so any file with a dot in its stem missed and logged
"not registered". The tag pass then dropped the network's own tags and
used the filename instead. The lookup now falls back to the alias table,
which already carries the natural basename and the subfolder path.
The projection a parallel head replaces waits out of the module tree,
so nothing moves it, and a weight still viewing its checkpoint shard
keeps the whole shard mapped. The stash now clones the projection's
tensors.
Group hooks on the no-stream path and the on-demand hook return a
component to cpu through a device copy, so a memory-mapped text encoder
sits in memory twice, as the mapped file its never-run vision tower
keeps alive and as the copies, and every encode pays a device-to-host
transfer of unchanged weights. The engine now records the cpu tensors
at onload and hands them back at offload; a component moved by any
other path still takes the copy.
MiniMaxH3Scheduler counts the terminal sigma in num_inference_steps, so
Steps N ran N-1 evaluations while every other model runs N. The shim
hands the scheduler p.steps + 1, the slider starts at 1, and the PDD
pin records the evaluation count while passing the scheduler its grid
argument. Metadata written before this change counted grid points.
Shift is a property of the trained schedule, not of the step count, so
the tab sliders take absolute values, defaulting to the shipped 12 and
3. video_minimax resolves each request from the request value or the
scheduler config inside apply_overrides, which the tab, the api and
the still path all call, so a request without values lands on the
shipped schedule. The api maps sampler_shift onto the video schedule
and gains audio_shift. Applied values are recorded as Video shift and
Audio shift; the PDD pin records what it enforces.
QuantRepo builds the transformer as a meta skeleton through the sdnq
conversion and streams each layer from the shards while it is analyzed,
so a repo larger than host memory costs one module at a time.
Remote-code classes resolve from the modeling file beside the
checkpoint. LoRA groups go through the arch grouper with the file-level
alpha and the adapt_weights hook, and fused saves are sliced onto their
modules. --reference measures each module's quantization error against
the unquantized repo and reports the delta against it; without one a
uniform-rounding estimate stands in. The tool imports again:
group_by_suffixes takes no bare prefixes and shared initializes before
the lora modules.
Layer-wise extractions (FastH3) ship diff_b on every projection and
diff on the norms; final_layer.norm had no rename onto norm_out.norm,
so its residual went unmapped.
PDD files pair a backbone LoRA with the output projections repeated per
interval of a training grid; each step fuses the heads of its block
into one projection. network_pdd reads the grid from the metadata,
swaps a ParallelHead in for each projection, fuses from the scheduler's
step_index and pins the step count and shift while heads are
installed. The MiniMax loader declares which scheduler each head
follows.
The pruned transformer stores W @ P for each AdaLN projection against
the rank-8 basis in time_embedder.basis, so deltas trained at the
released width failed the shape check. try_load_lora gains an
adapt_weights hook and the MiniMax loader refits lora_down as down @ P,
which is exact.
Wrappers holding the factors as nn.Parameter save them without the
.weight suffix (alibaba-pai PDD files), which the marker gate rejected
before grouping. The MiniMax-only normalization for that form is
removed.
MiniMaxH3Scheduler reads its shift from the instance, not config.shift,
and the per-request video scheduler was replaced by the Default sampler
restore. Both schedulers now take set_shift, including the
default_scheduler copy the restore reads.
CivitAI video covers are AV1, which OpenCV builds without dav1d cannot
decode. Previews fetch the CDN's transcode=true,width=450 H.264 copy
first, fall back to the original named by its content type, and drop a
video that yields no frame for the next media item. An unreadable frame
logs one line, and the download path is absolute before registration.
A refused download recorded only the status code and logged nothing.
The error now carries CivitAI's own message, as in "HTTP 403: Early
Access: ...", and the refusal and rename failure log like every other
branch.
A finished download refreshed the checkpoint list alone, so a new LoRA
or UNET stayed invisible to check-local and Networks until a manual
refresh. add_network, now module-level, registers one LoRA file; unet,
vae and checkpoint downloads run their loader's scan.
A hash cache hit now resolves through its loader's registry and counts
only while the file exists; entries whose file is gone are pruned, on
the request that finds them and once per process for the rest.
filename is always the local path.
CivitSearchResponse carries the server's error text; the Gradio page
renders it, or a no-results line, in the details area instead of a
blank card list. The legacy route reads items from the response.
search_civitai.base_models was a hand-kept copy of the /enums list that
lacked every base added this year. The dropdown starts empty and takes
the discovered names minus the bases CivitAI has retired (in BaseModel
but not ActiveBaseModel). The tab handler refreshes the choice lists on
every visit, since later browser sessions used to get no update; the
initial search still runs once per process.
The versions table showed only files[0], so precision variants of one
version could not be downloaded. Each file gets its own row under
rowspan version cells, sorted by precision then size, with a variant
column and a star on the primary; rows download by fileId URL and All
variants queues each version's primary from the fetched model. Companion
files pass their own type, and save names carry the precision, then
full/pruned and the file id only when needed to stay unique.
The downloader hashes bytes as it writes them, seeding from the partial
on resume, and checks the declared SHA256 against that digest instead
of rereading the file. The declared hash, or the computed one when none
is given, is cached under the key the owning loader reads; loader_kind
and hash_cache_title derive that key for the downloader and the sweeps.
resolve_save_path passed os.sep as the re.sub replacement string; on
Windows that lone backslash is an unfinished escape and every subfolder
download raised PatternError. A callable replacement is inserted
verbatim.