Skip to content

Commit 321833d

Browse files
committed
Implementation to be able to use Prompt Registry for SpringAi
1 parent 48ba842 commit 321833d

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

orchestration/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@
154154
<artifactId>javaparser-core</artifactId>
155155
<scope>test</scope>
156156
</dependency>
157+
<dependency>
158+
<groupId>com.sap.ai.sdk</groupId>
159+
<artifactId>prompt-registry</artifactId>
160+
</dependency>
157161
</dependencies>
158162

159163
<profiles>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.sap.ai.sdk.orchestration.spring;
2+
3+
import com.sap.ai.sdk.prompt.registry.PromptClient;
4+
import com.sap.ai.sdk.prompt.registry.model.PromptTemplateSubstitutionRequest;
5+
import com.sap.ai.sdk.prompt.registry.model.SingleChatTemplate;
6+
import com.sap.ai.sdk.prompt.registry.model.Template;
7+
import org.springframework.ai.chat.messages.AssistantMessage;
8+
import org.springframework.ai.chat.messages.Message;
9+
import org.springframework.ai.chat.messages.SystemMessage;
10+
import org.springframework.ai.chat.messages.UserMessage;
11+
import org.springframework.ai.chat.prompt.Prompt;
12+
13+
import java.util.Map;
14+
import java.util.UUID;
15+
16+
public class OrchestrationSpringUtil {
17+
private OrchestrationSpringUtil() {
18+
// Utility class, no instantiation allowed
19+
}
20+
21+
public static Prompt getPromptTemplate(String templateName, Map<String, Object> inputParams) {
22+
var templateMessages =
23+
new PromptClient()
24+
.parsePromptTemplateByNameVersion(
25+
"categorization",
26+
"1.0.0",
27+
"PROMPT-CHART",
28+
"default",
29+
false,
30+
PromptTemplateSubstitutionRequest.create()
31+
.inputParams(Map.of("current_timestamp", System.currentTimeMillis())))
32+
.getParsedPrompt();
33+
34+
// TRANSFORM TEMPLATE TO SPRING AI MESSAGES
35+
var messages =
36+
templateMessages.stream()
37+
.map(
38+
(Template t) -> {
39+
SingleChatTemplate message = (SingleChatTemplate) t;
40+
return (Message)
41+
switch (message.getRole()) {
42+
case "system" -> new SystemMessage(message.getContent());
43+
case "user" -> new UserMessage(message.getContent());
44+
case "assistant" -> new AssistantMessage(message.getContent());
45+
default ->
46+
throw new IllegalArgumentException(
47+
"Unknown role: " + message.getRole());
48+
};
49+
})
50+
.toList();
51+
52+
return new Prompt(messages);
53+
}
54+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import java.util.Objects;
2020
import javax.annotation.Nonnull;
2121
import javax.annotation.Nullable;
22+
23+
import com.sap.ai.sdk.orchestration.spring.OrchestrationSpringUtil;
2224
import lombok.val;
2325
import org.springframework.ai.chat.client.ChatClient;
2426
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
@@ -220,4 +222,19 @@ public Translation responseFormat() {
220222

221223
return cl.prompt(prompt).call().entity(Translation.class);
222224
}
225+
226+
@Nullable
227+
public ChatResponse getPromptTemplate() {
228+
ChatModel client = new OrchestrationChatModel();
229+
var memory = new InMemoryChatMemory();
230+
var advisor = new MessageChatMemoryAdvisor(memory);
231+
var cl = ChatClient.builder(client).defaultAdvisors(advisor).build();
232+
233+
val prompt = OrchestrationSpringUtil.getPromptTemplate(
234+
"PROMPT-CHART",
235+
Map.of("current_timestamp", System.currentTimeMillis()));
236+
237+
var response = cl.prompt(prompt).call();
238+
return response.chatResponse();
239+
}
223240
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,14 @@ void testResponseFormat() {
166166
assertThat(translation.translation()).isNotEmpty();
167167
assertThat(translation.language()).containsIgnoringCase("dutch");
168168
}
169+
170+
@Test
171+
void getPromptTemplate() {
172+
var ChatResponse = service.getPromptTemplate();
173+
assertThat(ChatResponse).isNotNull();
174+
assertThat(ChatResponse.getResult().getOutput().getText()).isNotEmpty();
175+
assertThat(ChatResponse.getResult().getOutput().getText())
176+
.contains("The current timestamp is");
177+
}
178+
169179
}

0 commit comments

Comments
 (0)