sap-ai-sdk-core 3.1.0__py3-none-any.whl → 3.1.6__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ai_core_sdk/ai_core_v2_client.py +0 -4
- ai_core_sdk/credentials.py +112 -34
- ai_core_sdk/resource_clients/internal_rest_client.py +35 -2
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.cli.html +1 -1
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.credentials.html +58 -15
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/METADATA +3 -3
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/RECORD +49 -49
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.ai_core_v2_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.exception.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.helpers.constants.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.helpers.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.helpers.logging.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.application.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.application_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.application_resource_sync_status.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.application_source.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.application_status.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.base_models.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.docker_registry_secret.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.docker_registry_secret_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.kpi.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.object_store_secret.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.object_store_secret_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.repository.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.repository_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.repository_status.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.resource_group.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.resource_group_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.resource_group_status.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.secret.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.secret_query_response.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.applications_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.docker_registry_secrets_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.internal_rest_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.kpi_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.metrics_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.object_store_secrets_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.repositories_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.resource_groups_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.resource_clients.secrets_client.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.tracking.html +0 -0
- {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.tracking.tracking.html +0 -0
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/LICENSE +0 -0
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/WHEEL +0 -0
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/entry_points.txt +0 -0
- {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/top_level.txt +0 -0
ai_core_sdk/ai_core_v2_client.py
CHANGED
|
@@ -152,9 +152,5 @@ class AICoreV2Client:
|
|
|
152
152
|
"""
|
|
153
153
|
env_credentials = fetch_credentials(profile=profile_name, **kwargs)
|
|
154
154
|
|
|
155
|
-
# if cert_url is present in the fetched credentials, rename it to auth_url
|
|
156
|
-
if 'cert_url' in env_credentials.keys():
|
|
157
|
-
env_credentials['auth_url'] = env_credentials.pop('cert_url')
|
|
158
|
-
|
|
159
155
|
kwargs.update(env_credentials)
|
|
160
156
|
return AICoreV2Client(**kwargs)
|
ai_core_sdk/credentials.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any, Dict, Final, List, Optional, Callable,
|
|
3
|
+
from typing import Any, Dict, Final, List, Optional, Callable, Tuple
|
|
4
4
|
import json
|
|
5
5
|
import os
|
|
6
6
|
import pathlib
|
|
@@ -102,10 +102,15 @@ class Service:
|
|
|
102
102
|
class CredentialsValue:
|
|
103
103
|
name: str
|
|
104
104
|
vcap_key: Optional[Tuple[str, ...]] = None
|
|
105
|
-
default: Optional[str] = None
|
|
106
105
|
transform_fn: Optional[Callable] = None
|
|
107
106
|
|
|
108
107
|
|
|
108
|
+
@dataclass
|
|
109
|
+
class Source:
|
|
110
|
+
name: str
|
|
111
|
+
get: Callable[[CredentialsValue], Optional[str]]
|
|
112
|
+
|
|
113
|
+
|
|
109
114
|
CREDENTIAL_VALUES: Final[List[CredentialsValue]] = [
|
|
110
115
|
CredentialsValue(name='client_id', vcap_key=('credentials', 'clientid')),
|
|
111
116
|
CredentialsValue(name='client_secret', vcap_key=('credentials', 'clientsecret')),
|
|
@@ -147,50 +152,123 @@ def init_conf(profile: str = None):
|
|
|
147
152
|
return json.load(f)
|
|
148
153
|
except json.decoder.JSONDecodeError:
|
|
149
154
|
raise KeyError(f'{path_to_config} is not a valid json file. Please fix or remove it!')
|
|
155
|
+
except PermissionError as e:
|
|
156
|
+
logger.warning("Permission denied when trying to read config file '%s'. File ignored.", path_to_config)
|
|
157
|
+
return config
|
|
150
158
|
elif profile:
|
|
151
159
|
raise FileNotFoundError(f"Unable to locate profile config file '{profile_config_file}' "
|
|
152
160
|
f"in AICORE_HOME '{home}')")
|
|
153
161
|
return config
|
|
154
162
|
|
|
155
163
|
|
|
164
|
+
def extract_credentials(source: Source, exclude: List[str] = None) -> Dict[str, str]:
|
|
165
|
+
"""Extract all credentials from a source."""
|
|
166
|
+
exclude = exclude or []
|
|
167
|
+
credentials = {}
|
|
168
|
+
for cv in CREDENTIAL_VALUES:
|
|
169
|
+
if cv.name in exclude:
|
|
170
|
+
continue
|
|
171
|
+
if value := source.get(cv):
|
|
172
|
+
credentials[cv.name] = cv.transform_fn(value) if cv.transform_fn else value
|
|
173
|
+
return credentials
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def resolve_credentials(sources: List[Source]) -> Dict[str, str]:
|
|
177
|
+
"""Extract credentials from the first source that has any defined."""
|
|
178
|
+
for source in sources:
|
|
179
|
+
if credentials := extract_credentials(source, exclude=['resource_group']):
|
|
180
|
+
logger.debug(f"Using credentials from: {source.name}")
|
|
181
|
+
return credentials
|
|
182
|
+
raise ValueError("No credentials found in any source")
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def resolve_resource_group(sources: List[Source]) -> Optional[str]:
|
|
186
|
+
"""Find resource_group from the first source that defines it."""
|
|
187
|
+
rg_cred = CredentialsValue(name='resource_group')
|
|
188
|
+
for source in sources:
|
|
189
|
+
if value := source.get(rg_cred):
|
|
190
|
+
logger.debug("Using resource_group '%s' from: %s", value, source.name)
|
|
191
|
+
return value
|
|
192
|
+
logger.debug("No resource_group found in any source")
|
|
193
|
+
return None
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def validate_credentials(credentials: Dict[str, str]) -> None:
|
|
197
|
+
"""Validate that we have a complete authentication method."""
|
|
198
|
+
required_base = {'client_id', 'auth_url', 'base_url'}
|
|
199
|
+
|
|
200
|
+
# Check which auth method we have
|
|
201
|
+
has_client_secret = 'client_secret' in credentials
|
|
202
|
+
has_cert_files = 'cert_file_path' in credentials and 'key_file_path' in credentials
|
|
203
|
+
has_cert_strings = 'cert_str' in credentials and 'key_str' in credentials
|
|
204
|
+
|
|
205
|
+
# Must have exactly one auth method
|
|
206
|
+
auth_methods = sum([has_client_secret, has_cert_files, has_cert_strings])
|
|
207
|
+
|
|
208
|
+
if auth_methods == 0:
|
|
209
|
+
raise ValueError(
|
|
210
|
+
"No authentication method found. Must provide one of:\n"
|
|
211
|
+
"1. client_secret\n"
|
|
212
|
+
"2. cert_file_path AND key_file_path\n"
|
|
213
|
+
"3. cert_str AND key_str"
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
if auth_methods > 1:
|
|
217
|
+
raise ValueError(
|
|
218
|
+
"Multiple authentication methods found. Please provide only one of:\n"
|
|
219
|
+
"1. client_secret\n"
|
|
220
|
+
"2. cert_file_path AND key_file_path\n"
|
|
221
|
+
"3. cert_str AND key_str"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
# Check required base fields
|
|
225
|
+
missing = required_base - set(credentials.keys())
|
|
226
|
+
if missing:
|
|
227
|
+
raise ValueError(f"Missing required credentials: {missing}")
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _str_or_none(value) -> Optional[str]:
|
|
231
|
+
return str(value) if value else None
|
|
232
|
+
|
|
233
|
+
|
|
156
234
|
def fetch_credentials(profile: str = None, **kwargs) -> Dict[str, str]:
|
|
235
|
+
"""
|
|
236
|
+
Fetch credentials from a single source based on precedence.
|
|
237
|
+
|
|
238
|
+
Precedence order: kwargs > environment variables > config file > VCAP service
|
|
239
|
+
|
|
240
|
+
Once a source is selected (first one with any credential), all credentials
|
|
241
|
+
come from that source only. Resource group is an exception and follows
|
|
242
|
+
precedence independently.
|
|
243
|
+
"""
|
|
157
244
|
config = init_conf(profile=profile)
|
|
245
|
+
|
|
158
246
|
try:
|
|
159
247
|
vcap_service = VCAPEnvironment.from_env()[VCAP_AICORE_SERVICE_NAME]
|
|
160
248
|
except KeyError:
|
|
161
249
|
vcap_service = None
|
|
162
|
-
credentials = {}
|
|
163
|
-
cred_value: CredentialsValue
|
|
164
|
-
for cred_value in CREDENTIAL_VALUES:
|
|
165
|
-
value = resolve_params(config, cred_value, vcap_service, **kwargs)
|
|
166
|
-
if value is not None:
|
|
167
|
-
if cred_value.transform_fn:
|
|
168
|
-
value = cred_value.transform_fn(value)
|
|
169
|
-
credentials[cred_value.name] = value
|
|
170
|
-
return credentials
|
|
171
250
|
|
|
251
|
+
sources = [
|
|
252
|
+
Source("kwargs",
|
|
253
|
+
lambda cv: _str_or_none(kwargs.get(cv.name))),
|
|
254
|
+
Source("environment variables",
|
|
255
|
+
lambda cv: _str_or_none(os.environ.get(f'{AI_CORE_PREFIX}_{cv.name.upper()}'))),
|
|
256
|
+
Source("config file",
|
|
257
|
+
lambda cv: _str_or_none(config.get(f'{AI_CORE_PREFIX}_{cv.name.upper()}'))),
|
|
258
|
+
Source("VCAP service",
|
|
259
|
+
lambda cv: _str_or_none(vcap_service.get(cv.vcap_key, None) if vcap_service and cv.vcap_key else None)),
|
|
260
|
+
]
|
|
172
261
|
|
|
173
|
-
|
|
174
|
-
"""
|
|
175
|
-
Resolves the parameter value by checking multiple sources in order:
|
|
176
|
-
kwargs, environment variables, config, VCAP services, and defaults.
|
|
177
|
-
Logs the source of the resolved value.
|
|
178
|
-
"""
|
|
179
|
-
env_var_name = f'{AI_CORE_PREFIX}_{cred_value.name.upper()}'
|
|
180
|
-
sources = {
|
|
181
|
-
"kwargs": kwargs.get(cred_value.name),
|
|
182
|
-
"environment variable": os.getenv(env_var_name),
|
|
183
|
-
"config file": config.get(env_var_name),
|
|
184
|
-
"VCAP service": vcap_service.get(cred_value.vcap_key, None) if vcap_service and cred_value.vcap_key else None,
|
|
185
|
-
"default value": cred_value.default,
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
# Find the first valid source and log it
|
|
189
|
-
for source, value in sources.items():
|
|
190
|
-
if value is not None:
|
|
191
|
-
logger.debug('Using source %s for %s', source, cred_value.name)
|
|
192
|
-
return value
|
|
262
|
+
credentials = resolve_credentials(sources)
|
|
193
263
|
|
|
194
|
-
#
|
|
195
|
-
|
|
196
|
-
|
|
264
|
+
# Use cert_url as auth_url if present (VCAP provides cert_url for certificate auth)
|
|
265
|
+
if 'cert_url' in credentials:
|
|
266
|
+
credentials['auth_url'] = credentials.pop('cert_url')
|
|
267
|
+
|
|
268
|
+
validate_credentials(credentials)
|
|
269
|
+
|
|
270
|
+
resource_group = resolve_resource_group(sources)
|
|
271
|
+
if resource_group:
|
|
272
|
+
credentials['resource_group'] = resource_group
|
|
273
|
+
|
|
274
|
+
return credentials
|
|
@@ -39,10 +39,12 @@ class InternalRestClient(RestClient):
|
|
|
39
39
|
|
|
40
40
|
token_creator = dummy_token_creator
|
|
41
41
|
|
|
42
|
-
# resource group will be
|
|
43
|
-
# Hence not passing the resource group id
|
|
42
|
+
# resource group will be set as a header in the _handle_request method
|
|
44
43
|
resource_group = ""
|
|
45
44
|
|
|
45
|
+
self.tenant = os.getenv("AI-MAIN-TENANT")
|
|
46
|
+
self.resource_group = os.getenv("AI-RESOURCE-GROUP")
|
|
47
|
+
|
|
46
48
|
super().__init__(
|
|
47
49
|
base_url=base_url,
|
|
48
50
|
get_token=token_creator,
|
|
@@ -50,3 +52,34 @@ class InternalRestClient(RestClient):
|
|
|
50
52
|
*args,
|
|
51
53
|
**kwargs,
|
|
52
54
|
)
|
|
55
|
+
|
|
56
|
+
def _handle_request(
|
|
57
|
+
self,
|
|
58
|
+
method: str,
|
|
59
|
+
path: str,
|
|
60
|
+
params=None,
|
|
61
|
+
body_json=None,
|
|
62
|
+
headers=None,
|
|
63
|
+
resource_group=None,
|
|
64
|
+
return_bytes_content=False,
|
|
65
|
+
convert_body_to_camel_case=True,
|
|
66
|
+
**kwargs
|
|
67
|
+
):
|
|
68
|
+
headers = headers or {}
|
|
69
|
+
|
|
70
|
+
headers.update({
|
|
71
|
+
"AI-MAIN-TENANT": self.tenant,
|
|
72
|
+
"AI-RESOURCE-GROUP": self.resource_group,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return super()._handle_request(
|
|
76
|
+
method=method,
|
|
77
|
+
path=path,
|
|
78
|
+
params=params,
|
|
79
|
+
body_json=body_json,
|
|
80
|
+
headers=headers,
|
|
81
|
+
resource_group=resource_group,
|
|
82
|
+
return_bytes_content=return_bytes_content,
|
|
83
|
+
convert_body_to_camel_case=convert_body_to_camel_case,
|
|
84
|
+
**kwargs
|
|
85
|
+
)
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<tr><td bgcolor="#55aa55"><tt> </tt></td><td> </td>
|
|
47
47
|
<td width="100%"><strong>AI_CORE_PREFIX</strong> = 'AICORE'<br>
|
|
48
48
|
<strong>API_V2_SUFFIX</strong> = '/v2'<br>
|
|
49
|
-
<strong>CREDENTIAL_VALUES</strong> = [CredentialsValue(name='client_id', vcap_key=('
|
|
49
|
+
<strong>CREDENTIAL_VALUES</strong> = [CredentialsValue(name='client_id', vcap_key=('credentials', 'clientid'), transform_fn=None), CredentialsValue(name='client_secret', vcap_key=('credentials', 'clientsecret'), transform_fn=None), CredentialsValue(name='auth_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682cdb40>), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce560>), CredentialsValue(name='resource_group', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce8c0>), CredentialsValue(name='cert_file_path', vcap_key=None, transform_fn=None), CredentialsValue(name='key_file_path', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_str', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce950>), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=<function <lambda> at 0x7f3a682ce9e0>)]<br>
|
|
50
50
|
<strong>DEFAULT_CONFIG</strong> = 'config.json'<br>
|
|
51
51
|
<strong>DEFAULT_PROFILE</strong> = 'default'<br>
|
|
52
52
|
<strong>DEFAULT_RESOURCE_GROUP</strong> = 'default'<br>
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.credentials.html
RENAMED
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
<dl>
|
|
34
34
|
<dt><font face="helvetica, arial"><a href="ai_core_sdk.credentials.html#CredentialsValue">CredentialsValue</a>
|
|
35
35
|
</font></dt><dt><font face="helvetica, arial"><a href="ai_core_sdk.credentials.html#Service">Service</a>
|
|
36
|
+
</font></dt><dt><font face="helvetica, arial"><a href="ai_core_sdk.credentials.html#Source">Source</a>
|
|
36
37
|
</font></dt><dt><font face="helvetica, arial"><a href="ai_core_sdk.credentials.html#VCAPEnvironment">VCAPEnvironment</a>
|
|
37
38
|
</font></dt></dl>
|
|
38
39
|
</dd>
|
|
@@ -44,14 +45,14 @@
|
|
|
44
45
|
<font color="#000000" face="helvetica, arial"><a name="CredentialsValue">class <strong>CredentialsValue</strong></a>(<a href="builtins.html#object">builtins.object</a>)</font></td></tr>
|
|
45
46
|
|
|
46
47
|
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
|
47
|
-
<td colspan=2><tt><a href="#CredentialsValue">CredentialsValue</a>(name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None,
|
|
48
|
+
<td colspan=2><tt><a href="#CredentialsValue">CredentialsValue</a>(name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None, transform_fn: 'Optional[Callable]' = None) -&gt; None<br>
|
|
48
49
|
<br>
|
|
49
|
-
<a href="#CredentialsValue">CredentialsValue</a>(name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None,
|
|
50
|
+
<a href="#CredentialsValue">CredentialsValue</a>(name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None, transform_fn: 'Optional[Callable]' = None)<br> </tt></td></tr>
|
|
50
51
|
<tr><td> </td>
|
|
51
52
|
<td width="100%">Methods defined here:<br>
|
|
52
53
|
<dl><dt><a name="CredentialsValue-__eq__"><strong>__eq__</strong></a>(self, other)</dt><dd><tt>Return self==value.</tt></dd></dl>
|
|
53
54
|
|
|
54
|
-
<dl><dt><a name="CredentialsValue-__init__"><strong>__init__</strong></a>(self, name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None,
|
|
55
|
+
<dl><dt><a name="CredentialsValue-__init__"><strong>__init__</strong></a>(self, name: 'str', vcap_key: 'Optional[Tuple[str, ...]]' = None, transform_fn: 'Optional[Callable]' = None) -> None</dt><dd><tt>Initialize self. See help(type(self)) for accurate signature.</tt></dd></dl>
|
|
55
56
|
|
|
56
57
|
<dl><dt><a name="CredentialsValue-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Return repr(self).</tt></dd></dl>
|
|
57
58
|
|
|
@@ -65,17 +66,15 @@ Data descriptors defined here:<br>
|
|
|
65
66
|
</dl>
|
|
66
67
|
<hr>
|
|
67
68
|
Data and other attributes defined here:<br>
|
|
68
|
-
<dl><dt><strong>__annotations__</strong> = {'
|
|
69
|
+
<dl><dt><strong>__annotations__</strong> = {'name': 'str', 'transform_fn': 'Optional[Callable]', 'vcap_key': 'Optional[Tuple[str, ...]]'}</dl>
|
|
69
70
|
|
|
70
|
-
<dl><dt><strong>__dataclass_fields__</strong> = {'
|
|
71
|
+
<dl><dt><strong>__dataclass_fields__</strong> = {'name': Field(name='name',type='str',default=<dataclasse...appingproxy({}),kw_only=False,_field_type=_FIELD), 'transform_fn': Field(name='transform_fn',type='Optional[Callabl...appingproxy({}),kw_only=False,_field_type=_FIELD), 'vcap_key': Field(name='vcap_key',type='Optional[Tuple[str, ...appingproxy({}),kw_only=False,_field_type=_FIELD)}</dl>
|
|
71
72
|
|
|
72
73
|
<dl><dt><strong>__dataclass_params__</strong> = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)</dl>
|
|
73
74
|
|
|
74
75
|
<dl><dt><strong>__hash__</strong> = None</dl>
|
|
75
76
|
|
|
76
|
-
<dl><dt><strong>__match_args__</strong> = ('name', 'vcap_key', '
|
|
77
|
-
|
|
78
|
-
<dl><dt><strong>default</strong> = None</dl>
|
|
77
|
+
<dl><dt><strong>__match_args__</strong> = ('name', 'vcap_key', 'transform_fn')</dl>
|
|
79
78
|
|
|
80
79
|
<dl><dt><strong>transform_fn</strong> = None</dl>
|
|
81
80
|
|
|
@@ -97,7 +96,7 @@ Data and other attributes defined here:<br>
|
|
|
97
96
|
|
|
98
97
|
<dl><dt><a name="Service-__init__"><strong>__init__</strong></a>(self, env: 'Dict[str, Any]')</dt><dd><tt>Initialize self. See help(type(self)) for accurate signature.</tt></dd></dl>
|
|
99
98
|
|
|
100
|
-
<dl><dt><a name="Service-get"><strong>get</strong></a>(self, key, default=<object object at
|
|
99
|
+
<dl><dt><a name="Service-get"><strong>get</strong></a>(self, key, default=<object object at 0x7f3a699d5790>)</dt></dl>
|
|
101
100
|
|
|
102
101
|
<hr>
|
|
103
102
|
Readonly properties defined here:<br>
|
|
@@ -113,6 +112,44 @@ Data descriptors defined here:<br>
|
|
|
113
112
|
<dl><dt><strong>__weakref__</strong></dt>
|
|
114
113
|
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
|
115
114
|
</dl>
|
|
115
|
+
</td></tr></table> <p>
|
|
116
|
+
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
117
|
+
<tr bgcolor="#ffc8d8">
|
|
118
|
+
<td colspan=3 valign=bottom> <br>
|
|
119
|
+
<font color="#000000" face="helvetica, arial"><a name="Source">class <strong>Source</strong></a>(<a href="builtins.html#object">builtins.object</a>)</font></td></tr>
|
|
120
|
+
|
|
121
|
+
<tr bgcolor="#ffc8d8"><td rowspan=2><tt> </tt></td>
|
|
122
|
+
<td colspan=2><tt><a href="#Source">Source</a>(name: 'str', get: 'Callable[[<a href="#CredentialsValue">CredentialsValue</a>], Optional[str]]') -&gt; None<br>
|
|
123
|
+
<br>
|
|
124
|
+
<a href="#Source">Source</a>(name: 'str', get: 'Callable[[<a href="#CredentialsValue">CredentialsValue</a>], Optional[str]]')<br> </tt></td></tr>
|
|
125
|
+
<tr><td> </td>
|
|
126
|
+
<td width="100%">Methods defined here:<br>
|
|
127
|
+
<dl><dt><a name="Source-__eq__"><strong>__eq__</strong></a>(self, other)</dt><dd><tt>Return self==value.</tt></dd></dl>
|
|
128
|
+
|
|
129
|
+
<dl><dt><a name="Source-__init__"><strong>__init__</strong></a>(self, name: 'str', get: 'Callable[[CredentialsValue], Optional[str]]') -> None</dt><dd><tt>Initialize self. See help(type(self)) for accurate signature.</tt></dd></dl>
|
|
130
|
+
|
|
131
|
+
<dl><dt><a name="Source-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Return repr(self).</tt></dd></dl>
|
|
132
|
+
|
|
133
|
+
<hr>
|
|
134
|
+
Data descriptors defined here:<br>
|
|
135
|
+
<dl><dt><strong>__dict__</strong></dt>
|
|
136
|
+
<dd><tt>dictionary for instance variables (if defined)</tt></dd>
|
|
137
|
+
</dl>
|
|
138
|
+
<dl><dt><strong>__weakref__</strong></dt>
|
|
139
|
+
<dd><tt>list of weak references to the object (if defined)</tt></dd>
|
|
140
|
+
</dl>
|
|
141
|
+
<hr>
|
|
142
|
+
Data and other attributes defined here:<br>
|
|
143
|
+
<dl><dt><strong>__annotations__</strong> = {'get': 'Callable[[CredentialsValue], Optional[str]]', 'name': 'str'}</dl>
|
|
144
|
+
|
|
145
|
+
<dl><dt><strong>__dataclass_fields__</strong> = {'get': Field(name='get',type='Callable[[CredentialsValu...appingproxy({}),kw_only=False,_field_type=_FIELD), 'name': Field(name='name',type='str',default=<dataclasse...appingproxy({}),kw_only=False,_field_type=_FIELD)}</dl>
|
|
146
|
+
|
|
147
|
+
<dl><dt><strong>__dataclass_params__</strong> = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)</dl>
|
|
148
|
+
|
|
149
|
+
<dl><dt><strong>__hash__</strong> = None</dl>
|
|
150
|
+
|
|
151
|
+
<dl><dt><strong>__match_args__</strong> = ('name', 'get')</dl>
|
|
152
|
+
|
|
116
153
|
</td></tr></table> <p>
|
|
117
154
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
118
155
|
<tr bgcolor="#ffc8d8">
|
|
@@ -170,16 +207,23 @@ Data and other attributes defined here:<br>
|
|
|
170
207
|
<font color="#ffffff" face="helvetica, arial"><big><strong>Functions</strong></big></font></td></tr>
|
|
171
208
|
|
|
172
209
|
<tr><td bgcolor="#eeaa77"><tt> </tt></td><td> </td>
|
|
173
|
-
<td width="100%"><dl><dt><a name="-
|
|
210
|
+
<td width="100%"><dl><dt><a name="-extract_credentials"><strong>extract_credentials</strong></a>(source: 'Source', exclude: 'List[str]' = None) -> 'Dict[str, str]'</dt><dd><tt>Extract all credentials from a source.</tt></dd></dl>
|
|
211
|
+
<dl><dt><a name="-fetch_credentials"><strong>fetch_credentials</strong></a>(profile: 'str' = None, **kwargs) -> 'Dict[str, str]'</dt><dd><tt>Fetch credentials from a single source based on precedence.<br>
|
|
212
|
+
<br>
|
|
213
|
+
Precedence order: kwargs > environment variables > config file > VCAP service<br>
|
|
214
|
+
<br>
|
|
215
|
+
Once a source is selected (first one with any credential), all credentials<br>
|
|
216
|
+
come from that source only. Resource group is an exception and follows<br>
|
|
217
|
+
precedence independently.</tt></dd></dl>
|
|
174
218
|
<dl><dt><a name="-get_nested_value"><strong>get_nested_value</strong></a>(data_dict, keys: 'List[str]')</dt><dd><tt>Retrieve a nested value from a dictionary using a list of strings.<br>
|
|
175
219
|
<br>
|
|
176
220
|
:param data_dict: The dictionary to search.<br>
|
|
177
221
|
:param keys: A list of strings representing nested keys.<br>
|
|
178
222
|
:return: The value associated with the nested keys, or None if not found.</tt></dd></dl>
|
|
179
223
|
<dl><dt><a name="-init_conf"><strong>init_conf</strong></a>(profile: 'str' = None)</dt></dl>
|
|
180
|
-
<dl><dt><a name="-
|
|
181
|
-
|
|
182
|
-
|
|
224
|
+
<dl><dt><a name="-resolve_credentials"><strong>resolve_credentials</strong></a>(sources: 'List[Source]') -> 'Dict[str, str]'</dt><dd><tt>Extract credentials from the first source that has any defined.</tt></dd></dl>
|
|
225
|
+
<dl><dt><a name="-resolve_resource_group"><strong>resolve_resource_group</strong></a>(sources: 'List[Source]') -> 'Optional[str]'</dt><dd><tt>Find resource_group from the first source that defines it.</tt></dd></dl>
|
|
226
|
+
<dl><dt><a name="-validate_credentials"><strong>validate_credentials</strong></a>(credentials: 'Dict[str, str]') -> 'None'</dt><dd><tt>Validate that we have a complete authentication method.</tt></dd></dl>
|
|
183
227
|
</td></tr></table><p>
|
|
184
228
|
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
|
|
185
229
|
<tr bgcolor="#55aa55">
|
|
@@ -191,7 +235,7 @@ Logs the source of the resolved value.</tt></dd></
|
|
|
191
235
|
<strong>AUTH_ENDPOINT_SUFFIX</strong> = '/oauth/token'<br>
|
|
192
236
|
<strong>Any</strong> = typing.Any<br>
|
|
193
237
|
<strong>CONFIG_FILE_ENV_VAR</strong> = 'AICORE_CONFIG'<br>
|
|
194
|
-
<strong>CREDENTIAL_VALUES</strong> = [CredentialsValue(name='client_id', vcap_key=('
|
|
238
|
+
<strong>CREDENTIAL_VALUES</strong> = [CredentialsValue(name='client_id', vcap_key=('credentials', 'clientid'), transform_fn=None), CredentialsValue(name='client_secret', vcap_key=('credentials', 'clientsecret'), transform_fn=None), CredentialsValue(name='auth_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682cdb40>), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce560>), CredentialsValue(name='resource_group', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce8c0>), CredentialsValue(name='cert_file_path', vcap_key=None, transform_fn=None), CredentialsValue(name='key_file_path', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_str', vcap_key=('cre...ansform_fn=<function <lambda> at 0x7f3a682ce950>), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=<function <lambda> at 0x7f3a682ce9e0>)]<br>
|
|
195
239
|
<strong>Callable</strong> = typing.Callable<br>
|
|
196
240
|
<strong>Dict</strong> = typing.Dict<br>
|
|
197
241
|
<strong>Final</strong> = typing.Final<br>
|
|
@@ -200,7 +244,6 @@ Logs the source of the resolved value.</tt></dd></
|
|
|
200
244
|
<strong>Optional</strong> = typing.Optional<br>
|
|
201
245
|
<strong>PROFILE_ENV_VAR</strong> = 'AICORE_PROFILE'<br>
|
|
202
246
|
<strong>Tuple</strong> = typing.Tuple<br>
|
|
203
|
-
<strong>Union</strong> = typing.Union<br>
|
|
204
247
|
<strong>VCAP_AICORE_SERVICE_NAME</strong> = 'aicore'<br>
|
|
205
248
|
<strong>VCAP_SERVICES_ENV_VAR</strong> = 'VCAP_SERVICES'<br>
|
|
206
249
|
<strong>__annotations__</strong> = {'CREDENTIAL_VALUES': 'Final[List[CredentialsValue]]'}<br>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: sap-ai-sdk-core
|
|
3
|
-
Version: 3.1.
|
|
3
|
+
Version: 3.1.6
|
|
4
4
|
Summary: SAP Cloud SDK for AI (Python): Core SDK
|
|
5
5
|
Home-page: https://www.sap.com/
|
|
6
6
|
Author: SAP SE
|
|
@@ -19,11 +19,11 @@ Classifier: Operating System :: POSIX :: Linux
|
|
|
19
19
|
Classifier: Intended Audience :: Developers
|
|
20
20
|
Classifier: Programming Language :: Python
|
|
21
21
|
Classifier: Programming Language :: Python :: 3
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
23
22
|
Classifier: Programming Language :: Python :: 3.10
|
|
24
23
|
Classifier: Programming Language :: Python :: 3.11
|
|
25
24
|
Classifier: Programming Language :: Python :: 3.12
|
|
26
25
|
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
27
27
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
28
28
|
Requires-Python: >=3.9
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
@@ -124,7 +124,7 @@ There are different options to persist the client credentials
|
|
|
124
124
|
A **profile** is a json file residing in a config directory,
|
|
125
125
|
which can be set via environment variable `AICORE_HOME` (the default being `~/.aicore/config.json`).
|
|
126
126
|
|
|
127
|
-
The command `
|
|
127
|
+
The command `aicore configure --help` shows the options for generating a profile.
|
|
128
128
|
|
|
129
129
|
With profile names one can switch easily between profiles e.g., for different (sub)accounts.
|
|
130
130
|
The profile name can be passed also as a keyword. If no profile is specified, the default profile is used.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
ai_core_sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
ai_core_sdk/ai_core_v2_client.py,sha256=
|
|
2
|
+
ai_core_sdk/ai_core_v2_client.py,sha256=5sDkADb6nB00Gqju5x01S--tB74_sfzb0tFvp9eA3cs,9211
|
|
3
3
|
ai_core_sdk/cli.py,sha256=ZXwhRs18Y91hDcfZ6obHYIdSJ25FJDMT5zxMlfjKF3I,7158
|
|
4
|
-
ai_core_sdk/credentials.py,sha256=
|
|
4
|
+
ai_core_sdk/credentials.py,sha256=hxw9qI_8iyOYFIKtuVsbzum6eUTLCd_qomhQ7xRhZ-E,10268
|
|
5
5
|
ai_core_sdk/exception.py,sha256=e2sVacNgjKjK0QH4AIINDZj4wT-6Hn8NK5y5LBwgkF4,425
|
|
6
6
|
ai_core_sdk/helpers/__init__.py,sha256=5W9oFpnlhtjSJ5G4ThqpnDnWT7SQUnRXaShRbPT6_bU,1144
|
|
7
7
|
ai_core_sdk/helpers/constants.py,sha256=I-7_xGhgL0Zf5JSCY7uWHzTfi62vy8XhSJc858797-o,509
|
|
@@ -29,7 +29,7 @@ ai_core_sdk/models/secret_query_response.py,sha256=BZgcJ7v_2w2y8a1cuvkagU9cLDBQ9
|
|
|
29
29
|
ai_core_sdk/resource_clients/__init__.py,sha256=TuWwBvCS7XuqHVdFMoKsk3CtXg92LvVORojEn0X9WUg,989
|
|
30
30
|
ai_core_sdk/resource_clients/applications_client.py,sha256=EQy7yxYe2AyRrD8dc9Qe7AHI8hZX8OxSc88BVgtFme4,9388
|
|
31
31
|
ai_core_sdk/resource_clients/docker_registry_secrets_client.py,sha256=nH6Vh3B6Gx3MhG0ogYYleVkM4Unxl0OaLlGai2MyNq0,6518
|
|
32
|
-
ai_core_sdk/resource_clients/internal_rest_client.py,sha256=
|
|
32
|
+
ai_core_sdk/resource_clients/internal_rest_client.py,sha256=RZX-457lJI_XZa-hRzxy0X6XrnX6s2aAwhIEv86Z-rw,2668
|
|
33
33
|
ai_core_sdk/resource_clients/kpi_client.py,sha256=ubFUrC83u5lzMHQX_85zL1QkiqkdmBiXRTzRS3Ah3v4,1155
|
|
34
34
|
ai_core_sdk/resource_clients/metrics_client.py,sha256=xVqD-TxEsVr43OHqi7YeZxVb_TvCoiBfiRpgqH6Ll4s,7639
|
|
35
35
|
ai_core_sdk/resource_clients/object_store_secrets_client.py,sha256=XbUTWWrmJrplMhxta48o22fEzQge0Ca45ThuUYfZK9w,10835
|
|
@@ -37,49 +37,49 @@ ai_core_sdk/resource_clients/repositories_client.py,sha256=7xp9POdHEcoa_SbfZ4_08
|
|
|
37
37
|
ai_core_sdk/resource_clients/secrets_client.py,sha256=ysOsmmue1n1ZoL8rnL9H7YqDY8nZKmfbLO1yAbCWzVU,8012
|
|
38
38
|
ai_core_sdk/tracking/__init__.py,sha256=2RXIEfNyAwgd6uPLkDaTyvvPVKwMMuM4F2Pk3l4gjf0,75
|
|
39
39
|
ai_core_sdk/tracking/tracking.py,sha256=9GfJ3wTpcDUuBJRlo0ZEeL7B24MNo8dixrUVZaICAeY,13352
|
|
40
|
-
sap_ai_sdk_core-3.1.
|
|
41
|
-
sap_ai_sdk_core-3.1.
|
|
42
|
-
sap_ai_sdk_core-3.1.
|
|
43
|
-
sap_ai_sdk_core-3.1.
|
|
44
|
-
sap_ai_sdk_core-3.1.
|
|
45
|
-
sap_ai_sdk_core-3.1.
|
|
46
|
-
sap_ai_sdk_core-3.1.
|
|
47
|
-
sap_ai_sdk_core-3.1.
|
|
48
|
-
sap_ai_sdk_core-3.1.
|
|
49
|
-
sap_ai_sdk_core-3.1.
|
|
50
|
-
sap_ai_sdk_core-3.1.
|
|
51
|
-
sap_ai_sdk_core-3.1.
|
|
52
|
-
sap_ai_sdk_core-3.1.
|
|
53
|
-
sap_ai_sdk_core-3.1.
|
|
54
|
-
sap_ai_sdk_core-3.1.
|
|
55
|
-
sap_ai_sdk_core-3.1.
|
|
56
|
-
sap_ai_sdk_core-3.1.
|
|
57
|
-
sap_ai_sdk_core-3.1.
|
|
58
|
-
sap_ai_sdk_core-3.1.
|
|
59
|
-
sap_ai_sdk_core-3.1.
|
|
60
|
-
sap_ai_sdk_core-3.1.
|
|
61
|
-
sap_ai_sdk_core-3.1.
|
|
62
|
-
sap_ai_sdk_core-3.1.
|
|
63
|
-
sap_ai_sdk_core-3.1.
|
|
64
|
-
sap_ai_sdk_core-3.1.
|
|
65
|
-
sap_ai_sdk_core-3.1.
|
|
66
|
-
sap_ai_sdk_core-3.1.
|
|
67
|
-
sap_ai_sdk_core-3.1.
|
|
68
|
-
sap_ai_sdk_core-3.1.
|
|
69
|
-
sap_ai_sdk_core-3.1.
|
|
70
|
-
sap_ai_sdk_core-3.1.
|
|
71
|
-
sap_ai_sdk_core-3.1.
|
|
72
|
-
sap_ai_sdk_core-3.1.
|
|
73
|
-
sap_ai_sdk_core-3.1.
|
|
74
|
-
sap_ai_sdk_core-3.1.
|
|
75
|
-
sap_ai_sdk_core-3.1.
|
|
76
|
-
sap_ai_sdk_core-3.1.
|
|
77
|
-
sap_ai_sdk_core-3.1.
|
|
78
|
-
sap_ai_sdk_core-3.1.
|
|
79
|
-
sap_ai_sdk_core-3.1.
|
|
80
|
-
sap_ai_sdk_core-3.1.
|
|
81
|
-
sap_ai_sdk_core-3.1.
|
|
82
|
-
sap_ai_sdk_core-3.1.
|
|
83
|
-
sap_ai_sdk_core-3.1.
|
|
84
|
-
sap_ai_sdk_core-3.1.
|
|
85
|
-
sap_ai_sdk_core-3.1.
|
|
40
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.ai_core_v2_client.html,sha256=BOBEkn3jnc34O-Zw0vTHVX_qXaOBex6ZjKtItqR2AFU,11088
|
|
41
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.cli.html,sha256=C1gV2VFvU_zu8aq_mMgJoXODs6ug_F_yJQiSCGu1St4,5246
|
|
42
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.credentials.html,sha256=_HSOSjXKlX8vrI9fLurBsDXffAK8XieR2NFhXcw8XQ4,17455
|
|
43
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.exception.html,sha256=M1Ho12N2uGuwuwJJ7aRH8lxayKuaD9ZV5CajHFXM3is,9856
|
|
44
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.helpers.constants.html,sha256=tlrfftGPlN9RQWnypWviTWJ370-tsq3bHFS1v4V4LDM,4951
|
|
45
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.helpers.html,sha256=HRhJxDZynSbRfy2GGAz2RbBq_a2AsxpEP_rWkkX3UCo,3765
|
|
46
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.helpers.logging.html,sha256=_wL0CVBhU4s2PWenlXDQpBImwEFE6o90Q1wWzBk466M,2706
|
|
47
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.html,sha256=X2v8eSgx2fwSnnD3nNOFhcPh17zGEOJ918NNrKpV-fk,1953
|
|
48
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.application.html,sha256=V-8-4pB0HIqrhNkIvC9sgBZvLO_2re1ldov8hHlSVOo,4903
|
|
49
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.application_query_response.html,sha256=1MxDiHciDTCi26HKW6vOT0O09XfGb2a6ArtoT9_Mlu4,6107
|
|
50
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.application_resource_sync_status.html,sha256=1PfCNS5L6WxqT6wZ1HAtf1hwaKVZJ-knWZ00Y6zTAgc,5415
|
|
51
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.application_source.html,sha256=8yPUdrL7F6sPdKy9c4riIqXDpD9d8Tn31VATyNujfi4,5137
|
|
52
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.application_status.html,sha256=iuA-YdqC45lVe2OCDAHeRoHpnl-9ln-_Q2UDtSqn1NA,6929
|
|
53
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.base_models.html,sha256=jEiLIvbedbujQ-mV2Rtlj4CGyAO-hpSbSqh-re5zL-o,7566
|
|
54
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.docker_registry_secret.html,sha256=fPo-lf-P_XihNIsKYqi8nqZY4khP5lrPNLtHGTvURoE,5716
|
|
55
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.docker_registry_secret_query_response.html,sha256=rv_6DlbIVv-I125S1M1t4i1nBYg4NIwDMofgiE5KVS8,6459
|
|
56
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.html,sha256=fHsegf0NuhWMXkSxB5kFiraZqVlJYAW4D0jA5rhQxrg,3047
|
|
57
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.kpi.html,sha256=dFr8vFPwGnC2AVNE3Gg9EmqLEyXNpJUw1kWU3IpViF8,4367
|
|
58
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.object_store_secret.html,sha256=x-QDRmI0p1CH7VyQrY4o--9VTIBJrli2C_RxR8JvtMU,4679
|
|
59
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.object_store_secret_query_response.html,sha256=7P8QoHCa1IC_8X46qWNhiFYs2N3Gj6mbM7jo9wUQeik,6368
|
|
60
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.repository.html,sha256=VfZHXukn5TBgORsgN9XL-wK8nFRwLuAUhZUs6BNF25M,4905
|
|
61
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.repository_query_response.html,sha256=tPcNHK1c_ydLYUXxp5q_4lb4OUfdEWdmU4PpVBp5RyU,6081
|
|
62
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.repository_status.html,sha256=lCUdZKvJHfQaglnApomMRGI_-4Fe1wj75_sR9Vodt7c,3886
|
|
63
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.resource_group.html,sha256=nIH4K-dohlRYO0I0UKAARh1S3zeKJB3DGN0u1Pa0LVM,5956
|
|
64
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.resource_group_query_response.html,sha256=oieUDeBL1Egbbykd-pAN6ygdAuCKPHDNebnblDQOz5Y,6157
|
|
65
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.resource_group_status.html,sha256=-XiGblbXr-9aqwXLsWtRwFf5lp5fm3z5668eHRWfduk,3967
|
|
66
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.secret.html,sha256=sGDFIqg5K_6lwZlVCVPjiLx88X2uRRBcxfKHV6GMUnw,4610
|
|
67
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.models.secret_query_response.html,sha256=TufIaAicLf3u3Ne6-zQq-z6oD8E6p3vDC3W4bEiY8Iw,5936
|
|
68
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.applications_client.html,sha256=yCpqBwCaytmQEuwxnbygjZ5oauY3th4Uan2RNEd104Q,15434
|
|
69
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.docker_registry_secrets_client.html,sha256=FLmw1p-FNiEr2t3B6pTI4ntFZl7qsTT37SpP1Dq3Fp8,12911
|
|
70
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.html,sha256=ymfcqgY_Zyo3RhSRkw9QAb7w4i8opdtYHT3KMQKrTw4,2241
|
|
71
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.internal_rest_client.html,sha256=3CC3xjme4-PRoO1NGJ3hPRQsBSIHwMxObox0gY8_YcI,15366
|
|
72
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.kpi_client.html,sha256=-en1LRcE9W2z8WrAYRfhud6mFJb8AXO3Z9fbSeVpStk,6996
|
|
73
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.metrics_client.html,sha256=v6Mg1QX4bpvcvLO3EvV6JRb7OJZE0xGrWAmMIaCG6_g,19197
|
|
74
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.object_store_secrets_client.html,sha256=SXi9kCOLGNisfETHWLrNS5oqnlbkoIZIBsAIh_eqk50,17320
|
|
75
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.repositories_client.html,sha256=heuE55STe4Bc_hqqlbjOd1ZA69gVUOtt2q_6UYjgQW0,12209
|
|
76
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.resource_groups_client.html,sha256=KQ2nFqxNb4DQoVo1UoVJD5HDtBkoIQatk6qL1JyTxq4,13537
|
|
77
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.resource_clients.secrets_client.html,sha256=7AWvAmD9DOujrNoGXQnfQmfxmf3qGB8RB7Jknp9ssgs,14093
|
|
78
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.tracking.html,sha256=JnL-5SNgPsfvo7p1u5wIIk85KjWJpAP98-XRjhPZU8o,1575
|
|
79
|
+
sap_ai_sdk_core-3.1.6.data/data/docs/ai_core_sdk.tracking.tracking.html,sha256=PavKvroKFxiv6FK2WXQCA7k_loHsW3Vs-TSrsvuqr20,23036
|
|
80
|
+
sap_ai_sdk_core-3.1.6.dist-info/LICENSE,sha256=DYP9C1BSy7cci4r8ihdmeTl1R7DMKUZgDAoeO9QrbS8,12569
|
|
81
|
+
sap_ai_sdk_core-3.1.6.dist-info/METADATA,sha256=z5u6CvqoL7yCqPGHbwqnx2NuMrlSNSK57WG8SbAqjAU,7815
|
|
82
|
+
sap_ai_sdk_core-3.1.6.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
|
|
83
|
+
sap_ai_sdk_core-3.1.6.dist-info/entry_points.txt,sha256=4uK2va116Q8qsEW3mIz_EHW7qCMM3OI7qiH6-T36Wbs,48
|
|
84
|
+
sap_ai_sdk_core-3.1.6.dist-info/top_level.txt,sha256=tsx-hFnZK7HjViGc1YypaU7J7dK7yVd7oS1EBiiMDjk,12
|
|
85
|
+
sap_ai_sdk_core-3.1.6.dist-info/RECORD,,
|
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.exception.html
RENAMED
|
File without changes
|
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.helpers.html
RENAMED
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.helpers.logging.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.kpi.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.models.secret.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.tracking.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|