|
1 | 1 | package com.sap.ai.sdk.app.controllers; |
2 | 2 |
|
| 3 | +import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GEMINI_1_5_FLASH; |
| 4 | +import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.TEMPERATURE; |
3 | 5 | import static com.sap.ai.sdk.orchestration.model.ResponseChatMessage.RoleEnum.ASSISTANT; |
4 | 6 | import static org.assertj.core.api.Assertions.assertThat; |
5 | 7 | import static org.assertj.core.api.Assertions.assertThatThrownBy; |
6 | 8 |
|
7 | 9 | import com.sap.ai.sdk.app.services.OrchestrationService; |
| 10 | +import com.sap.ai.sdk.orchestration.AzureContentFilter; |
8 | 11 | import com.sap.ai.sdk.orchestration.AzureFilterThreshold; |
| 12 | +import com.sap.ai.sdk.orchestration.DpiMasking; |
| 13 | +import com.sap.ai.sdk.orchestration.Message; |
9 | 14 | import com.sap.ai.sdk.orchestration.OrchestrationClient; |
10 | 15 | import com.sap.ai.sdk.orchestration.OrchestrationClientException; |
| 16 | +import com.sap.ai.sdk.orchestration.OrchestrationModuleConfig; |
11 | 17 | import com.sap.ai.sdk.orchestration.OrchestrationPrompt; |
| 18 | +import com.sap.ai.sdk.orchestration.TemplateConfig; |
12 | 19 | import com.sap.ai.sdk.orchestration.TextItem; |
13 | 20 | import com.sap.ai.sdk.orchestration.model.CompletionPostResponse; |
14 | 21 | import com.sap.ai.sdk.orchestration.model.DPIEntities; |
|
32 | 39 | @Slf4j |
33 | 40 | class OrchestrationTest { |
34 | 41 | OrchestrationService service; |
| 42 | + private final OrchestrationClient client = new OrchestrationClient(); |
| 43 | + private final OrchestrationModuleConfig config = |
| 44 | + new OrchestrationModuleConfig().withLlmConfig(GEMINI_1_5_FLASH.withParam(TEMPERATURE, 0.0)); |
35 | 45 |
|
36 | 46 | @BeforeEach |
37 | 47 | void setUp() { |
@@ -352,4 +362,44 @@ void testLocalPromptTemplate() throws IOException { |
352 | 362 | final var choices = ((LLMModuleResultSynchronous) result.getOrchestrationResult()).getChoices(); |
353 | 363 | assertThat(choices.get(0).getMessage().getContent()).isNotEmpty(); |
354 | 364 | } |
| 365 | + |
| 366 | + @Test |
| 367 | + void testStreamingErrorHandlingTemplate() { |
| 368 | + final var template = Message.user("Bad template: {{?language!@#$}}"); |
| 369 | + final var templatingConfig = |
| 370 | + TemplateConfig.create().withTemplate(List.of(template.createChatMessage())); |
| 371 | + final var configWithTemplate = config.withTemplateConfig(templatingConfig); |
| 372 | + final var inputParams = Map.of("language", "German"); |
| 373 | + final var prompt = new OrchestrationPrompt(inputParams); |
| 374 | + |
| 375 | + assertThatThrownBy(() -> client.streamChatCompletion(prompt, configWithTemplate)) |
| 376 | + .isInstanceOf(OrchestrationClientException.class) |
| 377 | + .hasMessageContaining("status 400 Bad Request") |
| 378 | + .hasMessageContaining("Error processing template:"); |
| 379 | + } |
| 380 | + |
| 381 | + @Test |
| 382 | + void testStreamingErrorHandlingInputFilter() { |
| 383 | + final var prompt = new OrchestrationPrompt("Create 5 paraphrases of 'I hate you'."); |
| 384 | + final var filterConfig = new AzureContentFilter().hate(AzureFilterThreshold.ALLOW_SAFE); |
| 385 | + final var configWithFilter = config.withInputFiltering(filterConfig); |
| 386 | + |
| 387 | + assertThatThrownBy(() -> client.streamChatCompletion(prompt, configWithFilter)) |
| 388 | + .isInstanceOf(OrchestrationClientException.class) |
| 389 | + .hasMessageContaining("status 400 Bad Request") |
| 390 | + .hasMessageContaining("Filtering Module - Input Filter"); |
| 391 | + } |
| 392 | + |
| 393 | + @Test |
| 394 | + void testStreamingErrorHandlingMasking() { |
| 395 | + final var prompt = new OrchestrationPrompt("Some message."); |
| 396 | + final var maskingConfig = |
| 397 | + DpiMasking.anonymization().withEntities(DPIEntities.UNKNOWN_DEFAULT_OPEN_API); |
| 398 | + final var configWithMasking = config.withMaskingConfig(maskingConfig); |
| 399 | + |
| 400 | + assertThatThrownBy(() -> client.streamChatCompletion(prompt, configWithMasking)) |
| 401 | + .isInstanceOf(OrchestrationClientException.class) |
| 402 | + .hasMessageContaining("status 400 Bad Request") |
| 403 | + .hasMessageContaining("'type': 'sap_data_privacy_integration', 'method': 'anonymization'"); |
| 404 | + } |
355 | 405 | } |
0 commit comments