Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,38 @@ public record OpenAiModel(@Nonnull String name, @Nullable String version) implem
/** Azure OpenAI dall-e-3 image generate model */
public static final OpenAiModel DALL_E_3 = new OpenAiModel("dall-e-3", null);

/** Azure OpenAI GPT-3.5 Turbo chat completions model */
public static final OpenAiModel GPT_35_TURBO = new OpenAiModel("gpt-35-turbo", null);
/**
* Azure OpenAI GPT-3.5 Turbo chat completions model
*
* @deprecated This model is not usable anymore. It is retired on AI Core since 2024-11-17.
*/
@Deprecated public static final OpenAiModel GPT_35_TURBO = new OpenAiModel("gpt-35-turbo", null);

/** Azure OpenAI GPT-3.5 Turbo chat completions model */
/**
* Azure OpenAI GPT-3.5 Turbo chat completions model
*
* @deprecated This model is not usable anymore. It is retired on AI Core since 2025-02-22.
*/
@Deprecated
public static final OpenAiModel GPT_35_TURBO_1025 = new OpenAiModel("gpt-35-turbo-0125", null);

/** Azure OpenAI GPT-3.5 Turbo chat completions model */
/**
* Azure OpenAI GPT-3.5 Turbo chat completions model
*
* @deprecated This model is not usable anymore. It is retired on AI Core since 2025-02-13.
*/
@Deprecated
public static final OpenAiModel GPT_35_TURBO_16K = new OpenAiModel("gpt-35-turbo-16k", null);

/** Azure OpenAI GPT-4 chat completions model */
public static final OpenAiModel GPT_4 = new OpenAiModel("gpt-4", null);

/** Azure OpenAI GPT-4-32k chat completions model */
public static final OpenAiModel GPT_4_32K = new OpenAiModel("gpt-4-32k", null);
/**
* Azure OpenAI GPT-4-32k chat completions model
*
* @deprecated This model will not be usable anymore on 2025-05-30.
*/
@Deprecated public static final OpenAiModel GPT_4_32K = new OpenAiModel("gpt-4-32k", null);

/** Azure OpenAI GPT-4o chat completions model */
public static final OpenAiModel GPT_4O = new OpenAiModel("gpt-4o", null);
Expand All @@ -54,7 +72,12 @@ public record OpenAiModel(@Nonnull String name, @Nullable String version) implem
public static final OpenAiModel TEXT_EMBEDDING_3_SMALL =
new OpenAiModel("text-embedding-3-small", null);

/** Azure OpenAI Text Embedding ADA 002 model */
/**
* Azure OpenAI Text Embedding ADA 002 model
*
* @deprecated This model is deprecated on AI Core.
*/
@Deprecated
public static final OpenAiModel TEXT_EMBEDDING_ADA_002 =
new OpenAiModel("text-embedding-ada-002", null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,12 @@ public class OrchestrationAiModel {
/** Azure OpenAI GPT-3.5 Turbo chat completions model */
public static final OrchestrationAiModel GPT_35_TURBO = new OrchestrationAiModel("gpt-35-turbo");

/** Azure OpenAI GPT-3.5 Turbo chat completions model */
/**
* Azure OpenAI GPT-3.5 Turbo chat completions model
*
* @deprecated This model is not usable anymore. It is retired on AI Core since 2025-02-13.
*/
@Deprecated
public static final OrchestrationAiModel GPT_35_TURBO_16K =
new OrchestrationAiModel("gpt-35-turbo-16k");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.sap.ai.sdk.orchestration;

import static com.sap.ai.sdk.orchestration.OrchestrationUnitTest.CUSTOM_GPT_35;
import static com.sap.ai.sdk.orchestration.OrchestrationUnitTest.CUSTOM_GPT_4O;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

Expand Down Expand Up @@ -80,7 +80,7 @@ void testMessagesHistory() {
var prompt = new OrchestrationPrompt("bar").messageHistory(List.of(systemMessage));
var actual =
ConfigToRequestTransformer.toCompletionPostRequest(
prompt, new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_35));
prompt, new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_4O));

assertThat(actual.getMessagesHistory()).containsExactly(systemMessage.createChatMessage());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static com.sap.ai.sdk.orchestration.AzureFilterThreshold.ALLOW_SAFE;
import static com.sap.ai.sdk.orchestration.AzureFilterThreshold.ALLOW_SAFE_LOW_MEDIUM;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_35_TURBO_16K;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_4O;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_4O_MINI;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.Parameter.*;
import static org.apache.hc.core5.http.HttpStatus.SC_BAD_REQUEST;
Expand Down Expand Up @@ -82,8 +82,8 @@
*/
@WireMockTest
class OrchestrationUnitTest {
static final OrchestrationAiModel CUSTOM_GPT_35 =
GPT_35_TURBO_16K
static final OrchestrationAiModel CUSTOM_GPT_4O =
GPT_4O
.withParam(MAX_TOKENS, 50)
.withParam(TEMPERATURE, 0.1)
.withParam(FREQUENCY_PENALTY, 0)
Expand All @@ -103,7 +103,7 @@ void setup(WireMockRuntimeInfo server) {
final DefaultHttpDestination destination =
DefaultHttpDestination.builder(server.getHttpBaseUrl()).build();
client = new OrchestrationClient(destination);
config = new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_35);
config = new OrchestrationModuleConfig().withLlmConfig(CUSTOM_GPT_4O);
prompt = new OrchestrationPrompt("Hello World! Why is this phrase so famous?");
ApacheHttpClient5Accessor.setHttpClientCache(ApacheHttpClient5Cache.DISABLED);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
import static com.github.tomakehurst.wiremock.client.WireMock.verify;
import static com.github.tomakehurst.wiremock.stubbing.Scenario.STARTED;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_35_TURBO_16K;
import static com.sap.ai.sdk.orchestration.OrchestrationAiModel.GPT_4O;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
Expand Down Expand Up @@ -61,8 +61,7 @@ void setup(WireMockRuntimeInfo server) {
DefaultHttpDestination.builder(server.getHttpBaseUrl()).build();
client = new OrchestrationChatModel(new OrchestrationClient(destination));
defaultOptions =
new OrchestrationChatOptions(
new OrchestrationModuleConfig().withLlmConfig(GPT_35_TURBO_16K));
new OrchestrationChatOptions(new OrchestrationModuleConfig().withLlmConfig(GPT_4O));
prompt = new Prompt("Hello World! Why is this phrase so famous?", defaultOptions);
ApacheHttpClient5Accessor.setHttpClientCache(ApacheHttpClient5Cache.DISABLED);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config": {
"module_configurations": {
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {
"temperature": 0.1,
"max_tokens": 50,
Expand Down
2 changes: 1 addition & 1 deletion orchestration/src/test/resources/groundingRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config" : {
"module_configurations" : {
"llm_module_config" : {
"model_name" : "gpt-35-turbo-16k",
"model_name" : "gpt-4o",
"model_params" : {
"max_tokens" : 50,
"temperature" : 0.1,
Expand Down
2 changes: 1 addition & 1 deletion orchestration/src/test/resources/maskingRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config": {
"module_configurations": {
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {
"presence_penalty": 0,
"frequency_penalty": 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config": {
"module_configurations": {
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {
"presence_penalty": 0,
"frequency_penalty": 0,
Expand Down
2 changes: 1 addition & 1 deletion orchestration/src/test/resources/templatingRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"tools" : [ ]
},
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {
"max_tokens": 50,
"temperature": 0.1,
Expand Down
2 changes: 1 addition & 1 deletion orchestration/src/test/resources/toolCallsRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config": {
"module_configurations": {
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {},
"model_version": "latest"
},
Expand Down
2 changes: 1 addition & 1 deletion orchestration/src/test/resources/toolCallsRequest2.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"orchestration_config": {
"module_configurations": {
"llm_module_config": {
"model_name": "gpt-35-turbo-16k",
"model_name": "gpt-4o",
"model_params": {},
"model_version": "latest"
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import static org.assertj.core.api.Assertions.assertThat;

import com.sap.ai.sdk.core.model.AiModelBaseData;
import com.sap.ai.sdk.core.model.AiModelVersion;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiModel;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Optional;
import lombok.SneakyThrows;
import org.assertj.core.api.SoftAssertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

Expand All @@ -25,21 +27,45 @@ void openAiModelAvailability() {
final var availableOpenAiModels =
aiModelList.stream()
.filter(model -> model.getExecutableId().equals("azure-openai"))
.map(AiModelBaseData::getModel)
.toList();
.collect(
() -> new HashMap<String, Boolean>(),
(list, model) -> list.put(model.getModel(), isDeprecated(model)),
HashMap::putAll);

// Gather our declared OpenAI models
Field[] declaredFields = OpenAiModel.class.getFields();

// get the models from the OpenAiModel class
List<String> declaredOpenAiModelList = new ArrayList<>();
HashMap<String, Boolean> declaredOpenAiModelList = new HashMap<>();
for (Field field : declaredFields) {
if (field.getType().equals(OpenAiModel.class)) {
declaredOpenAiModelList.add(((OpenAiModel) field.get(null)).name());
declaredOpenAiModelList.put(
((OpenAiModel) field.get(null)).name(), field.isAnnotationPresent(Deprecated.class));
}
}

// Assert that the declared OpenAI models match the expected list
assertThat(declaredOpenAiModelList).containsAll(availableOpenAiModels);
assertThat(declaredOpenAiModelList.keySet()).containsAll(availableOpenAiModels.keySet());

SoftAssertions softly = new SoftAssertions();
for (var model : availableOpenAiModels.entrySet()) {
Boolean declaredDeprecated = declaredOpenAiModelList.get(model.getKey());
softly
.assertThat(declaredDeprecated)
.withFailMessage(
"%s is deprecated:%s on AI Core but deprecated:%s in AI SDK",
model.getKey(), model.getValue(), declaredDeprecated)
.isEqualTo(model.getValue());
}
softly.assertAll();
}

private static boolean isDeprecated(AiModelBaseData model) {
Optional<AiModelVersion> version =
model.getVersions().stream().filter(AiModelVersion::isIsLatest).findFirst();
if (version.isEmpty()) {
throw new RuntimeException();
}
return version.get().isDeprecated();
}
}