Skip to content

Commit 7a6d117

Browse files
committed
add unit tests
1 parent 435aac5 commit 7a6d117

File tree

7 files changed

+96
-2
lines changed

7 files changed

+96
-2
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import javax.annotation.Nullable;
2525
import lombok.AccessLevel;
2626
import lombok.NoArgsConstructor;
27+
import lombok.extern.slf4j.Slf4j;
2728
import lombok.val;
2829

2930
/** Factory to create all data objects from an orchestration configuration. */
31+
@Slf4j
3032
@NoArgsConstructor(access = AccessLevel.NONE)
3133
final class ConfigToRequestTransformer {
3234
@Nonnull
@@ -129,6 +131,10 @@ static CompletionPostRequest fromReferenceToCompletionPostRequest(
129131
List<ChatMessage> messageHistory = List.of();
130132
Map<String, String> placeholders = Map.of();
131133
if (prompt != null) {
134+
if (!prompt.getMessages().isEmpty()) {
135+
log.debug(
136+
"Messages in prompts are ignored when using Orchestration configs via reference. Change the Orchestration config instead.");
137+
}
132138
messageHistory =
133139
prompt.getMessagesHistory().stream().map(Message::createChatMessage).toList();
134140
placeholders = prompt.getTemplateParameters();

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.util.function.Supplier;
2626
import java.util.stream.Stream;
2727
import javax.annotation.Nonnull;
28+
import javax.annotation.Nullable;
29+
2830
import lombok.RequiredArgsConstructor;
2931
import lombok.extern.slf4j.Slf4j;
3032
import lombok.val;
@@ -168,7 +170,7 @@ public CompletionPostResponse executeRequest(@Nonnull final CompletionPostReques
168170

169171
@Beta
170172
public OrchestrationChatResponse executeRequestFromReference(
171-
final OrchestrationPrompt prompt, final OrchestrationConfigReference reference) {
173+
@Nullable final OrchestrationPrompt prompt, @Nonnull final OrchestrationConfigReference reference) {
172174
var request =
173175
ConfigToRequestTransformer.fromReferenceToCompletionPostRequest(prompt, reference);
174176
var response = executeRequest(request);

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,6 +1347,58 @@ void testTemplateFromInputThrows() {
13471347
.hasMessageContaining("Failed to deserialize");
13481348
}
13491349

1350+
@Test
1351+
void testExecuteFromReferenceById() {
1352+
stubFor(
1353+
post(anyUrl())
1354+
.willReturn(
1355+
aResponse()
1356+
.withBodyFile("templatingResponse.json")
1357+
.withHeader("Content-Type", "application/json")));
1358+
1359+
var reference = OrchestrationConfigReference.fromId("test-id");
1360+
final var response = client.executeRequestFromReference(null, reference);
1361+
1362+
final String expectedRequest = fileLoaderStr.apply("orchConfigByIdRequest.json");
1363+
verify(postRequestedFor(anyUrl()).withRequestBody(equalToJson(expectedRequest)));
1364+
}
1365+
1366+
@Test
1367+
void testExecuteFromReferenceBySNV() {
1368+
stubFor(
1369+
post(anyUrl())
1370+
.willReturn(
1371+
aResponse()
1372+
.withBodyFile("templatingResponse.json")
1373+
.withHeader("Content-Type", "application/json")));
1374+
1375+
var reference =
1376+
OrchestrationConfigReference.fromScenarioNameVersion("scenario", "name", "0.0.1");
1377+
final var response = client.executeRequestFromReference(null, reference);
1378+
1379+
final String expectedRequest = fileLoaderStr.apply("orchConfigBySNVRequest.json");
1380+
verify(postRequestedFor(anyUrl()).withRequestBody(equalToJson(expectedRequest)));
1381+
}
1382+
1383+
@Test
1384+
void testExecuteFromReferenceWithMessageHistoryAndInputParams() {
1385+
stubFor(
1386+
post(anyUrl())
1387+
.willReturn(
1388+
aResponse()
1389+
.withBodyFile("templatingResponse.json")
1390+
.withHeader("Content-Type", "application/json")));
1391+
1392+
var reference =
1393+
OrchestrationConfigReference.fromScenarioNameVersion("scenario", "name", "0.0.1");
1394+
List<Message> history = List.of(new SystemMessage("System Message"));
1395+
var prompt = new OrchestrationPrompt(Map.of("placeholder", "value")).messageHistory(history);
1396+
final var response = client.executeRequestFromReference(prompt, reference);
1397+
1398+
final String expectedRequest = fileLoaderStr.apply("orchConfigByRequestHistoryParams.json");
1399+
verify(postRequestedFor(anyUrl()).withRequestBody(equalToJson(expectedRequest)));
1400+
}
1401+
13501402
@Test
13511403
void testGetAllMessages() {
13521404
stubFor(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"config_ref": {
3+
"id": "test-id"
4+
},
5+
"placeholder_values": {},
6+
"messages_history": []
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"config_ref" : {
3+
"scenario" : "scenario",
4+
"name" : "name",
5+
"version" : "0.0.1"
6+
},
7+
"placeholder_values" : {
8+
"placeholder" : "value"
9+
},
10+
"messages_history" : [ {
11+
"role" : "system",
12+
"content" : "System Message"
13+
} ]
14+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"config_ref": {
3+
"scenario": "scenario",
4+
"name": "name",
5+
"version": "0.0.1"
6+
},
7+
"placeholder_values": {},
8+
"messages_history": []
9+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.fasterxml.jackson.annotation.JsonProperty;
99
import com.sap.ai.sdk.core.AiCoreService;
10+
import com.sap.ai.sdk.orchestration.AssistantMessage;
1011
import com.sap.ai.sdk.orchestration.AzureContentFilter;
1112
import com.sap.ai.sdk.orchestration.AzureFilterThreshold;
1213
import com.sap.ai.sdk.orchestration.DpiMasking;
@@ -23,6 +24,7 @@
2324
import com.sap.ai.sdk.orchestration.OrchestrationModuleConfig;
2425
import com.sap.ai.sdk.orchestration.OrchestrationPrompt;
2526
import com.sap.ai.sdk.orchestration.ResponseJsonSchema;
27+
import com.sap.ai.sdk.orchestration.SystemMessage;
2628
import com.sap.ai.sdk.orchestration.TemplateConfig;
2729
import com.sap.ai.sdk.orchestration.model.DPIEntities;
2830
import com.sap.ai.sdk.orchestration.model.DataRepositoryType;
@@ -37,6 +39,7 @@
3739
import com.sap.ai.sdk.orchestration.model.SAPDocumentTranslationOutputTargetLanguage;
3840
import com.sap.ai.sdk.orchestration.model.SearchDocumentKeyValueListPair;
3941
import com.sap.ai.sdk.orchestration.model.SearchSelectOptionEnum;
42+
import com.sap.ai.sdk.orchestration.model.SystemChatMessage;
4043
import com.sap.ai.sdk.orchestration.model.Template;
4144
import java.io.IOException;
4245
import java.util.List;
@@ -676,7 +679,8 @@ public OrchestrationChatResponse executeConfigFromReference() {
676679
var testReference =
677680
OrchestrationConfigReference.fromScenarioNameVersion(
678681
"sdk-test-scenario", "test-config-for-OrchestrationTest", "0.0.1");
679-
OrchestrationPrompt testPrompt = new OrchestrationPrompt(Map.of("phrase", "Hello World"));
682+
List<Message> history = List.of(new SystemMessage("Start every sentence with an emoji."));
683+
OrchestrationPrompt testPrompt = new OrchestrationPrompt(Map.of("phrase", "Hello World")).messageHistory(history);
680684
return client.executeRequestFromReference(testPrompt, testReference);
681685
}
682686

0 commit comments

Comments
 (0)