Skip to content

Commit cc68215

Browse files
committed
feat(clients): option to configure LLM client configuration per project
Should've implemented prompt per project, but implemented LLM client configuration per project... oh well.
1 parent 838b0ed commit cc68215

File tree

7 files changed

+51
-12
lines changed

7 files changed

+51
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Added
66

77
- Variables `{taskId}`, `{taskSummary}` and `{taskDescription}` for prompt customization that are replaced with values from the active [task](https://www.jetbrains.com/help/idea/managing-tasks-and-context.html#work-with-tasks).
8+
- Option to configure LLM client configuration per project.
89

910
### Changed
1011

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import com.intellij.vcs.commit.AbstractCommitWorkflowHandler
1515

1616
class AICommitAction : AnAction(), DumbAware {
1717
override fun actionPerformed(e: AnActionEvent) {
18-
val llmClient = AppSettings2.instance.getActiveLLMClient()
18+
val llmClient = AppSettings2.instance.getActiveLLMClientConfiguration()
1919
if (llmClient == null) {
2020
Notification.clientNotSet()
2121
return

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,12 @@ class AppSettings2 : PersistentStateComponent<AppSettings2> {
136136
return AICommitsUtils.matchesGlobs(path, appExclusions)
137137
}
138138

139-
fun getActiveLLMClient(): LLMClientConfiguration? {
140-
return llmClientConfigurations.find { it.id == activeLlmClientId }
139+
fun getActiveLLMClientConfiguration(): LLMClientConfiguration? {
140+
return getActiveLLMClientConfiguration(activeLlmClientId)
141+
}
142+
143+
fun getActiveLLMClientConfiguration(activeLLMClientConfigurationId: String?): LLMClientConfiguration? {
144+
return llmClientConfigurations.find { it.id == activeLLMClientConfigurationId }
141145
?: llmClientConfigurations.firstOrNull()
142146
}
143147

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

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,23 @@ import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientCon
66
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientTable
77
import com.github.blarc.ai.commits.intellij.plugin.settings.prompts.Prompt
88
import com.github.blarc.ai.commits.intellij.plugin.settings.prompts.PromptTable
9+
import com.intellij.openapi.components.service
910
import com.intellij.openapi.options.BoundConfigurable
11+
import com.intellij.openapi.project.Project
1012
import com.intellij.openapi.ui.ComboBox
1113
import com.intellij.ui.CommonActionsPanel
1214
import com.intellij.ui.ToolbarDecorator
15+
import com.intellij.ui.components.JBCheckBox
1316
import com.intellij.ui.dsl.builder.*
1417
import java.util.*
1518

16-
class AppSettingsConfigurable : BoundConfigurable(message("settings.general.group.title")) {
19+
// Most of the settings are global, but we use project configurable to set isProjectSpecificLLMClient property
20+
class AppSettingsConfigurable(val project: Project) : BoundConfigurable(message("settings.general.group.title")) {
1721

1822
private val llmClientTable = LLMClientTable()
19-
private lateinit var llmClientToolbarDecorator: ToolbarDecorator
2023
private lateinit var llmClientConfigurationComboBox: ComboBox<LLMClientConfiguration>
24+
private var isProjectSpecificLLMClientCheckBox = JBCheckBox(message("settings.llmClient.projectSpecific"))
25+
private lateinit var llmClientToolbarDecorator: ToolbarDecorator
2126
private val promptTable = PromptTable()
2227
private lateinit var toolbarDecorator: ToolbarDecorator
2328
private lateinit var promptComboBox: ComboBox<Prompt>
@@ -27,12 +32,11 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
2732
row {
2833
label(message("settings.llmClient")).widthGroup("labelPrompt")
2934
llmClientConfigurationComboBox = comboBox(AppSettings2.instance.llmClientConfigurations, AICommitsListCellRenderer())
30-
.bindItem(getter = AppSettings2.instance::getActiveLLMClient) {
31-
it?.let {
32-
AppSettings2.instance.setActiveLlmClient(it.id)
33-
}
34-
}.widthGroup("input")
35+
.bindItem(getter = { getActiveLLMClientConfiguration() }, setter = { client: LLMClientConfiguration? -> setActiveLLMClientConfiguration(client) })
36+
.widthGroup("input")
3537
.component
38+
cell(isProjectSpecificLLMClientCheckBox)
39+
.bindSelected(project.service<ProjectSettings>()::isProjectSpecificLLMClient)
3640
}
3741
row {
3842
llmClientToolbarDecorator = ToolbarDecorator.createDecorator(llmClientTable.table)
@@ -125,6 +129,24 @@ class AppSettingsConfigurable : BoundConfigurable(message("settings.general.grou
125129
}
126130
}
127131

132+
private fun getActiveLLMClientConfiguration(): LLMClientConfiguration? {
133+
return if (isProjectSpecificLLMClientCheckBox.isSelected) {
134+
project.service<ProjectSettings>().getActiveLLMClientConfiguration()
135+
} else {
136+
AppSettings2.instance.getActiveLLMClientConfiguration()
137+
}
138+
}
139+
140+
private fun setActiveLLMClientConfiguration(llmClientConfiguration: LLMClientConfiguration?) {
141+
llmClientConfiguration?.let {
142+
if (isProjectSpecificLLMClientCheckBox.isSelected) {
143+
project.service<ProjectSettings>().activeLlmClientId = it.id
144+
} else {
145+
AppSettings2.instance.activeLlmClientId = it.id
146+
}
147+
}
148+
}
149+
128150
private fun updateActionAvailability(action: CommonActionsPanel.Buttons) {
129151
val selectedRow = promptTable.table.selectedRow
130152
val selectedPrompt = promptTable.table.items[selectedRow]

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

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

33
import com.github.blarc.ai.commits.intellij.plugin.AICommitsUtils
4+
import com.github.blarc.ai.commits.intellij.plugin.settings.clients.LLMClientConfiguration
45
import com.intellij.openapi.components.PersistentStateComponent
56
import com.intellij.openapi.components.Service
67
import com.intellij.openapi.components.State
78
import com.intellij.openapi.components.Storage
89
import com.intellij.util.xmlb.XmlSerializerUtil
10+
import com.intellij.util.xmlb.annotations.Attribute
911

1012
@State(
1113
name = ProjectSettings.SERVICE_NAME,
@@ -20,6 +22,11 @@ class ProjectSettings : PersistentStateComponent<ProjectSettings?> {
2022

2123
var projectExclusions: Set<String> = setOf()
2224

25+
@Attribute
26+
var activeLlmClientId: String? = null
27+
@Attribute
28+
var isProjectSpecificLLMClient: Boolean = false
29+
2330
override fun getState() = this
2431

2532
override fun loadState(state: ProjectSettings) {
@@ -30,5 +37,8 @@ class ProjectSettings : PersistentStateComponent<ProjectSettings?> {
3037
return AICommitsUtils.matchesGlobs(path, projectExclusions)
3138
}
3239

40+
fun getActiveLLMClientConfiguration(): LLMClientConfiguration? {
41+
return AppSettings2.instance.getActiveLLMClientConfiguration(activeLlmClientId)
42+
}
3343

3444
}

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,10 @@
6868
<!-- Extension points defined by the plugin.
6969
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
7070
<extensions defaultExtensionNs="com.intellij">
71-
<applicationConfigurable
71+
<projectConfigurable
7272
parentId="tools"
7373
instance="com.github.blarc.ai.commits.intellij.plugin.settings.AppSettingsConfigurable"
74+
id="com.github.blarc.ai.commits.intellij.plugin.settings.AppSettingsConfigurable"
7475
key="name"
7576
/>
7677

src/main/resources/messages/AiCommitsBundle.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ settings.exclusions.project.title=Project exclusions
6161
settings.prompt.hint=Hint
6262
settings.prompt.hint.comment=Note: This field is for testing purposes only. When generating the actual prompt, the {hint} variable will be replaced with content from the commit dialog.
6363
settings.llmClient=LLM Client
64+
settings.llmClient.projectSpecific=Project specific
6465
settings.llmClient.name=Name
6566
settings.llmClient.host=Host
6667
settings.llmClient.proxy=Proxy URL
@@ -71,7 +72,7 @@ settings.llmClient.modelId=Model
7172
settings.llmClient.timeout=Timeout
7273
settings.llmClient.temperature=Temperature
7374
settings.llmClient.temperature.comment=What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make \
74-
the output more random,while lower values like 0.2 will make it more focused and deterministic.
75+
the output more random,while lower values like 0.2 will make it more focused and deterministic.
7576

7677
settings.openAI.token.example=sk-ABCdefgHIjKlxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7778
settings.openAi.token.comment=You can get your token <a href="https://platform.openai.com/account/api-keys">here.</a>

0 commit comments

Comments
 (0)