huggingface / huggingface/diffusers
53 messages in src/diffusers are missing the f-string prefix (safety-checker ValueError in 46 pipelines)
- Dominant language
- Python
- Stars
- 34.5k
- Forks
- 7.3k
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 91
Description
Following the [AI-assisted contribution guide](https://huggingface.co/docs/diffusers/main/en/conceptual/contribution#ai-assisted-and-agentic-contributions), I'm opening one issue for a recurring pattern rather than per-file PRs, and I'll wait for a maintainer's go-ahead before opening a PR.
### The pattern
53 messages under `src/diffusers` contain `{...}` placeholders but are plain strings, not f-strings, so users see the placeholder text instead of the value. Every referenced name is in scope at its call site, so the fix is only the `f` prefix. Found with an AST scan for string literals passed to `raise`, `logger.*` or `print` whose placeholders name variables in the enclosing function; each hit was then read by hand.
**1. Safety-checker `ValueError` in 46 pipelines** (the most user-visible one)
```python
raise ValueError(
"Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety"
" checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead."
)
```
When `safety_checker` is passed without `feature_extractor`, the error reads `...when loading {self.__class__} if...` instead of naming the pipeline class. None of these `__init__`s are `# Copied from`, so each copy needs the same one-character edit:
46 locations
- `pipelines/controlnet/pipeline_controlnet.py:239`
- `pipelines/controlnet/pipeline_controlnet_img2img.py:217`
- `pipelines/controlnet/pipeline_controlnet_inpaint.py:220`
- `pipelines/controlnet_hunyuandit/pipeline_hunyuandit_controlnet.py:262`
- `pipelines/deepfloyd_if/pipeline_if.py:153`
- `pipelines/deepfloyd_if/pipeline_if_img2img.py:177`
- `pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py:183`
- `pipelines/deepfloyd_if/pipeline_if_inpainting.py:180`
- `pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py:185`
- `pipelines/deepfloyd_if/pipeline_if_superresolution.py:141`
- `pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion.py:252`
- `pipelines/deprecated/alt_diffusion/pipeline_alt_diffusion_img2img.py:280`
- `pipelines/deprecated/controlnet_xs/pipeline_controlnet_xs.py:177`
- `pipelines/deprecated/semantic_stable_diffusion/pipeline_semantic_stable_diffusion.py:85`
- `pipelines/deprecated/stable_diffusion_attend_and_excite/pipeline_stable_diffusion_attend_and_excite.py:245`
- `pipelines/deprecated/stable_diffusion_diffedit/pipeline_stable_diffusion_diffedit.py:345`
- `pipelines/deprecated/stable_diffusion_gligen/pipeline_stable_diffusion_gligen.py:169`
- `pipelines/deprecated/stable_diffusion_gligen/pipeline_stable_diffusion_gligen_text_image.py:230`
- `pipelines/deprecated/stable_diffusion_ldm3d/pipeline_stable_diffusion_ldm3d.py:260`
- `pipelines/deprecated/stable_diffusion_panorama/pipeline_stable_diffusion_panorama.py:231`
- `pipelines/deprecated/stable_diffusion_safe/pipeline_stable_diffusion_safe.py:125`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_cycle_diffusion.py:213`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_onnx_stable_diffusion_inpaint_legacy.py:138`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_inpaint_legacy.py:183`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_model_editing.py:111`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_paradigms.py:135`
- `pipelines/deprecated/stable_diffusion_variants/pipeline_stable_diffusion_pix2pix_zero.py:353`
- `pipelines/hunyuandit/pipeline_hunyuandit.py:235`
- `pipelines/latent_consistency_models/pipeline_latent_consistency_text2img.py:207`
- `pipelines/ledits_pp/pipeline_leditspp_stable_diffusion.py:367`
- `pipelines/pag/pipeline_pag_controlnet_sd.py:247`
- `pipelines/pag/pipeline_pag_controlnet_sd_inpaint.py:221`
- `pipelines/pag/pipeline_pag_hunyuandit.py:240`
- `pipelines/pag/pipeline_pag_sd.py:258`
- `pipelines/pag/pipeline_pag_sd_img2img.py:253`
- `pipelines/pag/pipeline_pag_sd_inpaint.py:285`
- `pipelines/stable_diffusion/pipeline_onnx_stable_diffusion.py:101`
- `pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_img2img.py:154`
- `pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_inpaint.py:153`
- `pipelines/stable_diffusion/pipeline_onnx_stable_diffusion_upscale.py:127`
- `pipelines/stable_diffusion/pipeline_stable_diffusion.py:253`
- `pipelines/stable_diffusion/pipeline_stable_diffusion_image_variation.py:103`
- `pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py:281`
- `pipelines/stable_diffusion/pipeline_stable_diffusion_inpaint.py:228`
- `pipelines/stable_diffusion/pipeline_stable_diffusion_instruct_pix2pix.py:154`
- `pipelines/t2i_adapter/pipeline_stable_diffusion_adapter.py:256`
**2. DeepFloyd IF super-resolution warnings (3)**: `"It seems like you have loaded a checkpoint that shall not be used for super resolution from {unet.config._name_or_path} as it accepts {unet.config.in_channels} input channels..."` in `pipelines/deepfloyd_if/pipeline_if_img2img_superresolution.py:189`, `pipelines/deepfloyd_if/pipeline_if_inpainting_superresolution.py:191`, `pipelines/deepfloyd_if/pipeline_if_superresolution.py:147`.
**3. bitsandbytes quantizer (2)**: `logger.info("target_dtype {target_dtype} is replaced by ...")` in `quantizers/bitsandbytes/bnb_quantizer.py:452`, `quantizers/bitsandbytes/bnb_quantizer.py:98`.
**4. `DPMSolverSinglestepScheduler.set_timesteps` warnings (2)**: `"Changing scheduler {self.config} to have `lower_order_final` set to True..."` in `schedulers/scheduling_dpmsolver_singlestep.py:424`, `schedulers/scheduling_dpmsolver_singlestep.py:430`.
### Proposed fix
A single PR adding the `f` prefix at these 53 sites, with no other changes. It would pass `make quality`, `make fix-copies` (to confirm no copy checks drift), and the self-review skill, with the notes shared on the PR. There are also about 24 more copies of the safety-checker message under `examples/community`. I'd leave those out unless you'd like them in the same PR.
Would a PR along these lines be welcome?
Contributor guide
Research direction
Start with the listed call sites under src/diffusers, especially the safety-checker ValueError locations, then review the three warning groups in the DeepFloyd IF, bitsandbytes, and DPMSolver files. Add the f prefix at all 53 sites without other changes, and run make quality and make fix-copies; done means the placeholders interpolate their values and both checks pass.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- machine-learning
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100