{"record":{"id":"c396d46d9c096d92","repo":"sgl-project/sglang","slug":"composite-input-event-payload-requires-non-empty-i","errorCode":null,"errorMessage":"composite_input event payload requires non-empty input_types","messagePattern":"composite_input event payload requires non-empty input_types","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py","lineNumber":197,"sourceCode":"        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(\n                        state,\n                        input_type,\n                        payload[input_type],","sourceCodeStart":179,"sourceCodeEnd":215,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py#L179-L215","documentation":"composite_input payloads must include a non-empty list 'input_types' telling the adapter which input modalities the event carries. Missing, non-list, or empty input_types triggers this.","triggerScenarios":"{kind: \"composite_input\", payload: {prompt: \"hi\"}} — payload is a map but omits input_types, or sets it to [] or a string.","commonSituations":"Client assuming the adapter infers types from present keys; refactoring that drops the input_types field.","solutions":["Always include input_types: [\"prompt\"] (or with camera types) in every composite_input payload","Make input_types mirror exactly the keys you actually send","Validate the payload structure client-side before send"],"exampleFix":"// before\n{input_types: [], prompt: \"hi\"}\n// after\n{input_types: [\"prompt\"], prompt: \"hi\"}","handlingStrategy":"validation","validationCode":"types_ = payload.setdefault('input_types', ['prompt'])\nassert isinstance(types_, list) and types_","typeGuard":"def has_input_types(x: dict) -> bool: return isinstance(x.get('input_types'), list) and len(x['input_types']) > 0","tryCatchPattern":null,"preventionTips":["Never omit input_types in composite_input","Keep a payload-builder helper that inserts it automatically"],"tags":["realtime","event-validation","composite-input","missing-field"],"backgroundTag":"missing-required-parameter","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}