Support request messages in stateful mode
Stateful mode now supports request messages, which are sent within the
same thread as the Change Set. This eliminates the need to send message
history and improves the quality of ChatGPT responses.
Change-Id: I37c8e821ae5f72f4cf950d13123b8675301f172c
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
index f348a1a..840b957 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPrompt.java
@@ -6,6 +6,7 @@
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@@ -14,7 +15,7 @@
@Slf4j
public class ChatGptUserPrompt {
- private final ChatGptUserPromptBase chatGptUserPromptBase;
+ private final IChatGptUserPrompt chatGptUserPromptHandler;
public ChatGptUserPrompt(
Configuration config,
@@ -23,19 +24,20 @@
GerritClientData gerritClientData,
Localizer localizer
) {
- if (change.getIsCommentEvent()) {
- chatGptUserPromptBase = new ChatGptUserPromptRequests(config, changeSetData, gerritClientData, localizer);
- }
- else {
- chatGptUserPromptBase = new ChatGptUserPromptReview(config, changeSetData, gerritClientData, localizer);
- }
+ chatGptUserPromptHandler = ChatGptUserPromptFactory.getChatGptUserPrompt(
+ config,
+ changeSetData,
+ change,
+ gerritClientData,
+ localizer
+ );
}
public String buildPrompt() {
- for (int i = 0; i < chatGptUserPromptBase.getCommentProperties().size(); i++) {
- chatGptUserPromptBase.addMessageItem(i);
+ for (int i = 0; i < chatGptUserPromptHandler.getCommentProperties().size(); i++) {
+ chatGptUserPromptHandler.addMessageItem(i);
}
- List<ChatGptMessageItem> messageItems = chatGptUserPromptBase.getMessageItems();
+ List<ChatGptMessageItem> messageItems = chatGptUserPromptHandler.getMessageItems();
return messageItems.isEmpty() ? "" : getGson().toJson(messageItems);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
index 3a50f29..95b931b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptBase.java
@@ -10,6 +10,7 @@
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.CommentData;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@@ -18,7 +19,7 @@
import java.util.List;
@Slf4j
-public abstract class ChatGptUserPromptBase {
+public abstract class ChatGptUserPromptBase implements IChatGptUserPrompt {
protected final GerritClientData gerritClientData;
protected final HashMap<String, FileDiffProcessed> fileDiffsProcessed;
protected final CommentData commentData;
@@ -42,7 +43,7 @@
messageItems = new ArrayList<>();
}
- abstract void addMessageItem(int i);
+ public abstract void addMessageItem(int i);
protected ChatGptMessageItem getMessageItem(int i) {
ChatGptMessageItem messageItem = new ChatGptMessageItem();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptFactory.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptFactory.java
new file mode 100644
index 0000000..da4a1df
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptFactory.java
@@ -0,0 +1,37 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
+
+import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.prompt.ChatGptUserPromptRequestsStateful;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.prompt.ChatGptUserPromptRequestsStateless;
+import com.googlesource.gerrit.plugins.chatgpt.settings.Settings;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ChatGptUserPromptFactory {
+
+ public static IChatGptUserPrompt getChatGptUserPrompt(
+ Configuration config,
+ ChangeSetData changeSetData,
+ GerritChange change,
+ GerritClientData gerritClientData,
+ Localizer localizer
+ ) {
+ if (change.getIsCommentEvent()) {
+ if ((config.getGptMode() == Settings.MODES.stateless)) {
+ log.info("ChatGptUserPromptFactory: Returned ChatGptUserPromptRequestsStateless");
+ return new ChatGptUserPromptRequestsStateless(config, changeSetData, gerritClientData, localizer);
+ } else {
+ log.info("ChatGptUserPromptFactory: Returned ChatGptUserPromptRequestsStateful");
+ return new ChatGptUserPromptRequestsStateful(config, changeSetData, gerritClientData, localizer);
+ }
+ } else {
+ log.info("ChatGptUserPromptFactory: Returned ChatGptUserPromptReview");
+ return new ChatGptUserPromptReview(config, changeSetData, gerritClientData, localizer);
+ }
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
index 92d34d5..2a3b214 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptRequests.java
@@ -12,6 +12,9 @@
@Slf4j
public class ChatGptUserPromptRequests extends ChatGptUserPromptBase {
+ protected ChatGptMessageItem messageItem;
+ protected List<ChatGptRequestMessage> messageHistories;
+
public ChatGptUserPromptRequests(
Configuration config,
ChangeSetData changeSetData,
@@ -29,11 +32,10 @@
}
protected ChatGptMessageItem getMessageItem(int i) {
- ChatGptMessageItem messageItem = super.getMessageItem(i);
- List<ChatGptRequestMessage> messageHistories = gptMessageHistory.retrieveHistory(commentProperties.get(i));
+ messageItem = super.getMessageItem(i);
+ messageHistories = gptMessageHistory.retrieveHistory(commentProperties.get(i));
ChatGptRequestMessage request = messageHistories.remove(messageHistories.size() -1);
messageItem.setRequest(request.getContent());
- setHistories(messageItem, messageHistories);
return messageItem;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
index 6c4dc4d..f307e58 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptUserPromptReview.java
@@ -6,13 +6,14 @@
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
@Slf4j
-public class ChatGptUserPromptReview extends ChatGptUserPromptBase {
+public class ChatGptUserPromptReview extends ChatGptUserPromptBase implements IChatGptUserPrompt {
public ChatGptUserPromptReview(
Configuration config,
ChangeSetData changeSetData,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/prompt/IChatGptUserPrompt.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/prompt/IChatGptUserPrompt.java
new file mode 100644
index 0000000..8c7bb31
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/prompt/IChatGptUserPrompt.java
@@ -0,0 +1,12 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt;
+
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
+
+import java.util.List;
+
+public interface IChatGptUserPrompt {
+ void addMessageItem(int i);
+ List<GerritComment> getCommentProperties();
+ List<ChatGptMessageItem> getMessageItems();
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptClientStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptClientStateful.java
index 3594ca2..833c0ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptClientStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptClientStateful.java
@@ -29,7 +29,13 @@
String changeId = change.getFullChangeId();
log.info("Processing STATEFUL ChatGPT Request with changeId: {}, Patch Set: {}", changeId, patchSet);
- ChatGptThread chatGptThread = new ChatGptThread(config, change, patchSet, pluginDataHandlerProvider);
+ ChatGptThread chatGptThread = new ChatGptThread(
+ config,
+ changeSetData,
+ change,
+ patchSet,
+ pluginDataHandlerProvider
+ );
String threadId = chatGptThread.createThread();
chatGptThread.addMessage();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptThread.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptThread.java
index 11c98bf..6f9dd90 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptThread.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptThread.java
@@ -5,6 +5,7 @@
import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandlerProvider;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.UriResourceLocatorStateful;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.prompt.ChatGptPromptStateful;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt.*;
@@ -21,6 +22,7 @@
private final ChatGptHttpClient httpClient = new ChatGptHttpClient();
private final Configuration config;
+ private final ChangeSetData changeSetData;
private final GerritChange change;
private final String patchSet;
private final PluginDataHandler changeDataHandler;
@@ -30,11 +32,13 @@
public ChatGptThread(
Configuration config,
+ ChangeSetData changeSetData,
GerritChange change,
String patchSet,
PluginDataHandlerProvider pluginDataHandlerProvider
) {
this.config = config;
+ this.changeSetData = changeSetData;
this.change = change;
this.patchSet = patchSet;
this.changeDataHandler = pluginDataHandlerProvider.getChangeScope();
@@ -79,7 +83,7 @@
private Request addMessageRequest() {
URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateful.threadMessagesUri(threadId));
log.debug("ChatGPT Add Message request URI: {}", uri);
- ChatGptPromptStateful chatGptPromptStateful = new ChatGptPromptStateful(config, change);
+ ChatGptPromptStateful chatGptPromptStateful = new ChatGptPromptStateful(config, changeSetData, change);
addMessageRequestBody = ChatGptRequestMessage.builder()
.role("user")
.content(chatGptPromptStateful.getDefaultGptThreadReviewMessage(patchSet))
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
index 7b61318..8844427 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptPromptStateful.java
@@ -3,6 +3,7 @@
import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptPrompt;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import lombok.extern.slf4j.Slf4j;
@@ -15,6 +16,8 @@
private final GerritChange change;
+ private ChangeSetData changeSetData;
+
public ChatGptPromptStateful(Configuration config, GerritChange change) {
super(config);
this.change = change;
@@ -25,6 +28,11 @@
}
}
+ public ChatGptPromptStateful(Configuration config, ChangeSetData changeSetData, GerritChange change) {
+ this(config, change);
+ this.changeSetData = changeSetData;
+ }
+
public String getDefaultGptAssistantDescription() {
return String.format(DEFAULT_GPT_ASSISTANT_DESCRIPTION, change.getProjectName());
}
@@ -40,6 +48,18 @@
}
public String getDefaultGptThreadReviewMessage(String patchSet) {
- return String.format(DEFAULT_GPT_MESSAGE_REVIEW, patchSet);
+ String gptRequestUserPrompt = getGptRequestUserPrompt();
+ if (gptRequestUserPrompt != null && !gptRequestUserPrompt.isEmpty()) {
+ log.debug("Request User Prompt retrieved: {}", gptRequestUserPrompt);
+ return gptRequestUserPrompt;
+ }
+ else {
+ return String.format(DEFAULT_GPT_MESSAGE_REVIEW, patchSet);
+ }
+ }
+
+ private String getGptRequestUserPrompt() {
+ if (changeSetData == null || !isCommentEvent) return null;
+ return changeSetData.getGptRequestUserPrompt();
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptUserPromptRequestsStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptUserPromptRequestsStateful.java
new file mode 100644
index 0000000..ec5ea2b
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/prompt/ChatGptUserPromptRequestsStateful.java
@@ -0,0 +1,19 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.prompt;
+
+import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptUserPromptRequests;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
+
+public class ChatGptUserPromptRequestsStateful extends ChatGptUserPromptRequests implements IChatGptUserPrompt {
+ public ChatGptUserPromptRequestsStateful(
+ Configuration config,
+ ChangeSetData changeSetData,
+ GerritClientData gerritClientData,
+ Localizer localizer
+ ) {
+ super(config, changeSetData, gerritClientData, localizer);
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
index ec7f7fd..50dc7a9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptPromptStateless.java
@@ -54,7 +54,7 @@
String gptRequestUserPrompt = changeSetData.getGptRequestUserPrompt();
boolean isValidRequestUserPrompt = gptRequestUserPrompt != null && !gptRequestUserPrompt.isEmpty();
if (isCommentEvent && isValidRequestUserPrompt) {
- log.debug("ConfigsDynamically value found: {}", gptRequestUserPrompt);
+ log.debug("Request User Prompt retrieved: {}", gptRequestUserPrompt);
prompt.addAll(Arrays.asList(
DEFAULT_GPT_REQUEST_PROMPT_DIFF,
patchSet,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java
new file mode 100644
index 0000000..e792f11
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/prompt/ChatGptUserPromptRequestsStateless.java
@@ -0,0 +1,29 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.prompt;
+
+import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.localization.Localizer;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptUserPromptRequests;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.prompt.IChatGptUserPrompt;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class ChatGptUserPromptRequestsStateless extends ChatGptUserPromptRequests implements IChatGptUserPrompt {
+ public ChatGptUserPromptRequestsStateless(
+ Configuration config,
+ ChangeSetData changeSetData,
+ GerritClientData gerritClientData,
+ Localizer localizer
+ ) {
+ super(config, changeSetData, gerritClientData, localizer);
+ }
+
+ protected ChatGptMessageItem getMessageItem(int i) {
+ super.getMessageItem(i);
+ setHistories(messageItem, messageHistories);
+
+ return messageItem;
+ }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
index e6fbcda..73539e7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
@@ -7,7 +7,6 @@
import com.google.gerrit.extensions.common.DiffInfo;
import com.google.gerrit.extensions.restapi.BinaryResult;
import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gson.JsonObject;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptResponseContent;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.UriResourceLocatorStateful;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.prompt.ChatGptPromptStateful;
@@ -44,10 +43,8 @@
private static final String CHAT_GPT_RUN_ID = "run_TEST_RUN_ID";
private String formattedPatchContent;
- private String reviewMessageCode;
- private String reviewMessageCommitMessage;
private ChatGptPromptStateful chatGptPromptStateful;
- private JsonObject threadMessage;
+ private String requestContent;
public ChatGptReviewStatefulTest() {
MockitoAnnotations.openMocks(this);
@@ -151,41 +148,58 @@
protected void initComparisonContent() {
super.initComparisonContent();
- reviewMessageCode = getReviewMessage(0);
- reviewMessageCommitMessage = getReviewMessage(1);
+ promptTagComments = readTestFile("__files/stateful/chatGptPromptTagRequests.json");
}
protected ArgumentCaptor<ReviewInput> testRequestSent() throws RestApiException {
ArgumentCaptor<ReviewInput> reviewInputCaptor = super.testRequestSent();
- threadMessage = gptRequestBody.getAsJsonObject();
+ requestContent = gptRequestBody.getAsJsonObject().get("content").getAsString();
return reviewInputCaptor;
}
- private String getReviewMessage(int tollCallId) {
- ChatGptListResponse reviewResponse = getGson().fromJson(readTestFile(
- "__files/chatGptRunStepsResponse.json"
- ), ChatGptListResponse.class);
- String reviewJsonResponse = reviewResponse.getData().get(0).getStepDetails().getToolCalls().get(tollCallId)
+ private String getReviewMessage(String responseFile, int tollCallId) {
+ ChatGptListResponse responseContent = getGson().fromJson(readTestFile(responseFile), ChatGptListResponse.class);
+ String reviewJsonResponse = responseContent.getData().get(0).getStepDetails().getToolCalls().get(tollCallId)
.getFunction().getArguments();
return getGson().fromJson(reviewJsonResponse, ChatGptResponseContent.class).getReplies().get(0).getReply();
}
+ private String getCapturedMessage(ArgumentCaptor<ReviewInput> captor, String filename) {
+ return captor.getAllValues().get(0).comments.get(filename).get(0).message;
+ }
+
@Test
public void patchSetCreatedOrUpdated() throws Exception {
+ String reviewMessageCode = getReviewMessage( "__files/chatGptRunStepsResponse.json", 0);
+ String reviewMessageCommitMessage = getReviewMessage( "__files/chatGptRunStepsResponse.json", 1);
+
String reviewUserPrompt = chatGptPromptStateful.getDefaultGptThreadReviewMessage(formattedPatchContent);
handleEventBasedOnType(false);
ArgumentCaptor<ReviewInput> captor = testRequestSent();
- String userPrompt = threadMessage.get("content").getAsString();
- Assert.assertEquals(reviewUserPrompt, userPrompt);
- Assert.assertEquals(
- reviewMessageCode,
- captor.getAllValues().get(0).comments.get("test_file_1.py").get(0).message
- );
- Assert.assertEquals(
- reviewMessageCommitMessage,
- captor.getAllValues().get(0).comments.get(GERRIT_PATCH_SET_FILENAME).get(0).message
- );
+ Assert.assertEquals(reviewUserPrompt, requestContent);
+ Assert.assertEquals(reviewMessageCode, getCapturedMessage(captor, "test_file_1.py"));
+ Assert.assertEquals(reviewMessageCommitMessage, getCapturedMessage(captor, GERRIT_PATCH_SET_FILENAME));
+ }
+
+ @Test
+ public void gptMentionedInComment() throws RestApiException {
+ String reviewMessageCommitMessage = getReviewMessage("__files/chatGptResponseRequestStateful.json", 0);
+
+ chatGptPromptStateful.setCommentEvent(true);
+ // Mock the behavior of the ChatGPT retrieve-run-steps request
+ WireMock.stubFor(WireMock.get(WireMock.urlEqualTo(URI.create(config.getGptDomain()
+ + UriResourceLocatorStateful.runStepsUri(CHAT_GPT_THREAD_ID, CHAT_GPT_RUN_ID)).getPath()))
+ .willReturn(WireMock.aResponse()
+ .withStatus(HTTP_OK)
+ .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
+ .withBodyFile("chatGptResponseRequestStateful.json")));
+
+ handleEventBasedOnType(true);
+
+ ArgumentCaptor<ReviewInput> captor = testRequestSent();
+ Assert.assertEquals(promptTagComments, requestContent);
+ Assert.assertEquals(reviewMessageCommitMessage, getCapturedMessage(captor, GERRIT_PATCH_SET_FILENAME));
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
index b3f822f..a8b8ec2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
@@ -39,7 +39,6 @@
private ReviewInput expectedResponseStreamed;
private String expectedSystemPromptReview;
private String promptTagReview;
- private String promptTagComments;
private String diffContent;
private ReviewInput gerritPatchSetReview;
private JsonArray prompts;
@@ -179,7 +178,7 @@
.willReturn(WireMock.aResponse()
.withStatus(HTTP_OK)
.withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString())
- .withBodyFile("chatGptResponseRequests.json")));
+ .withBodyFile("chatGptResponseRequestStateless.json")));
handleEventBasedOnType(true);
int commentPropertiesSize = gerritClient.getClientData(getGerritChange()).getCommentProperties().size();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
index cfee169..ee6116f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -124,6 +124,7 @@
protected PatchSetReviewer patchSetReviewer;
protected ConfigCreator mockConfigCreator;
protected JsonObject gptRequestBody;
+ protected String promptTagComments;
@Before
public void before() throws RestApiException {
diff --git a/src/test/resources/__files/chatGptResponseRequestStateful.json b/src/test/resources/__files/chatGptResponseRequestStateful.json
new file mode 100644
index 0000000..b66217b
--- /dev/null
+++ b/src/test/resources/__files/chatGptResponseRequestStateful.json
@@ -0,0 +1,22 @@
+{
+ "object": "list",
+ "data": [
+ {
+ "id": "step_UKMPny6XSinQjSWOhSFleu1v",
+ "object": "thread.run.step",
+ "step_details": {
+ "type": "tool_calls",
+ "tool_calls": [
+ {
+ "id": "call_LYyZRTLRqSx2Bwn0QNWq1yYU",
+ "type": "function",
+ "function": {
+ "name": "format_replies",
+ "arguments": "{\n \"replies\": [\n {\n \"id\": 0,\n \"reply\": \"The commit message 'Corrected Indentation in Module-Class Retrieval Line' accurately represents the change made in the code.\"\n }\n ]\n }"
+ }
+ }
+ ]
+ }
+ }
+ ]
+}
diff --git a/src/test/resources/__files/chatGptResponseRequests.json b/src/test/resources/__files/chatGptResponseRequestStateless.json
similarity index 100%
rename from src/test/resources/__files/chatGptResponseRequests.json
rename to src/test/resources/__files/chatGptResponseRequestStateless.json
diff --git a/src/test/resources/__files/stateful/chatGptPromptTagRequests.json b/src/test/resources/__files/stateful/chatGptPromptTagRequests.json
new file mode 100644
index 0000000..4ab9486
--- /dev/null
+++ b/src/test/resources/__files/stateful/chatGptPromptTagRequests.json
@@ -0,0 +1 @@
+[{"request":"How about something like \"Corrected Indentation in Module-Class Retrieval Line\"?","id":0},{"request":"message","id":1},{"request":"message 2","id":2}]
\ No newline at end of file