Skip to content

Commit b226d98

Browse files
committed
Bug 2020858 - Adds debug drawer item to toggle between mlpa environments r=matt-tighe
[try](https://treeherder.mozilla.org/jobs?repo=try&landoCommitID=183229) Pull request: #91
1 parent 411fd75 commit b226d98

5 files changed

Lines changed: 63 additions & 16 deletions

File tree

mobile/android/android-components/components/lib/llm-mlpa/src/main/java/mozilla/components/lib/llm/mlpa/service/FetchClientMlpaService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class FetchClientMlpaService(
7171
): Result<ChatService.Response> {
7272
val bodyString = json.encodeToString(request)
7373
val fetchRequest = Request(
74-
url = "${config.baseUrl}/chat/completions",
74+
url = "${config.baseUrl}/v1/chat/completions",
7575
method = Request.Method.POST,
7676
headers = MutableHeaders(
7777
"authorization" to authorizationToken.value,

mobile/android/android-components/components/lib/llm-mlpa/src/main/java/mozilla/components/lib/llm/mlpa/service/MlpaService.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,17 @@ data class MlpaConfig(
4040
/**
4141
* Preconfigured MLPA configuration targeting the live (non-prod stage) environment.
4242
*/
43-
val live
43+
val nonProd
4444
get() = MlpaConfig(
45-
baseUrl = "https://mlpa-nonprod-stage-mozilla.global.ssl.fastly.net/v1",
45+
baseUrl = "https://mlpa-nonprod-dev-mozilla.global.ssl.fastly.net",
46+
)
47+
48+
/**
49+
* Preconfigured MLPA configuration targeting the live (prod-prod) environment.
50+
*/
51+
val prodProd
52+
get() = MlpaConfig(
53+
baseUrl = "https://mlpa-prod-prod-mozilla.global.ssl.fastly.net",
4654
)
4755
}
4856
}

mobile/android/android-components/components/lib/llm-mlpa/src/test/java/mozilla/components/lib/llm/mlpa/service/FetchClientMlpaServiceTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class FetchClientMlpaServiceTest {
2727
""".trimIndent()
2828

2929
val mlpaService =
30-
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.live)
30+
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.prodProd)
3131

3232
val response = mlpaService.verify(
3333
request = AuthenticationService.Request(
@@ -59,7 +59,7 @@ class FetchClientMlpaServiceTest {
5959
""".trimIndent()
6060

6161
val mlpaService =
62-
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.live)
62+
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.prodProd)
6363

6464
val response = mlpaService.verify(
6565
request = AuthenticationService.Request(
@@ -80,7 +80,7 @@ class FetchClientMlpaServiceTest {
8080
@Test
8181
fun `GIVEN a failure response WHEN we try to verify an integrity THEN return a failure`() =
8282
runTest {
83-
val mlpaService = FetchClientMlpaService(FakeClient.failure(401), MlpaConfig.live)
83+
val mlpaService = FetchClientMlpaService(FakeClient.failure(401), MlpaConfig.prodProd)
8484

8585
val response = mlpaService.verify(
8686
request = AuthenticationService.Request(
@@ -113,7 +113,7 @@ class FetchClientMlpaServiceTest {
113113
""".trimIndent()
114114

115115
val mlpaService =
116-
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.live)
116+
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.prodProd)
117117

118118
val response = mlpaService.completion(
119119
authorizationToken = AuthorizationToken("my-token"),
@@ -149,7 +149,7 @@ class FetchClientMlpaServiceTest {
149149
""".trimIndent()
150150

151151
val mlpaService =
152-
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.live)
152+
FetchClientMlpaService(FakeClient.success(json.asBody), MlpaConfig.prodProd)
153153

154154
val response = mlpaService.completion(
155155
authorizationToken = AuthorizationToken("my-token"),
@@ -169,7 +169,7 @@ class FetchClientMlpaServiceTest {
169169
@Test
170170
fun `GIVEN an error status code WHEN try to chat THEN return a failure`() =
171171
runTest {
172-
val mlpaService = FetchClientMlpaService(FakeClient.failure(401), MlpaConfig.live)
172+
val mlpaService = FetchClientMlpaService(FakeClient.failure(401), MlpaConfig.prodProd)
173173

174174
val response = mlpaService.completion(
175175
authorizationToken = AuthorizationToken("my-token"),

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Llm.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,34 @@ import mozilla.components.concept.integrity.IntegrityClient
99
import mozilla.components.lib.llm.mlpa.MlpaLlmProvider
1010
import mozilla.components.lib.llm.mlpa.MlpaTokenProvider
1111
import mozilla.components.lib.llm.mlpa.UserIdProvider
12+
import mozilla.components.lib.llm.mlpa.service.AuthenticationService
13+
import mozilla.components.lib.llm.mlpa.service.AuthorizationToken
14+
import mozilla.components.lib.llm.mlpa.service.ChatService
1215
import mozilla.components.lib.llm.mlpa.service.FetchClientMlpaService
1316
import mozilla.components.lib.llm.mlpa.service.MlpaConfig
17+
import mozilla.components.lib.llm.mlpa.service.MlpaService
1418
import mozilla.components.lib.llm.mlpa.service.PackageName
1519
import org.mozilla.fenix.BuildConfig
1620
import org.mozilla.fenix.perf.lazyMonitored
1721

22+
/**
23+
* Temporary class for toggling between prod and nonprod MLPA environment
24+
*/
25+
class FenixMlpaService(
26+
client: Client,
27+
var useProd: Boolean = false,
28+
) : MlpaService {
29+
private val nonProd = FetchClientMlpaService(client, MlpaConfig.nonProd)
30+
private val prod = FetchClientMlpaService(client, MlpaConfig.prodProd)
31+
private val service get() = if (useProd) prod else nonProd
32+
33+
override suspend fun verify(request: AuthenticationService.Request) = service.verify(request)
34+
override suspend fun completion(
35+
authorizationToken: AuthorizationToken,
36+
request: ChatService.Request,
37+
) = service.completion(authorizationToken, request)
38+
}
39+
1840
/**
1941
* Component group for LLM services.
2042
*/
@@ -23,15 +45,17 @@ class Llm(
2345
private val integrityClient: IntegrityClient,
2446
private val userIdProvider: UserIdProvider,
2547
) {
48+
49+
val fenixMlpaService by lazyMonitored { FenixMlpaService(client) }
2650
val mlpaProvider: MlpaLlmProvider by lazyMonitored {
2751
MlpaLlmProvider(
2852
MlpaTokenProvider.mlpaIntegrityHandshake(
2953
integrityClient = integrityClient,
30-
authenticationService = FetchClientMlpaService(client, MlpaConfig.live),
54+
authenticationService = fenixMlpaService,
3155
userIdProvider = userIdProvider,
3256
packageName = PackageName(BuildConfig.APPLICATION_ID),
3357
),
34-
FetchClientMlpaService(client, MlpaConfig.live),
58+
fenixMlpaService,
3559
)
3660
}
3761
}

mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/llm/LlmTools.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
package org.mozilla.fenix.debugsettings.llm
66

77
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Row
89
import androidx.compose.foundation.layout.fillMaxWidth
10+
import androidx.compose.material3.Switch
911
import androidx.compose.material3.Text
1012
import androidx.compose.runtime.Composable
1113
import androidx.compose.runtime.collectAsState
@@ -35,16 +37,29 @@ fun LlmTools(
3537
llm: LlmComponent,
3638
) {
3739
val state by llm.mlpaProvider.state.collectAsState()
40+
var useProd by remember { mutableStateOf(llm.fenixMlpaService.useProd) }
3841

39-
when (state) {
40-
State.Unavailable -> UnavailableState()
41-
is State.Available -> AvailableState(llm.mlpaProvider)
42-
is State.Ready -> ReadyState((state as State.Ready).llm)
42+
Column {
43+
Row {
44+
Text("Use Prod")
45+
Switch(useProd, onCheckedChange = { checked ->
46+
useProd = checked
47+
llm.fenixMlpaService.useProd = checked
48+
})
49+
}
50+
51+
when (state) {
52+
State.Unavailable -> UnavailableState()
53+
is State.Available -> AvailableState(llm.mlpaProvider)
54+
is State.Ready -> ReadyState((state as State.Ready).llm)
55+
}
4356
}
4457
}
4558

4659
@Composable
47-
private fun ReadyState(llm: Llm) {
60+
private fun ReadyState(
61+
llm: Llm,
62+
) {
4863
val scope = rememberCoroutineScope()
4964

5065
var llmResponse by remember { mutableStateOf("") }

0 commit comments

Comments
 (0)