Skip to content

Commit 1cc0d41

Browse files
feat: [Orchestration] Translation (#440)
* feat: [Orchestration] Translation * Formatting * release notes * pfd checkstyle * warning --------- Co-authored-by: SAP Cloud SDK Bot <[email protected]>
1 parent cd9580e commit 1cc0d41

File tree

7 files changed

+148
-55
lines changed

7 files changed

+148
-55
lines changed

docs/release_notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
- [OpenAI] Added the following new models: `o4-mini`, `o3`, `gpt-4.1`, `gpt-4.1-nano`, and `gpt-4.1-mini`
1717
- [Orchestration] Added new model DeepSeek-R1: `OrchestrationAiModel.DEEPSEEK_R1`
1818
- [Orchestration] [Tool execution fully enabled](https://sap.github.io/ai-sdk/docs/java/spring-ai/orchestration#tool-calling)
19+
- [Orchestration] [Added translation](https://sap.github.io/ai-sdk/docs/java/orchestration/chat-completion#translation)
1920

2021
### 📈 Improvements
2122

orchestration/src/main/java/com/sap/ai/sdk/orchestration/ConfigToRequestTransformer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,10 @@ static ModuleConfigs toModuleConfigs(@Nonnull final OrchestrationModuleConfig co
9595
Option.of(config.getFilteringConfig()).forEach(moduleConfig::filteringModuleConfig);
9696
Option.of(config.getMaskingConfig()).forEach(moduleConfig::maskingModuleConfig);
9797
Option.of(config.getGroundingConfig()).forEach(moduleConfig::groundingModuleConfig);
98+
Option.of(config.getOutputTranslationConfig())
99+
.forEach(moduleConfig::outputTranslationModuleConfig);
100+
Option.of(config.getInputTranslationConfig())
101+
.forEach(moduleConfig::inputTranslationModuleConfig);
98102

99103
return moduleConfig;
100104
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationModuleConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import com.sap.ai.sdk.orchestration.model.FilteringModuleConfig;
55
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfig;
66
import com.sap.ai.sdk.orchestration.model.InputFilteringConfig;
7+
import com.sap.ai.sdk.orchestration.model.InputTranslationModuleConfig;
78
import com.sap.ai.sdk.orchestration.model.LLMModuleConfig;
89
import com.sap.ai.sdk.orchestration.model.MaskingModuleConfig;
910
import com.sap.ai.sdk.orchestration.model.OutputFilteringConfig;
11+
import com.sap.ai.sdk.orchestration.model.OutputTranslationModuleConfig;
1012
import com.sap.ai.sdk.orchestration.model.TemplatingModuleConfig;
1113
import java.util.ArrayList;
1214
import java.util.Arrays;
@@ -94,6 +96,10 @@ public class OrchestrationModuleConfig {
9496
*/
9597
@Nullable GroundingModuleConfig groundingConfig;
9698

99+
@Nullable InputTranslationModuleConfig inputTranslationConfig;
100+
101+
@Nullable OutputTranslationModuleConfig outputTranslationConfig;
102+
97103
/**
98104
* Creates a new configuration with the given LLM configuration.
99105
*

sample-code/spring-app/src/main/java/com/sap/ai/sdk/app/controllers/OrchestrationController.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,4 +291,14 @@ Object localPromptTemplate(@RequestParam(value = "format", required = false) fin
291291
}
292292
return response.getContent();
293293
}
294+
295+
@GetMapping("/translation")
296+
@Nonnull
297+
Object translation(@RequestParam(value = "format", required = false) final String format) {
298+
final var response = service.translation();
299+
if ("json".equals(format)) {
300+
return response;
301+
}
302+
return response.getContent();
303+
}
294304
}

sample-code/spring-app/src/main/java/com/sap/ai/sdk/app/services/OrchestrationService.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GEMINI_1_5_FLASH;
44
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_4O_MINI;
55
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.TEMPERATURE;
6+
import static com.sap.ai.sdk.orchestration.model.SAPDocumentTranslation.TypeEnum.SAP_DOCUMENT_TRANSLATION;
67

78
import com.fasterxml.jackson.annotation.JsonProperty;
89
import com.sap.ai.sdk.core.AiCoreService;
@@ -26,6 +27,8 @@
2627
import com.sap.ai.sdk.orchestration.model.GroundingFilterSearchConfiguration;
2728
import com.sap.ai.sdk.orchestration.model.LlamaGuard38b;
2829
import com.sap.ai.sdk.orchestration.model.ResponseFormatText;
30+
import com.sap.ai.sdk.orchestration.model.SAPDocumentTranslation;
31+
import com.sap.ai.sdk.orchestration.model.SAPDocumentTranslationConfig;
2932
import com.sap.ai.sdk.orchestration.model.SearchDocumentKeyValueListPair;
3033
import com.sap.ai.sdk.orchestration.model.SearchSelectOptionEnum;
3134
import com.sap.ai.sdk.orchestration.model.Template;
@@ -499,9 +502,6 @@ public OrchestrationChatResponse templateFromPromptRegistryById(@Nonnull final S
499502
@Nonnull
500503
public OrchestrationChatResponse templateFromPromptRegistryByScenario(
501504
@Nonnull final String topic) {
502-
final var llmWithImageSupportConfig =
503-
new OrchestrationModuleConfig().withLlmConfig(GPT_4O_MINI);
504-
505505
val template = TemplateConfig.reference().byScenario("test").name("test").version("0.0.1");
506506
val configWithTemplate = config.withTemplateConfig(template);
507507

@@ -531,4 +531,33 @@ public OrchestrationChatResponse localPromptTemplate(@Nonnull final String promp
531531

532532
return client.chatCompletion(prompt, configWithTemplate);
533533
}
534+
535+
/**
536+
* Chat request to an LLM through the Orchestration service using translation.
537+
*
538+
* @return the assistant response object
539+
*/
540+
@Nonnull
541+
public OrchestrationChatResponse translation() {
542+
val prompt =
543+
new OrchestrationPrompt(
544+
"Quelle est la couleur de la tour Eiffel? Et en quelle langue tu me parles maintenant?");
545+
// list of supported language pairs
546+
// https://help.sap.com/docs/translation-hub/sap-translation-hub/supported-languages?version=Cloud#translation-provider-sap-machine-translation
547+
val configWithTranslation =
548+
config
549+
.withInputTranslationConfig(
550+
SAPDocumentTranslation.create()
551+
.type(SAP_DOCUMENT_TRANSLATION)
552+
.config(SAPDocumentTranslationConfig.create().targetLanguage("en-US")))
553+
.withOutputTranslationConfig(
554+
SAPDocumentTranslation.create()
555+
.type(SAP_DOCUMENT_TRANSLATION)
556+
.config(
557+
SAPDocumentTranslationConfig.create()
558+
.targetLanguage("de-DE")
559+
.sourceLanguage("en-US"))); // optional source language
560+
561+
return client.chatCompletion(prompt, configWithTranslation);
562+
}
534563
}

sample-code/spring-app/src/main/resources/static/index.html

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -509,18 +509,40 @@ <h2>Orchestration</h2>
509509
</div>
510510
</div>
511511
</li>
512-
<li class="list-group-item">
513-
<div class="info-tooltip">
514-
<button type="submit" formaction="/orchestration/localPromptTemplate"
515-
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
516-
<code>/orchestration/localPromptTemplate</code>
517-
</button>
518-
<div class="tooltip-content">
519-
Chat request to an LLM through the Orchestration service using a local template file.
512+
<li class="list-group-item">
513+
<div class="info-tooltip">
514+
<button type="submit"
515+
formaction="/orchestration/localPromptTemplate"
516+
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
517+
<code>/orchestration/localPromptTemplate</code>
518+
</button>
519+
<div class="tooltip-content">
520+
Chat request to an LLM through the Orchestration service
521+
using a local template file.
522+
</div>
520523
</div>
521-
</div>
522-
</li>
523-
</ul>
524+
</li>
525+
</ul>
526+
</details>
527+
<br>
528+
<details>
529+
<summary><h5 style="display:inline-block">Translation</h5>
530+
</summary>
531+
<ul class="list-group">
532+
<li class="list-group-item">
533+
<div class="info-tooltip">
534+
<button type="submit"
535+
formaction="/orchestration/translation"
536+
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
537+
<code>/orchestration/translation</code>
538+
</button>
539+
<div class="tooltip-content">
540+
French question translated to English, sent to LLM, then
541+
translated to German.
542+
</div>
543+
</div>
544+
</li>
545+
</ul>
524546
</details>
525547
</div>
526548
</div>
@@ -710,7 +732,8 @@ <h5 class="mb-1">Orchestration Integration</h5>
710732
<code>/spring-ai-orchestration/inputFiltering/ALLOW_SAFE</code>
711733
</button>
712734
<div class="tooltip-content">
713-
Apply strict input filtering for a request to orchestration using the SpringAI integration.
735+
Apply strict input filtering for a request to orchestration
736+
using the SpringAI integration.
714737
</div>
715738
</div>
716739
</li>
@@ -722,7 +745,8 @@ <h5 class="mb-1">Orchestration Integration</h5>
722745
<code>/spring-ai-orchestration/outputFiltering/ALLOW_SAFE</code>
723746
</button>
724747
<div class="tooltip-content">
725-
Apply strict output filtering for a request to orchestration using the SpringAI integration.
748+
Apply strict output filtering for a request to orchestration
749+
using the SpringAI integration.
726750
</div>
727751
</div>
728752
</li>

0 commit comments

Comments
 (0)