Skip to content

Commit c46f920

Browse files
committed
Introduce filtering schema changes and update generated class names
- synchronous suffix removed - `createConfig` removed from `ContentFilter` - release notes updated for filtering changes
1 parent e62952d commit c46f920

31 files changed

+1371
-703
lines changed

docs/release_notes.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
Interfaces with only one implementation were reduced.
1919
As a result, the accessors for fields `OrchestrationModuleConfig.inputTranslationConfig` and `OrchestrationModuleConfig.outputTranslationConfig` now handle the implementing class explicitly.
2020
The same applies to helper methods `DpiMasking#createConfig()` and `MaskingProvider#createConfig()`.
21+
The method `createConfig()` is removed from all `ContentFilter` types and replaced by `createInputFilterConfig()` and `createOutputFilterConfig()`.
2122

2223
### ✨ New Functionality
2324

24-
-
25+
-
2526

2627
### 📈 Improvements
2728

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

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.sap.ai.sdk.orchestration;
22

3-
import com.sap.ai.sdk.orchestration.model.AzureContentSafety;
4-
import com.sap.ai.sdk.orchestration.model.AzureContentSafetyFilterConfig;
3+
import com.sap.ai.sdk.orchestration.model.AzureContentSafetyInput;
4+
import com.sap.ai.sdk.orchestration.model.AzureContentSafetyInputFilterConfig;
5+
import com.sap.ai.sdk.orchestration.model.AzureContentSafetyOutput;
6+
import com.sap.ai.sdk.orchestration.model.AzureContentSafetyOutputFilterConfig;
57
import javax.annotation.Nonnull;
68
import javax.annotation.Nullable;
79
import lombok.NoArgsConstructor;
@@ -46,24 +48,52 @@ public class AzureContentFilter implements ContentFilter {
4648
/* The filter category for violence content. */
4749
@Nullable AzureFilterThreshold violence;
4850

51+
/* A flag to set prompt shield on in*/
52+
@Nullable Boolean promptShield;
53+
54+
/**
55+
* Converts {@link AzureContentFilter} to its serializable counterpart {@link
56+
* AzureContentSafetyInputFilterConfig}.
57+
*
58+
* @return the corresponding {@link AzureContentSafetyInputFilterConfig} object.
59+
* @throws IllegalArgumentException if no policies are set.
60+
*/
61+
@Override
62+
@Nonnull
63+
public AzureContentSafetyInputFilterConfig createInputFilterConfig() {
64+
if (hate == null && selfHarm == null && sexual == null && violence == null) {
65+
throw new IllegalArgumentException("At least one filter category must be set");
66+
}
67+
68+
return AzureContentSafetyInputFilterConfig.create()
69+
.type(AzureContentSafetyInputFilterConfig.TypeEnum.AZURE_CONTENT_SAFETY)
70+
.config(
71+
AzureContentSafetyInput.create()
72+
.hate(hate != null ? hate.getAzureThreshold() : null)
73+
.selfHarm(selfHarm != null ? selfHarm.getAzureThreshold() : null)
74+
.sexual(sexual != null ? sexual.getAzureThreshold() : null)
75+
.violence(violence != null ? violence.getAzureThreshold() : null)
76+
.promptShield(promptShield != null ? promptShield : null));
77+
}
78+
4979
/**
50-
* Converts {@code AzureContentFilter} to its serializable counterpart {@link
51-
* AzureContentSafetyFilterConfig}.
80+
* Converts {@link AzureContentFilter} to its serializable counterpart {@link
81+
* AzureContentSafetyOutput}.
5282
*
53-
* @return the corresponding {@code AzureContentSafetyFilterConfig} object.
83+
* @return the corresponding {@link AzureContentSafetyOutputFilterConfig} object.
5484
* @throws IllegalArgumentException if no policies are set.
5585
*/
5686
@Override
5787
@Nonnull
58-
public AzureContentSafetyFilterConfig createConfig() {
88+
public AzureContentSafetyOutputFilterConfig createOutputFilterConfig() {
5989
if (hate == null && selfHarm == null && sexual == null && violence == null) {
6090
throw new IllegalArgumentException("At least one filter category must be set");
6191
}
6292

63-
return AzureContentSafetyFilterConfig.create()
64-
.type(AzureContentSafetyFilterConfig.TypeEnum.AZURE_CONTENT_SAFETY)
93+
return AzureContentSafetyOutputFilterConfig.create()
94+
.type(AzureContentSafetyOutputFilterConfig.TypeEnum.AZURE_CONTENT_SAFETY)
6595
.config(
66-
AzureContentSafety.create()
96+
AzureContentSafetyOutput.create()
6797
.hate(hate != null ? hate.getAzureThreshold() : null)
6898
.selfHarm(selfHarm != null ? selfHarm.getAzureThreshold() : null)
6999
.sexual(sexual != null ? sexual.getAzureThreshold() : null)

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sap.ai.sdk.orchestration;
22

3-
import com.sap.ai.sdk.orchestration.model.FilterConfig;
3+
import com.sap.ai.sdk.orchestration.model.InputFilterConfig;
4+
import com.sap.ai.sdk.orchestration.model.OutputFilterConfig;
45
import javax.annotation.Nonnull;
56

67
/**
@@ -17,11 +18,20 @@
1718
public interface ContentFilter {
1819

1920
/**
20-
* A method that produces the serializable equivalent {@link FilterConfig} object from data
21+
* A method that produces the serializable equivalent {@link InputFilterConfig} object from data
2122
* encapsulated in the {@link ContentFilter} object.
2223
*
23-
* @return the corresponding {@code FilterConfig} object.
24+
* @return the corresponding {@link InputFilterConfig} object.
2425
*/
2526
@Nonnull
26-
FilterConfig createConfig();
27+
InputFilterConfig createInputFilterConfig();
28+
29+
/**
30+
* A method that produces the serializable equivalent {@link OutputFilterConfig} object from data
31+
* encapsulated in the {@link ContentFilter} object.
32+
*
33+
* @return the corresponding {@link OutputFilterConfig} object.
34+
*/
35+
@Nonnull
36+
OutputFilterConfig createOutputFilterConfig();
2737
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import com.fasterxml.jackson.annotation.JsonSubTypes;
44
import com.fasterxml.jackson.annotation.JsonTypeInfo;
55
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
6-
import com.sap.ai.sdk.orchestration.model.LLMModuleResultSynchronous;
6+
import com.sap.ai.sdk.orchestration.model.LLMModuleResult;
77
import lombok.AccessLevel;
88
import lombok.NoArgsConstructor;
99

1010
@NoArgsConstructor(access = AccessLevel.PRIVATE)
1111
final class JacksonMixins {
1212
/** Mixin to enforce a specific subtype to be deserialized always. */
1313
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
14-
@JsonDeserialize(as = LLMModuleResultSynchronous.class)
14+
@JsonDeserialize(as = LLMModuleResult.class)
1515
interface LLMModuleResultMixIn {}
1616

1717
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,13 @@ public class LlamaGuardFilter implements ContentFilter {
4040

4141
@Nonnull
4242
@Override
43-
public LlamaGuard38bFilterConfig createConfig() {
43+
public LlamaGuard38bFilterConfig createInputFilterConfig() {
4444
return LlamaGuard38bFilterConfig.create().type(LLAMA_GUARD_3_8B).config(config);
4545
}
46+
47+
@Nonnull
48+
@Override
49+
public LlamaGuard38bFilterConfig createOutputFilterConfig() {
50+
return createInputFilterConfig();
51+
}
4652
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import com.sap.ai.sdk.orchestration.model.AssistantChatMessage;
66
import com.sap.ai.sdk.orchestration.model.ChatMessage;
77
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
8-
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseSynchronous;
9-
import com.sap.ai.sdk.orchestration.model.LLMChoiceSynchronous;
8+
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
9+
import com.sap.ai.sdk.orchestration.model.LLMChoice;
1010
import com.sap.ai.sdk.orchestration.model.SystemChatMessage;
1111
import com.sap.ai.sdk.orchestration.model.TokenUsage;
1212
import com.sap.ai.sdk.orchestration.model.ToolChatMessage;
@@ -22,7 +22,7 @@
2222
@Value
2323
@RequiredArgsConstructor(access = PACKAGE)
2424
public class OrchestrationChatResponse {
25-
CompletionPostResponseSynchronous originalResponse;
25+
CompletionPostResponse originalResponse;
2626

2727
/**
2828
* Get the message content from the output.
@@ -97,10 +97,10 @@ public List<Message> getAllMessages() throws IllegalArgumentException {
9797
/**
9898
* Get the LLM response. Useful for accessing the finish reason or further data like logprobs.
9999
*
100-
* @return The (first, in case of multiple) {@link LLMChoiceSynchronous}.
100+
* @return The (first, in case of multiple) {@link LLMChoice}.
101101
*/
102102
@Nonnull
103-
public LLMChoiceSynchronous getChoice() {
103+
public LLMChoice getChoice() {
104104
// We expect choices to be defined and never empty.
105105
return originalResponse.getOrchestrationResult().getChoices().get(0);
106106
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.google.common.annotations.Beta;
1010
import com.sap.ai.sdk.core.AiCoreService;
1111
import com.sap.ai.sdk.orchestration.model.CompletionPostRequest;
12-
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseSynchronous;
12+
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
1313
import com.sap.ai.sdk.orchestration.model.EmbeddingsPostRequest;
1414
import com.sap.ai.sdk.orchestration.model.EmbeddingsPostResponse;
1515
import com.sap.ai.sdk.orchestration.model.ModuleConfigs;
@@ -138,9 +138,9 @@ private static void throwOnContentFilter(@Nonnull final OrchestrationChatComplet
138138
* @throws OrchestrationClientException If the request fails.
139139
*/
140140
@Nonnull
141-
public CompletionPostResponseSynchronous executeRequest(
142-
@Nonnull final CompletionPostRequest request) throws OrchestrationClientException {
143-
return executor.execute("/completion", request, CompletionPostResponseSynchronous.class);
141+
public CompletionPostResponse executeRequest(@Nonnull final CompletionPostRequest request)
142+
throws OrchestrationClientException {
143+
return executor.execute("/completion", request, CompletionPostResponse.class);
144144
}
145145

146146
/**
@@ -182,7 +182,7 @@ public OrchestrationChatResponse executeRequestFromJsonModuleConfig(
182182
requestJson.set("orchestration_config", moduleConfigJson);
183183

184184
return new OrchestrationChatResponse(
185-
executor.execute("/completion", requestJson, CompletionPostResponseSynchronous.class));
185+
executor.execute("/completion", requestJson, CompletionPostResponse.class));
186186
}
187187

188188
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.google.common.annotations.Beta;
55
import com.sap.ai.sdk.core.common.ClientError;
6-
import com.sap.ai.sdk.orchestration.model.ErrorResponseSynchronous;
6+
import com.sap.ai.sdk.orchestration.model.ErrorResponse;
77
import javax.annotation.Nonnull;
88
import lombok.AccessLevel;
99
import lombok.AllArgsConstructor;
@@ -18,7 +18,7 @@
1818
@Value
1919
@Beta
2020
public class OrchestrationError implements ClientError {
21-
ErrorResponseSynchronous originalResponse;
21+
ErrorResponse originalResponse;
2222

2323
/**
2424
* Gets the error message from the contained original response.

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,10 @@ public OrchestrationModuleConfig withInputFiltering(
159159
allFilters.addAll(Arrays.asList(contentFilters));
160160

161161
final var filterConfigs =
162-
allFilters.stream().filter(Objects::nonNull).map(ContentFilter::createConfig).toList();
162+
allFilters.stream()
163+
.filter(Objects::nonNull)
164+
.map(ContentFilter::createInputFilterConfig)
165+
.toList();
163166

164167
final var inputFilter = InputFilteringConfig.create().filters(filterConfigs);
165168

@@ -194,7 +197,10 @@ public OrchestrationModuleConfig withOutputFiltering(
194197
allFilters.addAll(Arrays.asList(contentFilters));
195198

196199
final var filterConfigs =
197-
allFilters.stream().filter(Objects::nonNull).map(ContentFilter::createConfig).toList();
200+
allFilters.stream()
201+
.filter(Objects::nonNull)
202+
.map(ContentFilter::createOutputFilterConfig)
203+
.toList();
198204

199205
final var outputFilter = OutputFilteringConfig.create().filters(filterConfigs);
200206

0 commit comments

Comments
 (0)