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