{"record":{"id":"6d1f48fd635b9845","repo":"mudler/LocalAI","slug":"name-must-be-at-least-minimum","errorCode":null,"errorMessage":"{name} must be at least {minimum}","messagePattern":"(.+?) must be at least (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/python/longcat-video/longcat_utils.py","lineNumber":99,"sourceCode":"    kept = {key: value for key, value in options.items() if key in known}\n    return kept, ignored\n\n\ndef require_bool(value, name):\n    if isinstance(value, bool):\n        return value\n    if isinstance(value, str) and value.lower() in {\"true\", \"false\"}:\n        return value.lower() == \"true\"\n    raise ValueError(f\"{name} must be true or false\")\n\n\ndef require_int(value, name, minimum=None, maximum=None):\n    try:\n        parsed = int(value)\n    except (TypeError, ValueError) as err:\n        raise ValueError(f\"{name} must be an integer\") from err\n    if minimum is not None and parsed < minimum:\n        raise ValueError(f\"{name} must be at least {minimum}\")\n    if maximum is not None and parsed > maximum:\n        raise ValueError(f\"{name} must be at most {maximum}\")\n    return parsed\n\n\ndef require_float(value, name, minimum=None, maximum=None):\n    try:\n        parsed = float(value)\n    except (TypeError, ValueError) as err:\n        raise ValueError(f\"{name} must be a number\") from err\n    if minimum is not None and parsed < minimum:\n        raise ValueError(f\"{name} must be at least {minimum}\")\n    if maximum is not None and parsed > maximum:\n        raise ValueError(f\"{name} must be at most {maximum}\")\n    return parsed\n\n\ndef attention_overrides(name):","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/python/longcat-video/longcat_utils.py#L81-L117","documentation":"Raised by require_int() in longcat-video when the parsed integer is below the minimum bound supplied by the caller. It is a range check on an already-valid integer, so the value parsed fine but the option's contract (e.g. fps >= 1) rejects it.","triggerScenarios":"Calling require_int(value, name, minimum=N) with a parsed value below N, e.g. require_int(0, 'fps', minimum=1), or a string like '-5' for an option whose minimum is 0 or higher.","commonSituations":"Off-by-one config values (fps=0, segments=0), negative values from user input, or defaults computed from subtraction that can go below the floor for short clips.","solutions":["Raise the value to at least the documented minimum","If lower values are genuinely valid, fix the minimum passed by the calling option, not this helper","Clamp before validating when the API promises best-effort semantics: max(value, minimum)"],"exampleFix":"# before\nfps = require_int(request.fps, 'fps', minimum=1)  # fps=0 -> ValueError\n\n# after\nfps = require_int(max(1, request.fps or 1), 'fps', minimum=1)","handlingStrategy":"validation","validationCode":"MIN = 1\nraw = request.fps if request.fps is not None else MIN\nif int(raw) < MIN:\n    raw = MIN  # or reject with a specific message\nfps = require_int(raw, 'fps', minimum=MIN)","typeGuard":"def is_at_least(v, minimum: int) -> bool:\n    try:\n        return int(v) >= minimum\n    except (TypeError, ValueError):\n        return False","tryCatchPattern":"try:\n    fps = require_int(raw, 'fps', minimum=1)\nexcept ValueError as err:\n    return error_response(str(err), hint=f'fps must be >= 1, got {raw!r}')","preventionTips":["Enforce floors in the UI/API layer with clear messages","Clamp user input to documented ranges before backend calls","Document each option's minimum where it is exposed"],"tags":["python","validation","range-check","longcat-video"],"backgroundTag":null,"analyzedSha":"44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26","analyzedAt":"2026-08-15T10:13:50.291Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}