chore: include metadata in codegpt requests

This commit is contained in:
Carl-Robert Linnupuu 2024-10-09 11:56:22 +03:00
parent 30c255c5b5
commit 020e1aff7f
7 changed files with 136 additions and 64 deletions

View file

@ -4,10 +4,12 @@ import ee.carlrobert.codegpt.ReferencedFile;
import ee.carlrobert.codegpt.conversations.Conversation;
import ee.carlrobert.codegpt.conversations.message.Message;
import java.util.List;
import java.util.UUID;
import org.jetbrains.annotations.Nullable;
public class CallParameters {
private final UUID sessionId;
private final Conversation conversation;
private final ConversationType conversationType;
private final Message message;
@ -18,15 +20,22 @@ public class CallParameters {
private List<ReferencedFile> referencedFiles;
public CallParameters(Conversation conversation, Message message) {
this(conversation, ConversationType.DEFAULT, message, null, false);
this(null, conversation, message);
}
public CallParameters(UUID sessionId, Conversation conversation, Message message) {
this(sessionId, conversation, ConversationType.DEFAULT, message, null, false);
}
// TODO: Builder
public CallParameters(
UUID sessionId,
Conversation conversation,
ConversationType conversationType,
Message message,
@Nullable String highlightedText,
boolean retry) {
this.sessionId = sessionId;
this.conversation = conversation;
this.conversationType = conversationType;
this.message = message;
@ -34,6 +43,10 @@ public class CallParameters {
this.retry = retry;
}
public UUID getSessionId() {
return sessionId;
}
public Conversation getConversation() {
return conversation;
}

View file

@ -15,6 +15,7 @@ import ee.carlrobert.codegpt.settings.service.azure.AzureSettings;
import ee.carlrobert.codegpt.settings.service.google.GoogleSettings;
import ee.carlrobert.llm.client.DeserializationUtil;
import ee.carlrobert.llm.client.anthropic.completion.ClaudeCompletionRequest;
import ee.carlrobert.llm.client.codegpt.request.chat.ChatCompletionRequest;
import ee.carlrobert.llm.client.google.completion.GoogleCompletionRequest;
import ee.carlrobert.llm.client.llama.completion.LlamaCompletionRequest;
import ee.carlrobert.llm.client.ollama.completion.request.OllamaChatCompletionRequest;
@ -98,13 +99,6 @@ public final class CompletionRequestService {
CompletionEventListener<String> eventListener) {
if (request instanceof OpenAIChatCompletionRequest completionRequest) {
return switch (GeneralSettings.getSelectedService()) {
case CODEGPT -> {
if (List.of("o1-mini", "o1-preview").contains(completionRequest.getModel())) {
yield getO1ChatCompletionAsync(completionRequest, eventListener);
}
yield CompletionClientProvider.getCodeGPTClient()
.getChatCompletionAsync(completionRequest, eventListener);
}
case OPENAI -> {
if (List.of("o1-mini", "o1-preview").contains(completionRequest.getModel())) {
yield getO1ChatCompletionAsync(completionRequest, eventListener);
@ -117,6 +111,13 @@ public final class CompletionRequestService {
default -> throw new RuntimeException("Unknown service selected");
};
}
if (request instanceof ChatCompletionRequest completionRequest) {
if (List.of("o1-mini", "o1-preview").contains(completionRequest.getModel())) {
return getO1ChatCompletionAsync(completionRequest, eventListener);
}
return CompletionClientProvider.getCodeGPTClient()
.getChatCompletionAsync(completionRequest, eventListener);
}
if (request instanceof CustomOpenAIRequest completionRequest) {
return getCustomOpenAIChatCompletionAsync(completionRequest.getRequest(), eventListener);
}
@ -148,7 +149,7 @@ public final class CompletionRequestService {
}
private EventSource getO1ChatCompletionAsync(
OpenAIChatCompletionRequest request,
CompletionRequest request,
CompletionEventListener<String> eventListener) {
ProgressManager.getInstance()
.run(new Task.Backgroundable(null, "CodeGPT: Processing o1 request") {
@ -176,8 +177,6 @@ public final class CompletionRequestService {
public String getChatCompletion(CompletionRequest request) {
if (request instanceof OpenAIChatCompletionRequest completionRequest) {
var response = switch (GeneralSettings.getSelectedService()) {
case CODEGPT -> CompletionClientProvider.getCodeGPTClient()
.getChatCompletion(completionRequest);
case OPENAI -> CompletionClientProvider.getOpenAIClient()
.getChatCompletion(completionRequest);
case AZURE -> CompletionClientProvider.getAzureClient()
@ -186,6 +185,11 @@ public final class CompletionRequestService {
};
return tryExtractContent(response).orElseThrow();
}
if (request instanceof ChatCompletionRequest completionRequest) {
var response =
CompletionClientProvider.getCodeGPTClient().getChatCompletion(completionRequest);
return tryExtractContent(response).orElseThrow();
}
if (request instanceof CustomOpenAIRequest completionRequest) {
var httpClient = CompletionClientProvider.getDefaultClientBuilder().build();
try (var response = httpClient.newCall(completionRequest.getRequest()).execute()) {

View file

@ -0,0 +1,34 @@
package ee.carlrobert.codegpt.toolwindow.chat;
import ee.carlrobert.codegpt.ReferencedFile;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class ChatSession {
private final UUID id;
private final Set<ReferencedFile> referencedFiles;
public ChatSession() {
this.id = UUID.randomUUID();
this.referencedFiles = new HashSet<>();
}
public UUID getId() {
return id;
}
public List<ReferencedFile> getReferencedFiles() {
return new ArrayList<>(referencedFiles);
}
public void addReferencedFiles(List<ReferencedFile> files) {
if (files == null) {
throw new IllegalArgumentException("Referenced files cannot be null");
}
referencedFiles.addAll(files);
}
}

View file

@ -51,6 +51,8 @@ public class ChatToolWindowTabPanel implements Disposable {
private static final Logger LOG = Logger.getInstance(ChatToolWindowTabPanel.class);
private final ChatSession chatSession;
private final Project project;
private final JPanel rootPanel;
private final Conversation conversation;
@ -64,6 +66,7 @@ public class ChatToolWindowTabPanel implements Disposable {
public ChatToolWindowTabPanel(@NotNull Project project, @NotNull Conversation conversation) {
this.project = project;
this.conversation = conversation;
this.chatSession = new ChatSession();
conversationService = ConversationService.getInstance();
toolWindowScrollablePanel = new ChatToolWindowScrollablePanel();
totalTokensPanel = new TotalTokensPanel(
@ -165,8 +168,13 @@ public class ChatToolWindowTabPanel implements Disposable {
Message message,
@Nullable String highlightedText,
@Nullable String attachedFilePath) {
var callParameters = new CallParameters(conversation, conversationType, message,
highlightedText, false);
var callParameters = new CallParameters(
chatSession.getId(),
conversation,
conversationType,
message,
highlightedText,
false);
if (attachedFilePath != null && !attachedFilePath.isEmpty()) {
try {
callParameters.setImageData(Files.readAllBytes(Path.of(attachedFilePath)));
@ -227,7 +235,13 @@ public class ChatToolWindowTabPanel implements Disposable {
if (responsePanel != null) {
message.setResponse("");
conversationService.saveMessage(conversation, message);
call(new CallParameters(conversation, conversationType, message, null, true),
call(new CallParameters(
chatSession.getId(),
conversation,
conversationType,
message,
null,
true),
responsePanel);
}