Skip to content

Commit 68ebf91

Browse files
fix: Spring AI consistent behaviour with Orchestration streaming (#309)
1 parent 9672f8c commit 68ebf91

File tree

2 files changed

+1
-43
lines changed

2 files changed

+1
-43
lines changed

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

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
import com.sap.ai.sdk.orchestration.AssistantMessage;
77
import com.sap.ai.sdk.orchestration.OrchestrationChatCompletionDelta;
88
import com.sap.ai.sdk.orchestration.OrchestrationClient;
9-
import com.sap.ai.sdk.orchestration.OrchestrationClientException;
109
import com.sap.ai.sdk.orchestration.OrchestrationPrompt;
1110
import com.sap.ai.sdk.orchestration.SystemMessage;
1211
import com.sap.ai.sdk.orchestration.UserMessage;
1312
import java.util.List;
1413
import java.util.Map;
1514
import java.util.function.Function;
16-
import java.util.stream.Stream;
1715
import javax.annotation.Nonnull;
1816
import lombok.RequiredArgsConstructor;
1917
import lombok.extern.slf4j.Slf4j;
@@ -79,26 +77,12 @@ public Flux<ChatResponse> stream(@Nonnull final Prompt prompt) {
7977
}
8078
return iterator;
8179
});
82-
return flux.map(
83-
delta -> {
84-
throwOnContentFilter(stream, delta);
85-
return new OrchestrationSpringChatDelta(delta);
86-
});
80+
return flux.map(OrchestrationSpringChatDelta::new);
8781
}
8882
throw new IllegalArgumentException(
8983
"Please add OrchestrationChatOptions to the Prompt: new Prompt(\"message\", new OrchestrationChatOptions(config))");
9084
}
9185

92-
private static void throwOnContentFilter(
93-
@Nonnull final Stream<OrchestrationChatCompletionDelta> stream,
94-
@Nonnull final OrchestrationChatCompletionDelta delta) {
95-
final String finishReason = delta.getFinishReason();
96-
if (finishReason != null && finishReason.equals("content_filter")) {
97-
stream.close();
98-
throw new OrchestrationClientException("Content filter filtered the output.");
99-
}
100-
}
101-
10286
@Nonnull
10387
private OrchestrationPrompt toOrchestrationPrompt(@Nonnull final Prompt prompt) {
10488
val messages = toOrchestrationMessages(prompt.getInstructions());

orchestration/src/test/java/com/sap/ai/sdk/orchestration/spring/OrchestrationChatModelTest.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
1717
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
1818
import com.sap.ai.sdk.orchestration.OrchestrationClient;
19-
import com.sap.ai.sdk.orchestration.OrchestrationClientException;
2019
import com.sap.ai.sdk.orchestration.OrchestrationModuleConfig;
2120
import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Accessor;
2221
import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Cache;
@@ -102,31 +101,6 @@ void testThrowsOnMissingLlmConfig() {
102101
.hasMessageContaining("LLM config is required");
103102
}
104103

105-
@Test
106-
void streamChatCompletionOutputFilterErrorHandling() throws IOException {
107-
try (var inputStream = spy(fileLoader.apply("streamChatCompletionOutputFilter.txt"))) {
108-
109-
final var httpClient = mock(HttpClient.class);
110-
ApacheHttpClient5Accessor.setHttpClientFactory(destination -> httpClient);
111-
112-
// Create a mock response
113-
final var mockResponse = new BasicClassicHttpResponse(200, "OK");
114-
final var inputStreamEntity = new InputStreamEntity(inputStream, ContentType.TEXT_PLAIN);
115-
mockResponse.setEntity(inputStreamEntity);
116-
mockResponse.setHeader("Content-Type", "text/event-stream");
117-
118-
// Configure the HttpClient mock to return the mock response
119-
doReturn(mockResponse).when(httpClient).executeOpen(any(), any(), any());
120-
121-
Flux<ChatResponse> flux = client.stream(prompt);
122-
assertThatThrownBy(() -> flux.toStream().forEach(System.out::println))
123-
.isInstanceOf(OrchestrationClientException.class)
124-
.hasMessage("Content filter filtered the output.");
125-
126-
Mockito.verify(inputStream, times(1)).close();
127-
}
128-
}
129-
130104
@Test
131105
void testStreamCompletion() throws IOException {
132106
try (var inputStream = spy(fileLoader.apply("streamChatCompletion.txt"))) {

0 commit comments

Comments
 (0)