Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
881adc4
Some vibe coded solution using openapi-generator
ZhongpinWang Aug 28, 2026
391b42f
refactor generator setup
ZhongpinWang Aug 31, 2026
94a0fd2
Support sync and align overall setup similar to JS
ZhongpinWang Aug 31, 2026
066853c
Merge branch 'main' into poc-openapi-generator
ZhongpinWang Sep 3, 2026
9fb3c2c
adapt generator and sample code
ZhongpinWang Sep 4, 2026
0c80eb8
Merge main and add document_grounding_generation and tab_ai_orchestra…
ZhongpinWang Sep 4, 2026
53a3dc1
fix small type issue
ZhongpinWang Sep 4, 2026
a4df1f0
fix some generation issue
ZhongpinWang Sep 4, 2026
7213164
fix client for generated doc grounding
mwien Sep 8, 2026
23dd8b4
small fix in generator
mwien Sep 9, 2026
85c5173
fix client
mwien Sep 9, 2026
38cb238
add simple sample for retrieval
mwien Sep 9, 2026
0a9cbcf
small fixes
mwien Sep 10, 2026
cd301ed
vibecode: add kiota generator
mwien Sep 11, 2026
0feada8
rename _inject_auth to _inject_headers
mwien Sep 22, 2026
452cae5
vibecode: generate context registry client
mwien Oct 15, 2026
d3323a1
vibecode: context registry wrapper client
mwien Oct 15, 2026
c1c4fb6
vibecode: add small example script
mwien Oct 16, 2026
ef1a634
vibecode: strip AI-Resource-Group header param from generator
mwien Oct 23, 2026
d5a0186
vibecode: wire up context registry sample endpoints in server
mwien Oct 23, 2026
42590a0
clean up
mwien Oct 26, 2026
6cc1a47
clean up
mwien Oct 26, 2026
84d91ec
regen tab-ai-orch and doc-grounding
mwien Oct 28, 2026
9ef116c
add comment
mwien Oct 28, 2026
441459f
vibecode: customize openapi generator in Java
mwien Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 6 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
.PHONY: install docs lint license-check test test-integration test-pkg test-pkg-integration
.PHONY: install generate docs lint license-check test test-integration test-pkg test-pkg-integration

install:
uv sync --all-packages --all-extras

GENERATE_PACKAGES := $(dir $(shell grep -rl "^generate:" packages/*/Makefile 2>/dev/null))

generate:
$(foreach pkg,$(GENERATE_PACKAGES),$(MAKE) -C $(pkg) generate;)

docs:
uv run sphinx-apidoc -e -M -f -T \
-o docs/sphinx/_autogen/base \
Expand Down
7 changes: 7 additions & 0 deletions openapitools.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
"spaces": 2,
"generator-cli": {
"version": "7.26.0"
}
}
30 changes: 30 additions & 0 deletions packages/gen/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
PKG_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
SPECS := $(wildcard $(PKG_DIR)specs/*)

.PHONY: generate generate-kiota generate-java

generate:
$(foreach spec,$(SPECS), \
uv run --package sap-openapi-generator sap-generate \
-i $(spec) \
-o $(PKG_DIR) \
-s $(spec)/options-per-service.json; \
)

generate-kiota:
$(foreach spec,$(SPECS), \
uv run --package sap-kiota-generator sap-kiota-generate \
-i $(spec) \
-o $(PKG_DIR) \
-s $(spec)/options-per-service.json; \
)

# Custom Java `sap-python` generator. Build the jar first:
# make -C ../openapi-generator-java build (requires JDK 11+ and Maven)
generate-java:
$(foreach spec,$(SPECS), \
uv run --package sap-openapi-generator-java sap-generate-java \
-i $(spec) \
-o $(PKG_DIR) \
-s $(spec)/options-per-service.json; \
)
149 changes: 149 additions & 0 deletions packages/gen/gen_ai_hub/context_registry/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
from gen_ai_hub.context_registry.client import ContextRegistryApiClient
from gen_ai_hub.context_registry.generated.api.data_destinations_api import DataDestinationsApi
from gen_ai_hub.context_registry.generated.api.scenario_configuration_manager_api import ScenarioConfigurationManagerApi
from gen_ai_hub.context_registry.generated.api.tabular_artifacts_api import TabularArtifactsApi
from gen_ai_hub.context_registry.generated.models import ( # noqa: F401
ApiError,
AsyncCreateDataDestinationResponse,
AutoDefinition,
AutoDefinitionAutoConfig,
AutoDefinitionAutoConfigCsvOptions,
AzureConnectionConfig,
AzureConnectionConfigBase,
AzureDataDestinationCreateRequest,
AzurePatchConfig,
BaseDataDestinationResponse,
CSNDefinition,
ContextSelectionStrategy,
CreateDataDestination,
CreateScenarioConfiguration,
CreateTARequest,
CreateTARequestCsnMetadata,
CreateTabularArtifact202Response,
DataDestinationCreateBase,
DataDestinationStatus,
DefinitionType,
DeltaSharingConnectionConfig,
DeltaSharingDataDestinationCreateRequest,
DeltaSharingDataDestinationGetResponse,
DetailsErrorResponse,
DocumentDefinition,
GCSConnectionConfig,
GCSConnectionConfigBase,
GCSDataDestinationCreateRequest,
GCSPatchConfig,
GetAllDataDestinations400Response,
GetDataDestination,
GetDataDestinations,
GetScenarioConfigurations,
HDLConnectionConfig,
HDLDataDestinationCreateRequest,
HDLDataDestinationGetResponse,
Label,
LabelKeyValuePair,
ObjectStoreDataDestinationGetResponse,
PatchDataDestination,
PatchDataDestinationConfig,
PatchScenarioConfiguration,
ReferenceDefinition,
ReferenceDefinitionDocumentReference,
S3ConnectionConfig,
S3ConnectionConfigBase,
S3DataDestinationCreateRequest,
S3PatchConfig,
ScenarioConfigurationNameObject,
ScenarioConfigurationObject,
ScenarioConfigurationStatus,
SearchDestinationsRequest,
SearchScenarioConfiguration,
TabularArtifactConfig,
TabularArtifactDataPreview,
TabularArtifactDetails,
TabularArtifactDetailsCsnMetadata,
TabularArtifactDetailsMetadataInner,
TabularArtifactDetailsMetadataInnerColumnsInner,
TabularArtifactListResponse,
TabularArtifactStatus,
ValidateAzureRequest,
ValidateDataDestinationRequest,
ValidateDataDestinationResponse,
ValidateGCSRequest,
ValidateS3Request,
ValidationFailedResponse,
ValidationOkResponse,
)

__all__ = [
"ContextRegistryApiClient",
"DataDestinationsApi",
"ScenarioConfigurationManagerApi",
"TabularArtifactsApi",
"ApiError",
"AsyncCreateDataDestinationResponse",
"AutoDefinition",
"AutoDefinitionAutoConfig",
"AutoDefinitionAutoConfigCsvOptions",
"AzureConnectionConfig",
"AzureConnectionConfigBase",
"AzureDataDestinationCreateRequest",
"AzurePatchConfig",
"BaseDataDestinationResponse",
"CSNDefinition",
"ContextSelectionStrategy",
"CreateDataDestination",
"CreateScenarioConfiguration",
"CreateTARequest",
"CreateTARequestCsnMetadata",
"CreateTabularArtifact202Response",
"DataDestinationCreateBase",
"DataDestinationStatus",
"DefinitionType",
"DeltaSharingConnectionConfig",
"DeltaSharingDataDestinationCreateRequest",
"DeltaSharingDataDestinationGetResponse",
"DetailsErrorResponse",
"DocumentDefinition",
"GCSConnectionConfig",
"GCSConnectionConfigBase",
"GCSDataDestinationCreateRequest",
"GCSPatchConfig",
"GetAllDataDestinations400Response",
"GetDataDestination",
"GetDataDestinations",
"GetScenarioConfigurations",
"HDLConnectionConfig",
"HDLDataDestinationCreateRequest",
"HDLDataDestinationGetResponse",
"Label",
"LabelKeyValuePair",
"ObjectStoreDataDestinationGetResponse",
"PatchDataDestination",
"PatchDataDestinationConfig",
"PatchScenarioConfiguration",
"ReferenceDefinition",
"ReferenceDefinitionDocumentReference",
"S3ConnectionConfig",
"S3ConnectionConfigBase",
"S3DataDestinationCreateRequest",
"S3PatchConfig",
"ScenarioConfigurationNameObject",
"ScenarioConfigurationObject",
"ScenarioConfigurationStatus",
"SearchDestinationsRequest",
"SearchScenarioConfiguration",
"TabularArtifactConfig",
"TabularArtifactDataPreview",
"TabularArtifactDetails",
"TabularArtifactDetailsCsnMetadata",
"TabularArtifactDetailsMetadataInner",
"TabularArtifactDetailsMetadataInnerColumnsInner",
"TabularArtifactListResponse",
"TabularArtifactStatus",
"ValidateAzureRequest",
"ValidateDataDestinationRequest",
"ValidateDataDestinationResponse",
"ValidateGCSRequest",
"ValidateS3Request",
"ValidationFailedResponse",
"ValidationOkResponse",
]
59 changes: 59 additions & 0 deletions packages/gen/gen_ai_hub/context_registry/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
from __future__ import annotations

from typing import Optional

import httpx
from gen_ai_hub.proxy.core.base import BaseProxyClient
from gen_ai_hub.proxy import get_proxy_client

from gen_ai_hub.context_registry.generated.api_client import ApiClient
from gen_ai_hub.context_registry.generated.configuration import (
Configuration,
)
from gen_ai_hub.context_registry.generated.rest import RESTClientObject


def _get_base_url(client: BaseProxyClient) -> str:
ai_core = getattr(client, "ai_core_client", None)
if ai_core is None:
raise ValueError("proxy client has no ai_core_client configured")
base = ai_core.base_url.rstrip("/")
# AICORE_BASE_URL may or may not already include the /v2 API version segment.
if base.endswith("/v2"):
base = base[: -len("/v2")]
return base + "/v2/tcr"


class _SapRESTClientObject(RESTClientObject):
def __init__(self, configuration: Configuration, client: BaseProxyClient) -> None:
super().__init__(configuration)
self._client = client

def _create_pool_manager(self) -> httpx.AsyncClient:
pool = super()._create_pool_manager()
hooks = dict(pool.event_hooks)
hooks["request"] = list(hooks.get("request", [])) + [self._inject_headers]
pool.event_hooks = hooks
return pool

async def _inject_headers(self, request: httpx.Request) -> None:
for key, value in self._client.request_header.items():
request.headers[key] = value


class ContextRegistryApiClient(ApiClient):
"""ApiClient for the Context Registry service.

Resolves auth and base URL from the proxy client automatically.
If no proxy client is provided, one is created via get_proxy_client().
"""

def __init__(
self,
proxy_client: Optional[BaseProxyClient] = None,
base_url: Optional[str] = None,
) -> None:
client = proxy_client or get_proxy_client()
config = Configuration(host=base_url or _get_base_url(client))
super().__init__(configuration=config)
self.rest_client = _SapRESTClientObject(config, client)
Loading