{"record":{"id":"d434e8bd9f2f464c","repo":"mudler/LocalAI","slug":"name-must-be-a-number","errorCode":null,"errorMessage":"{name} must be a number","messagePattern":"(.+?) must be a number","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/python/longcat-video/longcat_utils.py","lineNumber":109,"sourceCode":"\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):\n    try:\n        return dict(ATTENTION_OVERRIDES[name])\n    except KeyError as err:\n        choices = \", \".join(ATTENTION_OVERRIDES)\n        raise ValueError(f\"attention_backend must be one of: {choices}\") from err\n\n\ndef _model_name_from_directory(path):\n    for filename in (\"model_index.json\", \"config.json\"):\n        config_path = os.path.join(path, filename)","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/mudler/LocalAI/blob/44413a9d06bf5bc52ce088ba8ca74e5a2e8bee26/backend/python/longcat-video/longcat_utils.py#L91-L127","documentation":"Raised by require_float() in the longcat-video backend when a numeric option cannot be parsed with float(). TypeError (None, containers) and ValueError (unparseable strings like 'fast') are re-raised as this message with the original exception chained.","triggerScenarios":"Calling an option routed through require_float with None, a non-numeric string ('high'), or a malformed number ('1,5' with a comma separator from locale-formatted input).","commonSituations":"Locale-formatted decimal strings, YAML values that parse as strings instead of numbers, or null passed from JSON payloads for optional float fields.","solutions":["Pass a real float/int or a clean numeric string like '0.7'","Normalize locale input before validation (replace ',' with '.')","Default None to the option's default before calling require_float"],"exampleFix":"# before\nrequire_float('0,7', 'cfg_scale')  # ValueError: cfg_scale must be a number\n\n# after\nrequire_float('0.7', 'cfg_scale')  # 0.7","handlingStrategy":"validation","validationCode":"def coerce_float(value, default=None):\n    if value is None:\n        return default\n    try:\n        return float(value)\n    except (TypeError, ValueError):\n        return None\n\nscale = coerce_float(opts.get('cfg_scale'), 0.7)","typeGuard":"def is_float_like(v) -> bool:\n    if isinstance(v, bool):\n        return False\n    if isinstance(v, (int, float)):\n        return True\n    if isinstance(v, str):\n        try:\n            float(v)\n            return True\n        except ValueError:\n            return False\n    return False","tryCatchPattern":"try:\n    value = require_float(raw, 'cfg_scale')\nexcept ValueError as err:\n    logger.warning('invalid option: %s', err)\n    value = DEFAULT","preventionTips":["Normalize locale decimal separators before validation","Map null to defaults at the JSON boundary","Validate numeric fields with JSON schema (type: number) upstream"],"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"}