Skip to content

Commit f39df51

Browse files
Refactor AiCoreDeployment (#100)
1 parent f5d0795 commit f39df51

File tree

3 files changed

+66
-93
lines changed

3 files changed

+66
-93
lines changed
Lines changed: 18 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,44 @@
11
package com.sap.ai.sdk.core;
22

3-
import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination;
43
import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
5-
import com.sap.cloud.sdk.cloudplatform.connectivity.DestinationProperty;
4+
import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException;
5+
import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationNotFoundException;
66
import com.sap.cloud.sdk.services.openapi.apiclient.ApiClient;
7-
import java.util.function.Function;
7+
import java.util.function.Supplier;
88
import javax.annotation.Nonnull;
99
import lombok.AccessLevel;
10-
import lombok.Getter;
1110
import lombok.RequiredArgsConstructor;
1211

1312
/** Connectivity convenience methods for AI Core with deployment. */
14-
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
13+
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
1514
public class AiCoreDeployment implements AiCoreDestination {
15+
private final AiCoreService aiCoreService;
1616

17-
private static final String AI_RESOURCE_GROUP = "URL.headers.AI-Resource-Group";
18-
19-
// the delegating AI Core Service instance
20-
@Nonnull private final AiCoreService service;
21-
22-
// the deployment id handler to be used, based on instance
23-
@Nonnull private final Function<AiCoreDeployment, String> deploymentId;
24-
25-
// the resource group, "default" if null
26-
@Getter(AccessLevel.PROTECTED)
27-
@Nonnull
28-
private final String resourceGroup;
17+
@Nonnull private final Supplier<String> deploymentId;
2918

3019
/**
31-
* Default constructor with "default" resource group.
20+
* Set the resource group.
3221
*
33-
* @param service The AI Core service.
34-
* @param deploymentId The deployment id handler.
22+
* @param resourceGroup The resource group, default value "default".
23+
* @return A new instance of the AI Core service.
3524
*/
36-
public AiCoreDeployment(
37-
@Nonnull final AiCoreService service,
38-
@Nonnull final Function<AiCoreDeployment, String> deploymentId) {
39-
this(service, deploymentId, "default");
25+
@Nonnull
26+
public AiCoreDeployment withResourceGroup(@Nonnull final String resourceGroup) {
27+
aiCoreService.resourceGroup = resourceGroup;
28+
return this;
4029
}
4130

4231
@Nonnull
4332
@Override
44-
public Destination destination() {
45-
final var dest = service.baseDestinationHandler.apply(service);
46-
final var builder = service.builderHandler.apply(service, dest);
47-
destinationSetUrl(builder, dest);
48-
destinationSetHeaders(builder);
49-
return builder.build();
33+
public Destination destination() throws DestinationAccessException, DestinationNotFoundException {
34+
aiCoreService.deploymentId = deploymentId.get();
35+
return aiCoreService.destination();
5036
}
5137

5238
@Nonnull
5339
@Override
5440
public ApiClient client() {
55-
final var destination = destination();
56-
return service.clientHandler.apply(service, destination);
57-
}
58-
59-
/**
60-
* Update and set the URL for the destination.
61-
*
62-
* @param builder The destination builder.
63-
* @param dest The original destination reference.
64-
*/
65-
protected void destinationSetUrl(
66-
@Nonnull final DefaultHttpDestination.Builder builder, @Nonnull final Destination dest) {
67-
String uri = dest.get(DestinationProperty.URI).get();
68-
if (!uri.endsWith("/")) {
69-
uri = uri + "/";
70-
}
71-
builder.uri(uri + "v2/inference/deployments/%s/".formatted(getDeploymentId()));
72-
}
73-
74-
/**
75-
* Update and set the default request headers for the destination.
76-
*
77-
* @param builder The destination builder.
78-
*/
79-
protected void destinationSetHeaders(@Nonnull final DefaultHttpDestination.Builder builder) {
80-
builder.property(AI_RESOURCE_GROUP, getResourceGroup());
81-
}
82-
83-
/**
84-
* Set the resource group.
85-
*
86-
* @param resourceGroup The resource group.
87-
* @return A new instance of the AI Core service.
88-
*/
89-
@Nonnull
90-
public AiCoreDeployment withResourceGroup(@Nonnull final String resourceGroup) {
91-
return new AiCoreDeployment(service, deploymentId, resourceGroup);
92-
}
93-
94-
/**
95-
* Get the deployment id.
96-
*
97-
* @return The deployment id.
98-
*/
99-
@Nonnull
100-
protected String getDeploymentId() {
101-
return deploymentId.apply(this);
41+
aiCoreService.deploymentId = deploymentId.get();
42+
return aiCoreService.client();
10243
}
10344
}

core/src/main/java/com/sap/ai/sdk/core/AiCoreService.java

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,24 @@
3232
@RequiredArgsConstructor
3333
public class AiCoreService implements AiCoreDestination {
3434

35-
final Function<AiCoreService, Destination> baseDestinationHandler;
35+
Function<AiCoreService, Destination> baseDestinationHandler;
3636
final BiFunction<AiCoreService, Destination, ApiClient> clientHandler;
3737
final BiFunction<AiCoreService, Destination, DefaultHttpDestination.Builder> builderHandler;
3838

3939
private static final DeploymentCache DEPLOYMENT_CACHE = new DeploymentCache();
4040

41+
private static final String AI_RESOURCE_GROUP = "URL.headers.AI-Resource-Group";
42+
43+
/** The resource group is defined by AiCoreDeployment.withResourceGroup(). */
44+
@Nonnull String resourceGroup;
45+
46+
/** The deployment id is set by AiCoreDeployment.destination() or AiCoreDeployment.client(). */
47+
@Nonnull String deploymentId;
48+
4149
/** The default constructor. */
4250
public AiCoreService() {
43-
this(
44-
AiCoreService::getBaseDestination,
45-
AiCoreService::getApiClient,
46-
AiCoreService::getDestinationBuilder);
51+
this(AiCoreService::getApiClient, AiCoreService::getDestinationBuilder, "default", "");
52+
baseDestinationHandler = AiCoreService::getBaseDestination;
4753
}
4854

4955
@Nonnull
@@ -57,18 +63,48 @@ public ApiClient client() {
5763
@Override
5864
public Destination destination() {
5965
final var dest = baseDestinationHandler.apply(this);
60-
return builderHandler.apply(this, dest).build();
66+
final var builder = builderHandler.apply(this, dest);
67+
if (!deploymentId.isEmpty()) {
68+
destinationSetUrl(builder, dest);
69+
destinationSetHeaders(builder);
70+
}
71+
return builder.build();
72+
}
73+
74+
/**
75+
* Update and set the URL for the destination.
76+
*
77+
* @param builder The destination builder.
78+
* @param dest The original destination reference.
79+
*/
80+
protected void destinationSetUrl(
81+
@Nonnull final DefaultHttpDestination.Builder builder, @Nonnull final Destination dest) {
82+
String uri = dest.get(DestinationProperty.URI).get();
83+
if (!uri.endsWith("/")) {
84+
uri = uri + "/";
85+
}
86+
builder.uri(uri + "v2/inference/deployments/%s/".formatted(deploymentId));
87+
}
88+
89+
/**
90+
* Update and set the default request headers for the destination.
91+
*
92+
* @param builder The destination builder.
93+
*/
94+
protected void destinationSetHeaders(@Nonnull final DefaultHttpDestination.Builder builder) {
95+
builder.property(AI_RESOURCE_GROUP, resourceGroup);
6196
}
6297

6398
/**
6499
* Set a specific base destination.
65100
*
66101
* @param destination The destination to be used for AI Core service calls.
67-
* @return A new instance of the AI Core Service based on the provided destination.
102+
* @return The AI Core Service based on the provided destination.
68103
*/
69104
@Nonnull
70105
public AiCoreService withDestination(@Nonnull final Destination destination) {
71-
return new AiCoreService((service) -> destination, clientHandler, builderHandler);
106+
baseDestinationHandler = (service) -> destination;
107+
return this;
72108
}
73109

74110
/**
@@ -79,7 +115,7 @@ public AiCoreService withDestination(@Nonnull final Destination destination) {
79115
*/
80116
@Nonnull
81117
public AiCoreDeployment forDeployment(@Nonnull final String deploymentId) {
82-
return new AiCoreDeployment(this, obj -> deploymentId);
118+
return new AiCoreDeployment(this, () -> deploymentId);
83119
}
84120

85121
/**
@@ -95,9 +131,7 @@ public AiCoreDeployment forDeploymentByModel(@Nonnull final String modelName)
95131
throws NoSuchElementException {
96132
return new AiCoreDeployment(
97133
this,
98-
obj ->
99-
DEPLOYMENT_CACHE.getDeploymentIdByModel(
100-
this.client(), obj.getResourceGroup(), modelName));
134+
() -> DEPLOYMENT_CACHE.getDeploymentIdByModel(this.client(), resourceGroup, modelName));
101135
}
102136

103137
/**
@@ -113,9 +147,7 @@ public AiCoreDeployment forDeploymentByScenario(@Nonnull final String scenarioId
113147
throws NoSuchElementException {
114148
return new AiCoreDeployment(
115149
this,
116-
obj ->
117-
DEPLOYMENT_CACHE.getDeploymentIdByScenario(
118-
this.client(), obj.getResourceGroup(), scenarioId));
150+
() -> DEPLOYMENT_CACHE.getDeploymentIdByScenario(client(), resourceGroup, scenarioId));
119151
}
120152

121153
/**

core/src/test/java/com/sap/ai/sdk/core/AiCoreServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected ApiClient getApiClient(@Nonnull Destination destination) {
121121
final var destination = customServiceForDeployment.destination().asHttp();
122122
assertThat(destination.getUri()).hasToString("https://ai/v2/inference/deployments/deployment/");
123123

124-
final var resourceGroup = customServiceForDeployment.getResourceGroup();
124+
final var resourceGroup = customService.resourceGroup;
125125
assertThat(resourceGroup).isEqualTo("group");
126126
}
127127
}

0 commit comments

Comments
 (0)