Skip to content

Commit c3da76f

Browse files
committed
Clean up BaseChatToolWindowTabPanel code
1 parent bfd50b1 commit c3da76f

16 files changed

+448
-398
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ee.carlrobert.codegpt.completions;
22

33
import ee.carlrobert.codegpt.CodeGPTPlugin;
4+
import ee.carlrobert.codegpt.completions.you.YouUserManager;
45
import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
56
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
67
import ee.carlrobert.codegpt.settings.advanced.AdvancedSettingsState;
@@ -30,12 +31,22 @@ public static AzureClient getAzureClient() {
3031
return getAzureClientBuilder().build();
3132
}
3233

33-
public static YouClient getYouClient(String sessionId, String accessToken) {
34+
public static YouClient getYouClient() {
3435
var utmParameters = new UTMParameters();
3536
utmParameters.setSource("ide");
3637
utmParameters.setMedium("jetbrains");
3738
utmParameters.setCampaign(CodeGPTPlugin.getVersion());
3839
utmParameters.setContent("CodeGPT");
40+
41+
var sessionId = "";
42+
var accessToken = "";
43+
var youUserManager = YouUserManager.getInstance();
44+
if (youUserManager.isAuthenticated()) {
45+
var authenticationResponse = youUserManager.getAuthenticationResponse().getData();
46+
sessionId = authenticationResponse.getSession().getSessionId();
47+
accessToken = authenticationResponse.getSessionJwt();
48+
}
49+
3950
// FIXME
4051
return (YouClient) new YouClient.Builder(sessionId, accessToken)
4152
.setUTMParameters(utmParameters)

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

Lines changed: 23 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,34 @@
11
package ee.carlrobert.codegpt.completions;
22

33
import com.intellij.openapi.diagnostic.Logger;
4-
import ee.carlrobert.codegpt.completions.you.YouUserManager;
54
import ee.carlrobert.codegpt.conversations.Conversation;
65
import ee.carlrobert.codegpt.conversations.message.Message;
7-
import ee.carlrobert.codegpt.settings.service.ServiceType;
8-
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
9-
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
106
import ee.carlrobert.codegpt.settings.state.SettingsState;
117
import ee.carlrobert.codegpt.telemetry.TelemetryAction;
128
import ee.carlrobert.llm.client.openai.completion.ErrorDetails;
139
import ee.carlrobert.llm.client.you.completion.YouCompletionEventListener;
1410
import ee.carlrobert.llm.client.you.completion.YouSerpResult;
1511
import ee.carlrobert.llm.completion.CompletionEventListener;
1612
import java.util.List;
17-
import java.util.function.BiConsumer;
18-
import java.util.function.Consumer;
1913
import javax.swing.SwingWorker;
2014
import okhttp3.sse.EventSource;
2115
import org.jetbrains.annotations.NotNull;
22-
import org.jetbrains.annotations.Nullable;
2316

2417
public class CompletionRequestHandler {
2518

2619
private static final Logger LOG = Logger.getInstance(CompletionRequestHandler.class);
2720

2821
private final StringBuilder messageBuilder = new StringBuilder();
22+
private final boolean useContextualSearch;
23+
private final ToolWindowCompletionEventListener toolWindowCompletionEventListener;
2924
private SwingWorker<Void, String> swingWorker;
3025
private EventSource eventSource;
31-
private @Nullable Consumer<String> messageListener;
32-
private @Nullable BiConsumer<ErrorDetails, Throwable> errorListener;
33-
private @Nullable Consumer<String> completedListener;
34-
private @Nullable Consumer<List<YouSerpResult>> serpResultsListener;
35-
private @Nullable Runnable tokensExceededListener;
36-
private boolean useContextualSearch;
37-
38-
public CompletionRequestHandler withContextualSearch(boolean useContextualSearch) {
39-
this.useContextualSearch = useContextualSearch;
40-
return this;
41-
}
42-
43-
public void addMessageListener(Consumer<String> messageListener) {
44-
this.messageListener = messageListener;
45-
}
46-
47-
public void addErrorListener(BiConsumer<ErrorDetails, Throwable> errorListener) {
48-
this.errorListener = errorListener;
49-
}
50-
51-
public void addRequestCompletedListener(Consumer<String> completedListener) {
52-
this.completedListener = completedListener;
53-
}
54-
55-
public void addTokensExceededListener(Runnable tokensExceededListener) {
56-
this.tokensExceededListener = tokensExceededListener;
57-
}
5826

59-
public void addSerpResultsListener(Consumer<List<YouSerpResult>> serpResultsListener) {
60-
this.serpResultsListener = serpResultsListener;
27+
public CompletionRequestHandler(
28+
boolean useContextualSearch,
29+
ToolWindowCompletionEventListener toolWindowCompletionEventListener) {
30+
this.useContextualSearch = useContextualSearch;
31+
this.toolWindowCompletionEventListener = toolWindowCompletionEventListener;
6132
}
6233

6334
public void call(Conversation conversation, Message message, boolean isRetry) {
@@ -75,60 +46,13 @@ public void cancel() {
7546
private EventSource startCall(
7647
@NotNull Conversation conversation,
7748
@NotNull Message message,
78-
boolean isRetry,
49+
boolean retry,
7950
CompletionEventListener eventListener) {
80-
var settings = SettingsState.getInstance();
81-
var requestProvider = new CompletionRequestProvider(conversation);
82-
8351
try {
84-
if (settings.getSelectedService() == ServiceType.LLAMA_CPP) {
85-
return CompletionClientProvider.getLlamaClient()
86-
.getChatCompletion(requestProvider.buildLlamaCompletionRequest(message), eventListener);
87-
}
88-
89-
if (settings.getSelectedService() == ServiceType.YOU) {
90-
var sessionId = "";
91-
var accessToken = "";
92-
var youUserManager = YouUserManager.getInstance();
93-
if (youUserManager.isAuthenticated()) {
94-
var authenticationResponse =
95-
youUserManager.getAuthenticationResponse().getData();
96-
sessionId = authenticationResponse.getSession().getSessionId();
97-
accessToken = authenticationResponse.getSessionJwt();
98-
}
99-
var request = requestProvider.buildYouCompletionRequest(message);
100-
LOG.info("Initiating completion request using model: " +
101-
(request.isUseGPT4Model() ? "GPT-4" : "YouBot"));
102-
103-
return CompletionClientProvider.getYouClient(sessionId, accessToken)
104-
.getChatCompletion(request, eventListener);
105-
}
106-
107-
if (settings.getSelectedService() == ServiceType.AZURE) {
108-
var azureSettings = AzureSettingsState.getInstance();
109-
return CompletionClientProvider.getAzureClient().getChatCompletion(
110-
requestProvider.buildOpenAIChatCompletionRequest(
111-
azureSettings.getModel(),
112-
message,
113-
isRetry,
114-
useContextualSearch,
115-
azureSettings.isUsingCustomPath() ? azureSettings.getPath() : null),
116-
eventListener);
117-
}
118-
119-
var openAISettings = OpenAISettingsState.getInstance();
120-
return CompletionClientProvider.getOpenAIClient().getChatCompletion(
121-
requestProvider.buildOpenAIChatCompletionRequest(
122-
openAISettings.getModel(),
123-
message,
124-
isRetry,
125-
useContextualSearch,
126-
openAISettings.isUsingCustomPath() ? openAISettings.getPath() : null),
127-
eventListener);
52+
return CompletionRequestService.getInstance()
53+
.getChatCompletionAsync(conversation, message, retry, useContextualSearch, eventListener);
12854
} catch (Throwable t) {
129-
if (errorListener != null) {
130-
errorListener.accept(new ErrorDetails("Something went wrong"), t);
131-
}
55+
toolWindowCompletionEventListener.handleError(new ErrorDetails("Something went wrong"), t);
13256
throw t;
13357
}
13458
}
@@ -152,13 +76,9 @@ protected Void doInBackground() {
15276
conversation,
15377
message,
15478
isRetry,
155-
settings.getSelectedService() == ServiceType.YOU ?
156-
new YouRequestCompletionEventListener() :
157-
new BaseCompletionEventListener());
79+
new YouRequestCompletionEventListener());
15880
} catch (TotalUsageExceededException e) {
159-
if (tokensExceededListener != null) {
160-
tokensExceededListener.run();
161-
}
81+
toolWindowCompletionEventListener.handleTokensExceeded(conversation, message);
16282
} finally {
16383
sendInfo(settings);
16484
}
@@ -169,13 +89,16 @@ protected void process(List<String> chunks) {
16989
message.setResponse(messageBuilder.toString());
17090
for (String text : chunks) {
17191
messageBuilder.append(text);
172-
if (messageListener != null) {
173-
messageListener.accept(text);
174-
}
92+
toolWindowCompletionEventListener.handleMessage(text);
17593
}
17694
}
17795

178-
class BaseCompletionEventListener implements CompletionEventListener {
96+
class YouRequestCompletionEventListener implements YouCompletionEventListener {
97+
98+
@Override
99+
public void onSerpResults(List<YouSerpResult> results) {
100+
toolWindowCompletionEventListener.handleSerpResults(results, message);
101+
}
179102

180103
@Override
181104
public void onMessage(String message) {
@@ -184,34 +107,20 @@ public void onMessage(String message) {
184107

185108
@Override
186109
public void onComplete(StringBuilder messageBuilder) {
187-
if (completedListener != null) {
188-
completedListener.accept(messageBuilder.toString());
189-
}
110+
toolWindowCompletionEventListener.handleCompleted(messageBuilder.toString(), message,
111+
conversation, isRetry);
190112
}
191113

192114
@Override
193115
public void onError(ErrorDetails error, Throwable ex) {
194116
try {
195-
if (errorListener != null) {
196-
errorListener.accept(error, ex);
197-
}
117+
toolWindowCompletionEventListener.handleError(error, ex);
198118
} finally {
199119
sendError(error, ex);
200120
}
201121
}
202122
}
203123

204-
class YouRequestCompletionEventListener extends BaseCompletionEventListener
205-
implements YouCompletionEventListener {
206-
207-
@Override
208-
public void onSerpResults(List<YouSerpResult> results) {
209-
if (serpResultsListener != null) {
210-
serpResultsListener.accept(results);
211-
}
212-
}
213-
}
214-
215124
private void sendInfo(SettingsState settings) {
216125
TelemetryAction.COMPLETION.createActionMessage()
217126
.property("conversationId", conversation.getId().toString())
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package ee.carlrobert.codegpt.completions;
2+
3+
import com.intellij.openapi.application.ApplicationManager;
4+
import com.intellij.openapi.components.Service;
5+
import ee.carlrobert.codegpt.conversations.Conversation;
6+
import ee.carlrobert.codegpt.conversations.message.Message;
7+
import ee.carlrobert.codegpt.credentials.AzureCredentialsManager;
8+
import ee.carlrobert.codegpt.credentials.OpenAICredentialsManager;
9+
import ee.carlrobert.codegpt.settings.service.ServiceType;
10+
import ee.carlrobert.codegpt.settings.state.AzureSettingsState;
11+
import ee.carlrobert.codegpt.settings.state.OpenAISettingsState;
12+
import ee.carlrobert.codegpt.settings.state.SettingsState;
13+
import ee.carlrobert.llm.completion.CompletionEventListener;
14+
import okhttp3.sse.EventSource;
15+
import org.jetbrains.annotations.NotNull;
16+
17+
@Service
18+
public final class CompletionRequestService {
19+
20+
private CompletionRequestService() {
21+
}
22+
23+
public static CompletionRequestService getInstance() {
24+
return ApplicationManager.getApplication().getService(CompletionRequestService.class);
25+
}
26+
27+
public EventSource getChatCompletionAsync(
28+
@NotNull Conversation conversation,
29+
@NotNull Message message,
30+
boolean retry,
31+
boolean useContextualSearch,
32+
CompletionEventListener eventListener) {
33+
var requestProvider = new CompletionRequestProvider(conversation);
34+
switch (SettingsState.getInstance().getSelectedService()) {
35+
case OPENAI:
36+
var openAISettings = OpenAISettingsState.getInstance();
37+
return CompletionClientProvider.getOpenAIClient().getChatCompletion(
38+
requestProvider.buildOpenAIChatCompletionRequest(
39+
openAISettings.getModel(),
40+
message,
41+
retry,
42+
useContextualSearch,
43+
openAISettings.isUsingCustomPath() ? openAISettings.getPath() : null),
44+
eventListener);
45+
case AZURE:
46+
var azureSettings = AzureSettingsState.getInstance();
47+
return CompletionClientProvider.getAzureClient().getChatCompletion(
48+
requestProvider.buildOpenAIChatCompletionRequest(
49+
azureSettings.getModel(),
50+
message,
51+
retry,
52+
useContextualSearch,
53+
azureSettings.isUsingCustomPath() ? azureSettings.getPath() : null),
54+
eventListener);
55+
case YOU:
56+
return CompletionClientProvider.getYouClient().getChatCompletion(
57+
requestProvider.buildYouCompletionRequest(message),
58+
eventListener);
59+
case LLAMA_CPP:
60+
return CompletionClientProvider.getLlamaClient().getChatCompletion(
61+
requestProvider.buildLlamaCompletionRequest(message),
62+
eventListener);
63+
default:
64+
throw new IllegalArgumentException();
65+
}
66+
}
67+
68+
public boolean isRequestAllowed() {
69+
var selectedService = SettingsState.getInstance().getSelectedService();
70+
if (selectedService == ServiceType.AZURE) {
71+
return AzureCredentialsManager.getInstance().isCredentialSet();
72+
}
73+
if (selectedService == ServiceType.OPENAI) {
74+
return OpenAICredentialsManager.getInstance().isApiKeySet();
75+
}
76+
return true;
77+
}
78+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ee.carlrobert.codegpt.completions;
2+
3+
import ee.carlrobert.codegpt.conversations.Conversation;
4+
import ee.carlrobert.codegpt.conversations.message.Message;
5+
import ee.carlrobert.llm.client.openai.completion.ErrorDetails;
6+
import ee.carlrobert.llm.client.you.completion.YouSerpResult;
7+
import java.util.List;
8+
9+
public interface ToolWindowCompletionEventListener {
10+
11+
default void handleMessage(String message) {}
12+
13+
default void handleError(ErrorDetails error, Throwable ex) {}
14+
15+
default void handleTokensExceeded(Conversation conversation, Message message) {}
16+
17+
default void handleCompleted(
18+
String fullMessage,
19+
Message message,
20+
Conversation conversation,
21+
boolean isRetry) {}
22+
23+
default void handleSerpResults(List<YouSerpResult> results, Message message) {}
24+
}

src/main/java/ee/carlrobert/codegpt/conversations/message/Message.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import ee.carlrobert.codegpt.completions.you.YouSerpResult;
5+
import ee.carlrobert.llm.client.you.completion.YouSerpResult;
66
import java.util.List;
77
import java.util.Objects;
88
import java.util.UUID;

src/main/java/ee/carlrobert/codegpt/settings/service/YouServiceSelectionForm.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,10 @@ private boolean isValidEmail(String email) {
134134
}
135135

136136
private JTextPane createSignUpTextPane() {
137-
var textPane = createTextPane(
137+
var textPane = SwingUtils.createTextPane(
138138
"<html><a href=\"https://you.com/code\">Don't have an account? Sign up</a></html>");
139139
textPane.setBorder(JBUI.Borders.emptyLeft(4));
140-
return textPane;
141-
}
142-
143-
private JTextPane createTextPane(String htmlContent) {
144-
var textPane = SwingUtils.createTextPane(SwingUtils::handleHyperlinkClicked);
145-
textPane.setText(htmlContent);
140+
textPane.setOpaque(false);
146141
return textPane;
147142
}
148143

0 commit comments

Comments
 (0)