{"record":{"id":"90e09c9968048dfd","repo":"sgl-project/sglang","slug":"composite-input-event-payload-must-be-a-map","errorCode":null,"errorMessage":"composite_input event payload must be a map","messagePattern":"composite_input event payload must be a map","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py","lineNumber":194,"sourceCode":"    ) -> str:\n        prompt = self._validate_prompt_payload(payload)\n        state.receive_prompt(prompt, event_id=event_id)\n        return f\"kind=prompt, prompt_len={len(prompt)}\"\n\n    @staticmethod\n    def _validate_prompt_payload(payload: Any) -> str:\n        if not isinstance(payload, str) or not payload:\n            raise ValueError(\"prompt event payload must be a non-empty string\")\n        return payload\n\n    def _ingest_composite_input(\n        self,\n        state: LingBotWorldRealtimeState,\n        payload: Any,\n        event_id: int | None,\n    ) -> str:\n        if not isinstance(payload, dict):\n            raise ValueError(\"composite_input event payload must be a map\")\n        input_types = payload.get(\"input_types\")\n        if not isinstance(input_types, list) or not input_types:\n            raise ValueError(\n                \"composite_input event payload requires non-empty input_types\"\n            )\n\n        parsed_inputs = []\n        for input_type in input_types:\n            if not isinstance(input_type, str) or not input_type:\n                raise ValueError(\n                    \"composite_input input_types must contain non-empty strings\"\n                )\n            if input_type not in payload:\n                raise ValueError(f\"composite_input event payload requires {input_type}\")\n            parsed_inputs.append(\n                (\n                    input_type,\n                    self._parse_composite_input_item(","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py#L176-L212","documentation":"A composite_input event payload must be a JSON object (dict). This check fires when the payload is a list, string, number, or null instead of a map containing input_types and the declared inputs.","triggerScenarios":"ws.send({kind: \"composite_input\", payload: [\"prompt\"]}) — passing an array where the adapter expects a map with an input_types key.","commonSituations":"Client modeling composite input as a plain array of items; misunderstanding the composite_input contract (input_types declares which keys are present).","solutions":["Send composite_input as an object: {\"input_types\": [...], <type>: <payload>}","Read the adapter's _ingest_composite_input for the exact shape","Use simple 'prompt'/'camera_actions' events if you don't need composition"],"exampleFix":"// before\n{kind: \"composite_input\", payload: [\"prompt\"]}\n// after\n{kind: \"composite_input\", payload: {input_types: [\"prompt\"], prompt: \"hello\"}}","handlingStrategy":"type-guard","validationCode":"assert isinstance(payload, dict) and isinstance(payload.get('input_types'), list)","typeGuard":"def is_composite_payload(x: object) -> bool: return isinstance(x, dict) and isinstance(x.get('input_types'), list) and bool(x['input_types'])","tryCatchPattern":null,"preventionTips":["Always send composite_input as a JSON object with input_types"],"tags":["realtime","event-validation","composite-input"],"backgroundTag":"event-payload-type-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}