{"record":{"id":"b8aeb4bf951ff66a","repo":"mlflow/mlflow","slug":"outputs-must-be-either-none-mlflow-models-signatu","errorCode":null,"errorMessage":"outputs must be either None, mlflow.models.signature.Schema, or a dataclass,got '{type(outputs).__name__}'","messagePattern":"outputs must be either None, mlflow\\.models\\.signature\\.Schema, or a dataclass,got '(.+?)'","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"mlflow/models/signature.py","lineNumber":87,"sourceCode":"    dataset, model predictions using and params for inference, or constructed by hand by\n    passing an input and output :py:class:`Schema <mlflow.types.Schema>`, and params\n    :py:class:`ParamSchema <mlflow.types.ParamSchema>`.\n    \"\"\"\n\n    def __init__(\n        self,\n        # `dataclass` is an invalid type annotation. Use `Any` instead as a workaround.\n        inputs: Schema | Any = None,\n        outputs: Schema | Any = None,\n        params: ParamSchema = None,\n    ):\n        if inputs and not isinstance(inputs, Schema) and not is_dataclass(inputs):\n            raise TypeError(\n                \"inputs must be either None, mlflow.models.signature.Schema, or a dataclass,\"\n                f\"got '{type(inputs).__name__}'\"\n            )\n        if outputs and not isinstance(outputs, Schema) and not is_dataclass(outputs):\n            raise TypeError(\n                \"outputs must be either None, mlflow.models.signature.Schema, or a dataclass,\"\n                f\"got '{type(outputs).__name__}'\"\n            )\n        if params and not isinstance(params, ParamSchema):\n            raise TypeError(\n                \"If params are provided, they must by of type mlflow.models.signature.ParamSchema, \"\n                f\"got '{type(params).__name__}'\"\n            )\n        if all(x is None for x in [inputs, outputs, params]):\n            raise ValueError(\"At least one of inputs, outputs or params must be provided\")\n        if is_dataclass(inputs):\n            self.inputs = convert_dataclass_to_schema(inputs)\n        else:\n            self.inputs = inputs\n        if is_dataclass(outputs):\n            self.outputs = convert_dataclass_to_schema(outputs)\n        else:\n            self.outputs = outputs","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/models/signature.py#L69-L105","documentation":"A TypeError raised by `ModelSignature.__init__` in mlflow/models/signature.py:87 when the `outputs` argument is neither None, a `Schema`, nor a dataclass. It mirrors the inputs validation: only explicitly supported types are accepted so signature metadata can be reliably serialized.","triggerScenarios":"Constructing `ModelSignature(inputs=..., outputs=...)` with raw example outputs (DataFrame, array, dict, list) rather than a Schema or dataclass instance.","commonSituations":"Manually assembling signatures with prediction output samples, refactored code that swapped infer_signature for direct construction.","solutions":["Build the signature with `infer_signature(model_input, model_output)` so outputs are converted to a Schema automatically.","Pass an explicit `mlflow.models.signature.Schema` for outputs.","Pass a dataclass instance describing outputs if you prefer typed definitions."],"exampleFix":"// before\nModelSignature(inputs=schema, outputs=y_array)  # ndarray not allowed\n// after\nsig = infer_signature(X, y_array)","handlingStrategy":"type-guard","validationCode":"from mlflow.models.signature import Schema\nfrom dataclasses import is_dataclass\n\ndef validate_outputs_arg(outputs) -> None:\n    if outputs and not isinstance(outputs, Schema) and not is_dataclass(outputs):\n        raise TypeError(f'outputs must be Schema or dataclass, got {type(outputs).__name__}')","typeGuard":"def is_valid_signature_outputs(x) -> bool:\n    from mlflow.models.signature import Schema\n    from dataclasses import is_dataclass\n    return x is None or isinstance(x, Schema) or is_dataclass(x)","tryCatchPattern":"try:\n    sig = ModelSignature(inputs=schema, outputs=raw_predictions)\nexcept TypeError:\n    sig = infer_signature(X, raw_predictions)","preventionTips":["Derive outputs from infer_signature(model_input, model_output).","Never pass raw arrays/DataFrames as outputs to ModelSignature.","Add a constructor-level assertion in helper code that wraps signature building."],"tags":["python","signature","type-validation"],"backgroundTag":"invalid-argument-type","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}