Skip to content

Commit 3983b39

Browse files
borgottaborgotta
and
borgotta
authored
feat: custom base host support for anthropic provider (#948)
* Add support for custom baseHost for Anthropic provider #697 * Use intellij-provided socket factory and trust manager for default client --------- Co-authored-by: borgotta <paul.khattu@gmail.com>
1 parent 566a065 commit 3983b39

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

src/main/java/ee/carlrobert/codegpt/completions/CompletionClientProvider.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static ee.carlrobert.codegpt.credentials.CredentialsStore.getCredential;
44

55
import com.intellij.openapi.application.ApplicationManager;
6+
import com.intellij.util.net.ssl.CertificateManager;
67
import ee.carlrobert.codegpt.credentials.CredentialsStore.CredentialKey;
78
import ee.carlrobert.codegpt.settings.advanced.AdvancedSettings;
89
import ee.carlrobert.codegpt.settings.service.anthropic.AnthropicSettings;
@@ -21,6 +22,7 @@
2122
import java.net.InetSocketAddress;
2223
import java.net.Proxy;
2324
import java.util.concurrent.TimeUnit;
25+
import javax.net.ssl.X509TrustManager;
2426
import okhttp3.Credentials;
2527
import okhttp3.OkHttpClient;
2628

@@ -39,10 +41,12 @@ public static OpenAIClient getOpenAIClient() {
3941
}
4042

4143
public static ClaudeClient getClaudeClient() {
42-
return new ClaudeClient(
43-
getCredential(CredentialKey.AnthropicApiKey.INSTANCE),
44-
AnthropicSettings.getCurrentState().getApiVersion(),
45-
getDefaultClientBuilder());
44+
var builder = new ClaudeClient.Builder(getCredential(CredentialKey.AnthropicApiKey.INSTANCE),
45+
AnthropicSettings.getCurrentState().getApiVersion());
46+
if (AnthropicSettings.getCurrentState().hasCustomBaseHost()) {
47+
builder.setHost(AnthropicSettings.getCurrentState().getBaseHost());
48+
}
49+
return builder.build(getDefaultClientBuilder());
4650
}
4751

4852
public static AzureClient getAzureClient() {
@@ -96,6 +100,9 @@ public static GoogleClient getGoogleClient() {
96100

97101
public static OkHttpClient.Builder getDefaultClientBuilder() {
98102
OkHttpClient.Builder builder = new OkHttpClient.Builder();
103+
CertificateManager certificateManager = CertificateManager.getInstance();
104+
X509TrustManager trustManager = certificateManager.getTrustManager();
105+
builder.sslSocketFactory(certificateManager.getSslContext().getSocketFactory(), trustManager);
99106
var advancedSettings = AdvancedSettings.getCurrentState();
100107
var proxyHost = advancedSettings.getProxyHost();
101108
var proxyPort = advancedSettings.getProxyPort();

src/main/java/ee/carlrobert/codegpt/settings/service/anthropic/AnthropicSettingsForm.java

+8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class AnthropicSettingsForm {
1717
private final JBPasswordField apiKeyField;
1818
private final JBTextField apiVersionField;
1919
private final JBTextField modelField;
20+
private final JBTextField baseHostField;
2021

2122
public AnthropicSettingsForm(AnthropicSettingsState settings) {
2223
apiKeyField = new JBPasswordField();
@@ -29,6 +30,7 @@ public AnthropicSettingsForm(AnthropicSettingsState settings) {
2930
});
3031
apiVersionField = new JBTextField(settings.getApiVersion(), 35);
3132
modelField = new JBTextField(settings.getModel(), 35);
33+
baseHostField = new JBTextField(settings.getBaseHost(), 35);
3234
}
3335

3436
public JPanel getForm() {
@@ -51,6 +53,10 @@ public JPanel getForm() {
5153
.withComment(CodeGPTBundle.get(
5254
"settingsConfigurable.service.anthropic.model.comment"))
5355
.resizeX(false))
56+
.add(UI.PanelFactory.panel(baseHostField)
57+
.withLabel(CodeGPTBundle.get("settingsConfigurable.shared.baseHost.label"))
58+
.withComment("Optional: Custom API endpoint (e.g., https://api.anthropic.com)")
59+
.resizeX(false))
5460
.createPanel())
5561
.addComponentFillVertically(new JPanel(), 0)
5662
.getPanel();
@@ -60,6 +66,7 @@ public AnthropicSettingsState getCurrentState() {
6066
var state = new AnthropicSettingsState();
6167
state.setModel(modelField.getText());
6268
state.setApiVersion(apiVersionField.getText());
69+
state.setBaseHost(baseHostField.getText());
6370
return state;
6471
}
6572

@@ -70,6 +77,7 @@ public void resetForm() {
7077
);
7178
apiVersionField.setText(state.getApiVersion());
7279
modelField.setText(state.getModel());
80+
baseHostField.setText(state.getBaseHost());
7381
}
7482

7583
public @Nullable String getApiKey() {

src/main/java/ee/carlrobert/codegpt/settings/service/anthropic/AnthropicSettingsState.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public class AnthropicSettingsState {
66

77
private String apiVersion = "2023-06-01";
88
private String model = "claude-3-opus-20240229";
9+
private String baseHost = "";
910

1011
public String getApiVersion() {
1112
return apiVersion;
@@ -23,6 +24,18 @@ public void setModel(String model) {
2324
this.model = model;
2425
}
2526

27+
public String getBaseHost() {
28+
return baseHost;
29+
}
30+
31+
public void setBaseHost(String baseHost) {
32+
this.baseHost = baseHost;
33+
}
34+
35+
public boolean hasCustomBaseHost() {
36+
return baseHost != null && !baseHost.trim().isEmpty();
37+
}
38+
2639
@Override
2740
public boolean equals(Object o) {
2841
if (this == o) {
@@ -32,11 +45,13 @@ public boolean equals(Object o) {
3245
return false;
3346
}
3447
AnthropicSettingsState that = (AnthropicSettingsState) o;
35-
return Objects.equals(apiVersion, that.apiVersion) && Objects.equals(model, that.model);
48+
return Objects.equals(apiVersion, that.apiVersion)
49+
&& Objects.equals(model, that.model)
50+
&& Objects.equals(baseHost, that.baseHost);
3651
}
3752

3853
@Override
3954
public int hashCode() {
40-
return Objects.hash(apiVersion, model);
55+
return Objects.hash(apiVersion, model, baseHost);
4156
}
4257
}

0 commit comments

Comments
 (0)