diff --git a/.github/workflows/debug-build.yml b/.github/workflows/debug-build.yml index c473799..faf5bf9 100644 --- a/.github/workflows/debug-build.yml +++ b/.github/workflows/debug-build.yml @@ -25,7 +25,8 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 0 + ref: ${{ github.event.pull_request.head.ref }} + repository: ${{ github.event.pull_request.head.repo.full_name }} - name: Setup JDK uses: actions/setup-java@v4 diff --git a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/ModelConstants.kt b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/ModelConstants.kt index 391c5c2..1f4995e 100644 --- a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/ModelConstants.kt +++ b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/ModelConstants.kt @@ -1,5 +1,7 @@ package dev.chungjungsoo.gptmobile.data +import dev.chungjungsoo.gptmobile.data.model.ApiType + object ModelConstants { // LinkedHashSet should be used to guarantee item order val openaiModels = linkedSetOf("gpt-4o", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo") @@ -11,6 +13,12 @@ object ModelConstants { const val ANTHROPIC_API_URL = "https://api.anthropic.com" const val GOOGLE_API_URL = "https://generativelanguage.googleapis.com" + fun getDefaultAPIUrl(apiType: ApiType) = when (apiType) { + ApiType.OPENAI -> OPENAI_API_URL + ApiType.ANTHROPIC -> ANTHROPIC_API_URL + ApiType.GOOGLE -> GOOGLE_API_URL + } + const val ANTHROPIC_MAXIMUM_TOKEN = 4096 const val OPENAI_PROMPT = diff --git a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/dto/Platform.kt b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/dto/Platform.kt index 4ae17ca..ef3a76f 100644 --- a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/dto/Platform.kt +++ b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/data/dto/Platform.kt @@ -1,12 +1,13 @@ package dev.chungjungsoo.gptmobile.data.dto +import dev.chungjungsoo.gptmobile.data.ModelConstants.getDefaultAPIUrl import dev.chungjungsoo.gptmobile.data.model.ApiType data class Platform( val name: ApiType, val selected: Boolean = false, val enabled: Boolean = false, - val apiUrl: String = "", + val apiUrl: String = getDefaultAPIUrl(name), val token: String? = null, val model: String? = null, val temperature: Float? = null, diff --git a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingDialogs.kt b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingDialogs.kt index ed7d457..5b972ca 100644 --- a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingDialogs.kt +++ b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingDialogs.kt @@ -1,6 +1,7 @@ package dev.chungjungsoo.gptmobile.presentation.ui.setting import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn @@ -27,6 +28,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import dev.chungjungsoo.gptmobile.R import dev.chungjungsoo.gptmobile.data.ModelConstants.anthropicModels +import dev.chungjungsoo.gptmobile.data.ModelConstants.getDefaultAPIUrl import dev.chungjungsoo.gptmobile.data.ModelConstants.googleModels import dev.chungjungsoo.gptmobile.data.ModelConstants.ollamaModels import dev.chungjungsoo.gptmobile.data.ModelConstants.openaiModels @@ -45,17 +47,25 @@ import kotlin.math.roundToInt fun APIUrlDialog( dialogState: SettingViewModel.DialogState, apiType: ApiType, + initialValue: String, settingViewModel: SettingViewModel ) { if (dialogState.isApiUrlDialogOpen) { APIUrlDialog( apiType = apiType, - onDismissRequest = settingViewModel::closeApiUrlDialog - ) { apiUrl -> - settingViewModel.updateURL(apiType, apiUrl) - settingViewModel.savePlatformSettings() - settingViewModel.closeApiUrlDialog() - } + initialValue = initialValue, + onDismissRequest = settingViewModel::closeApiUrlDialog, + onResetRequest = { + settingViewModel.updateURL(apiType, getDefaultAPIUrl(apiType)) + settingViewModel.savePlatformSettings() + settingViewModel.closeApiUrlDialog() + }, + onConfirmRequest = { apiUrl -> + settingViewModel.updateURL(apiType, apiUrl) + settingViewModel.savePlatformSettings() + settingViewModel.closeApiUrlDialog() + } + ) } } @@ -159,10 +169,12 @@ fun SystemPromptDialog( @Composable private fun APIUrlDialog( apiType: ApiType, + initialValue: String, onDismissRequest: () -> Unit, + onResetRequest: () -> Unit, onConfirmRequest: (url: String) -> Unit ) { - var apiUrl by remember { mutableStateOf("") } + var apiUrl by remember { mutableStateOf(initialValue) } val configuration = LocalConfiguration.current AlertDialog( @@ -175,7 +187,7 @@ private fun APIUrlDialog( .fillMaxWidth() .padding(horizontal = 20.dp, vertical = 16.dp), value = apiUrl, - isError = apiUrl.isValidUrl(), + isError = apiUrl.isValidUrl().not(), onValueChange = { apiUrl = it }, label = { Text(stringResource(R.string.api_url)) @@ -197,10 +209,16 @@ private fun APIUrlDialog( } }, dismissButton = { - TextButton( - onClick = onDismissRequest - ) { - Text(stringResource(R.string.cancel)) + Row { + TextButton( + modifier = Modifier.padding(end = 8.dp), + onClick = onResetRequest + ) { + Text(stringResource(R.string.reset)) + } + TextButton(onClick = onDismissRequest) { + Text(stringResource(R.string.cancel)) + } } } ) diff --git a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingScreen.kt b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingScreen.kt index 6347579..65779fc 100644 --- a/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingScreen.kt +++ b/app/src/main/kotlin/dev/chungjungsoo/gptmobile/presentation/ui/setting/PlatformSettingScreen.kt @@ -80,6 +80,7 @@ fun PlatformSettingScreen( .verticalScroll(scrollState) ) { val platform = platformState.firstOrNull { it.name == apiType } + val url = platform?.apiUrl ?: ModelConstants.getDefaultAPIUrl(apiType) val enabled = platform?.enabled ?: false val model = platform?.model val token = platform?.token @@ -99,7 +100,7 @@ fun PlatformSettingScreen( SettingItem( modifier = Modifier.height(64.dp), title = stringResource(R.string.api_url), - description = "", + description = url, enabled = enabled && platform?.name != ApiType.GOOGLE, onItemClick = settingViewModel::openApiUrlDialog, showTrailingIcon = false, @@ -187,6 +188,7 @@ fun PlatformSettingScreen( } ) + APIUrlDialog(dialogState, apiType, url, settingViewModel) APIKeyDialog(dialogState, apiType, settingViewModel) ModelDialog(dialogState, apiType, model, settingViewModel) TemperatureDialog(dialogState, apiType, temperature, settingViewModel) diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index d958961..e7649ee 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -114,4 +114,5 @@ Ollama 모델 선택 Ollama 설정 Ollama 모델을 선택해 주세요. 현재 Ollama에서 지원하는 모델과 태그가 너무 많으므로, 직접 모델 값을 설정할 수도 있습니다. 입력한 Endpoint에서 해당 모델이 실행되고 있는지 꼭 확인해주세요. 실행되고 있지 않은 모델을 입력시, 답변 생성 시에 오류가 발생할 수 있습니다. + 초기화 \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..74016b1 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,140 @@ + + GPTMobil + GPT Mobil Tanıtım Logosu + Akıllı telefonunuzdaki\nen iyi yapay zeka\nasistanı. + Size en uygun modeli\nkullanın. İstediğiniz her şeyi sorun! + Başlayın + Kullanmak istediğiniz platformu seçin. Bu ayarı daha sonra değiştirebilirsiniz. Daha fazla platform desteklenecek. + Öğe 1 + Öğe açıklaması + OpenAI + Anthropic + Google + ChatGPT\'nin yaratıcısı. + Claude burada doğdu. + Gemini yolda. + İleri + API Anahtarını Girin + Seçtiğiniz platformun API Anahtarını girin. Bu uygulama bu verileri toplamaz. Bu anahtarlar ve sohbet verileri yalnızca cihazınızda saklanır ve API uç noktaları dışında diğer sunuculara gönderilmez. + Anahtarı temizle + Yardıma mı ihtiyacınız var? + OpenAI API Anahtarı + Anthropic API Anahtarı + Google API Anahtarı + https://platform.openai.com/account/api-keys + https://console.anthropic.com/settings/keys + https://aistudio.google.com/app/apikey + OpenAI Sohbet Modelini Seçin + Lütfen OpenAI sohbet modelini seçin. Seçilen model çok modlu olsa bile, uygulama şu anda yalnızca metin girişlerini desteklemektedir. Gelecekte desteklenebilir. + GPT-4o + GPT-4 Turbo + GPT-4 + GPT-3.5 Turbo + En hızlı ve en uygun fiyatlı amiral gemisi modeli. + Güvenilirlik, GPT-4\'ten 3 kat daha ucuz. + Soyut problemleri çözmede en iyi performansı gösterir. + Basit görevler için hızlı ve uygun fiyatlı bir model. + Anthropic Sohbet Modelini Seçin + Lütfen Anthropic sohbet modelini seçin. Şu anda yalnızca Claude 3 ailesi metin girişlerini destekliyor. + Claude 3.5 Sonnet + Claude 3 Opus + Claude 3 Sonnet + Claude 3 Haiku + Anthropic\'in en zeki modeli. + Yazım ve karmaşık görevlerde mükemmel. + Zeka ve hız arasında dengeli bir model. + Anthropic\'in en hızlı ve en kompakt modeli. + Google Sohbet Modelini Seçin + Gemini, Google tarafından oluşturulmuş jeneratif AI model ailesidir. Yalnızca metin girişleri desteklenir. + Gemini 1.5 Pro + Gemini 1.5 Flash + Gemini 1.0 Pro + Kod ve metin üretimi de dahil olmak üzere muhakeme görevleri için optimize edilmiştir. + Çeşitli görevlerde hızlı ve çok yönlü performans. + Doğal dil görevleri, çoklu metin ve kod sohbetleri ve kod üretimi. + Her şey hazır! + Haydi GPT Mobil\'i kullanmaya başlayalım! + Tamamlandı + Kurulum Tamamlandı Logosu + Sohbetler + Ayarlar + Yeni Sohbet + Platform Seçin + Bu sohbette kullanmak istediğiniz platformları seçin. Sohbet oluşturulduktan sonra bu ayarı değiştiremezsiniz. Bunu değiştirmek isterseniz, lütfen yeni bir sohbet oluşturun. + Sohbet oluşturmak için lütfen en az bir platformu etkinleştirin. + Sohbet Simgesi + %s kullanılıyor + Onayla + İptal + Geri dön + Ok Simgesi + Açık + Kapalı + Sistem Varsayılanı + Tema Ayarları + Yakında Desteklenecek + Dinamik tema, Karanlık mod + OpenAI Ayarları + Anthropic Ayarları + Google Ayarları + API Anahtarı, Model, Sistem İsteği + API\'yi Etkinleştir + API Anahtarı + API Modeli + Dinamik Tema + Karanlık Mod + Anahtar Simgesi + Model Simgesi + Gönder + Metni Kopyala + Yeniden Dene + Bir soru sorun… + Bazı API\'ler devre dışı + OpenAI tarafından desteklenmektedir + Claude tarafından desteklenmektedir + Gemini tarafından desteklenmektedir + Token ayarlanmadı + Token şu şekilde ayarlandı: %s***** + Kapat + Sil + %d seçildi + %d sohbet silindi. + Seçilen sohbetleri silmek istiyor musunuz? + Bu işlem geri alınamaz. + Sistem İsteği + Sıcaklık + Nükleus örnekleme (Top p) + Sistem İsteği Ayarı + Bir sistem isteği, yapay zeka modellerine kullanıcı sorgularıyla etkileşime geçmeden önce verilen talimatlar, yönergeler ve bağlamsal bilgilerdir. + Sıcaklık Simgesi + Nükleus örnekleme simgesi + Sistem İsteği Simgesi + Sıcaklık Ayarı + Sıcaklık, yanıta rastgelelik ekleyen bir değişkendir. Genellikle varsayılan olarak 1.0\'dır.\nDaha odaklı ve belirleyici cevaplar için düşük sıcaklık, rastgele cevaplar için yüksek sıcaklık ayarlayın. + Nükleus Örnekleme Ayarı + Nükleus örnekleme sırasında, azalan olasılık sırasına göre her bir sonraki token için tüm seçenekler üzerinde kümülatif dağılım hesaplanır ve bu değere göre belirli bir olasılığa ulaştığında kesilir.\nÇoğu model genellikle bu ayar ile sıcaklık arasında bir değişiklik önerir ancak ikisini birden değil. + Hakkında + Sürüm, Lisans, Geri Bildirim + Sürüm + Lisans + GitHub + F-Droid + Play Store + Geri Bildirim + Açık Kaynak Lisansları + Her türlü geri bildirime açığız! + Sürüm Simgesi + Lisans Simgesi + Geri Bildirim Simgesi + GitHub Simgesi + F-Droid Simgesi + Play Store Simgesi + https://github.com/Taewan-P/gpt_mobile + https://f-droid.org/packages/dev.chungjungsoo.gptmobile/ + https://play.google.com/store/apps/details?id=dev.chungjungsoo.gptmobile + https://github.com/Taewan-P/gpt_mobile/issues/new + API URL\'si + URL Simgesi + Lütfen geçerli bir URL girin. + Sıfırla + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..4de8df3 --- /dev/null +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,113 @@ + + GPTMobile + GPT Mobile的介绍图标 + 最好的AI助理,你可以在你的手机上用它 + 选择一个最适合你的模型,问一切你想问的! + 开始使用 + 选择您要使用的平台,也可以稍后在设置中更改 + 项目 1 + 项目描述 + ChatGPT的创建者 + Claude在这里 + Gemini在这条路上 + 继续 + 输入API密钥 + 输入所选平台的密钥,我们不会收集这些数据,密钥和会话只会存储在您的设备上,不会发送到API服务器之外的任何地方 + 清空Token + 需要帮助? + OpenAI的API密钥 + Anthropic API密钥 + Google的API密钥 + 选择OpenAI会话的模型 + 请选择OpenAI会话的模型,尽管部分模型是多功能的,但此软件目前只支持纯文本输入,在未来可能会支持这些 + 最快最实惠的旗舰模型 + 高可靠性的模型,而且比GPT-4便宜3倍 + 适合解决抽象问题 + 适于处理简单任务的高速模型 + 选择Anthropic会话的模型 + 请选择Anthropic的会话模型,我们目前仅支持纯文本输入的Claude 3系列模型 + Anthropic的最智能的模型 + 擅长写作等复杂的任务 + 智能和速度的平衡 + Anthropic的最快且最小巧的模型 + 选择Google会话的模型 + Gemini是Google研发的生成式AI + 对代码和生成文本等推理任务有优化的模型 + 胜任不同场景的高性能模型 + 自然语言,上下文对话和代码生成与修正 + 已经准备好了! + 让我们开始使用GPT Mobile! + 完成 + 设置完整的图标 + 会话 + 设置 + 创建会话 + 选择平台 + 选择您要在此会话中使用的平台,会话创建后无法更改,如果想更改这个设置,请重新创建一个会话 + 请先启用一个平台再创建会话 + 会话的图标 + 使用 %s + 确定 + 取消 + 返回 + 箭头图标 + 开启 + 关闭 + 系统默认 + 主题 + 很快会支持 + 动态取色主题,暗黑模式 + OpenAI + Anthropic + Google + API密钥,模型,系统提示词 + 启用API + API密钥 + 选择模型 + 动态取色 + 暗黑模式 + 密钥的图标 + 模型的图标 + 发送 + 复制内容 + 重新生成 + 问一个问题吧... + 一些API已被禁用 + 没有设置Token + Token设置为 %s***** + 关闭 + 删除 + 选择 %d 个 + 已删除 %d 个 + 确定要删除选择的会话吗? + 此操作是不可逆的 + 系统提示词 + 温度 + 核心采样(Top p) + 系统提示词 + 系统提示词是一段命令、指导和上下文信息,在模型与用户交流前提供给它 + 温度的图标 + 核心采样的图标 + 系统提示词的图标 + 温度 + 温度是一个注入到回答中的随机量,温度越低,答案越集中和确定;温度越高,答案越为灵活 + 核心采样 + 在核心采样中,我们按递减概率顺序计算每个后续令牌的所有选项的累积分布,并在达到该值指定的特定概率后将其截断。大多数模型通常建议改变这个或温度,但不是两者都改变。 + 关于 + 版本,许可证,反馈 + 版本 + 许可证 + 反馈 + 开源许可证 + 我们愿意接纳您的任何意见! + 版本的图标 + 许可证的图标 + 反馈的图标 + Github的图标 + F-droid的图标 + Play商店的图标 + API网址 + URL图标 + 请输入有效的地址 + 重置 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fa51ec4..2f2d14f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -151,4 +151,5 @@ Please enter the address of your Ollama API including the port number. The app will be using /api/chat endpoint, so please enter only the front part of the full address. Ollama API Address https://github.com/ollama/ollama/blob/main/docs/api.md + Reset \ No newline at end of file