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
Expand Up @@ -230,6 +230,7 @@ object AppComponents {
focusedTextColor: Color = MaterialTheme.colorScheme.onSurface,
unfocusedTextColor: Color = MaterialTheme.colorScheme.onSurface,
cursorColor: Color = MaterialTheme.colorScheme.onSurface,
containerColor: Color = MaterialTheme.colorScheme.surface,
): TextFieldColors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = focusedBorderColor,
unfocusedBorderColor = unfocusedBorderColor,
Expand All @@ -238,6 +239,9 @@ object AppComponents {
focusedTextColor = focusedTextColor,
unfocusedTextColor = unfocusedTextColor,
cursorColor = cursorColor,
focusedContainerColor = containerColor,
unfocusedContainerColor = containerColor,
disabledContainerColor = containerColor,
)

/**
Expand Down
6 changes: 6 additions & 0 deletions desktop-shared/src/main/resources/i18n/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -949,6 +949,12 @@ provider.openai.setup.help=💡To use OpenAI, you need to provide an API key.\n\
provider.anthropic.apikey.description=Your Anthropic API key from https://console.anthropic.com/
provider.anthropic.apikey.stored=API key already stored securely. Leave blank to keep existing key, or enter a new one to update.
provider.anthropic.setup.help=💡To use Anthropic, you need to provide an API key.\n\n1. Get your API key from: https://console.anthropic.com/\n2. Then set it in the Settings or using: :change-settings
provider.anthropic.max_tokens.label=Max Tokens
provider.anthropic.max_tokens.description=Maximum tokens the model can generate per response (thinking + answer combined).
provider.anthropic.thinking_budget_tokens.label=Thinking Budget Tokens
provider.anthropic.thinking_budget_tokens.description=Max tokens Anthropic can spend on thinking. Set to 0 to let the model decide automatically (recommended).
provider.anthropic.thinking_max_tokens.label=Thinking Max Tokens
provider.anthropic.thinking_max_tokens.description=Total token cap when thinking is active (thinking + answer). Set to 0 to use Max Tokens instead.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Your Google AI Studio API key from https://aistudio.google.com/app/apikey
Expand Down
6 changes: 6 additions & 0 deletions desktop-shared/src/main/resources/i18n/messages_de.properties
Original file line number Diff line number Diff line change
Expand Up @@ -909,6 +909,12 @@ provider.openai.setup.help=💡 Für die Nutzung von OpenAI benötigen Sie einen
provider.anthropic.apikey.description=Ihr Anthropic API-Schlüssel: https://console.anthropic.com/
provider.anthropic.apikey.stored=API-Schlüssel ist bereits gespeichert.
provider.anthropic.setup.help=💡 Für die Nutzung von Anthropic benötigen Sie einen API-Schlüssel.\n\n1. Hier erhalten: https://console.anthropic.com/\n2. In den Einstellungen eintragen oder :change-settings verwenden
provider.anthropic.max_tokens.label=Max Tokens
provider.anthropic.max_tokens.description=Maximale Anzahl an Tokens, die das Modell pro Antwort generieren kann (Denken + Antwort kombiniert).
provider.anthropic.thinking_budget_tokens.label=Thinking Budget Tokens
provider.anthropic.thinking_budget_tokens.description=Maximale Anzahl an Tokens, die Anthropic für den Denkprozess verwenden kann. Auf 0 setzen, damit das Modell dies automatisch entscheidet (empfohlen).
provider.anthropic.thinking_max_tokens.label=Thinking Max Tokens
provider.anthropic.thinking_max_tokens.description=Gesamtes Token-Limit bei aktivem Denkprozess (Denken + Antwort). Auf 0 setzen, um stattdessen "Max Tokens" zu verwenden.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Ihr Google AI Studio API-Schlüssel: https://aistudio.google.com/app/apikey
Expand Down
6 changes: 6 additions & 0 deletions desktop-shared/src/main/resources/i18n/messages_es.properties
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=💡 Para usar OpenAI necesitas una clave API.\n\n1.
provider.anthropic.apikey.description=Tu clave API de Anthropic: https://console.anthropic.com/
provider.anthropic.apikey.stored=Clave API ya almacenada.
provider.anthropic.setup.help=💡 Para usar Anthropic, necesitas una clave API.\n\n1. Consíguela en: https://console.anthropic.com/\n2. Configúrala en los ajustes o con :change-settings
provider.anthropic.max_tokens.label=Max Tokens
provider.anthropic.max_tokens.description=Máximo de tokens que el modelo puede generar por respuesta (pensamiento + respuesta combinados).
provider.anthropic.thinking_budget_tokens.label=Tokens de presupuesto de pensamiento
provider.anthropic.thinking_budget_tokens.description=Máximo de tokens que Anthropic puede dedicar al pensamiento. Configura en 0 para dejar que el modelo decida automáticamente (recomendado).
provider.anthropic.thinking_max_tokens.label=Máximo de tokens de pensamiento
provider.anthropic.thinking_max_tokens.description=Límite total de tokens cuando el pensamiento está activo (pensamiento + respuesta). Configura en 0 para usar Max Tokens en su lugar.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Tu clave API de Google AI Studio: https://aistudio.google.com/app/apikey
Expand Down
6 changes: 6 additions & 0 deletions desktop-shared/src/main/resources/i18n/messages_fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=💡 Pour utiliser OpenAI, une clé API est nécessai
provider.anthropic.apikey.description=Votre clé API Anthropic : https://console.anthropic.com/
provider.anthropic.apikey.stored=Clé API déjà stockée.
provider.anthropic.setup.help=💡 Pour utiliser Anthropic, une clé API est nécessaire.\n\n1. Obtenez-la ici : https://console.anthropic.com/\n2. Configurez-la dans les paramètres ou via :change-settings
provider.anthropic.max_tokens.label=Max Tokens
provider.anthropic.max_tokens.description=Nombre maximal de jetons que le modèle peut générer par réponse (réflexion + réponse combinées).
provider.anthropic.thinking_budget_tokens.label=Jetons de budget de réflexion
provider.anthropic.thinking_budget_tokens.description=Nombre maximal de jetons qu'Anthropic peut consacrer à la réflexion. Définissez sur 0 pour laisser le modèle décider automatiquement (recommandé).
provider.anthropic.thinking_max_tokens.label=Max de jetons de réflexion
provider.anthropic.thinking_max_tokens.description=Plafond total de jetons lorsque la réflexion est activée (réflexion + réponse). Définissez sur 0 pour utiliser Max Tokens à la place.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Votre clé API Google AI Studio : https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=💡 OpenAI を使うには API キーが必要です
provider.anthropic.apikey.description=Anthropic API キー: https://console.anthropic.com/
provider.anthropic.apikey.stored=API キーは既に保存されています。
provider.anthropic.setup.help=💡 Anthropic を使うには API キーが必要です。\n\n1. https://console.anthropic.com/ で取得\n2. 設定で構成するか :change-settings を使用
provider.anthropic.max_tokens.label=最大トークン数
provider.anthropic.max_tokens.description=モデルが応答ごとに生成できる最大トークン数(思考 + 回答の合計)。
provider.anthropic.thinking_budget_tokens.label=思考予算トークン数
provider.anthropic.thinking_budget_tokens.description=Anthropicが思考に費やすことのできる最大トークン数。0に設定すると、モデルが自動的に決定します(推奨)。
provider.anthropic.thinking_max_tokens.label=思考時最大トークン数
provider.anthropic.thinking_max_tokens.description=思考がアクティブな時の合計トークン上限(思考 + 回答)。0に設定すると、代わりに「Max Tokens」が使用されます。

# Provider Configuration - Gemini
provider.gemini.apikey.description=Google AI Studio API キー: https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=💡 OpenAI 사용을 위해 API 키가 필요합니
provider.anthropic.apikey.description=Anthropic API 키: https://console.anthropic.com/
provider.anthropic.apikey.stored=API 키가 이미 저장됨.
provider.anthropic.setup.help=💡 Anthropic 사용을 위해 API 키가 필요합니다.\n\n1. https://console.anthropic.com/ 에서 키를 받으세요\n2. 설정 또는 :change-settings 명령으로 구성하세요
provider.anthropic.max_tokens.label=최대 토큰 수
provider.anthropic.max_tokens.description=모델이 응답당 생성할 수 있는 최대 토큰 수 (생각 + 답변 합계).
provider.anthropic.thinking_budget_tokens.label=생각 예산 토큰 수
provider.anthropic.thinking_budget_tokens.description=Anthropic이 생각하는 데 사용할 수 있는 최대 토큰 수입니다. 0으로 설정하면 모델이 자동으로 결정합니다 (권장).
provider.anthropic.thinking_max_tokens.label=생각 최대 토큰 수
provider.anthropic.thinking_max_tokens.description=생각 기능이 활성화되었을 때의 총 토큰 제한 (생각 + 답변). 0으로 설정하면 대신 최대 토큰 수(Max Tokens)를 사용합니다.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Google AI Studio API 키: https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -910,6 +910,12 @@ provider.openai.setup.help=💡 Para usar o OpenAI, forneça sua API Key.\n\n1.
provider.anthropic.apikey.description=Sua API Key do Anthropic: https://console.anthropic.com/
provider.anthropic.apikey.stored=API Key já armazenada.
provider.anthropic.setup.help=💡 Para usar o Anthropic, forneça a API Key.\n\n1. Obtenha em: https://console.anthropic.com/\n2. Configure nas Configurações ou usando :change-settings
provider.anthropic.max_tokens.label=Max Tokens
provider.anthropic.max_tokens.description=Máximo de tokens que o modelo pode gerar por resposta (pensamento + resposta combinados).
provider.anthropic.thinking_budget_tokens.label=Tokens de orçamento de pensamento
provider.anthropic.thinking_budget_tokens.description=Máximo de tokens que a Anthropic pode gastar pensando. Defina como 0 para permitir que o modelo decida automaticamente (recomendado).
provider.anthropic.thinking_max_tokens.label=Máximo de tokens de pensamento
provider.anthropic.thinking_max_tokens.description=Limite total de tokens quando o pensamento está ativo (pensamento + resposta). Defina como 0 para usar Max Tokens em vez disso.

# Provider Configuration - Gemini
provider.gemini.apikey.description=Sua API Key do Google AI Studio: https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -906,6 +906,12 @@ provider.openai.setup.help=💡 Để sử dụng OpenAI, bạn cần API key.\n
provider.anthropic.apikey.description=API key Anthropic từ https://console.anthropic.com/
provider.anthropic.apikey.stored=API key đã lưu. Để trống để giữ nguyên hoặc nhập mới để cập nhật.
provider.anthropic.setup.help=💡 Để sử dụng Anthropic, bạn cần API key.\n\n1. Lấy từ https://console.anthropic.com/\n2. Thiết lập trong Cài đặt hoặc dùng :change-settings
provider.anthropic.max_tokens.label=Số Token Tối đa
provider.anthropic.max_tokens.description=Số lượng token tối đa mà mô hình có thể tạo cho mỗi phản hồi (suy nghĩ + câu trả lời được kết hợp).
provider.anthropic.thinking_budget_tokens.label=Token Ngân sách Suy nghĩ
provider.anthropic.thinking_budget_tokens.description=Số lượng token tối đa mà Anthropic có thể dành cho việc suy nghĩ. Đặt là 0 để để mô hình tự quyết định (khuyên dùng).
provider.anthropic.thinking_max_tokens.label=Token Tối đa cho Suy nghĩ
provider.anthropic.thinking_max_tokens.description=Giới hạn token tổng khi tính năng suy nghĩ đang hoạt động (suy nghĩ + câu trả lời). Đặt là 0 để sử dụng Số Token Tối đa thay thế.

# Provider Configuration - Gemini
provider.gemini.apikey.description=API key Google AI Studio từ https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=使用 OpenAI 需要 API Key。\n\n1. 获取:https:
provider.anthropic.apikey.description=Anthropic API Key:https://console.anthropic.com/
provider.anthropic.apikey.stored=API Key 已保存。
provider.anthropic.setup.help=使用 Anthropic 需要 API Key。\n\n1. 获取:https://console.anthropic.com/\n2. 在设置中配置或使用 :change-settings
provider.anthropic.max_tokens.label=最大 Token 数
provider.anthropic.max_tokens.description=模型每次响应可生成的最大 Token 数(思考 + 回答的总和)。
provider.anthropic.thinking_budget_tokens.label=思考预算 Token 数
provider.anthropic.thinking_budget_tokens.description=Anthropic 用于思考的最大 Token 数。设置为 0 可让模型自动决定(推荐)。
provider.anthropic.thinking_max_tokens.label=思考时最大 Token 数
provider.anthropic.thinking_max_tokens.description=启用思考功能时的总 Token 上限(思考 + 回答)。设置为 0 以使用“最大 Token 数”代替。

# Provider Configuration - Gemini
provider.gemini.apikey.description=Google AI Studio API Key:https://aistudio.google.com/app/apikey
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,12 @@ provider.openai.setup.help=💡 若要使用 OpenAI,您必須提供 API 金鑰
provider.anthropic.apikey.description=您的 Anthropic API 金鑰(https://console.anthropic.com/)
provider.anthropic.apikey.stored=API 金鑰已儲存。留白代表保持現有設定。
provider.anthropic.setup.help=💡 若要使用 Anthropic,請提供 API 金鑰。\n\n1. 取得位置:https://console.anthropic.com/\n2. 在設定中輸入或使用 :change-settings
provider.anthropic.max_tokens.label=最大 Token 數
provider.anthropic.max_tokens.description=模型每次回應可生成的最大 Token 數(思考 + 回答的總和)。
provider.anthropic.thinking_budget_tokens.label=思考預算 Token 數
provider.anthropic.thinking_budget_tokens.description=Anthropic 用於思考的最大 Token 數。設定為 0 可讓模型自動決定(推薦)。
provider.anthropic.thinking_max_tokens.label=思考時最大 Token 數
provider.anthropic.thinking_max_tokens.description=啟用思考功能時的總 Token 上限(思考 + 回答)。設定為 0 以使用「最大 Token 數」代替。

# Provider Configuration - Gemini
provider.gemini.apikey.description=您的 Google AI Studio API 金鑰(https://aistudio.google.com/app/apikey)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.rememberScrollbarAdapter
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
Expand All @@ -41,9 +42,11 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import io.askimo.core.AppConstants.DOMAIN
import io.askimo.core.i18n.LocalizationManager
import io.askimo.core.providers.ChatModelFactory
import io.askimo.core.providers.ModelDTO
import io.askimo.core.providers.ModelProvider
Expand Down Expand Up @@ -317,6 +320,20 @@ private fun providerModelConfigCard(instance: ProviderInstance, viewModel: AIPro
)
}

// Provider-specific configurable fields (e.g. maxTokens for Anthropic)
val configurableFields = instance.settings.getConfigurableFields { key -> LocalizationManager.getString(key) }
if (configurableFields.isNotEmpty()) {
HorizontalDivider(color = MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.15f))
configurableFields.forEach { field ->
providerConfigurableField(
field = field,
onValueChange = { newValue ->
viewModel.updateInstanceModelOverride(instance.id, field.name, newValue)
},
)
}
}

// Embedding model — only for supported providers
if (supportsEmbedding) {
HorizontalDivider(color = MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.15f))
Expand Down Expand Up @@ -591,3 +608,73 @@ private fun providerModelTypePickerDialog(
}
}
}

/**
* Renders a single provider-specific configurable field (NumberField or TextField).
* Called generically for every entry in [ProviderSettings.getConfigurableFields] —
* no per-provider branching needed in the UI.
*/
@Composable
private fun providerConfigurableField(
field: SettingField,
onValueChange: (String) -> Unit,
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Column(
modifier = Modifier.weight(1f).padding(end = Spacing.large),
verticalArrangement = Arrangement.spacedBy(Spacing.extraSmall),
) {
Text(
text = field.label,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSecondaryContainer,
)
Text(
text = field.description,
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.6f),
)
}

when (field) {
is SettingField.NumberField -> {
var text by remember(field.value) { mutableStateOf(field.value.toString()) }
OutlinedTextField(
value = text,
onValueChange = { newVal ->
text = newVal
newVal.toIntOrNull()?.let { onValueChange(it.toString()) }
},
modifier = Modifier.widthIn(min = 100.dp, max = 160.dp),
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
colors = AppComponents.outlinedTextFieldColors(
containerColor = MaterialTheme.colorScheme.surface,
),
)
}

is SettingField.TextField -> {
var text by remember(field.value) { mutableStateOf(field.value) }
OutlinedTextField(
value = text,
onValueChange = { newVal ->
text = newVal
onValueChange(newVal)
},
modifier = Modifier.widthIn(min = 100.dp, max = 200.dp),
singleLine = true,
colors = AppComponents.outlinedTextFieldColors(
containerColor = MaterialTheme.colorScheme.surface,
),
)
}

else -> Unit
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,7 @@ private fun logLevelCard() {
modifier = Modifier
.fillMaxWidth()
.clickableCard { logLevelDropdownExpanded = true },
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surface,
),
colors = CardDefaults.cardColors(),
) {
Row(
modifier = Modifier
Expand Down
Loading