{"record":{"id":"9832c8b6be687172","repo":"sgl-project/sglang","slug":"path-must-be-a-list","errorCode":null,"errorMessage":"{path} must be a list","messagePattern":"(.+?) must be a list","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/request_validation.py","lineNumber":151,"sourceCode":"                f\"{path}.duration_seconds must be in \"\n                f\"[{MINIMAX_H3_MIN_DURATION_SECONDS:g}, \"\n                f\"{MINIMAX_H3_MAX_DURATION_SECONDS:g}], got {duration}\"\n            )\n        out[\"duration_seconds\"] = float(duration)\n    return out\n\n\ndef _validate_conditions(\n    conditions: Any,\n    *,\n    profile: MiniMaxH3TaskProfile,\n    frame_count: int | None,\n) -> list[dict[str, Any]]:\n    path = \"conditions\"\n    if conditions is None:\n        conditions = []\n    if not isinstance(conditions, Sequence) or isinstance(conditions, (str, bytes)):\n        raise ValueError(f\"{path} must be a list\")\n\n    if not profile.conditions_required:\n        if len(conditions) > 0:\n            raise ValueError(\n                f\"{path} must be empty for task {profile.task!r} \"\n                f\"(got {len(conditions)} entries)\"\n            )\n        return []\n    if len(conditions) == 0:\n        raise ValueError(\n            f\"{path} requires at least one entry for task {profile.task!r}\"\n        )\n    if (\n        profile.min_condition_count is not None\n        and len(conditions) < profile.min_condition_count\n    ):\n        raise ValueError(\n            f\"{path} requires at least {profile.min_condition_count} entries \"","sourceCodeStart":133,"sourceCodeEnd":169,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/request_validation.py#L133-L169","documentation":"The top-level conditions field is not a list/Sequence — it is a dict, string, number, etc. (str/bytes are explicitly excluded from counting as sequences). A single condition object instead of a list is the classic cause.","triggerScenarios":"Passing conditions={...} (one object) or conditions=\"keyframe\" instead of conditions=[{...}].","commonSituations":"Wrapping a single condition without brackets; JSON schema drift where conditions became an object keyed by id.","solutions":["Wrap conditions in a list even for a single entry","Pass [] (or omit, it defaults to []) when no conditions are needed"],"exampleFix":"// before\n\"conditions\": {\"role\": \"keyframe\", ...}\n// after\n\"conditions\": [{\"role\": \"keyframe\", ...}]","handlingStrategy":"type-guard","validationCode":"if not isinstance(conditions, list):\n    conditions = [conditions] if isinstance(conditions, dict) else []","typeGuard":"def is_condition_list(v) -> bool:\n    return isinstance(v, (list, tuple))","tryCatchPattern":null,"preventionTips":["Always wrap single conditions in a list"],"tags":["minimax-h3","conditions","type-mismatch"],"backgroundTag":"type-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}