File tree Expand file tree Collapse file tree
main/java/ai/openclaw/app/voice
test/java/ai/openclaw/app/voice Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -41,7 +41,7 @@ internal class TalkSpeakClient(
4141 if (! response.ok) {
4242 val error = response.error
4343 val message = error?.message ? : " talk.speak request failed"
44- return if (isFallbackEligible(error?.details?.reason )) {
44+ return if (isFallbackEligible(error)) {
4545 TalkSpeakResult .FallbackToLocal (message)
4646 } else {
4747 TalkSpeakResult .Failure (message)
@@ -74,7 +74,9 @@ internal class TalkSpeakClient(
7474 )
7575 }
7676
77- private fun isFallbackEligible (reason : String? ): Boolean {
77+ private fun isFallbackEligible (error : GatewaySession .ErrorShape ? ): Boolean {
78+ val reason = error?.details?.reason
79+ if (reason == null ) return true
7880 return reason == " talk_unconfigured" ||
7981 reason == " talk_provider_unsupported" ||
8082 reason == " method_unavailable"
Original file line number Diff line number Diff line change @@ -103,4 +103,26 @@ class TalkSpeakClientTest {
103103 val result = client.synthesize(text = " Hello" , directive = null )
104104 assertTrue(result is TalkSpeakResult .Failure )
105105 }
106+
107+ @Test
108+ fun fallsBackWhenGatewayOmitsReason () = runTest {
109+ val client =
110+ TalkSpeakClient (
111+ requestDetailed = { _, _, _ ->
112+ GatewaySession .RpcResult (
113+ ok = false ,
114+ payloadJson = null ,
115+ error =
116+ GatewaySession .ErrorShape (
117+ code = " INVALID_REQUEST" ,
118+ message = " unknown method: talk.speak" ,
119+ details = null ,
120+ ),
121+ )
122+ },
123+ )
124+
125+ val result = client.synthesize(text = " Hello" , directive = null )
126+ assertTrue(result is TalkSpeakResult .FallbackToLocal )
127+ }
106128}
You can’t perform that action at this time.
0 commit comments