{"record":{"id":"0b7124724eaeccf7","repo":"unslothai/unsloth","slug":"do-not-reserve-system-ram-must-be-true-or-false","errorCode":null,"errorMessage":"Do not reserve system RAM must be true or false.","messagePattern":"Do not reserve system RAM must be true or false\\.","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"studio/backend/utils/model_memory_settings.py","lineNumber":152,"sourceCode":"    return pair\n\n\ndef set_model_memory_settings(\n    keep_resident: Any = None, no_ram_reserve: Any = None\n) -> tuple[bool, bool]:\n    \"\"\"One-transaction write; ``None`` leaves a stored value untouched.\"\"\"\n    updates: dict[str, bool] = {}\n\n    if keep_resident is not None:\n        parsed = _coerce_bool(keep_resident)\n        if parsed is None:\n            raise ValueError(\"Keep model in GPU memory must be true or false.\")\n        updates[KEEP_RESIDENT_SETTING_KEY] = parsed\n\n    if no_ram_reserve is not None:\n        parsed = _coerce_bool(no_ram_reserve)\n        if parsed is None:\n            raise ValueError(\"Do not reserve system RAM must be true or false.\")\n        updates[NO_RAM_RESERVE_SETTING_KEY] = parsed\n\n    if updates:\n        from storage.studio_db import upsert_app_settings\n        upsert_app_settings(updates)\n        _invalidate(*updates)\n\n    return get_keep_resident(), get_no_ram_reserve()\n\n\ndef memlock_limit_bytes() -> Optional[int]:\n    \"\"\"Soft RLIMIT_MEMLOCK, or None when unlimited or unavailable.\n\n    mlock cannot exceed this. Linux commonly defaults to 8 MB, where llama.cpp\n    logs \"failed to mlock\" and carries on, so residency would silently do\n    nothing. None on Windows (no RLIMIT_MEMLOCK) and on macOS (unlimited).\n    \"\"\"\n    try:","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/utils/model_memory_settings.py#L134-L170","documentation":"Identical coercion guard for the second field: no_ram_reserve passes through _coerce_bool() and any non-None unrecognized value raises. It maps to the 'Do not reserve system RAM' toggle that influences llama.cpp's RAM reservation behavior at model load time.","triggerScenarios":"set_model_memory_settings(no_ram_reserve='Y'), no_ram_reserve='toggle', or any value _coerce_bool cannot map to a bool. Fires independently of keep_resident — either field can raise on its own.","commonSituations":"Clients using localized truthy strings; form libraries emitting '1'/'0' strings where only a subset is accepted; copy-pasted payloads from a different API version with string flags.","solutions":["Send a real boolean: set_model_memory_settings(no_ram_reserve=False)","Normalize string flags client-side to booleans before the request","Pass None to leave the stored value untouched"],"exampleFix":"# before\nset_model_memory_settings(no_ram_reserve='off')\n# ValueError: Do not reserve system RAM must be true or false.\n\n# after\nset_model_memory_settings(no_ram_reserve=False)","handlingStrategy":"type-guard","validationCode":"def is_bool_like(v) -> bool:\n    return v is None or isinstance(v, bool) or v in (0, 1) or str(v).strip().lower() in ('true', 'false')\n\nif not is_bool_like(payload.get('no_ram_reserve')):\n    return 400 'no_ram_reserve must be a boolean'","typeGuard":"def coerce_bool_or_none(v):\n    if v is None or isinstance(v, bool):\n        return v\n    if isinstance(v, int) and v in (0, 1):\n        return bool(v)\n    if isinstance(v, str) and v.strip().lower() in ('true', 'false'):\n        return v.strip().lower() == 'true'\n    return None  # caller rejects","tryCatchPattern":"try:\n    set_model_memory_settings(no_ram_reserve=v)\nexcept ValueError as e:\n    return 422 {'detail': str(e)}","preventionTips":["Validate both flag fields with the same boolean schema","Document that None means 'unchanged', not false"],"tags":["settings","boolean-coercion","ram","api-validation"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}