diff --git a/src/main/java/com/crowdin/client/Client.java b/src/main/java/com/crowdin/client/Client.java
index dc3351bf1..5e7409e14 100644
--- a/src/main/java/com/crowdin/client/Client.java
+++ b/src/main/java/com/crowdin/client/Client.java
@@ -1,5 +1,6 @@
package com.crowdin.client;
+import com.crowdin.client.ai.AiApi;
import com.crowdin.client.applications.ApplicationsApi;
import com.crowdin.client.bundles.BundlesApi;
import com.crowdin.client.clients.ClientsApi;
@@ -68,6 +69,7 @@ public class Client extends CrowdinApi {
private final NotificationsApi notificationsApi;
private final ApplicationsApi applicationsApi;
private final ClientsApi clientsApi;
+ private final AiApi aiApi;
public Client(Credentials credentials) {
super(credentials);
@@ -101,6 +103,7 @@ public Client(Credentials credentials) {
this.notificationsApi = new NotificationsApi(credentials);
this.applicationsApi = new ApplicationsApi(credentials);
this.clientsApi = new ClientsApi(credentials);
+ this.aiApi = new AiApi(credentials);
}
public Client(Credentials credentials, ClientConfig clientConfig) {
@@ -135,6 +138,7 @@ public Client(Credentials credentials, ClientConfig clientConfig) {
this.notificationsApi = new NotificationsApi(credentials, clientConfig);
this.applicationsApi = new ApplicationsApi(credentials, clientConfig);
this.clientsApi = new ClientsApi(credentials, clientConfig);
+ this.aiApi = new AiApi(credentials,clientConfig);
}
}
diff --git a/src/main/java/com/crowdin/client/ai/AiApi.java b/src/main/java/com/crowdin/client/ai/AiApi.java
new file mode 100644
index 000000000..91fd4eca7
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/AiApi.java
@@ -0,0 +1,196 @@
+package com.crowdin.client.ai;
+
+import com.crowdin.client.ai.model.AddAiPromptRequest;
+import com.crowdin.client.ai.model.AddAiProviderRequest;
+import com.crowdin.client.ai.model.AiPrompt;
+import com.crowdin.client.ai.model.AiPromptResponseList;
+import com.crowdin.client.ai.model.AiPromptResponseObject;
+import com.crowdin.client.ai.model.AiProvider;
+import com.crowdin.client.ai.model.AiProviderModel;
+import com.crowdin.client.ai.model.AiProviderModelResponseList;
+import com.crowdin.client.ai.model.AiProviderResponseList;
+import com.crowdin.client.ai.model.AiProviderResponseObject;
+import com.crowdin.client.ai.model.AiProxyChatCompletionRequest;
+import com.crowdin.client.ai.model.AiProxyChatCompletionResponse;
+import com.crowdin.client.core.CrowdinApi;
+import com.crowdin.client.core.http.HttpRequestConfig;
+import com.crowdin.client.core.http.exceptions.HttpBadRequestException;
+import com.crowdin.client.core.http.exceptions.HttpException;
+import com.crowdin.client.core.model.ClientConfig;
+import com.crowdin.client.core.model.Credentials;
+import com.crowdin.client.core.model.PatchRequest;
+import com.crowdin.client.core.model.ResponseList;
+import com.crowdin.client.core.model.ResponseObject;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class AiApi extends CrowdinApi {
+
+ public AiApi(Credentials credentials) {
+ super(credentials);
+ }
+
+ public AiApi(Credentials credentials, ClientConfig clientConfig) {
+ super(credentials, clientConfig);
+ }
+
+ /**
+ * @param userId User identifier
+ * @return list of Ai Prompts
+ * @see
+ */
+ public ResponseList listAiPrompts (Long userId, Long projectId, String action, Long limit, Integer offset) throws HttpException, HttpBadRequestException {
+ Map> queryParams = HttpRequestConfig.buildUrlParams(
+ "projectId", Optional.ofNullable(projectId),
+ "action", Optional.ofNullable(action),
+ "limit", Optional.ofNullable(limit),
+ "offset", Optional.ofNullable(offset)
+ );
+ AiPromptResponseList aiPromptResponseList = this.httpClient.get(this.url + "/users/" + userId + "/ai/prompts", new HttpRequestConfig(queryParams), AiPromptResponseList.class);
+ return AiPromptResponseList.to(aiPromptResponseList);
+ }
+
+ /**
+ * @param userId user identifier
+ * @param request request object
+ * @return newly created Ai prompt
+ * @see
+ */
+ public ResponseObject addAiPrompt (Long userId, AddAiPromptRequest request) throws HttpException, HttpBadRequestException {
+ AiPromptResponseObject aiPromptResponseObject = this.httpClient.post(this.url + "/users/" + userId + "/ai/prompts", request, new HttpRequestConfig(), AiPromptResponseObject.class);
+ return ResponseObject.of(aiPromptResponseObject.getData());
+ }
+
+ /**
+ * @param userId User identifier
+ * @return list of Ai Prompts
+ * @see
+ */
+ public ResponseObject getAiPrompt (Long userId, Long aiPromptId) throws HttpException, HttpBadRequestException {
+ AiPromptResponseObject response = this.httpClient.get(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, new HttpRequestConfig(), AiPromptResponseObject.class);
+ return ResponseObject.of(response.getData());
+ }
+
+
+ /**
+ * @param userId user identifier
+ * @param aiPromptId ai prompt identifier
+ * @see
+ */
+ public void deleteAiPrompt (Long userId, Long aiPromptId) throws HttpException, HttpBadRequestException {
+ this.httpClient.delete(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, new HttpRequestConfig(), Void.class);
+ }
+
+ /**
+ * @param userId user identifier
+ * @param aiPromptId ai prompt identifier
+ * @see
+ */
+ public ResponseObject editAiPrompt (Long userId, Long aiPromptId, List request) throws HttpException, HttpBadRequestException {
+ AiPromptResponseObject response = this.httpClient.patch(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, request, new HttpRequestConfig(), AiPromptResponseObject.class);
+ return ResponseObject.of(response.getData());
+ }
+
+ /**
+ * @param userId User identifier
+ * @return list of Ai Providers
+ * @see
+ */
+ public ResponseList listAiProviders (Long userId, Long limit, Integer offset) throws HttpException, HttpBadRequestException {
+ Map> queryParams = HttpRequestConfig.buildUrlParams(
+ "limit", Optional.ofNullable(limit),
+ "offset", Optional.ofNullable(offset)
+ );
+ AiProviderResponseList response = this.httpClient.get(this.url + "/users/" + userId + "/ai/providers", new HttpRequestConfig(queryParams), AiProviderResponseList.class);
+ return AiProviderResponseList.to(response);
+ }
+
+ /**
+ * @param userId user identifier
+ * @return newly created Ai Provider
+ * @see
+ */
+ public ResponseObject addAiProvider (Long userId, AddAiProviderRequest request) throws HttpException, HttpBadRequestException {
+ AiProviderResponseObject aiProviderResponseObject = this.httpClient.post(this.url + "/users/" + userId + "/ai/providers", request, new HttpRequestConfig(), AiProviderResponseObject.class);
+ return ResponseObject.of(aiProviderResponseObject.getData());
+ }
+
+ /**
+ * @param userId User identifier
+ * @param aiProviderId Ai Provider Identifier
+ * @return list of Ai Prompts
+ * @see
+ */
+ public ResponseObject getAiProvider (Long userId, Long aiProviderId) throws HttpException, HttpBadRequestException {
+ AiProviderResponseObject response = this.httpClient.get(this.url + "/users/" + userId + "/ai/providers" + aiProviderId, new HttpRequestConfig(), AiProviderResponseObject.class);
+ return ResponseObject.of(response.getData());
+ }
+
+ /**
+ * @param userId user identifier
+ * @param aiProviderId Ai Provider Identifier
+ * @see
+ */
+ public void deleteAiProvider (Long userId, Long aiProviderId) throws HttpException, HttpBadRequestException {
+ this.httpClient.delete(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId, new HttpRequestConfig(), Void.class);
+ }
+
+ /**
+ * @param userId user identifier
+ * @param aiProviderId ai prompt identifier
+ * @see
+ */
+ public ResponseObject editAiProvider (Long userId, Long aiProviderId, List request) throws HttpException, HttpBadRequestException {
+ AiProviderResponseObject response = this.httpClient.patch(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId, request, new HttpRequestConfig(), AiProviderResponseObject.class);
+ return ResponseObject.of(response.getData());
+ }
+
+
+ /**
+ * @param userId User identifier
+ * @param aiProviderId ai prompt identifier
+ * @return list of Ai Provider Models
+ * @see
+ */
+ public ResponseList listAiProviderModels (Long userId, Long aiProviderId) throws HttpException, HttpBadRequestException {
+ AiProviderModelResponseList response = this.httpClient.get(this.url + "/users/" + userId + "/ai/providers" + aiProviderId + "/models", new HttpRequestConfig(), AiProviderModelResponseList.class);
+ return AiProviderModelResponseList.to(response);
+ }
+
+ /**
+ * @param userId user identifier
+ * @param aiProviderId ai prompt identifier
+ * @param request request object
+ * @see
+ */
+ public AiProxyChatCompletionResponse createAiProxyChatCompletion (Long userId, Long aiProviderId, AiProxyChatCompletionRequest request) throws HttpException, HttpBadRequestException {
+ AiProxyChatCompletionResponse aiProxyChatCompletionResponse = this.httpClient.post(this.url + "/users/" + userId + "/ai/providers" + aiProviderId + "/chat/completions", request, new HttpRequestConfig(), AiProxyChatCompletionResponse.class);
+ return aiProxyChatCompletionResponse;
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AddAiPromptRequest.java b/src/main/java/com/crowdin/client/ai/model/AddAiPromptRequest.java
new file mode 100644
index 000000000..ecdb1927f
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AddAiPromptRequest.java
@@ -0,0 +1,37 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddAiPromptRequest {
+ private String name;
+ private String action;
+ private long aiProviderId;
+ private String aiModelId;
+ private boolean isEnabled;
+ private List enabledProjectIds;
+ private Config config;
+
+ @Data
+ private static class Config {
+ private String mode;
+ private String companyDescription;
+ private String projectDescription;
+ private String audienceDescription;
+ private OtherLanguageTranslations otherLanguageTranslations;
+ private boolean glossaryTerms;
+ private boolean tmSuggestions;
+ private boolean fileContent;
+ private boolean fileContext;
+ private boolean publicProjectDescription;
+
+ @Data
+ private static class OtherLanguageTranslations {
+ private boolean isEnabled;
+ private List languageIds;
+ }
+ }
+
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AddAiProviderRequest.java b/src/main/java/com/crowdin/client/ai/model/AddAiProviderRequest.java
new file mode 100644
index 000000000..240014f24
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AddAiProviderRequest.java
@@ -0,0 +1,31 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AddAiProviderRequest {
+ private String name;
+ private String type;
+ private Credentials credentials;
+ private Config config;
+ private boolean isEnabled;
+ private boolean useSystemCredentials;
+
+ @Data
+ private static class Credentials {
+ private String apiKey;
+ }
+
+ @Data
+ private static class Config {
+ private List actionRules;
+
+ @Data
+ private static class ActionRule {
+ private String action;
+ private List availableAiModelIds;
+ }
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiPrompt.java b/src/main/java/com/crowdin/client/ai/model/AiPrompt.java
new file mode 100644
index 000000000..33a7c2500
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiPrompt.java
@@ -0,0 +1,39 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AiPrompt {
+ private long id;
+ private String name;
+ private String action;
+ private long aiProviderId;
+ private String aiModelId;
+ private boolean isEnabled;
+ private List enabledProjectIds;
+ private Config config;
+ private String createdAt;
+ private String updatedAt;
+
+ @Data
+ private static class Config {
+ private String mode;
+ private String companyDescription;
+ private String projectDescription;
+ private String audienceDescription;
+ private OtherLanguageTranslations otherLanguageTranslations;
+ private boolean glossaryTerms;
+ private boolean tmSuggestions;
+ private boolean fileContent;
+ private boolean fileContext;
+ private boolean publicProjectDescription;
+
+ @Data
+ private static class OtherLanguageTranslations {
+ private boolean isEnabled;
+ private List languageIds;
+ }
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiPromptResponseList.java b/src/main/java/com/crowdin/client/ai/model/AiPromptResponseList.java
new file mode 100644
index 000000000..2563692f5
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiPromptResponseList.java
@@ -0,0 +1,26 @@
+package com.crowdin.client.ai.model;
+
+import com.crowdin.client.core.model.Pagination;
+import com.crowdin.client.core.model.ResponseList;
+import com.crowdin.client.core.model.ResponseObject;
+import lombok.Data;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Data
+public class AiPromptResponseList {
+ private List data;
+ private Pagination pagination;
+
+ public static ResponseList to (AiPromptResponseList aiPromptResponseList) {
+ return ResponseList.of(
+ aiPromptResponseList.getData().stream()
+ .map(AiPromptResponseObject::getData)
+ .map(ResponseObject::of)
+ .collect(Collectors.toList()),
+ aiPromptResponseList.getPagination()
+ );
+ }
+
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiPromptResponseObject.java b/src/main/java/com/crowdin/client/ai/model/AiPromptResponseObject.java
new file mode 100644
index 000000000..54c735abf
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiPromptResponseObject.java
@@ -0,0 +1,9 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class AiPromptResponseObject {
+ private AiPrompt data;
+}
+
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProvider.java b/src/main/java/com/crowdin/client/ai/model/AiProvider.java
new file mode 100644
index 000000000..eb7c249dc
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProvider.java
@@ -0,0 +1,34 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class AiProvider {
+ private long id;
+ private String name;
+ private String type;
+ private Credentials credentials;
+ private Config config;
+ private boolean isEnabled;
+ private boolean useSystemCredentials;
+ private String createdAt;
+ private String updatedAt;
+
+ @Data
+ private static class Credentials {
+ private String apiKey;
+ }
+
+ @Data
+ private static class Config {
+ private List actionRules;
+
+ @Data
+ private static class ActionRule {
+ private String action;
+ private List availableAiModelIds;
+ }
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProviderModel.java b/src/main/java/com/crowdin/client/ai/model/AiProviderModel.java
new file mode 100644
index 000000000..da944549a
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProviderModel.java
@@ -0,0 +1,8 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class AiProviderModel {
+ private String id;
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseList.java b/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseList.java
new file mode 100644
index 000000000..5b80cdb53
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseList.java
@@ -0,0 +1,25 @@
+package com.crowdin.client.ai.model;
+
+import com.crowdin.client.core.model.Pagination;
+import com.crowdin.client.core.model.ResponseList;
+import com.crowdin.client.core.model.ResponseObject;
+import lombok.Data;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Data
+public class AiProviderModelResponseList {
+ private List data;
+ private Pagination pagination;
+
+ public static ResponseList to (AiProviderModelResponseList aiProviderModalResponseList) {
+ return ResponseList.of(
+ aiProviderModalResponseList.getData().stream()
+ .map(AiProviderModelResponseObject::getData)
+ .map(ResponseObject::of)
+ .collect(Collectors.toList()),
+ aiProviderModalResponseList.getPagination()
+ );
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseObject.java b/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseObject.java
new file mode 100644
index 000000000..af8a02a00
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProviderModelResponseObject.java
@@ -0,0 +1,8 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class AiProviderModelResponseObject {
+ private AiProviderModel data;
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProviderResponseList.java b/src/main/java/com/crowdin/client/ai/model/AiProviderResponseList.java
new file mode 100644
index 000000000..20d516fd2
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProviderResponseList.java
@@ -0,0 +1,25 @@
+package com.crowdin.client.ai.model;
+
+import com.crowdin.client.core.model.Pagination;
+import com.crowdin.client.core.model.ResponseList;
+import com.crowdin.client.core.model.ResponseObject;
+import lombok.Data;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Data
+public class AiProviderResponseList {
+ private List data;
+ private Pagination pagination;
+
+ public static ResponseList to (AiProviderResponseList aiProviderResponseList) {
+ return ResponseList.of(
+ aiProviderResponseList.getData().stream()
+ .map(AiProviderResponseObject::getData)
+ .map(ResponseObject::of)
+ .collect(Collectors.toList()),
+ aiProviderResponseList.getPagination()
+ );
+ }
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProviderResponseObject.java b/src/main/java/com/crowdin/client/ai/model/AiProviderResponseObject.java
new file mode 100644
index 000000000..19176504a
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProviderResponseObject.java
@@ -0,0 +1,8 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class AiProviderResponseObject {
+ private AiProvider data;
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionRequest.java b/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionRequest.java
new file mode 100644
index 000000000..f284c1424
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionRequest.java
@@ -0,0 +1,10 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+import java.util.HashMap;
+
+@Data
+public class AiProxyChatCompletionRequest {
+ private HashMap property;
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionResponse.java b/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionResponse.java
new file mode 100644
index 000000000..5d7a5d9fb
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/AiProxyChatCompletionResponse.java
@@ -0,0 +1,8 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class AiProxyChatCompletionResponse {
+ private Object data;
+}
diff --git a/src/main/java/com/crowdin/client/ai/model/GoogleGeminiAiProxyChatCompletionRequest.java b/src/main/java/com/crowdin/client/ai/model/GoogleGeminiAiProxyChatCompletionRequest.java
new file mode 100644
index 000000000..ff11e0cda
--- /dev/null
+++ b/src/main/java/com/crowdin/client/ai/model/GoogleGeminiAiProxyChatCompletionRequest.java
@@ -0,0 +1,8 @@
+package com.crowdin.client.ai.model;
+
+import lombok.Data;
+
+@Data
+public class GoogleGeminiAiProxyChatCompletionRequest extends AiProxyChatCompletionRequest{
+ private String model;
+}
diff --git a/src/test/java/com/crowdin/client/ai/AiApiTest.java b/src/test/java/com/crowdin/client/ai/AiApiTest.java
new file mode 100644
index 000000000..fba9695d3
--- /dev/null
+++ b/src/test/java/com/crowdin/client/ai/AiApiTest.java
@@ -0,0 +1,88 @@
+package com.crowdin.client.ai;
+
+import com.crowdin.client.ai.model.AddAiPromptRequest;
+import com.crowdin.client.ai.model.AddAiProviderRequest;
+import com.crowdin.client.ai.model.AiPrompt;
+import com.crowdin.client.ai.model.AiPromptResponseObject;
+import com.crowdin.client.ai.model.AiProvider;
+import com.crowdin.client.core.model.PatchOperation;
+import com.crowdin.client.core.model.PatchRequest;
+import com.crowdin.client.core.model.ResponseList;
+import com.crowdin.client.core.model.ResponseObject;
+import com.crowdin.client.framework.RequestMock;
+import com.crowdin.client.framework.TestClient;
+import com.crowdin.client.tasks.model.Status;
+import com.crowdin.client.tasks.model.Task;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPatch;
+import org.apache.http.client.methods.HttpPost;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static java.util.Collections.singletonList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AiApiTest extends TestClient {
+
+ private final Long userId = 2L;
+ //private final Long projectId = 1L;
+ private final Long aiPromptId = 2L;
+ private final Long aiProviderId = 14L;
+
+ @Override
+ public List getMocks() {
+ return Arrays.asList(
+ RequestMock.build(this.url + "/users/" + userId + "/ai/prompts", HttpGet.METHOD_NAME, "api/ai/aiPromptList.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/prompts", HttpPost.METHOD_NAME, "api/ai/addAiPromptRequest.json","api/ai/addAiPromptResponse.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, HttpGet.METHOD_NAME, "api/ai/aiPrompt.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, HttpDelete.METHOD_NAME ),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/prompts/" + aiPromptId, HttpPatch.METHOD_NAME,"api/ai/updateAiPromptRequest.json","api/ai/updateAiPromptResponse.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers", HttpGet.METHOD_NAME, "api/ai/aiProvidersList.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers", HttpPost.METHOD_NAME, "api/ai/addAiProviderRequest.json","api/ai/addAiProviderResponse.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId, HttpGet.METHOD_NAME, "api/ai/aiProvider.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId, HttpDelete.METHOD_NAME),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId, HttpPatch.METHOD_NAME, "api/ai/updateAiProviderRequest.json","api/ai/updateAiProviderResponse.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId + "/models", HttpGet.METHOD_NAME, "api/ai/aiModelList.json"),
+ RequestMock.build(this.url + "/users/" + userId + "/ai/providers/" + aiProviderId + "/chat/completions", HttpGet.METHOD_NAME, "api/ai/aiChatCompletionRequest.json", "api/ai/aiChatCompletionResponse.json")
+ );
+ }
+
+ @Test
+ public void listAiPromptTest(){
+ ResponseList aiPromptResponseList = this.getAiApi().listAiPrompts(userId, null,null,null, null);
+ AiPrompt aiPrompt = aiPromptResponseList.getData().get(0).getData();
+ assertEquals(aiPrompt.getName(), "Pre-translate prompt");
+ }
+
+ @Test
+ public void addAiPromptTest() {
+ AddAiPromptRequest addAiPromptRequest = new AddAiPromptRequest();
+ addAiPromptRequest.setAction("Pre-translate");
+ ResponseObject aiPromptResponseObject =this.getAiApi().addAiPrompt(userId,null);
+ assertEquals(aiPromptResponseObject.getData().getName(), "Pre-translate prompt");
+ }
+
+ @Test
+ public void getAiPromptTest() {
+ ResponseObject aiPromptResponseObject = this.getAiApi().getAiPrompt(userId, aiPromptId);
+ AiPrompt aiPrompt = (AiPrompt)aiPromptResponseObject.getData();
+ assertEquals(aiPrompt.getName(),"Pre-translate prompt");
+ }
+
+ @Test
+ public void deleteAiPromptTest() {
+ this.getAiApi().deleteAiPrompt(userId,aiPromptId);
+ }
+
+ @Test
+ public void listAiProviderTest() {
+ ResponseList aiProviderResponseList = this.getAiApi().listAiProviders(userId, null, null);
+ AiProvider aiProvider = aiProviderResponseList.getData().get(0).getData();
+ assertEquals(aiProvider.getName(), "OpenAI");
+ }
+
+}
diff --git a/src/test/resources/api/ai/addAiPromptRequest.json b/src/test/resources/api/ai/addAiPromptRequest.json
new file mode 100644
index 000000000..837f3809d
--- /dev/null
+++ b/src/test/resources/api/ai/addAiPromptRequest.json
@@ -0,0 +1,27 @@
+{
+ "name": "Pre-translate prompt",
+ "action": "pre_translate",
+ "aiProviderId": 0,
+ "aiModelId": "gpt-3.5-turbo-instruct",
+ "isEnabled": true,
+ "enabledProjectIds": [
+ 23
+ ],
+ "config": {
+ "mode": "basic",
+ "companyDescription": "string",
+ "projectDescription": "string",
+ "audienceDescription": "string",
+ "otherLanguageTranslations": {
+ "isEnabled": true,
+ "languageIds": [
+ "uk"
+ ]
+ },
+ "glossaryTerms": true,
+ "tmSuggestions": true,
+ "fileContent": true,
+ "fileContext": true,
+ "publicProjectDescription": true
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/addAiPromptResponse.json b/src/test/resources/api/ai/addAiPromptResponse.json
new file mode 100644
index 000000000..07c46f2e5
--- /dev/null
+++ b/src/test/resources/api/ai/addAiPromptResponse.json
@@ -0,0 +1,32 @@
+{
+ "data": {
+ "id": 2,
+ "name": "Pre-translate prompt",
+ "action": "pre_translate",
+ "aiProviderId": 2,
+ "aiModelId": "gpt-3.5-turbo-instruct",
+ "isEnabled": true,
+ "enabledProjectIds": [
+ 1
+ ],
+ "config": {
+ "mode": "basic",
+ "companyDescription": "string",
+ "projectDescription": "string",
+ "audienceDescription": "string",
+ "otherLanguageTranslations": {
+ "isEnabled": true,
+ "languageIds": [
+ "uk"
+ ]
+ },
+ "glossaryTerms": true,
+ "tmSuggestions": true,
+ "fileContent": true,
+ "fileContext": true,
+ "publicProjectDescription": true
+ },
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/addAiProviderRequest.json b/src/test/resources/api/ai/addAiProviderRequest.json
new file mode 100644
index 000000000..90cceea43
--- /dev/null
+++ b/src/test/resources/api/ai/addAiProviderRequest.json
@@ -0,0 +1,19 @@
+{
+ "name": "OpenAI",
+ "type": "open_ai",
+ "credentials": {
+ "apiKey": "string"
+ },
+ "config": {
+ "actionRules": [
+ {
+ "action": "pre_translate",
+ "availableAiModelIds": [
+ "gpt-3.5-turbo-instruct"
+ ]
+ }
+ ]
+ },
+ "isEnabled": true,
+ "useSystemCredentials": false
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/addAiProviderResponse.json b/src/test/resources/api/ai/addAiProviderResponse.json
new file mode 100644
index 000000000..6bfaad93f
--- /dev/null
+++ b/src/test/resources/api/ai/addAiProviderResponse.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "id": 2,
+ "name": "OpenAI",
+ "type": "open_ai",
+ "credentials": {
+ "apiKey": "string"
+ },
+ "config": {
+ "actionRules": [
+ {
+ "action": "pre_translate",
+ "availableAiModelIds": [
+ "gpt-3.5-turbo-instruct"
+ ]
+ }
+ ]
+ },
+ "isEnabled": true,
+ "useSystemCredentials": false,
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiChatCompletionRequest.json b/src/test/resources/api/ai/aiChatCompletionRequest.json
new file mode 100644
index 000000000..0d30e723c
--- /dev/null
+++ b/src/test/resources/api/ai/aiChatCompletionRequest.json
@@ -0,0 +1,3 @@
+{
+ "model": "string"
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiChatCompletionResponse.json b/src/test/resources/api/ai/aiChatCompletionResponse.json
new file mode 100644
index 000000000..1b2b90066
--- /dev/null
+++ b/src/test/resources/api/ai/aiChatCompletionResponse.json
@@ -0,0 +1,3 @@
+{
+ "data": { }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiModelList.json b/src/test/resources/api/ai/aiModelList.json
new file mode 100644
index 000000000..fc6ddb207
--- /dev/null
+++ b/src/test/resources/api/ai/aiModelList.json
@@ -0,0 +1,9 @@
+{
+ "data": [
+ {
+ "data": {
+ "id": "gpt-3.5-turbo-instruct"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiPrompt.json b/src/test/resources/api/ai/aiPrompt.json
new file mode 100644
index 000000000..07c46f2e5
--- /dev/null
+++ b/src/test/resources/api/ai/aiPrompt.json
@@ -0,0 +1,32 @@
+{
+ "data": {
+ "id": 2,
+ "name": "Pre-translate prompt",
+ "action": "pre_translate",
+ "aiProviderId": 2,
+ "aiModelId": "gpt-3.5-turbo-instruct",
+ "isEnabled": true,
+ "enabledProjectIds": [
+ 1
+ ],
+ "config": {
+ "mode": "basic",
+ "companyDescription": "string",
+ "projectDescription": "string",
+ "audienceDescription": "string",
+ "otherLanguageTranslations": {
+ "isEnabled": true,
+ "languageIds": [
+ "uk"
+ ]
+ },
+ "glossaryTerms": true,
+ "tmSuggestions": true,
+ "fileContent": true,
+ "fileContext": true,
+ "publicProjectDescription": true
+ },
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiPromptList.json b/src/test/resources/api/ai/aiPromptList.json
new file mode 100644
index 000000000..ed8a968b1
--- /dev/null
+++ b/src/test/resources/api/ai/aiPromptList.json
@@ -0,0 +1,40 @@
+{
+ "data": [
+ {
+ "data": {
+ "id": 2,
+ "name": "Pre-translate prompt",
+ "action": "pre_translate",
+ "aiProviderId": 2,
+ "aiModelId": "gpt-3.5-turbo-instruct",
+ "isEnabled": true,
+ "enabledProjectIds": [
+ 1
+ ],
+ "config": {
+ "mode": "basic",
+ "companyDescription": "string",
+ "projectDescription": "string",
+ "audienceDescription": "string",
+ "otherLanguageTranslations": {
+ "isEnabled": true,
+ "languageIds": [
+ "uk"
+ ]
+ },
+ "glossaryTerms": true,
+ "tmSuggestions": true,
+ "fileContent": true,
+ "fileContext": true,
+ "publicProjectDescription": true
+ },
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+ }
+ ],
+ "pagination": {
+ "offset": 0,
+ "limit": 25
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiProvider.json b/src/test/resources/api/ai/aiProvider.json
new file mode 100644
index 000000000..6bfaad93f
--- /dev/null
+++ b/src/test/resources/api/ai/aiProvider.json
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "id": 2,
+ "name": "OpenAI",
+ "type": "open_ai",
+ "credentials": {
+ "apiKey": "string"
+ },
+ "config": {
+ "actionRules": [
+ {
+ "action": "pre_translate",
+ "availableAiModelIds": [
+ "gpt-3.5-turbo-instruct"
+ ]
+ }
+ ]
+ },
+ "isEnabled": true,
+ "useSystemCredentials": false,
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/aiProvidersList.json b/src/test/resources/api/ai/aiProvidersList.json
new file mode 100644
index 000000000..7272bf200
--- /dev/null
+++ b/src/test/resources/api/ai/aiProvidersList.json
@@ -0,0 +1,32 @@
+{
+ "data": [
+ {
+ "data": {
+ "id": 2,
+ "name": "OpenAI",
+ "type": "open_ai",
+ "credentials": {
+ "apiKey": "string"
+ },
+ "config": {
+ "actionRules": [
+ {
+ "action": "pre_translate",
+ "availableAiModelIds": [
+ "gpt-3.5-turbo-instruct"
+ ]
+ }
+ ]
+ },
+ "isEnabled": true,
+ "useSystemCredentials": false,
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+ }
+ ],
+ "pagination": {
+ "offset": 0,
+ "limit": 25
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/googleAiChatCompletionResponse.json b/src/test/resources/api/ai/googleAiChatCompletionResponse.json
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/api/ai/googleAiCompletionChatRequest.json b/src/test/resources/api/ai/googleAiCompletionChatRequest.json
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/test/resources/api/ai/updateAiPromptRequest.json b/src/test/resources/api/ai/updateAiPromptRequest.json
new file mode 100644
index 000000000..228cedba3
--- /dev/null
+++ b/src/test/resources/api/ai/updateAiPromptRequest.json
@@ -0,0 +1,6 @@
+[
+ {
+ "op": "replace",
+ "path": "/action"
+ }
+]
\ No newline at end of file
diff --git a/src/test/resources/api/ai/updateAiPromptResponse.json b/src/test/resources/api/ai/updateAiPromptResponse.json
new file mode 100644
index 000000000..07c46f2e5
--- /dev/null
+++ b/src/test/resources/api/ai/updateAiPromptResponse.json
@@ -0,0 +1,32 @@
+{
+ "data": {
+ "id": 2,
+ "name": "Pre-translate prompt",
+ "action": "pre_translate",
+ "aiProviderId": 2,
+ "aiModelId": "gpt-3.5-turbo-instruct",
+ "isEnabled": true,
+ "enabledProjectIds": [
+ 1
+ ],
+ "config": {
+ "mode": "basic",
+ "companyDescription": "string",
+ "projectDescription": "string",
+ "audienceDescription": "string",
+ "otherLanguageTranslations": {
+ "isEnabled": true,
+ "languageIds": [
+ "uk"
+ ]
+ },
+ "glossaryTerms": true,
+ "tmSuggestions": true,
+ "fileContent": true,
+ "fileContext": true,
+ "publicProjectDescription": true
+ },
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/api/ai/updateAiProviderRequest.json b/src/test/resources/api/ai/updateAiProviderRequest.json
new file mode 100644
index 000000000..ed147f56e
--- /dev/null
+++ b/src/test/resources/api/ai/updateAiProviderRequest.json
@@ -0,0 +1,6 @@
+[
+ {
+ "op": "replace",
+ "path": "/name"
+ }
+]
\ No newline at end of file
diff --git a/src/test/resources/api/ai/updateAiProviderResponse.java b/src/test/resources/api/ai/updateAiProviderResponse.java
new file mode 100644
index 000000000..2283dc17d
--- /dev/null
+++ b/src/test/resources/api/ai/updateAiProviderResponse.java
@@ -0,0 +1,24 @@
+{
+ "data": {
+ "id": 2,
+ "name": "OpenAI",
+ "type": "open_ai",
+ "credentials": {
+ "apiKey": "string"
+ },
+ "config": {
+ "actionRules": [
+ {
+ "action": "pre_translate",
+ "availableAiModelIds": [
+ "gpt-3.5-turbo-instruct"
+ ]
+ }
+ ]
+ },
+ "isEnabled": true,
+ "useSystemCredentials": false,
+ "createdAt": "2019-09-20T11:11:05+00:00",
+ "updatedAt": "2019-09-20T12:22:20+00:00"
+ }
+}
\ No newline at end of file