1.10.6 - Add support for both Azure auth methods

This commit is contained in:
Carl-Robert Linnupuu 2023-05-03 22:16:25 +01:00
parent 3a854c9f46
commit a514983ca3
7 changed files with 54 additions and 23 deletions

View file

@ -2,6 +2,8 @@ package ee.carlrobert.codegpt.client;
import ee.carlrobert.codegpt.state.settings.SettingsState;
import ee.carlrobert.codegpt.state.settings.advanced.AdvancedSettingsState;
import ee.carlrobert.openai.client.AzureClient;
import ee.carlrobert.openai.client.Client;
import ee.carlrobert.openai.client.OpenAIClient;
import ee.carlrobert.openai.client.ProxyAuthenticator;
import ee.carlrobert.openai.client.azure.AzureClientRequestParams;
@ -14,37 +16,41 @@ import java.util.concurrent.TimeUnit;
public class ClientProvider {
public static DashboardClient getDashboardClient() {
return getClientBuilder().buildDashboardClient();
return getOpenAIClientBuilder().buildDashboardClient();
}
public static CompletionClient getChatCompletionClient(SettingsState settings) {
if (settings.useAzureService) {
return getClientBuilder().buildAzureChatCompletionClient(getAzureRequestParams());
}
return getClientBuilder().buildChatCompletionClient();
return getClientBuilder(settings).buildChatCompletionClient();
}
public static CompletionClient getTextCompletionClient(SettingsState settings) {
if (settings.useAzureService) {
return getClientBuilder().buildAzureTextCompletionClient(getAzureRequestParams());
}
return getClientBuilder().buildTextCompletionClient();
return getClientBuilder(settings).buildTextCompletionClient();
}
private static AzureClientRequestParams getAzureRequestParams() {
var settings = SettingsState.getInstance();
return new AzureClientRequestParams(settings.resourceName, settings.deploymentId, settings.apiVersion);
private static Client.Builder getClientBuilder(SettingsState settings) {
return settings.useAzureService ? getAzureClientBuilder() : getOpenAIClientBuilder();
}
private static OpenAIClient.Builder getClientBuilder() {
private static OpenAIClient.Builder getOpenAIClientBuilder() {
var settings = SettingsState.getInstance();
var builder = new OpenAIClient.Builder(settings.apiKey) // TODO: ENV var?
.setConnectTimeout(60L, TimeUnit.SECONDS)
.setReadTimeout(30L, TimeUnit.SECONDS);
var builder = new OpenAIClient.Builder(settings.apiKey);
if (settings.useOpenAIService) {
builder.setOrganization(settings.organization);
}
return (OpenAIClient.Builder) addDefaultClientParams(builder);
}
private static AzureClient.Builder getAzureClientBuilder() {
var settings = SettingsState.getInstance();
var params = new AzureClientRequestParams(
settings.resourceName, settings.deploymentId, settings.apiVersion);
var builder = new AzureClient.Builder(settings.apiKey, params)
.setActiveDirectoryAuthentication(settings.useActiveDirectoryAuthentication);
return (AzureClient.Builder) addDefaultClientParams(builder);
}
private static Client.Builder addDefaultClientParams(Client.Builder builder) {
var advancedSettings = AdvancedSettingsState.getInstance();
var proxyHost = advancedSettings.proxyHost;
var proxyPort = advancedSettings.proxyPort;
@ -61,7 +67,9 @@ public class ClientProvider {
builder.setHost(advancedSettings.host);
}
return builder;
return builder
.setConnectTimeout(60L, TimeUnit.SECONDS)
.setReadTimeout(30L, TimeUnit.SECONDS);
}
}

View file

@ -24,13 +24,14 @@ import javax.swing.event.HyperlinkEvent;
public class SettingsComponent {
private final JPanel mainPanel;
private final JBTextField apiKeyField;
private final JBTextField organizationField;
private final JBTextField resourceNameField;
private final JBTextField deploymentIdField;
private final JBTextField apiVersionField;
private final JBTextField apiKeyField;
private final JBTextField organizationField;
private final JBTextField displayNameField;
private final JBCheckBox useOpenAIAccountNameCheckBox;
private final JBCheckBox useActiveDirectoryAuthenticationCheckBox;
private final JBRadioButton useAzureServiceRadioButton;
private final JBRadioButton useOpenAIServiceRadioButton;
private final ComboBox<CompletionModel> chatCompletionBaseModelComboBox;
@ -49,7 +50,10 @@ public class SettingsComponent {
apiVersionField = new JBTextField(settings.resourceName, 40);
organizationField = new JBTextField(settings.organization, 40);
displayNameField = new JBTextField(settings.displayName, 20);
useOpenAIAccountNameCheckBox = new JBCheckBox("Use OpenAI account name", true);
useOpenAIAccountNameCheckBox = new JBCheckBox(
"Use OpenAI account name", settings.useOpenAIAccountName);
useActiveDirectoryAuthenticationCheckBox = new JBCheckBox(
"Use Azure Active Directory authentication", settings.useActiveDirectoryAuthentication);
chatCompletionBaseModelComboBox = new BaseModelComboBox(
new ChatCompletionModel[]{
ChatCompletionModel.GPT_3_5,
@ -117,6 +121,14 @@ public class SettingsComponent {
useAzureServiceRadioButton.setSelected(selected);
}
public boolean isUseActiveDirectoryAuthentication() {
return useActiveDirectoryAuthenticationCheckBox.isSelected();
}
public void setUseActiveDirectoryAuthenticationSelected(boolean selected) {
useActiveDirectoryAuthenticationCheckBox.setSelected(selected);
}
public boolean isUseAzureService() {
return useAzureServiceRadioButton.isSelected();
}
@ -294,12 +306,16 @@ public class SettingsComponent {
.withComment(
"API version to be used for Azure OpenAI Service")
.createPanel();
var authFieldPanel = UI.PanelFactory.panel(useActiveDirectoryAuthenticationCheckBox)
.resizeX(false)
.createPanel();
azureRelatedFieldsPanel.setLayout(new BoxLayout(azureRelatedFieldsPanel, BoxLayout.Y_AXIS));
azureRelatedFieldsPanel.setBorder(JBUI.Borders.empty(8, 16, 0, 0));
azureRelatedFieldsPanel.add(resourceNameFieldPanel);
azureRelatedFieldsPanel.add(deploymentIdFieldPanel);
azureRelatedFieldsPanel.add(apiVersionFieldPanel);
azureRelatedFieldsPanel.add(authFieldPanel);
SwingUtils.setEqualLabelWidths(deploymentIdFieldPanel, resourceNameFieldPanel);
SwingUtils.setEqualLabelWidths(apiVersionFieldPanel, resourceNameFieldPanel);

View file

@ -39,6 +39,8 @@ public class SettingsConfigurable implements Configurable {
return !settingsComponent.getApiKey().equals(settings.apiKey) ||
settingsComponent.isUseOpenAIService() != settings.useOpenAIService ||
settingsComponent.isUseAzureService() != settings.useAzureService ||
settingsComponent.isUseActiveDirectoryAuthentication() !=
settings.useActiveDirectoryAuthentication ||
!settingsComponent.getResourceName().equals(settings.resourceName) ||
!settingsComponent.getDeploymentId().equals(settings.deploymentId) ||
!settingsComponent.getApiVersion().equals(settings.apiVersion) ||
@ -77,6 +79,7 @@ public class SettingsConfigurable implements Configurable {
settings.apiKey = settingsComponent.getApiKey();
settings.useOpenAIService = settingsComponent.isUseOpenAIService();
settings.useAzureService = settingsComponent.isUseAzureService();
settings.useActiveDirectoryAuthentication = settingsComponent.isUseActiveDirectoryAuthentication();
settings.resourceName = settingsComponent.getResourceName();
settings.deploymentId = settingsComponent.getDeploymentId();
settings.apiVersion = settingsComponent.getApiVersion();
@ -97,6 +100,8 @@ public class SettingsConfigurable implements Configurable {
settingsComponent.setApiKey(settings.apiKey);
settingsComponent.setUseOpenAIServiceSelected(settings.useAzureService);
settingsComponent.setUseAzureServiceSelected(settings.useAzureService);
settingsComponent.setUseActiveDirectoryAuthenticationSelected(
settings.useActiveDirectoryAuthentication);
settingsComponent.setResourceName(settings.resourceName);
settingsComponent.setDeploymentId(settings.deploymentId);
settingsComponent.setApiVersionField(settings.apiVersion);

View file

@ -24,6 +24,7 @@ public class SettingsState implements PersistentStateComponent<SettingsState> {
public String resourceName = "";
public String deploymentId = "";
public String apiVersion = "";
public boolean useActiveDirectoryAuthentication;
public String organization = "";
public String displayName = getDisplayName();
public boolean useOpenAIAccountName = true;