{"record":{"id":"daca531710fd8c2f","repo":"unslothai/unsloth","slug":"repo-id-is-a-gguf-repo-pick-one-of-its-gguf","errorCode":null,"errorMessage":"'{repo_id}' is a GGUF repo: pick one of its .gguf files (gguf_filename) instead of loading it as a diffusers pipeline.","messagePattern":"'(.+?)' is a GGUF repo: pick one of its \\.gguf files \\(gguf_filename\\) instead of loading it as a diffusers pipeline\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"studio/backend/core/inference/video.py","lineNumber":1070,"sourceCode":"    # ── validation ───────────────────────────────────────────────────────────\n\n    def validate_load_request(\n        self,\n        repo_id: str,\n        *,\n        gguf_filename: Optional[str] = None,\n        base_repo: Optional[str] = None,\n        family_override: Optional[str] = None,\n        model_kind: Optional[str] = None,\n        transformer_quant: Optional[str] = None,\n        text_encoder_quant: Optional[str] = None,\n        h3_task: Optional[str] = None,\n    ) -> VideoFamily:\n        \"\"\"Cheap, network-free validation shared by the route and the load path.\"\"\"\n        kind = resolve_video_model_kind(gguf_filename, model_kind)\n        # A -GGUF repo picked without a quant filename resolves to pipeline kind and would only fail in from_pretrained after eviction.\n        if kind == \"pipeline\" and repo_id.strip().lower().rstrip(\"/\").endswith(\"-gguf\"):\n            raise ValueError(\n                f\"'{repo_id}' is a GGUF repo: pick one of its .gguf files \"\n                \"(gguf_filename) instead of loading it as a diffusers pipeline.\"\n            )\n        fam = _detect_load_family(repo_id, gguf_filename, family_override)\n        if fam is None:\n            raise ValueError(\n                f\"'{repo_id}' is not a supported text-to-video model. Supported families: \"\n                f\"{', '.join(supported_video_family_names())}. If this is a variant of one \"\n                f\"of them, pass family_override with that family name.\"\n            )\n        # ── modular-workflow refusals, before anything heavier.\n        # Deliberately the FIRST thing after the family resolves: everything below reaches into\n        # diffusers (assert_pipeline_class_available, the transformer_class probe), so a refusal\n        # placed after them would be unreachable on any install whose diffusers cannot even be\n        # imported -- and these two are exactly the picks that cost the most to discover late.\n        if fam.modular_workflow and kind == \"single_file\":\n            # A modular workflow has no single-file assembly: its components each load through\n            # their own from_pretrained from the modular index, and nothing consumes a lone","sourceCodeStart":1052,"sourceCodeEnd":1088,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/inference/video.py#L1052-L1088","documentation":"Validation refuses loading a GGUF-hosting repo (name ending in '-gguf', case-insensitive, trailing slash tolerated) as a diffusers pipeline without selecting a quant file. Such repos have no pipeline layout; without this gate the request would resolve to kind 'pipeline' and only blow up inside from_pretrained after the resident model was evicted.","triggerScenarios":"Calling the video load route with repo_id like 'Fooocus/hunyuan-video-GGUF' (ends with '-gguf') and no gguf_filename and no model_kind override.","commonSituations":"Pasting a GGUF repo URL from a model hub into the pipeline repo field; forgetting the second step (file picker) of a GGUF load; assuming the backend auto-picks the lone .gguf file in the repo.","solutions":["Pick a specific quant: pass gguf_filename='...-Q4_K_M.gguf' from that repo.","Or load the original diffusers pipeline repo (drop the '-GGUF' suffix / use the base repo id).","If scripting, list the repo's files first and choose a .gguf whose size fits your VRAM."],"exampleFix":"# before\nload_video_model(repo_id='city96/HunyuanVideo-GGUF')\n\n# after\nload_video_model(repo_id='city96/HunyuanVideo-GGUF', gguf_filename='hunyuan-video-t2v-720p-Q4_K_M.gguf')","handlingStrategy":"validation","validationCode":"def is_gguf_repo(repo_id: str) -> bool:\n    return repo_id.strip().lower().rstrip('/').endswith('-gguf')","typeGuard":"def needs_gguf_filename(repo_id: str, gguf_filename: str | None, model_kind: str | None) -> bool:\n    kind = (model_kind or '').strip().lower() or ('gguf' if (gguf_filename or '').lower().endswith('.gguf') else '')\n    resolves_pipeline = not gguf_filename and not kind\n    return resolves_pipeline and repo_id.strip().lower().rstrip('/').endswith('-gguf')","tryCatchPattern":"try:\n    load_video_model(repo_id=repo)\nexcept ValueError as e:\n    if 'is a GGUF repo' in str(e):\n        files = list_repo_files(repo)\n        gguf = pick_quant(files)\n        load_video_model(repo_id=repo, gguf_filename=gguf)\n    else:\n        raise","preventionTips":["Treat '-GGUF' repos as two-part picks: repo + quant file.","Prompt for a .gguf file whenever the repo id ends in -gguf.","Automate quant selection by VRAM budget instead of leaving the filename blank."],"tags":["video","gguf","model-config","validation"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}