Note: This method is marked as {@link Beta} because it uses generated API types in its - * public signature. - * * @return The {@link ErrorResponse} object, or {@code null} if not available. */ - @Beta @Nullable public ErrorResponse getErrorResponse() { final var clientError = super.getClientError(); diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/TextInputChannel.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/TextInputChannel.java index bbd78c40a..f1d2dadd2 100644 --- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/TextInputChannel.java +++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/TextInputChannel.java @@ -1,13 +1,11 @@ package com.sap.ai.sdk.foundationmodels.openai; -import com.google.common.annotations.Beta; import javax.annotation.Nonnull; /** * Allows to input (send) text to the open channel, must be closed when not needed anymore (e.g. * try-with-resources) */ -@Beta public interface TextInputChannel extends AutoCloseable { /** @@ -15,6 +13,5 @@ public interface TextInputChannel extends AutoCloseable { * * @param text text to send */ - @Beta void sendText(@Nonnull final String text); } diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioInputChannel.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioInputChannel.java index af37b6b43..2f017c041 100644 --- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioInputChannel.java +++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioInputChannel.java @@ -1,13 +1,10 @@ package com.sap.ai.sdk.foundationmodels.openai.realtime; -import com.google.common.annotations.Beta; - /** * Functional interface representing audio input channel (used by audio data producer) * *
Should be closed by application (try-with-resources) when not needed anymore
*/
-@Beta
public interface AudioInputChannel extends AutoCloseable {
/**
@@ -17,6 +14,5 @@ public interface AudioInputChannel extends AutoCloseable {
*
* @param rawBytesChunk binary data in the depending on the use case format
*/
- @Beta
void inputAudio(byte[] rawBytesChunk);
}
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioOutputChannel.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioOutputChannel.java
index 1d8733184..4271e3f1a 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioOutputChannel.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/AudioOutputChannel.java
@@ -1,9 +1,6 @@
package com.sap.ai.sdk.foundationmodels.openai.realtime;
-import com.google.common.annotations.Beta;
-
/** Functional interface representing audio output channel (audio data consumer) */
-@Beta
public interface AudioOutputChannel {
/**
@@ -16,6 +13,5 @@ public interface AudioOutputChannel {
* single logical entity (e.g. gets called at the end when all byte parts of a single message
* get passed)
*/
- @Beta
void outputAudio(byte[] rawBytesChunk, boolean isLast);
}
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/OpenAiRealtimeClient.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/OpenAiRealtimeClient.java
index 98ce597ac..116a52827 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/OpenAiRealtimeClient.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/OpenAiRealtimeClient.java
@@ -1,6 +1,5 @@
package com.sap.ai.sdk.foundationmodels.openai.realtime;
-import com.google.common.annotations.Beta;
import com.sap.ai.sdk.foundationmodels.openai.TextInputChannel;
import com.sap.cloud.sdk.cloudplatform.connectivity.Destination;
import com.sap.cloud.sdk.cloudplatform.connectivity.Header;
@@ -12,7 +11,6 @@
* OpenAI client implementation of Realtime API. Abstracts technical implementation, transport and
* threading and exposes business-level operations (high level interface)
*/
-@Beta
public class OpenAiRealtimeClient {
static final int PATH_BUFFER_SIZE =
@@ -25,7 +23,6 @@ public class OpenAiRealtimeClient {
*
* @param destination - destination to use
*/
- @Beta
public OpenAiRealtimeClient(@Nonnull final Destination destination) {
this.destination = destination;
}
@@ -58,7 +55,6 @@ public OpenAiRealtimeClient(@Nonnull final Destination destination) {
* @return input channel, allowing for text input
*/
@Nonnull
- @Beta
public TextInputChannel textToSpeech(
@Nonnull final AudioOutputChannel audioOutputConsumer,
@Nonnull final RealtimeParam... params) {
@@ -94,7 +90,6 @@ public TextInputChannel textToSpeech(
* bit)
*/
@Nonnull
- @Beta
public AudioInputChannel speechToSpeech(
@Nonnull final AudioOutputChannel audioOutputConsumer,
@Nonnull final RealtimeParam... params) {
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParam.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParam.java
index 26214db7b..f1ad5a6cd 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParam.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParam.java
@@ -1,11 +1,9 @@
package com.sap.ai.sdk.foundationmodels.openai.realtime;
-import com.google.common.annotations.Beta;
import javax.annotation.Nonnull;
-/** Represents possible configuration params of realtime client */
-@Beta
-public interface RealtimeParam {
+/** Represents possible configuration params of realtime client Internal sdk usage only */
+public abstract class RealtimeParam {
/** Represents configurable options */
enum ParamName {
/** Voice name to use to produce sound */
@@ -19,13 +17,16 @@ enum ParamName {
SYSTEM_PROMPT,
}
+ /** Internal use only. Can only be extended or constructed in the same package. */
+ RealtimeParam() {}
+
/**
* Returns param name
*
* @return name
*/
@Nonnull
- ParamName getParamName();
+ abstract ParamName getParamName();
/**
* Returns string value representation of the param
@@ -33,5 +34,5 @@ enum ParamName {
* @return string value
*/
@Nonnull
- String getValueAsString();
+ abstract String getValueAsString();
}
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamSystemPrompt.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamSystemPrompt.java
index 10ec75d3a..b505b6483 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamSystemPrompt.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamSystemPrompt.java
@@ -1,13 +1,11 @@
package com.sap.ai.sdk.foundationmodels.openai.realtime;
-import com.google.common.annotations.Beta;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** Allows to configure model system prompt */
-@Beta
-public final class RealtimeParamSystemPrompt implements RealtimeParam {
+public final class RealtimeParamSystemPrompt extends RealtimeParam {
private final String systemPrompt;
@@ -16,25 +14,23 @@ public final class RealtimeParamSystemPrompt implements RealtimeParam {
*
* @param systemPrompt system prompt to use
*/
- @Beta
public RealtimeParamSystemPrompt(@Nonnull final String systemPrompt) {
this.systemPrompt = systemPrompt;
}
@Override
- @Beta
- public @Nonnull ParamName getParamName() {
+ @Nonnull
+ ParamName getParamName() {
return ParamName.SYSTEM_PROMPT;
}
@Override
- @Beta
- public @Nonnull String getValueAsString() {
+ @Nonnull
+ String getValueAsString() {
return systemPrompt;
}
@Override
- @Beta
public boolean equals(@Nullable final Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
@@ -44,7 +40,6 @@ public boolean equals(@Nullable final Object o) {
}
@Override
- @Beta
public int hashCode() {
return Objects.hashCode(systemPrompt);
}
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamTurnDetection.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamTurnDetection.java
index cb087bca2..f1c8433da 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamTurnDetection.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamTurnDetection.java
@@ -1,16 +1,13 @@
package com.sap.ai.sdk.foundationmodels.openai.realtime;
-import com.google.common.annotations.Beta;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
/** Allows to configure turn detection (how model responds). */
-@Beta
-public final class RealtimeParamTurnDetection implements RealtimeParam {
+public final class RealtimeParamTurnDetection extends RealtimeParam {
/** Model tries to recognize if/when it should respond automatically */
- @Beta
public static final RealtimeParamTurnDetection BY_MODEL_AUTO =
new RealtimeParamTurnDetection("BY_MODEL_AUTO");
@@ -19,7 +16,6 @@ public final class RealtimeParamTurnDetection implements RealtimeParam {
* Less convenient than the automatic option but may give lower latency in some cases (model does
* not need to perform additional turn detection analysis).
*/
- @Beta
public static final RealtimeParamTurnDetection EACH_CALL_IS_A_TURN =
new RealtimeParamTurnDetection("EACH_CALL_IS_A_TURN");
@@ -30,19 +26,18 @@ public final class RealtimeParamTurnDetection implements RealtimeParam {
}
@Override
- @Beta
- public @Nonnull ParamName getParamName() {
+ @Nonnull
+ ParamName getParamName() {
return ParamName.TURN_DETECTION;
}
@Override
- @Beta
- public @Nonnull String getValueAsString() {
+ @Nonnull
+ String getValueAsString() {
return turnDetectionKind;
}
@Override
- @Beta
public boolean equals(@Nullable final Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
@@ -52,7 +47,6 @@ public boolean equals(@Nullable final Object o) {
}
@Override
- @Beta
public int hashCode() {
return Objects.hashCode(turnDetectionKind);
}
diff --git a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamVoice.java b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamVoice.java
index e5ff23f0b..eb7464550 100644
--- a/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamVoice.java
+++ b/foundation-models/openai/src/main/java/com/sap/ai/sdk/foundationmodels/openai/realtime/RealtimeParamVoice.java
@@ -6,14 +6,13 @@
import javax.annotation.Nullable;
/** Allows to configure model output voice */
-@Beta
-public final class RealtimeParamVoice implements RealtimeParam {
+public final class RealtimeParamVoice extends RealtimeParam {
/** Standard voice 1 */
- @Beta public static final RealtimeParamVoice DEFAULT_1 = new RealtimeParamVoice("DEFAULT_1");
+ public static final RealtimeParamVoice DEFAULT_1 = new RealtimeParamVoice("DEFAULT_1");
/** Standard voice 2 */
- @Beta public static final RealtimeParamVoice DEFAULT_2 = new RealtimeParamVoice("DEFAULT_2");
+ public static final RealtimeParamVoice DEFAULT_2 = new RealtimeParamVoice("DEFAULT_2");
private final String voice;
@@ -37,19 +36,18 @@ public static RealtimeParamVoice withExplicitVoice(@Nonnull final String voiceNa
}
@Override
- @Beta
- public @Nonnull ParamName getParamName() {
+ @Nonnull
+ ParamName getParamName() {
return ParamName.OUTPUT_VOICE;
}
@Override
- @Beta
- public @Nonnull String getValueAsString() {
+ @Nonnull
+ String getValueAsString() {
return voice;
}
@Override
- @Beta
public boolean equals(@Nullable final Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
@@ -59,7 +57,6 @@ public boolean equals(@Nullable final Object o) {
}
@Override
- @Beta
public int hashCode() {
return Objects.hashCode(voice);
}
diff --git a/foundation-models/openai/src/test/java/com/sap/ai/sdk/foundationmodels/openai/OpenAiClientGeneratedTest.java b/foundation-models/openai/src/test/java/com/sap/ai/sdk/foundationmodels/openai/OpenAiClientGeneratedTest.java
index 3a213116e..9a64ee972 100644
--- a/foundation-models/openai/src/test/java/com/sap/ai/sdk/foundationmodels/openai/OpenAiClientGeneratedTest.java
+++ b/foundation-models/openai/src/test/java/com/sap/ai/sdk/foundationmodels/openai/OpenAiClientGeneratedTest.java
@@ -88,14 +88,6 @@ void apiVersion() {
exactly(1),
postRequestedFor(anyUrl()).withQueryParam("api-version", equalTo("2024-02-01")));
- Try.of(
- () -> client.withApiVersion("fooBar").chatCompletion(new OpenAiChatCompletionRequest("")));
- verify(exactly(1), postRequestedFor(anyUrl()).withQueryParam("api-version", equalTo("fooBar")));
-
- assertThat(client)
- .describedAs(
- "withApiVersion should return a new object, the sut object should remain unchanged")
- .isNotSameAs(client.withApiVersion("fooBar"));
Try.of(() -> client.chatCompletion(new OpenAiChatCompletionRequest("")));
verify(
exactly(2),
diff --git a/foundation-models/sap-rpt/pom.xml b/foundation-models/sap-rpt/pom.xml
index 920e16877..215b91a1b 100644
--- a/foundation-models/sap-rpt/pom.xml
+++ b/foundation-models/sap-rpt/pom.xml
@@ -76,10 +76,6 @@
Note: This method is marked as {@link Beta} because it uses generated API types in its - * public signature. - * *
200 - Successful Prediction * *
400 - Bad Request - Invalid input data @@ -87,8 +83,8 @@ static RptClient forDestination( * embedded {@link com.sap.ai.sdk.foundationmodels.rpt.generated.model.PredictionConfig} is * set to {@code null} on the passed-in object as a side effect. */ - @Beta @Nonnull + @SuppressWarnings("PMD.PublicApiExposesModelType") // we consider model class stable public PredictResponsePayload tableCompletion(@Nonnull final PredictRequestPayload requestBody) { if (!contextModePossible) { configFrom(requestBody).setContextMode(null); @@ -111,9 +107,6 @@ private static PredictionConfig configFrom(@Nonnull final PredictRequestPayload * Make in-context predictions for specified target columns based on provided table data Parquet * file. * - *
Note: This method is marked as {@link Beta} because it uses generated API types in its - * public signature. - * *
200 - Successful Prediction * *
400 - Bad Request - Invalid input data
@@ -132,7 +125,7 @@ private static PredictionConfig configFrom(@Nonnull final PredictRequestPayload
* set to {@code null} as a side effect.
* @since 1.16.0
*/
- @Beta
+ @SuppressWarnings("PMD.PublicApiExposesModelType") // we consider model class stable
@Nonnull
public PredictResponsePayload tableCompletion(
@Nonnull final File parquetFile, @Nonnull final PredictionConfig predictionConfig) {
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/AssistantMessage.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/AssistantMessage.java
index 29e83c5bb..120ef2ce3 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/AssistantMessage.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/AssistantMessage.java
@@ -13,6 +13,7 @@
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import lombok.AccessLevel;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Value;
@@ -21,9 +22,10 @@
/** Represents a chat message as 'assistant' to the orchestration service. */
@Value
+@EqualsAndHashCode(callSuper = true)
@Accessors(fluent = true)
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-public class AssistantMessage implements Message {
+public class AssistantMessage extends Message {
/** The role of the assistant. */
@Nonnull String role = "assistant";
@@ -39,6 +41,19 @@ public class AssistantMessage implements Message {
@Nullable
List SAP
* AI Core: Orchestration - Input Filtering
@@ -15,25 +14,23 @@
* SAP
* AI Core: Orchestration - Output Filtering
*/
-public interface ContentFilter {
+public abstract class ContentFilter {
/**
- * A method that produces the serializable equivalent {@link InputFilterConfig} object from data
- * encapsulated in the {@link ContentFilter} object.
+ * For internal SDK usage only. A method that produces the serializable equivalent {@link
+ * InputFilterConfig} object from data encapsulated in the {@link ContentFilter} object.
*
* @return the corresponding {@link InputFilterConfig} object.
*/
- @Beta
@Nonnull
- InputFilterConfig createInputFilterConfig();
+ abstract InputFilterConfig createInputFilterConfig();
/**
- * A method that produces the serializable equivalent {@link OutputFilterConfig} object from data
- * encapsulated in the {@link ContentFilter} object.
+ * For internal SDK usage only. A method that produces the serializable equivalent {@link
+ * OutputFilterConfig} object from data encapsulated in the {@link ContentFilter} object.
*
* @return the corresponding {@link OutputFilterConfig} object.
*/
- @Beta
@Nonnull
- OutputFilterConfig createOutputFilterConfig();
+ abstract OutputFilterConfig createOutputFilterConfig();
}
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/DpiMasking.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/DpiMasking.java
index 181a6c335..d6b72eded 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/DpiMasking.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/DpiMasking.java
@@ -16,6 +16,7 @@
import java.util.stream.Stream;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
+import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Value;
@@ -30,9 +31,10 @@
* Core: Orchestration - Data Masking
*/
@Value
+@EqualsAndHashCode(callSuper = true)
@Getter(AccessLevel.PACKAGE)
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-public class DpiMasking implements MaskingProvider {
+public class DpiMasking extends MaskingProvider {
@Nonnull DPIConfig.MethodEnum maskingMethod;
@Nonnull List SAP AI
* Core: Orchestration - Grounding
*/
-@FunctionalInterface
-public interface GroundingProvider {
+public abstract class GroundingProvider {
+
+ /**
+ * Internal class. Package-local inheritance only. Not supposed to be implemented outside of AI
+ * SDK.
+ */
+ GroundingProvider() {}
/**
* Create a grounding configuration.
@@ -18,5 +23,5 @@ public interface GroundingProvider {
* @return the grounding configuration
*/
@Nonnull
- GroundingModuleConfig createConfig();
+ abstract GroundingModuleConfig createConfig();
}
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/LlamaGuardFilter.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/LlamaGuardFilter.java
index b312d882c..89e941a6b 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/LlamaGuardFilter.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/LlamaGuardFilter.java
@@ -33,20 +33,20 @@
*/
@Accessors(fluent = true)
@Setter
-public class LlamaGuardFilter implements ContentFilter {
+public class LlamaGuardFilter extends ContentFilter {
@SuppressWarnings("PMD.LombokGetterSetterExposesModelType")
private LlamaGuard38b config = LlamaGuard38b.create();
@Nonnull
@Override
- public LlamaGuard38bFilterConfig createInputFilterConfig() {
+ LlamaGuard38bFilterConfig createInputFilterConfig() {
return LlamaGuard38bFilterConfig.create().type(LLAMA_GUARD_3_8B).config(config);
}
@Nonnull
@Override
- public LlamaGuard38bFilterConfig createOutputFilterConfig() {
+ LlamaGuard38bFilterConfig createOutputFilterConfig() {
return createInputFilterConfig();
}
}
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/MaskingProvider.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/MaskingProvider.java
index 804aff91d..10e5d52aa 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/MaskingProvider.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/MaskingProvider.java
@@ -9,7 +9,13 @@
* SAP AI
* Core: Orchestration - Data Masking
*/
-public interface MaskingProvider {
+public abstract class MaskingProvider {
+
+ /**
+ * Internal class. Package-local inheritance only. Not supposed to be implemented outside of AI
+ * SDK.
+ */
+ MaskingProvider() {}
/**
* Create a masking configuration.
@@ -17,5 +23,5 @@ public interface MaskingProvider {
* @return the masking configuration
*/
@Nonnull
- DPIConfig createConfig();
+ abstract DPIConfig createConfig();
}
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/Message.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/Message.java
index 89e667c6c..ae3f37548 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/Message.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/Message.java
@@ -5,9 +5,18 @@
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import lombok.EqualsAndHashCode;
-/** Interface representing convenience wrappers of chat message to the orchestration service. */
-public sealed interface Message permits AssistantMessage, SystemMessage, ToolMessage, UserMessage {
+/**
+ * Contract-representing class for convenience wrappers of chat message to the orchestration
+ * service.
+ */
+@EqualsAndHashCode
+public abstract class Message {
+
+ /** Internal SDK usage only. Limit inheritance visibility to package-local scope */
+ Message() {}
+ ;
/**
* A convenience method to create a user message from a string.
@@ -16,7 +25,7 @@ public sealed interface Message permits AssistantMessage, SystemMessage, ToolMes
* @return the user message.
*/
@Nonnull
- static UserMessage user(@Nonnull final String message) {
+ public static UserMessage user(@Nonnull final String message) {
return user(message, null);
}
@@ -29,7 +38,7 @@ static UserMessage user(@Nonnull final String message) {
* @return the user message.
*/
@Nonnull
- static UserMessage user(
+ public static UserMessage user(
@Nonnull final String message, @Nullable final CacheControl cacheControl) {
return new UserMessage(message, cacheControl);
}
@@ -42,7 +51,7 @@ static UserMessage user(
* @since 1.3.0
*/
@Nonnull
- static UserMessage user(@Nonnull final ImageItem imageItem) {
+ public static UserMessage user(@Nonnull final ImageItem imageItem) {
return new UserMessage(new MessageContent(List.of(imageItem)));
}
@@ -54,7 +63,7 @@ static UserMessage user(@Nonnull final ImageItem imageItem) {
* @since 1.18.0
*/
@Nonnull
- static UserMessage user(@Nonnull final Path filePath) {
+ public static UserMessage user(@Nonnull final Path filePath) {
return new UserMessage(new MessageContent(List.of())).withFile(filePath);
}
@@ -65,7 +74,7 @@ static UserMessage user(@Nonnull final Path filePath) {
* @return the assistant message.
*/
@Nonnull
- static AssistantMessage assistant(@Nonnull final String message) {
+ public static AssistantMessage assistant(@Nonnull final String message) {
return new AssistantMessage(message);
}
@@ -76,7 +85,7 @@ static AssistantMessage assistant(@Nonnull final String message) {
* @return the system message.
*/
@Nonnull
- static SystemMessage system(@Nonnull final String message) {
+ public static SystemMessage system(@Nonnull final String message) {
return system(message, null);
}
@@ -90,7 +99,7 @@ static SystemMessage system(@Nonnull final String message) {
* @return the system message
*/
@Nonnull
- static SystemMessage system(
+ public static SystemMessage system(
@Nonnull final String message, @Nullable final CacheControl cacheControl) {
return new SystemMessage(message, cacheControl);
}
@@ -101,7 +110,7 @@ static SystemMessage system(
* @return the corresponding {@code ChatMessage} object.
*/
@Nonnull
- ChatMessage createChatMessage();
+ abstract ChatMessage createChatMessage();
/**
* Returns the role of the assistant.
@@ -109,7 +118,7 @@ static SystemMessage system(
* @return the role.
*/
@Nonnull
- String role();
+ public abstract String role();
/**
* Returns the content of the message.
@@ -117,5 +126,5 @@ static SystemMessage system(
* @return the content.
*/
@Nonnull
- MessageContent content();
+ public abstract MessageContent content();
}
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClient.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClient.java
index 955a04def..a450a092f 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClient.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClient.java
@@ -2,11 +2,7 @@
import static com.sap.ai.sdk.orchestration.OrchestrationJacksonConfiguration.getOrchestrationObjectMapper;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.annotations.Beta;
import com.sap.ai.sdk.core.AiCoreService;
import com.sap.ai.sdk.orchestration.model.CompletionPostRequest;
import com.sap.ai.sdk.orchestration.model.CompletionPostResponse;
@@ -192,49 +188,6 @@ public OrchestrationChatResponse chatCompletionUsingReference(
return new OrchestrationChatResponse(response);
}
- /**
- * Perform a request to the orchestration service using a module configuration provided as JSON
- * string. This can be useful when building a configuration in the AI Launchpad UI and exporting
- * it as JSON. Furthermore, this allows for using features that are not yet supported natively by
- * the API.
- *
- * NOTE: This method does not support streaming.
- *
- * @param prompt The input parameters and optionally message history to use for prompt execution.
- * @param moduleConfig The module configuration in JSON format.
- * @return The completion response.
- * @throws OrchestrationClientException If the request fails.
- */
- @Beta
- @Nonnull
- public OrchestrationChatResponse executeRequestFromJsonModuleConfig(
- @Nonnull final OrchestrationPrompt prompt, @Nonnull final String moduleConfig)
- throws OrchestrationClientException {
- if (!prompt.getMessages().isEmpty()) {
- throw new IllegalArgumentException(
- "Prompt must not contain any messages when using a JSON module configuration, as the template is already defined in the JSON.");
- }
-
- final ObjectNode requestJson = JACKSON.createObjectNode();
- final var chatMessageHistory =
- prompt.getMessagesHistory().stream().map(Message::createChatMessage).toList();
- requestJson.set("messages_history", JACKSON.valueToTree(chatMessageHistory));
- requestJson.set("input_params", JACKSON.valueToTree(prompt.getTemplateParameters()));
-
- final JsonNode moduleConfigJson;
- try {
- moduleConfigJson = JACKSON.readTree(moduleConfig);
- } catch (JsonProcessingException e) {
- throw new IllegalArgumentException(
- "The provided module configuration is not valid JSON: " + moduleConfig, e);
- }
- requestJson.set("orchestration_config", moduleConfigJson);
-
- return new OrchestrationChatResponse(
- executor.execute(
- COMPLETION_ENDPOINT, requestJson, CompletionPostResponse.class, customHeaders));
- }
-
/**
* Generate a completion for the given request object.
*
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClientException.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClientException.java
index 5c136bea6..0c16152c6 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClientException.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationClientException.java
@@ -2,7 +2,6 @@
import static java.util.Locale.ROOT;
-import com.google.common.annotations.Beta;
import com.sap.ai.sdk.core.common.ClientException;
import com.sap.ai.sdk.core.common.ClientExceptionFactory;
import com.sap.ai.sdk.orchestration.OrchestrationFilterException.Input;
@@ -119,13 +118,9 @@ public OrchestrationError getClientError() {
/**
* Retrieves the {@link ErrorResponse} from the orchestration service, if available.
*
- * Note: This method is marked as {@link Beta} because it uses generated API types in its
- * public signature.
- *
* @return The {@link ErrorResponse} object, or {@code null} if not available.
* @since 1.10.0
*/
- @Beta
@Nullable
public ErrorResponse getErrorResponse() {
if (getClientError() instanceof OrchestrationError.Synchronous orchestrationError) {
@@ -137,13 +132,9 @@ public ErrorResponse getErrorResponse() {
/**
* Retrieves the {@link ErrorResponseStreaming} from the orchestration service, if available.
*
- * Note: This method is marked as {@link Beta} because it uses generated API types in its
- * public signature.
- *
* @return The {@link ErrorResponseStreaming} object, or {@code null} if not available.
* @since 1.10.0
*/
- @Beta
@Nullable
public ErrorResponseStreaming getErrorResponseStreaming() {
if (getClientError() instanceof OrchestrationError.Streaming orchestrationError) {
diff --git a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializer.java b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializer.java
index 4279995b8..5d948d3be 100644
--- a/orchestration/src/main/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializer.java
+++ b/orchestration/src/main/java/com/sap/ai/sdk/orchestration/PolymorphicFallbackDeserializer.java
@@ -5,7 +5,6 @@
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
-import com.google.common.annotations.Beta;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -24,7 +23,6 @@
* @since 1.2.0
* @param