{"record":{"id":"79b4ca33185c4b71","repo":"mlflow/mlflow","slug":"invalid-parameter-value-79b4ca","errorCode":"INVALID_PARAMETER_VALUE","errorMessage":"The `feedback_value_type` argument does not support a Literal typewith non-primitive types, but got {type(value).__name__}. Literal values must be str, int, float, or bool.","messagePattern":"The `feedback_value_type` argument does not support a Literal typewith non-primitive types, but got (.+?)\\. Literal values must be str, int, float, or bool\\.","errorType":"error_code","errorClass":"MlflowException","httpStatus":400,"severity":"error","filePath":"mlflow/genai/judges/make_judge.py","lineNumber":57,"sourceCode":"    # Check for basic PbValueType (float, int, str, bool)\n    pb_value_types = get_args(PbValueType)\n    if feedback_value_type in pb_value_types:\n        return\n\n    # Check for Optional[T] / T | None where T is a single primitive PbValueType\n    if _is_optional_pb_value_type(feedback_value_type, pb_value_types):\n        return\n\n    # Check for Literal type\n    origin = get_origin(feedback_value_type)\n    if origin is Literal:\n        # Validate that all literal values are of PbValueType\n        literal_values = get_args(feedback_value_type)\n        for value in literal_values:\n            if not isinstance(value, pb_value_types):\n                from mlflow.exceptions import MlflowException\n\n                raise MlflowException.invalid_parameter_value(\n                    \"The `feedback_value_type` argument does not support a Literal type\"\n                    f\"with non-primitive types, but got {type(value).__name__}. \"\n                    f\"Literal values must be str, int, float, or bool.\"\n                )\n        return\n\n    # Check for dict[str, PbValueType]\n    if origin is dict:\n        args = get_args(feedback_value_type)\n        if len(args) == 2:\n            key_type, value_type = args\n            # Key must be str\n            if key_type != str:\n                from mlflow.exceptions import MlflowException\n\n                raise MlflowException.invalid_parameter_value(\n                    f\"dict key type must be str, got {key_type}\"\n                )","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/genai/judges/make_judge.py#L39-L75","documentation":"make_judge validates feedback_value_type and only permits Literal types whose values are primitive PbValueType members (str, int, float, bool). Passing a Literal containing any other value type (e.g. None, a tuple, bytes, or a dict) fails this check with INVALID_PARAMETER_VALUE.","triggerScenarios":"Calling make_judge(feedback_value_type=Literal[\"yes\", \"no\", None]) or Literal[(1,2)] or Literal[b\"a\"] — any Literal arg that is not str/int/float/bool.","commonSituations":"Trying to encode an optional categorical score as Literal[..., None] instead of Optional[Literal[...]]; accidentally passing tuple/list args; copying a Literal from an enum of non-primitive members.","solutions":["Remove non-primitive values from the Literal, keeping only str/int/float/bool members.","For an optional score, wrap instead of embedding None: Optional[Literal[\"yes\", \"no\"]] or Literal[\"yes\", \"no\"] | None.","Validate the Literal args before calling make_judge (see defense) or use plain str feedback_value_type if arbitrary values are acceptable."],"exampleFix":"// before\nmake_judge(name=\"j\", instructions=\"...\", feedback_value_type=Literal[\"yes\", \"no\", None])\n// after\nmake_judge(name=\"j\", instructions=\"...\", feedback_value_type=Optional[Literal[\"yes\", \"no\"]])","handlingStrategy":"type-guard","validationCode":"from typing import Literal, get_args, get_origin\ndef check_literal(t):\n    if get_origin(t) is Literal:\n        bad = [v for v in get_args(t) if not isinstance(v, (str, int, float, bool))]\n        if bad:\n            raise ValueError(f\"Literal has non-primitive values: {bad}\")\n    return t\n\ncheck_literal(feedback_value_type)","typeGuard":"def is_primitive_literal(t) -> bool:\n    from typing import Literal, get_args, get_origin\n    return get_origin(t) is Literal and all(\n        isinstance(v, (str, int, float, bool)) for v in get_args(t)\n    )","tryCatchPattern":"from mlflow.exceptions import MlflowException\ntry:\n    judge = make_judge(name=\"j\", instructions=\"...\", feedback_value_type=fvt)\nexcept MlflowException as e:\n    if \"does not support a Literal type\" in str(e):\n        judge = make_judge(name=\"j\", instructions=\"...\", feedback_value_type=str)\n    else:\n        raise","preventionTips":["Use Optional[Literal[...]] instead of embedding None in a Literal.","Keep Literal members to str/int/float/bool only.","Check FeedbackValueType docs before choosing an exotic annotation."],"tags":["mlflow","make-judge","typing","literal"],"backgroundTag":"unsupported-type-annotation","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}