Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a023861
add generated classes
vladimir-a-sap Aug 25, 2026
d1db18c
add generated classes
vladimir-a-sap Aug 25, 2026
388701e
Merge branch 'main' into rpt-orchestration
vladimir-a-sap Aug 26, 2026
0b9a644
Merge branch 'main' into rpt-orchestration
CharlesDuboisSAP Aug 26, 2026
77f3749
Merge branch 'refs/heads/main' into rpt-orchestration
CharlesDuboisSAP Aug 31, 2026
018ecf6
Merge branch 'refs/heads/main' into rpt-orchestration
CharlesDuboisSAP Sep 1, 2026
2549ae6
WiP
CharlesDuboisSAP Sep 1, 2026
5c29042
Javadoc + reorg
CharlesDuboisSAP Sep 2, 2026
f988c41
Merge branch 'refs/heads/main' into rpt-orchestration
CharlesDuboisSAP Sep 2, 2026
ac5226a
CharlesDuboisSAP Sep 2, 2026
44de3b4
rename to tabular-orchestration
CharlesDuboisSAP Sep 2, 2026
ccf9a14
Updated and fixed specs
CharlesDuboisSAP Sep 2, 2026
30ff0f2
Added more unit tests
CharlesDuboisSAP Sep 2, 2026
52beeec
finished
CharlesDuboisSAP Sep 2, 2026
9a5c893
Merge branch 'main' into rpt-orchestration
CharlesDuboisSAP Sep 2, 2026
f47d35a
rework
CharlesDuboisSAP Sep 2, 2026
c275ebd
move tabular to core-services folder
CharlesDuboisSAP Sep 2, 2026
d91c864
orchestration package
CharlesDuboisSAP Sep 2, 2026
f7e4c54
revert checkstyle suppressions
CharlesDuboisSAP Sep 2, 2026
4a7bd7e
Merge branch 'main' into rpt-orchestration
CharlesDuboisSAP Sep 3, 2026
0b827f3
Added TabularClient.java
CharlesDuboisSAP Sep 3, 2026
52e66ac
Merge branch 'main' into rpt-orchestration
CharlesDuboisSAP Sep 3, 2026
1ebccc6
cleanup
CharlesDuboisSAP Sep 4, 2026
02bdd16
inex and controller
CharlesDuboisSAP Sep 4, 2026
87900f8
Merge branch 'main' into rpt-orchestration
CharlesDuboisSAP Sep 4, 2026
df1057d
added tabular-predict worklfow
CharlesDuboisSAP Sep 4, 2026
1c87452
pr title
CharlesDuboisSAP Sep 4, 2026
1da6566
release notes
CharlesDuboisSAP Sep 4, 2026
38d4724
Merge branch 'main' into tabular-orchestration
CharlesDuboisSAP Sep 8, 2026
ffd831f
jonas' review
CharlesDuboisSAP Sep 8, 2026
0978225
more e2e tests
CharlesDuboisSAP Sep 8, 2026
c75c73d
Formatting
bot-sdk-js Sep 8, 2026
31438df
less resourcegroup
CharlesDuboisSAP Sep 8, 2026
2ecb646
javadoc checkstyle
CharlesDuboisSAP Sep 8, 2026
18e5c5c
javadoc
CharlesDuboisSAP Sep 10, 2026
b33edb7
Merge branch 'refs/heads/main' into rpt-orchestration
CharlesDuboisSAP Sep 15, 2026
af5283e
wip separated module into context-registry and tabular-ai-orchestration
CharlesDuboisSAP Sep 15, 2026
079bfe4
pr lint
CharlesDuboisSAP Sep 15, 2026
d07ee4a
spotbugs
CharlesDuboisSAP Sep 15, 2026
de9b91a
remove unused mappings
CharlesDuboisSAP Sep 15, 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
2 changes: 2 additions & 0 deletions .github/workflows/pr-lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ jobs:
Grounding
RPT
Batch
TabularOrchestration
ContextRegistry
headerPattern: '^(\w.+): (?:\[(\w.+)\] )?(.+)$'
headerPatternCorrespondence: type, scope, subject
# for available types, check:
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/spec-update-cleanup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ on:
- orchestration
- prompt-registry
- sap-rpt
- batch
- tabular-ai-orchestration
- context-registry
default: orchestration
ref:
description: 'Original branch or tag the branch was created from'
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/spec-update.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ on:
- prompt-registry
- sap-rpt
- batch
- tabular-ai-orchestration
- context-registry
default: orchestration
ref:
description: 'Branch or tag to checkout the spec file from'
Expand Down Expand Up @@ -172,6 +174,16 @@ jobs:
FILE_PATH='core-services/batch/src/main/resources/spec/batch-service.yaml'
MODULE_PATH='core-services/batch'
;;
tabular-ai-orchestration) #https://github.tools.sap/AI/tabular-ai-orchestration/blob/main/src/spec/spec.yaml
API_URL="$API_BASE_URL/AI/tabular-ai-orchestration/contents/src/spec/spec.yaml?ref=$REF"
FILE_PATH='core-services/tabular-ai-orchestration/src/main/resources/spec/tabular-ai-orchestration.yaml'
MODULE_PATH='core-services/tabular-ai-orchestration'
;;
context-registry) #https://github.tools.sap/AI/context-registry/blob/main/docs/public/business_api_hub/api_hub_merged_spec.yaml
API_URL="$API_BASE_URL/AI/context-registry/contents/docs/public/business_api_hub/api_hub_merged_spec.yaml?ref=$REF"
FILE_PATH='core-services/context-registry/src/main/resources/spec/context-registry.yaml'
MODULE_PATH='core-services/context-registry'
;;
esac

echo "module_path=$MODULE_PATH" >> "$GITHUB_OUTPUT"
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/weekly-spec-update.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ jobs:
- orchestration
- sap-rpt
- batch
- tabular-ai-orchestration
- context-registry

steps:
- name: 'Checkout repository'
Expand Down
4 changes: 1 addition & 3 deletions .pipeline/checkstyle-suppressions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,12 @@
<!-- Suppress generated clients -->
<suppress files="[/\\]core[/\\]client[/\\]" checks=".*"/>
<suppress files="[/\\]core[/\\]model[/\\]" checks=".*"/>
<suppress files="[/\\]openai[/\\]generated[/\\]model[/\\]" checks=".*"/>
<suppress files="[/\\]rpt[/\\]generated[/\\]" checks=".*"/>
<suppress files="[/\\]orchestration[/\\]model[/\\]" checks=".*"/>
<suppress files="[/\\]grounding[/\\]client[/\\]" checks=".*"/>
<suppress files="[/\\]grounding[/\\]model[/\\]" checks=".*"/>
<suppress files="[/\\]registry[/\\]client[/\\]" checks=".*"/>
<suppress files="[/\\]registry[/\\]model[/\\]" checks=".*"/>
<suppress files="[/\\]batch[/\\]generated[/\\]" checks=".*"/>
<suppress files="[/\\]generated[/\\]" checks=".*"/>
<!-- Suppress TODOs -->
<suppress files="OpenAiChatMessage.java" checks="TodoComment" lines="261,7" />
<suppress files="ChatCompletionResponseMessage.java" checks="TodoComment" lines="53,34" />
Expand Down
2 changes: 2 additions & 0 deletions .pipeline/spotbugs-exclusions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
<Package name="com.sap.ai.sdk.foundationmodels.rpt.generated.model"/>
<Package name="com.sap.ai.sdk.prompt.registry.model"/>
<Package name="com.sap.ai.sdk.prompt.registry.client"/>
<Package name="com.sap.ai.sdk.context.registry.generated"/>
<Package name="com.sap.ai.sdk.tabular.orchestration.generated"/>
</Or>
</Match>
<Match>
Expand Down
177 changes: 177 additions & 0 deletions core-services/context-registry/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.sap.ai.sdk</groupId>
<artifactId>sdk-parent</artifactId>
<version>1.26.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>context-registry</artifactId>
<name>Orchestration tabular prediction client</name>
<description>SAP Cloud SDK for AI is the official Software Development Kit (SDK) for SAP AI Core, SAP Generative AI Hub, and Orchestration Service. This is the client for the Orchestration tabular prediction service.</description>
<url>https://github.com/SAP/ai-sdk-java?tab=readme-ov-file#documentation</url>
<organization>
<name>SAP SE</name>
<url>https://www.sap.com</url>
</organization>
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
</license>
</licenses>
<developers>
<developer>
<name>SAP</name>
<email>ai-core-sdk@sap.com</email>
<organization>SAP SE</organization>
<organizationUrl>https://www.sap.com</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/SAP/ai-sdk-java.git</connection>
<developerConnection>scm:git:ssh://github.com:SAP/ai-sdk-java.git</developerConnection>
<url>https://github.com/SAP/ai-sdk-java/tree/main</url>
</scm>
<properties>
<project.rootdir>${project.basedir}/../../</project.rootdir>
<coverage.complexity>85%</coverage.complexity>
<coverage.line>87%</coverage.line>
<coverage.instruction>89%</coverage.instruction>
<coverage.branch>50%</coverage.branch>
<coverage.method>85%</coverage.method>
<coverage.class>100%</coverage.class>
</properties>

<dependencies>
<!-- scope "compile" -->
<dependency>
<groupId>com.sap.ai.sdk</groupId>
<artifactId>core</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
<artifactId>cloudplatform-connectivity</artifactId>
</dependency>
<dependency>
<groupId>com.sap.cloud.sdk.datamodel</groupId>
<artifactId>openapi-core-apache</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<!-- scope "provided" -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- scope "test" -->
<dependency>
<groupId>com.sap.cloud.sdk.cloudplatform</groupId>
<artifactId>connectivity-apache-httpclient5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>com.github.siom79.japicmp</groupId>
<artifactId>japicmp-maven-plugin</artifactId>
<executions>
<execution>
<id>api-compatibility</id>
<configuration>
<parameter>
<includes combine.children="append">
<include>com.sap.ai.sdk.tabular.generated</include>
</includes>
</parameter>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>generate</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>generate</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>com.sap.cloud.sdk.datamodel</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<configuration>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<enableOneOfAnyOfGeneration>true</enableOneOfAnyOfGeneration>
<compileScope>COMPILE</compileScope>
<deleteOutputDirectory>true</deleteOutputDirectory>
</configuration>
<executions>
<execution>
<id>tabular-prediction</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/spec/context-registry.yaml</inputSpec>
<modelPackage>com.sap.ai.sdk.context.registry.generated.model</modelPackage>
<apiPackage>com.sap.ai.sdk.context.registry.generated.client</apiPackage>
<additionalProperties>
<library>apache-httpclient</library>
<pojoBuilderMethodName>create</pojoBuilderMethodName>
<pojoBuildMethodName/>
<pojoConstructorVisibility>protected</pojoConstructorVisibility>
<enumUnknownDefaultCase>true</enumUnknownDefaultCase>
<useOneOfInterfaces>true</useOneOfInterfaces>
<removeEnumValuePrefix>true</removeEnumValuePrefix>
<useOneOfCreators>true</useOneOfCreators>
<useFloatArrays>true</useFloatArrays>
</additionalProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.sap.ai.sdk.context.registry;

import com.google.common.annotations.Beta;
import com.sap.ai.sdk.context.registry.generated.client.DataDestinationsApi;
import com.sap.ai.sdk.context.registry.generated.client.ScenarioConfigurationManagerApi;
import com.sap.ai.sdk.context.registry.generated.client.TabularArtifactsApi;
import com.sap.ai.sdk.core.AiCoreService;
import com.sap.cloud.sdk.cloudplatform.connectivity.DefaultHttpDestination;
import com.sap.cloud.sdk.cloudplatform.connectivity.Header;
import com.sap.cloud.sdk.cloudplatform.connectivity.HttpDestination;
import com.sap.cloud.sdk.services.openapi.apache.apiclient.ApiClient;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Tolerate;
import lombok.val;

/**
* Service class for the Tabular Orchestration APIs.
*
* @since 1.26.0
*/
@RequiredArgsConstructor(access = AccessLevel.PUBLIC)
@Getter(value = AccessLevel.PROTECTED)
@Beta
public class ContextRegistryClient {
@Nonnull private final AiCoreService service;
@Nonnull private final String basePath;
@Nonnull private final List<Header> customHeaders = new ArrayList<>();

static final String DEFAULT_BASE_PATH = "/v2/tcr/";

/** Default constructor. */
@Tolerate
public ContextRegistryClient() {
this(new AiCoreService());
}

/**
* Constructor with custom AI Core service instance.
*
* @param service The instance of AI Core service
*/
public ContextRegistryClient(final @Nonnull AiCoreService service) {
this(service, DEFAULT_BASE_PATH);
}

/**
* Get the Data Destinations API.
*
* @return The Data Destinations API.
*/
@Nonnull
public DataDestinationsApi dataDestinations() {
return new DataDestinationsApi(getOrchestrationClient());
}

/**
* Get the Tabular Artifacts API.
*
* @return The Tabular Artifacts API.
*/
@Nonnull
public TabularArtifactsApi tabularArtifacts() {
return new TabularArtifactsApi(getOrchestrationClient());
}

/**
* Get the Scenario Configuration Manager API.
*
* @return The Scenario Configuration Manager API.
*/
@Nonnull
public ScenarioConfigurationManagerApi scenarioConfiguration() {
return new ScenarioConfigurationManagerApi(getOrchestrationClient());
}

/**
* Create a new Tabular client with a custom header added to every call made with this client
*
* @param key the key of the custom header to add
* @param value the value of the custom header to add
* @return a new client.
*/
@Nonnull
public ContextRegistryClient withHeader(@Nonnull final String key, @Nonnull final String value) {
final var newClient = new ContextRegistryClient(this.service, this.basePath);
newClient.customHeaders.addAll(this.customHeaders);
newClient.customHeaders.add(new Header(key, value));
return newClient;
}

@Nonnull
private ApiClient getOrchestrationClient() {
final HttpDestination base = getService().getBaseDestination();
final URI rootUri = base.getUri().resolve(getBasePath());
val destination =
DefaultHttpDestination.fromDestination(base).uri(rootUri).headers(customHeaders).build();
return ApiClient.create(destination);
}
}
Loading