{"record":{"id":"6b73400c36a48b3a","repo":"sgl-project/sglang","slug":"material-uri-base64-payload-must-be-ascii","errorCode":null,"errorMessage":"material URI base64 payload must be ASCII","messagePattern":"material URI base64 payload must be ASCII","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":140,"sourceCode":"    index = payload_start\n    while index < len(uri):\n        character = uri[index]\n        if character == \"%\":\n            if index + 2 >= len(uri):\n                raise ValueError(\"material URI has an invalid percent escape\")\n            try:\n                value = int(uri[index + 1 : index + 3], 16)\n            except ValueError as exc:\n                raise ValueError(\"material URI has an invalid percent escape\") from exc\n            index += 3\n            character = chr(value)\n        else:\n            index += 1\n\n        if character.isspace():\n            continue\n        if len(character) != 1 or ord(character) > 127:\n            raise ValueError(\"material URI base64 payload must be ASCII\")\n        value = ord(character)\n        if value not in _BASE64_ALPHABET:\n            raise ValueError(\n                f\"material URI has an invalid base64 character {character!r}\"\n            )\n        yield value\n\n\ndef _parse_tar_member_uri(uri: str) -> tuple[Path, int, int, str | None]:\n    if uri.startswith(\"tar+offset://\"):\n        prefix = \"tar+offset://\"\n    elif uri.startswith(\"tar+b64header://\"):\n        prefix = \"tar+b64header://\"\n    else:\n        raise ValueError(\"unsupported tar material URI\")\n    try:\n        tar_path, encoded_header = uri[len(prefix) :].rsplit(\":\", 1)\n    except ValueError as exc:","sourceCodeStart":122,"sourceCodeEnd":158,"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#L122-L158","documentation":"After percent-decoding and whitespace skipping, every payload character must be a single ASCII character (ord <= 127). This error fires when decoding produced a multi-character string (e.g. an int() yielding a codepoint outside BMP handled via chr producing surrogates is fine, but any character with ord > 127 or a decoded artifact) — i.e. the payload contains non-ASCII bytes, which cannot be valid base64.","triggerScenarios":"A base64 payload containing raw UTF-8 multibyte characters, or a percent escape decoding to a codepoint > 127 (e.g. '%C3%A9' decoding to 'é').","commonSituations":"Passing text that was never base64-encoded, double-encoding mistakes where UTF-8 bytes are percent-encoded into the payload, or copy/paste of base64 with unicode smart quotes.","solutions":["Base64-encode the raw bytes properly: base64.b64encode(blob).decode('ascii')","If the producer percent-encodes, ensure it only encodes ASCII whitespace, not arbitrary bytes","Strip/normalize non-ASCII characters from URIs at request ingestion"],"exampleFix":"// before\nuri = \"base64://\" + \"café\"  # non-ASCII text as payload\n// after\nuri = \"base64://\" + base64.b64encode(\"café\".encode()).decode('ascii')","handlingStrategy":"validation","validationCode":"try:\n    payload.encode('ascii')\nexcept UnicodeEncodeError:\n    raise ValueError('material payload is not ASCII/base64')","typeGuard":"def payload_is_ascii(payload: str) -> bool:\n    try:\n        payload.encode('ascii')\n        return True\n    except UnicodeEncodeError:\n        return False","tryCatchPattern":null,"preventionTips":["Always base64-encode binary input to ASCII","Normalize unicode quotes/dashes when pasting base64"],"tags":["minimax-h3","base64","ascii","material-io"],"backgroundTag":"invalid-base64-payload","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}