Skip to content

Commit d029c8e

Browse files
committed
feat(clients): use OpenAiClientService to save shared hosts and model ids
1 parent 70a43e7 commit d029c8e

File tree

8 files changed

+63
-111
lines changed

8 files changed

+63
-111
lines changed

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ tasks {
8989
buildPlugin {
9090
exclude { "coroutines" in it.name }
9191
}
92+
93+
buildSearchableOptions {
94+
enabled = false
95+
}
96+
9297
prepareSandbox {
9398
exclude { "coroutines" in it.name }
9499
}

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@ import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils
44
import com.github.blarc.ai.commits.intellij.plugin.notifications.Notification
55
import com.github.blarc.ai.commits.intellij.plugin.notifications.sendNotification
66
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClient
7-
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.OpenAIClient
8-
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.TestAIClient
7+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi.OpenAiClient
8+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi.OpenAiClientService
99
import com.github.blarc.ai.commits.intellij.plugin.settings.prompts.DefaultPrompts
1010
import com.intellij.openapi.application.ApplicationManager
11-
import com.intellij.openapi.components.PersistentStateComponent
12-
import com.intellij.openapi.components.Service
13-
import com.intellij.openapi.components.State
14-
import com.intellij.openapi.components.Storage
11+
import com.intellij.openapi.components.*
1512
import com.intellij.util.xmlb.Converter
1613
import com.intellij.util.xmlb.XmlSerializerUtil
1714
import com.intellij.util.xmlb.annotations.OptionTag
@@ -44,15 +41,12 @@ class AppSettings2 : PersistentStateComponent<AppSettings2> {
4441

4542
@XCollection(
4643
elementTypes = [
47-
OpenAIClient::class,
48-
TestAIClient::class
44+
OpenAiClient::class
4945
],
5046
style = XCollection.Style.v2
5147
)
52-
var llmClients = setOf(
53-
OpenAIClient(),
54-
TestAIClient(),
55-
TestAIClient("TestAI2")
48+
var llmClients = setOf<LLMClient>(
49+
OpenAiClient()
5650
)
5751

5852
private var activeLlmClient = "OpenAI"
@@ -95,8 +89,9 @@ class AppSettings2 : PersistentStateComponent<AppSettings2> {
9589
temperature = appSettings.openAITemperature
9690
AICommitsUtils.retrieveToken(appSettings.openAITokenTitle)?.let { token = it }
9791
}
98-
OpenAIClient.hosts.addAll(appSettings.openAIHosts)
99-
OpenAIClient.modelIds.addAll(appSettings.openAIModelIds)
92+
93+
service<OpenAiClientService>().hosts.addAll(appSettings.openAIHosts)
94+
service<OpenAiClientService>().modelIds.addAll(appSettings.openAIModelIds)
10095
}
10196

10297
fun recordHit() {

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.github.blarc.ai.commits.intellij.plugin.settings.clients
33
import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
44
import com.github.blarc.ai.commits.intellij.plugin.createColumn
55
import com.github.blarc.ai.commits.intellij.plugin.settings.AppSettings2
6+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi.OpenAiClient
67
import com.intellij.openapi.ui.DialogPanel
78
import com.intellij.openapi.ui.DialogWrapper
89
import com.intellij.openapi.ui.Splitter
@@ -115,6 +116,7 @@ class LLMClientTable {
115116
if (newLlmClient == null) {
116117
(cardLayout.findComponentById(llmClient.displayName) as DialogPanel).apply()
117118
}
119+
// TODO: Figure out how to call apply of the currently active panel
118120
super.doOKAction()
119121
}
120122

@@ -130,8 +132,7 @@ class LLMClientTable {
130132
return if (newLLMClient == null) {
131133
// TODO(@Blarc): Is there a better way to create the list of all possible LLM Clients that implement LLMClient abstract class
132134
listOf(
133-
OpenAIClient(),
134-
TestAIClient()
135+
OpenAiClient()
135136
)
136137
} else {
137138
listOf(newLLMClient)

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

Lines changed: 0 additions & 45 deletions
This file was deleted.

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

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/main/kotlin/com/github/blarc/ai/commits/intellij/plugin/settings/clients/OpenAIClient.kt renamed to src/main/kotlin/com/github/blarc/ai/commits/intellij/plugin/settings/clients/openAi/OpenAiClient.kt

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,35 @@
1-
package com.github.blarc.ai.commits.intellij.plugin.settings.clients
1+
package com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi
22

33
import com.github.blarc.ai.commits.intellij.plugin.Icons
44
import com.github.blarc.ai.commits.intellij.plugin.settings.AppSettings
5-
import com.intellij.util.xmlb.annotations.Attribute
5+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClient
6+
import com.intellij.openapi.components.service
67
import dev.langchain4j.data.message.UserMessage
78
import dev.langchain4j.model.openai.OpenAiChatModel
8-
import dev.langchain4j.model.openai.OpenAiChatModelName
99
import java.net.InetSocketAddress
1010
import java.net.Proxy
1111
import java.net.URI
1212
import java.time.Duration
1313
import javax.swing.Icon
1414

15-
class OpenAIClient(displayName: String = "OpenAI") : LLMClient(
15+
class OpenAiClient(displayName: String = "OpenAI") : LLMClient(
1616
displayName,
1717
"https://api.openai.com/v1",
1818
null,
1919
30,
2020
"gpt-3.5-turbo",
2121
"0.7"
2222
) {
23-
24-
companion object {
25-
// TODO @Blarc: Static fields probably can't be attributes...
26-
@Attribute
27-
val hosts = mutableSetOf("https://api.openai.com/v1")
28-
@Attribute
29-
val modelIds = OpenAiChatModelName.entries.stream()
30-
.map { it.toString() }
31-
.toList()
32-
.toMutableSet()
33-
}
34-
3523
override fun getIcon(): Icon {
3624
return Icons.OPEN_AI
3725
}
3826

3927
override fun getHosts(): Set<String> {
40-
return hosts
28+
return service<OpenAiClientService>().hosts
4129
}
4230

4331
override fun getModelIds(): Set<String> {
44-
return modelIds
32+
return service<OpenAiClientService>().modelIds
4533
}
4634

4735
override suspend fun generateCommitMessage(
@@ -72,7 +60,7 @@ class OpenAIClient(displayName: String = "OpenAI") : LLMClient(
7260
}
7361

7462
override fun clone(): LLMClient {
75-
val copy = OpenAIClient(displayName)
63+
val copy = OpenAiClient(displayName)
7664
copy.host = host
7765
copy.proxyUrl = proxyUrl
7866
copy.timeout = timeout
@@ -112,7 +100,5 @@ class OpenAIClient(displayName: String = "OpenAI") : LLMClient(
112100
)
113101
}
114102

115-
override fun panel(): LLMClientPanel {
116-
return OpenAIClientPanel(this)
117-
}
103+
override fun panel() = OpenAiClientPanel(this)
118104
}
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
package com.github.blarc.ai.commits.intellij.plugin.settings.clients
1+
package com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi
22

33
import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
44
import com.github.blarc.ai.commits.intellij.plugin.emptyText
55
import com.github.blarc.ai.commits.intellij.plugin.isInt
6+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientPanel
67
import com.github.blarc.ai.commits.intellij.plugin.temperatureValid
78
import com.intellij.icons.AllIcons
9+
import com.intellij.openapi.components.service
810
import com.intellij.openapi.progress.runBackgroundableTask
911
import com.intellij.openapi.ui.ComboBox
1012
import com.intellij.openapi.ui.naturalSorted
@@ -19,9 +21,9 @@ import kotlinx.serialization.Serializable
1921
import kotlinx.serialization.json.Json
2022
import javax.swing.DefaultComboBoxModel
2123

22-
class OpenAIClientPanel(private val client: OpenAIClient) : LLMClientPanel {
24+
class OpenAiClientPanel(private val client: OpenAiClient) : LLMClientPanel {
2325

24-
private val hostComboBox = ComboBox(client.getHosts().toTypedArray())
26+
private val hostComboBox = ComboBox(client.getHosts().toTypedArray())
2527
private val tokenPasswordField = JBPasswordField()
2628
private val verifyLabel = JBLabel()
2729
private val proxyTextField = JBTextField()
@@ -43,8 +45,8 @@ class OpenAIClientPanel(private val client: OpenAIClient) : LLMClientPanel {
4345
label(message("settings.openAIProxy"))
4446
.widthGroup("label")
4547
cell(proxyTextField)
46-
.bindText(client::proxyUrl.toNonNullableProperty(""))
4748
.applyToComponent { minimumWidth = 400 }
49+
.bindText(client::proxyUrl.toNonNullableProperty(""))
4850
.resizableColumn()
4951
.widthGroup("input")
5052
}
@@ -54,8 +56,8 @@ class OpenAIClientPanel(private val client: OpenAIClient) : LLMClientPanel {
5456
row {
5557
label(message("settings.openAISocketTimeout")).widthGroup("label")
5658
cell(socketTimeoutTextField)
57-
.bindIntText(client::timeout)
5859
.applyToComponent { minimumWidth = 400 }
60+
.bindIntText(client::timeout)
5961
.resizableColumn()
6062
.widthGroup("input")
6163
.validationOnInput { isInt(it.text) }
@@ -82,14 +84,17 @@ class OpenAIClientPanel(private val client: OpenAIClient) : LLMClientPanel {
8284
.widthGroup("label")
8385

8486
cell(modelComboBox)
87+
.applyToComponent {
88+
isEditable = true
89+
}
8590
.bindItem({ client.modelId }, {
8691
if (it != null) {
8792
client.modelId = it
8893
}
8994
})
9095
.widthGroup("input")
9196
.resizableColumn()
92-
97+
.onApply { service<OpenAiClientService>().modelIds.add(modelComboBox.item) }
9398

9499
client.getRefreshModelFunction()?.let { f ->
95100
button(message("settings.refreshModels")) {
@@ -161,6 +166,7 @@ class OpenAIClientPanel(private val client: OpenAIClient) : LLMClientPanel {
161166

162167
@Serializable
163168
data class OpenAiError(val message: String?, val type: String?, val param: String?, val code: String?)
169+
164170
@Serializable
165171
data class OpenAiErrorWrapper(val error: OpenAiError)
166172
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi
2+
3+
import com.intellij.openapi.components.PersistentStateComponent
4+
import com.intellij.openapi.components.Service
5+
import com.intellij.openapi.components.State
6+
import com.intellij.openapi.components.Storage
7+
import com.intellij.util.xmlb.XmlSerializerUtil
8+
import dev.langchain4j.model.openai.OpenAiChatModelName
9+
10+
@Service
11+
@State(name = "OpenAiClientService", storages = [Storage("AICommitsOpenAi.xml")])
12+
class OpenAiClientService : PersistentStateComponent<OpenAiClientService> {
13+
14+
val hosts = mutableSetOf("https://api.openai.com/v1")
15+
val modelIds = OpenAiChatModelName.entries.stream()
16+
.map { it.toString() }
17+
.toList()
18+
.toMutableSet()
19+
20+
override fun getState(): OpenAiClientService = this
21+
22+
override fun loadState(state: OpenAiClientService) {
23+
XmlSerializerUtil.copyBean(state, this)
24+
}
25+
26+
}

0 commit comments

Comments
 (0)