{"record":{"id":"85c6967a5c7aea58","repo":"mudler/LocalAI","slug":"name-must-be-an-integer","errorCode":null,"errorMessage":"{name} must be an integer","messagePattern":"(.+?) must be an integer","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/python/longcat-video/longcat_utils.py","lineNumber":97,"sourceCode":"    \"\"\"\n    ignored = sorted(key for key in options if key not in known)\n    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","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/python/longcat-video/longcat_utils.py#L79-L115","documentation":"Raised by require_int() in the longcat-video backend when a value passed as an integer option cannot be parsed with int(). Both TypeError (None, list, dict) and ValueError (non-numeric string like 'abc' or '1.5') are converted into this clearer ValueError, chained from the original exception.","triggerScenarios":"Calling a longcat-video backend option setter that routes through require_int with a non-integer value, e.g. width='832px', num_frames=None, or duration='long'. int('1.5') and int('') also fail, so float strings and empty strings trigger it even though they look numeric.","commonSituations":"YAML model config where a quoted value ('\"480\"' style strings work, '\"480.0\"' does not), env-var-sourced options that arrive as empty strings, or a JSON request body sending null for an optional integer field.","solutions":["Pass a real int, or a string that int() accepts exactly (e.g. '480' not '480.0')","If the value is optional, ensure the caller maps None/omitted to the backend default before calling require_int instead of passing it through","Convert floats first: require_int(int(float(value)), name) when fractional input is legitimate"],"exampleFix":"# before\nrequire_int('480.0', 'width')  # ValueError: width must be an integer\n\n# after\nrequire_int(int(float('480.0')), 'width')  # 480","handlingStrategy":"validation","validationCode":"def coerce_int(value, default=None):\n    if value is None:\n        return default\n    try:\n        return int(value)\n    except (TypeError, ValueError):\n        return None\n\nwidth = coerce_int(opts.get('width'), 832)\nif width is None:\n    raise ValueError('width must be an integer') from None","typeGuard":"def is_int_like(v) -> bool:\n    if isinstance(v, bool):\n        return False\n    if isinstance(v, int):\n        return True\n    if isinstance(v, str):\n        try:\n            int(v)\n            return True\n        except ValueError:\n            return False\n    return False","tryCatchPattern":"try:\n    value = require_int(raw, 'name')\nexcept ValueError as err:\n    logger.warning('invalid option: %s', err)\n    value = DEFAULT","preventionTips":["Always convert/verify int-ability before passing user-supplied options","Reject float strings early or normalize them with int(float(v))","Treat None as 'use default' at the API boundary, never forward it"],"tags":["python","validation","longcat-video","configuration"],"backgroundTag":null,"analyzedSha":"44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26","analyzedAt":"2026-08-15T10:13:50.291Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}