Skip to content

Commit 90a91e4

Browse files
committed
WIP AI Translate
1 parent 3f6d7f2 commit 90a91e4

File tree

7 files changed

+633
-0
lines changed

7 files changed

+633
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.box.l10n.mojito.rest.textunit;
2+
3+
import com.box.l10n.mojito.entity.PollableTask;
4+
import com.box.l10n.mojito.quartz.QuartzPollableTaskScheduler;
5+
import com.box.l10n.mojito.service.oaitranslate.AiTranslateConfigurationProperties;
6+
import com.box.l10n.mojito.service.oaitranslate.AiTranslateService;
7+
import com.box.l10n.mojito.service.oaitranslate.AiTranslateService.AiTranslateInput;
8+
import com.box.l10n.mojito.service.pollableTask.PollableFuture;
9+
import com.box.l10n.mojito.service.repository.RepositoryRepository;
10+
import java.util.List;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.http.HttpStatus;
15+
import org.springframework.web.bind.annotation.RequestBody;
16+
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.RequestMethod;
18+
import org.springframework.web.bind.annotation.ResponseStatus;
19+
import org.springframework.web.bind.annotation.RestController;
20+
21+
@RestController
22+
public class AiTranslateWS {
23+
24+
/** logger */
25+
static Logger logger = LoggerFactory.getLogger(AiTranslateWS.class);
26+
27+
@Autowired AiTranslateService aiTranslateService;
28+
29+
@Autowired RepositoryRepository repositoryRepository;
30+
31+
@Autowired QuartzPollableTaskScheduler quartzPollableTaskScheduler;
32+
33+
@Autowired AiTranslateConfigurationProperties aiTranslateConfigurationProperties;
34+
35+
@RequestMapping(method = RequestMethod.POST, value = "/api/proto-ai-translate")
36+
@ResponseStatus(HttpStatus.OK)
37+
public ProtoAiTranslateResponse aiTranslate(@RequestBody ProtoAiTranslateRequest protoAiTranslateRequest) {
38+
39+
PollableFuture<Void> pollableFuture =
40+
aiTranslateService.aiTranslateAsync(
41+
new AiTranslateInput(
42+
protoAiTranslateRequest.repositoryName(),
43+
protoAiTranslateRequest.targetBcp47tags(),
44+
protoAiTranslateRequest.sourceTextMaxCountPerLocale()));
45+
46+
return new ProtoAiTranslateResponse(pollableFuture.getPollableTask());
47+
}
48+
49+
public record ProtoAiTranslateRequest(
50+
String repositoryName, List<String> targetBcp47tags, int sourceTextMaxCountPerLocale) {}
51+
52+
public record ProtoAiTranslateResponse(PollableTask pollableTask) {
53+
}
54+
}

webapp/src/main/java/com/box/l10n/mojito/service/blobstorage/StructuredBlobStorage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,6 @@ public enum Prefix {
4848
MULTI_BRANCH_STATE,
4949
TEXT_UNIT_DTOS_CACHE,
5050
CLOB_STORAGE_WS,
51+
AI_TRANSLATE_WS,
5152
}
5253
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.box.l10n.mojito.service.oaitranslate;
2+
3+
import com.box.l10n.mojito.json.ObjectMapper;
4+
import com.box.l10n.mojito.openai.OpenAIClient;
5+
import java.time.Duration;
6+
import org.springframework.beans.factory.annotation.Qualifier;
7+
import org.springframework.context.annotation.Bean;
8+
import org.springframework.context.annotation.Configuration;
9+
import reactor.util.retry.Retry;
10+
import reactor.util.retry.RetryBackoffSpec;
11+
12+
@Configuration
13+
public class AiTranslateConfig {
14+
15+
AiTranslateConfigurationProperties aiTranslateConfigurationProperties;
16+
17+
public AiTranslateConfig(AiTranslateConfigurationProperties aiTranslateConfigurationProperties) {
18+
this.aiTranslateConfigurationProperties = aiTranslateConfigurationProperties;
19+
}
20+
21+
@Bean
22+
@Qualifier("AiTranslate")
23+
OpenAIClient openAIClient() {
24+
String openaiClientToken = aiTranslateConfigurationProperties.getOpenaiClientToken();
25+
if (openaiClientToken == null) {
26+
return null;
27+
}
28+
return new OpenAIClient.Builder().apiKey(openaiClientToken).build();
29+
}
30+
31+
@Bean
32+
@Qualifier("AiTranslate")
33+
ObjectMapper objectMapper() {
34+
ObjectMapper objectMapper = new ObjectMapper();
35+
AiTranslateService.configureObjectMapper(objectMapper);
36+
return objectMapper;
37+
}
38+
39+
@Bean
40+
@Qualifier("AiTranslate")
41+
RetryBackoffSpec retryBackoffSpec() {
42+
return Retry.backoff(5, Duration.ofMillis(500)).maxBackoff(Duration.ofSeconds(5));
43+
}
44+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.box.l10n.mojito.service.oaitranslate;
2+
3+
import com.box.l10n.mojito.quartz.QuartzSchedulerManager;
4+
import org.springframework.boot.context.properties.ConfigurationProperties;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
@ConfigurationProperties("l10n.ai-translate")
9+
public class AiTranslateConfigurationProperties {
10+
String openaiClientToken;
11+
String schedulerName = QuartzSchedulerManager.DEFAULT_SCHEDULER_NAME;
12+
13+
public String getOpenaiClientToken() {
14+
return openaiClientToken;
15+
}
16+
17+
public void setOpenaiClientToken(String openaiClientToken) {
18+
this.openaiClientToken = openaiClientToken;
19+
}
20+
21+
public String getSchedulerName() {
22+
return schedulerName;
23+
}
24+
25+
public void setSchedulerName(String schedulerName) {
26+
this.schedulerName = schedulerName;
27+
}
28+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.box.l10n.mojito.service.oaitranslate;
2+
3+
import com.box.l10n.mojito.quartz.QuartzPollableJob;
4+
import com.box.l10n.mojito.service.oaitranslate.AiTranslateService.AiTranslateInput;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.stereotype.Component;
9+
10+
/**
11+
* Class to process a batch of strings for machine translation against a set of target languages.
12+
*
13+
* @author garion
14+
*/
15+
@Component
16+
public class AiTranslateJob extends QuartzPollableJob<AiTranslateInput, Void> {
17+
18+
static Logger logger = LoggerFactory.getLogger(AiTranslateJob.class);
19+
20+
@Autowired AiTranslateService aiTranslateService;
21+
22+
@Override
23+
public Void call(AiTranslateInput aiTranslateJobInput) throws Exception {
24+
aiTranslateService.aiTranslate(aiTranslateJobInput);
25+
return null;
26+
}
27+
}

0 commit comments

Comments
 (0)