Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
9b4f24c
wip
vladimir-a-sap Sep 11, 2026
269ffa9
Formatting
bot-sdk-js Sep 11, 2026
acc1719
wip
vladimir-a-sap Sep 15, 2026
91834ff
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
0936310
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
7b731ea
Formatting
bot-sdk-js Sep 17, 2026
5232ea5
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
86a5df6
Merge branch 'revisit-beta-annotations' of github.com:SAP/ai-sdk-java…
vladimir-a-sap Sep 17, 2026
077f104
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
aeff862
Formatting
bot-sdk-js Sep 17, 2026
d8e6b79
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
f720254
Merge branch 'revisit-beta-annotations' of github.com:SAP/ai-sdk-java…
vladimir-a-sap Sep 17, 2026
1275fe2
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
ab421b1
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
ced7576
Formatting
bot-sdk-js Sep 17, 2026
94176b7
actualize @beta annotations
vladimir-a-sap Sep 17, 2026
7f9a092
Merge branch 'revisit-beta-annotations' of github.com:SAP/ai-sdk-java…
vladimir-a-sap Sep 17, 2026
3e77308
Merge branch 'v2' into revisit-beta-annotations
vladimir-a-sap Sep 18, 2026
7cfe086
Formatting
bot-sdk-js Sep 18, 2026
9db0ff9
Merge branch 'v2' into revisit-beta-annotations
vladimir-a-sap Sep 23, 2026
0b30a71
address pr feedback and implement agreed refactoring changes
vladimir-a-sap Sep 23, 2026
d9aa679
address pr feedback, update release notes, remove few more @beta anno…
vladimir-a-sap Sep 24, 2026
91cf772
update release notes
vladimir-a-sap Sep 24, 2026
dc4fa2e
improve code style
vladimir-a-sap Sep 24, 2026
b6c1bc0
remove message internal methods from public api
vladimir-a-sap Sep 24, 2026
fc7d6fa
revert deprecated constructor removal
vladimir-a-sap Sep 24, 2026
7f77230
polish the api
vladimir-a-sap Sep 24, 2026
ee65339
Formatting
bot-sdk-js Sep 24, 2026
de6ea34
fix checkstyle issue
vladimir-a-sap Sep 24, 2026
98e5453
Merge branch 'revisit-beta-annotations' of github.com:SAP/ai-sdk-java…
vladimir-a-sap Sep 24, 2026
ef982c8
Update docs/release_notes.md
vladimir-a-sap Sep 25, 2026
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
4 changes: 0 additions & 4 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,6 @@
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
Expand Down
2 changes: 0 additions & 2 deletions core/src/main/java/com/sap/ai/sdk/core/AiCoreService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import static com.sap.ai.sdk.core.JacksonConfiguration.getDefaultObjectMapper;

import com.fasterxml.jackson.databind.json.JsonMapper;
import com.google.common.annotations.Beta;
import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination;
import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
import com.sap.cloud.sdk.cloudplatform.connectivity.exception.DestinationAccessException;
Expand Down Expand Up @@ -139,7 +138,6 @@ protected String buildDeploymentPath(@Nonnull final String deploymentId) {
*
* @param resourceGroup the resource group of the deleted deployment, usually "default".
*/
@Beta
Comment thread
vladimir-a-sap marked this conversation as resolved.
public void reloadCachedDeployments(@Nonnull final String resourceGroup) {
deploymentResolver.reloadDeployments(resourceGroup);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.Beta;
import io.vavr.control.Try;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
Expand All @@ -20,7 +19,7 @@
import org.apache.hc.core5.http.io.entity.EntityUtils;

/**
* Parse incoming JSON responses and handles any errors. For internal use only.
* For internal SDK use only. Parse incoming JSON responses and handles any errors.
*
* @param <T> The type of the successful response.
* @param <E> The type of the exception to throw.
Expand All @@ -44,20 +43,20 @@ public class ClientResponseHandler<T, R extends ClientError, E extends ClientExc
@Nonnull ObjectMapper objectMapper = getDefaultObjectMapper();

/**
* Set the {@link ObjectMapper} to use for parsing JSON responses.
* Internal SDK usage only. Set the {@link ObjectMapper} to use for parsing JSON responses.
*
* @param jackson The {@link ObjectMapper} to use
* @return the current instance of {@link ClientResponseHandler} with the changed object mapper
*/
@Beta
Comment thread
vladimir-a-sap marked this conversation as resolved.
@Nonnull
public ClientResponseHandler<T, R, E> objectMapper(@Nonnull final ObjectMapper jackson) {
objectMapper = jackson;
return this;
}

/**
* Processes a {@link ClassicHttpResponse} and returns some value corresponding to that response.
* Internal SDK usage only. Processes a {@link ClassicHttpResponse} and returns some value
* corresponding to that response.
*
* @param response The response to process
* @return A model class instantiated from the response
Expand Down Expand Up @@ -101,7 +100,7 @@ private Try<String> tryGetContent(@Nonnull final HttpEntity entity) {
}

/**
* Process the error response and throw an exception.
* For internal SDK usage only. Process the error response and throw an exception.
*
* @param httpResponse The response to process
* @throws ClientException if the response is an error (4xx/5xx)
Expand Down Expand Up @@ -142,7 +141,8 @@ protected void buildAndThrowException(@Nonnull final ClassicHttpResponse httpRes
}

/**
* Parses the JSON content of an error response and throws a module specific exception.
* For internal SDK usage only. Parses the JSON content of an error response and throws a module
* specific exception.
*
* @param content The JSON content of the error response.
* @param httpResponse The HTTP response that contains the error.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.Beta;
import java.io.IOException;
import java.util.stream.Stream;
import javax.annotation.Nonnull;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.core5.http.ClassicHttpResponse;

/**
* Parse incoming JSON responses and handles any errors. For internal use only.
* For internal SDK usage only. Parse incoming JSON responses and handles any errors. For internal
* use only.
*
* @param <D> The type of the response.
* @param <E> The type of the exception to throw.
Expand All @@ -24,20 +24,19 @@ public class ClientStreamingHandler<
extends ClientResponseHandler<D, R, E> {

/**
* Set the {@link ObjectMapper} to use for parsing JSON responses.
* For internal SDK usage only. Set the {@link ObjectMapper} to use for parsing JSON responses.
*
* @param jackson The {@link ObjectMapper} to use
* @return the current instance of {@link ClientStreamingHandler} with the changed object mapper
*/
@Nonnull
@Beta
public ClientStreamingHandler<D, R, E> objectMapper(@Nonnull final ObjectMapper jackson) {
Comment thread
vladimir-a-sap marked this conversation as resolved.
super.objectMapper(jackson);
return this;
}

/**
* Creates a new instance of the {@link ClientStreamingHandler}.
* For internal SDK usage only. Creates a new instance of the {@link ClientStreamingHandler}.
*
* @param deltaType The type of the response.
* @param errorType The type of the error.
Expand All @@ -51,8 +50,8 @@ public ClientStreamingHandler(
}

/**
* Processes a {@link ClassicHttpResponse} and returns a {@link Stream} of deltas corresponding to
* that response.
* For internal SDK usage only. Processes a {@link ClassicHttpResponse} and returns a {@link
* Stream} of deltas corresponding to that response.
*
* @param response The response to process
* @return A {@link Stream} of a model class instantiated from the response
Expand Down
6 changes: 6 additions & 0 deletions docs/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
- [Orchestration] Spring AI support was upgraded to version `2.0.1`
- [Prompt Registry] `OrchestrationConfigClient` and `PromptClient` were reworked into unified `PromptRegistryClient`,
see migration guide below for additional information
- [Orchestration] `OrchestrationClient.executeRequestFromJsonModuleConfig` method was removed from SDK without a replacement
- [OpenAi] `OpenAi.withApiVersion` was removed from public API and deprecated
- [Orchestration] Internal AI SDK methods `createInputFilterConfig` and `createOutputFilterConfig` were removed
from public API
- [Orchestration] Internal AI SDK methods `createConfig` were removed from `GroundingProvider` and `MaskingProvider`
- [Orchestration] Internal AI SDK method `createMessage` was removed from `Message` class.

#### Prompt registry client Migration Guide

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

import com.google.common.annotations.Beta;
import com.openai.core.ClientOptions;
import com.openai.services.async.ResponseServiceAsync;
import com.openai.services.async.ResponseServiceAsyncImpl;
Expand All @@ -24,7 +23,6 @@
*/
@Slf4j
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@Beta
Comment thread
vladimir-a-sap marked this conversation as resolved.
public class AiCoreOpenAiClient {

private final HttpDestination destination;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.google.common.annotations.Beta;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.CreateChatCompletionRequest;
import java.io.IOException;
import java.util.ArrayList;
Expand Down Expand Up @@ -37,7 +36,6 @@ public class OpenAiBatchInput {
*
* @param chatCompletionRequests the list of chat completion requests to include in the batch
*/
@Beta
public OpenAiBatchInput(@Nonnull final OpenAiChatCompletionRequest... chatCompletionRequests) {
for (int i = 0; i < chatCompletionRequests.length; i++) {
val request = chatCompletionRequests[i];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.annotations.Beta;
import com.sap.ai.sdk.core.AiCoreService;
import com.sap.ai.sdk.core.DeploymentResolutionException;
import com.sap.ai.sdk.core.common.ClientResponseHandler;
Expand Down Expand Up @@ -82,7 +81,6 @@ public static OpenAiClient forModel(@Nonnull final OpenAiModel foundationModel)
*
* @return created client
*/
@Beta
@Nonnull
public static OpenAiRealtimeClient realtimeClient() {
final var withResolvedDestination = OpenAiClient.forModel(OpenAiModel.GPT_REALTIME);
Expand All @@ -95,9 +93,9 @@ public static OpenAiRealtimeClient realtimeClient() {
* @param apiVersion the API version to target.
* @return a new client.
*/
@Beta
Comment thread
vladimir-a-sap marked this conversation as resolved.
@Deprecated // does not align with the target state of the SDK, is planned for removal
@Nonnull
public OpenAiClient withApiVersion(@Nonnull final String apiVersion) {
private OpenAiClient withApiVersion(@Nonnull final String apiVersion) {
final var newDestination =
DefaultHttpDestination.fromDestination(this.destination)
// set the API version as URL query parameter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.sap.ai.sdk.foundationmodels.openai;

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.foundationmodels.openai.generated.model.ErrorResponse;
Expand All @@ -17,12 +16,8 @@ public class OpenAiClientException extends ClientException {
/**
* Retrieves the {@link ErrorResponse} from the OpenAI service, if available.
*
* <p>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();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
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 {

/**
* Sends input text
*
* @param text text to send
*/
@Beta
void sendText(@Nonnull final String text);
}
Original file line number Diff line number Diff line change
@@ -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)
*
* <p>Should be closed by application (try-with-resources) when not needed anymore
*/
@Beta
public interface AudioInputChannel extends AutoCloseable {

/**
Expand All @@ -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);
}
Original file line number Diff line number Diff line change
@@ -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 {

/**
Expand All @@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 =
Expand All @@ -25,7 +23,6 @@ public class OpenAiRealtimeClient {
*
* @param destination - destination to use
*/
@Beta
public OpenAiRealtimeClient(@Nonnull final Destination destination) {
this.destination = destination;
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -94,7 +90,6 @@ public TextInputChannel textToSpeech(
* bit)
*/
@Nonnull
@Beta
public AudioInputChannel speechToSpeech(
@Nonnull final AudioOutputChannel audioOutputConsumer,
@Nonnull final RealtimeParam... params) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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 */
Expand All @@ -19,19 +17,22 @@ 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();
Comment thread
vladimir-a-sap marked this conversation as resolved.

/**
* Returns string value representation of the param
*
* @return string value
*/
@Nonnull
String getValueAsString();
abstract String getValueAsString();
}
Loading
Loading