Skip to content

Commit 986924e

Browse files
Orchestration Grounding convenience
1 parent 7ec7dff commit 986924e

File tree

6 files changed

+155
-23
lines changed

6 files changed

+155
-23
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.sap.ai.sdk.orchestration;
2+
3+
import com.google.common.annotations.Beta;
4+
import com.sap.ai.sdk.orchestration.model.DataRepositoryType;
5+
import com.sap.ai.sdk.orchestration.model.DocumentGroundingFilter;
6+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfig;
7+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfig.TypeEnum;
8+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfigConfig;
9+
import java.util.List;
10+
import java.util.Map;
11+
import javax.annotation.Nonnull;
12+
import lombok.Setter;
13+
import lombok.experimental.Accessors;
14+
import lombok.val;
15+
16+
/**
17+
* Grounding integrates external, contextually relevant, domain-specific, or real-time data into AI
18+
* processes. This data supplements the natural language processing capabilities of pre-trained
19+
* models, which are trained on general material.
20+
*
21+
* @link <a href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/grounding">SAP AI
22+
* Core: Orchestration - Grounding</a>
23+
*/
24+
@Beta
25+
@Setter(onMethod_ = {@Nonnull})
26+
@Accessors(fluent = true)
27+
public class Grounding implements GroundingProvider {
28+
29+
private String id = "someID";
30+
private DataRepositoryType dataRepositoryType = DataRepositoryType.VECTOR;
31+
private TypeEnum documentGroundingService = TypeEnum.DOCUMENT_GROUNDING_SERVICE;
32+
33+
/**
34+
* Create a new default grounding provider.
35+
*
36+
* <p>It is by default a document grounding service with a vector data repository and id "someID".
37+
*
38+
* @return The grounding provider.
39+
*/
40+
@Nonnull
41+
public static Grounding create() {
42+
return new Grounding();
43+
}
44+
45+
/**
46+
* Create a prompt with grounding parameters included in the message.
47+
*
48+
* <p>It uses the inputParams {@code groundingInput} for the user message and {@code
49+
* groundingOutput} for the grounding context.
50+
*
51+
* @param message The user message.
52+
* @return The prompt with grounding.
53+
*/
54+
@Nonnull
55+
public OrchestrationPrompt createGroundingPrompt(@Nonnull final String message) {
56+
return new OrchestrationPrompt(
57+
Map.of("groundingInput", message),
58+
Message.user(
59+
"{{?groundingInput}} Use the following information as additional context: {{?groundingOutput}}"));
60+
}
61+
62+
@Nonnull
63+
@Override
64+
public GroundingModuleConfig createConfig() {
65+
val filterInner =
66+
DocumentGroundingFilter.create().id(id).dataRepositoryType(dataRepositoryType);
67+
val groundingConfigConfig =
68+
GroundingModuleConfigConfig.create()
69+
.inputParams(List.of("groundingInput"))
70+
.outputParam("groundingOutput")
71+
.addFiltersItem(filterInner);
72+
return GroundingModuleConfig.create()
73+
.type(documentGroundingService)
74+
.config(groundingConfigConfig);
75+
}
76+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.sap.ai.sdk.orchestration;
2+
3+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfig;
4+
import javax.annotation.Nonnull;
5+
6+
/**
7+
* Interface for grounding configurations.
8+
*
9+
* @link <a href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/grounding">SAP AI
10+
* Core: Orchestration - Grounding</a>
11+
*/
12+
public interface GroundingProvider {
13+
14+
/**
15+
* Create a grounding configuration.
16+
*
17+
* @return the grounding configuration
18+
*/
19+
@Nonnull
20+
GroundingModuleConfig createConfig();
21+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
public interface MaskingProvider {
1313

1414
/**
15-
* Create a masking provider for the configuration.
15+
* Create a masking configuration.
1616
*
17-
* @return the masking provider
17+
* @return the masking configuration
1818
*/
1919
@Nonnull
2020
MaskingProviderConfig createConfig();

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,18 @@ public OrchestrationModuleConfig withOutputFiltering(
197197

198198
return this.withFilteringConfig(newFilteringConfig);
199199
}
200+
201+
/**
202+
* Creates a new configuration with the given grounding configuration.
203+
*
204+
* @link <a href="https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/grounding">SAP
205+
* AI Core: Orchestration - Grounding</a>
206+
* @param groundingProvider The grounding configuration to use.
207+
* @return A new configuration with the given grounding configuration.
208+
*/
209+
@Nonnull
210+
public OrchestrationModuleConfig withGrounding(
211+
@Nonnull final GroundingProvider groundingProvider) {
212+
return this.withGroundingConfig(groundingProvider.createConfig());
213+
}
200214
}

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@
33
import static com.sap.ai.sdk.orchestration.AzureFilterThreshold.ALLOW_SAFE_LOW_MEDIUM;
44
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_4O;
55
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.MAX_TOKENS;
6+
import static com.sap.ai.sdk.orchestration.model.DataRepositoryType.VECTOR;
7+
import static com.sap.ai.sdk.orchestration.model.GroundingModuleConfig.TypeEnum.DOCUMENT_GROUNDING_SERVICE;
68
import static org.assertj.core.api.Assertions.assertThat;
79
import static org.assertj.core.api.Assertions.assertThatThrownBy;
810

911
import com.sap.ai.sdk.orchestration.model.DPIConfig;
1012
import com.sap.ai.sdk.orchestration.model.DPIEntities;
13+
import com.sap.ai.sdk.orchestration.model.DocumentGroundingFilter;
14+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfigConfig;
15+
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfigConfigFiltersInner;
16+
import java.util.List;
1117
import java.util.Map;
1218
import org.junit.jupiter.api.Test;
1319

@@ -121,4 +127,35 @@ void testLLMConfig() {
121127
.withFailMessage("Static models should be unchanged")
122128
.isEqualTo("latest");
123129
}
130+
131+
@Test
132+
void testGroundingConfig() {
133+
var groundingConfig = Grounding.create();
134+
var config =
135+
new OrchestrationModuleConfig().withLlmConfig(GPT_4O).withGrounding(groundingConfig);
136+
137+
assertThat(config.getGroundingConfig()).isNotNull();
138+
assertThat(config.getGroundingConfig().getType()).isEqualTo(DOCUMENT_GROUNDING_SERVICE);
139+
140+
GroundingModuleConfigConfig configConfig = config.getGroundingConfig().getConfig();
141+
assertThat(configConfig).isNotNull();
142+
assertThat(configConfig.getInputParams()).containsExactly("groundingInput");
143+
assertThat(configConfig.getOutputParam()).isEqualTo("groundingOutput");
144+
145+
List<GroundingModuleConfigConfigFiltersInner> filters = configConfig.getFilters();
146+
assertThat(filters).hasSize(1);
147+
DocumentGroundingFilter filter = (DocumentGroundingFilter) filters.get(0);
148+
assertThat(filter.getId()).isEqualTo("someID");
149+
assertThat(filter.getDataRepositoryType()).isEqualTo(VECTOR);
150+
}
151+
152+
@Test
153+
void testGroundingPrompt() {
154+
var prompt = Grounding.create().createGroundingPrompt("Hello, World!");
155+
assertThat(prompt.getMessages()).hasSize(1);
156+
var message = prompt.getMessages().get(0);
157+
assertThat(message.content())
158+
.isEqualTo(
159+
"{{?groundingInput}} Use the following information as additional context: {{?groundingOutput}}");
160+
}
124161
}

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,22 @@
77
import com.sap.ai.sdk.orchestration.AzureContentFilter;
88
import com.sap.ai.sdk.orchestration.AzureFilterThreshold;
99
import com.sap.ai.sdk.orchestration.DpiMasking;
10+
import com.sap.ai.sdk.orchestration.Grounding;
1011
import com.sap.ai.sdk.orchestration.Message;
1112
import com.sap.ai.sdk.orchestration.OrchestrationChatResponse;
1213
import com.sap.ai.sdk.orchestration.OrchestrationClient;
1314
import com.sap.ai.sdk.orchestration.OrchestrationClientException;
1415
import com.sap.ai.sdk.orchestration.OrchestrationModuleConfig;
1516
import com.sap.ai.sdk.orchestration.OrchestrationPrompt;
1617
import com.sap.ai.sdk.orchestration.model.DPIEntities;
17-
import com.sap.ai.sdk.orchestration.model.DataRepositoryType;
18-
import com.sap.ai.sdk.orchestration.model.DocumentGroundingFilter;
19-
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfig;
20-
import com.sap.ai.sdk.orchestration.model.GroundingModuleConfigConfig;
2118
import com.sap.ai.sdk.orchestration.model.Template;
2219
import java.util.List;
2320
import java.util.Map;
2421
import java.util.stream.Stream;
2522
import javax.annotation.Nonnull;
2623
import lombok.Getter;
2724
import lombok.extern.slf4j.Slf4j;
25+
import lombok.val;
2826
import org.springframework.stereotype.Service;
2927

3028
/** Service class for the Orchestration service */
@@ -238,23 +236,9 @@ public OrchestrationChatResponse maskingPseudonymization(@Nonnull final DPIEntit
238236
*/
239237
@Nonnull
240238
public OrchestrationChatResponse grounding(@Nonnull final String groundingInput) {
241-
final var message =
242-
Message.user(
243-
"{{?groundingInput}} Use the following information as additional context: {{?groundingOutput}}");
244-
final var prompt = new OrchestrationPrompt(Map.of("groundingInput", groundingInput), message);
245-
246-
final var filterInner =
247-
DocumentGroundingFilter.create().id("someID").dataRepositoryType(DataRepositoryType.VECTOR);
248-
final var groundingConfigConfig =
249-
GroundingModuleConfigConfig.create()
250-
.inputParams(List.of("groundingInput"))
251-
.outputParam("groundingOutput")
252-
.addFiltersItem(filterInner);
253-
final var groundingConfig =
254-
GroundingModuleConfig.create()
255-
.type(GroundingModuleConfig.TypeEnum.DOCUMENT_GROUNDING_SERVICE)
256-
.config(groundingConfigConfig);
257-
final var configWithGrounding = config.withGroundingConfig(groundingConfig);
239+
val groundingConfig = Grounding.create();
240+
val prompt = groundingConfig.createGroundingPrompt(groundingInput);
241+
val configWithGrounding = config.withGrounding(groundingConfig);
258242

259243
return client.chatCompletion(prompt, configWithGrounding);
260244
}

0 commit comments

Comments
 (0)