Skip to content

Commit 6c5a512

Browse files
fixed copy
1 parent 6cdd6a7 commit 6c5a512

File tree

4 files changed

+79
-59
lines changed

4 files changed

+79
-59
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
import lombok.NoArgsConstructor;
1616
import lombok.val;
1717

18-
/** Factory to create all data objects from an orchestration configuration. */
18+
/** Internal factory to create all data objects from an orchestration configuration. */
1919
@NoArgsConstructor(access = AccessLevel.NONE)
20-
final class ConfigToRequestTransformer {
20+
public final class ConfigToRequestTransformer {
2121
@Nonnull
2222
static CompletionPostRequest toCompletionPostRequest(
2323
@Nonnull final OrchestrationPrompt prompt, @Nonnull final OrchestrationModuleConfig config) {
@@ -59,8 +59,9 @@ static TemplatingModuleConfig toTemplateModuleConfig(
5959
return Template.create().template(messagesWithPrompt);
6060
}
6161

62+
/** Internal method to convert the convenience configuration to the data objec configuration. */
6263
@Nonnull
63-
static ModuleConfigs toModuleConfigs(@Nonnull final OrchestrationModuleConfig config) {
64+
public static ModuleConfigs toModuleConfigs(@Nonnull final OrchestrationModuleConfig config) {
6465
val llmConfig =
6566
Option.of(config.getLlmConfig())
6667
.getOrElseThrow(() -> new IllegalStateException("LLM config is required."));

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

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
package com.sap.ai.sdk.orchestration;
22

3-
import static com.sap.ai.sdk.core.JacksonConfiguration.getDefaultObjectMapper;
3+
import static com.sap.ai.sdk.orchestration.OrchestrationJacksonConfiguration.getOrchestrationObjectMapper;
44

55
import com.fasterxml.jackson.core.JsonProcessingException;
66
import com.fasterxml.jackson.databind.JsonNode;
77
import com.fasterxml.jackson.databind.ObjectMapper;
8-
import com.fasterxml.jackson.databind.module.SimpleModule;
98
import com.fasterxml.jackson.databind.node.ObjectNode;
109
import com.google.common.annotations.Beta;
1110
import com.sap.ai.sdk.core.AiCoreService;
1211
import com.sap.ai.sdk.core.DeploymentResolutionException;
1312
import com.sap.ai.sdk.core.common.ClientResponseHandler;
1413
import com.sap.ai.sdk.core.common.ClientStreamingHandler;
1514
import com.sap.ai.sdk.core.common.StreamedDelta;
16-
import com.sap.ai.sdk.orchestration.model.ChatMessagesInner;
1715
import com.sap.ai.sdk.orchestration.model.CompletionPostRequest;
1816
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
19-
import com.sap.ai.sdk.orchestration.model.LLMModuleResult;
2017
import com.sap.ai.sdk.orchestration.model.ModuleConfigs;
21-
import com.sap.ai.sdk.orchestration.model.ModuleResultsOutputUnmaskingInner;
2218
import com.sap.ai.sdk.orchestration.model.OrchestrationConfig;
2319
import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Accessor;
2420
import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
@@ -41,25 +37,7 @@
4137
public class OrchestrationClient {
4238
private static final String DEFAULT_SCENARIO = "orchestration";
4339

44-
static final ObjectMapper JACKSON;
45-
46-
static {
47-
JACKSON = getDefaultObjectMapper();
48-
49-
// Add mix-ins
50-
JACKSON.addMixIn(LLMModuleResult.class, JacksonMixins.LLMModuleResultMixIn.class);
51-
JACKSON.addMixIn(
52-
ModuleResultsOutputUnmaskingInner.class,
53-
JacksonMixins.ModuleResultsOutputUnmaskingInnerMixIn.class);
54-
55-
final var module =
56-
new SimpleModule()
57-
.addDeserializer(
58-
ChatMessagesInner.class,
59-
PolymorphicFallbackDeserializer.fromJsonSubTypes(ChatMessagesInner.class))
60-
.setMixInAnnotation(ChatMessagesInner.class, JacksonMixins.NoneTypeInfoMixin.class);
61-
JACKSON.registerModule(module);
62-
}
40+
static final ObjectMapper JACKSON = getOrchestrationObjectMapper();
6341

6442
@Nonnull private final Supplier<HttpDestination> destinationSupplier;
6543

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.sap.ai.sdk.orchestration;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.module.SimpleModule;
5+
import com.google.common.annotations.Beta;
6+
import com.sap.ai.sdk.orchestration.model.ChatMessagesInner;
7+
import com.sap.ai.sdk.orchestration.model.LLMModuleResult;
8+
import com.sap.ai.sdk.orchestration.model.ModuleResultsOutputUnmaskingInner;
9+
import lombok.AccessLevel;
10+
import lombok.NoArgsConstructor;
11+
12+
import javax.annotation.Nonnull;
13+
14+
import static com.sap.ai.sdk.core.JacksonConfiguration.getDefaultObjectMapper;
15+
16+
/** Internal utility class for getting a default object mapper with preset configuration. */
17+
@NoArgsConstructor(access = AccessLevel.NONE)
18+
public class OrchestrationJacksonConfiguration
19+
{
20+
21+
/**
22+
* Default object mapper used for JSON de-/serialization. <b>Only intended for internal usage
23+
* within this SDK</b>. Largely follows the defaults set by Spring.
24+
*
25+
* @return A new object mapper with the default configuration.
26+
* @see <a
27+
* href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/converter/json/Jackson2ObjectMapperBuilder.html">Jackson2ObjectMapperBuilder</a>
28+
*/
29+
@Nonnull
30+
@Beta
31+
public static ObjectMapper getOrchestrationObjectMapper() {
32+
33+
ObjectMapper JACKSON = getDefaultObjectMapper();
34+
35+
// Add mix-ins
36+
JACKSON.addMixIn(LLMModuleResult.class, JacksonMixins.LLMModuleResultMixIn.class);
37+
JACKSON.addMixIn(
38+
ModuleResultsOutputUnmaskingInner.class,
39+
JacksonMixins.ModuleResultsOutputUnmaskingInnerMixIn.class);
40+
41+
final var module =
42+
new SimpleModule()
43+
.addDeserializer(
44+
ChatMessagesInner.class,
45+
PolymorphicFallbackDeserializer.fromJsonSubTypes(ChatMessagesInner.class))
46+
.setMixInAnnotation(ChatMessagesInner.class, JacksonMixins.NoneTypeInfoMixin.class);
47+
JACKSON.registerModule(module);
48+
return JACKSON;
49+
}
50+
}

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

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package com.sap.ai.sdk.orchestration.spring;
22

3+
import static com.sap.ai.sdk.orchestration.ConfigToRequestTransformer.toModuleConfigs;
34
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.FREQUENCY_PENALTY;
45
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.MAX_TOKENS;
56
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.PRESENCE_PENALTY;
67
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.TEMPERATURE;
78
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.TOP_P;
9+
import static com.sap.ai.sdk.orchestration.OrchestrationJacksonConfiguration.getOrchestrationObjectMapper;
810

11+
import com.fasterxml.jackson.core.JsonProcessingException;
12+
import com.fasterxml.jackson.databind.ObjectMapper;
913
import com.google.common.annotations.Beta;
1014
import com.sap.ai.sdk.orchestration.OrchestrationModuleConfig;
1115
import com.sap.ai.sdk.orchestration.model.LLMModuleConfig;
16+
import com.sap.ai.sdk.orchestration.model.ModuleConfigs;
1217
import java.util.List;
1318
import java.util.Map;
1419
import java.util.Objects;
@@ -32,6 +37,8 @@
3237
@Setter(AccessLevel.NONE)
3338
public class OrchestrationChatOptions implements ChatOptions {
3439

40+
private static final ObjectMapper JACKSON = getOrchestrationObjectMapper();
41+
3542
@Getter(AccessLevel.PUBLIC)
3643
@Setter(AccessLevel.PUBLIC)
3744
@Nonnull
@@ -49,10 +56,6 @@ public String getModel() {
4956
return getLlmConfigNonNull().getModelName();
5057
}
5158

52-
private void setModel(@Nonnull final String model) {
53-
getLlmConfigNonNull().setModelName(model);
54-
}
55-
5659
/**
5760
* Returns the model version to use for the chat. "latest" by default.
5861
*
@@ -63,10 +66,6 @@ public String getModelVersion() {
6366
return getLlmConfigNonNull().getModelVersion();
6467
}
6568

66-
private void setModelVersion(@Nonnull final String modelVersion) {
67-
getLlmConfigNonNull().setModelVersion(modelVersion);
68-
}
69-
7069
/**
7170
* Returns the frequency penalty to use for the chat.
7271
*
@@ -153,22 +152,24 @@ public Double getTopP() {
153152
@Nonnull
154153
@Override
155154
public <T extends ChatOptions> T copy() {
156-
val copy = new OrchestrationChatOptions(config);
157-
158-
copy.setModel(this.getModel());
159-
copy.setModelVersion(this.getModelVersion());
160-
setLlmConfigParam(copy, FREQUENCY_PENALTY.getName(), getFrequencyPenalty());
161-
setLlmConfigParam(copy, MAX_TOKENS.getName(), getMaxTokens());
162-
setLlmConfigParam(copy, PRESENCE_PENALTY.getName(), getPresencePenalty());
163-
setLlmConfigParam(copy, "stop_sequences", getStopSequences());
164-
setLlmConfigParam(copy, TEMPERATURE.getName(), getTemperature());
165-
setLlmConfigParam(copy, "top_k", getTopK());
166-
setLlmConfigParam(copy, TOP_P.getName(), getTopP());
167-
168-
return (T) copy;
155+
try {
156+
val json = JACKSON.writeValueAsString(toModuleConfigs(config));
157+
val copy = JACKSON.readValue(json, ModuleConfigs.class);
158+
val copyConfig =
159+
new OrchestrationModuleConfig()
160+
.withTemplateConfig(copy.getTemplatingModuleConfig())
161+
.withFilteringConfig(copy.getFilteringModuleConfig())
162+
.withLlmConfig(copy.getLlmModuleConfig())
163+
.withMaskingConfig(copy.getMaskingModuleConfig())
164+
.withGroundingConfig(copy.getGroundingModuleConfig());
165+
return (T) new OrchestrationChatOptions(copyConfig);
166+
167+
} catch (JsonProcessingException e) {
168+
throw new RuntimeException(e);
169+
}
169170
}
170171

171-
@SuppressWarnings("unchecked")
172+
@SuppressWarnings("unchecked") // getModelParams() returns Object, it should return Map
172173
@Nullable
173174
private <T> T getLlmConfigParam(@Nonnull final String param) {
174175
if (getLlmConfigNonNull().getModelParams() instanceof Map) {
@@ -177,16 +178,6 @@ private <T> T getLlmConfigParam(@Nonnull final String param) {
177178
return null;
178179
}
179180

180-
@SuppressWarnings("unchecked")
181-
private void setLlmConfigParam(
182-
@Nonnull final OrchestrationChatOptions copy,
183-
@Nonnull final String param,
184-
@Nullable final Object value) {
185-
if (value != null) {
186-
((Map<String, Object>) copy.getLlmConfigNonNull().getModelParams()).put(param, value);
187-
}
188-
}
189-
190181
@Nonnull
191182
private LLMModuleConfig getLlmConfigNonNull() {
192183
return Objects.requireNonNull(

0 commit comments

Comments
 (0)