Upgrade to ChatGPT OpenAI assistant version 2

Completed migration from OpenAI Assistant version 1 to 2. This upgrade
required changes to how file IDs of the Git projects uploaded to ChatGPT
are passed during assistant creation.

Change-Id: I1c8e1be662445cf7a0eae92496d969e2a5c4c24f
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptParameters.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/chatgpt/ChatGptParameters.java
similarity index 93%
rename from src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptParameters.java
rename to src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/chatgpt/ChatGptParameters.java
index a4bc242..4670a67 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/chatgpt/ChatGptParameters.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/chatgpt/ChatGptParameters.java
@@ -1,4 +1,4 @@
-package com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.chatgpt;
+package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/UriResourceLocatorStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/UriResourceLocatorStateful.java
index 586fce9..c4f7dc1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/UriResourceLocatorStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/UriResourceLocatorStateful.java
@@ -1,11 +1,11 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api;
 
 public class UriResourceLocatorStateful {
-    public static String chatCreateFilesUri() {
+    public static String filesCreateUri() {
         return "/v1/files";
     }
 
-    public static String chatCreateAssistantsUri() {
+    public static String assistantCreateUri() {
         return "/v1/assistants";
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
index 717648c..71bd8f3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
@@ -3,37 +3,35 @@
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt.ChatGptParameters;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt.ChatGptTools;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.chatgpt.ChatGptTool;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.UriResourceLocatorStateful;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.git.GitRepoFiles;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.prompt.ChatGptPromptStateful;
-import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt.ChatGptCreateAssistantResponse;
-import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt.ChatGptFilesResponse;
-import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt.ChatGptCreateAssistantRequestBody;
-import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.chatgpt.ChatGptParameters;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt.*;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.Request;
 
 import java.net.URI;
 import java.nio.file.Path;
 
+import static com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptFiles.KEY_FILE_ID;
 import static com.googlesource.gerrit.plugins.chatgpt.utils.FileUtils.createTempFileWithContent;
 import static com.googlesource.gerrit.plugins.chatgpt.utils.GsonUtils.getGson;
 
 @Slf4j
 public class ChatGptAssistant extends ClientBase {
-    public static final String KEY_FILE_ID = "fileId";
     public static final String KEY_ASSISTANT_ID = "assistantId";
-    public static final String CODE_INTERPRETER_TOOL_TYPE = "code_interpreter";
 
     private final ChatGptHttpClient httpClient = new ChatGptHttpClient();
     private final GerritChange change;
     private final GitRepoFiles gitRepoFiles;
     private final PluginDataHandler pluginDataHandler;
 
-    public ChatGptAssistant(Configuration config, GerritChange change, GitRepoFiles gitRepoFiles, PluginDataHandler pluginDataHandler) {
+    public ChatGptAssistant(Configuration config, GerritChange change, GitRepoFiles gitRepoFiles,
+                            PluginDataHandler pluginDataHandler) {
         super(config);
         this.change = change;
         this.gitRepoFiles = gitRepoFiles;
@@ -67,31 +65,29 @@
         Request request = createRequest(fileId);
         log.debug("ChatGPT Create Assistant request: {}", request);
 
-        ChatGptCreateAssistantResponse assistantResponse = getGson().fromJson(httpClient.execute(request),
-                ChatGptCreateAssistantResponse.class);
-
+        ChatGptResponse assistantResponse = getGson().fromJson(httpClient.execute(request), ChatGptResponse.class);
         log.debug("Assistant created: {}", assistantResponse);
 
         return assistantResponse.getId();
     }
 
     private Request createRequest(String fileId) {
-        URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateful.chatCreateAssistantsUri());
+        URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateful.assistantCreateUri());
         log.debug("ChatGPT Create Assistant request URI: {}", uri);
         ChatGptPromptStateful chatGptPromptStateful = new ChatGptPromptStateful(config, change);
         ChatGptParameters chatGptParameters = new ChatGptParameters(config, change.getIsCommentEvent());
         ChatGptTool[] tools = new ChatGptTool[] {
-                new ChatGptTool(CODE_INTERPRETER_TOOL_TYPE),
                 ChatGptTools.retrieveFormatRepliesTool()
         };
+        ChatGptToolResources toolResources = new ChatGptToolResources(new ChatGptFileIds(new String[] {fileId}));
         ChatGptCreateAssistantRequestBody requestBody = ChatGptCreateAssistantRequestBody.builder()
                 .name(ChatGptPromptStateful.DEFAULT_GPT_ASSISTANT_NAME)
                 .description(chatGptPromptStateful.getDefaultGptAssistantDescription())
                 .instructions(chatGptPromptStateful.getDefaultGptAssistantInstructions())
                 .model(config.getGptModel())
                 .temperature(chatGptParameters.getGptTemperature())
-                .fileIds(new String[]{fileId})
                 .tools(tools)
+                .toolResources(toolResources)
                 .build();
 
         return httpClient.createRequestFromJson(uri.toString(), config.getGptToken(), requestBody);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptFiles.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptFiles.java
index 2cbde38..58bcf93 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptFiles.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptFiles.java
@@ -16,6 +16,8 @@
 
 @Slf4j
 public class ChatGptFiles extends ClientBase {
+    public static final String KEY_FILE_ID = "fileId";
+
     private final HttpClient httpClient = new HttpClient();
 
     public ChatGptFiles(Configuration config) {
@@ -33,7 +35,7 @@
     }
 
     private Request createUploadFileRequest(Path repoPath) {
-        URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateful.chatCreateFilesUri());
+        URI uri = URI.create(config.getGptDomain() + UriResourceLocatorStateful.filesCreateUri());
         log.debug("ChatGPT Upload Files request URI: {}", uri);
         File file = repoPath.toFile();
         RequestBody requestBody = new MultipartBody.Builder()
@@ -43,7 +45,7 @@
                         RequestBody.create(file, MediaType.parse("application/json")))
                 .build();
 
-        return httpClient.createRequest(uri.toString(), config.getGptToken(), requestBody);
+        return httpClient.createRequest(uri.toString(), config.getGptToken(), requestBody, null);
     }
 
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptHttpClient.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptHttpClient.java
index 077daa9..35a4e4e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptHttpClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptHttpClient.java
@@ -6,7 +6,7 @@
 import java.util.Map;
 
 public class ChatGptHttpClient extends HttpClient {
-    private static final Map<String, String> BETA_VERSION_HEADER = Map.of("OpenAI-Beta", "assistants=v1");
+    private static final Map<String, String> BETA_VERSION_HEADER = Map.of("OpenAI-Beta", "assistants=v2");
 
     public Request createRequestFromJson(String uri, String bearer, Object requestObject) {
         return createRequestFromJson(uri, bearer, requestObject, BETA_VERSION_HEADER);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantRequestBody.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantRequestBody.java
index 2875a8f..6e85320 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantRequestBody.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantRequestBody.java
@@ -8,12 +8,12 @@
 @Data
 @Builder
 public class ChatGptCreateAssistantRequestBody {
-    String name;
-    String description;
-    String instructions;
-    String model;
-    Double temperature;
-    @SerializedName("file_ids")
-    String[] fileIds;
-    ChatGptTool[] tools;
+    private String name;
+    private String description;
+    private String instructions;
+    private String model;
+    private Double temperature;
+    private ChatGptTool[] tools;
+    @SerializedName("tool_resources")
+    private ChatGptToolResources toolResources;
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantResponse.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantResponse.java
deleted file mode 100644
index 743b3d8..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptCreateAssistantResponse.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt;
-
-import lombok.Data;
-
-@Data
-public class ChatGptCreateAssistantResponse {
-    String id;
-    String object;
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFileIds.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFileIds.java
new file mode 100644
index 0000000..2fa6fe5
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFileIds.java
@@ -0,0 +1,12 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ChatGptFileIds {
+    @SerializedName("file_ids")
+    private String[] fileIds;
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFilesResponse.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFilesResponse.java
index 5329bcb..e06838b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFilesResponse.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptFilesResponse.java
@@ -1,10 +1,10 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt;
 
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
+@EqualsAndHashCode(callSuper = true)
 @Data
-public class ChatGptFilesResponse {
-    String id;
-    String filename;
-    String status;
+public class ChatGptFilesResponse extends ChatGptResponse {
+    private String filename;
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptResponse.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptResponse.java
new file mode 100644
index 0000000..7501d96
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptResponse.java
@@ -0,0 +1,10 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt;
+
+import lombok.Data;
+
+@Data
+public class ChatGptResponse {
+    private String id;
+    private String object;
+    private String status;
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptToolResources.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptToolResources.java
new file mode 100644
index 0000000..8752d1a
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/model/api/chatgpt/ChatGptToolResources.java
@@ -0,0 +1,12 @@
+package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.model.api.chatgpt;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ChatGptToolResources {
+    @SerializedName("code_interpreter")
+    private ChatGptFileIds codeInterpreter;
+}
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 b8f9d85..5cddeb7 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
@@ -3,6 +3,7 @@
 import com.google.common.net.HttpHeaders;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt.ChatGptParameters;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt.ChatGptTools;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.http.HttpClientWithRetry;