Skip to content

Commit

Permalink
Encapsulate settings
Browse files Browse the repository at this point in the history
  • Loading branch information
carlrobertoh committed Aug 26, 2023
1 parent 9b1e29c commit c1556d6
Show file tree
Hide file tree
Showing 28 changed files with 510 additions and 276 deletions.
5 changes: 2 additions & 3 deletions src/main/java/ee/carlrobert/codegpt/EncodingManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.knuddels.jtokkit.Encodings;
import com.knuddels.jtokkit.api.Encoding;
import com.knuddels.jtokkit.api.EncodingRegistry;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.ModelSettingsState;
import ee.carlrobert.openai.client.completion.chat.request.ChatCompletionMessage;

@Service
Expand All @@ -15,8 +15,7 @@ public final class EncodingManager {
private Encoding encoding;

private EncodingManager() {
var settings = SettingsState.getInstance();
setEncoding(settings.isChatCompletionOptionSelected ? settings.chatCompletionBaseModel : settings.textCompletionBaseModel);
setEncoding(ModelSettingsState.getInstance().getCompletionModel());
}

public static EncodingManager getInstance() {
Expand Down
12 changes: 6 additions & 6 deletions src/main/java/ee/carlrobert/codegpt/PluginStartupActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import com.intellij.openapi.startup.StartupActivity;
import ee.carlrobert.codegpt.actions.editor.EditorActionsUtil;
import ee.carlrobert.codegpt.credentials.UserCredentialsManager;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.codegpt.user.UserManager;
import ee.carlrobert.codegpt.user.auth.AuthenticationHandler;
import ee.carlrobert.codegpt.user.auth.AuthenticationService;
Expand All @@ -34,7 +34,7 @@ public void runActivity(@NotNull Project project) {
var userManager = UserManager.getInstance();
var session = userManager.getSession();
if (session == null || session.isExpired()) {
handleAuthentication(project);
handleAuthentication();
} else {
startSessionVerificationJob();
}
Expand Down Expand Up @@ -76,16 +76,16 @@ private void startSessionVerificationJob() {
}
}

private void handleAuthentication(Project project) {
private void handleAuthentication() {
var settings = SettingsState.getInstance();
if (settings == null || !settings.previouslySignedIn) {
if (settings == null || !settings.isPreviouslySignedIn()) {
return;
}

var password = UserCredentialsManager.getInstance().getAccountPassword();
if (!settings.email.isEmpty() && password != null && !password.isEmpty()) {
if (!settings.getEmail().isEmpty() && password != null && !password.isEmpty()) {
AuthenticationService.getInstance()
.signInAsync(settings.email, password, new AuthenticationHandler() {
.signInAsync(settings.getEmail(), password, new AuthenticationHandler() {
@Override
public void handleAuthenticated() {
OverlayUtils.showNotification("Authentication successful.", NotificationType.INFORMATION);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.codegpt.settings.advanced.AdvancedSettingsState;
import ee.carlrobert.openai.client.AzureClient;
import ee.carlrobert.openai.client.Client;
Expand All @@ -18,14 +20,11 @@
public class CompletionClientProvider {

public static EmbeddingsClient getEmbeddingsClient() {
var settings = SettingsState.getInstance();

if (settings.useOpenAIService) {
var baseHost = SettingsState.getInstance().openAIBaseHost;
return ((OpenAIClient.Builder) getOpenAIClientBuilder().setHost(baseHost)).buildEmbeddingsClient();
if (SettingsState.getInstance().isUseOpenAIService()) {
return getOpenAIClientBuilder().buildEmbeddingsClient();
}

return null; // TODO
// TODO
return null;
}

public static CompletionClient getChatCompletionClient(SettingsState settings) {
Expand All @@ -38,31 +37,23 @@ public static CompletionClient getTextCompletionClient(SettingsState settings) {
}

public static Client.Builder getClientBuilder(SettingsState settings) {
return settings.useAzureService ?
getAzureClientBuilder().setHost(settings.azureBaseHost) :
getOpenAIClientBuilder().setHost(settings.openAIBaseHost);
return settings.isUseAzureService() ? getAzureClientBuilder() : getOpenAIClientBuilder();
}

private static OpenAIClient.Builder getOpenAIClientBuilder() {
var settings = SettingsState.getInstance();
var builder = new OpenAIClient.Builder(OpenAICredentialsManager.getInstance().getApiKey());

if (settings.useOpenAIService) {
builder.setOrganization(settings.openAIOrganization);
}

return (OpenAIClient.Builder) addDefaultClientParams(builder);
var settings = OpenAISettingsState.getInstance();
var builder = new OpenAIClient
.Builder(OpenAICredentialsManager.getInstance().getApiKey())
.setOrganization(settings.getOrganization());
return (OpenAIClient.Builder) addDefaultClientParams(builder).setHost(settings.getBaseHost());
}

private static AzureClient.Builder getAzureClientBuilder() {
var settings = SettingsState.getInstance();
var params = new AzureClientRequestParams(settings.azureResourceName, settings.azureDeploymentId, settings.azureApiVersion);
var azureCredentials = AzureCredentialsManager.getInstance();
var secret = settings.useAzureActiveDirectoryAuthentication ?
azureCredentials.getAzureActiveDirectoryToken() :
azureCredentials.getAzureOpenAIApiKey();
var builder = new AzureClient.Builder(secret, params).setActiveDirectoryAuthentication(settings.useAzureActiveDirectoryAuthentication);
return (AzureClient.Builder) addDefaultClientParams(builder);
var settings = AzureSettingsState.getInstance();
var params = new AzureClientRequestParams(settings.getResourceName(), settings.getDeploymentId(), settings.getApiVersion());
var builder = new AzureClient.Builder(AzureCredentialsManager.getInstance().getSecret(), params)
.setActiveDirectoryAuthentication(settings.isUseAzureActiveDirectoryAuthentication());
return (AzureClient.Builder) addDefaultClientParams(builder).setHost(settings.getBaseHost());
}

private static Client.Builder addDefaultClientParams(Client.Builder builder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import com.intellij.openapi.project.Project;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.ModelSettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.openai.client.completion.CompletionEventListener;
import ee.carlrobert.openai.client.completion.ErrorDetails;
import java.util.List;
Expand Down Expand Up @@ -109,13 +110,14 @@ private EventSource startCall(
boolean isRetry,
CompletionEventListener eventListener) {
var settings = SettingsState.getInstance();
var modelSettings = ModelSettingsState.getInstance();
var requestProvider = new CompletionRequestProvider(conversation);

if (settings.isChatCompletionOptionSelected) {
if (modelSettings.isUseChatCompletion()) {
return CompletionClientProvider.getChatCompletionClient(settings).stream(
requestProvider.buildChatCompletionRequest(settings.getChatCompletionModel(), message, isRetry, useContextualSearch), eventListener);
requestProvider.buildChatCompletionRequest(modelSettings.getChatCompletionModel(), message, isRetry, useContextualSearch), eventListener);
}
return CompletionClientProvider.getTextCompletionClient(settings).stream(
requestProvider.buildTextCompletionRequest(settings.getTextCompletionModel(), message, isRetry), eventListener);
requestProvider.buildTextCompletionRequest(modelSettings.getTextCompletionModel(), message, isRetry), eventListener);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import ee.carlrobert.codegpt.conversations.ConversationsState;
import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.embeddings.EmbeddingsService;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.codegpt.settings.configuration.ConfigurationState;
import ee.carlrobert.codegpt.util.FileUtils;
import ee.carlrobert.openai.client.completion.chat.ChatCompletionModel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import static java.util.stream.Collectors.toList;

import ee.carlrobert.codegpt.conversations.message.Message;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.ModelSettingsState;
import ee.carlrobert.openai.client.ClientCode;
import java.time.LocalDateTime;
import java.util.ArrayList;
Expand Down Expand Up @@ -38,13 +38,10 @@ public List<Conversation> getSortedConversations() {
}

public Conversation createConversation(ClientCode clientCode) {
var settings = SettingsState.getInstance();
var conversation = new Conversation();
conversation.setId(UUID.randomUUID());
conversation.setClientCode(clientCode);
conversation.setModel(settings.isChatCompletionOptionSelected ?
settings.getChatCompletionModel() :
settings.getTextCompletionModel());
conversation.setModel(ModelSettingsState.getInstance().getCompletionModel());
conversation.setCreatedOn(LocalDateTime.now());
conversation.setUpdatedOn(LocalDateTime.now());
return conversation;
Expand Down Expand Up @@ -111,8 +108,7 @@ public void saveConversation(Conversation conversation) {
}

public Conversation startConversation() {
var currentClientCode = SettingsState.getInstance().isChatCompletionOptionSelected ?
ClientCode.CHAT_COMPLETION : ClientCode.TEXT_COMPLETION;
var currentClientCode = ModelSettingsState.getInstance().isUseChatCompletion() ? ClientCode.CHAT_COMPLETION : ClientCode.TEXT_COMPLETION;
var conversation = createConversation(currentClientCode);
conversationState.setCurrentConversation(conversation);
addConversation(conversation);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ee.carlrobert.codegpt.credentials;

import com.intellij.credentialStore.CredentialAttributes;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
import org.jetbrains.annotations.Nullable;

public class AzureCredentialsManager {
Expand All @@ -27,6 +27,10 @@ public static AzureCredentialsManager getInstance() {
return instance;
}

public String getSecret() {
return AzureSettingsState.getInstance().isUseAzureActiveDirectoryAuthentication() ? azureActiveDirectoryToken : azureOpenAIApiKey;
}

public @Nullable String getAzureOpenAIApiKey() {
return azureOpenAIApiKey;
}
Expand All @@ -46,8 +50,7 @@ public void setAzureActiveDirectoryToken(String azureActiveDirectoryToken) {
}

public boolean isCredentialSet() {
var settings = SettingsState.getInstance();
if (settings.useAzureApiKeyAuthentication) {
if (AzureSettingsState.getInstance().isUseAzureApiKeyAuthentication()) {
return isKeySet();
}
return isTokenSet();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import ee.carlrobert.codegpt.embeddings.EmbeddingsService;
import ee.carlrobert.codegpt.embeddings.VectorStore;
import ee.carlrobert.codegpt.embeddings.CheckedFile;
import ee.carlrobert.codegpt.settings.SettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.codegpt.util.FileUtils;
import ee.carlrobert.codegpt.util.OverlayUtils;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.JBUI;
import ee.carlrobert.codegpt.CodeGPTBundle;
import ee.carlrobert.codegpt.settings.state.ModelSettingsState;
import ee.carlrobert.codegpt.util.SwingUtils;
import ee.carlrobert.openai.client.completion.CompletionModel;
import ee.carlrobert.openai.client.completion.chat.ChatCompletionModel;
Expand All @@ -27,25 +28,26 @@ public class ModelSelectionForm {
private final JPanel chatCompletionModelsPanel;
private final JPanel textCompletionModelsPanel;

private CompletionModel findChatCompletionModelOrGetDefault(SettingsState settings) {
private CompletionModel findChatCompletionModelOrGetDefault(ModelSettingsState settings) {
try {
return ChatCompletionModel.findByCode(settings.chatCompletionBaseModel);
return ChatCompletionModel.findByCode(settings.getChatCompletionModel());
} catch (NoSuchElementException e) {
LOG.warn("Couldn't find completion model with code: " + settings.chatCompletionBaseModel);
LOG.warn("Couldn't find completion model with code: " + settings.getChatCompletionModel());
return ChatCompletionModel.GPT_3_5;
}
}

private CompletionModel findTextCompletionModelOrGetDefault(SettingsState settings) {
private CompletionModel findTextCompletionModelOrGetDefault(ModelSettingsState settings) {
try {
return TextCompletionModel.findByCode(settings.textCompletionBaseModel);
return TextCompletionModel.findByCode(settings.getTextCompletionModel());
} catch (NoSuchElementException e) {
LOG.warn("Couldn't find completion model with code: " + settings.textCompletionBaseModel);
LOG.warn("Couldn't find completion model with code: " + settings.getTextCompletionModel());
return TextCompletionModel.DAVINCI;
}
}

public ModelSelectionForm(SettingsState settings) {
public ModelSelectionForm() {
var settings = ModelSettingsState.getInstance();
chatCompletionBaseModelComboBox = new BaseModelComboBox(
new ChatCompletionModel[] {
ChatCompletionModel.GPT_3_5,
Expand All @@ -69,10 +71,10 @@ public ModelSelectionForm(SettingsState settings) {
textCompletionModelsPanel.setBorder(JBUI.Borders.emptyLeft(16));
useChatCompletionRadioButton = new JBRadioButton(
CodeGPTBundle.get("settingsConfigurable.section.model.useChatCompletionRadioButtonLabel"),
settings.isChatCompletionOptionSelected);
settings.isUseChatCompletion());
useTextCompletionRadioButton = new JBRadioButton(
CodeGPTBundle.get("settingsConfigurable.section.model.useTextCompletionRadioButtonLabel"),
settings.isTextCompletionOptionSelected);
settings.isUseTextCompletion());

registerFields();
registerRadioButtons();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
import ee.carlrobert.codegpt.CodeGPTBundle;
import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import ee.carlrobert.codegpt.util.SwingUtils;
import java.util.Map;
import javax.swing.ButtonGroup;
Expand Down Expand Up @@ -38,6 +41,8 @@ public class ServiceSelectionForm {
private final JPanel azureServiceSectionPanel;

public ServiceSelectionForm(SettingsState settings) {
var openAISettings = OpenAISettingsState.getInstance();
var azureSettings = AzureSettingsState.getInstance();
openAIApiKey = new JBPasswordField();
openAIApiKey.setColumns(30);
openAIApiKey.setText(OpenAICredentialsManager.getInstance().getApiKey());
Expand All @@ -62,28 +67,28 @@ public ServiceSelectionForm(SettingsState settings) {

useAzureApiKeyAuthenticationRadioButton = new JBRadioButton(
"Use API Key authentication",
settings.useAzureApiKeyAuthentication);
azureSettings.isUseAzureApiKeyAuthentication());
useAzureActiveDirectoryAuthenticationRadioButton = new JBRadioButton(
"Use Active Directory authentication",
settings.useAzureActiveDirectoryAuthentication);
azureSettings.isUseAzureActiveDirectoryAuthentication());

useOpenAIServiceRadioButton = new JBRadioButton(
CodeGPTBundle.get("settingsConfigurable.section.service.useOpenAIServiceRadioButtonLabel"), settings.useOpenAIService);
CodeGPTBundle.get("settingsConfigurable.section.service.useOpenAIServiceRadioButtonLabel"), settings.isUseOpenAIService());
useAzureServiceRadioButton = new JBRadioButton(
CodeGPTBundle.get("settingsConfigurable.section.service.useAzureServiceRadioButtonLabel"), settings.useAzureService);
CodeGPTBundle.get("settingsConfigurable.section.service.useAzureServiceRadioButtonLabel"), settings.isUseAzureService());

openAIBaseHostField = new JBTextField(settings.openAIBaseHost, 30);
openAIOrganizationField = new JBTextField(settings.openAIOrganization, 30);
openAIBaseHostField = new JBTextField(openAISettings.getBaseHost(), 30);
openAIOrganizationField = new JBTextField(openAISettings.getOrganization(), 30);

azureBaseHostField = new JBTextField(settings.azureBaseHost, 30);
azureResourceNameField = new JBTextField(settings.azureResourceName, 30);
azureDeploymentIdField = new JBTextField(settings.azureDeploymentId, 30);
azureApiVersionField = new JBTextField(settings.azureApiVersion, 30);
azureBaseHostField = new JBTextField(azureSettings.getBaseHost(), 30);
azureResourceNameField = new JBTextField(azureSettings.getResourceName(), 30);
azureDeploymentIdField = new JBTextField(azureSettings.getDeploymentId(), 30);
azureApiVersionField = new JBTextField(azureSettings.getApiVersion(), 30);

openAIServiceSectionPanel = createOpenAIServiceSectionPanel();
azureServiceSectionPanel = createAzureServiceSectionPanel();

registerPanelsVisibility(settings);
registerPanelsVisibility(settings, azureSettings);
registerRadioButtons();
}

Expand Down Expand Up @@ -262,11 +267,11 @@ private JPanel createAzureServiceSectionPanel() {
return form;
}

private void registerPanelsVisibility(SettingsState settings) {
openAIServiceSectionPanel.setVisible(settings.useOpenAIService);
azureServiceSectionPanel.setVisible(settings.useAzureService);
azureApiKeyFieldPanel.setVisible(settings.useAzureApiKeyAuthentication);
azureActiveDirectoryTokenFieldPanel.setVisible(settings.useAzureActiveDirectoryAuthentication);
private void registerPanelsVisibility(SettingsState settings, AzureSettingsState azureSettings) {
openAIServiceSectionPanel.setVisible(settings.isUseOpenAIService());
azureServiceSectionPanel.setVisible(settings.isUseAzureService());
azureApiKeyFieldPanel.setVisible(azureSettings.isUseAzureApiKeyAuthentication());
azureActiveDirectoryTokenFieldPanel.setVisible(azureSettings.isUseAzureActiveDirectoryAuthentication());
}

private void registerRadioButtons() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.UI;
import ee.carlrobert.codegpt.CodeGPTBundle;
import ee.carlrobert.codegpt.settings.state.SettingsState;
import javax.swing.JComponent;
import javax.swing.JPanel;

Expand All @@ -18,10 +19,10 @@ public class SettingsComponent {
private final UserDetailsSettingsPanel userDetailsSettingsPanel;

public SettingsComponent(Disposable parentDisposable, SettingsState settings) {
modelSelectionForm = new ModelSelectionForm(settings);
modelSelectionForm = new ModelSelectionForm();
serviceSelectionForm = new ServiceSelectionForm(settings);

displayNameField = new JBTextField(settings.displayName, 20);
displayNameField = new JBTextField(settings.getDisplayName(), 20);

userDetailsSettingsPanel = new UserDetailsSettingsPanel(parentDisposable, settings);

Expand Down
Loading

0 comments on commit c1556d6

Please sign in to comment.