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.
Files changed (49) hide show
  1. ai_core_sdk/ai_core_v2_client.py +0 -4
  2. ai_core_sdk/credentials.py +112 -34
  3. ai_core_sdk/resource_clients/internal_rest_client.py +35 -2
  4. {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
  5. {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
  6. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/METADATA +3 -3
  7. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/RECORD +49 -49
  8. {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
  9. {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
  10. {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
  11. {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
  12. {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
  13. {sap_ai_sdk_core-3.1.0.data → sap_ai_sdk_core-3.1.6.data}/data/docs/ai_core_sdk.html +0 -0
  14. {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
  15. {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
  16. {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
  17. {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
  18. {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
  19. {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
  20. {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
  21. {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
  22. {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
  23. {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
  24. {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
  25. {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
  26. {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
  27. {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
  28. {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
  29. {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
  30. {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
  31. {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
  32. {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
  33. {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
  34. {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
  35. {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
  36. {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
  37. {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
  38. {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
  39. {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
  40. {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
  41. {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
  42. {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
  43. {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
  44. {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
  45. {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
  46. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/LICENSE +0 -0
  47. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/WHEEL +0 -0
  48. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/entry_points.txt +0 -0
  49. {sap_ai_sdk_core-3.1.0.dist-info → sap_ai_sdk_core-3.1.6.dist-info}/top_level.txt +0 -0
@@ -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)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Any, Dict, Final, List, Optional, Callable, Union, Tuple
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
- def resolve_params(config, cred_value, vcap_service, **kwargs):
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
- # Default case (unlikely due to default in sources)
195
- logger.debug('Using source %s for %s', 'default value', cred_value.name)
196
- return cred_value.default
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 auto detected from the request going to tracking api from the training pod.
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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</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=('cr...s', 'clientid'), default=None, transform_fn=None), CredentialsValue(name='client_secret', vcap_key=...'clientsecret'), default=None, transform_fn=None), CredentialsValue(name='auth_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004975510&gt;), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976050&gt;), CredentialsValue(name='resource_group', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976170&gt;), CredentialsValue(name='cert_file_path', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='key_file_path', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='cert_str', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976200&gt;), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976290&gt;)]<br>
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=&lt;function &lt;lambda&gt; at 0x7f3a682cdb40&gt;), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce560&gt;), CredentialsValue(name='resource_group', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce8c0&gt;), 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=&lt;function &lt;lambda&gt; at 0x7f3a682ce950&gt;), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce9e0&gt;)]<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>
@@ -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>&nbsp;&nbsp;&nbsp;</tt></td>
47
- <td colspan=2><tt><a href="#CredentialsValue">CredentialsValue</a>(name:&nbsp;'str',&nbsp;vcap_key:&nbsp;'Optional[Tuple[str,&nbsp;...]]'&nbsp;=&nbsp;None,&nbsp;default:&nbsp;'Optional[str]'&nbsp;=&nbsp;None,&nbsp;transform_fn:&nbsp;'Optional[Callable]'&nbsp;=&nbsp;None)&nbsp;-&amp;gt;&nbsp;None<br>
48
+ <td colspan=2><tt><a href="#CredentialsValue">CredentialsValue</a>(name:&nbsp;'str',&nbsp;vcap_key:&nbsp;'Optional[Tuple[str,&nbsp;...]]'&nbsp;=&nbsp;None,&nbsp;transform_fn:&nbsp;'Optional[Callable]'&nbsp;=&nbsp;None)&nbsp;-&amp;gt;&nbsp;None<br>
48
49
  &nbsp;<br>
49
- <a href="#CredentialsValue">CredentialsValue</a>(name:&nbsp;'str',&nbsp;vcap_key:&nbsp;'Optional[Tuple[str,&nbsp;...]]'&nbsp;=&nbsp;None,&nbsp;default:&nbsp;'Optional[str]'&nbsp;=&nbsp;None,&nbsp;transform_fn:&nbsp;'Optional[Callable]'&nbsp;=&nbsp;None)<br>&nbsp;</tt></td></tr>
50
+ <a href="#CredentialsValue">CredentialsValue</a>(name:&nbsp;'str',&nbsp;vcap_key:&nbsp;'Optional[Tuple[str,&nbsp;...]]'&nbsp;=&nbsp;None,&nbsp;transform_fn:&nbsp;'Optional[Callable]'&nbsp;=&nbsp;None)<br>&nbsp;</tt></td></tr>
50
51
  <tr><td>&nbsp;</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&nbsp;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, default: 'Optional[str]' = None, transform_fn: 'Optional[Callable]' = None) -&gt; None</dt><dd><tt>Initialize&nbsp;self.&nbsp;&nbsp;See&nbsp;help(type(self))&nbsp;for&nbsp;accurate&nbsp;signature.</tt></dd></dl>
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) -&gt; None</dt><dd><tt>Initialize&nbsp;self.&nbsp;&nbsp;See&nbsp;help(type(self))&nbsp;for&nbsp;accurate&nbsp;signature.</tt></dd></dl>
55
56
 
56
57
  <dl><dt><a name="CredentialsValue-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Return&nbsp;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> = {'default': 'Optional[str]', 'name': 'str', 'transform_fn': 'Optional[Callable]', 'vcap_key': 'Optional[Tuple[str, ...]]'}</dl>
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> = {'default': Field(name='default',type='Optional[str]',defaul...appingproxy({}),kw_only=False,_field_type=_FIELD), 'name': Field(name='name',type='str',default=&lt;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
+ <dl><dt><strong>__dataclass_fields__</strong> = {'name': Field(name='name',type='str',default=&lt;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', 'default', 'transform_fn')</dl>
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&nbsp;self.&nbsp;&nbsp;See&nbsp;help(type(self))&nbsp;for&nbsp;accurate&nbsp;signature.</tt></dd></dl>
99
98
 
100
- <dl><dt><a name="Service-get"><strong>get</strong></a>(self, key, default=&lt;object object at 0x7fa006081790&gt;)</dt></dl>
99
+ <dl><dt><a name="Service-get"><strong>get</strong></a>(self, key, default=&lt;object object at 0x7f3a699d5790&gt;)</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&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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>&nbsp;<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>&nbsp;&nbsp;&nbsp;</tt></td>
122
+ <td colspan=2><tt><a href="#Source">Source</a>(name:&nbsp;'str',&nbsp;get:&nbsp;'Callable[[<a href="#CredentialsValue">CredentialsValue</a>],&nbsp;Optional[str]]')&nbsp;-&amp;gt;&nbsp;None<br>
123
+ &nbsp;<br>
124
+ <a href="#Source">Source</a>(name:&nbsp;'str',&nbsp;get:&nbsp;'Callable[[<a href="#CredentialsValue">CredentialsValue</a>],&nbsp;Optional[str]]')<br>&nbsp;</tt></td></tr>
125
+ <tr><td>&nbsp;</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&nbsp;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]]') -&gt; None</dt><dd><tt>Initialize&nbsp;self.&nbsp;&nbsp;See&nbsp;help(type(self))&nbsp;for&nbsp;accurate&nbsp;signature.</tt></dd></dl>
130
+
131
+ <dl><dt><a name="Source-__repr__"><strong>__repr__</strong></a>(self)</dt><dd><tt>Return&nbsp;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&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
137
+ </dl>
138
+ <dl><dt><strong>__weakref__</strong></dt>
139
+ <dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;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=&lt;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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
173
- <td width="100%"><dl><dt><a name="-fetch_credentials"><strong>fetch_credentials</strong></a>(profile: 'str' = None, **kwargs) -&gt; 'Dict[str, str]'</dt></dl>
210
+ <td width="100%"><dl><dt><a name="-extract_credentials"><strong>extract_credentials</strong></a>(source: 'Source', exclude: 'List[str]' = None) -&gt; 'Dict[str, str]'</dt><dd><tt>Extract&nbsp;all&nbsp;credentials&nbsp;from&nbsp;a&nbsp;source.</tt></dd></dl>
211
+ <dl><dt><a name="-fetch_credentials"><strong>fetch_credentials</strong></a>(profile: 'str' = None, **kwargs) -&gt; 'Dict[str, str]'</dt><dd><tt>Fetch&nbsp;credentials&nbsp;from&nbsp;a&nbsp;single&nbsp;source&nbsp;based&nbsp;on&nbsp;precedence.<br>
212
+ &nbsp;<br>
213
+ Precedence&nbsp;order:&nbsp;kwargs&nbsp;&gt;&nbsp;environment&nbsp;variables&nbsp;&gt;&nbsp;config&nbsp;file&nbsp;&gt;&nbsp;VCAP&nbsp;service<br>
214
+ &nbsp;<br>
215
+ Once&nbsp;a&nbsp;source&nbsp;is&nbsp;selected&nbsp;(first&nbsp;one&nbsp;with&nbsp;any&nbsp;credential),&nbsp;all&nbsp;credentials<br>
216
+ come&nbsp;from&nbsp;that&nbsp;source&nbsp;only.&nbsp;Resource&nbsp;group&nbsp;is&nbsp;an&nbsp;exception&nbsp;and&nbsp;follows<br>
217
+ precedence&nbsp;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&nbsp;a&nbsp;nested&nbsp;value&nbsp;from&nbsp;a&nbsp;dictionary&nbsp;using&nbsp;a&nbsp;list&nbsp;of&nbsp;strings.<br>
175
219
  &nbsp;<br>
176
220
  :param&nbsp;data_dict:&nbsp;The&nbsp;dictionary&nbsp;to&nbsp;search.<br>
177
221
  :param&nbsp;keys:&nbsp;A&nbsp;list&nbsp;of&nbsp;strings&nbsp;representing&nbsp;nested&nbsp;keys.<br>
178
222
  :return:&nbsp;The&nbsp;value&nbsp;associated&nbsp;with&nbsp;the&nbsp;nested&nbsp;keys,&nbsp;or&nbsp;None&nbsp;if&nbsp;not&nbsp;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="-resolve_params"><strong>resolve_params</strong></a>(config, cred_value, vcap_service, **kwargs)</dt><dd><tt>Resolves&nbsp;the&nbsp;parameter&nbsp;value&nbsp;by&nbsp;checking&nbsp;multiple&nbsp;sources&nbsp;in&nbsp;order:<br>
181
- kwargs,&nbsp;environment&nbsp;variables,&nbsp;config,&nbsp;VCAP&nbsp;services,&nbsp;and&nbsp;defaults.<br>
182
- Logs&nbsp;the&nbsp;source&nbsp;of&nbsp;the&nbsp;resolved&nbsp;value.</tt></dd></dl>
224
+ <dl><dt><a name="-resolve_credentials"><strong>resolve_credentials</strong></a>(sources: 'List[Source]') -&gt; 'Dict[str, str]'</dt><dd><tt>Extract&nbsp;credentials&nbsp;from&nbsp;the&nbsp;first&nbsp;source&nbsp;that&nbsp;has&nbsp;any&nbsp;defined.</tt></dd></dl>
225
+ <dl><dt><a name="-resolve_resource_group"><strong>resolve_resource_group</strong></a>(sources: 'List[Source]') -&gt; 'Optional[str]'</dt><dd><tt>Find&nbsp;resource_group&nbsp;from&nbsp;the&nbsp;first&nbsp;source&nbsp;that&nbsp;defines&nbsp;it.</tt></dd></dl>
226
+ <dl><dt><a name="-validate_credentials"><strong>validate_credentials</strong></a>(credentials: 'Dict[str, str]') -&gt; 'None'</dt><dd><tt>Validate&nbsp;that&nbsp;we&nbsp;have&nbsp;a&nbsp;complete&nbsp;authentication&nbsp;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&nbsp;the&nbsp;source&nbsp;of&nbsp;the&nbsp;resolved&nbsp;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=('cr...s', 'clientid'), default=None, transform_fn=None), CredentialsValue(name='client_secret', vcap_key=...'clientsecret'), default=None, transform_fn=None), CredentialsValue(name='auth_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004975510&gt;), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976050&gt;), CredentialsValue(name='resource_group', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976170&gt;), CredentialsValue(name='cert_file_path', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='key_file_path', vcap_key=None, default=None, transform_fn=None), CredentialsValue(name='cert_str', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976200&gt;), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=&lt;function &lt;lambda&gt; at 0x7fa004976290&gt;)]<br>
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=&lt;function &lt;lambda&gt; at 0x7f3a682cdb40&gt;), CredentialsValue(name='base_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce560&gt;), CredentialsValue(name='resource_group', vcap_key=None, transform_fn=None), CredentialsValue(name='cert_url', vcap_key=('cre...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce8c0&gt;), 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=&lt;function &lt;lambda&gt; at 0x7f3a682ce950&gt;), CredentialsValue(name='key_str', vcap_key=('cred...ansform_fn=&lt;function &lt;lambda&gt; at 0x7f3a682ce9e0&gt;)]<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&nbsp;the&nbsp;source&nbsp;of&nbsp;the&nbsp;resolved&nbsp;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.0
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 `ai-core-sdk configure --help` can be used to generate a profile.
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=oPUYiSI-sMibBM_jnYp-qoWK__1qPWI_dg8W4IYvxV0,9418
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=BXDI7HBtlWrzVGDiy4hGl_fRK37mL26JUEx8pK3qN3k,7544
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=yya_SpNRinnfmto5rPF4DwZpx_7tPMxZlq2mXKBs_G0,1817
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.0.data/data/docs/ai_core_sdk.ai_core_v2_client.html,sha256=BOBEkn3jnc34O-Zw0vTHVX_qXaOBex6ZjKtItqR2AFU,11088
41
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.cli.html,sha256=sFjVXLINqnDol6_bPrd62EzhS4NC5RdVhaHonLKCzQg,5298
42
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.credentials.html,sha256=0G8_fPtZwQyipZPhnBJN1lfjbCERIfmIfTbV4yujMY4,14232
43
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.exception.html,sha256=M1Ho12N2uGuwuwJJ7aRH8lxayKuaD9ZV5CajHFXM3is,9856
44
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.helpers.constants.html,sha256=tlrfftGPlN9RQWnypWviTWJ370-tsq3bHFS1v4V4LDM,4951
45
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.helpers.html,sha256=HRhJxDZynSbRfy2GGAz2RbBq_a2AsxpEP_rWkkX3UCo,3765
46
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.helpers.logging.html,sha256=_wL0CVBhU4s2PWenlXDQpBImwEFE6o90Q1wWzBk466M,2706
47
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.html,sha256=X2v8eSgx2fwSnnD3nNOFhcPh17zGEOJ918NNrKpV-fk,1953
48
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.application.html,sha256=V-8-4pB0HIqrhNkIvC9sgBZvLO_2re1ldov8hHlSVOo,4903
49
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.application_query_response.html,sha256=1MxDiHciDTCi26HKW6vOT0O09XfGb2a6ArtoT9_Mlu4,6107
50
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.application_resource_sync_status.html,sha256=1PfCNS5L6WxqT6wZ1HAtf1hwaKVZJ-knWZ00Y6zTAgc,5415
51
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.application_source.html,sha256=8yPUdrL7F6sPdKy9c4riIqXDpD9d8Tn31VATyNujfi4,5137
52
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.application_status.html,sha256=iuA-YdqC45lVe2OCDAHeRoHpnl-9ln-_Q2UDtSqn1NA,6929
53
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.base_models.html,sha256=jEiLIvbedbujQ-mV2Rtlj4CGyAO-hpSbSqh-re5zL-o,7566
54
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.docker_registry_secret.html,sha256=fPo-lf-P_XihNIsKYqi8nqZY4khP5lrPNLtHGTvURoE,5716
55
- sap_ai_sdk_core-3.1.0.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.0.data/data/docs/ai_core_sdk.models.html,sha256=fHsegf0NuhWMXkSxB5kFiraZqVlJYAW4D0jA5rhQxrg,3047
57
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.kpi.html,sha256=dFr8vFPwGnC2AVNE3Gg9EmqLEyXNpJUw1kWU3IpViF8,4367
58
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.object_store_secret.html,sha256=x-QDRmI0p1CH7VyQrY4o--9VTIBJrli2C_RxR8JvtMU,4679
59
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.object_store_secret_query_response.html,sha256=7P8QoHCa1IC_8X46qWNhiFYs2N3Gj6mbM7jo9wUQeik,6368
60
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.repository.html,sha256=VfZHXukn5TBgORsgN9XL-wK8nFRwLuAUhZUs6BNF25M,4905
61
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.repository_query_response.html,sha256=tPcNHK1c_ydLYUXxp5q_4lb4OUfdEWdmU4PpVBp5RyU,6081
62
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.repository_status.html,sha256=lCUdZKvJHfQaglnApomMRGI_-4Fe1wj75_sR9Vodt7c,3886
63
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.resource_group.html,sha256=nIH4K-dohlRYO0I0UKAARh1S3zeKJB3DGN0u1Pa0LVM,5956
64
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.resource_group_query_response.html,sha256=oieUDeBL1Egbbykd-pAN6ygdAuCKPHDNebnblDQOz5Y,6157
65
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.resource_group_status.html,sha256=-XiGblbXr-9aqwXLsWtRwFf5lp5fm3z5668eHRWfduk,3967
66
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.secret.html,sha256=sGDFIqg5K_6lwZlVCVPjiLx88X2uRRBcxfKHV6GMUnw,4610
67
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.models.secret_query_response.html,sha256=TufIaAicLf3u3Ne6-zQq-z6oD8E6p3vDC3W4bEiY8Iw,5936
68
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.applications_client.html,sha256=yCpqBwCaytmQEuwxnbygjZ5oauY3th4Uan2RNEd104Q,15434
69
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.docker_registry_secrets_client.html,sha256=FLmw1p-FNiEr2t3B6pTI4ntFZl7qsTT37SpP1Dq3Fp8,12911
70
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.html,sha256=ymfcqgY_Zyo3RhSRkw9QAb7w4i8opdtYHT3KMQKrTw4,2241
71
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.internal_rest_client.html,sha256=3CC3xjme4-PRoO1NGJ3hPRQsBSIHwMxObox0gY8_YcI,15366
72
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.kpi_client.html,sha256=-en1LRcE9W2z8WrAYRfhud6mFJb8AXO3Z9fbSeVpStk,6996
73
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.metrics_client.html,sha256=v6Mg1QX4bpvcvLO3EvV6JRb7OJZE0xGrWAmMIaCG6_g,19197
74
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.object_store_secrets_client.html,sha256=SXi9kCOLGNisfETHWLrNS5oqnlbkoIZIBsAIh_eqk50,17320
75
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.repositories_client.html,sha256=heuE55STe4Bc_hqqlbjOd1ZA69gVUOtt2q_6UYjgQW0,12209
76
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.resource_groups_client.html,sha256=KQ2nFqxNb4DQoVo1UoVJD5HDtBkoIQatk6qL1JyTxq4,13537
77
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.resource_clients.secrets_client.html,sha256=7AWvAmD9DOujrNoGXQnfQmfxmf3qGB8RB7Jknp9ssgs,14093
78
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.tracking.html,sha256=JnL-5SNgPsfvo7p1u5wIIk85KjWJpAP98-XRjhPZU8o,1575
79
- sap_ai_sdk_core-3.1.0.data/data/docs/ai_core_sdk.tracking.tracking.html,sha256=PavKvroKFxiv6FK2WXQCA7k_loHsW3Vs-TSrsvuqr20,23036
80
- sap_ai_sdk_core-3.1.0.dist-info/LICENSE,sha256=DYP9C1BSy7cci4r8ihdmeTl1R7DMKUZgDAoeO9QrbS8,12569
81
- sap_ai_sdk_core-3.1.0.dist-info/METADATA,sha256=x241fXCuv1VoANT66hLVtdPwNzfQEBlHaQo6C7breIg,7810
82
- sap_ai_sdk_core-3.1.0.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92
83
- sap_ai_sdk_core-3.1.0.dist-info/entry_points.txt,sha256=4uK2va116Q8qsEW3mIz_EHW7qCMM3OI7qiH6-T36Wbs,48
84
- sap_ai_sdk_core-3.1.0.dist-info/top_level.txt,sha256=tsx-hFnZK7HjViGc1YypaU7J7dK7yVd7oS1EBiiMDjk,12
85
- sap_ai_sdk_core-3.1.0.dist-info/RECORD,,
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,,