|
12 | 12 | import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; |
13 | 13 | import static com.github.tomakehurst.wiremock.client.WireMock.serverError; |
14 | 14 | import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; |
15 | | -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; |
16 | 15 | import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; |
17 | 16 | import static com.github.tomakehurst.wiremock.client.WireMock.verify; |
18 | 17 | import static com.sap.ai.sdk.orchestration.AzureFilterThreshold.ALLOW_SAFE; |
|
42 | 41 | import com.github.tomakehurst.wiremock.junit5.WireMockTest; |
43 | 42 | import com.github.tomakehurst.wiremock.stubbing.Scenario; |
44 | 43 | import com.sap.ai.sdk.orchestration.model.ChatDelta; |
45 | | -import com.sap.ai.sdk.orchestration.model.DPIConfig; |
46 | 44 | import com.sap.ai.sdk.orchestration.model.DPIEntities; |
47 | | -import com.sap.ai.sdk.orchestration.model.DPIStandardEntity; |
48 | 45 | import com.sap.ai.sdk.orchestration.model.DataRepositoryType; |
49 | 46 | import com.sap.ai.sdk.orchestration.model.DocumentGroundingFilter; |
50 | | -import com.sap.ai.sdk.orchestration.model.Embedding; |
51 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsInput; |
52 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsInputText; |
53 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsModelConfig; |
54 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsModelDetails; |
55 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsModelParams; |
56 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsModuleConfigs; |
57 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsOrchestrationConfig; |
58 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsPostRequest; |
59 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsPostResponse; |
60 | | -import com.sap.ai.sdk.orchestration.model.EmbeddingsResponse; |
61 | 47 | import com.sap.ai.sdk.orchestration.model.ErrorResponse; |
62 | 48 | import com.sap.ai.sdk.orchestration.model.GenericModuleResult; |
63 | 49 | import com.sap.ai.sdk.orchestration.model.GroundingFilterSearchConfiguration; |
|
66 | 52 | import com.sap.ai.sdk.orchestration.model.GroundingModuleConfigConfigPlaceholders; |
67 | 53 | import com.sap.ai.sdk.orchestration.model.KeyValueListPair; |
68 | 54 | import com.sap.ai.sdk.orchestration.model.LlamaGuard38b; |
69 | | -import com.sap.ai.sdk.orchestration.model.MaskingModuleConfigProviders; |
70 | 55 | import com.sap.ai.sdk.orchestration.model.ModuleResultsStreaming; |
71 | 56 | import com.sap.ai.sdk.orchestration.model.ResponseFormatText; |
72 | 57 | import com.sap.ai.sdk.orchestration.model.SearchDocumentKeyValueListPair; |
|
79 | 64 | import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination; |
80 | 65 | import java.io.IOException; |
81 | 66 | import java.io.InputStream; |
82 | | -import java.math.BigDecimal; |
83 | 67 | import java.nio.file.Files; |
84 | 68 | import java.nio.file.Path; |
85 | 69 | import java.util.List; |
@@ -1279,154 +1263,4 @@ void testGetAllMessages() { |
1279 | 1263 | assertThat(messageListTools.get(1)).isInstanceOf(AssistantMessage.class); |
1280 | 1264 | assertThat(messageListTools.get(2)).isInstanceOf(ToolMessage.class); |
1281 | 1265 | } |
1282 | | - |
1283 | | - @Test |
1284 | | - void testEmbeddingCallWithMasking() { |
1285 | | - |
1286 | | - stubFor( |
1287 | | - post(urlEqualTo("/v2/embeddings")) |
1288 | | - .willReturn( |
1289 | | - aResponse() |
1290 | | - .withStatus(200) |
1291 | | - .withBody( |
1292 | | - """ |
1293 | | - { |
1294 | | - "request_id": "2ee98443-e1ee-9503-b800-e38b5b80fe45", |
1295 | | - "intermediate_results": { |
1296 | | - "input_masking": { |
1297 | | - "message": "Embedding input is masked successfully.", |
1298 | | - "data": { |
1299 | | - "masked_input": "['Hello', 'MASKED_PERSON', '!']" |
1300 | | - } |
1301 | | - } |
1302 | | - }, |
1303 | | - "final_result": { |
1304 | | - "object": "list", |
1305 | | - "data": [ |
1306 | | - { |
1307 | | - "object": "embedding", |
1308 | | - "embedding": [ |
1309 | | - 0.43988228, |
1310 | | - -0.82985526, |
1311 | | - -0.15936942, |
1312 | | - 0.041005015, |
1313 | | - 0.30127057 |
1314 | | - ], |
1315 | | - "index": 0 |
1316 | | - } |
1317 | | - ], |
1318 | | - "model": "text-embedding-3-large", |
1319 | | - "usage": { |
1320 | | - "prompt_tokens": 10, |
1321 | | - "total_tokens": 10 |
1322 | | - } |
1323 | | - } |
1324 | | - } |
1325 | | - """))); |
1326 | | - |
1327 | | - val dpiConfig = |
1328 | | - DPIConfig.create() |
1329 | | - .type(DPIConfig.TypeEnum.SAP_DATA_PRIVACY_INTEGRATION) |
1330 | | - .method(DPIConfig.MethodEnum.ANONYMIZATION) |
1331 | | - .entities(List.of(DPIStandardEntity.create().type(DPIEntities.PERSON))); |
1332 | | - val maskingConfig = MaskingModuleConfigProviders.create().providers(List.of(dpiConfig)); |
1333 | | - |
1334 | | - val modelParams = |
1335 | | - EmbeddingsModelParams.create() |
1336 | | - .encodingFormat(EmbeddingsModelParams.EncodingFormatEnum.FLOAT) |
1337 | | - .dimensions(5) |
1338 | | - .normalize(false); |
1339 | | - val modelConfig = |
1340 | | - EmbeddingsModelConfig.create() |
1341 | | - .model( |
1342 | | - EmbeddingsModelDetails.create().name("text-embedding-3-large").params(modelParams)); |
1343 | | - |
1344 | | - val orchestrationConfig = |
1345 | | - EmbeddingsOrchestrationConfig.create() |
1346 | | - .modules( |
1347 | | - EmbeddingsModuleConfigs.create().embeddings(modelConfig).masking(maskingConfig)); |
1348 | | - |
1349 | | - val inputText = |
1350 | | - EmbeddingsInput.create().text(EmbeddingsInputText.create("['Hello', 'Müller', '!']")); |
1351 | | - |
1352 | | - val request = EmbeddingsPostRequest.create().config(orchestrationConfig).input(inputText); |
1353 | | - |
1354 | | - EmbeddingsPostResponse response = client.embed(request); |
1355 | | - |
1356 | | - assertThat(response).isNotNull(); |
1357 | | - assertThat(response.getRequestId()).isEqualTo("2ee98443-e1ee-9503-b800-e38b5b80fe45"); |
1358 | | - |
1359 | | - val orchestrationResult = response.getFinalResult(); |
1360 | | - assertThat(orchestrationResult).isNotNull(); |
1361 | | - assertThat(orchestrationResult.getObject()).isEqualTo(EmbeddingsResponse.ObjectEnum.LIST); |
1362 | | - assertThat(orchestrationResult.getModel()).isEqualTo("text-embedding-3-large"); |
1363 | | - |
1364 | | - val data = orchestrationResult.getData(); |
1365 | | - assertThat(data).isNotEmpty(); |
1366 | | - assertThat(data.get(0).getEmbedding()) |
1367 | | - .isEqualTo( |
1368 | | - Embedding.create( |
1369 | | - List.of( |
1370 | | - BigDecimal.valueOf(0.43988228), |
1371 | | - BigDecimal.valueOf(-0.82985526), |
1372 | | - BigDecimal.valueOf(-0.15936942), |
1373 | | - BigDecimal.valueOf(0.041005015), |
1374 | | - BigDecimal.valueOf(0.30127057)))); |
1375 | | - assertThat(data.get(0).getIndex()).isZero(); |
1376 | | - |
1377 | | - val usage = orchestrationResult.getUsage(); |
1378 | | - assertThat(usage).isNotNull(); |
1379 | | - assertThat(usage.getPromptTokens()).isEqualTo(10); |
1380 | | - assertThat(usage.getTotalTokens()).isEqualTo(10); |
1381 | | - |
1382 | | - val moduleResults = response.getIntermediateResults(); |
1383 | | - assertThat(moduleResults).isNotNull(); |
1384 | | - assertThat(moduleResults.getInputMasking()).isNotNull(); |
1385 | | - assertThat(moduleResults.getInputMasking().getMessage()) |
1386 | | - .isEqualTo("Embedding input is masked successfully."); |
1387 | | - assertThat(moduleResults.getInputMasking().getData()).isNotNull(); |
1388 | | - assertThat(moduleResults.getInputMasking().getData()) |
1389 | | - .isEqualTo(Map.of("masked_input", "['Hello', 'MASKED_PERSON', '!']")); |
1390 | | - |
1391 | | - verify( |
1392 | | - postRequestedFor(urlEqualTo("/v2/embeddings")) |
1393 | | - .withRequestBody( |
1394 | | - equalToJson( |
1395 | | - """ |
1396 | | - { |
1397 | | - "config": { |
1398 | | - "modules": { |
1399 | | - "embeddings": { |
1400 | | - "model": { |
1401 | | - "name": "text-embedding-3-large", |
1402 | | - "version": "latest", |
1403 | | - "params": { |
1404 | | - "encoding_format": "float", |
1405 | | - "dimensions": 5, |
1406 | | - "normalize": false |
1407 | | - } |
1408 | | - } |
1409 | | - }, |
1410 | | - "masking": { |
1411 | | - "providers": [ |
1412 | | - { |
1413 | | - "type": "sap_data_privacy_integration", |
1414 | | - "method": "anonymization", |
1415 | | - "entities": [ |
1416 | | - { |
1417 | | - "type": "profile-person" |
1418 | | - } |
1419 | | - ], |
1420 | | - "allowlist" : [ ] |
1421 | | - } |
1422 | | - ] |
1423 | | - } |
1424 | | - } |
1425 | | - }, |
1426 | | - "input": { |
1427 | | - "text": "['Hello', 'Müller', '!']" |
1428 | | - } |
1429 | | - } |
1430 | | - """))); |
1431 | | - } |
1432 | 1266 | } |
0 commit comments