{"record":{"id":"7b086a7ab67eb4df","repo":"sgl-project/sglang","slug":"canonical-request-has-unknown-fields-sorted-unkn","errorCode":null,"errorMessage":"canonical request has unknown fields: {sorted(unknown)}","messagePattern":"canonical request has unknown fields: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/resolved_plan.py","lineNumber":274,"sourceCode":"\n\ndef minimax_h3_resolve_plan(canonical: Mapping[str, Any]) -> MiniMaxH3ResolvedPlan:\n    \"\"\"Canonical request (already validated) -> ResolvedPlan.\"\"\"\n    if not isinstance(canonical, Mapping):\n        raise ValueError(\"canonical request must be a mapping\")\n    allowed_keys = {\n        \"schema\",\n        \"task\",\n        \"prompt\",\n        \"conditions\",\n        \"target\",\n        \"seed\",\n        \"flow_shift\",\n        \"audio_flow_shift\",\n    }\n    unknown = set(canonical) - allowed_keys\n    if unknown:\n        raise ValueError(f\"canonical request has unknown fields: {sorted(unknown)}\")\n    for key in (\"schema\", \"task\", \"prompt\", \"conditions\", \"target\"):\n        if key not in canonical:\n            raise ValueError(f\"canonical request missing {key!r}\")\n    profile = minimax_h3_task_profile(str(canonical[\"task\"]))\n    conditions = canonical[\"conditions\"]\n    keyframe_conditions = (\n        [\n            condition\n            for condition in conditions\n            if isinstance(condition, Mapping) and condition.get(\"role\") == \"keyframe\"\n        ]\n        if isinstance(conditions, (list, tuple))\n        else []\n    )\n    if profile.task == \"fl2va\" or keyframe_conditions:\n        signatures = (\n            [\n                (","sourceCodeStart":256,"sourceCodeEnd":292,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/resolved_plan.py#L256-L292","documentation":"The canonical request passed to minimax_h3_resolve_plan contains fields outside the allowed key set (schema, task, prompt, conditions, target, seed, flow_shift, audio_flow_shift, ...). Unknown keys are rejected to catch schema drift between validation and plan resolution.","triggerScenarios":"Calling minimax_h3_resolve_plan with a dict containing extra keys such as 'model', 'metadata', or a typo like 'promt', or a stale field removed in the current version.","commonSituations":"Version mismatch where a newer validator emits a field the older resolver doesn't allow (or vice versa); hand-built canonical dicts that skip the validator; internal fields leaking through from transport.","solutions":["Remove or rename unknown fields to match the allowed key set printed in the error","Route requests through minimax_h3_validate_canonical_request so the canonical dict is built by the library","Align validator and resolver versions (same package version)"],"exampleFix":"# before\nresolve_plan({**canonical, \"model\": \"minimax-h3\"})\n# after\nresolve_plan(canonical)","handlingStrategy":"validation","validationCode":"ALLOWED = {\"schema\",\"task\",\"prompt\",\"conditions\",\"target\",\"seed\",\"flow_shift\",\"audio_flow_shift\"}\ndef no_unknown_fields(canon): return not (set(canon) - ALLOWED)","typeGuard":"null","tryCatchPattern":"null","preventionTips":["Always produce canonical dicts via minimax_h3_validate_canonical_request","Keep validator and resolver from the same package version"],"tags":["minimax-h3","unknown-fields","schema-drift","resolved-plan"],"backgroundTag":"schema-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}