Skip to content

Commit 6a348da

Browse files
committed
Handle class cast exceptions
1 parent b07d789 commit 6a348da

File tree

3 files changed

+29
-24
lines changed

3 files changed

+29
-24
lines changed

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

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
import com.sap.ai.sdk.orchestration.model.TokenUsage;
1616
import com.sap.ai.sdk.orchestration.model.ToolChatMessage;
1717
import com.sap.ai.sdk.orchestration.model.UserChatMessage;
18+
import io.vavr.control.Try;
1819
import java.util.ArrayList;
1920
import java.util.List;
2021
import java.util.Map;
21-
import java.util.Optional;
2222
import javax.annotation.Nonnull;
2323
import lombok.RequiredArgsConstructor;
2424
import lombok.Value;
@@ -43,20 +43,19 @@ public String getContent() throws OrchestrationOutputFilterException {
4343
final var choice = getChoice();
4444

4545
if ("content_filter".equals(choice.getFinishReason())) {
46-
@SuppressWarnings("unchecked")
47-
final var filterDetails =
48-
Optional.of(getOriginalResponse().getModuleResults().getOutputFiltering())
49-
.map(outputFiltering -> (Map<String, Object>) outputFiltering.getData())
50-
.map(data -> (List<Map<String, Object>>) data.get("choices"))
51-
.map(choices -> choices.get(0))
52-
.orElseGet(Map::of);
53-
54-
throw new OrchestrationOutputFilterException(
55-
"Content filter filtered the output.", filterDetails);
46+
final var filterDetails = Try.of(this::getOutputFilteringChoices).getOrElseGet(e -> Map.of());
47+
final var message = "Content filter filtered the output.";
48+
throw new OrchestrationOutputFilterException(message, filterDetails);
5649
}
5750
return choice.getMessage().getContent();
5851
}
5952

53+
@SuppressWarnings("unchecked")
54+
private Map<String, Object> getOutputFilteringChoices() {
55+
final var f = getOriginalResponse().getModuleResults().getOutputFiltering();
56+
return ((List<Map<String, Object>>) ((Map<String, Object>) f.getData()).get("choices")).get(0);
57+
}
58+
6059
/**
6160
* Get the token usage.
6261
*

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

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.util.function.Supplier;
2323
import java.util.stream.Stream;
2424
import javax.annotation.Nonnull;
25+
26+
import io.vavr.control.Try;
2527
import lombok.extern.slf4j.Slf4j;
2628
import lombok.val;
2729

@@ -118,19 +120,19 @@ private static void throwOnContentFilter(@Nonnull final OrchestrationChatComplet
118120
throws OrchestrationOutputFilterException {
119121
final String finishReason = delta.getFinishReason();
120122
if (finishReason != null && finishReason.equals("content_filter")) {
121-
@SuppressWarnings("unchecked")
122-
final var filterDetails =
123-
Optional.ofNullable(delta.getModuleResults().getOutputFiltering())
124-
.map(outputFiltering -> (Map<String, Object>) outputFiltering.getData())
125-
.map(data -> (List<Map<String, Object>>) data.get("choices"))
126-
.map(choices -> choices.get(0))
127-
.orElseGet(Map::of);
128-
129-
throw new OrchestrationOutputFilterException(
130-
"Content filter filtered the output.", filterDetails);
123+
final var filterDetails = Try.of(() -> getOutputFilteringChoices(delta)).getOrElseGet(e -> Map.of());
124+
final var message = "Content filter filtered the output.";
125+
throw new OrchestrationOutputFilterException(message, filterDetails);
131126
}
132127
}
133128

129+
@SuppressWarnings("unchecked")
130+
private static Map<String, Object> getOutputFilteringChoices(@Nonnull final OrchestrationChatCompletionDelta delta) {
131+
final var f = delta.getModuleResults().getOutputFiltering();
132+
return ((List<Map<String, Object>>) ((Map<String, Object>) f.getData()).get("choices")).get(0);
133+
}
134+
135+
134136
/**
135137
* Serializes the given request, executes it and deserializes the response.
136138
*

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.google.common.annotations.Beta;
44
import com.sap.ai.sdk.core.common.ClientExceptionFactory;
55
import com.sap.ai.sdk.orchestration.OrchestrationFilterException.OrchestrationInputFilterException;
6+
import com.sap.ai.sdk.orchestration.model.ErrorResponse;
7+
import com.sap.ai.sdk.orchestration.model.GenericModuleResult;
8+
import com.sap.ai.sdk.orchestration.model.ModuleResults;
9+
610
import java.util.Collections;
711
import java.util.Map;
812
import java.util.Optional;
@@ -37,9 +41,9 @@ public OrchestrationClientException buildFromClientError(
3741
private Map<String, Object> extractInputFilterDetails(@Nonnull final OrchestrationError error) {
3842

3943
return Optional.of(error.getErrorResponse())
40-
.flatMap(response -> Optional.ofNullable(response.getModuleResults()))
41-
.flatMap(moduleResults -> Optional.ofNullable(moduleResults.getInputFiltering()))
42-
.flatMap(inputFiltering -> Optional.ofNullable(inputFiltering.getData()))
44+
.map(ErrorResponse::getModuleResults)
45+
.map(ModuleResults::getInputFiltering)
46+
.map(GenericModuleResult::getData)
4347
.filter(Map.class::isInstance)
4448
.map(map -> (Map<String, Object>) map)
4549
.orElseGet(Collections::emptyMap);

0 commit comments

Comments
 (0)