{"record":{"id":"bdaf47d023fecf1d","repo":"sgl-project/sglang","slug":"prompt-event-payload-must-be-a-string","errorCode":null,"errorMessage":"prompt event payload must be a string","messagePattern":"prompt event payload must be a string","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py","lineNumber":102,"sourceCode":"        camera_actions = parsed.payload\n        self.receive_camera_action_script(camera_actions, event_id=event_id)\n        return f\"kind=camera_actions, mode=script, frames={len(camera_actions)}\"\n\n    def receive_camera_control_event_payload(\n        self,\n        payload: Any,\n        *,\n        event_id: int | None,\n    ) -> str:\n        parsed = self.parse_camera_control_event_payload(payload, event_id=event_id)\n        return self.receive_parsed_camera_control_event_payload(\n            parsed, event_id=event_id\n        )\n\n    def sample_prompt(self) -> str:\n        prompt = self.prompt_queue.pop_latest(\"prompt\")\n        if not isinstance(prompt, str):\n            raise ValueError(\"prompt event payload must be a string\")\n        self.latest_sampled_event_id = self.prompt_queue.last_sampled_seq_id(\"prompt\")\n        return prompt\n\n    def has_prompt(self) -> bool:\n        return self.prompt_queue.has_events(\"prompt\")\n\n\nclass LingBotWorldRealtimeAdapter(BaseRealtimeModelAdapter):\n    def create_state(self) -> LingBotWorldRealtimeState:\n        return LingBotWorldRealtimeState()\n\n    def _state(self, session: GenerateSession) -> LingBotWorldRealtimeState:\n        state = session.adapter_state\n        if not isinstance(state, LingBotWorldRealtimeState):\n            raise TypeError(\"LingBot realtime adapter state is not initialized\")\n        return state\n\n    async def on_init(","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/entrypoints/openai/realtime/adapters/lingbot_world_realtime_adapter.py#L84-L120","documentation":"The LingBot world realtime adapter's sample_prompt popped the latest 'prompt' event and its payload was not a str (e.g. dict, number, or None-like non-string). The adapter enforces that prompt events carry plain string payloads.","triggerScenarios":"A realtime session where a 'prompt' event (or composite input prompt field) was ingested with a non-string payload such as {\"text\": ...} or a number, and sampling later pops it.","commonSituations":"Client wrapping the prompt in an object ({\"text\": \"...\"}) instead of sending a bare string; upstream event schema mismatch between client and adapter versions.","solutions":["Send the prompt event payload as a plain JSON string","If you need structured prompts, use composite_input with input_types=[\"prompt\"] and a string value","Check the adapter version's expected event schema before upgrading clients"],"exampleFix":"// before\nws.send(JSON.stringify({kind: \"prompt\", payload: {text: \"hello\"}}))\n// after\nws.send(JSON.stringify({kind: \"prompt\", payload: \"hello\"}))","handlingStrategy":"type-guard","validationCode":"if not isinstance(prompt, str): prompt = str(prompt)","typeGuard":"def is_valid_prompt(p: object) -> bool: return isinstance(p, str) and len(p) > 0","tryCatchPattern":"try: prompt = adapter.sample_prompt()\nexcept ValueError as e: if 'must be a string' in str(e): skip/repair event","preventionTips":["Send prompt payloads as bare JSON strings","Never wrap prompts in objects"],"tags":["realtime","event-validation","prompt","websocket"],"backgroundTag":"event-payload-type-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}