Skip to content

Commit 20bd53c

Browse files
committed
feat(clients): properly open edit dialog
1 parent f58cb3d commit 20bd53c

File tree

7 files changed

+66
-48
lines changed

7 files changed

+66
-48
lines changed

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,15 +139,6 @@ object AICommitsUtils {
139139
// return encoding.countTokens(prompt) > modelType.maxContextLength
140140
// }
141141

142-
// TODO @Blarc: Slow operations are prohibited on EDT
143-
fun saveToken(title: String, token: String) {
144-
try {
145-
PasswordSafe.instance.setPassword(getCredentialAttributes(title), token)
146-
} catch (e: Exception) {
147-
sendNotification(Notification.unableToSaveToken(e.message))
148-
}
149-
}
150-
151142
suspend fun retrieveToken(title: String): OneTimeString? {
152143
val credentialAttributes = getCredentialAttributes(title)
153144
val credentials = withContext(Dispatchers.IO) {

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ package com.github.blarc.ai.commits.intellij.plugin.settings
22

33
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils
44
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils.getCredentialAttributes
5-
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils.saveToken
65
import com.github.blarc.ai.commits.intellij.plugin.notifications.Notification
76
import com.github.blarc.ai.commits.intellij.plugin.notifications.sendNotification
87
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientConfiguration
98
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.ollama.OllamaClientConfiguration
109
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi.OpenAiClientConfiguration
1110
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi.OpenAiClientSharedState
1211
import com.github.blarc.ai.commits.intellij.plugin.settings.prompts.DefaultPrompts
12+
import com.intellij.credentialStore.CredentialAttributes
1313
import com.intellij.ide.passwordSafe.PasswordSafe
1414
import com.intellij.openapi.application.ApplicationManager
1515
import com.intellij.openapi.components.PersistentStateComponent
@@ -98,19 +98,27 @@ class AppSettings2 : PersistentStateComponent<AppSettings2> {
9898
temperature = appSettings.openAITemperature
9999

100100
val credentialAttributes = getCredentialAttributes(appSettings.openAITokenTitle)
101-
PasswordSafe.instance.getAsync(credentialAttributes)
102-
.onSuccess {
103-
it?.password?.let { token ->
104-
saveToken(id, token.toString(false))
105-
tokenIsStored = true
106-
}
107-
}
101+
migrateToken(credentialAttributes)
108102
}
109103

110104
OpenAiClientSharedState.getInstance().hosts.addAll(appSettings.openAIHosts)
111105
OpenAiClientSharedState.getInstance().modelIds.addAll(appSettings.openAIModelIds)
112106
}
113107

108+
private fun OpenAiClientConfiguration.migrateToken(credentialAttributes: CredentialAttributes) {
109+
PasswordSafe.instance.getAsync(credentialAttributes)
110+
.onSuccess {
111+
it?.password?.let { token ->
112+
try {
113+
PasswordSafe.instance.setPassword(getCredentialAttributes(id), token.toString(false))
114+
} catch (e: Exception) {
115+
sendNotification(Notification.unableToSaveToken(e.message))
116+
}
117+
tokenIsStored = true
118+
}
119+
}
120+
}
121+
114122
fun recordHit() {
115123
hits++
116124
if (requestSupport && (hits == 50 || hits % 100 == 0)) {

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ abstract class LLMClientConfiguration(
5252
return name.compareTo(other.name)
5353
}
5454

55-
override fun equals(other: Any?): Boolean {
56-
return other is LLMClientConfiguration && other.id == id
57-
}
58-
59-
override fun hashCode(): Int {
60-
return id.hashCode()
61-
}
55+
// override fun equals(other: Any?): Boolean {
56+
// return other is LLMClientConfiguration && other.id == id
57+
// }
58+
//
59+
// override fun hashCode(): Int {
60+
// return id.hashCode()
61+
// }
6262
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
44
import com.github.blarc.ai.commits.intellij.plugin.settings.AppSettings2
55
import com.github.blarc.ai.commits.intellij.plugin.wrap
66
import com.intellij.icons.AllIcons
7+
import com.intellij.openapi.application.EDT
78
import com.intellij.openapi.vcs.ui.CommitMessage
89
import com.intellij.ui.components.JBLabel
910
import dev.langchain4j.data.message.UserMessage
@@ -20,22 +21,28 @@ abstract class LLMClientService<T : LLMClientConfiguration>(private val cs: Coro
2021
fun generateCommitMessage(client: T, prompt: String, commitMessage: CommitMessage) {
2122
cs.launch(Dispatchers.Default) {
2223
sendRequest(client, prompt, onSuccess = {
23-
commitMessage.setCommitMessage(it)
24+
withContext(Dispatchers.EDT) {
25+
commitMessage.setCommitMessage(it)
26+
}
2427
AppSettings2.instance.recordHit()
2528
}, onError = {
26-
commitMessage.setCommitMessage(it)
29+
withContext(Dispatchers.EDT) {
30+
commitMessage.setCommitMessage(it)
31+
}
2732
})
2833
}
2934
}
3035

3136
fun verifyConfiguration(client: T, label: JBLabel) {
32-
// TODO @Blarc: Can you make this better?
37+
// TODO @Blarc: Can you make this better? with notifications?
3338
label.text = "Verifying configuration..."
3439
cs.launch(Dispatchers.Default) {
3540
sendRequest(client, "test", onSuccess = {
41+
// This can't be called from EDT thread, because dialog blocks the EDT thread
3642
label.text = message("settings.verify.valid")
3743
label.icon = AllIcons.General.InspectionsOK
3844
}, onError = {
45+
// This can't be called from EDT thread, because dialog blocks the EDT thread
3946
label.text = it.wrap(80)
4047
label.icon = AllIcons.General.InspectionsError
4148
})

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@ package com.github.blarc.ai.commits.intellij.plugin.settings.clients.ollama
33
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientPanel
44

55
class OllamaClientPanel private constructor(
6-
configuration: OllamaClientConfiguration,
6+
private val clientConfiguration: OllamaClientConfiguration,
77
val service: OllamaClientService
8-
): LLMClientPanel(configuration) {
8+
): LLMClientPanel(clientConfiguration) {
99

1010
constructor(configuration: OllamaClientConfiguration): this(configuration, OllamaClientService.getInstance())
1111

1212
override fun verifyConfiguration() {
13+
// Configuration passed to panel is already a copy of the original or a new configuration
14+
clientConfiguration.host = hostComboBox.item
15+
clientConfiguration.timeout = socketTimeoutTextField.text.toInt()
16+
clientConfiguration.modelId = modelComboBox.item
17+
clientConfiguration.temperature = temperatureTextField.text
1318

14-
val newConfiguration = OllamaClientConfiguration()
15-
newConfiguration.host = hostComboBox.item
16-
newConfiguration.timeout = socketTimeoutTextField.text.toInt()
17-
newConfiguration.modelId = modelComboBox.item
18-
newConfiguration.temperature = temperatureTextField.text
19-
20-
service.verifyConfiguration(newConfiguration, verifyLabel)
19+
service.verifyConfiguration(clientConfiguration, verifyLabel)
2120
}
2221
}

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

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

33
import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
4-
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils.saveToken
54
import com.github.blarc.ai.commits.intellij.plugin.emptyText
65
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientPanel
76
import com.intellij.ui.components.JBPasswordField
@@ -25,11 +24,10 @@ class OpenAiClientPanel(private val clientConfiguration: OpenAiClientConfigurati
2524
.widthGroup("label")
2625
cell(tokenPasswordField)
2726
.bindText(getter = {""}, setter = {
28-
saveToken(clientConfiguration.id, it)
27+
OpenAiClientService.getInstance().saveToken(clientConfiguration, it)
2928
})
3029
.emptyText(if (clientConfiguration.tokenIsStored) message("settings.openAI.token.stored") else message("settings.openAI.token.example"))
3130
.resizableColumn()
32-
.focused()
3331
.widthGroup("input")
3432
}
3533
row {
@@ -54,14 +52,13 @@ class OpenAiClientPanel(private val clientConfiguration: OpenAiClientConfigurati
5452

5553
override fun verifyConfiguration() {
5654

57-
val newConfiguration = OpenAiClientConfiguration()
58-
newConfiguration.host = hostComboBox.item
59-
newConfiguration.proxyUrl = proxyTextField.text
60-
newConfiguration.timeout = socketTimeoutTextField.text.toInt()
61-
newConfiguration.modelId = modelComboBox.item
62-
newConfiguration.temperature = temperatureTextField.text
63-
newConfiguration.token = String(tokenPasswordField.password)
55+
clientConfiguration.host = hostComboBox.item
56+
clientConfiguration.proxyUrl = proxyTextField.text
57+
clientConfiguration.timeout = socketTimeoutTextField.text.toInt()
58+
clientConfiguration.modelId = modelComboBox.item
59+
clientConfiguration.temperature = temperatureTextField.text
60+
clientConfiguration.token = String(tokenPasswordField.password)
6461

65-
OpenAiClientService.getInstance().verifyConfiguration(newConfiguration, verifyLabel)
62+
OpenAiClientService.getInstance().verifyConfiguration(clientConfiguration, verifyLabel)
6663
}
6764
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
package com.github.blarc.ai.commits.intellij.plugin.settings.clients.openAi
22

3+
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils.getCredentialAttributes
34
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils.retrieveToken
5+
import com.github.blarc.ai.commits.intellij.plugin.notifications.Notification
6+
import com.github.blarc.ai.commits.intellij.plugin.notifications.sendNotification
47
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientService
8+
import com.intellij.ide.passwordSafe.PasswordSafe
59
import com.intellij.openapi.components.Service
610
import com.intellij.openapi.components.service
711
import com.intellij.util.text.nullize
812
import dev.langchain4j.model.chat.ChatLanguageModel
913
import dev.langchain4j.model.openai.OpenAiChatModel
1014
import kotlinx.coroutines.CoroutineScope
15+
import kotlinx.coroutines.Dispatchers
16+
import kotlinx.coroutines.launch
1117
import java.net.InetSocketAddress
1218
import java.net.Proxy
1319
import java.net.URI
1420
import java.time.Duration
1521

1622
@Service(Service.Level.APP)
17-
class OpenAiClientService(cs: CoroutineScope) : LLMClientService<OpenAiClientConfiguration>(cs) {
23+
class OpenAiClientService(private val cs: CoroutineScope) : LLMClientService<OpenAiClientConfiguration>(cs) {
1824

1925
companion object {
2026
@JvmStatic
@@ -42,5 +48,15 @@ class OpenAiClientService(cs: CoroutineScope) : LLMClientService<OpenAiClientCon
4248
return builder.build()
4349
}
4450

51+
fun saveToken(client: OpenAiClientConfiguration, token: String) {
52+
cs.launch(Dispatchers.Default) {
53+
try {
54+
PasswordSafe.instance.setPassword(getCredentialAttributes(client.id), token)
55+
client.tokenIsStored = true
56+
} catch (e: Exception) {
57+
sendNotification(Notification.unableToSaveToken(e.message))
58+
}
59+
}
60+
}
4561

4662
}

0 commit comments

Comments
 (0)