From 01963e2faafb4f422ffe7dc2ec9ddb271a0f4d3e Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Sun, 26 Nov 2023 13:21:02 +0200 Subject: [PATCH] Support additional command-line params for the server startup process --- .../completions/llama/LlamaServerAgent.java | 13 ++- .../service/LlamaServiceSelectionForm.java | 110 ++++++++++++------ .../service/ServiceSelectionForm.java | 8 ++ .../settings/state/LlamaSettingsState.java | 13 ++- .../components/UserPromptTextAreaHeader.java | 2 +- .../resources/messages/codegpt.properties | 2 + 6 files changed, 105 insertions(+), 43 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java b/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java index 283248ec..7216ef42 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/llama/LlamaServerAgent.java @@ -20,6 +20,7 @@ import ee.carlrobert.codegpt.settings.service.LlamaServiceSelectionForm; import ee.carlrobert.codegpt.settings.service.ServerProgressPanel; import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; import java.nio.charset.StandardCharsets; +import java.util.List; import javax.swing.SwingConstants; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -80,14 +81,16 @@ public final class LlamaServerAgent implements Disposable { serviceSelectionForm.getLlamaModelPreferencesForm().getActualModelPath(), serviceSelectionForm.getContextSize(), serviceSelectionForm.getThreads(), - serviceSelectionForm.getServerPort())); + serviceSelectionForm.getServerPort(), + serviceSelectionForm.getListOfAdditionalParameters())); startServerProcessHandler.addProcessListener(getProcessListener( serviceSelectionForm.getServerPort(), serverProgressPanel, onSuccess)); startServerProcessHandler.startNotify(); - } catch (ExecutionException e) { - throw new RuntimeException(e); + } catch (ExecutionException ex) { + LOG.error("Unable to start the server", ex); + throw new RuntimeException(ex); } } }; @@ -140,7 +143,8 @@ public final class LlamaServerAgent implements Disposable { String modelPath, int contextLength, int threads, - int port) { + int port, + List additionalParameters) { GeneralCommandLine commandLine = new GeneralCommandLine().withCharset(StandardCharsets.UTF_8); commandLine.setExePath("./server"); commandLine.withWorkDirectory(CodeGPTPlugin.getLlamaSourcePath()); @@ -149,6 +153,7 @@ public final class LlamaServerAgent implements Disposable { "-c", String.valueOf(contextLength), "--port", String.valueOf(port), "-t", String.valueOf(threads)); + commandLine.addParameters(additionalParameters); commandLine.setRedirectErrorStream(false); return commandLine; } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java index 80779105..7b78f835 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/LlamaServiceSelectionForm.java @@ -1,5 +1,7 @@ package ee.carlrobert.codegpt.settings.service; +import static java.util.stream.Collectors.toList; + import com.intellij.icons.AllIcons.Actions; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.ui.MessageType; @@ -8,6 +10,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.ui.PortField; import com.intellij.ui.TitledSeparator; import com.intellij.ui.components.JBLabel; +import com.intellij.ui.components.JBTextField; import com.intellij.ui.components.fields.IntegerField; import com.intellij.util.ui.FormBuilder; import com.intellij.util.ui.JBUI; @@ -19,8 +22,11 @@ import ee.carlrobert.codegpt.settings.state.LlamaSettingsState; import ee.carlrobert.codegpt.util.OverlayUtil; import java.awt.BorderLayout; import java.io.File; +import java.util.Arrays; +import java.util.List; import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; @@ -30,6 +36,7 @@ public class LlamaServiceSelectionForm extends JPanel { private final PortField portField; private final IntegerField maxTokensField; private final IntegerField threadsField; + private final JBTextField additionalParametersField; public LlamaServiceSelectionForm() { var llamaServerAgent = @@ -40,52 +47,21 @@ public class LlamaServiceSelectionForm extends JPanel { llamaModelPreferencesForm = new LlamaModelPreferencesForm(); + var llamaSettings = LlamaSettingsState.getInstance(); maxTokensField = new IntegerField("max_tokens", 256, 4096); maxTokensField.setColumns(12); - maxTokensField.setValue(2048); + maxTokensField.setValue(llamaSettings.getContextSize()); maxTokensField.setEnabled(!serverRunning); threadsField = new IntegerField("threads", 1, 256); threadsField.setColumns(12); - threadsField.setValue(8); + threadsField.setValue(llamaSettings.getThreads()); threadsField.setEnabled(!serverRunning); - var serverProgressPanel = new ServerProgressPanel(); - var serverButton = getServerButton(llamaServerAgent, serverProgressPanel); - var contextSizeHelpText = ComponentPanelBuilder.createCommentComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.contextSize.comment"), - true); - contextSizeHelpText.setBorder(JBUI.Borders.empty(0, 4)); - var threadsHelpText = ComponentPanelBuilder.createCommentComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.threads.comment"), - true); + additionalParametersField = new JBTextField(llamaSettings.getAdditionalParameters(), 30); + additionalParametersField.setEnabled(!serverRunning); - setLayout(new BorderLayout()); - add(FormBuilder.createFormBuilder() - .addComponent(new TitledSeparator( - CodeGPTBundle.get("settingsConfigurable.service.llama.modelPreferences.title"))) - .addComponent(withEmptyLeftBorder(llamaModelPreferencesForm.getForm())) - .addComponent(new TitledSeparator( - CodeGPTBundle.get("settingsConfigurable.service.llama.serverPreferences.title"))) - .addComponent(withEmptyLeftBorder(FormBuilder.createFormBuilder() - .addLabeledComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.contextSize.label"), - maxTokensField) - .addComponentToRightColumn(contextSizeHelpText) - .addLabeledComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.threads.label"), - threadsField) - .addComponentToRightColumn(threadsHelpText) - .addLabeledComponent( - CodeGPTBundle.get("settingsConfigurable.service.llama.port.label"), - JBUI.Panels.simplePanel() - .addToLeft(portField) - .addToRight(serverButton)) - .getPanel())) - .addVerticalGap(4) - .addComponent(withEmptyLeftBorder(serverProgressPanel)) - .addComponentFillVertically(new JPanel(), 0) - .getPanel()); + init(llamaServerAgent); } public void setServerPort(int serverPort) { @@ -121,6 +97,65 @@ public class LlamaServiceSelectionForm extends JPanel { return threadsField.getValue(); } + public void setAdditionalParameters(String additionalParameters) { + additionalParametersField.setText(additionalParameters); + } + + public String getAdditionalParameters() { + return additionalParametersField.getText(); + } + + public List getListOfAdditionalParameters() { + var parameters = additionalParametersField.getText().split(","); + return Arrays.stream(parameters) + .map(String::trim) + .collect(toList()); + } + + private void init(LlamaServerAgent llamaServerAgent) { + var serverProgressPanel = new ServerProgressPanel(); + setLayout(new BorderLayout()); + add(FormBuilder.createFormBuilder() + .addComponent(new TitledSeparator( + CodeGPTBundle.get("settingsConfigurable.service.llama.modelPreferences.title"))) + .addComponent(withEmptyLeftBorder(llamaModelPreferencesForm.getForm())) + .addComponent(new TitledSeparator( + CodeGPTBundle.get("settingsConfigurable.service.llama.serverPreferences.title"))) + .addComponent(withEmptyLeftBorder(FormBuilder.createFormBuilder() + .addLabeledComponent( + CodeGPTBundle.get("settingsConfigurable.service.llama.contextSize.label"), + maxTokensField) + .addComponentToRightColumn( + createComment("settingsConfigurable.service.llama.contextSize.comment")) + .addLabeledComponent( + CodeGPTBundle.get("settingsConfigurable.service.llama.threads.label"), + threadsField) + .addComponentToRightColumn( + createComment("settingsConfigurable.service.llama.threads.comment")) + .addLabeledComponent( + CodeGPTBundle.get("settingsConfigurable.service.llama.additionalParameters.label"), + additionalParametersField) + .addComponentToRightColumn( + createComment("settingsConfigurable.service.llama.additionalParameters.comment")) + .addLabeledComponent( + CodeGPTBundle.get("settingsConfigurable.service.llama.port.label"), + JBUI.Panels.simplePanel() + .addToLeft(portField) + .addToRight(getServerButton(llamaServerAgent, serverProgressPanel))) + .getPanel())) + .addVerticalGap(4) + .addComponent(withEmptyLeftBorder(serverProgressPanel)) + .addComponentFillVertically(new JPanel(), 0) + .getPanel()); + } + + private JLabel createComment(String messageKey) { + var comment = ComponentPanelBuilder.createCommentComponent( + CodeGPTBundle.get(messageKey), true); + comment.setBorder(JBUI.Borders.empty(0, 4)); + return comment; + } + private JButton getServerButton( LlamaServerAgent llamaServerAgent, ServerProgressPanel serverProgressPanel) { @@ -208,5 +243,6 @@ public class LlamaServiceSelectionForm extends JPanel { portField.setEnabled(enabled); maxTokensField.setEnabled(enabled); threadsField.setEnabled(enabled); + additionalParametersField.setEnabled(enabled); } } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java index e3e5ccb7..71858c7e 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/ServiceSelectionForm.java @@ -420,4 +420,12 @@ public class ServiceSelectionForm { public void setThreads(int threads) { llamaServiceSectionPanel.setThreads(threads); } + + public String getAdditionalParameters() { + return llamaServiceSectionPanel.getAdditionalParameters(); + } + + public void setAdditionalParameters(String additionalParameters) { + llamaServiceSectionPanel.setAdditionalParameters(additionalParameters); + } } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java b/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java index 51e0d27c..1f488558 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/state/LlamaSettingsState.java @@ -21,8 +21,8 @@ public class LlamaSettingsState implements PersistentStateComponentAdditional command-line parameters for the server startup process, separated by commas. See the full list of options

Example: "--n-gpu-layers, 1, --no-mmap, --mlock"

settingsConfigurable.service.llama.port.label=Port: settingsConfigurable.service.llama.startServer.label=Start server settingsConfigurable.service.llama.stopServer.label=Stop server