{"record":{"id":"a625ee3243322a87","repo":"sgl-project/sglang","slug":"keyframe-condition-rows-require-plan-task-fl2va","errorCode":null,"errorMessage":"keyframe condition rows require plan.task='fl2va' or 'ref2va'","messagePattern":"keyframe condition rows require plan\\.task='fl2va' or 'ref2va'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/denoising.py","lineNumber":86,"sourceCode":"        # imgvid noise aug 1.0 still overrides this.\n        imgvid_noise_aug = MINIMAX_H3_IMGVID_COND_TIMESTEP\n    audio_noise_aug = getattr(\n        sampling,\n        \"audio_cond_noise_aug_for_inference\",\n        None,\n    )\n    if audio_noise_aug is None:\n        audio_noise_aug = MINIMAX_H3_AUDIO_REF_COND_TIMESTEP\n    return float(imgvid_noise_aug), float(audio_noise_aug)\n\n\ndef _validate_keyframe_payload(plan: Any, keyframe: Any) -> None:\n    \"\"\"Reject stale/middle/reordered keyframe payloads at the DiT sink.\"\"\"\n\n    task = None if plan is None else str(plan.task)\n    if task not in {\"fl2va\", \"ref2va\"}:\n        if keyframe is not None:\n            raise ValueError(\n                \"keyframe condition rows require plan.task='fl2va' or 'ref2va'\"\n            )\n        return\n    if keyframe is None:\n        if task == \"fl2va\":\n            raise ValueError(\"fl2va denoising requires encoded keyframe condition rows\")\n        return\n    if not isinstance(keyframe, Mapping):\n        raise ValueError(\"encoded keyframe condition rows must be a mapping\")\n\n    semantic_indices = tuple(keyframe.get(\"semantic_frame_indices\") or ())\n    if semantic_indices not in MINIMAX_H3_FL2VA_KEYFRAME_SIGNATURES:\n        raise ValueError(\n            \"keyframe denoising requires semantic_frame_indices in \"\n            f\"{MINIMAX_H3_FL2VA_KEYFRAME_SIGNATURES!r}, \"\n            f\"got {semantic_indices!r}\"\n        )\n    frame_count = keyframe.get(\"frame_count\")","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/stages/denoising.py#L68-L104","documentation":"At the DiT sink, _validate_keyframe_payload rejects any non-None keyframe payload when plan.task is not 'fl2va' or 'ref2va'. Keyframe conditioning is only meaningful for those two tasks.","triggerScenarios":"A batch carrying encoded keyframe rows (e.g. from a prior keyframe-conditioned request) reaching the denoiser while plan.task is something like 't2v'.","commonSituations":"Reusing a batch/request object across tasks without clearing keyframe extras; task override at decode time dropping the plan's task while stale keyframe state remains.","solutions":["Clear keyframe payload/batch extras when switching to a non-keyframe task","Set the correct task ('fl2va'/'ref2va') if keyframe conditioning was intended"],"exampleFix":"# before\nbatch.keyframe = old_keyframe_rows  # task is 't2v'\n# after\nbatch.keyframe = None  # non-keyframe task","handlingStrategy":"validation","validationCode":"if plan.task not in {\"fl2va\", \"ref2va\"}:\n    batch.keyframe = None","typeGuard":"def keyframe_allowed(task: str) -> bool:\n    return task in {\"fl2va\", \"ref2va\"}","tryCatchPattern":null,"preventionTips":["Clear keyframe extras when switching tasks","Don't reuse batch objects across task types"],"tags":["minimax-h3","keyframe","task-mismatch"],"backgroundTag":"invalid-state-transition","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}