Skip to content
Merged
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
@@ -1,5 +1,6 @@
package com.ai.assistance.operit.ui.features.memory.screens.dialogs

import android.widget.Toast
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
Expand Down Expand Up @@ -77,6 +78,14 @@ fun MemorySearchSettingsDialog(
var apiKey by remember(cloudConfig) { mutableStateOf(cloudConfig.apiKey) }
var model by remember(cloudConfig) { mutableStateOf(cloudConfig.model) }
var showApiKey by remember { mutableStateOf(false) }
var cloudEndpointError by remember(cloudConfig) { mutableStateOf<String?>(null) }

val context = LocalContext.current
val settingsSavedMessage = stringResource(R.string.settings_saved)
val endpointBlankError = stringResource(R.string.memory_embedding_cloud_endpoint_error_blank)
val endpointSchemeError = stringResource(R.string.memory_embedding_cloud_endpoint_error_scheme)
val endpointWhitespaceError = stringResource(R.string.memory_embedding_cloud_endpoint_error_whitespace)
val endpointMultipleUrlsError = stringResource(R.string.memory_embedding_cloud_endpoint_error_multiple_urls)

val editedCloudConfig = CloudEmbeddingConfig(
enabled = cloudEnabled,
Expand Down Expand Up @@ -188,9 +197,16 @@ fun MemorySearchSettingsDialog(
if (cloudEnabled) {
OutlinedTextField(
value = endpoint,
onValueChange = { endpoint = it },
onValueChange = {
endpoint = it
cloudEndpointError = null
},
modifier = Modifier.fillMaxWidth(),
label = { Text(stringResource(R.string.memory_embedding_cloud_endpoint)) },
isError = cloudEndpointError != null,
supportingText = cloudEndpointError?.let { errorText ->
{ Text(errorText) }
},
singleLine = true
)
OutlinedTextField(
Expand Down Expand Up @@ -299,6 +315,19 @@ fun MemorySearchSettingsDialog(
confirmButton = {
Button(
onClick = {
val endpointValidationError = validateCloudEmbeddingEndpoint(
endpoint = endpoint,
blankError = endpointBlankError,
schemeError = endpointSchemeError,
whitespaceError = endpointWhitespaceError,
multipleUrlsError = endpointMultipleUrlsError
)
if (cloudEnabled && endpointValidationError != null) {
Comment on lines +318 to +325
cloudEndpointError = endpointValidationError
return@Button
}

cloudEndpointError = null
onSave(
MemorySearchConfig(
scoreMode = scoreMode,
Expand All @@ -310,6 +339,7 @@ fun MemorySearchSettingsDialog(
editedCloudConfig,
editedAutoSaveIntervalMinutes.roundToInt()
)
Toast.makeText(context, settingsSavedMessage, Toast.LENGTH_SHORT).show()
}
) {
Text(stringResource(R.string.memory_save))
Expand Down Expand Up @@ -444,3 +474,21 @@ private fun stageText(stage: String): String {
else -> stage
}
}

private fun validateCloudEmbeddingEndpoint(
endpoint: String,
blankError: String,
schemeError: String,
whitespaceError: String,
multipleUrlsError: String
): String? {
val trimmed = endpoint.trim()
if (trimmed.isBlank()) return blankError
if (!trimmed.startsWith("http://") && !trimmed.startsWith("https://")) return schemeError
if (trimmed.any { it.isWhitespace() }) return whitespaceError
Comment on lines +485 to +488

val urlMatches = Regex("https?://").findAll(trimmed).count()
if (urlMatches > 1) return multipleUrlsError
Comment on lines +488 to +491

return null
}
4 changes: 4 additions & 0 deletions app/src/main/res/values-en/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5685,6 +5685,10 @@
<string name="memory_embedding_cloud_title">Cloud Embedding Model</string>
<string name="memory_embedding_cloud_enable">Enable cloud embedding model</string>
<string name="memory_embedding_cloud_endpoint">Embedding API endpoint</string>
<string name="memory_embedding_cloud_endpoint_error_blank">Embedding API endpoint cannot be empty</string>
<string name="memory_embedding_cloud_endpoint_error_scheme">Embedding API endpoint must start with http:// or https://</string>
<string name="memory_embedding_cloud_endpoint_error_whitespace">Embedding API endpoint cannot contain spaces or line breaks</string>
<string name="memory_embedding_cloud_endpoint_error_multiple_urls">Embedding API endpoint must contain only one URL</string>
<string name="memory_embedding_cloud_api_key">Embedding API key</string>
<string name="memory_embedding_cloud_model">Embedding model name</string>
<string name="memory_embedding_dimension_usage">Current embedding dimension usage</string>
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5790,6 +5790,10 @@
<string name="memory_embedding_cloud_title">云端向量模型</string>
<string name="memory_embedding_cloud_enable">启用云端向量模型</string>
<string name="memory_embedding_cloud_endpoint">向量API端点</string>
<string name="memory_embedding_cloud_endpoint_error_blank">向量API端点不能为空</string>
<string name="memory_embedding_cloud_endpoint_error_scheme">向量API端点必须以 http:// 或 https:// 开头</string>
<string name="memory_embedding_cloud_endpoint_error_whitespace">向量API端点不能包含空格或换行</string>
<string name="memory_embedding_cloud_endpoint_error_multiple_urls">向量API端点只能填写一个URL</string>
<string name="memory_embedding_cloud_api_key">向量API Key</string>
<string name="memory_embedding_cloud_model">向量模型名</string>
<string name="memory_embedding_dimension_usage">当前向量维度使用情况</string>
Expand Down