From 6ad836a5f433e4fa36a0c914309f1a0c70ed82b3 Mon Sep 17 00:00:00 2001 From: tom Date: Sun, 30 Nov 2025 18:50:15 +0200 Subject: [PATCH 1/3] fixed websocket new message parsing - prompt_ack and session_id for new api support --- src/client/kotlin/ai/decart/oasis/MirageAPI.kt | 16 ++++++++++++++++ src/client/kotlin/ai/decart/oasis/OasisClient.kt | 2 ++ 2 files changed, 18 insertions(+) diff --git a/src/client/kotlin/ai/decart/oasis/MirageAPI.kt b/src/client/kotlin/ai/decart/oasis/MirageAPI.kt index b1bbf31..7e6e427 100644 --- a/src/client/kotlin/ai/decart/oasis/MirageAPI.kt +++ b/src/client/kotlin/ai/decart/oasis/MirageAPI.kt @@ -56,3 +56,19 @@ data class MirageIncomingAnswerMessage( data class MirageIncomingErrorMessage( val error: String, ) : MirageIncomingMessage + +@Serializable +@SerialName("session_id") +data class MirageIncomingSessionIdMessage( + val session_id: String, + val server_port: Int, + val server_ip: String, +) : MirageIncomingMessage + +@Serializable +@SerialName("prompt_ack") +data class MirageIncomingPromptAckMessage( + val prompt: String, + val success: Boolean, + val error: String? = null, +) : MirageIncomingMessage diff --git a/src/client/kotlin/ai/decart/oasis/OasisClient.kt b/src/client/kotlin/ai/decart/oasis/OasisClient.kt index c41b1d4..042b17e 100644 --- a/src/client/kotlin/ai/decart/oasis/OasisClient.kt +++ b/src/client/kotlin/ai/decart/oasis/OasisClient.kt @@ -461,6 +461,8 @@ object OasisClient : ClientModInitializer { Utils.log("Received error message: ${message.error}") onUnexpectedError(if (message.error == "401: Invalid API key") "Invalid API key" else null) } + is MirageIncomingSessionIdMessage -> {} + is MirageIncomingPromptAckMessage -> {} } } From 0f79f888af7475ffc21735bfcb31dcbe54f0f87c Mon Sep 17 00:00:00 2001 From: tom Date: Mon, 1 Dec 2025 11:28:10 +0200 Subject: [PATCH 2/3] handle generation_started ws message and add min/max bitrate --- src/client/kotlin/ai/decart/oasis/MirageAPI.kt | 6 ++++++ src/client/kotlin/ai/decart/oasis/OasisClient.kt | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/client/kotlin/ai/decart/oasis/MirageAPI.kt b/src/client/kotlin/ai/decart/oasis/MirageAPI.kt index 7e6e427..fc11e0e 100644 --- a/src/client/kotlin/ai/decart/oasis/MirageAPI.kt +++ b/src/client/kotlin/ai/decart/oasis/MirageAPI.kt @@ -72,3 +72,9 @@ data class MirageIncomingPromptAckMessage( val success: Boolean, val error: String? = null, ) : MirageIncomingMessage + +@Serializable +@SerialName("generation_started") +data class MirageIncomingGenerationStartedMessage( + val dummy: String? = null +) : MirageIncomingMessage diff --git a/src/client/kotlin/ai/decart/oasis/OasisClient.kt b/src/client/kotlin/ai/decart/oasis/OasisClient.kt index 042b17e..30eaf44 100644 --- a/src/client/kotlin/ai/decart/oasis/OasisClient.kt +++ b/src/client/kotlin/ai/decart/oasis/OasisClient.kt @@ -51,6 +51,9 @@ import dev.onvoid.webrtc.RTCIceCandidate import dev.onvoid.webrtc.RTCOfferOptions import dev.onvoid.webrtc.RTCPeerConnection import dev.onvoid.webrtc.RTCPeerConnectionState +import dev.onvoid.webrtc.RTCRtpEncodingParameters +import dev.onvoid.webrtc.RTCRtpParameters +import dev.onvoid.webrtc.RTCRtpSender import dev.onvoid.webrtc.RTCRtpTransceiver import dev.onvoid.webrtc.RTCRtpTransceiverInit import dev.onvoid.webrtc.RTCSdpType @@ -463,6 +466,7 @@ object OasisClient : ClientModInitializer { } is MirageIncomingSessionIdMessage -> {} is MirageIncomingPromptAckMessage -> {} + is MirageIncomingGenerationStartedMessage -> {} } } @@ -558,6 +562,16 @@ object OasisClient : ClientModInitializer { val videoTrack = WebRTC.peerConnectionFactory.createVideoTrack("videoTrack", videoSource) val transceiver = peerConnection!!.addTransceiver(videoTrack, RTCRtpTransceiverInit()) WebRTC.preferVideoCodec(transceiver, "VP8") + + val sender = transceiver.sender + val parameters = sender.parameters + if (parameters.encodings.isNotEmpty()) { + val encoding = parameters.encodings[0] + encoding.minBitrate = 200 * 1000 + encoding.maxBitrate = 2500 * 1000 + sender.setParameters(parameters) + Utils.log("Configured VP8 sender bitrate: min=200kbps, max=2.5mbps") + } } fun onUnexpectedError(message: String? = null) { From bebd9d21bc5120ea56b109b3a3fbb38d6b5a50f8 Mon Sep 17 00:00:00 2001 From: tom Date: Mon, 1 Dec 2025 13:51:12 +0200 Subject: [PATCH 3/3] change min and max bitrate --- src/client/kotlin/ai/decart/oasis/OasisClient.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/client/kotlin/ai/decart/oasis/OasisClient.kt b/src/client/kotlin/ai/decart/oasis/OasisClient.kt index 30eaf44..56288ef 100644 --- a/src/client/kotlin/ai/decart/oasis/OasisClient.kt +++ b/src/client/kotlin/ai/decart/oasis/OasisClient.kt @@ -567,10 +567,10 @@ object OasisClient : ClientModInitializer { val parameters = sender.parameters if (parameters.encodings.isNotEmpty()) { val encoding = parameters.encodings[0] - encoding.minBitrate = 200 * 1000 + encoding.minBitrate = 400 * 1000 encoding.maxBitrate = 2500 * 1000 sender.setParameters(parameters) - Utils.log("Configured VP8 sender bitrate: min=200kbps, max=2.5mbps") + Utils.log("Configured VP8 sender bitrate: min=400kbps, max=2.5mbps") } }