{"record":{"id":"3961c376a3cb0ef0","repo":"sgl-project/sglang","slug":"tar-material-uri-header-must-be-a-json-object","errorCode":null,"errorMessage":"tar material URI header must be a JSON object","messagePattern":"tar material URI header must be a JSON object","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/material_io.py","lineNumber":174,"sourceCode":"    try:\n        tar_path, encoded_header = uri[len(prefix) :].rsplit(\":\", 1)\n    except ValueError as exc:\n        raise ValueError(\n            \"tar material URI must contain '<tar_path>:<encoded_header>'\"\n        ) from exc\n    if len(encoded_header) > MINIMAX_H3_TAR_HEADER_MAX_ENCODED_CHARS:\n        raise ValueError(\"tar material URI encoded header is too large\")\n    padded = encoded_header + \"=\" * (-len(encoded_header) % 4)\n    try:\n        header = json.loads(\n            base64.b64decode(\n                padded.encode(\"ascii\"), altchars=b\"-_\", validate=True\n            ).decode(\"utf-8\")\n        )\n    except Exception as exc:\n        raise ValueError(\"tar material URI has an invalid encoded header\") from exc\n    if not isinstance(header, dict):\n        raise ValueError(\"tar material URI header must be a JSON object\")\n    if header.get(\"schema\") != \"sglang.tar_member_ref/v1\":\n        raise ValueError(\n            f\"unsupported tar material header schema: {header.get('schema')!r}\"\n        )\n    try:\n        offset = int(header[\"offset_data\"])\n        size = int(header[\"size\"])\n    except (KeyError, TypeError, ValueError) as exc:\n        raise ValueError(\n            \"tar material header requires integer offset_data and size\"\n        ) from exc\n    if offset < 0 or size < 0:\n        raise ValueError(\"tar material offset_data and size must be non-negative\")\n    return (\n        Path(tar_path).expanduser(),\n        offset,\n        size,\n        str(header.get(\"member\") or \"\") or None,","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/pipelines_core/stages/model_specific_stages/minimax_h3/material_io.py#L156-L192","documentation":"After decoding, the tar material header must be a JSON object (dict). Decoding to a list, string, number, or null raises this error, since the header is expected to carry keyed fields like schema, offset_data, and size.","triggerScenarios":"A header encoding a JSON array or scalar, e.g. base64 of '[1,2,3]' or '\"schema=v1\"'.","commonSituations":"Producers that encode a compact positional list instead of a dict, or version drift where an older header format was an array.","solutions":["Encode a dict: {\"schema\": \"sglang.tar_member_ref/v1\", \"offset_data\": ..., \"size\": ...}","If migrating formats, version the schema field and convert on read","Add a producer-side unit test that the emitted header round-trips to a dict"],"exampleFix":"// before\nheader = [offset, size]  # array\n// after\nheader = {\"schema\": \"sglang.tar_member_ref/v1\", \"offset_data\": offset, \"size\": size}","handlingStrategy":"type-guard","validationCode":"header = try_decode_header(encoded)\nassert isinstance(header, dict), 'tar header must be a JSON object'","typeGuard":"def header_is_object(header) -> bool:\n    return isinstance(header, dict)","tryCatchPattern":null,"preventionTips":["Serialize dicts, never lists/scalars","Version header formats via the schema field"],"tags":["minimax-h3","tar-uri","json","schema","material-io"],"backgroundTag":"schema-validation-failed","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}