Skip to content

Commit ad8dbb0

Browse files
committed
Updates
2 parents 27e56d5 + 0ce84a3 commit ad8dbb0

File tree

11 files changed

+335
-359
lines changed

11 files changed

+335
-359
lines changed

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package com.sap.ai.sdk.orchestration;
22

33
import com.sap.ai.sdk.orchestration.client.model.CompletionPostRequest;
4-
import com.sap.ai.sdk.orchestration.client.model.FilteringModuleConfig;
5-
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
64
import com.sap.ai.sdk.orchestration.client.model.ModuleConfigs;
75
import com.sap.ai.sdk.orchestration.client.model.TemplatingModuleConfig;
6+
import io.vavr.control.Option;
87
import java.util.ArrayList;
98
import java.util.List;
109
import javax.annotation.Nonnull;
1110
import javax.annotation.Nullable;
12-
13-
import io.vavr.control.Option;
1411
import lombok.AccessLevel;
1512
import lombok.NoArgsConstructor;
1613
import lombok.val;
@@ -23,14 +20,16 @@ static CompletionPostRequest toCompletionPostRequestDto(
2320
@Nonnull final OrchestrationPrompt prompt, @Nonnull final OrchestrationModuleConfig config) {
2421
val template = toTemplateModuleConfigDto(prompt, config.getTemplate());
2522
// note that the config is immutable and implicitly copied here
26-
// copying is required here, to not alter the original config object, which might be reused for subsequent requests
23+
// copying is required here, to not alter the original config object, which might be reused for
24+
// subsequent requests
2725
val configCopy = config.withTemplate(template);
2826

2927
return CompletionPostRequest.create()
3028
.orchestrationConfig(
3129
com.sap.ai.sdk.orchestration.client.model.OrchestrationConfig.create()
3230
.moduleConfigurations(toModuleConfigsDto(configCopy)))
33-
.inputParams(prompt.getTemplateParameters());
31+
.inputParams(prompt.getTemplateParameters())
32+
.messagesHistory(prompt.getMessagesHistory());
3433
}
3534

3635
@Nonnull
@@ -56,22 +55,16 @@ static TemplatingModuleConfig toTemplateModuleConfigDto(
5655
@Nonnull
5756
static ModuleConfigs toModuleConfigsDto(@Nonnull final OrchestrationModuleConfig config) {
5857
val llmConfig =
59-
Option.of(config.getLlmConfig()).getOrElseThrow(() -> new IllegalStateException("LLM config is required."));
58+
Option.of(config.getLlmConfig())
59+
.getOrElseThrow(() -> new IllegalStateException("LLM config is required."));
6060

6161
//noinspection DataFlowIssue the template is always non-null here
6262
val moduleConfig =
6363
ModuleConfigs.create()
6464
.llmModuleConfig(llmConfig)
6565
.templatingModuleConfig(config.getTemplate());
6666

67-
val maybeInputFilter = Option.of(config.getInputContentFilter());
68-
val maybeOutputFilter = Option.of(config.getOutputContentFilter());
69-
70-
if (maybeInputFilter.isDefined() || maybeOutputFilter.isDefined()) {
71-
val filter = FilteringModuleConfig.create();
72-
maybeInputFilter.forEach(filter::input);
73-
maybeOutputFilter.forEach(filter::output);
74-
}
67+
Option.of(config.getFilteringConfig()).forEach(moduleConfig::filteringModuleConfig);
7568
Option.of(config.getMaskingConfig()).forEach(moduleConfig::maskingModuleConfig);
7669

7770
return moduleConfig;
Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.sap.ai.sdk.orchestration;
22

3-
import javax.annotation.Nullable;
4-
5-
import com.sap.ai.sdk.orchestration.client.model.InputFilteringConfig;
3+
import com.sap.ai.sdk.orchestration.client.model.FilteringModuleConfig;
64
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
75
import com.sap.ai.sdk.orchestration.client.model.MaskingModuleConfig;
8-
import com.sap.ai.sdk.orchestration.client.model.OutputFilteringConfig;
96
import com.sap.ai.sdk.orchestration.client.model.TemplatingModuleConfig;
7+
import javax.annotation.Nullable;
108
import lombok.AccessLevel;
119
import lombok.AllArgsConstructor;
1210
import lombok.NoArgsConstructor;
@@ -37,31 +35,17 @@ public class OrchestrationModuleConfig {
3735
/**
3836
* The configured language model settings. This configuration is required when executing requests.
3937
*/
40-
@Nullable
41-
LLMModuleConfig llmConfig;
38+
@Nullable LLMModuleConfig llmConfig;
4239

4340
/**
4441
* A template to be populated with input parameters. Upon request execution, this template will be
4542
* enhanced with any messages and parameter values from {@link OrchestrationPrompt}.
4643
*/
47-
@Nullable
48-
TemplatingModuleConfig template;
49-
50-
/**
51-
* A masking configuration to pseudonymous or anonymize sensitive data in the input.
52-
*/
53-
@Nullable
54-
MaskingModuleConfig maskingConfig;
44+
@Nullable TemplatingModuleConfig template;
5545

56-
/**
57-
* A content filter to filter the prompt.
58-
*/
59-
@Nullable
60-
InputFilteringConfig inputContentFilter;
46+
/** A masking configuration to pseudonymous or anonymize sensitive data in the input. */
47+
@Nullable MaskingModuleConfig maskingConfig;
6148

62-
/**
63-
* A content filter to filter the language model response.
64-
*/
65-
@Nullable
66-
OutputFilteringConfig outputContentFilter;
67-
}
49+
/** A content filter to filter the prompt. */
50+
@Nullable FilteringModuleConfig filteringConfig;
51+
}

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@
66
import java.util.Arrays;
77
import java.util.List;
88
import java.util.Map;
9+
import java.util.TreeMap;
910
import javax.annotation.Nonnull;
1011
import lombok.AccessLevel;
11-
import lombok.AllArgsConstructor;
1212
import lombok.Getter;
1313
import lombok.Value;
14-
import lombok.val;
1514

1615
/**
1716
* Represents a request that can be sent to the orchestration service, containing messages and
@@ -22,18 +21,18 @@
2221
*/
2322
@Value
2423
@Getter(AccessLevel.PACKAGE)
25-
@AllArgsConstructor
2624
public class OrchestrationPrompt {
27-
@Nonnull List<ChatMessage> messages;
28-
@Nonnull Map<String, String> templateParameters;
25+
@Nonnull List<ChatMessage> messages = new ArrayList<>();
26+
@Nonnull Map<String, String> templateParameters = new TreeMap<>();
27+
@Nonnull List<ChatMessage> messagesHistory = new ArrayList<>();
2928

3029
/**
3130
* Initialize a prompt with the given user message.
3231
*
3332
* @param message A user message.
3433
*/
3534
public OrchestrationPrompt(@Nonnull final String message) {
36-
this(List.of(ChatMessage.create().role("user").content(message)), Map.of());
35+
messages.add(ChatMessage.create().role("user").content(message));
3736
}
3837

3938
/**
@@ -44,19 +43,28 @@ public OrchestrationPrompt(@Nonnull final String message) {
4443
*/
4544
public OrchestrationPrompt(
4645
@Nonnull final ChatMessage message, @Nonnull final ChatMessage... messages) {
47-
val allMessages = new ArrayList<ChatMessage>();
48-
allMessages.add(message);
49-
allMessages.addAll(Arrays.asList(messages));
50-
this.messages = allMessages;
51-
this.templateParameters = Map.of();
46+
this.messages.add(message);
47+
this.messages.addAll(Arrays.asList(messages));
5248
}
5349

5450
/**
5551
* Initialize a prompt based on template variables.
5652
*
5753
* @param inputParams The input parameters as entries of template variables and their contents.
5854
*/
59-
public OrchestrationPrompt(@Nonnull final Map<String, String> inputParams) {
60-
this(List.of(), inputParams);
55+
public OrchestrationPrompt(
56+
@Nonnull final Map<String, String> inputParams, @Nonnull final ChatMessage... messages) {
57+
this.templateParameters.putAll(inputParams);
58+
this.messages.addAll(Arrays.asList(messages));
59+
}
60+
61+
/**
62+
* Add a chat history to this prompt.
63+
*
64+
* @param messagesHistory The chat history to add.
65+
*/
66+
public void setMessageHistory(@Nonnull final List<ChatMessage> messagesHistory) {
67+
this.messagesHistory.clear();
68+
this.messagesHistory.addAll(messagesHistory);
6169
}
6270
}

orchestration/src/test/java/com/sap/ai/sdk/orchestration/ModuleConfigFactoryTest.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
package com.sap.ai.sdk.orchestration;
22

3+
import static com.sap.ai.sdk.orchestration.OrchestrationUnitTest.LLM_CONFIG;
34
import static org.assertj.core.api.Assertions.assertThat;
45
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5-
import static org.mockito.Mockito.mock;
66

77
import com.sap.ai.sdk.orchestration.client.model.ChatMessage;
8-
import com.sap.ai.sdk.orchestration.client.model.FilteringModuleConfig;
9-
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
10-
import com.sap.ai.sdk.orchestration.client.model.MaskingModuleConfig;
11-
import com.sap.ai.sdk.orchestration.client.model.ModuleConfigs;
128
import com.sap.ai.sdk.orchestration.client.model.TemplatingModuleConfig;
9+
import java.util.List;
1310
import java.util.Map;
1411
import org.junit.jupiter.api.Test;
1512

1613
class ModuleConfigFactoryTest {
1714

1815
@Test
1916
void testThrowsOnMissingLlmConfig() {
20-
assertThatThrownBy(() -> ModuleConfigFactory.toModuleConfigsDto(new OrchestrationModuleConfig()))
17+
assertThatThrownBy(
18+
() -> ModuleConfigFactory.toModuleConfigsDto(new OrchestrationModuleConfig()))
2119
.isInstanceOf(IllegalStateException.class)
22-
.hasMessageContaining("A prompt is required");
20+
.hasMessageContaining("LLM config is required");
2321
}
2422

2523
@Test
@@ -65,4 +63,17 @@ void testMergingTemplateConfig() {
6563

6664
assertThat(actual).isEqualTo(expected);
6765
}
66+
67+
@Test
68+
void testMessagesHistory() {
69+
var systemMessage = ChatMessage.create().role("system").content("foo");
70+
71+
var prompt = new OrchestrationPrompt("bar");
72+
prompt.setMessageHistory(List.of(systemMessage));
73+
var actual =
74+
ModuleConfigFactory.toCompletionPostRequestDto(
75+
prompt, new OrchestrationModuleConfig().withLlmConfig(LLM_CONFIG));
76+
77+
assertThat(actual.getMessagesHistory()).containsExactly(systemMessage);
78+
}
6879
}

0 commit comments

Comments
 (0)