unslothai/unsloth · error · ValueError
family {getattr(fam, 'name', fam)!r} declares no prequant_fi
Error message
family {getattr(fam, 'name', fam)!r} declares no prequant_filenames entry for {scheme!r}, so a rotated checkpoint has no name the loader would ask for. Add the entry to the family table, or pass --upload-filename. What it means
Generic HTTP failure thrown by disconnectCodexOAuth (and the shared parseErrorText helper in providers-api.ts:68-77) when DELETE /api/providers/{providerId}/oauth returns a non-2xx status and the response body carries neither a FastAPI-style `detail` nor a string `message` field. The literal text 'Request failed (${status})' is the last-resort fallback after both body formats fail to parse, so seeing it means the server returned an error with an empty or unstructured body.
Source
Thrown at scripts/build_prequant_checkpoint.py:75
"""The repo-root filename this build should publish under.
The loader asks for the family's declared ``prequant_filenames`` name first and the derived
``<Model>-<SCHEME>.pt`` second, so a ROTATED artifact published under the legacy
``transformer_<scheme>.pt`` is either never resolved at all, or resolved as the fallback by a
build too old to honour the rotation, which then refuses the v2 tag and drops to the dense
download. A rotated build therefore goes to the declared name or nowhere. Plain builds keep
the legacy name they have always used."""
if override:
return override
from core.inference.diffusion_prequant import prequant_filename
if not rotated:
return prequant_filename(scheme)
from core.inference.diffusion_families import family_prequant_filename
preferred = family_prequant_filename(fam, scheme)
if not preferred:
raise ValueError(
f"family {getattr(fam, 'name', fam)!r} declares no prequant_filenames entry for "
f"{scheme!r}, so a rotated checkpoint has no name the loader would ask for. Add the "
"entry to the family table, or pass --upload-filename."
)
return preferred
def main(argv = None) -> int:
p = argparse.ArgumentParser()
p.add_argument(
"--base", required = True, help = "diffusers base repo (carries the transformer subfolder)"
)
p.add_argument("--family", required = True, help = "diffusion family name/alias (e.g. z-image)")
p.add_argument("--scheme", required = True, help = "quant scheme: int8 | fp8 | nvfp4 | mxfp8")
p.add_argument("--out", required = True, help = "output .pt path for the checkpoint")
p.add_argument("--min-features", type = int, default = 512)
p.add_argument("--dtype", default = "bfloat16", choices = ["bfloat16"])
p.add_argument("--hf-token", default = None)View on GitHub (pinned to 203007d190)
Solutions
- Check the browser Network tab for the actual DELETE /oauth response status and raw body — the status number in the message is the real clue.
- If 401/403: re-authenticate the studio session (log in again) and retry the disconnect.
- If 404: refresh the provider list; the provider was likely already deleted, so the disconnect is moot.
- If 502/504: verify the backend process is up and the proxy route to it is healthy, then retry.
- As a developer, extend parseErrorText to include a body excerpt so the fallback is less opaque.
Example fix
// before
return `Request failed (${status})`;
// after — surface whatever the body actually was
return `Request failed (${status})${bodyText ? `: ${bodyText.slice(0, 200)}` : ''}`; Defensive patterns
Strategy: try-catch
Type guard
function isProviderRequestError(e: unknown): e is Error {
return e instanceof Error && /^Request failed \(\d+\)$/.test(e.message);
} Try / catch
try {
await disconnectCodexOAuth(providerId);
} catch (error) {
const status = Number(/\((\d+)\)$/.exec((error as Error).message)?.[1]);
if (status === 404) { /* provider already gone — refresh list */ }
else if (status === 401 || status === 403) { /* re-auth */ }
else toast.error((error as Error).message);
} Prevention
- Refresh the provider list before acting on a provider selected earlier in the session.
- Keep the studio auth session alive; handle 401 by redirecting to login before calling OAuth endpoints.
- Surface the HTTP status separately (as the research API does with ResearchApiError.status) instead of only embedding it in the message.
When it happens
Trigger: DELETE /api/providers/{id}/oauth or DELETE /api/providers/{id}/oauth/flows/{flowId} returning 4xx/5xx with a body lacking `detail`/`message` — e.g. providerId not found (404 with empty body), auth session expired returning a plain-text 401, or a reverse proxy (502/504 from nginx) returning an HTML error page that fails response.json().
Common situations: Stale providerId after the provider was deleted in another tab; expired studio auth cookie so authFetch gets a 401 login redirect; backend restarted mid-disconnect; a proxy interposing an HTML 502 page between studio and the backend.
Related errors
- lockfile not found: {path}
- load timed out (last progress: {prog})
- Bad candidate spec fragment '{part}' (expected key=value)
- Request failed (${status})
- model load did not reach ready
AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15).
Data as JSON: /api/errors/917782cf88c9c2dc.
Report an issue: GitHub.