{"record":{"id":"dc300beff2a32969","repo":"unslothai/unsloth","slug":"delete-a-preset-before-saving-another-one","errorCode":null,"errorMessage":"Delete a preset before saving another one","messagePattern":"Delete a preset before saving another one","errorType":"validation","errorClass":"ValueError","httpStatus":409,"severity":"warning","filePath":"studio/backend/utils/media_generation_preset_settings.py","lineNumber":82,"sourceCode":"            submitted = preserve_recovered(stored, submitted)\n        updated = _with_unknown_preserved(\n            stored,\n            submitted,\n        )\n        upsert_app_settings({_setting_key(kind): updated})\n\n\ndef upsert_media_generation_preset(\n    kind: MediaGenerationKind, preset: dict, is_readable: Callable[[dict], bool]\n) -> None:\n    from storage.studio_db import upsert_app_settings\n    with _settings_lock:\n        stored = _stored_settings(kind)\n        presets = _custom_presets(stored)\n        readable = [item for item in presets if is_readable(item)]\n        replacing = any(item.get(\"name\") == preset[\"name\"] for item in readable)\n        if not replacing and len(readable) >= _MAX_PRESETS:\n            raise ValueError(\"Delete a preset before saving another one\")\n        stored[\"customPresets\"] = [\n            item for item in presets if item.get(\"name\") != preset[\"name\"]\n        ] + [preset]\n        upsert_app_settings({_setting_key(kind): stored})\n\n\ndef delete_media_generation_preset(kind: MediaGenerationKind, name: str) -> None:\n    from storage.studio_db import upsert_app_settings\n    with _settings_lock:\n        stored = _stored_settings(kind)\n        stored[\"customPresets\"] = [\n            item for item in _custom_presets(stored) if item.get(\"name\") != name\n        ]\n        upsert_app_settings({_setting_key(kind): stored})\n","sourceCodeStart":64,"sourceCodeEnd":97,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/utils/media_generation_preset_settings.py#L64-L97","documentation":"upsert_media_generation_preset() enforces a cap of _MAX_PRESETS custom presets per generation kind (image/video). Saving a NEW preset name when the stored list already has _MAX_PRESETS readable presets raises this; saving over an existing name (replacing) is always allowed, and unreadable/stale entries are filtered out by is_readable before counting.","triggerScenarios":"Calling upsert_media_generation_preset(kind, preset, is_readable) where preset['name'] does not match any stored readable preset and len(readable) >= _MAX_PRESETS. The check runs under _settings_lock, so the count is race-free within one process.","commonSituations":"A user iterating on generation settings saves each variation as a new preset and hits the ceiling; preset entries pointing at deleted LoRAs/models keep counting until their is_readable flags them unreadable; teams sharing a settings DB accumulating presets.","solutions":["Delete an existing preset first via delete_media_generation_preset(kind, name), then save the new one","Save over an existing name instead of creating a new entry — overwrites bypass the cap","Raise _MAX_PRESETS in the module and restart, if a larger library is genuinely needed","Prune presets whose backing models are gone (they stop counting once is_readable flags them unreadable)"],"exampleFix":"# before\nupsert_media_generation_preset('image', {'name': 'preset-11'}, is_readable)\n# ValueError: Delete a preset before saving another one\n\n# after\ndelete_media_generation_preset('image', 'preset-3')\nupsert_media_generation_preset('image', {'name': 'preset-11'}, is_readable)  # ok","handlingStrategy":"validation","validationCode":"from utils.media_generation_preset_settings import _custom_presets, _stored_settings, _MAX_PRESETS\n\ndef can_save_preset(kind, name: str, is_readable) -> bool:\n    readable = [p for p in _custom_presets(_stored_settings(kind)) if is_readable(p)]\n    return any(p.get('name') == name for p in readable) or len(readable) < _MAX_PRESETS","typeGuard":null,"tryCatchPattern":"try:\n    upsert_media_generation_preset(kind, preset, is_readable)\nexcept ValueError:\n    prompt_user_to_delete_one(kind)  # then retry upsert","preventionTips":["Overwrite existing preset names instead of accumulating near-duplicates","Prune presets referencing deleted models/LoRAs periodically"],"tags":["presets","media-generation","quota","settings"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}