{"record":{"id":"8c53e45e6ab7f3a4","repo":"sgl-project/sglang","slug":"composite-input-event-payload-requires-input-type","errorCode":null,"errorMessage":"composite_input event payload requires {input_type}","messagePattern":"composite_input event payload requires (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py","lineNumber":208,"sourceCode":"        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],\n                        event_id,\n                    ),\n                )\n            )\n\n        input_logs = []\n        for input_type, parsed_payload in parsed_inputs:\n            input_logs.append(\n                self._ingest_parsed_composite_input_item(\n                    state,\n                    input_type,","sourceCodeStart":190,"sourceCodeEnd":226,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py#L190-L226","documentation":"For every type listed in input_types, the payload map must contain a same-named key with that input's data. Missing any declared key raises this with the type name.","triggerScenarios":"{input_types: [\"prompt\", \"camera_actions\"], prompt: \"hi\"} — camera_actions declared but not present in the payload map.","commonSituations":"Client conditionally omitting optional inputs but still listing them in input_types; key naming mismatch (e.g. 'cameraActions' vs 'camera_actions').","solutions":["Keep input_types and the payload keys exactly in sync — declare only what you send","Use exact snake_case key names for each declared type","Build the payload and input_types together: input_types = list(payload_keys minus 'input_types')"],"exampleFix":"// before\n{input_types: [\"prompt\", \"camera_actions\"], prompt: \"hi\"}\n// after\n{input_types: [\"prompt\"], prompt: \"hi\"}","handlingStrategy":"validation","validationCode":"for t in payload['input_types']:\n    assert t in payload, f'missing key {t}'\nassert set(payload['input_types']) <= (set(payload) - {'input_types'})","typeGuard":null,"tryCatchPattern":"except ValueError as e: if 'requires' in str(e): add the missing key and resend","preventionTips":["Derive input_types from the keys you actually send","Keep declared types and payload keys in lockstep"],"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"}