Skip to content

Commit 48abd39

Browse files
committed
feat(settings): fetch OpenAI models from api
Add refresh button that fetches OpenAI models from OpenAI api. Save fetched OpenAI model ids locally.
1 parent 28f3b83 commit 48abd39

File tree

6 files changed

+56
-31
lines changed

6 files changed

+56
-31
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,10 @@ class OpenAIService {
1919

2020
@OptIn(BetaOpenAI::class)
2121
suspend fun generateCommitMessage(prompt: String, completions: Int): String {
22-
val openAIModel = AppSettings.instance.openAIModel.id
2322
val openAI = OpenAI(AppSettings.instance.getOpenAIConfig())
2423

2524
val chatCompletionRequest = ChatCompletionRequest(
26-
ModelId(openAIModel),
25+
ModelId(AppSettings.instance.openAIModelId),
2726
listOf(
2827
ChatMessage(
2928
role = ChatRole.User,
@@ -42,6 +41,12 @@ class OpenAIService {
4241
return completion.choices[0].message!!.content
4342

4443
}
44+
45+
suspend fun refreshOpenAIModelIds() {
46+
val openAI = OpenAI(AppSettings.instance.getOpenAIConfig())
47+
AppSettings.instance.openAIModelIds=openAI.models().map { it.id.id }
48+
}
49+
4550
@Throws(Exception::class)
4651
suspend fun verifyToken(token: String){
4752
OpenAI(token).models()

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

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.aallam.openai.client.OpenAIConfig
44
import com.aallam.openai.client.ProxyConfig
55
import com.github.blarc.ai.commits.intellij.plugin.notifications.Notification
66
import com.github.blarc.ai.commits.intellij.plugin.notifications.sendNotification
7-
import com.github.blarc.ai.commits.intellij.plugin.openaiModel.OpenAIModel
87
import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.Prompt
98
import com.intellij.credentialStore.CredentialAttributes
109
import com.intellij.credentialStore.Credentials
@@ -36,7 +35,8 @@ class AppSettings : PersistentStateComponent<AppSettings> {
3635
var prompts: MutableMap<String, Prompt> = initPrompts()
3736
var currentPrompt: Prompt = prompts["basic"]!!
3837

39-
var openAIModel: OpenAIModel = OpenAIModel.GPT_3_5_TURBO
38+
var openAIModelId: String = "gpt-3.5-turbo"
39+
var openAIModelIds: List<String> = listOf("gpt-3.5-turbo", "gpt-4")
4040

4141
companion object {
4242
const val SERVICE_NAME = "com.github.blarc.ai.commits.intellij.plugin.settings.AppSettings"

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

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,55 @@ import com.aallam.openai.api.exception.OpenAIAPIException
44
import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle
55
import com.github.blarc.ai.commits.intellij.plugin.AICommitsBundle.message
66
import com.github.blarc.ai.commits.intellij.plugin.OpenAIService
7-
import com.github.blarc.ai.commits.intellij.plugin.openaiModel.OpenAIModel
87
import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.Prompt
98
import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.PromptTable
109
import com.intellij.icons.AllIcons
1110
import com.intellij.openapi.options.BoundConfigurable
1211
import com.intellij.openapi.progress.runBackgroundableTask
1312
import com.intellij.openapi.ui.ComboBox
13+
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
1717
import com.intellij.ui.dsl.builder.*
18+
import com.intellij.ui.util.maximumWidth
1819
import com.intellij.ui.util.minimumWidth
19-
import kotlinx.coroutines.DelicateCoroutinesApi
20-
import kotlinx.coroutines.Dispatchers
21-
import kotlinx.coroutines.GlobalScope
22-
import kotlinx.coroutines.launch
20+
import kotlinx.coroutines.*
2321
import java.util.*
22+
import javax.swing.DefaultComboBoxModel
2423
import javax.swing.JPasswordField
2524

2625
class AppSettingsConfigurable : BoundConfigurable(message("settings.general.group.title")) {
2726

2827
private val tokenPasswordField = JPasswordField()
2928
private val verifyLabel = JBLabel()
29+
private var modelComboBox: ComboBox<String> = ComboBox<String>()
3030
private val promptTable = PromptTable()
3131
private lateinit var toolbarDecorator: ToolbarDecorator
3232
private lateinit var promptComboBox: Cell<ComboBox<Prompt>>
33+
34+
init {
35+
modelComboBox.model = DefaultComboBoxModel(Vector(AppSettings.instance.openAIModelIds.naturalSorted()))
36+
modelComboBox.renderer = AppSettingsListCellRenderer()
37+
}
38+
3339
override fun createPanel() = panel {
3440

3541
group(JBLabel("OpenAI")) {
3642
row {
37-
comboBox(OpenAIModel.values().toList(),
38-
AppSettingsListCellRenderer())
39-
.label(message("settings.openAIModel"))
40-
.bindItem(AppSettings.instance::openAIModel.toNullableProperty())
41-
}
42-
row {
43+
label(message("settings.openAIToken"))
44+
.widthGroup("label")
4345
cell(tokenPasswordField)
44-
.label(message("settings.openAIToken"))
4546
.bindText(
4647
{ AppSettings.instance.getOpenAIToken().orEmpty() },
4748
{ AppSettings.instance.saveOpenAIToken(it) }
4849
)
4950
.align(Align.FILL)
5051
.resizableColumn()
5152
.focused()
52-
button(message("settings.verifyToken")) {
53-
verifyToken()
54-
}.align(AlignX.RIGHT)
53+
button(message("settings.verifyToken")) { verifyToken() }
54+
.align(AlignX.RIGHT)
55+
.widthGroup("button")
5556
}
5657
row {
5758
comment(message("settings.openAITokenComment"))
@@ -60,23 +61,46 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
6061
.align(AlignX.RIGHT)
6162
}
6263
row {
64+
label(message("settings.openAIModel")).widthGroup("label")
65+
66+
cell(modelComboBox)
67+
.bindItem({ AppSettings.instance.openAIModelId }, {
68+
if (it != null) {
69+
AppSettings.instance.openAIModelId = it
70+
}
71+
})
72+
.resizableColumn()
73+
.align(Align.FILL)
74+
button(message("settings.refreshModels")) {
75+
runBackgroundableTask(message("settings.loadingModels")) {
76+
runBlocking(Dispatchers.IO) {
77+
OpenAIService.instance.refreshOpenAIModelIds()
78+
modelComboBox.model = DefaultComboBoxModel(Vector(AppSettings.instance.openAIModelIds.naturalSorted()))
79+
modelComboBox.item = AppSettings.instance.openAIModelId
80+
}
81+
}
82+
}
83+
.align(AlignX.RIGHT)
84+
.widthGroup("button")
85+
}
86+
row {
87+
label(message("settings.openAIProxy")).widthGroup("label")
6388
textField()
64-
.label(message("settings.openAIProxy"))
6589
.bindText(AppSettings.instance::proxyUrl.toNonNullableProperty(""))
90+
.applyToComponent { minimumWidth = 350 }
6691
.resizableColumn()
67-
.applyToComponent { minimumWidth = 300 }
6892
}
6993
}
7094

7195
group(JBLabel("Prompt")) {
7296
row {
97+
label(message("settings.locale")).widthGroup("labelPrompt")
7398
comboBox(Locale.getAvailableLocales().toList().sortedBy { it.displayName }, AppSettingsListCellRenderer())
74-
.label(message("settings.locale"))
7599
.bindItem(AppSettings.instance::locale.toNullableProperty())
76100
}
77101
row {
102+
label(message("settings.prompt")).widthGroup("labelPrompt")
78103
promptComboBox = comboBox(AppSettings.instance.prompts.values, AppSettingsListCellRenderer())
79-
.label(message("settings.prompt"))
80104
.bindItem(AppSettings.instance::currentPrompt.toNullableProperty())
81105
}
82106
row {

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

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

3-
import com.github.blarc.ai.commits.intellij.plugin.openaiModel.OpenAIModel
3+
import com.aallam.openai.api.model.ModelId
44
import com.github.blarc.ai.commits.intellij.plugin.settings.prompt.Prompt
55
import java.awt.Component
66
import java.util.*
@@ -22,7 +22,7 @@ class AppSettingsListCellRenderer : DefaultListCellRenderer() {
2222
if (value is Prompt) {
2323
text = value.name
2424
}
25-
if (value is OpenAIModel) {
25+
if (value is ModelId) {
2626
text = value.id
2727
}
2828
return component

src/main/resources/messages/MyBundle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ settings.verify.valid=Open AI token is valid.
1414
settings.verify.invalid=Open AI token is not valid ({0}).
1515
settings.verify.running=Verifying Open AI token...
1616
settings.verify.token-is-empty=Open AI token is empty.
17+
settings.refreshModels=Refresh
1718

1819
action.background=Generating commit message
1920
action.error=Commit message could not be generated.
@@ -47,4 +48,5 @@ settings.prompt.add.title=Add Prompt
4748
settings.prompt.description=Description
4849
validation.unique=Value already exists.
4950
settings.openAIProxy=OpenAI proxy url
51+
settings.loadingModels=Loading OpenAI models...
5052

0 commit comments

Comments
 (0)