{"record":{"id":"773a6c483ae88107","repo":"mlflow/mlflow","slug":"record-i-is-missing-required-inputs-field-or-i","errorCode":null,"errorMessage":"Record {i} is missing required 'inputs' field or it is empty","messagePattern":"Record (.+?) is missing required 'inputs' field or it is empty","errorType":"validation","errorClass":"MlflowException","httpStatus":null,"severity":"error","filePath":"mlflow/genai/optimize/util.py","lineNumber":104,"sourceCode":"def validate_train_data(\n    train_data: \"pd.DataFrame\",\n    scorers: list[Scorer] | None,\n    predict_fn: Callable[..., Any] | None = None,\n) -> None:\n    \"\"\"\n    Validate that training data has required fields for prompt optimization.\n\n    Args:\n        train_data: Training data as a pandas DataFrame.\n        scorers: Scorers to validate the training data for. Can be None for zero-shot mode.\n        predict_fn: The predict function to validate the training data for.\n\n    Raises:\n        MlflowException: If any record is missing required 'inputs' field or it is empty.\n    \"\"\"\n    for i, record in enumerate(train_data.to_dict(\"records\")):\n        if \"inputs\" not in record or not record[\"inputs\"]:\n            raise MlflowException.invalid_parameter_value(\n                f\"Record {i} is missing required 'inputs' field or it is empty\"\n            )\n\n    if scorers is not None:\n        builtin_scorers = [scorer for scorer in scorers if isinstance(scorer, BuiltInScorer)]\n        valid_data_for_builtin_scorers(train_data, builtin_scorers, predict_fn)\n\n\ndef infer_type_from_value(value: Any, model_name: str = \"Output\") -> type:\n    \"\"\"\n    Infer the type from the value.\n    Only supports primitive types, lists, and dict and Pydantic models.\n    \"\"\"\n    if value is None:\n        return type(None)\n    elif isinstance(value, (bool, int, float, str)):\n        return type(value)\n    elif isinstance(value, list):","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/genai/optimize/util.py#L86-L122","documentation":"Raised during prompt optimization when a training record lacks the 'inputs' field or it is empty/None. Optimization needs per-record inputs to run the predict_fn and scorers, so MLflow validates the train_data (DataFrame) before proceeding and fails fast on malformed rows.","triggerScenarios":"Calling mlflow.genai.optimize_prompts (via validate_train_data) with a train_data DataFrame whose 'inputs' column is absent, or where a row's 'inputs' is None or an empty value (e.g. empty dict/string).","commonSituations":"Building training data with inconsistent column names (e.g. 'input' instead of 'inputs'); rows filtered down until some have no inputs; concatenating datasets where one batch lacks the column; constructing records programmatically with None placeholders.","solutions":["Rename/add the 'inputs' column to train_data so every row has it","Drop or fix rows where inputs is None/empty, e.g. df = df[df['inputs'].apply(lambda x: bool(x))]","Verify the DataFrame passed to optimize_prompts is the one produced by to_df()/the expected schema, not a differently-shaped frame"],"exampleFix":"// before\ntrain_data = pd.DataFrame({\"input\": [{\"question\": \"q\"}], \"expectations\": [{}]})\n// after\ntrain_data = pd.DataFrame({\"inputs\": [{\"question\": \"q\"}], \"expectations\": [{}]})","handlingStrategy":"validation","validationCode":"import pandas as pd\nmissing = train_data[~train_data[\"inputs\"].apply(lambda x: bool(x))]\nif not missing.empty:\n    raise ValueError(f\"Rows missing/empty 'inputs': {missing.index.tolist()}\")","typeGuard":"def has_inputs(record: dict) -> bool:\n    return bool(record.get(\"inputs\"))","tryCatchPattern":"from mlflow.exceptions import MlflowException\ntry:\n    result = mlflow.genai.optimize_prompts(...)\nexcept MlflowException as e:\n    if \"missing required 'inputs'\" in str(e):\n        train_data = train_data[train_data[\"inputs\"].apply(bool)]\n    else:\n        raise","preventionTips":["Validate train_data schema right after building it, before any API call","Standardize on the 'inputs' column name in data-prep code","Drop or repair empty-input rows during dataset assembly","Add a unit test asserting every training row has a non-empty inputs"],"tags":["mlflow","genai","validation","input-data"],"backgroundTag":"missing-required-field","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}