{"record":{"id":"66566533b2b19cf0","repo":"microsoft/semantic-kernel","slug":"audio-track-not-initialized","errorCode":null,"errorMessage":"Audio track not initialized","messagePattern":"Audio track not initialized","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"critical","filePath":"python/semantic_kernel/connectors/ai/open_ai/services/_open_ai_realtime.py","lineNumber":780,"sourceCode":"                    }\n                    event_dict[\"session\"] = {k: v for k, v in session_dict.items() if k in allowed_fields}\n\n                self.data_channel.send(json.dumps(event_dict))\n            else:\n                self.data_channel.send(event.model_dump_json(exclude_none=True))\n        except Exception as e:\n            logger.error(f\"Failed to send event {event} with error: {e!s}\")\n\n    @override\n    async def create_session(\n        self,\n        chat_history: \"ChatHistory | None\" = None,\n        settings: \"PromptExecutionSettings | None\" = None,\n        **kwargs: Any,\n    ) -> None:\n        \"\"\"Create a session in the service.\"\"\"\n        if not self.audio_track:\n            raise Exception(\"Audio track not initialized\")\n        self.peer_connection = RTCPeerConnection(\n            configuration=RTCConfiguration(iceServers=[RTCIceServer(urls=\"stun:stun.l.google.com:19302\")])\n        )\n\n        # track is the audio track being returned from the service\n        self.peer_connection.add_listener(\"track\", self._on_track)\n\n        # data channel is used to send and receive messages\n        self.data_channel = self.peer_connection.createDataChannel(\"oai-events\", protocol=\"json\")\n        self.data_channel.add_listener(\"message\", self._on_data)\n\n        # this is the incoming audio, which sends audio to the service\n        self.peer_connection.addTransceiver(self.audio_track)\n\n        offer = await self.peer_connection.createOffer()\n        await self.peer_connection.setLocalDescription(offer)\n\n        try:","sourceCodeStart":762,"sourceCodeEnd":798,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/connectors/ai/open_ai/services/_open_ai_realtime.py#L762-L798","documentation":"The OpenAIRealtimeWebRTCService.create_session() method requires an audio track (an aiortc MediaStreamTrack) to be set on self.audio_track before it can establish the WebRTC peer connection. If audio_track is falsy (None or unset), a bare Exception is raised. This is an internal-state error indicating the service was not properly initialized.","triggerScenarios":"Calling create_session() on an OpenAIRealtimeWebRTCService instance where the audio track was never set — e.g. constructing the service without providing audio input capability, or calling create_session() before the audio pipeline is wired up.","commonSituations":"Initializing the WebRTC realtime service without a microphone or audio source; race condition where create_session is called before set_audio_track; using the WebRTC service class when you intended the WebSocket-based one.","solutions":["Ensure the audio track is set on the service instance before calling create_session().","Verify the audio source (microphone, file reader) is initialized and provides a valid MediaStreamTrack.","Check if you should be using the WebRTC service at all — the WebSocket realtime service may be more appropriate if you don't need WebRTC audio."],"exampleFix":"// before\nservice = OpenAIRealtimeWebRTCService(...)\nawait service.create_session()\n// after\nservice = OpenAIRealtimeWebRTCService(...)\nservice.audio_track = my_audio_stream_track  # set before create_session\nawait service.create_session()","handlingStrategy":"validation","validationCode":"def ensure_audio_track(service) -> None:\n    if not getattr(service, 'audio_track', None):\n        raise RuntimeError(\n            'audio_track is not set on the WebRTC realtime service. '\n            'Set it before calling create_session().'\n        )","typeGuard":"def has_audio_track(service) -> bool:\n    return getattr(service, 'audio_track', None) is not None","tryCatchPattern":"try:\n    await service.create_session()\nexcept Exception as e:\n    if 'Audio track not initialized' in str(e):\n        service.audio_track = create_audio_track()\n        await service.create_session()","preventionTips":["Always wire the audio track before calling create_session().","Verify the audio source (microphone, file) initializes successfully.","Consider the WebSocket realtime service if you don't need WebRTC audio."],"tags":["openai","realtime","webrtc","audio-track","initialization","semantic-kernel"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}