Skip to content

Commit f017272

Browse files
committed
feat: add support for configuring code completions via settings
1 parent 2b98b65 commit f017272

17 files changed

+198
-139
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010

1111
- Vision support (image understanding) for OpenAI GPT-4 and Anthropic Claude models
1212
- Total token panel for all providers
13+
- Support for configuring code completions via settings
1314

1415
### Fixed
1516

src/main/java/ee/carlrobert/codegpt/actions/CodeCompletionEnabledListener.java

-26
This file was deleted.

src/main/java/ee/carlrobert/codegpt/actions/DisableCompletionsAction.java

-41
This file was deleted.

src/main/java/ee/carlrobert/codegpt/actions/EnableCompletionsAction.java

-41
This file was deleted.

src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationComponent.java

-2
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ public ConfigurationState getCurrentFormState() {
161161
state.setCreateNewChatOnEachAction(openNewTabCheckBox.isSelected());
162162
state.setMethodNameGenerationEnabled(methodNameGenerationCheckBox.isSelected());
163163
state.setAutoFormattingEnabled(autoFormattingCheckBox.isSelected());
164-
state.setCodeCompletionsEnabled(
165-
ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled());
166164
return state;
167165
}
168166

src/main/java/ee/carlrobert/codegpt/settings/configuration/ConfigurationState.java

+1-12
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public class ConfigurationState {
2020
private boolean methodNameGenerationEnabled = true;
2121
private boolean captureCompileErrors = true;
2222
private boolean autoFormattingEnabled = true;
23-
private boolean codeCompletionsEnabled;
2423
private Map<String, String> tableData = EditorActionsUtil.DEFAULT_ACTIONS;
2524

2625
public String getSystemPrompt() {
@@ -119,14 +118,6 @@ public void setAutoFormattingEnabled(boolean autoFormattingEnabled) {
119118
this.autoFormattingEnabled = autoFormattingEnabled;
120119
}
121120

122-
public boolean isCodeCompletionsEnabled() {
123-
return codeCompletionsEnabled;
124-
}
125-
126-
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
127-
this.codeCompletionsEnabled = codeCompletionsEnabled;
128-
}
129-
130121
@Override
131122
public boolean equals(Object o) {
132123
if (this == o) {
@@ -144,7 +135,6 @@ public boolean equals(Object o) {
144135
&& methodNameGenerationEnabled == that.methodNameGenerationEnabled
145136
&& captureCompileErrors == that.captureCompileErrors
146137
&& autoFormattingEnabled == that.autoFormattingEnabled
147-
&& codeCompletionsEnabled == that.codeCompletionsEnabled
148138
&& Objects.equals(systemPrompt, that.systemPrompt)
149139
&& Objects.equals(commitMessagePrompt, that.commitMessagePrompt)
150140
&& Objects.equals(tableData, that.tableData);
@@ -154,7 +144,6 @@ public boolean equals(Object o) {
154144
public int hashCode() {
155145
return Objects.hash(systemPrompt, commitMessagePrompt, maxTokens, temperature,
156146
checkForPluginUpdates, createNewChatOnEachAction, ignoreGitCommitTokenLimit,
157-
methodNameGenerationEnabled, captureCompileErrors, autoFormattingEnabled,
158-
codeCompletionsEnabled, tableData);
147+
methodNameGenerationEnabled, captureCompileErrors, autoFormattingEnabled, tableData);
159148
}
160149
}

src/main/java/ee/carlrobert/codegpt/settings/service/llama/LlamaSettingsState.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class LlamaSettingsState {
2727
private double topP = 0.9;
2828
private double minP = 0.05;
2929
private double repeatPenalty = 1.1;
30+
private boolean codeCompletionsEnabled = true;
31+
private int codeCompletionMaxTokens = 128;
3032

3133
public boolean isUseCustomModel() {
3234
return useCustomModel;
@@ -168,6 +170,22 @@ public void setRepeatPenalty(double repeatPenalty) {
168170
this.repeatPenalty = repeatPenalty;
169171
}
170172

173+
public boolean isCodeCompletionsEnabled() {
174+
return codeCompletionsEnabled;
175+
}
176+
177+
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
178+
this.codeCompletionsEnabled = codeCompletionsEnabled;
179+
}
180+
181+
public int getCodeCompletionMaxTokens() {
182+
return codeCompletionMaxTokens;
183+
}
184+
185+
public void setCodeCompletionMaxTokens(int codeCompletionMaxTokens) {
186+
this.codeCompletionMaxTokens = codeCompletionMaxTokens;
187+
}
188+
171189
private static Integer getRandomAvailablePortOrDefault() {
172190
try (ServerSocket socket = new ServerSocket(0)) {
173191
return socket.getLocalPort();
@@ -201,14 +219,17 @@ public boolean equals(Object o) {
201219
&& remoteModelInfillPromptTemplate == that.remoteModelInfillPromptTemplate
202220
&& Objects.equals(baseHost, that.baseHost)
203221
&& Objects.equals(serverPort, that.serverPort)
204-
&& Objects.equals(additionalParameters, that.additionalParameters);
222+
&& Objects.equals(additionalParameters, that.additionalParameters)
223+
&& codeCompletionsEnabled == that.codeCompletionsEnabled
224+
&& codeCompletionMaxTokens == that.codeCompletionMaxTokens;
205225
}
206226

207227
@Override
208228
public int hashCode() {
209229
return Objects.hash(runLocalServer, useCustomModel, customLlamaModelPath, huggingFaceModel,
210230
localModelPromptTemplate, remoteModelPromptTemplate, localModelInfillPromptTemplate,
211231
remoteModelInfillPromptTemplate, baseHost, serverPort, contextSize, threads,
212-
additionalParameters, topK, topP, minP, repeatPenalty);
232+
additionalParameters, topK, topP, minP, repeatPenalty, codeCompletionsEnabled,
233+
codeCompletionMaxTokens);
213234
}
214235
}

src/main/java/ee/carlrobert/codegpt/settings/service/llama/form/LlamaSettingsForm.java

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.intellij.ui.TitledSeparator;
66
import com.intellij.util.ui.FormBuilder;
77
import ee.carlrobert.codegpt.CodeGPTBundle;
8+
import ee.carlrobert.codegpt.settings.service.CodeCompletionConfigurationForm;
89
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings;
910
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettingsState;
1011
import java.awt.BorderLayout;
@@ -14,10 +15,14 @@ public class LlamaSettingsForm extends JPanel {
1415

1516
private final LlamaServerPreferencesForm llamaServerPreferencesForm;
1617
private final LlamaRequestPreferencesForm llamaRequestPreferencesForm;
18+
private final CodeCompletionConfigurationForm codeCompletionConfigurationForm;
1719

1820
public LlamaSettingsForm(LlamaSettingsState settings) {
1921
llamaServerPreferencesForm = new LlamaServerPreferencesForm(settings);
2022
llamaRequestPreferencesForm = new LlamaRequestPreferencesForm(settings);
23+
codeCompletionConfigurationForm = new CodeCompletionConfigurationForm(
24+
settings.isCodeCompletionsEnabled(),
25+
settings.getCodeCompletionMaxTokens());
2126
init();
2227
}
2328

@@ -44,13 +49,17 @@ public LlamaSettingsState getCurrentState() {
4449
state.setLocalModelPromptTemplate(modelPreferencesForm.getPromptTemplate());
4550
state.setLocalModelInfillPromptTemplate(modelPreferencesForm.getInfillPromptTemplate());
4651

52+
state.setCodeCompletionsEnabled(codeCompletionConfigurationForm.isCodeCompletionsEnabled());
53+
state.setCodeCompletionMaxTokens(codeCompletionConfigurationForm.getMaxTokens());
4754
return state;
4855
}
4956

5057
public void resetForm() {
5158
var state = LlamaSettings.getCurrentState();
5259
llamaServerPreferencesForm.resetForm(state);
5360
llamaRequestPreferencesForm.resetForm(state);
61+
codeCompletionConfigurationForm.setCodeCompletionsEnabled(state.isCodeCompletionsEnabled());
62+
codeCompletionConfigurationForm.setMaxTokens(state.getCodeCompletionMaxTokens());
5463
}
5564

5665
public LlamaServerPreferencesForm getLlamaServerPreferencesForm() {
@@ -60,6 +69,8 @@ public LlamaServerPreferencesForm getLlamaServerPreferencesForm() {
6069
private void init() {
6170
setLayout(new BorderLayout());
6271
add(FormBuilder.createFormBuilder()
72+
.addComponent(new TitledSeparator("Code Completions"))
73+
.addComponent(withEmptyLeftBorder(codeCompletionConfigurationForm.getForm()))
6374
.addComponent(new TitledSeparator(
6475
CodeGPTBundle.get("settingsConfigurable.service.llama.serverPreferences.title")))
6576
.addComponent(llamaServerPreferencesForm.getForm())

src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettings.java

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.intellij.openapi.components.State;
88
import com.intellij.openapi.components.Storage;
99
import ee.carlrobert.codegpt.credentials.CredentialsStore;
10+
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
1011
import org.apache.commons.lang3.StringUtils;
1112
import org.jetbrains.annotations.NotNull;
1213

src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettingsForm.java

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.util.ui.UI;
1313
import ee.carlrobert.codegpt.CodeGPTBundle;
1414
import ee.carlrobert.codegpt.credentials.CredentialsStore;
15+
import ee.carlrobert.codegpt.settings.service.CodeCompletionConfigurationForm;
1516
import ee.carlrobert.codegpt.ui.UIUtil;
1617
import ee.carlrobert.llm.client.openai.completion.OpenAIChatCompletionModel;
1718
import javax.swing.JPanel;
@@ -22,6 +23,7 @@ public class OpenAISettingsForm {
2223
private final JBPasswordField apiKeyField;
2324
private final JBTextField organizationField;
2425
private final ComboBox<OpenAIChatCompletionModel> completionModelComboBox;
26+
private final CodeCompletionConfigurationForm codeCompletionConfigurationForm;
2527

2628
public OpenAISettingsForm(OpenAISettingsState settings) {
2729
apiKeyField = new JBPasswordField();
@@ -32,6 +34,9 @@ public OpenAISettingsForm(OpenAISettingsState settings) {
3234
new EnumComboBoxModel<>(OpenAIChatCompletionModel.class));
3335
completionModelComboBox.setSelectedItem(
3436
OpenAIChatCompletionModel.findByCode(settings.getModel()));
37+
codeCompletionConfigurationForm = new CodeCompletionConfigurationForm(
38+
settings.isCodeCompletionsEnabled(),
39+
settings.getCodeCompletionMaxTokens());
3540
}
3641

3742
public JPanel getForm() {
@@ -52,6 +57,8 @@ public JPanel getForm() {
5257
.createPanel();
5358

5459
return FormBuilder.createFormBuilder()
60+
.addComponent(new TitledSeparator(CodeGPTBundle.get("shared.codeCompletions")))
61+
.addComponent(withEmptyLeftBorder(codeCompletionConfigurationForm.getForm()))
5562
.addComponent(new TitledSeparator(CodeGPTBundle.get("shared.configuration")))
5663
.addComponent(withEmptyLeftBorder(configurationGrid))
5764
.addComponentFillVertically(new JPanel(), 0)
@@ -73,6 +80,8 @@ public OpenAISettingsState getCurrentState() {
7380
var state = new OpenAISettingsState();
7481
state.setModel(getModel());
7582
state.setOrganization(organizationField.getText());
83+
state.setCodeCompletionsEnabled(codeCompletionConfigurationForm.isCodeCompletionsEnabled());
84+
state.setCodeCompletionMaxTokens(codeCompletionConfigurationForm.getMaxTokens());
7685
return state;
7786
}
7887

@@ -82,5 +91,7 @@ public void resetForm() {
8291
completionModelComboBox.setSelectedItem(
8392
OpenAIChatCompletionModel.findByCode(state.getModel()));
8493
organizationField.setText(state.getOrganization());
94+
codeCompletionConfigurationForm.setCodeCompletionsEnabled(state.isCodeCompletionsEnabled());
95+
codeCompletionConfigurationForm.setMaxTokens(state.getCodeCompletionMaxTokens());
8596
}
8697
}

src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettingsState.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ public class OpenAISettingsState {
77

88
private String organization = "";
99
private String model = OpenAIChatCompletionModel.GPT_3_5_0125_16k.getCode();
10+
private boolean codeCompletionsEnabled = true;
11+
private int codeCompletionMaxTokens = 128;
1012

1113
public String getOrganization() {
1214
return organization;
@@ -24,6 +26,22 @@ public void setModel(String model) {
2426
this.model = model;
2527
}
2628

29+
public boolean isCodeCompletionsEnabled() {
30+
return codeCompletionsEnabled;
31+
}
32+
33+
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
34+
this.codeCompletionsEnabled = codeCompletionsEnabled;
35+
}
36+
37+
public int getCodeCompletionMaxTokens() {
38+
return codeCompletionMaxTokens;
39+
}
40+
41+
public void setCodeCompletionMaxTokens(int codeCompletionMaxTokens) {
42+
this.codeCompletionMaxTokens = codeCompletionMaxTokens;
43+
}
44+
2745
@Override
2846
public boolean equals(Object o) {
2947
if (this == o) {
@@ -33,11 +51,14 @@ public boolean equals(Object o) {
3351
return false;
3452
}
3553
OpenAISettingsState that = (OpenAISettingsState) o;
36-
return Objects.equals(organization, that.organization) && Objects.equals(model, that.model);
54+
return Objects.equals(organization, that.organization)
55+
&& Objects.equals(model, that.model)
56+
&& codeCompletionsEnabled == that.codeCompletionsEnabled
57+
&& codeCompletionMaxTokens == that.codeCompletionMaxTokens;
3758
}
3859

3960
@Override
4061
public int hashCode() {
41-
return Objects.hash(organization, model);
62+
return Objects.hash(organization, model, codeCompletionsEnabled, codeCompletionMaxTokens);
4263
}
4364
}

0 commit comments

Comments
 (0)