Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import kotlinx.serialization.json.JsonClassDiscriminator
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
import com.google.ai.sample.network.MistralRequestCoordinator
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
Expand Down Expand Up @@ -70,7 +71,13 @@ data class ServiceMistralResponseMessage(
val content: String
)

internal suspend fun callMistralApi(modelName: String, apiKey: String, chatHistory: List<Content>, inputContent: Content): Pair<String?, String?> {
internal suspend fun callMistralApi(
modelName: String,
apiKey: String,
chatHistory: List<Content>,
inputContent: Content,
availableApiKeys: List<String> = listOf(apiKey)
): Pair<String?, String?> {
var responseText: String? = null
var errorMessage: String? = null

Expand Down Expand Up @@ -129,7 +136,16 @@ internal suspend fun callMistralApi(modelName: String, apiKey: String, chatHisto
.addHeader("Authorization", "Bearer $apiKey")
.build()

client.newCall(request).execute().use { response ->
val keysForCoordinator = availableApiKeys.filter { it.isNotBlank() }.distinct().ifEmpty { listOf(apiKey) }
val coordinated = MistralRequestCoordinator.execute(apiKeys = keysForCoordinator, maxAttempts = maxOf(4, keysForCoordinator.size * 3)) { key ->
client.newCall(
request.newBuilder()
.header("Authorization", "Bearer $key")
.build()
).execute()
}

coordinated.response.use { response ->
val responseBody = response.body?.string()
if (!response.isSuccessful) {
Log.e("ScreenCaptureService", "Mistral API Error ($response.code): $responseBody")
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/kotlin/com/google/ai/sample/ScreenCaptureService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,16 @@ class ScreenCaptureService : Service() {
if (apiProvider == ApiProvider.VERCEL) {
responseText = callVercelApi(applicationContext, modelName, apiKey, chatHistoryDtos, inputContentDto)
} else if (apiProvider == ApiProvider.MISTRAL) {
val result = callMistralApi(modelName, apiKey, chatHistory, inputContent)
val availableMistralKeys = ApiKeyManager.getInstance(applicationContext)
.getApiKeys(ApiProvider.MISTRAL)
.filter { it.isNotBlank() }
val result = callMistralApi(
modelName = modelName,
apiKey = apiKey,
chatHistory = chatHistory,
inputContent = inputContent,
availableApiKeys = availableMistralKeys
)
responseText = result.first
errorMessage = result.second
} else if (apiProvider == ApiProvider.PUTER) {
Expand Down
Loading
Loading