From 6019a27a3950782de6d70d76b597adf72c1334c0 Mon Sep 17 00:00:00 2001 From: Rene Leonhardt <65483435+reneleonhardt@users.noreply.github.com> Date: Fri, 12 Apr 2024 08:55:28 +0200 Subject: [PATCH] fix: Enable Generate message also in non-modal commit dialog (#443) --- .../GenerateGitCommitMessageAction.java | 13 ++++---- .../CompletionRequestProvider.java | 3 +- .../completions/CompletionRequestService.java | 33 +++++++------------ .../conversations/ConversationService.java | 5 ++- .../codegpt/settings/GeneralSettings.java | 7 ++++ .../settings/service/azure/AzureSettings.java | 4 +++ .../service/azure/AzureSettingsState.java | 11 +++++++ .../service/openai/OpenAISettings.java | 4 +++ .../chat/ChatToolWindowTabPanel.java | 4 +-- .../chat/ui/textarea/ModelComboBoxAction.java | 2 +- .../chat/ui/textarea/TotalTokensPanel.java | 2 +- .../chat/ui/textarea/UserPromptTextArea.java | 2 +- .../codegpt/credentials/CredentialsStore.kt | 6 ++-- 13 files changed, 54 insertions(+), 42 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java b/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java index 1b7faa0b4..d2b800aa5 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/GenerateGitCommitMessageAction.java @@ -28,6 +28,7 @@ import ee.carlrobert.codegpt.Icons; import ee.carlrobert.codegpt.completions.CompletionRequestService; import ee.carlrobert.codegpt.settings.GeneralSettings; +import ee.carlrobert.codegpt.settings.service.ServiceType; import ee.carlrobert.codegpt.ui.OverlayUtil; import ee.carlrobert.llm.client.openai.completion.ErrorDetails; import ee.carlrobert.llm.completion.CompletionEventListener; @@ -61,16 +62,16 @@ public GenerateGitCommitMessageAction() { @Override public void update(@NotNull AnActionEvent event) { var commitWorkflowUi = event.getData(VcsDataKeys.COMMIT_WORKFLOW_UI); - var selectedService = GeneralSettings.getCurrentState().getSelectedService(); - if (selectedService == YOU || commitWorkflowUi == null) { + ServiceType selectedService; + if (commitWorkflowUi == null + || YOU == (selectedService = GeneralSettings.getSelectedService())) { event.getPresentation().setVisible(false); return; } - var callAllowed = CompletionRequestService.isRequestAllowed( - GeneralSettings.getCurrentState().getSelectedService()); - event.getPresentation().setEnabled(callAllowed - && new CommitWorkflowChanges(commitWorkflowUi).isFilesSelected()); + var callAllowed = CompletionRequestService.isRequestAllowed(selectedService); + boolean enabled = callAllowed && new CommitWorkflowChanges(commitWorkflowUi).isFilesSelected(); + event.getPresentation().setEnabled(enabled); event.getPresentation().setText(CodeGPTBundle.get(callAllowed ? "action.generateCommitMessage.title" : "action.generateCommitMessage.missingCredentials")); diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java index fa26cface..06893889f 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java @@ -335,8 +335,7 @@ private List buildMessages( CallParameters callParameters) { var messages = buildMessages(callParameters); - if (model == null - || GeneralSettings.getCurrentState().getSelectedService() == ServiceType.YOU) { + if (model == null || GeneralSettings.getSelectedService() == ServiceType.YOU) { return messages; } diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java index f4e3a17b5..d34dbf910 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java @@ -1,7 +1,5 @@ package ee.carlrobert.codegpt.completions; -import static ee.carlrobert.codegpt.settings.service.ServiceType.ANTHROPIC; -import static ee.carlrobert.codegpt.settings.service.ServiceType.AZURE; import static ee.carlrobert.codegpt.settings.service.ServiceType.CUSTOM_OPENAI; import static ee.carlrobert.codegpt.settings.service.ServiceType.LLAMA_CPP; import static ee.carlrobert.codegpt.settings.service.ServiceType.OPENAI; @@ -14,8 +12,6 @@ import ee.carlrobert.codegpt.codecompletions.InfillRequestDetails; import ee.carlrobert.codegpt.completions.llama.LlamaModel; import ee.carlrobert.codegpt.completions.llama.PromptTemplate; -import ee.carlrobert.codegpt.credentials.CredentialsStore; -import ee.carlrobert.codegpt.credentials.CredentialsStore.CredentialKey; import ee.carlrobert.codegpt.settings.GeneralSettings; import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.service.ServiceType; @@ -68,7 +64,7 @@ public EventSource getChatCompletionAsync( CallParameters callParameters, CompletionEventListener eventListener) { var requestProvider = new CompletionRequestProvider(callParameters.getConversation()); - return switch (GeneralSettings.getCurrentState().getSelectedService()) { + return switch (GeneralSettings.getSelectedService()) { case OPENAI -> CompletionClientProvider.getOpenAIClient().getChatCompletionAsync( requestProvider.buildOpenAIChatCompletionRequest( OpenAISettings.getCurrentState().getModel(), @@ -100,7 +96,7 @@ public EventSource getChatCompletionAsync( public EventSource getCodeCompletionAsync( InfillRequestDetails requestDetails, CompletionEventListener eventListener) { - return switch (GeneralSettings.getCurrentState().getSelectedService()) { + return switch (GeneralSettings.getSelectedService()) { case OPENAI -> CompletionClientProvider.getOpenAIClient() .getCompletionAsync( CodeCompletionRequestFactory.INSTANCE.buildOpenAIRequest(requestDetails), @@ -124,7 +120,7 @@ public void generateCommitMessageAsync( new OpenAIChatCompletionStandardMessage("user", prompt))) .setModel(OpenAISettings.getCurrentState().getModel()) .build(); - var selectedService = GeneralSettings.getCurrentState().getSelectedService(); + var selectedService = GeneralSettings.getSelectedService(); switch (selectedService) { case OPENAI: CompletionClientProvider.getOpenAIClient() @@ -182,7 +178,7 @@ public void generateCommitMessageAsync( } public Optional getLookupCompletion(String prompt) { - var selectedService = GeneralSettings.getCurrentState().getSelectedService(); + var selectedService = GeneralSettings.getSelectedService(); if (selectedService == YOU || selectedService == LLAMA_CPP) { return Optional.empty(); } @@ -206,23 +202,16 @@ public Optional getLookupCompletion(String prompt) { } public boolean isRequestAllowed() { - return isRequestAllowed(GeneralSettings.getCurrentState().getSelectedService()); + return isRequestAllowed(GeneralSettings.getSelectedService()); } public static boolean isRequestAllowed(ServiceType serviceType) { - if (serviceType == OPENAI - && CredentialsStore.INSTANCE.isCredentialSet(CredentialKey.OPENAI_API_KEY)) { - return true; - } - - var azureCredentialKey = AzureSettings.getCurrentState().isUseAzureApiKeyAuthentication() - ? CredentialKey.AZURE_OPENAI_API_KEY - : CredentialKey.AZURE_ACTIVE_DIRECTORY_TOKEN; - if (serviceType == AZURE && CredentialsStore.INSTANCE.isCredentialSet(azureCredentialKey)) { - return true; - } - - return List.of(LLAMA_CPP, ANTHROPIC, CUSTOM_OPENAI).contains(serviceType); + return switch (serviceType) { + case OPENAI -> OpenAISettings.isCredentialSet(); + case AZURE -> AzureSettings.isCredentialSet(); + case LLAMA_CPP, ANTHROPIC, CUSTOM_OPENAI -> true; + case YOU -> false; + }; } /** diff --git a/src/main/java/ee/carlrobert/codegpt/conversations/ConversationService.java b/src/main/java/ee/carlrobert/codegpt/conversations/ConversationService.java index 8e5757fdf..28a64ae04 100644 --- a/src/main/java/ee/carlrobert/codegpt/conversations/ConversationService.java +++ b/src/main/java/ee/carlrobert/codegpt/conversations/ConversationService.java @@ -46,8 +46,7 @@ public Conversation createConversation(String clientCode) { conversation.setClientCode(clientCode); conversation.setCreatedOn(LocalDateTime.now()); conversation.setUpdatedOn(LocalDateTime.now()); - conversation.setModel(getModelForSelectedService( - GeneralSettings.getCurrentState().getSelectedService())); + conversation.setModel(getModelForSelectedService(GeneralSettings.getSelectedService())); return conversation; } @@ -110,7 +109,7 @@ public void saveConversation(Conversation conversation) { } public Conversation startConversation() { - var completionCode = GeneralSettings.getCurrentState().getSelectedService().getCompletionCode(); + var completionCode = GeneralSettings.getSelectedService().getCompletionCode(); var conversation = createConversation(completionCode); conversationState.setCurrentConversation(conversation); addConversation(conversation); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/GeneralSettings.java b/src/main/java/ee/carlrobert/codegpt/settings/GeneralSettings.java index d6ca60708..db2bb6092 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/GeneralSettings.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/GeneralSettings.java @@ -34,6 +34,13 @@ public static GeneralSettingsState getCurrentState() { return getInstance().getState(); } + /** + * Selected service of current state. + */ + public static ServiceType getSelectedService() { + return getCurrentState().getSelectedService(); + } + public static GeneralSettings getInstance() { return ApplicationManager.getApplication().getService(GeneralSettings.class); } diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettings.java b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettings.java index 7df50c079..bdf74d886 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettings.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettings.java @@ -35,6 +35,10 @@ public static AzureSettings getInstance() { return ApplicationManager.getApplication().getService(AzureSettings.class); } + public static boolean isCredentialSet() { + return getCurrentState().isCredentialSet(); + } + public boolean isModified(AzureSettingsForm form) { return !form.getCurrentState().equals(state) || !StringUtils.equals( diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsState.java b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsState.java index dced9a5f8..4616e603f 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsState.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsState.java @@ -1,5 +1,6 @@ package ee.carlrobert.codegpt.settings.service.azure; +import ee.carlrobert.codegpt.credentials.CredentialsStore; import java.util.Objects; public class AzureSettingsState { @@ -51,6 +52,16 @@ public void setUseAzureActiveDirectoryAuthentication( this.useAzureActiveDirectoryAuthentication = useAzureActiveDirectoryAuthentication; } + public CredentialsStore.CredentialKey getCredentialKey() { + return isUseAzureApiKeyAuthentication() + ? CredentialsStore.CredentialKey.AZURE_OPENAI_API_KEY + : CredentialsStore.CredentialKey.AZURE_ACTIVE_DIRECTORY_TOKEN; + } + + public boolean isCredentialSet() { + return CredentialsStore.INSTANCE.isCredentialSet(getCredentialKey()); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettings.java b/src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettings.java index d65a1576e..bbca71f0e 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettings.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/openai/OpenAISettings.java @@ -34,6 +34,10 @@ public static OpenAISettings getInstance() { return ApplicationManager.getApplication().getService(OpenAISettings.class); } + public static boolean isCredentialSet() { + return CredentialsStore.INSTANCE.isCredentialSet(OPENAI_API_KEY); + } + public boolean isModified(OpenAISettingsForm form) { return !form.getCurrentState().equals(state) || !StringUtils.equals( diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java index 11105bc81..a36464546 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java @@ -7,7 +7,6 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.impl.EditorImpl; import com.intellij.openapi.project.Project; import com.intellij.ui.JBColor; import com.intellij.util.ui.JBUI; @@ -358,8 +357,7 @@ private JPanel createRootPanel() { gbc.weighty = 0; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridy = 1; - rootPanel.add( - createUserPromptPanel(GeneralSettings.getCurrentState().getSelectedService()), gbc); + rootPanel.add(createUserPromptPanel(GeneralSettings.getSelectedService()), gbc); return rootPanel; } } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/ModelComboBoxAction.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/ModelComboBoxAction.java index 1d1b14b53..7aab7b02a 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/ModelComboBoxAction.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/ModelComboBoxAction.java @@ -134,7 +134,7 @@ private void subscribeToYouSignedOutTopic( if (!YouUserManager.getInstance().isSubscribed() && youSettings.getChatMode() != YouCompletionMode.DEFAULT) { youSettings.setChatMode(YouCompletionMode.DEFAULT); - updateTemplatePresentation(GeneralSettings.getCurrentState().getSelectedService()); + updateTemplatePresentation(GeneralSettings.getSelectedService()); } } ); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/TotalTokensPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/TotalTokensPanel.java index c9b0da5c2..169eb233e 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/TotalTokensPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/TotalTokensPanel.java @@ -163,7 +163,7 @@ public void mouseEntered(MouseEvent e) { } private String getIconToolTipText(String html) { - if (GeneralSettings.getCurrentState().getSelectedService() != ServiceType.OPENAI) { + if (GeneralSettings.getSelectedService() != ServiceType.OPENAI) { return """ diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/UserPromptTextArea.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/UserPromptTextArea.java index e8cedd823..f789b2777 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/UserPromptTextArea.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ui/textarea/UserPromptTextArea.java @@ -190,7 +190,7 @@ public void actionPerformed(@NotNull AnActionEvent e) { handleSubmit(); } })); - var selectedService = GeneralSettings.getCurrentState().getSelectedService(); + var selectedService = GeneralSettings.getSelectedService(); if (selectedService == ANTHROPIC || (selectedService == OPENAI && GPT_4_VISION_PREVIEW.getCode().equals(OpenAISettings.getCurrentState().getModel()))) { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/credentials/CredentialsStore.kt b/src/main/kotlin/ee/carlrobert/codegpt/credentials/CredentialsStore.kt index 1a97fc623..9388fa2a3 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/credentials/CredentialsStore.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/credentials/CredentialsStore.kt @@ -9,7 +9,7 @@ object CredentialsStore { private val credentialsMap = mutableMapOf() fun loadAll() { - CredentialKey.values().forEach { + CredentialKey.entries.forEach { val credentialAttributes = CredentialAttributes(generateServiceName("CodeGPT", it.name)) val password = PasswordSafe.instance.getPassword(credentialAttributes) setCredential(it, password) @@ -22,7 +22,7 @@ object CredentialsStore { credentialsMap[key] = password } - fun isCredentialSet(key: CredentialKey): Boolean = !getCredential(key).isNullOrEmpty() + fun isCredentialSet(key: CredentialKey): Boolean = !getCredential(key).isNullOrBlank() enum class CredentialKey { OPENAI_API_KEY, @@ -33,4 +33,4 @@ object CredentialsStore { YOU_ACCOUNT_PASSWORD, LLAMA_API_KEY } -} \ No newline at end of file +}