Skip to content

Commit 42b4b85

Browse files
committed
Simplifications and cleanup
1 parent 4e7eb97 commit 42b4b85

28 files changed

+271
-2536
lines changed

orchestration/.openapi-generator-ignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,3 @@ settings.gradle
1616
src/main/AndroidManifest.xml
1717
api/
1818
.openapi-generator/
19-
20-
21-
src/main/java/com/sap/ai/sdk/orchestration/client/model/LLMModuleResult.java
22-
src/main/java/com/sap/ai/sdk/orchestration/client/model/ModuleResultsOutputUnmaskingInner.java

orchestration/pom.xml

Lines changed: 87 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@
8585
<groupId>org.slf4j</groupId>
8686
<artifactId>slf4j-api</artifactId>
8787
</dependency>
88+
<dependency>
89+
<groupId>javax.annotation</groupId>
90+
<artifactId>javax.annotation-api</artifactId>
91+
</dependency>
92+
<dependency>
93+
<groupId>com.google.guava</groupId>
94+
<artifactId>guava</artifactId>
95+
</dependency>
8896

8997
<!-- TODO: only needed for JsonObjectMapperBuilder, maybe we can use Jackson natively to avoid this dependency -->
9098
<dependency>
@@ -118,73 +126,88 @@
118126
<artifactId>mockito-core</artifactId>
119127
<scope>test</scope>
120128
</dependency>
121-
122-
<!-- Additional dependencies for OSS code generator resttemplate -->
123-
<dependency>
124-
<groupId>org.openapitools</groupId>
125-
<artifactId>jackson-databind-nullable</artifactId>
126-
</dependency>
127-
<dependency>
128-
<groupId>javax.annotation</groupId>
129-
<artifactId>javax.annotation-api</artifactId>
130-
</dependency>
131-
<dependency>
132-
<groupId>com.google.guava</groupId>
133-
<artifactId>guava</artifactId>
134-
</dependency>
135129
</dependencies>
136130

137-
<build>
138-
<plugins>
139-
<plugin>
140-
<groupId>org.openapitools</groupId>
141-
<artifactId>openapi-generator-maven-plugin</artifactId>
142-
<executions>
143-
<execution>
144-
<goals>
145-
<goal>generate</goal>
146-
</goals>
147-
<phase>generate-sources</phase>
148-
<configuration>
149-
<!-- Specify the input OpenAPI spec file -->
150-
<inputSpec>${project.basedir}/src/main/resources/spec/orchestration.yaml</inputSpec>
151-
<output>${project.basedir}</output>
152-
<!-- Specify the generator to use, e.g., java, spring, kotlin, etc. -->
153-
<generatorName>java</generatorName>
154-
<!-- Specify the package names for models, APIs, and invokers -->
155-
<modelPackage>com.sap.ai.sdk.orchestration.client.model</modelPackage>
156-
<apiPackage>com.sap.ai.sdk.orchestration.client.api</apiPackage>
157-
<invokerPackage>com.sap.ai.sdk.orchestration.client.invoker</invokerPackage>
131+
<profiles>
132+
<profile>
133+
<id>generate</id>
134+
<activation>
135+
<activeByDefault>false</activeByDefault>
136+
<property>
137+
<name>generate</name>
138+
</property>
139+
</activation>
140+
<build>
141+
<plugins>
142+
<plugin>
143+
<groupId>org.openapitools</groupId>
144+
<artifactId>openapi-generator-maven-plugin</artifactId>
145+
<executions>
146+
<execution>
147+
<goals>
148+
<goal>generate</goal>
149+
</goals>
150+
<phase>generate-sources</phase>
151+
<configuration>
152+
<!-- Specify the input OpenAPI spec file -->
153+
<inputSpec>${project.basedir}/src/main/resources/spec/orchestration.yaml</inputSpec>
154+
<output>${project.basedir}</output>
155+
<!-- Specify the generator to use, e.g., java, spring, kotlin, etc. -->
156+
<generatorName>java</generatorName>
157+
<!-- Specify the package names for models, APIs, and invokers -->
158+
<modelPackage>com.sap.ai.sdk.orchestration.client.model</modelPackage>
159+
<apiPackage>com.sap.ai.sdk.orchestration.client.api</apiPackage>
160+
<invokerPackage>com.sap.ai.sdk.orchestration.client.invoker</invokerPackage>
158161

159-
<!-- Global properties level; can be unpacked with 'generate' prefix-->
160-
<globalProperties>
161-
<apiDocs>false</apiDocs>
162-
<modelDocs>false</modelDocs>
163-
<modelTests>false</modelTests>
164-
<apiTests>false</apiTests>
165-
<minimalUpdate>true</minimalUpdate>
166-
</globalProperties>
162+
<!-- Global properties level; can be unpacked with 'generate' prefix-->
163+
<globalProperties>
164+
<apiDocs>false</apiDocs>
165+
<modelDocs>false</modelDocs>
166+
<modelTests>false</modelTests>
167+
<apiTests>false</apiTests>
168+
<minimalUpdate>true</minimalUpdate>
169+
</globalProperties>
167170

168-
<!-- Generator Specific properties level; some can be unpacked-->
169-
<configOptions>
170-
<generateBuilders>true</generateBuilders>
171-
<failOnUnknownProperties>false</failOnUnknownProperties>
172-
<hideGenerationTimestamp>true</hideGenerationTimestamp>
173-
<disallowAdditionalPropertiesIfNotPresent>false</disallowAdditionalPropertiesIfNotPresent>
174-
<enumUnknownDefaultCase>true</enumUnknownDefaultCase>
175-
<useBeanValidation>false</useBeanValidation>
176-
<useOneOfInterfaces>true</useOneOfInterfaces>
177-
<additionalModelTypeAnnotations>@com.google.common.annotations.Beta</additionalModelTypeAnnotations>
178-
</configOptions>
179-
<generateModels>true</generateModels>
180-
<generateSupportingFiles>false</generateSupportingFiles>
181-
<generateApis>false</generateApis>
182-
<library>resttemplate</library>
183-
<!--<configHelp>true</configHelp>-->
171+
<!-- Generator Specific properties level; some can be unpacked-->
172+
<configOptions>
173+
<generateBuilders>true</generateBuilders>
174+
<failOnUnknownProperties>false</failOnUnknownProperties>
175+
<hideGenerationTimestamp>true</hideGenerationTimestamp>
176+
<disallowAdditionalPropertiesIfNotPresent>false</disallowAdditionalPropertiesIfNotPresent>
177+
<enumUnknownDefaultCase>true</enumUnknownDefaultCase>
178+
<useBeanValidation>false</useBeanValidation>
179+
<useOneOfInterfaces>true</useOneOfInterfaces>
180+
<additionalModelTypeAnnotations>@com.google.common.annotations.Beta</additionalModelTypeAnnotations>
181+
</configOptions>
182+
<generateModels>true</generateModels>
183+
<generateSupportingFiles>false</generateSupportingFiles>
184+
<generateApis>false</generateApis>
185+
<library>resttemplate</library>
186+
<!--<configHelp>true</configHelp>-->
187+
</configuration>
188+
</execution>
189+
</executions>
190+
</plugin>
191+
<plugin>
192+
<artifactId>maven-clean-plugin</artifactId>
193+
<configuration>
194+
<filesets>
195+
<fileset>
196+
<directory>${project.basedir}/src/main/java/com/sap/ai/sdk/orchestration/client</directory>
197+
<includes>
198+
<include>**/*</include>
199+
</includes>
200+
</fileset>
201+
</filesets>
184202
</configuration>
185-
</execution>
186-
</executions>
187-
</plugin>
188-
</plugins>
189-
</build>
203+
<executions>
204+
<execution>
205+
<id>delete-orchestration-generated-client</id>
206+
</execution>
207+
</executions>
208+
</plugin>
209+
</plugins>
210+
</build>
211+
</profile>
212+
</profiles>
190213
</project>

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ static TemplatingModuleConfig toTemplateModuleConfig(
4343
* In this case, the request will fail, since the templating module will try to resolve the parameter.
4444
* To be fixed with https://github.tools.sap/AI/llm-orchestration/issues/662
4545
*/
46-
val messages = Option.of(template).map(t -> ((Template) t).getTemplate()).getOrElse(List::of);
46+
val messages =
47+
Option.of(template)
48+
.filter(Template.class::isInstance)
49+
.map(Template.class::cast)
50+
.map(Template::getTemplate)
51+
.getOrElse(List::of);
4752
val messagesWithPrompt = new ArrayList<>(messages);
4853
messagesWithPrompt.addAll(prompt.getMessages());
4954
if (messagesWithPrompt.isEmpty()) {

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
package com.sap.ai.sdk.orchestration;
22

33
import com.fasterxml.jackson.core.JsonParser;
4-
import com.fasterxml.jackson.databind.*;
4+
import com.fasterxml.jackson.databind.DeserializationContext;
5+
import com.fasterxml.jackson.databind.JavaType;
6+
import com.fasterxml.jackson.databind.JsonNode;
7+
import com.fasterxml.jackson.databind.ObjectMapper;
58
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
69
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResult;
710
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResultStreaming;
811
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResultSynchronous;
912
import java.io.IOException;
13+
import java.io.Serial;
1014
import javax.annotation.Nonnull;
15+
import lombok.val;
1116

1217
/**
1318
* A deserializer for {@link LLMModuleResult} that determines the concrete implementation based on
1419
* the structure of the JSON object.
1520
*/
16-
public class LLMModuleResultDeserializer extends StdDeserializer<LLMModuleResult> {
21+
class LLMModuleResultDeserializer extends StdDeserializer<LLMModuleResult> {
22+
// checkstyle requires a serialVersionUid since StdDeserializer implements Serializable
23+
@Serial private static final long serialVersionUID = 1L;
1724

18-
public LLMModuleResultDeserializer() {
25+
/** Default constructor. */
26+
LLMModuleResultDeserializer() {
1927
super(LLMModuleResult.class);
2028
}
2129

@@ -33,32 +41,34 @@ public LLMModuleResultDeserializer() {
3341
* @return The deserialized object.
3442
* @throws IOException If an I/O error occurs.
3543
*/
44+
@Nonnull
3645
@Override
37-
public LLMModuleResult deserialize(JsonParser parser, @Nonnull DeserializationContext context)
46+
public LLMModuleResult deserialize(
47+
@Nonnull final JsonParser parser, @Nonnull final DeserializationContext context)
3848
throws IOException {
3949

4050
// Check if the target type is a concrete class
41-
JavaType targetType = context.getContextualType();
51+
val targetType = context.getContextualType();
4252
if (targetType != null && !LLMModuleResult.class.equals(targetType.getRawClass())) {
4353
return delegateToDefaultDeserializer(parser, context, targetType);
4454
}
4555

4656
// Custom deserialization logic for LLMModuleResult interface
47-
var mapper = (ObjectMapper) parser.getCodec();
48-
var rootNode = mapper.readTree(parser);
57+
val mapper = (ObjectMapper) parser.getCodec();
58+
val rootNode = mapper.readTree(parser);
4959
Class<? extends LLMModuleResult> concreteClass = LLMModuleResultSynchronous.class;
5060

5161
// Inspect the "choices" field
52-
var choicesNode = rootNode.get("choices");
62+
val choicesNode = rootNode.get("choices");
5363
if (choicesNode != null && choicesNode.isArray()) {
54-
var firstChoice = (JsonNode) choicesNode.get(0);
64+
val firstChoice = (JsonNode) choicesNode.get(0);
5565
if (firstChoice != null && firstChoice.has("delta")) {
5666
concreteClass = LLMModuleResultStreaming.class;
5767
}
5868
}
5969

6070
// Create a new parser for the root node
61-
var rootParser = rootNode.traverse(mapper);
71+
val rootParser = rootNode.traverse(mapper);
6272
rootParser.nextToken(); // Advance to the first token
6373

6474
// Use the default deserializer for the concrete class
@@ -75,8 +85,11 @@ public LLMModuleResult deserialize(JsonParser parser, @Nonnull DeserializationCo
7585
* @throws IOException If an I/O error occurs.
7686
*/
7787
private LLMModuleResult delegateToDefaultDeserializer(
78-
JsonParser parser, DeserializationContext context, JavaType concreteType) throws IOException {
79-
var defaultDeserializer = context.findRootValueDeserializer(concreteType);
88+
@Nonnull final JsonParser parser,
89+
@Nonnull final DeserializationContext context,
90+
@Nonnull final JavaType concreteType)
91+
throws IOException {
92+
val defaultDeserializer = context.findRootValueDeserializer(concreteType);
8093
return (LLMModuleResult) defaultDeserializer.deserialize(parser, context);
8194
}
8295
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@
1111
import com.sap.ai.sdk.orchestration.client.model.CompletionPostRequest;
1212
import com.sap.ai.sdk.orchestration.client.model.CompletionPostResponse;
1313
import com.sap.ai.sdk.orchestration.client.model.FilterConfig;
14-
import com.sap.ai.sdk.orchestration.client.model.GroundingModuleConfigConfigFiltersInner;
1514
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResult;
1615
import com.sap.ai.sdk.orchestration.client.model.MaskingProviderConfig;
1716
import com.sap.ai.sdk.orchestration.client.model.ModuleConfigs;
17+
import com.sap.ai.sdk.orchestration.client.model.ModuleResultsOutputUnmaskingInner;
1818
import com.sap.ai.sdk.orchestration.client.model.OrchestrationConfig;
19-
import com.sap.ai.sdk.orchestration.client.model.TemplateRefTemplateRef;
2019
import com.sap.ai.sdk.orchestration.client.model.TemplatingModuleConfig;
2120
import com.sap.cloud.sdk.cloudplatform.connectivity.ApacheHttpClient5Accessor;
2221
import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException;
@@ -47,10 +46,10 @@ public class OrchestrationClient {
4746
.visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
4847
.serializationInclusion(JsonInclude.Include.NON_NULL)
4948
.deserializerByType(LLMModuleResult.class, new LLMModuleResultDeserializer())
49+
.mixIn(LLMModuleResult.class, NoTypeInfoMixin.class)
50+
.mixIn(ModuleResultsOutputUnmaskingInner.class, NoTypeInfoMixin.class)
5051
.mixIn(FilterConfig.class, NoTypeInfoMixin.class)
51-
.mixIn(GroundingModuleConfigConfigFiltersInner.class, NoTypeInfoMixin.class)
5252
.mixIn(MaskingProviderConfig.class, NoTypeInfoMixin.class)
53-
.mixIn(TemplateRefTemplateRef.class, NoTypeInfoMixin.class)
5453
.mixIn(TemplatingModuleConfig.class, NoTypeInfoMixin.class)
5554
.build();
5655
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/client/model/AzureContentSafetyFilterConfig.java

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,42 @@
2929
value = "org.openapitools.codegen.languages.JavaClientCodegen",
3030
comments = "Generator version: 7.9.0")
3131
public class AzureContentSafetyFilterConfig implements FilterConfig {
32-
private TypeEnum type;
32+
/** String represents name of the filter provider */
33+
public enum TypeEnum {
34+
AZURE_CONTENT_SAFETY("azure_content_safety"),
3335

34-
public static final String JSON_PROPERTY_TYPE = "type";
36+
UNKNOWN_DEFAULT_OPEN_API("unknown_default_open_api");
3537

36-
/** Create a builder with no initialized field. */
37-
public static AzureContentSafetyFilterConfig.Builder builder() {
38-
return new AzureContentSafetyFilterConfig.Builder();
38+
private String value;
39+
40+
TypeEnum(String value) {
41+
this.value = value;
42+
}
43+
44+
@JsonValue
45+
public String getValue() {
46+
return value;
47+
}
48+
49+
@Override
50+
public String toString() {
51+
return String.valueOf(value);
52+
}
53+
54+
@JsonCreator
55+
public static TypeEnum fromValue(String value) {
56+
for (TypeEnum b : TypeEnum.values()) {
57+
if (b.value.equals(value)) {
58+
return b;
59+
}
60+
}
61+
return UNKNOWN_DEFAULT_OPEN_API;
62+
}
3963
}
4064

65+
public static final String JSON_PROPERTY_TYPE = "type";
66+
private TypeEnum type;
67+
4168
public static final String JSON_PROPERTY_CONFIG = "config";
4269
private AzureContentSafety config;
4370

@@ -172,37 +199,9 @@ public String toString() {
172199
}
173200
}
174201

175-
/** String represents name of the filter provider */
176-
public enum TypeEnum {
177-
AZURE_CONTENT_SAFETY("azure_content_safety"),
178-
179-
UNKNOWN_DEFAULT_OPEN_API("unknown_default_open_api");
180-
181-
private String value;
182-
183-
TypeEnum(String value) {
184-
this.value = value;
185-
}
186-
187-
@JsonCreator
188-
public static TypeEnum fromValue(String value) {
189-
for (TypeEnum b : TypeEnum.values()) {
190-
if (b.value.equals(value)) {
191-
return b;
192-
}
193-
}
194-
return UNKNOWN_DEFAULT_OPEN_API;
195-
}
196-
197-
@JsonValue
198-
public String getValue() {
199-
return value;
200-
}
201-
202-
@Override
203-
public String toString() {
204-
return String.valueOf(value);
205-
}
202+
/** Create a builder with no initialized field. */
203+
public static AzureContentSafetyFilterConfig.Builder builder() {
204+
return new AzureContentSafetyFilterConfig.Builder();
206205
}
207206

208207
/** Create a builder with a shallow copy of this instance. */

0 commit comments

Comments
 (0)