11package ee .carlrobert .codegpt .completions ;
22
33import com .intellij .openapi .diagnostic .Logger ;
4- import ee .carlrobert .codegpt .completions .you .YouUserManager ;
54import ee .carlrobert .codegpt .conversations .Conversation ;
65import 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 ;
106import ee .carlrobert .codegpt .settings .state .SettingsState ;
117import ee .carlrobert .codegpt .telemetry .TelemetryAction ;
128import ee .carlrobert .llm .client .openai .completion .ErrorDetails ;
139import ee .carlrobert .llm .client .you .completion .YouCompletionEventListener ;
1410import ee .carlrobert .llm .client .you .completion .YouSerpResult ;
1511import ee .carlrobert .llm .completion .CompletionEventListener ;
1612import java .util .List ;
17- import java .util .function .BiConsumer ;
18- import java .util .function .Consumer ;
1913import javax .swing .SwingWorker ;
2014import okhttp3 .sse .EventSource ;
2115import org .jetbrains .annotations .NotNull ;
22- import org .jetbrains .annotations .Nullable ;
2316
2417public 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 ())
0 commit comments