mirror of
https://github.com/carlrobertoh/ProxyAI.git
synced 2026-05-19 16:28:46 +00:00
feat: add support for configuring code completions via settings
This commit is contained in:
parent
2b98b65210
commit
f0172722c7
17 changed files with 198 additions and 139 deletions
|
|
@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
- Vision support (image understanding) for OpenAI GPT-4 and Anthropic Claude models
|
||||
- Total token panel for all providers
|
||||
- Support for configuring code completions via settings
|
||||
|
||||
### Fixed
|
||||
|
||||
|
|
|
|||
|
|
@ -1,26 +0,0 @@
|
|||
package ee.carlrobert.codegpt.actions;
|
||||
|
||||
import com.intellij.util.messages.Topic;
|
||||
import com.intellij.util.messages.Topic.BroadcastDirection;
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
|
||||
import java.util.EventListener;
|
||||
|
||||
/**
|
||||
* {@link EventListener} for changes of {@link ConfigurationState#isCodeCompletionsEnabled()}.
|
||||
*
|
||||
* @see EnableCompletionsAction
|
||||
* @see DisableCompletionsAction
|
||||
*/
|
||||
public interface CodeCompletionEnabledListener extends EventListener {
|
||||
|
||||
/**
|
||||
* Topic for subscribing to {@link ConfigurationState#isCodeCompletionsEnabled()} changes.<br/>
|
||||
* Broadcasts from Application-Level to all projects.
|
||||
*/
|
||||
@Topic.AppLevel
|
||||
Topic<CodeCompletionEnabledListener> TOPIC = new Topic<>(CodeCompletionEnabledListener.class,
|
||||
BroadcastDirection.TO_DIRECT_CHILDREN);
|
||||
|
||||
void onCodeCompletionsEnabledChange(boolean codeCompletionsEnabled);
|
||||
}
|
||||
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
package ee.carlrobert.codegpt.actions;
|
||||
|
||||
import static ee.carlrobert.codegpt.settings.service.ServiceType.LLAMA_CPP;
|
||||
import static ee.carlrobert.codegpt.settings.service.ServiceType.OPENAI;
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionUpdateThread;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import ee.carlrobert.codegpt.settings.GeneralSettings;
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
|
||||
import java.util.List;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Disables code-completion.<br/> Publishes message to {@link CodeCompletionEnabledListener#TOPIC}
|
||||
*/
|
||||
public class DisableCompletionsAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(false);
|
||||
ApplicationManager.getApplication()
|
||||
.getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC)
|
||||
.onCodeCompletionsEnabledChange(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
var selectedService = GeneralSettings.getCurrentState().getSelectedService();
|
||||
var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled();
|
||||
e.getPresentation().setEnabled(codeCompletionEnabled);
|
||||
e.getPresentation()
|
||||
.setVisible(codeCompletionEnabled && List.of(OPENAI, LLAMA_CPP).contains(selectedService));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ActionUpdateThread getActionUpdateThread() {
|
||||
return ActionUpdateThread.BGT;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
package ee.carlrobert.codegpt.actions;
|
||||
|
||||
import static ee.carlrobert.codegpt.settings.service.ServiceType.LLAMA_CPP;
|
||||
import static ee.carlrobert.codegpt.settings.service.ServiceType.OPENAI;
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionUpdateThread;
|
||||
import com.intellij.openapi.actionSystem.AnAction;
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import ee.carlrobert.codegpt.settings.GeneralSettings;
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
|
||||
import java.util.List;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Enables code-completion.<br/> Publishes message to {@link CodeCompletionEnabledListener#TOPIC}
|
||||
*/
|
||||
public class EnableCompletionsAction extends AnAction {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(@NotNull AnActionEvent e) {
|
||||
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true);
|
||||
ApplicationManager.getApplication()
|
||||
.getMessageBus().syncPublisher(CodeCompletionEnabledListener.TOPIC)
|
||||
.onCodeCompletionsEnabledChange(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(@NotNull AnActionEvent e) {
|
||||
var selectedService = GeneralSettings.getCurrentState().getSelectedService();
|
||||
var codeCompletionEnabled = ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled();
|
||||
e.getPresentation().setEnabled(!codeCompletionEnabled);
|
||||
e.getPresentation()
|
||||
.setVisible(!codeCompletionEnabled && List.of(OPENAI, LLAMA_CPP).contains(selectedService));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ActionUpdateThread getActionUpdateThread() {
|
||||
return ActionUpdateThread.BGT;
|
||||
}
|
||||
}
|
||||
|
|
@ -161,8 +161,6 @@ public class ConfigurationComponent {
|
|||
state.setCreateNewChatOnEachAction(openNewTabCheckBox.isSelected());
|
||||
state.setMethodNameGenerationEnabled(methodNameGenerationCheckBox.isSelected());
|
||||
state.setAutoFormattingEnabled(autoFormattingCheckBox.isSelected());
|
||||
state.setCodeCompletionsEnabled(
|
||||
ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled());
|
||||
return state;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ public class ConfigurationState {
|
|||
private boolean methodNameGenerationEnabled = true;
|
||||
private boolean captureCompileErrors = true;
|
||||
private boolean autoFormattingEnabled = true;
|
||||
private boolean codeCompletionsEnabled;
|
||||
private Map<String, String> tableData = EditorActionsUtil.DEFAULT_ACTIONS;
|
||||
|
||||
public String getSystemPrompt() {
|
||||
|
|
@ -119,14 +118,6 @@ public class ConfigurationState {
|
|||
this.autoFormattingEnabled = autoFormattingEnabled;
|
||||
}
|
||||
|
||||
public boolean isCodeCompletionsEnabled() {
|
||||
return codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
|
||||
this.codeCompletionsEnabled = codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
|
|
@ -144,7 +135,6 @@ public class ConfigurationState {
|
|||
&& methodNameGenerationEnabled == that.methodNameGenerationEnabled
|
||||
&& captureCompileErrors == that.captureCompileErrors
|
||||
&& autoFormattingEnabled == that.autoFormattingEnabled
|
||||
&& codeCompletionsEnabled == that.codeCompletionsEnabled
|
||||
&& Objects.equals(systemPrompt, that.systemPrompt)
|
||||
&& Objects.equals(commitMessagePrompt, that.commitMessagePrompt)
|
||||
&& Objects.equals(tableData, that.tableData);
|
||||
|
|
@ -154,7 +144,6 @@ public class ConfigurationState {
|
|||
public int hashCode() {
|
||||
return Objects.hash(systemPrompt, commitMessagePrompt, maxTokens, temperature,
|
||||
checkForPluginUpdates, createNewChatOnEachAction, ignoreGitCommitTokenLimit,
|
||||
methodNameGenerationEnabled, captureCompileErrors, autoFormattingEnabled,
|
||||
codeCompletionsEnabled, tableData);
|
||||
methodNameGenerationEnabled, captureCompileErrors, autoFormattingEnabled, tableData);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ public class LlamaSettingsState {
|
|||
private double topP = 0.9;
|
||||
private double minP = 0.05;
|
||||
private double repeatPenalty = 1.1;
|
||||
private boolean codeCompletionsEnabled = true;
|
||||
private int codeCompletionMaxTokens = 128;
|
||||
|
||||
public boolean isUseCustomModel() {
|
||||
return useCustomModel;
|
||||
|
|
@ -168,6 +170,22 @@ public class LlamaSettingsState {
|
|||
this.repeatPenalty = repeatPenalty;
|
||||
}
|
||||
|
||||
public boolean isCodeCompletionsEnabled() {
|
||||
return codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
|
||||
this.codeCompletionsEnabled = codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
public int getCodeCompletionMaxTokens() {
|
||||
return codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
public void setCodeCompletionMaxTokens(int codeCompletionMaxTokens) {
|
||||
this.codeCompletionMaxTokens = codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
private static Integer getRandomAvailablePortOrDefault() {
|
||||
try (ServerSocket socket = new ServerSocket(0)) {
|
||||
return socket.getLocalPort();
|
||||
|
|
@ -201,7 +219,9 @@ public class LlamaSettingsState {
|
|||
&& remoteModelInfillPromptTemplate == that.remoteModelInfillPromptTemplate
|
||||
&& Objects.equals(baseHost, that.baseHost)
|
||||
&& Objects.equals(serverPort, that.serverPort)
|
||||
&& Objects.equals(additionalParameters, that.additionalParameters);
|
||||
&& Objects.equals(additionalParameters, that.additionalParameters)
|
||||
&& codeCompletionsEnabled == that.codeCompletionsEnabled
|
||||
&& codeCompletionMaxTokens == that.codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -209,6 +229,7 @@ public class LlamaSettingsState {
|
|||
return Objects.hash(runLocalServer, useCustomModel, customLlamaModelPath, huggingFaceModel,
|
||||
localModelPromptTemplate, remoteModelPromptTemplate, localModelInfillPromptTemplate,
|
||||
remoteModelInfillPromptTemplate, baseHost, serverPort, contextSize, threads,
|
||||
additionalParameters, topK, topP, minP, repeatPenalty);
|
||||
additionalParameters, topK, topP, minP, repeatPenalty, codeCompletionsEnabled,
|
||||
codeCompletionMaxTokens);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import static ee.carlrobert.codegpt.ui.UIUtil.withEmptyLeftBorder;
|
|||
import com.intellij.ui.TitledSeparator;
|
||||
import com.intellij.util.ui.FormBuilder;
|
||||
import ee.carlrobert.codegpt.CodeGPTBundle;
|
||||
import ee.carlrobert.codegpt.settings.service.CodeCompletionConfigurationForm;
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings;
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettingsState;
|
||||
import java.awt.BorderLayout;
|
||||
|
|
@ -14,10 +15,14 @@ public class LlamaSettingsForm extends JPanel {
|
|||
|
||||
private final LlamaServerPreferencesForm llamaServerPreferencesForm;
|
||||
private final LlamaRequestPreferencesForm llamaRequestPreferencesForm;
|
||||
private final CodeCompletionConfigurationForm codeCompletionConfigurationForm;
|
||||
|
||||
public LlamaSettingsForm(LlamaSettingsState settings) {
|
||||
llamaServerPreferencesForm = new LlamaServerPreferencesForm(settings);
|
||||
llamaRequestPreferencesForm = new LlamaRequestPreferencesForm(settings);
|
||||
codeCompletionConfigurationForm = new CodeCompletionConfigurationForm(
|
||||
settings.isCodeCompletionsEnabled(),
|
||||
settings.getCodeCompletionMaxTokens());
|
||||
init();
|
||||
}
|
||||
|
||||
|
|
@ -44,6 +49,8 @@ public class LlamaSettingsForm extends JPanel {
|
|||
state.setLocalModelPromptTemplate(modelPreferencesForm.getPromptTemplate());
|
||||
state.setLocalModelInfillPromptTemplate(modelPreferencesForm.getInfillPromptTemplate());
|
||||
|
||||
state.setCodeCompletionsEnabled(codeCompletionConfigurationForm.isCodeCompletionsEnabled());
|
||||
state.setCodeCompletionMaxTokens(codeCompletionConfigurationForm.getMaxTokens());
|
||||
return state;
|
||||
}
|
||||
|
||||
|
|
@ -51,6 +58,8 @@ public class LlamaSettingsForm extends JPanel {
|
|||
var state = LlamaSettings.getCurrentState();
|
||||
llamaServerPreferencesForm.resetForm(state);
|
||||
llamaRequestPreferencesForm.resetForm(state);
|
||||
codeCompletionConfigurationForm.setCodeCompletionsEnabled(state.isCodeCompletionsEnabled());
|
||||
codeCompletionConfigurationForm.setMaxTokens(state.getCodeCompletionMaxTokens());
|
||||
}
|
||||
|
||||
public LlamaServerPreferencesForm getLlamaServerPreferencesForm() {
|
||||
|
|
@ -60,6 +69,8 @@ public class LlamaSettingsForm extends JPanel {
|
|||
private void init() {
|
||||
setLayout(new BorderLayout());
|
||||
add(FormBuilder.createFormBuilder()
|
||||
.addComponent(new TitledSeparator("Code Completions"))
|
||||
.addComponent(withEmptyLeftBorder(codeCompletionConfigurationForm.getForm()))
|
||||
.addComponent(new TitledSeparator(
|
||||
CodeGPTBundle.get("settingsConfigurable.service.llama.serverPreferences.title")))
|
||||
.addComponent(llamaServerPreferencesForm.getForm())
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import com.intellij.openapi.components.PersistentStateComponent;
|
|||
import com.intellij.openapi.components.State;
|
||||
import com.intellij.openapi.components.Storage;
|
||||
import ee.carlrobert.codegpt.credentials.CredentialsStore;
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import com.intellij.util.ui.FormBuilder;
|
|||
import com.intellij.util.ui.UI;
|
||||
import ee.carlrobert.codegpt.CodeGPTBundle;
|
||||
import ee.carlrobert.codegpt.credentials.CredentialsStore;
|
||||
import ee.carlrobert.codegpt.settings.service.CodeCompletionConfigurationForm;
|
||||
import ee.carlrobert.codegpt.ui.UIUtil;
|
||||
import ee.carlrobert.llm.client.openai.completion.OpenAIChatCompletionModel;
|
||||
import javax.swing.JPanel;
|
||||
|
|
@ -22,6 +23,7 @@ public class OpenAISettingsForm {
|
|||
private final JBPasswordField apiKeyField;
|
||||
private final JBTextField organizationField;
|
||||
private final ComboBox<OpenAIChatCompletionModel> completionModelComboBox;
|
||||
private final CodeCompletionConfigurationForm codeCompletionConfigurationForm;
|
||||
|
||||
public OpenAISettingsForm(OpenAISettingsState settings) {
|
||||
apiKeyField = new JBPasswordField();
|
||||
|
|
@ -32,6 +34,9 @@ public class OpenAISettingsForm {
|
|||
new EnumComboBoxModel<>(OpenAIChatCompletionModel.class));
|
||||
completionModelComboBox.setSelectedItem(
|
||||
OpenAIChatCompletionModel.findByCode(settings.getModel()));
|
||||
codeCompletionConfigurationForm = new CodeCompletionConfigurationForm(
|
||||
settings.isCodeCompletionsEnabled(),
|
||||
settings.getCodeCompletionMaxTokens());
|
||||
}
|
||||
|
||||
public JPanel getForm() {
|
||||
|
|
@ -52,6 +57,8 @@ public class OpenAISettingsForm {
|
|||
.createPanel();
|
||||
|
||||
return FormBuilder.createFormBuilder()
|
||||
.addComponent(new TitledSeparator(CodeGPTBundle.get("shared.codeCompletions")))
|
||||
.addComponent(withEmptyLeftBorder(codeCompletionConfigurationForm.getForm()))
|
||||
.addComponent(new TitledSeparator(CodeGPTBundle.get("shared.configuration")))
|
||||
.addComponent(withEmptyLeftBorder(configurationGrid))
|
||||
.addComponentFillVertically(new JPanel(), 0)
|
||||
|
|
@ -73,6 +80,8 @@ public class OpenAISettingsForm {
|
|||
var state = new OpenAISettingsState();
|
||||
state.setModel(getModel());
|
||||
state.setOrganization(organizationField.getText());
|
||||
state.setCodeCompletionsEnabled(codeCompletionConfigurationForm.isCodeCompletionsEnabled());
|
||||
state.setCodeCompletionMaxTokens(codeCompletionConfigurationForm.getMaxTokens());
|
||||
return state;
|
||||
}
|
||||
|
||||
|
|
@ -82,5 +91,7 @@ public class OpenAISettingsForm {
|
|||
completionModelComboBox.setSelectedItem(
|
||||
OpenAIChatCompletionModel.findByCode(state.getModel()));
|
||||
organizationField.setText(state.getOrganization());
|
||||
codeCompletionConfigurationForm.setCodeCompletionsEnabled(state.isCodeCompletionsEnabled());
|
||||
codeCompletionConfigurationForm.setMaxTokens(state.getCodeCompletionMaxTokens());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@ public class OpenAISettingsState {
|
|||
|
||||
private String organization = "";
|
||||
private String model = OpenAIChatCompletionModel.GPT_3_5_0125_16k.getCode();
|
||||
private boolean codeCompletionsEnabled = true;
|
||||
private int codeCompletionMaxTokens = 128;
|
||||
|
||||
public String getOrganization() {
|
||||
return organization;
|
||||
|
|
@ -24,6 +26,22 @@ public class OpenAISettingsState {
|
|||
this.model = model;
|
||||
}
|
||||
|
||||
public boolean isCodeCompletionsEnabled() {
|
||||
return codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
public void setCodeCompletionsEnabled(boolean codeCompletionsEnabled) {
|
||||
this.codeCompletionsEnabled = codeCompletionsEnabled;
|
||||
}
|
||||
|
||||
public int getCodeCompletionMaxTokens() {
|
||||
return codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
public void setCodeCompletionMaxTokens(int codeCompletionMaxTokens) {
|
||||
this.codeCompletionMaxTokens = codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
|
|
@ -33,11 +51,14 @@ public class OpenAISettingsState {
|
|||
return false;
|
||||
}
|
||||
OpenAISettingsState that = (OpenAISettingsState) o;
|
||||
return Objects.equals(organization, that.organization) && Objects.equals(model, that.model);
|
||||
return Objects.equals(organization, that.organization)
|
||||
&& Objects.equals(model, that.model)
|
||||
&& codeCompletionsEnabled == that.codeCompletionsEnabled
|
||||
&& codeCompletionMaxTokens == that.codeCompletionMaxTokens;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(organization, model);
|
||||
return Objects.hash(organization, model, codeCompletionsEnabled, codeCompletionMaxTokens);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
package ee.carlrobert.codegpt.actions
|
||||
|
||||
import com.intellij.openapi.actionSystem.ActionUpdateThread
|
||||
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.project.DumbAwareAction
|
||||
import ee.carlrobert.codegpt.settings.GeneralSettings
|
||||
import ee.carlrobert.codegpt.settings.service.ServiceType
|
||||
import ee.carlrobert.codegpt.settings.service.ServiceType.LLAMA_CPP
|
||||
import ee.carlrobert.codegpt.settings.service.ServiceType.OPENAI
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings
|
||||
import ee.carlrobert.codegpt.settings.service.openai.OpenAISettings
|
||||
|
||||
abstract class CodeCompletionFeatureToggleActions(
|
||||
private val enableFeatureAction: Boolean
|
||||
) : DumbAwareAction() {
|
||||
|
||||
override fun actionPerformed(e: AnActionEvent) {
|
||||
GeneralSettings.getCurrentState().selectedService
|
||||
.takeIf { it in listOf(OPENAI, LLAMA_CPP) }
|
||||
?.also { selectedService ->
|
||||
if (OPENAI == selectedService) {
|
||||
OpenAISettings.getCurrentState().isCodeCompletionsEnabled = enableFeatureAction
|
||||
} else {
|
||||
LlamaSettings.getCurrentState().isCodeCompletionsEnabled = enableFeatureAction
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun update(e: AnActionEvent) {
|
||||
val selectedService = GeneralSettings.getCurrentState().selectedService
|
||||
val codeCompletionEnabled = isCodeCompletionsEnabled(selectedService)
|
||||
e.presentation.isEnabled = codeCompletionEnabled != enableFeatureAction
|
||||
e.presentation.isVisible =
|
||||
e.presentation.isEnabled && listOf(OPENAI, LLAMA_CPP).contains(
|
||||
selectedService
|
||||
)
|
||||
}
|
||||
|
||||
override fun getActionUpdateThread(): ActionUpdateThread {
|
||||
return ActionUpdateThread.BGT
|
||||
}
|
||||
|
||||
private fun isCodeCompletionsEnabled(serviceType: ServiceType): Boolean {
|
||||
return when (serviceType) {
|
||||
OPENAI -> OpenAISettings.getCurrentState().isCodeCompletionsEnabled
|
||||
LLAMA_CPP -> LlamaSettings.getCurrentState().isCodeCompletionsEnabled
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class EnableCompletionsAction : CodeCompletionFeatureToggleActions(true)
|
||||
|
||||
class DisableCompletionsAction : CodeCompletionFeatureToggleActions(false)
|
||||
|
|
@ -2,34 +2,34 @@ package ee.carlrobert.codegpt.codecompletions
|
|||
|
||||
import ee.carlrobert.codegpt.completions.llama.LlamaModel
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettingsState
|
||||
import ee.carlrobert.codegpt.settings.service.openai.OpenAISettings
|
||||
import ee.carlrobert.llm.client.llama.completion.LlamaCompletionRequest
|
||||
import ee.carlrobert.llm.client.openai.completion.request.OpenAITextCompletionRequest
|
||||
|
||||
object CodeCompletionRequestFactory {
|
||||
private const val MAX_TOKENS = 128
|
||||
|
||||
fun buildOpenAIRequest(details: InfillRequestDetails): OpenAITextCompletionRequest {
|
||||
return OpenAITextCompletionRequest.Builder(details.prefix)
|
||||
.setSuffix(details.suffix)
|
||||
.setStream(true)
|
||||
.setMaxTokens(MAX_TOKENS)
|
||||
.setMaxTokens(OpenAISettings.getCurrentState().codeCompletionMaxTokens)
|
||||
.setTemperature(0.4)
|
||||
.build()
|
||||
}
|
||||
|
||||
fun buildLlamaRequest(details: InfillRequestDetails): LlamaCompletionRequest {
|
||||
val promptTemplate = getLlamaInfillPromptTemplate()
|
||||
val settings = LlamaSettings.getCurrentState()
|
||||
val promptTemplate = getLlamaInfillPromptTemplate(settings)
|
||||
val prompt = promptTemplate.buildPrompt(details.prefix, details.suffix)
|
||||
return LlamaCompletionRequest.Builder(prompt)
|
||||
.setN_predict(MAX_TOKENS)
|
||||
.setN_predict(settings.codeCompletionMaxTokens)
|
||||
.setStream(true)
|
||||
.setTemperature(0.4)
|
||||
.setStop(promptTemplate.stopTokens)
|
||||
.build()
|
||||
}
|
||||
|
||||
private fun getLlamaInfillPromptTemplate(): InfillPromptTemplate {
|
||||
val settings = LlamaSettings.getCurrentState()
|
||||
private fun getLlamaInfillPromptTemplate(settings: LlamaSettingsState): InfillPromptTemplate {
|
||||
if (!settings.isRunLocalServer) {
|
||||
return settings.remoteModelInfillPromptTemplate
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,7 +8,10 @@ import com.intellij.openapi.diagnostic.Logger
|
|||
import com.intellij.openapi.editor.Editor
|
||||
import ee.carlrobert.codegpt.CodeGPTKeys
|
||||
import ee.carlrobert.codegpt.completions.CompletionRequestService
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings
|
||||
import ee.carlrobert.codegpt.settings.GeneralSettings
|
||||
import ee.carlrobert.codegpt.settings.service.ServiceType
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings
|
||||
import ee.carlrobert.codegpt.settings.service.openai.OpenAISettings
|
||||
import ee.carlrobert.codegpt.treesitter.CodeCompletionParserFactory
|
||||
import ee.carlrobert.llm.completion.CompletionEventListener
|
||||
import kotlinx.coroutines.*
|
||||
|
|
@ -52,8 +55,13 @@ class CodeGPTInlineCompletionProvider : InlineCompletionProvider {
|
|||
}
|
||||
|
||||
override fun isEnabled(event: InlineCompletionEvent): Boolean {
|
||||
return event is InlineCompletionEvent.DocumentChange
|
||||
&& ConfigurationSettings.getCurrentState().isCodeCompletionsEnabled
|
||||
val selectedService = GeneralSettings.getCurrentState().selectedService
|
||||
val codeCompletionsEnabled = when (selectedService) {
|
||||
ServiceType.OPENAI -> OpenAISettings.getCurrentState().isCodeCompletionsEnabled
|
||||
ServiceType.LLAMA_CPP -> LlamaSettings.getCurrentState().isCodeCompletionsEnabled
|
||||
else -> false
|
||||
}
|
||||
return event is InlineCompletionEvent.DocumentChange && codeCompletionsEnabled
|
||||
}
|
||||
|
||||
private fun ProducerScope<InlineCompletionElement>.getCodeCompletionEventListener(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,49 @@
|
|||
package ee.carlrobert.codegpt.settings.service
|
||||
|
||||
import com.intellij.openapi.ui.panel.ComponentPanelBuilder
|
||||
import com.intellij.ui.components.JBCheckBox
|
||||
import com.intellij.ui.components.fields.IntegerField
|
||||
import com.intellij.util.ui.FormBuilder
|
||||
import ee.carlrobert.codegpt.CodeGPTBundle
|
||||
import javax.swing.JPanel
|
||||
|
||||
class CodeCompletionConfigurationForm(codeCompletionsEnabled: Boolean, maxTokens: Int) {
|
||||
|
||||
private val codeCompletionsEnabledCheckBox = JBCheckBox(
|
||||
CodeGPTBundle.get("codeCompletionsForm.enableFeatureText"),
|
||||
codeCompletionsEnabled
|
||||
)
|
||||
private val codeCompletionMaxTokensField =
|
||||
IntegerField("completion_max_tokens", 8, 4096).apply {
|
||||
columns = 12
|
||||
value = maxTokens
|
||||
}
|
||||
|
||||
fun getForm(): JPanel {
|
||||
return FormBuilder.createFormBuilder()
|
||||
.addComponent(codeCompletionsEnabledCheckBox)
|
||||
.addVerticalGap(4)
|
||||
.addLabeledComponent(
|
||||
CodeGPTBundle.get("codeCompletionsForm.maxTokensLabel"),
|
||||
codeCompletionMaxTokensField
|
||||
)
|
||||
.addComponentToRightColumn(
|
||||
ComponentPanelBuilder.createCommentComponent(
|
||||
CodeGPTBundle.get("codeCompletionsForm.maxTokensComment"), true, 48, true
|
||||
)
|
||||
)
|
||||
.panel
|
||||
}
|
||||
|
||||
var isCodeCompletionsEnabled: Boolean
|
||||
get() = codeCompletionsEnabledCheckBox.isSelected
|
||||
set(enabled) {
|
||||
codeCompletionsEnabledCheckBox.isSelected = enabled
|
||||
}
|
||||
|
||||
var maxTokens: Int
|
||||
get() = codeCompletionMaxTokensField.value
|
||||
set(maxTokens) {
|
||||
codeCompletionMaxTokensField.value = maxTokens
|
||||
}
|
||||
}
|
||||
|
|
@ -198,3 +198,7 @@ action.attachImage=Attach Image
|
|||
action.attachImageDescription=Attach an image
|
||||
imageFileChooser.title=Select Image
|
||||
imageAccordion.title=Attached image
|
||||
shared.codeCompletions=Code Completions
|
||||
codeCompletionsForm.enableFeatureText=Enable code completions
|
||||
codeCompletionsForm.maxTokensLabel=Max tokens:
|
||||
codeCompletionsForm.maxTokensComment=The maximum number of tokens that can be generated in the code completion.
|
||||
|
|
|
|||
|
|
@ -8,8 +8,7 @@ import static ee.carlrobert.llm.client.util.JSONUtil.jsonMapResponse;
|
|||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import com.intellij.openapi.editor.VisualPosition;
|
||||
import com.intellij.testFramework.PlatformTestUtil;
|
||||
import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings;
|
||||
import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings;
|
||||
import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange;
|
||||
import java.util.List;
|
||||
import testsupport.IntegrationTest;
|
||||
|
|
@ -20,7 +19,7 @@ public class CodeCompletionServiceTest extends IntegrationTest {
|
|||
|
||||
public void testFetchCodeCompletionLlama() {
|
||||
useLlamaService();
|
||||
ConfigurationSettings.getCurrentState().setCodeCompletionsEnabled(true);
|
||||
LlamaSettings.getCurrentState().setCodeCompletionsEnabled(true);
|
||||
myFixture.configureByText(
|
||||
"CompletionTest.java",
|
||||
getResourceContent("/codecompletions/code-completion-file.txt"));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue