{"record":{"id":"fbb2356f0db62ac4","repo":"sgl-project/sglang","slug":"data-uri-must-contain-a-comma-separator","errorCode":null,"errorMessage":"data URI must contain a comma separator","messagePattern":"data URI must contain a comma separator","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":97,"sourceCode":"    if isinstance(registry, dict):\n        for owner in selected:\n            paths = registry.pop(owner, [])\n            if isinstance(paths, (list, tuple)):\n                for path in paths:\n                    shutil.rmtree(str(path), ignore_errors=True)\n        if not registry:\n            batch.extra.pop(MINIMAX_H3_TEMP_DIRS_EXTRA_KEY, None)\n    if owners is None or \"material\" in selected:\n        batch.extra.pop(MINIMAX_H3_MATERIAL_CACHE_EXTRA_KEY, None)\n        batch.extra.pop(MINIMAX_H3_MATERIAL_PROBE_EXTRA_KEY, None)\n\n\ndef _base64_uri_payload_start(uri: str) -> tuple[int, str | None]:\n    media_type = None\n    if uri.startswith(\"data:\"):\n        separator = uri.find(\",\")\n        if separator < 0:\n            raise ValueError(\"data URI must contain a comma separator\")\n        if separator > MINIMAX_H3_BASE64_HEADER_MAX_CHARS:\n            raise ValueError(\"data URI header is too large\")\n        header = uri[:separator]\n        if \";base64\" not in header:\n            raise ValueError(\"data URI must use ;base64 encoding\")\n        media_type = header[5:].split(\";\", 1)[0].lower() or None\n        payload_start = separator + 1\n    elif uri.startswith(\"base64://\"):\n        payload_start = len(\"base64://\")\n        separator = uri.find(\",\", payload_start)\n        if separator >= 0:\n            if separator - payload_start > MINIMAX_H3_BASE64_HEADER_MAX_CHARS:\n                raise ValueError(\"base64 URI header is too large\")\n            header = uri[payload_start:separator]\n            media_type = header.split(\";\", 1)[0].lower() or None\n            payload_start = separator + 1\n    else:  # pragma: no cover - guarded by the caller\n        raise ValueError(\"not a base64 material URI\")","sourceCodeStart":79,"sourceCodeEnd":115,"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#L79-L115","documentation":"When parsing a 'data:' base64 material URI, _base64_uri_payload_start requires a ',' separator between the header and the payload (RFC data-URI syntax). A data: URI with no comma cannot be split into header/payload, so the loader refuses it.","triggerScenarios":"Streaming a material URI like 'data:image/png;base64' (truncated, payload missing) or a malformed data URI that never contains ',' via _stream_base64_material.","commonSituations":"Truncated material URIs from LLM-generated content or prompt templates, string concatenation bugs that drop the payload, or upstream URL-encoding that strips the comma.","solutions":["Fix the producer to emit full 'data:<mediatype>;base64,<payload>' URIs","Validate the URI starts with 'data:' and contains ',' before submitting the request","Log the offending URI prefix (truncated) at ingestion to catch generation bugs early"],"exampleFix":"// before\nuri = f\"data:{media_type};base64\"  # payload never appended\n// after\nuri = f\"data:{media_type};base64,{base64.b64encode(blob).decode('ascii')}\"","handlingStrategy":"validation","validationCode":"if uri.startswith('data:') and ',' not in uri:\n    raise ValueError('rejecting malformed data URI (no comma) at ingestion')","typeGuard":"def is_wellformed_data_uri(uri: str) -> bool:\n    return uri.startswith('data:') and ',' in uri and uri.index(',') <= 128","tryCatchPattern":null,"preventionTips":["Validate material URIs at request ingestion","Build data URIs with a helper, never string concatenation"],"tags":["minimax-h3","data-uri","material-io","parsing"],"backgroundTag":"malformed-data-uri","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}