Skip to content

Commit 1d39c23

Browse files
Matthias' review
1 parent fd29be9 commit 1d39c23

File tree

6 files changed

+77
-99
lines changed

6 files changed

+77
-99
lines changed

docs/guides/ORCHESTRATION_CHAT_COMPLETION.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,16 @@ In this example, the input will be masked before the call to the LLM. Note that
214214

215215
### Set model parameters
216216

217-
Change your LLM module configuration to add model parameters:
217+
Change your LLM configuration to add model parameters:
218218

219219
```java
220-
LLMModuleConfig llmConfig =
221-
OrchestrationAiModel.GPT_4O.modelParams(
222-
Map.of(
223-
"max_tokens", 50,
224-
"temperature", 0.1,
225-
"frequency_penalty", 0,
226-
"presence_penalty", 0));
220+
OrchestrationAiModel customGPT4O =
221+
OrchestrationAiModel.GPT_4O
222+
.withModelParams(
223+
Map.of(
224+
"max_tokens", 50,
225+
"temperature", 0.1,
226+
"frequency_penalty", 0,
227+
"presence_penalty", 0))
228+
.withModelVersion("2024-05-13");
227229
```
Lines changed: 42 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
11
package com.sap.ai.sdk.orchestration;
22

3+
import com.sap.ai.sdk.core.AiModel;
34
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
45
import java.util.Map;
56
import javax.annotation.Nonnull;
7+
import javax.annotation.Nullable;
68
import lombok.AccessLevel;
7-
import lombok.Getter;
8-
import lombok.RequiredArgsConstructor;
9+
import lombok.AllArgsConstructor;
10+
import lombok.With;
911

1012
/** Large language models available in Orchestration. */
11-
// https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/models-and-scenarios-in-generative-ai-hub
12-
@Getter
13-
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
14-
public class OrchestrationAiModel {
15-
private final LLMModuleConfig config;
13+
@With
14+
@AllArgsConstructor(access = AccessLevel.PRIVATE)
15+
public class OrchestrationAiModel implements AiModel {
16+
/** The name of the model */
17+
private String modelName;
18+
19+
/** The version of the model, defaults to "latest". */
20+
private String modelVersion = "latest";
21+
22+
/**
23+
* Optional parameters on this model.
24+
*
25+
* <pre>{@code
26+
* Map.of(
27+
* "max_tokens", 50,
28+
* "temperature", 0.1,
29+
* "frequency_penalty", 0,
30+
* "presence_penalty", 0)
31+
* }</pre>
32+
*/
33+
private Map<String, Object> modelParams;
1634

1735
/** IBM Granite 13B chat completions model */
1836
public static final OrchestrationAiModel IBM_GRANITE_13B_CHAT =
@@ -50,10 +68,6 @@ public class OrchestrationAiModel {
5068
public static final OrchestrationAiModel CLAUDE_3_5_SONNET =
5169
new OrchestrationAiModel("anthropic--claude-3.5-sonnet");
5270

53-
/** Amazon Titan Embed Text model */
54-
public static final OrchestrationAiModel TITAN_EMBED_TEXT =
55-
new OrchestrationAiModel("amazon--titan-embed-text");
56-
5771
/** Amazon Titan Text Lite model */
5872
public static final OrchestrationAiModel TITAN_TEXT_LITE =
5973
new OrchestrationAiModel("amazon--titan-text-lite");
@@ -75,38 +89,12 @@ public class OrchestrationAiModel {
7589
/** Azure OpenAI GPT-4-32k chat completions model */
7690
public static final OrchestrationAiModel GPT_4_32K = new OrchestrationAiModel("gpt-4-32k");
7791

78-
/** Azure OpenAI Text Embedding Ada 002 model */
79-
public static final OrchestrationAiModel TEXT_EMBEDDING_ADA_002 =
80-
new OrchestrationAiModel("text-embedding-ada-002");
81-
82-
/** Azure OpenAI Text Embedding 3 Small model */
83-
public static final OrchestrationAiModel TEXT_EMBEDDING_3_SMALL =
84-
new OrchestrationAiModel("text-embedding-3-small");
85-
86-
/** Azure OpenAI Text Embedding 3 Large model */
87-
public static final OrchestrationAiModel TEXT_EMBEDDING_3_LARGE =
88-
new OrchestrationAiModel("text-embedding-3-large");
89-
9092
/** Azure OpenAI GPT-4o chat completions model */
9193
public static final OrchestrationAiModel GPT_4O = new OrchestrationAiModel("gpt-4o");
9294

9395
/** Azure OpenAI GPT-4o-mini chat completions model */
9496
public static final OrchestrationAiModel GPT_4O_MINI = new OrchestrationAiModel("gpt-4o-mini");
9597

96-
/** Google Cloud Platform Text Bison model */
97-
public static final OrchestrationAiModel TEXT_BISON = new OrchestrationAiModel("text-bison");
98-
99-
/** Google Cloud Platform Chat Bison model */
100-
public static final OrchestrationAiModel CHAT_BISON = new OrchestrationAiModel("chat-bison");
101-
102-
/** Google Cloud Platform Text Embedding Gecko model */
103-
public static final OrchestrationAiModel TEXT_EMBEDDING_GECKO =
104-
new OrchestrationAiModel("textembedding-gecko");
105-
106-
/** Google Cloud Platform Text Embedding Gecko Multilingual model */
107-
public static final OrchestrationAiModel TEXT_EMBEDDING_GECKO_MULTILINGUAL =
108-
new OrchestrationAiModel("textembedding-gecko-multilingual");
109-
11098
/** Google Cloud Platform Gemini 1.0 Pro model */
11199
public static final OrchestrationAiModel GEMINI_1_0_PRO =
112100
new OrchestrationAiModel("gemini-1.0-pro");
@@ -120,50 +108,28 @@ public class OrchestrationAiModel {
120108
new OrchestrationAiModel("gemini-1.5-flash");
121109

122110
OrchestrationAiModel(@Nonnull final String modelName) {
123-
config = new LLMModuleConfig().modelName(modelName).modelParams(Map.of());
111+
this.modelName = modelName;
124112
}
125113

126-
/**
127-
* Set model version on this model.
128-
*
129-
* <pre>{@code
130-
* .modelVersion("latest")
131-
* }</pre>
132-
*
133-
* @param version The new version.
134-
* @return New instance of this class with new version.
135-
*/
136114
@Nonnull
137-
public OrchestrationAiModel modelVersion(@Nonnull final String version) {
138-
return new OrchestrationAiModel(
139-
new LLMModuleConfig()
140-
.modelVersion(version)
141-
.modelParams(config.getModelParams())
142-
.modelName(config.getModelName()));
115+
LLMModuleConfig createConfig() {
116+
return new LLMModuleConfig()
117+
.modelName(modelName)
118+
.modelParams(modelParams)
119+
.modelVersion(modelVersion);
143120
}
144121

145-
/**
146-
* Set model parameters on this model.
147-
*
148-
* <pre>{@code
149-
* .modelParams(
150-
* Map.of(
151-
* "max_tokens", 50,
152-
* "temperature", 0.1,
153-
* "frequency_penalty", 0,
154-
* "presence_penalty", 0));
155-
* }</pre>
156-
*
157-
* @param modelParams Map of parameters.
158-
* @return New instance of this class.
159-
*/
122+
/** {@inheritDoc} */
160123
@Nonnull
161-
public OrchestrationAiModel modelParams(
162-
@Nonnull final Map<String, ? extends Number> modelParams) {
163-
return new OrchestrationAiModel(
164-
new LLMModuleConfig()
165-
.modelVersion(config.getModelVersion())
166-
.modelParams(modelParams)
167-
.modelName(config.getModelName()));
124+
@Override
125+
public String name() {
126+
return modelName;
127+
}
128+
129+
/** {@inheritDoc} */
130+
@Nullable
131+
@Override
132+
public String version() {
133+
return modelVersion;
168134
}
169135
}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
55
import com.sap.ai.sdk.orchestration.client.model.MaskingModuleConfig;
66
import com.sap.ai.sdk.orchestration.client.model.TemplatingModuleConfig;
7+
import javax.annotation.Nonnull;
78
import javax.annotation.Nullable;
89
import lombok.AccessLevel;
910
import lombok.AllArgsConstructor;
@@ -28,7 +29,6 @@
2829
* </ul>
2930
*/
3031
@Value
31-
@With
3232
@AllArgsConstructor(access = AccessLevel.PRIVATE)
3333
@NoArgsConstructor(force = true)
3434
public class OrchestrationModuleConfig {
@@ -41,11 +41,23 @@ public class OrchestrationModuleConfig {
4141
* A template to be populated with input parameters. Upon request execution, this template will be
4242
* enhanced with any messages and parameter values from {@link OrchestrationPrompt}.
4343
*/
44-
@Nullable TemplatingModuleConfig templateConfig;
44+
@With @Nullable TemplatingModuleConfig templateConfig;
4545

4646
/** A masking configuration to pseudonymous or anonymize sensitive data in the input. */
47-
@Nullable MaskingModuleConfig maskingConfig;
47+
@With @Nullable MaskingModuleConfig maskingConfig;
4848

4949
/** A content filter to filter the prompt. */
50-
@Nullable FilteringModuleConfig filteringConfig;
50+
@With @Nullable FilteringModuleConfig filteringConfig;
51+
52+
/**
53+
* Creates a new configuration with the given LLM configuration.
54+
*
55+
* @param aiModel The LLM configuration to use.
56+
* @return A new configuration with the given LLM configuration.
57+
*/
58+
@Nonnull
59+
public OrchestrationModuleConfig withLlmConfig(@Nonnull final OrchestrationAiModel aiModel) {
60+
return new OrchestrationModuleConfig(
61+
aiModel.createConfig(), templateConfig, maskingConfig, filteringConfig);
62+
}
5163
}

orchestration/src/test/java/com/sap/ai/sdk/orchestration/ConfigToRequestTransformerTest.java

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

3-
import static com.sap.ai.sdk.orchestration.OrchestrationUnitTest.LLM_CONFIG;
3+
import static com.sap.ai.sdk.orchestration.OrchestrationUnitTest.CUSTOM_GPT_35;
44
import static org.assertj.core.api.Assertions.assertThat;
55
import static org.assertj.core.api.Assertions.assertThatThrownBy;
66

@@ -71,7 +71,7 @@ void testMessagesHistory() {
7171
var prompt = new OrchestrationPrompt("bar").messageHistory(List.of(systemMessage));
7272
var actual =
7373
ConfigToRequestTransformer.toCompletionPostRequest(
74-
prompt, new OrchestrationModuleConfig().withLlmConfig(LLM_CONFIG));
74+
prompt, new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_35));
7575

7676
assertThat(actual.getMessagesHistory()).containsExactly(systemMessage);
7777
}

orchestration/src/test/java/com/sap/ai/sdk/orchestration/OrchestrationUnitTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
1717
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
1818
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
19+
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_35_TURBO_16K;
1920
import static com.sap.ai.sdk.orchestration.client.model.AzureThreshold.NUMBER_0;
2021
import static com.sap.ai.sdk.orchestration.client.model.AzureThreshold.NUMBER_4;
2122
import static org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST;
@@ -39,7 +40,6 @@
3940
import com.sap.ai.sdk.orchestration.client.model.FilteringModuleConfig;
4041
import com.sap.ai.sdk.orchestration.client.model.GenericModuleResult;
4142
import com.sap.ai.sdk.orchestration.client.model.InputFilteringConfig;
42-
import com.sap.ai.sdk.orchestration.client.model.LLMModuleConfig;
4343
import com.sap.ai.sdk.orchestration.client.model.LLMModuleResultSynchronous;
4444
import com.sap.ai.sdk.orchestration.client.model.MaskingModuleConfig;
4545
import com.sap.ai.sdk.orchestration.client.model.OutputFilteringConfig;
@@ -62,16 +62,15 @@
6262
*/
6363
@WireMockTest
6464
class OrchestrationUnitTest {
65-
static final LLMModuleConfig LLM_CONFIG =
66-
OrchestrationAiModel.GPT_35_TURBO_16K
67-
.modelParams(
65+
static final OrchestrationAiModel CUSTOM_GPT_35 =
66+
GPT_35_TURBO_16K
67+
.withModelParams(
6868
Map.of(
6969
"max_tokens", 50,
7070
"temperature", 0.1,
7171
"frequency_penalty", 0,
7272
"presence_penalty", 0))
73-
.modelVersion("latest")
74-
.getConfig();
73+
.withModelVersion("latest");
7574
private final Function<String, InputStream> fileLoader =
7675
filename -> Objects.requireNonNull(getClass().getClassLoader().getResourceAsStream(filename));
7776

@@ -107,7 +106,7 @@ void setup(WireMockRuntimeInfo server) {
107106
.forDeploymentByScenario("orchestration")
108107
.withResourceGroup("my-resource-group");
109108
client = new OrchestrationClient(deployment);
110-
config = new OrchestrationModuleConfig().withLlmConfig(LLM_CONFIG);
109+
config = new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_35);
111110
prompt = new OrchestrationPrompt("Hello World! Why is this phrase so famous?");
112111
}
113112

sample-code/spring-app/src/main/java/com/sap/ai/sdk/app/controllers/OrchestrationController.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232
@RequestMapping("/orchestration")
3333
class OrchestrationController {
3434
private final OrchestrationClient client = new OrchestrationClient();
35-
OrchestrationModuleConfig config =
36-
new OrchestrationModuleConfig().withLlmConfig(GPT_35_TURBO.getConfig());
35+
OrchestrationModuleConfig config = new OrchestrationModuleConfig().withLlmConfig(GPT_35_TURBO);
3736

3837
/**
3938
* Chat request to OpenAI through the Orchestration service with a simple prompt.

0 commit comments

Comments
 (0)