Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 docs/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

### 📈 Improvements

-
- [RPT] `RptClient.tableCompletion()` GZIP compresses the request payload.

### 🐛 Fixed Issues

Expand Down
4 changes: 4 additions & 0 deletions foundation-models/sap-rpt/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
<artifactId>cloudplatform-connectivity</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.sdk.datamodel</groupId>
<artifactId>openapi-core-apache</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.sdk.datamodel</groupId>
<artifactId>openapi-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.sap.ai.sdk.core.JacksonConfiguration.getDefaultObjectMapper;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.annotations.Beta;
import com.sap.ai.sdk.core.AiCoreService;
import com.sap.ai.sdk.core.DeploymentResolutionException;
Expand All @@ -12,8 +13,15 @@
import com.sap.ai.sdk.foundationmodels.rpt.generated.model.PredictResponsePayload;
import com.sap.ai.sdk.foundationmodels.rpt.generated.model.PredictionConfig;
import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.ApiClient;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.Pair;
import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
Expand All @@ -26,6 +34,7 @@
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class RptClient {
@Nonnull private final DefaultApi api;
@Nonnull private final ApiClient apiClient;

/**
* Creates a new RptClient for the specified foundation model.
Expand All @@ -49,7 +58,7 @@ public static RptClient forModel(@Nonnull final RptModel foundationModel)
*/
static RptClient forDestination(@Nonnull final Destination destination) {
final var apiClient = ApiClient.create(destination).withObjectMapper(getDefaultObjectMapper());
return new RptClient(new DefaultApi(apiClient));
return new RptClient(new DefaultApi(apiClient), apiClient);
}

/**
Expand All @@ -73,8 +82,37 @@ static RptClient forDestination(@Nonnull final Destination destination) {
*/
@Beta
@Nonnull
public PredictResponsePayload tableCompletion(@Nonnull final PredictRequestPayload requestBody) {
return api.predict(requestBody);
public PredictResponsePayload tableCompletion(@Nonnull final PredictRequestPayload requestBody)
throws OpenApiRequestException {

// create path and map variables
final String localVarPath = "/predict";

final StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
final List<Pair> localVarQueryParams = new ArrayList<>();
final List<Pair> localVarCollectionQueryParams = new ArrayList<>();
final Map<String, String> localVarHeaderParams = Map.of("Content-Encoding", "gzip");
final Map<String, Object> localVarFormParams = new HashMap<>();

final String[] localVarAccepts = {"application/json"};
final String localVarAccept = ApiClient.selectHeaderAccept(localVarAccepts);
final String[] localVarContentTypes = {"application/json"};
final String localVarContentType = ApiClient.selectHeaderContentType(localVarContentTypes);

final TypeReference<PredictResponsePayload> localVarReturnType = new TypeReference<>() {};

return apiClient.invokeAPI(
localVarPath,
"POST",
localVarQueryParams,
localVarCollectionQueryParams,
localVarQueryStringJoiner.toString(),
requestBody,
localVarHeaderParams,
localVarFormParams,
localVarAccept,
localVarContentType,
localVarReturnType);
Comment on lines +104 to +115

Choose a reason for hiding this comment

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

This method.. crazy. It reminds me of some Windows API which requires a long list of params. Since this method is still marked with @beta and is public to end-user, I strongly recommend to redesign it.

For example, consider builder pattern to help skip nullable params.

RequestBuilder requestBuilder = new RequestBuilder();
builder
    .setPath('/abc')
    .setMethod('POST')
    .setXYZ()
    .invoke(); // Consider put the request body inside invoke()

Also why is formParams and headerParams Nonnull? They can for sure be null (or by default set to empty Map?)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The ApiClient is straight from OpenAPI Generator. We shouldn't put any effort towards generated code or modified code from OpenAPI.

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import com.sap.ai.sdk.foundationmodels.rpt.generated.model.PredictRequestPayload;
import com.sap.ai.sdk.foundationmodels.rpt.generated.model.PredictResponsePayload;
import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
import com.sap.cloud.sdk.services.openapi.apache.ApiClient;
import com.sap.cloud.sdk.services.openapi.apache.BaseApi;
import com.sap.cloud.sdk.services.openapi.apache.Pair;
import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.ApiClient;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.BaseApi;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.Pair;
import com.sap.cloud.sdk.services.openapi.apache.core.OpenApiRequestException;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
<maven.compiler.proc>full</maven.compiler.proc>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.outputTimestamp>2025-04-03T13:23:00Z</project.build.outputTimestamp>
<cloud-sdk.version>5.26.0</cloud-sdk.version>
<cloud-sdk.version>5.27.0-SNAPSHOT</cloud-sdk.version>

Choose a reason for hiding this comment

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

I guess you need to remove snapshot once cloud sdk is released? So we merge cloud sdk PR first?

<junit-jupiter.version>6.0.3</junit-jupiter.version>
<wiremock.version>3.13.2</wiremock.version>
<assertj-core.version>3.27.7</assertj-core.version>
Expand Down
Loading