Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion orchestration/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<coverage.line>94%</coverage.line>
<coverage.instruction>95%</coverage.instruction>
<coverage.branch>79%</coverage.branch>
<coverage.method>94%</coverage.method>
<coverage.method>93%</coverage.method>
<coverage.class>100%</coverage.class>
</properties>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.sap.ai.sdk.orchestration.model.DPIConfigMaskGroundingInput;
import com.sap.ai.sdk.orchestration.model.DPIEntities;
import com.sap.ai.sdk.orchestration.model.DPIEntityConfig;
import com.sap.ai.sdk.orchestration.model.DPIStandardEntity;
import com.sap.ai.sdk.orchestration.model.MaskingProviderConfig;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -96,7 +97,8 @@ public DpiMasking withAllowList(@Nonnull final List<String> allowList) {
@Nonnull
@Override
public MaskingProviderConfig createConfig() {
val entitiesDTO = entities.stream().map(it -> DPIEntityConfig.create().type(it)).toList();
val entitiesDTO =
entities.stream().map(it -> (DPIEntityConfig) DPIStandardEntity.create().type(it)).toList();
return DPIConfig.create()
.type(SAP_DATA_PRIVACY_INTEGRATION)
.method(maskingMethod)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.sap.ai.sdk.orchestration.model.LLMChoice;
import com.sap.ai.sdk.orchestration.model.LLMModuleResultSynchronous;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
Expand All @@ -15,11 +14,6 @@ final class JacksonMixins {
@JsonDeserialize(as = LLMModuleResultSynchronous.class)
interface LLMModuleResultMixIn {}

/** Mixin to enforce a specific subtype to be deserialized always. */
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
@JsonDeserialize(as = LLMChoice.class)
interface ModuleResultsOutputUnmaskingInnerMixIn {}

@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
interface NoneTypeInfoMixin {}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,45 +1,34 @@
package com.sap.ai.sdk.orchestration;

import com.sap.ai.sdk.core.common.StreamedDelta;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
import com.sap.ai.sdk.orchestration.model.LLMModuleResultSynchronous;
import java.util.Map;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseStreaming;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import lombok.val;

/** Orchestration chat completion output delta for streaming. */
public class OrchestrationChatCompletionDelta extends CompletionPostResponse
public class OrchestrationChatCompletionDelta extends CompletionPostResponseStreaming
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accepted breaking change, very minor

implements StreamedDelta {

@Nonnull
@Override
// will be fixed once the generated code add a discriminator which will allow this class to extend
// CompletionPostResponseStreaming
@SuppressWarnings("unchecked")
public String getDeltaContent() {
val choices = ((LLMModuleResultSynchronous) getOrchestrationResult()).getChoices();
val choices = getOrchestrationResult().getChoices();
// Avoid the first delta: "choices":[]
if (!choices.isEmpty()
// Multiple choices are spread out on multiple deltas
// A delta only contains one choice with a variable index
&& choices.get(0).getIndex() == 0) {

final var message = (Map<String, Object>) choices.get(0).toMap().get("delta");
// Avoid the second delta: "choices":[{"delta":{"content":"","role":"assistant"}}]
if (message != null && message.get("content") != null) {
return message.get("content").toString();
}
final var message = choices.get(0).getDelta();
return message.getContent();
}
return "";
}

@Nullable
@Override
public String getFinishReason() {
return ((LLMModuleResultSynchronous) getOrchestrationResult())
.getChoices()
.get(0)
.getFinishReason();
return getOrchestrationResult().getChoices().get(0).getFinishReason();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
import com.sap.ai.sdk.orchestration.model.AssistantChatMessage;
import com.sap.ai.sdk.orchestration.model.ChatMessage;
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
import com.sap.ai.sdk.orchestration.model.LLMChoice;
import com.sap.ai.sdk.orchestration.model.LLMModuleResultSynchronous;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseSynchronous;
import com.sap.ai.sdk.orchestration.model.LLMChoiceSynchronous;
import com.sap.ai.sdk.orchestration.model.SystemChatMessage;
import com.sap.ai.sdk.orchestration.model.TokenUsage;
import com.sap.ai.sdk.orchestration.model.ToolChatMessage;
Expand All @@ -23,7 +22,7 @@
@Value
@RequiredArgsConstructor(access = PACKAGE)
public class OrchestrationChatResponse {
CompletionPostResponse originalResponse;
CompletionPostResponseSynchronous originalResponse;

/**
* Get the message content from the output.
Expand All @@ -50,7 +49,7 @@ public String getContent() throws OrchestrationClientException {
*/
@Nonnull
public TokenUsage getTokenUsage() {
return ((LLMModuleResultSynchronous) originalResponse.getOrchestrationResult()).getUsage();
return originalResponse.getOrchestrationResult().getUsage();
}

/**
Expand Down Expand Up @@ -98,13 +97,11 @@ public List<Message> getAllMessages() throws IllegalArgumentException {
/**
* Get the LLM response. Useful for accessing the finish reason or further data like logprobs.
*
* @return The (first, in case of multiple) {@link LLMChoice}.
* @return The (first, in case of multiple) {@link LLMChoiceSynchronous}.
*/
@Nonnull
public LLMChoice getChoice() {
public LLMChoiceSynchronous getChoice() {
// We expect choices to be defined and never empty.
return ((LLMModuleResultSynchronous) originalResponse.getOrchestrationResult())
.getChoices()
.get(0);
return originalResponse.getOrchestrationResult().getChoices().get(0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import com.sap.ai.sdk.core.common.ClientStreamingHandler;
import com.sap.ai.sdk.core.common.StreamedDelta;
import com.sap.ai.sdk.orchestration.model.CompletionPostRequest;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseSynchronous;
import com.sap.ai.sdk.orchestration.model.ModuleConfigs;
import com.sap.ai.sdk.orchestration.model.OrchestrationConfig;
import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Accessor;
Expand Down Expand Up @@ -148,8 +148,8 @@ private static void throwOnContentFilter(@Nonnull final OrchestrationChatComplet
* @throws OrchestrationClientException If the request fails.
*/
@Nonnull
public CompletionPostResponse executeRequest(@Nonnull final CompletionPostRequest request)
throws OrchestrationClientException {
public CompletionPostResponseSynchronous executeRequest(
@Nonnull final CompletionPostRequest request) throws OrchestrationClientException {
final String jsonRequest;
try {
jsonRequest = JACKSON.writeValueAsString(request);
Expand Down Expand Up @@ -209,7 +209,7 @@ public OrchestrationChatResponse executeRequestFromJsonModuleConfig(
}

@Nonnull
CompletionPostResponse executeRequest(@Nonnull final String request) {
CompletionPostResponseSynchronous executeRequest(@Nonnull final String request) {
val postRequest = new HttpPost("/completion");
postRequest.setEntity(new StringEntity(request, ContentType.APPLICATION_JSON));

Expand All @@ -219,7 +219,7 @@ CompletionPostResponse executeRequest(@Nonnull final String request) {
val client = ApacheHttpClient5Accessor.getHttpClient(destination);
val handler =
new ClientResponseHandler<>(
CompletionPostResponse.class,
CompletionPostResponseSynchronous.class,
OrchestrationError.class,
OrchestrationClientException::new)
.objectMapper(JACKSON);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.fasterxml.jackson.annotation.JsonCreator;
import com.google.common.annotations.Beta;
import com.sap.ai.sdk.core.common.ClientError;
import com.sap.ai.sdk.orchestration.model.ErrorResponse;
import com.sap.ai.sdk.orchestration.model.ErrorResponseSynchronous;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand All @@ -18,7 +18,7 @@
@Value
@Beta
public class OrchestrationError implements ClientError {
ErrorResponse originalResponse;
ErrorResponseSynchronous originalResponse;

/**
* Gets the error message from the contained original response.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.google.common.annotations.Beta;
import com.sap.ai.sdk.orchestration.model.ChatMessage;
import com.sap.ai.sdk.orchestration.model.LLMModuleResult;
import com.sap.ai.sdk.orchestration.model.ModuleResultsOutputUnmaskingInner;
import com.sap.ai.sdk.orchestration.model.TemplateResponseFormat;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
Expand Down Expand Up @@ -37,11 +35,6 @@ public static ObjectMapper getOrchestrationObjectMapper() {

val jackson = getDefaultObjectMapper();

// Add mix-ins
jackson.addMixIn(LLMModuleResult.class, JacksonMixins.LLMModuleResultMixIn.class);
jackson.addMixIn(
ModuleResultsOutputUnmaskingInner.class,
JacksonMixins.ModuleResultsOutputUnmaskingInnerMixIn.class);
jackson.addMixIn(ChatMessage.class, JacksonMixins.ChatMessageMixin.class);

final var module =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class CompletionPostResponseStreaming
private String requestId;

@JsonProperty("module_results")
private ModuleResults moduleResults;
private ModuleResultsStreaming moduleResults;

@JsonProperty("orchestration_result")
private LLMModuleResultStreaming orchestrationResult;
Expand Down Expand Up @@ -84,7 +84,7 @@ public void setRequestId(@Nonnull final String requestId) {
*/
@Nonnull
public CompletionPostResponseStreaming moduleResults(
@Nullable final ModuleResults moduleResults) {
@Nullable final ModuleResultsStreaming moduleResults) {
this.moduleResults = moduleResults;
return this;
}
Expand All @@ -96,7 +96,7 @@ public CompletionPostResponseStreaming moduleResults(
* instance.
*/
@Nonnull
public ModuleResults getModuleResults() {
public ModuleResultsStreaming getModuleResults() {
return moduleResults;
}

Expand All @@ -105,7 +105,7 @@ public ModuleResults getModuleResults() {
*
* @param moduleResults The moduleResults of this {@link CompletionPostResponseStreaming}
*/
public void setModuleResults(@Nullable final ModuleResults moduleResults) {
public void setModuleResults(@Nullable final ModuleResultsStreaming moduleResults) {
this.moduleResults = moduleResults;
}

Expand Down
Loading