Remove ChangeSetSingletonManager class

Instead of relying on the `ChangeSetSingletonManager` class, lean on the
Guice binding and injection.

This change only removes the singleton manager and propagate the
`ChangeSetData` manually via consturctors and method arguments. Later we
can refactor code to use Guice injections and simplify it this way.

Change-Id: Iacac3d620a00f7d1b6acb5151dc0db10ac4721f0
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
index d4baa7e..187d7c2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
@@ -32,6 +32,7 @@
 
     private final Configuration config;
     private final GerritClient gerritClient;
+    private final ChangeSetData changeSetData;
 
     @Getter
     private IChatGptClient chatGptClient;
@@ -41,9 +42,10 @@
     private List<Integer> reviewScores;
 
     @Inject
-    PatchSetReviewer(GerritClient gerritClient, Configuration config) {
+    PatchSetReviewer(GerritClient gerritClient, Configuration config, ChangeSetData changeSetData) {
         this.config = config;
         this.gerritClient = gerritClient;
+        this.changeSetData = changeSetData;
     }
 
     public void review(GerritChange change) throws Exception {
@@ -57,7 +59,7 @@
             log.info("No file to review has been found in the PatchSet");
             return;
         }
-        ChangeSetDataHandler.update(config, change, gerritClient);
+        ChangeSetDataHandler.update(config, change, gerritClient, changeSetData);
 
         String reviewReply = getReviewReply(change, patchSet);
         log.debug("ChatGPT response: {}", reviewReply);
@@ -96,7 +98,6 @@
 
     private void retrieveReviewBatches(String reviewReply, GerritChange change) {
         ChatGptResponseContent reviewJson = getGson().fromJson(reviewReply, ChatGptResponseContent.class);
-        ChangeSetData changeSetData = ChangeSetDataHandler.getInstance(change);
         for (ChatGptReplyItem replyItem : reviewJson.getReplies()) {
             String reply = replyItem.getReply();
             Integer score = replyItem.getScore();
@@ -134,7 +135,7 @@
                 "client.api.chatgpt.ChatGptClient", config);
         registerDynamicClasses(ChatGptClientStateless.class);
 
-        return chatGptClient.ask(config, change, patchSet);
+        return chatGptClient.ask(config, changeSetData, change, patchSet);
     }
 
     private Integer getReviewScore() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
index 9f953ce..8ae9ac8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
@@ -1,39 +1,26 @@
 package com.googlesource.gerrit.plugins.chatgpt.data;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.singleton.ChangeSetSingletonManager;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptUserPrompt;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.HashSet;
 
 @Slf4j
 public class ChangeSetDataHandler {
-
-    public static ChangeSetData getNewInstance(Configuration config, GerritChange change, Integer gptAccountId) {
-        return ChangeSetSingletonManager.getNewInstance(ChangeSetData.class, change,
-                gptAccountId,
-                config.getVotingMinScore(),
-                config.getVotingMaxScore());
-    }
-
-    public static ChangeSetData getInstance(GerritChange change) {
-        return ChangeSetSingletonManager.getInstance(ChangeSetData.class, change);
-    }
-
-    public static ChangeSetData getInstance(String changeId) {
-        return getInstance(new GerritChange(changeId));
-    }
-
-    public static void update(Configuration config, GerritChange change, GerritClient gerritClient) {
-        ChangeSetData changeSetData = getInstance(change);
+    public static void update(
+            Configuration config,
+            GerritChange change,
+            GerritClient gerritClient,
+            ChangeSetData changeSetData
+    ) {
         GerritClientData gerritClientData = gerritClient.getClientData(change);
-        ChatGptUserPrompt chatGptUserPrompt = new ChatGptUserPrompt(config, change, gerritClientData);
+        ChatGptUserPrompt chatGptUserPrompt = new ChatGptUserPrompt(config, changeSetData, change, gerritClientData);
 
         changeSetData.setCommentPropertiesSize(gerritClientData.getCommentProperties().size());
         changeSetData.setDirectives(new HashSet<>());
@@ -52,9 +39,4 @@
             }
         }
     }
-
-    public static void removeInstance(GerritChange change) {
-        ChangeSetSingletonManager.removeInstance(ChangeSetData.class, change);
-    }
-
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataProvider.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataProvider.java
new file mode 100644
index 0000000..6f3ac7c
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataProvider.java
@@ -0,0 +1,23 @@
+package com.googlesource.gerrit.plugins.chatgpt.data;
+
+import com.google.gerrit.server.account.AccountCache;
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+
+public class ChangeSetDataProvider implements Provider<ChangeSetData> {
+    private final int gptAccountId;
+    private final Configuration config;
+
+    @Inject
+    ChangeSetDataProvider(Configuration config, AccountCache accountCache) {
+        this.config = config;
+        this.gptAccountId = accountCache.getByUsername(config.getGerritUserName()).get().account().id().get();
+    }
+
+    @Override
+    public ChangeSetData get() {
+        return new ChangeSetData(gptAccountId, config.getVotingMinScore(), config.getVotingMaxScore());
+    }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java
deleted file mode 100644
index d5b6d30..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.data.singleton;
-
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
-
-public class ChangeSetSingletonManager {
-    public static synchronized <T> T getNewInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
-        return SingletonManager.getNewInstance(clazz, getInstanceKey(clazz, change), constructorArgs);
-    }
-
-    public static synchronized <T> T getInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
-        return SingletonManager.getInstance(clazz, getInstanceKey(clazz, change), constructorArgs);
-    }
-
-    public static synchronized void removeInstance(Class<?> clazz, GerritChange change) {
-        SingletonManager.removeInstance(clazz, getInstanceKey(clazz, change));
-    }
-
-    private static String getInstanceKey(Class<?> clazz, GerritChange change) {
-        return clazz.getName() + ":" + change.getFullChangeId();
-    }
-
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
index 229d396..885736f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
@@ -8,7 +8,6 @@
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.PatchSetReviewer;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.data.ProjectDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
@@ -39,6 +38,7 @@
     private final Configuration config;
     private final GerritClient gerritClient;
     private final GitRepoFiles gitRepoFiles;
+    private final ChangeSetData changeSetData;
     private final GerritChange change;
     private final PatchSetReviewer reviewer;
     private final PluginDataHandler pluginDataHandler;
@@ -46,12 +46,14 @@
     @Inject
     EventHandlerTask(
             Configuration config,
+            ChangeSetData changeSetData,
             GerritChange change,
             PatchSetReviewer reviewer,
             GerritClient gerritClient,
             GitRepoFiles gitRepoFiles,
             PluginDataHandler pluginDataHandler
     ) {
+        this.changeSetData = changeSetData;
         this.change = change;
         this.reviewer = reviewer;
         this.gerritClient = gerritClient;
@@ -67,13 +69,10 @@
 
     @VisibleForTesting
     public Result execute() {
-        Integer gptAccountId = gerritClient.getNotNullAccountId(change, config.getGerritUserName());
-        ChangeSetData changeSetData = ChangeSetDataHandler.getNewInstance(config, change, gptAccountId);
         GitRepoFilesHandler.createNewInstance(gitRepoFiles);
         ProjectDataHandler.createNewInstance(pluginDataHandler);
 
         if (!preProcessEvent(change, changeSetData)) {
-            destroy(change);
             return Result.NOT_SUPPORTED;
         }
 
@@ -87,8 +86,6 @@
                 Thread.currentThread().interrupt();
             }
             return Result.FAILURE;
-        } finally {
-            destroy(change);
         }
         return Result.OK;
     }
@@ -128,11 +125,6 @@
         return true;
     }
 
-    private void destroy(GerritChange change) {
-        log.info("destroying {}",change);
-        ChangeSetDataHandler.removeInstance(change);
-    }
-
     private boolean isReviewEnabled(GerritChange change) {
         List<String> enabledProjects = Splitter.on(",").omitEmptyStrings()
                 .splitToList(config.getEnabledProjects());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
index b25d564..9baa8ef 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
@@ -3,7 +3,11 @@
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.server.events.Event;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataProvider;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+
+import static com.google.inject.Scopes.SINGLETON;
 
 public class GerritEventContextModule extends FactoryModule {
     private final Event event;
@@ -18,5 +22,6 @@
     protected void configure() {
         bind(Configuration.class).toInstance(config);
         bind(GerritChange.class).toInstance(new GerritChange(event));
+        bind(ChangeSetData.class).toProvider(ChangeSetDataProvider.class).in(SINGLETON);
     }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
index dedd320..e5b8548 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
@@ -47,7 +47,7 @@
         return gerritClientFacade.getFileDiffsProcessed();
     }
 
-    public Integer getNotNullAccountId(GerritChange change, String authorUsername) {
+    public Integer getNotNullAccountId(String authorUsername) {
         return gerritClientFacade.getNotNullAccountId(authorUsername);
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
index cecebbb..9729c4a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientComments.java
@@ -6,6 +6,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.messages.ClientMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.CommentData;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
@@ -22,6 +23,7 @@
 public class GerritClientComments extends GerritClientAccount {
     private static final Integer MAX_SECS_GAP_BETWEEN_EVENT_AND_COMMENT = 2;
 
+    private final ChangeSetData changeSetData;
     private final HashMap<String, GerritComment> commentMap;
     private final HashMap<String, GerritComment> patchSetCommentMap;
 
@@ -29,8 +31,9 @@
     @Getter
     private List<GerritComment> commentProperties;
 
-    public GerritClientComments(Configuration config) {
+    public GerritClientComments(Configuration config, ChangeSetData changeSetData) {
         super(config);
+        this.changeSetData = changeSetData;
         commentProperties = new ArrayList<>();
         commentMap = new HashMap<>();
         patchSetCommentMap = new HashMap<>();
@@ -104,7 +107,7 @@
     }
 
     private void addLastComments(GerritChange change) {
-        ClientMessage clientMessage = new ClientMessage(config, change);
+        ClientMessage clientMessage = new ClientMessage(config, changeSetData, change);
         try {
             List<GerritComment> latestComments = retrieveComments(change);
             if (latestComments == null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientDetail.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientDetail.java
index 03bc163..f67c82a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientDetail.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientDetail.java
@@ -1,11 +1,11 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPatchSetDetail;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import lombok.extern.slf4j.Slf4j;
 
 import java.net.URI;
@@ -16,9 +16,11 @@
 @Slf4j
 public class GerritClientDetail extends GerritClientBase {
     private GerritPatchSetDetail gerritPatchSetDetail;
+    private final int gptAccountId;
 
-    public GerritClientDetail(Configuration config) {
+    public GerritClientDetail(Configuration config, ChangeSetData changeSetData) {
         super(config);
+        this.gptAccountId = changeSetData.getGptAccountId();
     }
 
     public List<GerritComment> getMessages(GerritChange change) {
@@ -32,7 +34,6 @@
     }
 
     public GerritPermittedVotingRange getPermittedVotingRange(GerritChange change) {
-        int gptAccountId = ChangeSetDataHandler.getInstance(change).getGptAccountId();
         loadPatchSetDetail(change);
         List<GerritPatchSetDetail.Permission> permissions = gerritPatchSetDetail.getLabels().getCodeReview().getAll();
         if (permissions == null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
index 0c253c1..0da1a4e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
@@ -5,6 +5,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.ModeClassLoader;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
+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.stateless.client.api.gerrit.GerritClientPatchSetStateless;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.gerrit.GerritClientPatchSetStateful;
@@ -17,17 +18,19 @@
 
 @Slf4j
 public class GerritClientFacade {
+    private final ChangeSetData changeSetData;
     private final GerritClientDetail gerritClientDetail;
     private final IGerritClientPatchSet gerritClientPatchSet;
     private final GerritClientComments gerritClientComments;
 
     @Inject
-    public GerritClientFacade(Configuration config) {
-        gerritClientDetail = new GerritClientDetail(config);
+    public GerritClientFacade(Configuration config, ChangeSetData changeSetData) {
+        gerritClientDetail = new GerritClientDetail(config, changeSetData);
         gerritClientPatchSet = (IGerritClientPatchSet) ModeClassLoader.getInstance(
                 "client.api.gerrit.GerritClientPatchSet", config, config);
+        this.changeSetData = changeSetData;
         registerDynamicClasses(GerritClientPatchSetStateless.class, GerritClientPatchSetStateful.class);
-        gerritClientComments = new GerritClientComments(config);
+        gerritClientComments = new GerritClientComments(config, changeSetData);
     }
 
     public GerritPermittedVotingRange getPermittedVotingRange(GerritChange change) {
@@ -35,7 +38,7 @@
     }
 
     public String getPatchSet(GerritChange change) throws Exception {
-        return gerritClientPatchSet.getPatchSet(change);
+        return gerritClientPatchSet.getPatchSet(changeSetData, change);
     }
 
     public boolean isDisabledUser(String authorUsername) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientPatchSet.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientPatchSet.java
index a30bc85..bbb8bfc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientPatchSet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientPatchSet.java
@@ -4,6 +4,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
@@ -34,12 +35,12 @@
         }
     }
 
-    protected int getChangeSetRevisionBase(GerritChange change) {
-        return isChangeSetBased(change) ? 0 : revisionBase;
+    protected int getChangeSetRevisionBase(ChangeSetData changeSetData) {
+        return isChangeSetBased(changeSetData) ? 0 : revisionBase;
     }
 
-    private boolean isChangeSetBased(GerritChange change) {
-        return !ChangeSetDataHandler.getInstance(change).getForcedReviewLastPatchSet();
+    private boolean isChangeSetBased(ChangeSetData changeSetData) {
+        return !changeSetData.getForcedReviewLastPatchSet();
     }
 
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
index baf4373..43edc62 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/commands/ClientCommands.java
@@ -52,9 +52,9 @@
     @Getter
     private boolean containingHistoryCommand;
 
-    public ClientCommands(GerritChange change) {
-        changeSetData = ChangeSetDataHandler.getInstance(change);
-        directives = new Directives(change);
+    public ClientCommands(ChangeSetData changeSetData, GerritChange change) {
+        this.changeSetData = changeSetData;
+        directives = new Directives(changeSetData);
         containingHistoryCommand = false;
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
index a3b0bfc..8e3a0bf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/messages/ClientMessage.java
@@ -4,6 +4,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.commands.ClientCommands;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 
@@ -21,14 +22,14 @@
     @Getter
     private String message;
 
-    public ClientMessage(Configuration config, GerritChange change) {
+    public ClientMessage(Configuration config, ChangeSetData changeSetData, GerritChange change) {
         super(config);
         botMentionPattern = getBotMentionPattern();
-        clientCommands = new ClientCommands(change);
+        clientCommands = new ClientCommands(changeSetData, change);
     }
 
-    public ClientMessage(Configuration config, GerritChange change, String message) {
-        this(config, change);
+    public ClientMessage(Configuration config, ChangeSetData changeSetData, GerritChange change, String message) {
+        this(config, changeSetData, change);
         this.message = message;
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
index ea7ef6e..59e9a89 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptComment.java
@@ -6,23 +6,24 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.messages.ClientMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import lombok.extern.slf4j.Slf4j;
 
 @Slf4j
 public class ChatGptComment extends ClientBase {
     protected ClientMessage commentMessage;
 
-    private final Integer gptAccountId;
     private final GerritChange change;
+    private final ChangeSetData changeSetData;
 
-    public ChatGptComment(Configuration config, GerritChange change) {
+    public ChatGptComment(Configuration config, ChangeSetData changeSetData, GerritChange change) {
         super(config);
         this.change = change;
-        gptAccountId = ChangeSetDataHandler.getInstance(change).getGptAccountId();
+        this.changeSetData = changeSetData;
     }
 
     protected String getCleanedMessage(GerritComment commentProperty) {
-        commentMessage = new ClientMessage(config, change, commentProperty.getMessage());
+        commentMessage = new ClientMessage(config, changeSetData, change, commentProperty.getMessage());
         if (isFromAssistant(commentProperty)) {
             commentMessage.removeDebugMessages();
         }
@@ -33,7 +34,7 @@
     }
 
     protected boolean isFromAssistant(GerritComment commentProperty) {
-        return commentProperty.getAuthor().getAccountId() == gptAccountId;
+        return commentProperty.getAuthor().getAccountId() == changeSetData.getGptAccountId();
     }
 
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
index b5eb5ec..b2b50e3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/ChatGptHistory.java
@@ -4,6 +4,7 @@
 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.api.gerrit.GerritComment;
+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.settings.Settings;
@@ -30,8 +31,8 @@
 
     private boolean filterActive;
 
-    public ChatGptHistory(Configuration config, GerritChange change, GerritClientData gerritClientData) {
-        super(config, change);
+    public ChatGptHistory(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
+        super(config, changeSetData, change);
         CommentData commentData = gerritClientData.getCommentData();
         commentMap = commentData.getCommentMap();
         patchSetCommentMap = commentData.getPatchSetCommentMap();
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 244899c..5a4b3aa 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
@@ -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.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 lombok.extern.slf4j.Slf4j;
 
@@ -14,12 +15,12 @@
 public class ChatGptUserPrompt {
     private final ChatGptUserPromptBase chatGptUserPromptBase;
 
-    public ChatGptUserPrompt(Configuration config, GerritChange change, GerritClientData gerritClientData) {
+    public ChatGptUserPrompt(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
         if (change.getIsCommentEvent()) {
-            chatGptUserPromptBase = new ChatGptUserPromptRequests(config, change, gerritClientData);
+            chatGptUserPromptBase = new ChatGptUserPromptRequests(config, changeSetData, change, gerritClientData);
         }
         else {
-            chatGptUserPromptBase = new ChatGptUserPromptReview(config, change, gerritClientData);
+            chatGptUserPromptBase = new ChatGptUserPromptReview(config, changeSetData, change, gerritClientData);
         }
     }
 
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 6c273a8..78482dc 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
@@ -7,6 +7,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptRequestMessage;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritComment;
+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 lombok.Getter;
@@ -28,11 +29,11 @@
     @Getter
     protected List<GerritComment> commentProperties;
 
-    public ChatGptUserPromptBase(Configuration config, GerritChange change, GerritClientData gerritClientData) {
+    public ChatGptUserPromptBase(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
         this.gerritClientData = gerritClientData;
         fileDiffsProcessed = gerritClientData.getFileDiffsProcessed();
         commentData = gerritClientData.getCommentData();
-        gptMessageHistory = new ChatGptHistory(config, change, gerritClientData);
+        gptMessageHistory = new ChatGptHistory(config, changeSetData, change, gerritClientData);
         messageItems = new ArrayList<>();
     }
 
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 2b4fdf1..1cde7c5 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
@@ -4,6 +4,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 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 lombok.extern.slf4j.Slf4j;
 
@@ -11,8 +12,8 @@
 
 @Slf4j
 public class ChatGptUserPromptRequests extends ChatGptUserPromptBase {
-    public ChatGptUserPromptRequests(Configuration config, GerritChange change, GerritClientData gerritClientData) {
-        super(config, change, gerritClientData);
+    public ChatGptUserPromptRequests(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
+        super(config, changeSetData, change, gerritClientData);
         commentProperties = commentData.getCommentProperties();
     }
 
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 0baea6c..7c87b63 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
@@ -4,6 +4,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptMessageItem;
 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 lombok.extern.slf4j.Slf4j;
 
@@ -12,8 +13,8 @@
 
 @Slf4j
 public class ChatGptUserPromptReview extends ChatGptUserPromptBase {
-    public ChatGptUserPromptReview(Configuration config, GerritChange change, GerritClientData gerritClientData) {
-        super(config, change, gerritClientData);
+    public ChatGptUserPromptReview(Configuration config, ChangeSetData changeSetData, GerritChange change, GerritClientData gerritClientData) {
+        super(config, changeSetData, change, gerritClientData);
         commentProperties = new ArrayList<>(commentData.getCommentMap().values());
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/Directives.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/Directives.java
index 6abcfd4..a714013 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/Directives.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/prompt/Directives.java
@@ -1,15 +1,13 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt;
 
-import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 
 public class Directives {
     private final ChangeSetData changeSetData;
     private String directive;
 
-    public Directives(GerritChange change) {
-        changeSetData = ChangeSetDataHandler.getInstance(change);
+    public Directives(ChangeSetData changeSetData) {
+        this.changeSetData = changeSetData;
     }
 
     public void addDirective(String directive) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/chatgpt/IChatGptClient.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/chatgpt/IChatGptClient.java
index 4c307ed..c13e410 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/chatgpt/IChatGptClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/chatgpt/IChatGptClient.java
@@ -2,9 +2,10 @@
 
 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.model.data.ChangeSetData;
 
 public interface IChatGptClient {
-    String ask(Configuration config, String changeId, String patchSet) throws Exception;
-    String ask(Configuration config, GerritChange change, String patchSet) throws Exception;
+    String ask(Configuration config, ChangeSetData changeSetData, String changeId, String patchSet) throws Exception;
+    String ask(Configuration config, ChangeSetData changeSetData, GerritChange change, String patchSet) throws Exception;
     String getRequestBody();
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/gerrit/IGerritClientPatchSet.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/gerrit/IGerritClientPatchSet.java
index 38dfc60..829b66c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/gerrit/IGerritClientPatchSet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/interfaces/client/api/gerrit/IGerritClientPatchSet.java
@@ -2,11 +2,12 @@
 
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 
 import java.util.HashMap;
 
 public interface IGerritClientPatchSet {
-    String getPatchSet(GerritChange change) throws Exception;
+    String getPatchSet(ChangeSetData changeSetData, GerritChange gerritChange) throws Exception;
     boolean isDisabledUser(String authorUsername);
     boolean isDisabledTopic(String topic);
     void retrieveRevisionBase(GerritChange change);
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 9e72e98..f409fb5 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
@@ -3,6 +3,7 @@
 import com.google.inject.Singleton;
 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.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.chatgpt.IChatGptClient;
 import lombok.extern.slf4j.Slf4j;
 
@@ -10,13 +11,13 @@
 @Singleton
 public class ChatGptClientStateful implements IChatGptClient {
     @Override
-    public String ask(Configuration config, String changeId, String patchSet) throws Exception {
+    public String ask(Configuration config, ChangeSetData changeSetData, String changeId, String patchSet) throws Exception {
         // Placeholder implementation, change to actual logic later.
         throw new UnsupportedOperationException("Method not implemented yet.");
     }
 
     @Override
-    public String ask(Configuration config, GerritChange change, String patchSet) throws Exception {
+    public String ask(Configuration config, ChangeSetData changeSetData, GerritChange change, String patchSet) throws Exception {
         // Placeholder implementation, change to actual logic later.
         throw new UnsupportedOperationException("Method not implemented yet.");
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
index 1336685..e563337 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
@@ -1,6 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.gerrit;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptAssistant;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientPatchSet;
@@ -14,7 +15,7 @@
         super(config);
     }
 
-    public String getPatchSet(GerritChange change) {
+    public String getPatchSet(ChangeSetData changeSetData, GerritChange change) {
         ChatGptAssistant chatGptAssistant = new ChatGptAssistant(config, change);
         chatGptAssistant.setupAssistant();
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptClientStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptClientStateless.java
index ef2fa20..b8f9d85 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptClientStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptClientStateless.java
@@ -7,6 +7,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.http.HttpClientWithRetry;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.*;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.chatgpt.IChatGptClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.UriResourceLocatorStateless;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.prompt.ChatGptPromptStateless;
@@ -37,9 +38,9 @@
     private boolean isCommentEvent = false;
 
     @Override
-    public String ask(Configuration config, String changeId, String patchSet) throws Exception {
+    public String ask(Configuration config, ChangeSetData changeSetData, String changeId, String patchSet) throws Exception {
         for (int attemptInd = 0; attemptInd < REVIEW_ATTEMPT_LIMIT; attemptInd++) {
-            HttpRequest request = createRequest(config, changeId, patchSet);
+            HttpRequest request = createRequest(config, changeSetData, patchSet);
             log.debug("ChatGPT request: {}", request.toString());
 
             HttpResponse<String> response = httpClientWithRetry.execute(request);
@@ -59,10 +60,10 @@
     }
 
     @Override
-    public String ask(Configuration config, GerritChange change, String patchSet) throws Exception {
+    public String ask(Configuration config, ChangeSetData changeSetData, GerritChange change, String patchSet) throws Exception {
         isCommentEvent = change.getIsCommentEvent();
 
-        return this.ask(config, change.getFullChangeId(), patchSet);
+        return this.ask(config, changeSetData, change.getFullChangeId(), patchSet);
     }
 
     private String extractContent(Configuration config, String body) throws Exception {
@@ -101,10 +102,10 @@
         return toolCalls.get(0).getFunction().getArguments();
     }
 
-    private HttpRequest createRequest(Configuration config, String changeId, String patchSet) {
+    private HttpRequest createRequest(Configuration config, ChangeSetData changeSetData, String patchSet) {
         URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateless.chatCompletionsUri());
         log.debug("ChatGPT request URI: {}", uri);
-        requestBody = createRequestBody(config, changeId, patchSet);
+        requestBody = createRequestBody(config, changeSetData, patchSet);
         log.debug("ChatGPT request body: {}", requestBody);
 
         return HttpRequest.newBuilder()
@@ -115,7 +116,7 @@
                 .build();
     }
 
-    private String createRequestBody(Configuration config, String changeId, String patchSet) {
+    private String createRequestBody(Configuration config, ChangeSetData changeSetData, String patchSet) {
         ChatGptPromptStateless chatGptPromptStateless = new ChatGptPromptStateless(config, isCommentEvent);
         ChatGptRequestMessage systemMessage = ChatGptRequestMessage.builder()
                 .role("system")
@@ -123,7 +124,7 @@
                 .build();
         ChatGptRequestMessage userMessage = ChatGptRequestMessage.builder()
                 .role("user")
-                .content(chatGptPromptStateless.getGptUserPrompt(patchSet, changeId))
+                .content(chatGptPromptStateless.getGptUserPrompt(changeSetData, patchSet))
                 .build();
 
         ChatGptParameters chatGptParameters = new ChatGptParameters(config, isCommentEvent);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
index b22de58..a843172 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
@@ -8,6 +8,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPatchSetFileDiff;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritReviewFileDiff;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.gerrit.IGerritClientPatchSet;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.UriResourceLocatorStateless;
 import lombok.extern.slf4j.Slf4j;
@@ -30,8 +31,8 @@
         diffs = new ArrayList<>();
     }
 
-    public String getPatchSet(GerritChange change) throws Exception {
-        int revisionBase = getChangeSetRevisionBase(change);
+    public String getPatchSet(ChangeSetData changeSetData, GerritChange change) throws Exception {
+        int revisionBase = getChangeSetRevisionBase(changeSetData);
         log.debug("Revision base: {}", revisionBase);
 
         List<String> files = getAffectedFiles(change.getFullChangeId(), revisionBase);
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 3aa4621..484ba0d 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
@@ -50,9 +50,8 @@
         return concatenate(prompt);
     }
 
-    public String getGptUserPrompt(String patchSet, String changeId) {
+    public String getGptUserPrompt(ChangeSetData changeSetData, String patchSet) {
         List<String> prompt = new ArrayList<>();
-        ChangeSetData changeSetData = ChangeSetDataHandler.getInstance(changeId);
         String gptRequestUserPrompt = changeSetData.getGptRequestUserPrompt();
         boolean isValidRequestUserPrompt = gptRequestUserPrompt != null && !gptRequestUserPrompt.isEmpty();
         if (isCommentEvent && isValidRequestUserPrompt) {
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 5f73c4d..c63ec7e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -5,9 +5,12 @@
 import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder;
 import com.github.tomakehurst.wiremock.verification.LoggedRequest;
 import com.google.common.net.HttpHeaders;
+import com.google.gerrit.entities.Account;
 import com.google.gerrit.entities.BranchNameKey;
 import com.google.gerrit.entities.Change;
 import com.google.gerrit.entities.Project;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountState;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.data.AccountAttribute;
 import com.google.gerrit.server.data.PatchSetAttribute;
@@ -29,6 +32,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientFacade;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.git.GitRepoFiles;
 import lombok.NonNull;
 import org.apache.http.entity.ContentType;
@@ -43,13 +47,17 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.Consumer;
 
 import static com.google.gerrit.extensions.client.ChangeKind.REWORK;
 import static com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator.*;
 import static com.googlesource.gerrit.plugins.chatgpt.utils.GsonUtils.getGson;
 import static java.net.HttpURLConnection.HTTP_OK;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -71,6 +79,7 @@
     protected static final BranchNameKey BRANCH_NAME = BranchNameKey.create(PROJECT_NAME, "myBranchName");
     protected static final boolean GPT_STREAM_OUTPUT = true;
     protected static final long TEST_TIMESTAMP = 1699270812;
+    private static  final int GPT_USER_ACCOUNT_ID = 1000000;
 
     @Rule
     public WireMockRule wireMockRule = new WireMockRule(9527);
@@ -216,6 +225,7 @@
                 bind(ConfigCreator.class).toInstance(mockConfigCreator);
                 bind(PatchSetReviewer.class).toInstance(patchSetReviewer);
                 bind(PluginDataHandler.class).toInstance(pluginDataHandler);
+                bind(AccountCache.class).toInstance(mockAccountCache());
             }
         }).getInstance(EventHandlerTask.class);
         return task.execute();
@@ -232,8 +242,9 @@
     }
 
     private void initTest () throws NoSuchProjectException {
-        gerritClient = new GerritClient(new GerritClientFacade(config));
-        patchSetReviewer = new PatchSetReviewer(gerritClient, config);
+        ChangeSetData changeSetData = new ChangeSetData(GPT_USER_ACCOUNT_ID, config.getVotingMinScore(), config.getMaxReviewFileSize());
+        gerritClient = new GerritClient(new GerritClientFacade(config, changeSetData));
+        patchSetReviewer = new PatchSetReviewer(gerritClient, config, changeSetData);
         mockConfigCreator = mock(ConfigCreator.class);
     }
 
@@ -280,4 +291,12 @@
         when(event.getChangeKey()).thenReturn(CHANGE_ID);
     }
 
+    private AccountCache mockAccountCache() {
+        AccountCache accountCache = mock(AccountCache.class);
+        Account account = Account.builder(Account.id(GPT_USER_ACCOUNT_ID), Instant.now()).build();
+        AccountState accountState = AccountState.forAccount(account, Collections.emptyList());
+        doReturn(Optional.of(accountState)).when(accountCache).getByUsername(GERRIT_GPT_USERNAME);
+
+        return accountCache;
+    }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
index 77baa74..854de47 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
@@ -3,6 +3,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientReview;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.review.ReviewBatch;
 import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.chatgpt.IChatGptClient;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.prompt.ChatGptPromptStateless;
@@ -36,13 +37,14 @@
 
     @Test
     public void sayHelloToGPT() throws Exception {
+        ChangeSetData changeSetData = new ChangeSetData(1, config.getVotingMinScore(), config.getMaxReviewFileSize());
         ChatGptPromptStateless chatGptPromptStateless = new ChatGptPromptStateless(config, true);
         when(config.getGptDomain()).thenReturn(Configuration.OPENAI_DOMAIN);
         when(config.getGptToken()).thenReturn("Your GPT token");
         when(config.getGptModel()).thenReturn(Configuration.DEFAULT_GPT_MODEL);
         when(chatGptPromptStateless.getGptSystemPrompt()).thenReturn(ChatGptPromptStateless.DEFAULT_GPT_SYSTEM_PROMPT);
 
-        String answer = chatGptClient.ask(config, "", "hello");
+        String answer = chatGptClient.ask(config, changeSetData, "", "hello");
         log.info("answer: {}", answer);
         assertNotNull(answer);
     }