Skip to content

Commit 435aac5

Browse files
committed
add e2e tests
1 parent 7039c85 commit 435aac5

File tree

8 files changed

+105
-19
lines changed

8 files changed

+105
-19
lines changed

core-services/prompt-registry/pom.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@
9797
<groupId>com.google.code.findbugs</groupId>
9898
<artifactId>jsr305</artifactId>
9999
</dependency>
100-
<dependency>
101-
<groupId>com.fasterxml.jackson.dataformat</groupId>
102-
<artifactId>jackson-dataformat-yaml</artifactId>
103-
</dependency>
100+
<dependency>
101+
<groupId>com.fasterxml.jackson.dataformat</groupId>
102+
<artifactId>jackson-dataformat-yaml</artifactId>
103+
</dependency>
104104
<!-- scope "provided" -->
105105
<dependency>
106106
<groupId>org.projectlombok</groupId>

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
@@ -151,6 +151,10 @@ static CompletionPostRequest fromReferenceToCompletionPostRequest(
151151
.scenario(reference.getScenario())
152152
.name(reference.getName())
153153
.version(reference.getVersion()));
154+
((CompletionRequestConfigurationReferenceByNameScenarioVersion) request)
155+
.setMessagesHistory(messageHistory);
156+
((CompletionRequestConfigurationReferenceByNameScenarioVersion) request)
157+
.setPlaceholderValues(placeholders);
154158
}
155159
return request;
156160
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
import com.sap.ai.sdk.orchestration.model.CompletionPostRequest;
1212
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
1313
import com.sap.ai.sdk.orchestration.model.CompletionRequestConfiguration;
14-
import com.sap.ai.sdk.orchestration.model.CompletionRequestConfigurationReferenceById;
15-
import com.sap.ai.sdk.orchestration.model.CompletionRequestConfigurationReferenceByIdConfigRef;
1614
import com.sap.ai.sdk.orchestration.model.EmbeddingsPostRequest;
1715
import com.sap.ai.sdk.orchestration.model.EmbeddingsPostResponse;
1816
import com.sap.ai.sdk.orchestration.model.GlobalStreamOptions;
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
11
package com.sap.ai.sdk.orchestration;
22

33
import com.google.common.annotations.Beta;
4+
import javax.annotation.Nonnull;
45
import lombok.AccessLevel;
56
import lombok.AllArgsConstructor;
67
import lombok.Value;
78

8-
import javax.annotation.Nonnull;
9-
109
// JONAS: Making this a sealed interface permitting 2 classes for ID and SNV seemed like an overkill
1110
// JONAS: Not a record because I do not want a public all-args constructor
11+
// JONAS: Is string correct for ID? (Use UUID?)
12+
// JONAS: Split SNV into 3 methods?
1213

1314
@Value
1415
@AllArgsConstructor(access = AccessLevel.PRIVATE)
1516
@Beta
1617
public class OrchestrationConfigReference {
1718
String id;
18-
String name;
1919
String scenario;
20+
String name;
2021
String version;
2122

2223
public static OrchestrationConfigReference fromId(@Nonnull final String id) {
2324
return new OrchestrationConfigReference(id, null, null, null);
2425
}
2526

26-
public static OrchestrationConfigReference fromScenarioNameVersion(@Nonnull final String scenario, @Nonnull final String name, @Nonnull final String version) {
27+
public static OrchestrationConfigReference fromScenarioNameVersion(
28+
@Nonnull final String scenario, @Nonnull final String name, @Nonnull final String version) {
2729
return new OrchestrationConfigReference(null, scenario, name, version);
2830
}
2931
}

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
@@ -361,4 +361,14 @@ Object embedding(@RequestParam(value = "format", required = false) final String
361361
}
362362
return response.getEmbeddingVectors();
363363
}
364+
365+
@GetMapping("/configFromRegistry")
366+
@Nonnull
367+
Object configFromRegistry(@RequestParam(value = "format", required = false) final String format) {
368+
final var response = service.executeConfigFromReference();
369+
if ("json".equals(format)) {
370+
return response;
371+
}
372+
return response.getContent();
373+
}
364374
}

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -156,21 +156,23 @@ Generation promptRegistryToSpringAi() {
156156
return response != null ? response.getResult() : null;
157157
}
158158

159+
@GetMapping("/listOrchConfigs")
159160
OrchestrationConfigListResponse listOrchConfigs() {
160161
return orchConfigClient.listOrchestrationConfigs();
161162
}
162163

164+
@GetMapping("/createOrchConfig")
163165
OrchestrationConfigPostResponse createOrchConfig() {
164-
// JONAS: this is still the version used to build the config for the Orchestration test, change back to the version of the first commit to have correct test
165166
OrchestrationConfigPostRequest postRequest =
166167
OrchestrationConfigPostRequest.create()
167-
.name("test-config")
168+
.name(NAME)
168169
.version("0.0.1")
169170
.scenario("sdk-test-scenario")
170171
.spec(buildOrchestrationConfig());
171172
return orchConfigClient.createUpdateOrchestrationConfig(postRequest);
172173
}
173174

175+
@GetMapping("/deleteOrchConfig")
174176
List<OrchestrationConfigDeleteResponse> deleteOrchConfig() {
175177
final OrchestrationConfigListResponse configs = orchConfigClient.listOrchestrationConfigs();
176178

@@ -190,9 +192,8 @@ private OrchestrationConfig buildOrchestrationConfig() {
190192
Template.create()
191193
.template(
192194
UserChatMessage.create()
193-
.content(new UserChatMessageContent.InnerString("Create {{?number}} paraphrases of {{?phrase}}"))
194-
.role(UserChatMessage.RoleEnum.USER))
195-
.defaults(Map.of("number", "3")))
196-
.model(LLMModelDetails.create().name("gpt-4.1-nano"))));
195+
.content(new UserChatMessageContent.InnerString("message"))
196+
.role(UserChatMessage.RoleEnum.USER)))
197+
.model(LLMModelDetails.create().name("model-name"))));
197198
}
198199
}

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

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@
4343
import java.util.Map;
4444
import java.util.stream.Stream;
4545
import javax.annotation.Nonnull;
46+
47+
import com.sap.ai.sdk.prompt.registry.OrchestrationConfigClient;
48+
import com.sap.ai.sdk.prompt.registry.model.LLMModelDetails;
49+
import com.sap.ai.sdk.prompt.registry.model.ModuleConfigs;
50+
import com.sap.ai.sdk.prompt.registry.model.OrchestrationConfig;
51+
import com.sap.ai.sdk.prompt.registry.model.OrchestrationConfigPostRequest;
52+
import com.sap.ai.sdk.prompt.registry.model.PromptTemplatingModuleConfig;
53+
import com.sap.ai.sdk.prompt.registry.model.UserChatMessage;
54+
import com.sap.ai.sdk.prompt.registry.model.UserChatMessageContent;
4655
import lombok.Getter;
4756
import lombok.extern.slf4j.Slf4j;
4857
import lombok.val;
@@ -663,9 +672,47 @@ public OrchestrationEmbeddingResponse embed(@Nonnull final List<String> texts) {
663672
}
664673

665674
public OrchestrationChatResponse executeConfigFromReference() {
666-
String testID = "80299222-f576-4682-b3d9-0a5aaf9be92d";
667-
var testReference = OrchestrationConfigReference.fromId(testID);
675+
ensureOrchestrationConfigExists();
676+
var testReference =
677+
OrchestrationConfigReference.fromScenarioNameVersion(
678+
"sdk-test-scenario", "test-config-for-OrchestrationTest", "0.0.1");
668679
OrchestrationPrompt testPrompt = new OrchestrationPrompt(Map.of("phrase", "Hello World"));
669680
return client.executeRequestFromReference(testPrompt, testReference);
670681
}
682+
683+
private void ensureOrchestrationConfigExists() {
684+
OrchestrationConfigClient orchConfigClient = new OrchestrationConfigClient();
685+
if (!orchConfigExists("test-config-for-OrchestrationTest", orchConfigClient)) {
686+
OrchestrationConfigPostRequest postRequest =
687+
OrchestrationConfigPostRequest.create()
688+
.name("test-config-for-OrchestrationTest")
689+
.version("0.0.1")
690+
.scenario("sdk-test-scenario")
691+
.spec(buildOrchestrationConfig());
692+
orchConfigClient.createUpdateOrchestrationConfig(postRequest);
693+
}
694+
}
695+
696+
private boolean orchConfigExists(String configName, OrchestrationConfigClient orchConfigClient) {
697+
return orchConfigClient.listOrchestrationConfigs().getResources().stream()
698+
.anyMatch(resp -> resp.getName().equals(configName));
699+
}
700+
701+
private OrchestrationConfig buildOrchestrationConfig() {
702+
return OrchestrationConfig.create()
703+
.modules(
704+
ModuleConfigs.create()
705+
.promptTemplating(
706+
PromptTemplatingModuleConfig.create()
707+
.prompt(
708+
com.sap.ai.sdk.prompt.registry.model.Template.create()
709+
.template(
710+
UserChatMessage.create()
711+
.content(
712+
new UserChatMessageContent.InnerString(
713+
"Create {{?number}} paraphrases of {{?phrase}}"))
714+
.role(UserChatMessage.RoleEnum.USER))
715+
.defaults(Map.of("number", "3")))
716+
.model(LLMModelDetails.create().name("gpt-4.1-nano"))));
717+
}
671718
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ <h2>Orchestration</h2>
503503
</details>
504504
<br>
505505
<details>
506-
<summary><h5 style="display:inline-block">Template reference</h5>
506+
<summary><h5 style="display:inline-block">Template and Config Reference</h5>
507507
</summary>
508508
<ul class="list-group">
509509
<li class="list-group-item">
@@ -547,6 +547,18 @@ <h2>Orchestration</h2>
547547
</div>
548548
</div>
549549
</li>
550+
<li class="list-group-item">
551+
<div class="info-tooltip">
552+
<button type="submit"
553+
formaction="/orchestration/configFromRegistry"
554+
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
555+
<code>/orchestration/configFromRegistry</code>
556+
</button>
557+
<div class="tooltip-content">
558+
Chat request to an LLM using an Orchestration config stored in prompt registry.
559+
</div>
560+
</div>
561+
</li>
550562
</ul>
551563
</details>
552564
<br>
@@ -1108,6 +1120,18 @@ <h2>📚 Prompt Registry</h2>
11081120
</div>
11091121
</div>
11101122
</li>
1123+
<li class="list-group-item">
1124+
<div class="info-tooltip">
1125+
<button type="submit"
1126+
formaction="/prompt-registry/listOrchConfigs"
1127+
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
1128+
<code>/prompt-registry/listOrchConfigs</code>
1129+
</button>
1130+
<div class="tooltip-content">
1131+
List all Orchestration Configs.
1132+
</div>
1133+
</div>
1134+
</li>
11111135
</ul>
11121136
</div>
11131137
</div>

0 commit comments

Comments
 (0)