Skip to content

Commit 9321e2c

Browse files
committed
feat(settings): Host setting (#21,#34,#35).
This commit adds option to change OpenAI host and hint for url proxy.
1 parent f7c1f61 commit 9321e2c

File tree

4 files changed

+52
-19
lines changed

4 files changed

+52
-19
lines changed

src/main/kotlin/com/github/blarc/ai/commits/intellij/plugin/OpenAIService.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import com.aallam.openai.api.BetaOpenAI
44
import com.aallam.openai.api.chat.*
55
import com.aallam.openai.api.model.ModelId
66
import com.aallam.openai.client.OpenAI
7+
import com.aallam.openai.client.OpenAIConfig
8+
import com.aallam.openai.client.OpenAIHost
9+
import com.aallam.openai.client.ProxyConfig
710
import com.github.blarc.ai.commits.intellij.plugin.settings.AppSettings
811
import com.intellij.openapi.application.ApplicationManager
912
import com.intellij.openapi.components.Service
@@ -48,7 +51,14 @@ class OpenAIService {
4851
}
4952

5053
@Throws(Exception::class)
51-
suspend fun verifyToken(token: String){
52-
OpenAI(token).models()
54+
suspend fun verifyOpenAIConfiguration(host: String, token: String, proxy: String?){
55+
56+
val config = OpenAIConfig(
57+
token,
58+
host = host.takeIf { it.isNotBlank() }?.let { OpenAIHost(it) } ?: OpenAIHost.OpenAI,
59+
proxy = proxy?.takeIf { it.isNotBlank() }?.let { ProxyConfig.Http(it) }
60+
)
61+
val openAI = OpenAI(config)
62+
openAI.models()
5363
}
5464
}

src/main/kotlin/com/github/blarc/ai/commits/intellij/plugin/settings/AppSettings.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.blarc.ai.commits.intellij.plugin.settings
22

33
import com.aallam.openai.client.OpenAIConfig
4+
import com.aallam.openai.client.OpenAIHost
45
import com.aallam.openai.client.ProxyConfig
56
import com.github.blarc.ai.commits.intellij.plugin.notifications.Notification
67
import com.github.blarc.ai.commits.intellij.plugin.notifications.sendNotification
@@ -25,11 +26,13 @@ class AppSettings : PersistentStateComponent<AppSettings> {
2526

2627
private val openAITokenTitle = "OpenAIToken"
2728
private var hits = 0
28-
2929
@OptionTag(converter = LocaleConverter::class)
3030
var locale: Locale = Locale.ENGLISH
31+
3132
var requestSupport = true
3233
var lastVersion: String? = null
34+
var openAIHost: String = OpenAIHost.OpenAI.baseUrl
35+
var openAIHosts: MutableSet<String> = mutableSetOf(OpenAIHost.OpenAI.baseUrl)
3336
var proxyUrl: String? = null
3437

3538
var prompts: MutableMap<String, Prompt> = initPrompts()
@@ -65,7 +68,11 @@ class AppSettings : PersistentStateComponent<AppSettings> {
6568

6669
fun getOpenAIConfig(): OpenAIConfig {
6770
val token = getOpenAIToken() ?: throw Exception("OpenAI Token is not set.")
68-
return OpenAIConfig(token, proxy = proxyUrl?.takeIf { it.isNotBlank() }?.let { ProxyConfig.Http(it) })
71+
return OpenAIConfig(
72+
token,
73+
host = openAIHost.takeIf { it.isNotBlank() }?.let { OpenAIHost(it) } ?: OpenAIHost.OpenAI,
74+
proxy = proxyUrl?.takeIf { it.isNotBlank() }?.let { ProxyConfig.Http(it) }
75+
)
6976
}
7077

7178
fun getOpenAIToken(): String? {

src/main/kotlin/com/github/blarc/ai/commits/intellij/plugin/settings/AppSettingsConfigurable.kt

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.intellij.openapi.ui.naturalSorted
1414
import com.intellij.ui.CommonActionsPanel
1515
import com.intellij.ui.ToolbarDecorator
1616
import com.intellij.ui.components.JBLabel
17+
import com.intellij.ui.components.JBTextField
1718
import com.intellij.ui.dsl.builder.*
1819
import com.intellij.ui.util.minimumWidth
1920
import kotlinx.coroutines.*
@@ -23,21 +24,44 @@ import javax.swing.JPasswordField
2324

2425
class AppSettingsConfigurable : BoundConfigurable(message("settings.general.group.title")) {
2526

27+
private val hostComboBox = ComboBox<String>()
2628
private val tokenPasswordField = JPasswordField()
2729
private val verifyLabel = JBLabel()
28-
private var modelComboBox: ComboBox<String> = ComboBox<String>()
30+
private val proxyTextField = JBTextField()
31+
private var modelComboBox = ComboBox<String>()
2932
private val promptTable = PromptTable()
3033
private lateinit var toolbarDecorator: ToolbarDecorator
3134
private lateinit var promptComboBox: Cell<ComboBox<Prompt>>
3235

3336
init {
37+
hostComboBox.isEditable = true
38+
hostComboBox.model = DefaultComboBoxModel(Vector(AppSettings.instance.openAIHosts.naturalSorted()))
3439
modelComboBox.model = DefaultComboBoxModel(Vector(AppSettings.instance.openAIModelIds.naturalSorted()))
3540
modelComboBox.renderer = AppSettingsListCellRenderer()
3641
}
3742

3843
override fun createPanel() = panel {
3944

4045
group(JBLabel("OpenAI")) {
46+
row {
47+
label(message("settings.openAIHost"))
48+
.widthGroup("label")
49+
50+
cell(hostComboBox)
51+
.bindItem(AppSettings.instance::openAIHost.toNullableProperty())
52+
.widthGroup("input")
53+
}
54+
row {
55+
label(message("settings.openAIProxy")).widthGroup("label")
56+
cell(proxyTextField)
57+
.bindText(AppSettings.instance::proxyUrl.toNonNullableProperty(""))
58+
.applyToComponent { minimumWidth = 400 }
59+
.resizableColumn()
60+
.widthGroup("input")
61+
}
62+
row {
63+
comment(message("settings.openAIProxyComment"))
64+
}
4165
row {
4266
label(message("settings.openAIToken"))
4367
.widthGroup("label")
@@ -82,16 +106,6 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
82106
.align(AlignX.RIGHT)
83107
.widthGroup("button")
84108
}
85-
row {
86-
label(message("settings.openAIProxy")).widthGroup("label")
87-
textField()
88-
.bindText(AppSettings.instance::proxyUrl.toNonNullableProperty(""))
89-
.applyToComponent { minimumWidth = 350 }
90-
.resizableColumn()
91-
}
92-
row {
93-
comment(message("settings.openAIProxyComment"))
94-
}
95109
}
96110

97111
group(JBLabel("Prompt")) {
@@ -156,6 +170,7 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
156170
}
157171

158172
override fun apply() {
173+
AppSettings.instance.openAIHosts.add(hostComboBox.item)
159174
promptTable.apply()
160175
super.apply()
161176
}
@@ -177,7 +192,7 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
177192

178193
GlobalScope.launch(Dispatchers.IO) {
179194
try {
180-
OpenAIService.instance.verifyToken(String(tokenPasswordField.password))
195+
OpenAIService.instance.verifyOpenAIConfiguration(hostComboBox.item, String(tokenPasswordField.password), proxyTextField.text)
181196
verifyLabel.text = message("settings.verify.valid")
182197
verifyLabel.icon = AllIcons.General.InspectionsOK
183198
} catch (e: OpenAIAPIException) {

src/main/resources/messages/MyBundle.properties

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ settings.openAITokenComment=\
1010
<p>You can get your token <a href="https://platform.openai.com/account/api-keys">here.</a/></p>
1111
settings.report-bug=Report bug
1212
settings.verifyToken=Verify
13-
settings.verify.valid=Open AI token is valid.
14-
settings.verify.invalid=Open AI token is not valid ({0}).
15-
settings.verify.running=Verifying Open AI token...
13+
settings.verify.valid=Open AI configuration is valid.
14+
settings.verify.invalid=Open AI configuration is not valid ({0}).
15+
settings.verify.running=Verifying Open AI configuration...
1616
settings.verify.token-is-empty=Open AI token is empty.
1717
settings.refreshModels=Refresh
1818

@@ -51,4 +51,5 @@ settings.openAIProxy=OpenAI proxy url
5151
settings.loadingModels=Loading OpenAI models...
5252
settings.more-prompts=More prompts
5353
settings.openAIProxyComment=Creates an HTTP proxy from url.
54+
settings.openAIHost=OpenAI host
5455

0 commit comments

Comments
 (0)