{"record":{"id":"917782cf88c9c2dc","repo":"unslothai/unsloth","slug":"family-getattr-fam-name-fam-r-declares-no-p","errorCode":null,"errorMessage":"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.","messagePattern":"family (.+?) declares no prequant_filenames entry for (.+?), so a rotated checkpoint has no name the loader would ask for\\. Add the entry to the family table, or pass --upload-filename\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"scripts/build_prequant_checkpoint.py","lineNumber":75,"sourceCode":"    \"\"\"The repo-root filename this build should publish under.\n\n    The loader asks for the family's declared ``prequant_filenames`` name first and the derived\n    ``<Model>-<SCHEME>.pt`` second, so a ROTATED artifact published under the legacy\n    ``transformer_<scheme>.pt`` is either never resolved at all, or resolved as the fallback by a\n    build too old to honour the rotation, which then refuses the v2 tag and drops to the dense\n    download. A rotated build therefore goes to the declared name or nowhere. Plain builds keep\n    the legacy name they have always used.\"\"\"\n    if override:\n        return override\n    from core.inference.diffusion_prequant import prequant_filename\n\n    if not rotated:\n        return prequant_filename(scheme)\n    from core.inference.diffusion_families import family_prequant_filename\n\n    preferred = family_prequant_filename(fam, scheme)\n    if not preferred:\n        raise ValueError(\n            f\"family {getattr(fam, 'name', fam)!r} declares no prequant_filenames entry for \"\n            f\"{scheme!r}, so a rotated checkpoint has no name the loader would ask for. Add the \"\n            \"entry to the family table, or pass --upload-filename.\"\n        )\n    return preferred\n\n\ndef main(argv = None) -> int:\n    p = argparse.ArgumentParser()\n    p.add_argument(\n        \"--base\", required = True, help = \"diffusers base repo (carries the transformer subfolder)\"\n    )\n    p.add_argument(\"--family\", required = True, help = \"diffusion family name/alias (e.g. z-image)\")\n    p.add_argument(\"--scheme\", required = True, help = \"quant scheme: int8 | fp8 | nvfp4 | mxfp8\")\n    p.add_argument(\"--out\", required = True, help = \"output .pt path for the checkpoint\")\n    p.add_argument(\"--min-features\", type = int, default = 512)\n    p.add_argument(\"--dtype\", default = \"bfloat16\", choices = [\"bfloat16\"])\n    p.add_argument(\"--hf-token\", default = None)","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/scripts/build_prequant_checkpoint.py#L57-L93","documentation":"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.","triggerScenarios":"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().","commonSituations":"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.","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."],"exampleFix":"// before\nreturn `Request failed (${status})`;\n\n// after — surface whatever the body actually was\nreturn `Request failed (${status})${bodyText ? `: ${bodyText.slice(0, 200)}` : ''}`;","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function isProviderRequestError(e: unknown): e is Error {\n  return e instanceof Error && /^Request failed \\(\\d+\\)$/.test(e.message);\n}","tryCatchPattern":"try {\n  await disconnectCodexOAuth(providerId);\n} catch (error) {\n  const status = Number(/\\((\\d+)\\)$/.exec((error as Error).message)?.[1]);\n  if (status === 404) { /* provider already gone — refresh list */ }\n  else if (status === 401 || status === 403) { /* re-auth */ }\n  else toast.error((error as Error).message);\n}","preventionTips":["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."],"tags":["http","api","oauth","providers","frontend"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}