Skip to content

Commit 2653c1f

Browse files
committed
Doing Unit Test and moving method to Prompt Registry.
1 parent 63b91f1 commit 2653c1f

File tree

10 files changed

+146
-102
lines changed

10 files changed

+146
-102
lines changed

core-services/prompt-registry/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@
6464
<groupId>org.springframework</groupId>
6565
<artifactId>spring-web</artifactId>
6666
</dependency>
67+
<dependency>
68+
<groupId>org.springframework.ai</groupId>
69+
<artifactId>spring-ai-model</artifactId>
70+
<optional>true</optional>
71+
</dependency>
6772
<dependency>
6873
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
6974
<artifactId>cloudplatform-connectivity</artifactId>

core-services/prompt-registry/src/main/java/com/sap/ai/sdk/prompt/registry/model/PromptTemplateSubstitutionResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public class PromptTemplateSubstitutionResponse
4040
private final Map<String, Object> cloudSdkCustomFields = new LinkedHashMap<>();
4141

4242
/** Default constructor for PromptTemplateSubstitutionResponse. */
43-
protected PromptTemplateSubstitutionResponse() {}
43+
public PromptTemplateSubstitutionResponse() {}
4444

4545
/**
4646
* Set the parsedPrompt of this {@link PromptTemplateSubstitutionResponse} instance and return the
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.sap.ai.sdk.prompt.registry.spring;
2+
3+
import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
4+
import com.sap.ai.sdk.core.AiCoreService;
5+
import com.sap.ai.sdk.prompt.registry.PromptClient;
6+
import com.sap.ai.sdk.prompt.registry.model.PromptTemplateSubstitutionRequest;
7+
import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination;
8+
import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
9+
import lombok.val;
10+
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
import org.springframework.ai.chat.messages.Message;
13+
import org.springframework.ai.chat.messages.SystemMessage;
14+
import org.springframework.ai.chat.messages.UserMessage;
15+
16+
import java.util.List;
17+
import java.util.Map;
18+
19+
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
20+
import static org.assertj.core.api.Assertions.assertThat;
21+
22+
public class SpringUtilTest {
23+
@RegisterExtension
24+
private static final WireMockExtension WM =
25+
WireMockExtension.newInstance().options(wireMockConfig().dynamicPort()).build();
26+
27+
private final HttpDestination DESTINATION = DefaultHttpDestination.builder(WM.baseUrl()).build();
28+
private final AiCoreService SERVICE = new AiCoreService().withBaseDestination(DESTINATION);
29+
30+
@Test
31+
void testPipelines() {
32+
var client = new PromptClient(SERVICE);
33+
val promptResponse =
34+
client.parsePromptTemplateByNameVersion(
35+
"categorization",
36+
"0.0.1",
37+
"java-e2e-test",
38+
"default",
39+
false,
40+
PromptTemplateSubstitutionRequest.create()
41+
.inputParams(Map.of("inputExample", "I love football")));
42+
43+
List<Message> messages = SpringUtil.promptRegistryToSpringAi(promptResponse);
44+
assertThat(messages)
45+
.isEqualTo(
46+
List.of(
47+
new SystemMessage(
48+
"You classify input text into the two following categories: Finance, Tech, Sports, Politics"),
49+
new UserMessage("I love football")));
50+
}
51+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"request": {
3+
"method": "POST",
4+
"url": "/v2/lm/scenarios/categorization/promptTemplates/java-e2e-test/versions/0.0.1/substitution?metadata=false"
5+
},
6+
"response": {
7+
"status": 200,
8+
"headers": {
9+
"Content-Type": "application/json"
10+
},
11+
"jsonBody": {
12+
"parsedPrompt": [
13+
{
14+
"role": "system",
15+
"content": "You classify input text into the two following categories: Finance, Tech, Sports, Politics"
16+
},
17+
{
18+
"role": "user",
19+
"content": "I love football"
20+
}
21+
]
22+
}
23+
}
24+
}
25+
26+

orchestration/src/main/java/com/sap/ai/sdk/orchestration/spring/OrchestrationSpringUtil.java

Lines changed: 0 additions & 66 deletions
This file was deleted.

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.sap.ai.sdk.app.controllers;
22

3+
import com.sap.ai.sdk.foundationmodels.openai.OpenAiClient;
4+
import com.sap.ai.sdk.foundationmodels.openai.OpenAiModel;
5+
import com.sap.ai.sdk.foundationmodels.openai.spring.OpenAiChatModel;
36
import com.sap.ai.sdk.prompt.registry.PromptClient;
47
import com.sap.ai.sdk.prompt.registry.model.PromptTemplateDeleteResponse;
58
import com.sap.ai.sdk.prompt.registry.model.PromptTemplateListResponse;
@@ -13,12 +16,27 @@
1316
import java.io.IOException;
1417
import java.util.List;
1518
import java.util.Map;
19+
20+
import com.sap.ai.sdk.prompt.registry.spring.SpringUtil;
21+
import lombok.val;
22+
import org.springframework.ai.chat.client.ChatClient;
23+
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
24+
import org.springframework.ai.chat.memory.InMemoryChatMemoryRepository;
25+
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
26+
import org.springframework.ai.chat.messages.Message;
27+
import org.springframework.ai.chat.model.ChatModel;
28+
import org.springframework.ai.chat.model.ChatResponse;
29+
import org.springframework.ai.chat.model.Generation;
30+
import org.springframework.ai.chat.prompt.Prompt;
1631
import org.springframework.core.io.ClassPathResource;
1732
import org.springframework.core.io.Resource;
1833
import org.springframework.web.bind.annotation.GetMapping;
1934
import org.springframework.web.bind.annotation.RequestMapping;
35+
import org.springframework.web.bind.annotation.RequestParam;
2036
import org.springframework.web.bind.annotation.RestController;
2137

38+
import javax.annotation.Nullable;
39+
2240
/** Endpoint for Prompt Registry operations */
2341
@SuppressWarnings("unused") // debug class that doesn't need to be tested
2442
@RestController
@@ -99,4 +117,29 @@ List<PromptTemplateDeleteResponse> deleteTemplate() {
99117
.map(template -> client.deletePromptTemplate(template.getId()))
100118
.toList();
101119
}
120+
121+
@GetMapping("/promptRegistryToSpringAi")
122+
Generation promptRegistryToSpringAi() {
123+
ChatModel openAiClient = new OpenAiChatModel(OpenAiClient.forModel(OpenAiModel.GPT_4O_MINI));
124+
val repository = new InMemoryChatMemoryRepository();
125+
val memory = MessageWindowChatMemory.builder().chatMemoryRepository(repository).build();
126+
val advisor = MessageChatMemoryAdvisor.builder(memory).build();
127+
val cl = ChatClient.builder(openAiClient).defaultAdvisors(advisor).build();
128+
129+
val promptResponse =
130+
new PromptClient()
131+
.parsePromptTemplateByNameVersion(
132+
"categorization",
133+
"0.0.1",
134+
"java-e2e-test",
135+
"default",
136+
false,
137+
PromptTemplateSubstitutionRequest.create()
138+
.inputParams(Map.of("inputExample", "I love football")));
139+
140+
List<Message> messages = SpringUtil.promptRegistryToSpringAi(promptResponse);
141+
val prompt = new Prompt(messages);
142+
val response = cl.prompt(prompt).call().chatResponse();
143+
return response != null ? response.getResult() : null;
144+
}
102145
}

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

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -275,32 +275,4 @@ public Translation responseFormat() {
275275

276276
return cl.prompt(prompt).call().entity(Translation.class);
277277
}
278-
279-
/**
280-
* Get a prompt template by name and input parameters.
281-
*
282-
* @return the chat response containing the prompt template
283-
*/
284-
@Nullable
285-
public ChatResponse promptRegistryToSpringAi() {
286-
val repository = new InMemoryChatMemoryRepository();
287-
val memory = MessageWindowChatMemory.builder().chatMemoryRepository(repository).build();
288-
val advisor = MessageChatMemoryAdvisor.builder(memory).build();
289-
val cl = ChatClient.builder(client).defaultAdvisors(advisor).build();
290-
291-
val promptResponse =
292-
new PromptClient()
293-
.parsePromptTemplateByNameVersion(
294-
"categorization",
295-
"0.0.1",
296-
"java-e2e-test",
297-
"default",
298-
false,
299-
PromptTemplateSubstitutionRequest.create()
300-
.inputParams(Map.of("inputExample", "I love football")));
301-
302-
List<Message> messages = SpringUtil.promptRegistryToSpringAi(promptResponse);
303-
val prompt = new Prompt(messages, defaultOptions);
304-
return cl.prompt(prompt).call().chatResponse();
305-
}
306278
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,18 @@ <h2>📚 Prompt Registry</h2>
10511051
</div>
10521052
</div>
10531053
</li>
1054+
<li class="list-group-item">
1055+
<div class="info-tooltip">
1056+
<button type="submit"
1057+
formaction="/prompt-registry/promptRegistryToSpringAi"
1058+
class="link-offset-2-hover link-underline link-underline-opacity-0 link-underline-opacity-75-hover endpoint">
1059+
<code>/prompt-registry/promptRegistryToSpringAi</code>
1060+
</button>
1061+
<div class="tooltip-content">
1062+
Get a SpringAI list of messages from a Prompt Registry Response.
1063+
</div>
1064+
</div>
1065+
</li>
10541066
</ul>
10551067
</div>
10561068
</div>

sample-code/spring-app/src/test/java/com/sap/ai/sdk/app/controllers/PromptRegistryTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,12 @@ void history() {
8585
assertThat(deletedTemplate).hasSize(1);
8686
assertThat(deletedTemplate.get(0).getMessage()).contains("successful");
8787
}
88+
89+
@Test
90+
void promptRegistryToSpringAi() {
91+
var controller = new PromptRegistryController();
92+
var ChatResponse = controller.promptRegistryToSpringAi();
93+
assertThat(ChatResponse).isNotNull();
94+
assertThat(ChatResponse.getOutput().getText()).contains("Sports");
95+
}
8896
}

sample-code/spring-app/src/test/java/com/sap/ai/sdk/app/controllers/SpringAiOrchestrationTest.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,4 @@ void testResponseFormat() {
166166
assertThat(translation.translation()).isNotEmpty();
167167
assertThat(translation.language()).containsIgnoringCase("dutch");
168168
}
169-
170-
@Test
171-
void promptRegistryToSpringAi() {
172-
var ChatResponse = service.promptRegistryToSpringAi();
173-
assertThat(ChatResponse).isNotNull();
174-
assertThat(ChatResponse.getResult().getOutput().getText()).contains("Sports");
175-
}
176169
}

0 commit comments

Comments
 (0)