From c0c02d9afbf79dfe5e2a303deb18117a43698e52 Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Thu, 14 Mar 2024 14:39:48 +0200 Subject: [PATCH] refactor: remove custom Azure service configuration --- CHANGELOG.md | 4 ++ .../completions/CompletionClientProvider.java | 13 ++---- .../CompletionRequestProvider.java | 14 ++----- .../completions/CompletionRequestService.java | 40 ++++++------------- .../service/azure/AzureSettingsForm.java | 14 ------- .../service/azure/AzureSettingsState.java | 34 ++-------------- .../CompletionRequestProviderTest.java | 15 +++---- .../DefaultCompletionRequestHandlerTest.java | 40 ------------------- .../testsupport/mixin/ShortcutsTestMixin.java | 1 - 9 files changed, 31 insertions(+), 144 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87850c94..6ae98a6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Removed + +- Azure custom configuration (use OpenAI-compatible service to override the default configuration) + ## [2.5.1] - 2024-03-14 ### Added diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java index d2db4b2a..ef1ad528 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java @@ -1,7 +1,5 @@ package ee.carlrobert.codegpt.completions; -import static java.lang.String.format; - import ee.carlrobert.codegpt.CodeGPTPlugin; import ee.carlrobert.codegpt.completions.you.YouUserManager; import ee.carlrobert.codegpt.credentials.AnthropicCredentialsManager; @@ -47,14 +45,9 @@ public class CompletionClientProvider { settings.getResourceName(), settings.getDeploymentId(), settings.getApiVersion()); - var builder = new AzureClient - .Builder(AzureCredentialsManager.getInstance().getCredential(), params) - .setActiveDirectoryAuthentication(settings.isUseAzureActiveDirectoryAuthentication()); - var baseHost = settings.getBaseHost(); - if (baseHost != null) { - builder.setUrl(format(baseHost, params.getResourceName())); - } - return builder.build(getDefaultClientBuilder()); + return new AzureClient.Builder(AzureCredentialsManager.getInstance().getCredential(), params) + .setActiveDirectoryAuthentication(settings.isUseAzureActiveDirectoryAuthentication()) + .build(getDefaultClientBuilder()); } public static YouClient getYouClient() { diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java index 1454df16..c57d5ea1 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestProvider.java @@ -177,21 +177,13 @@ public class CompletionRequestProvider { public OpenAIChatCompletionRequest buildOpenAIChatCompletionRequest( @Nullable String model, - CallParameters callParameters, - @Nullable String overriddenPath) { + CallParameters callParameters) { var configuration = ConfigurationSettings.getCurrentState(); - var builder = new OpenAIChatCompletionRequest.Builder( - buildMessages(model, callParameters)) + return new OpenAIChatCompletionRequest.Builder(buildMessages(model, callParameters)) .setModel(model) .setMaxTokens(configuration.getMaxTokens()) .setStream(true) - .setTemperature(configuration.getTemperature()); - - if (overriddenPath != null) { - builder.setOverriddenPath(overriddenPath); - } - - return builder.build(); + .setTemperature(configuration.getTemperature()).build(); } public Request buildCustomOpenAIChatCompletionRequest( diff --git a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java index 14eed71e..04c015c2 100644 --- a/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java +++ b/src/main/java/ee/carlrobert/codegpt/completions/CompletionRequestService.java @@ -18,7 +18,6 @@ import ee.carlrobert.codegpt.credentials.OpenAICredentialManager; import ee.carlrobert.codegpt.settings.GeneralSettings; import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; import ee.carlrobert.codegpt.settings.service.anthropic.AnthropicSettings; -import ee.carlrobert.codegpt.settings.service.azure.AzureSettings; import ee.carlrobert.codegpt.settings.service.custom.CustomServiceSettings; import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings; import ee.carlrobert.codegpt.settings.service.openai.OpenAISettings; @@ -64,35 +63,22 @@ public final class CompletionRequestService { CompletionEventListener eventListener) { var requestProvider = new CompletionRequestProvider(callParameters.getConversation()); return switch (GeneralSettings.getCurrentState().getSelectedService()) { - case OPENAI -> { - var openAISettings = OpenAISettings.getCurrentState(); - yield CompletionClientProvider.getOpenAIClient().getChatCompletionAsync( - requestProvider.buildOpenAIChatCompletionRequest( - openAISettings.getModel(), - callParameters, - null), - eventListener); - } - case CUSTOM_OPENAI -> { - var customConfiguration = CustomServiceSettings.getCurrentState(); - yield getCustomOpenAIChatCompletionAsync( - requestProvider.buildCustomOpenAIChatCompletionRequest( - customConfiguration, - callParameters), - eventListener); - } + case OPENAI -> CompletionClientProvider.getOpenAIClient().getChatCompletionAsync( + requestProvider.buildOpenAIChatCompletionRequest( + OpenAISettings.getCurrentState().getModel(), + callParameters), + eventListener); + case CUSTOM_OPENAI -> getCustomOpenAIChatCompletionAsync( + requestProvider.buildCustomOpenAIChatCompletionRequest( + CustomServiceSettings.getCurrentState(), + callParameters), + eventListener); case ANTHROPIC -> CompletionClientProvider.getClaudeClient().getCompletionAsync( requestProvider.buildAnthropicChatCompletionRequest(callParameters), eventListener); - case AZURE -> { - var azureSettings = AzureSettings.getCurrentState(); - yield CompletionClientProvider.getAzureClient().getChatCompletionAsync( - requestProvider.buildOpenAIChatCompletionRequest( - null, - callParameters, - azureSettings.isUsingCustomPath() ? azureSettings.getPath() : null), - eventListener); - } + case AZURE -> CompletionClientProvider.getAzureClient().getChatCompletionAsync( + requestProvider.buildOpenAIChatCompletionRequest(null, callParameters), + eventListener); case YOU -> CompletionClientProvider.getYouClient().getChatCompletionAsync( requestProvider.buildYouCompletionRequest(callParameters.getMessage()), eventListener); diff --git a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsForm.java b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsForm.java index ede099ae..19a1d665 100644 --- a/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsForm.java +++ b/src/main/java/ee/carlrobert/codegpt/settings/service/azure/AzureSettingsForm.java @@ -24,8 +24,6 @@ public class AzureSettingsForm { private final JBRadioButton useAzureActiveDirectoryAuthenticationRadioButton; private final JBPasswordField azureActiveDirectoryTokenField; private final JPanel azureActiveDirectoryTokenFieldPanel; - private final JBTextField azureBaseHostField; - private final JBTextField azurePathField; private final JBTextField azureResourceNameField; private final JBTextField azureDeploymentIdField; private final JBTextField azureApiVersionField; @@ -52,8 +50,6 @@ public class AzureSettingsForm { .withLabel(CodeGPTBundle.get("settingsConfigurable.service.azure.bearerToken.label")) .resizeX(false) .createPanel(); - azureBaseHostField = new JBTextField(settings.getBaseHost(), 35); - azurePathField = new JBTextField(settings.getPath(), 35); azureResourceNameField = new JBTextField(settings.getResourceName(), 35); azureDeploymentIdField = new JBTextField(settings.getDeploymentId(), 35); azureApiVersionField = new JBTextField(settings.getApiVersion(), 35); @@ -95,12 +91,6 @@ public class AzureSettingsForm { .resizeX(false) .withComment(CodeGPTBundle.get( "settingsConfigurable.service.azure.apiVersion.comment"))) - .add(UI.PanelFactory.panel(azureBaseHostField) - .withLabel(CodeGPTBundle.get("settingsConfigurable.shared.baseHost.label")) - .resizeX(false)) - .add(UI.PanelFactory.panel(azurePathField) - .withLabel(CodeGPTBundle.get("settingsConfigurable.shared.path.label")) - .resizeX(false)) .createPanel()); return FormBuilder.createFormBuilder() @@ -122,8 +112,6 @@ public class AzureSettingsForm { state.setResourceName(azureResourceNameField.getText()); state.setDeploymentId(azureDeploymentIdField.getText()); state.setApiVersion(azureApiVersionField.getText()); - state.setBaseHost(azureBaseHostField.getText()); - state.setPath(azurePathField.getText()); return state; } @@ -138,8 +126,6 @@ public class AzureSettingsForm { azureResourceNameField.setText(state.getResourceName()); azureDeploymentIdField.setText(state.getDeploymentId()); azureApiVersionField.setText(state.getApiVersion()); - azureBaseHostField.setText(state.getBaseHost()); - azurePathField.setText(state.getPath()); } public @Nullable String getActiveDirectoryToken() { 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 956e50f5..dced9a5f 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,25 +1,15 @@ package ee.carlrobert.codegpt.settings.service.azure; -import com.intellij.util.xmlb.annotations.Transient; import java.util.Objects; public class AzureSettingsState { - private static final String BASE_PATH = "/openai/deployments/%s/chat/completions?api-version=%s"; - private String resourceName = ""; private String deploymentId = ""; private String apiVersion = ""; - private String baseHost = "https://%s.openai.azure.com"; - private String path = BASE_PATH; private boolean useAzureApiKeyAuthentication = true; private boolean useAzureActiveDirectoryAuthentication; - @Transient - public boolean isUsingCustomPath() { - return !BASE_PATH.equals(path); - } - public String getResourceName() { return resourceName; } @@ -44,22 +34,6 @@ public class AzureSettingsState { this.apiVersion = apiVersion; } - public String getBaseHost() { - return baseHost; - } - - public void setBaseHost(String baseHost) { - this.baseHost = baseHost; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - public boolean isUseAzureApiKeyAuthentication() { return useAzureApiKeyAuthentication; } @@ -90,14 +64,12 @@ public class AzureSettingsState { && useAzureActiveDirectoryAuthentication == that.useAzureActiveDirectoryAuthentication && Objects.equals(resourceName, that.resourceName) && Objects.equals(deploymentId, that.deploymentId) - && Objects.equals(apiVersion, that.apiVersion) - && Objects.equals(baseHost, that.baseHost) - && Objects.equals(path, that.path); + && Objects.equals(apiVersion, that.apiVersion); } @Override public int hashCode() { - return Objects.hash(resourceName, deploymentId, apiVersion, baseHost, path, - useAzureApiKeyAuthentication, useAzureActiveDirectoryAuthentication); + return Objects.hash(resourceName, deploymentId, apiVersion, useAzureApiKeyAuthentication, + useAzureActiveDirectoryAuthentication); } } diff --git a/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java b/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java index ccd2d7d8..e8f8dc1b 100644 --- a/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java +++ b/src/test/java/ee/carlrobert/codegpt/completions/CompletionRequestProviderTest.java @@ -29,8 +29,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { conversation, ConversationType.DEFAULT, new Message("TEST_CHAT_COMPLETION_PROMPT"), - false), - null); + false)); assertThat(request.getMessages()) .extracting("role", "content") @@ -57,8 +56,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { conversation, ConversationType.DEFAULT, new Message("TEST_CHAT_COMPLETION_PROMPT"), - false), - null); + false)); assertThat(request.getMessages()) .extracting("role", "content") @@ -86,8 +84,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { conversation, ConversationType.DEFAULT, secondMessage, - true), - null); + true)); assertThat(request.getMessages()) .extracting("role", "content") @@ -115,8 +112,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { conversation, ConversationType.DEFAULT, new Message("TEST_CHAT_COMPLETION_PROMPT"), - false), - null); + false)); assertThat(request.getMessages()) .extracting("role", "content") @@ -141,8 +137,7 @@ public class CompletionRequestProviderTest extends IntegrationTest { conversation, ConversationType.DEFAULT, createDummyMessage(100), - false), - null)); + false))); } private Message createDummyMessage(int tokenSize) { diff --git a/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java b/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java index bee9e647..5e1900d8 100644 --- a/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java +++ b/src/test/java/ee/carlrobert/codegpt/completions/DefaultCompletionRequestHandlerTest.java @@ -15,7 +15,6 @@ import ee.carlrobert.codegpt.CodeGPTPlugin; import ee.carlrobert.codegpt.conversations.ConversationService; import ee.carlrobert.codegpt.conversations.message.Message; import ee.carlrobert.codegpt.settings.configuration.ConfigurationSettings; -import ee.carlrobert.codegpt.settings.service.azure.AzureSettings; import ee.carlrobert.llm.client.http.exchange.StreamHttpExchange; import java.util.List; import java.util.Map; @@ -90,45 +89,6 @@ public class DefaultCompletionRequestHandlerTest extends IntegrationTest { await().atMost(5, SECONDS).until(() -> "Hello!".equals(message.getResponse())); } - public void testAzureChatCompletionCallWithCustomSettings() { - useAzureService(); - AzureSettings.getInstance() - .getState() - .setPath("/codegpt/deployments/%s/completions?api-version=%s"); - var conversationService = ConversationService.getInstance(); - var prevMessage = new Message("TEST_PREV_PROMPT"); - prevMessage.setResponse("TEST_PREV_RESPONSE"); - var conversation = conversationService.startConversation(); - conversation.addMessage(prevMessage); - conversationService.saveConversation(conversation); - expectAzure((StreamHttpExchange) request -> { - assertThat(request.getUri().getPath()) - .isEqualTo("/codegpt/deployments/TEST_DEPLOYMENT_ID/completions"); - assertThat(request.getUri().getQuery()).isEqualTo("api-version=TEST_API_VERSION"); - assertThat(request.getHeaders().get("Api-key").get(0)).isEqualTo("TEST_API_KEY"); - assertThat(request.getHeaders().get("X-llm-application-tag").get(0)).isEqualTo("codegpt"); - assertThat(request.getBody()) - .extracting("messages") - .isEqualTo( - List.of( - Map.of("role", "system", "content", COMPLETION_SYSTEM_PROMPT), - Map.of("role", "user", "content", "TEST_PREV_PROMPT"), - Map.of("role", "assistant", "content", "TEST_PREV_RESPONSE"), - Map.of("role", "user", "content", "TEST_PROMPT"))); - return List.of( - jsonMapResponse("choices", jsonArray(jsonMap("delta", jsonMap("role", "assistant")))), - jsonMapResponse("choices", jsonArray(jsonMap("delta", jsonMap("content", "Hel")))), - jsonMapResponse("choices", jsonArray(jsonMap("delta", jsonMap("content", "lo")))), - jsonMapResponse("choices", jsonArray(jsonMap("delta", jsonMap("content", "!"))))); - }); - var message = new Message("TEST_PROMPT"); - var requestHandler = new CompletionRequestHandler(getRequestEventListener(message)); - - requestHandler.call(new CallParameters(conversation, ConversationType.DEFAULT, message, false)); - - await().atMost(5, SECONDS).until(() -> "Hello!".equals(message.getResponse())); - } - public void testYouChatCompletionCall() { useYouService(); var message = new Message("TEST_PROMPT"); diff --git a/src/test/java/testsupport/mixin/ShortcutsTestMixin.java b/src/test/java/testsupport/mixin/ShortcutsTestMixin.java index 620f3c12..fd02bb73 100644 --- a/src/test/java/testsupport/mixin/ShortcutsTestMixin.java +++ b/src/test/java/testsupport/mixin/ShortcutsTestMixin.java @@ -20,7 +20,6 @@ public interface ShortcutsTestMixin { GeneralSettings.getCurrentState().setSelectedService(ServiceType.AZURE); AzureCredentialsManager.getInstance().setApiKey("TEST_API_KEY"); var azureSettings = AzureSettings.getCurrentState(); - azureSettings.setBaseHost(null); azureSettings.setResourceName("TEST_RESOURCE_NAME"); azureSettings.setApiVersion("TEST_API_VERSION"); azureSettings.setDeploymentId("TEST_DEPLOYMENT_ID");