databricks-sdk 0.69.0__py3-none-any.whl → 0.71.0__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.

Potentially problematic release.


This version of databricks-sdk might be problematic. Click here for more details.

Files changed (37) hide show
  1. databricks/sdk/__init__.py +24 -24
  2. databricks/sdk/dbutils.py +17 -0
  3. databricks/sdk/mixins/files.py +10 -10
  4. databricks/sdk/service/agentbricks.py +2 -0
  5. databricks/sdk/service/apps.py +10 -0
  6. databricks/sdk/service/billing.py +13 -3
  7. databricks/sdk/service/catalog.py +131 -47
  8. databricks/sdk/service/cleanrooms.py +11 -3
  9. databricks/sdk/service/compute.py +64 -0
  10. databricks/sdk/service/dashboards.py +10 -0
  11. databricks/sdk/service/database.py +12 -0
  12. databricks/sdk/service/dataquality.py +201 -52
  13. databricks/sdk/service/files.py +7 -72
  14. databricks/sdk/service/iam.py +26 -36
  15. databricks/sdk/service/iamv2.py +6 -0
  16. databricks/sdk/service/jobs.py +86 -154
  17. databricks/sdk/service/marketplace.py +18 -0
  18. databricks/sdk/service/ml.py +464 -13
  19. databricks/sdk/service/oauth2.py +37 -19
  20. databricks/sdk/service/pipelines.py +25 -2
  21. databricks/sdk/service/provisioning.py +19 -1
  22. databricks/sdk/service/qualitymonitorv2.py +2 -0
  23. databricks/sdk/service/serving.py +16 -21
  24. databricks/sdk/service/settings.py +45 -72
  25. databricks/sdk/service/settingsv2.py +2 -0
  26. databricks/sdk/service/sharing.py +23 -69
  27. databricks/sdk/service/sql.py +85 -62
  28. databricks/sdk/service/tags.py +2 -0
  29. databricks/sdk/service/vectorsearch.py +8 -0
  30. databricks/sdk/service/workspace.py +18 -91
  31. databricks/sdk/version.py +1 -1
  32. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/METADATA +1 -1
  33. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/RECORD +37 -37
  34. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/WHEEL +0 -0
  35. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/licenses/LICENSE +0 -0
  36. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/licenses/NOTICE +0 -0
  37. {databricks_sdk-0.69.0.dist-info → databricks_sdk-0.71.0.dist-info}/top_level.txt +0 -0
@@ -291,6 +291,38 @@ class CommentObject:
291
291
  )
292
292
 
293
293
 
294
+ @dataclass
295
+ class ContinuousWindow:
296
+ window_duration: str
297
+ """The duration of the continuous window (must be positive)."""
298
+
299
+ offset: Optional[str] = None
300
+ """The offset of the continuous window (must be non-positive)."""
301
+
302
+ def as_dict(self) -> dict:
303
+ """Serializes the ContinuousWindow into a dictionary suitable for use as a JSON request body."""
304
+ body = {}
305
+ if self.offset is not None:
306
+ body["offset"] = self.offset
307
+ if self.window_duration is not None:
308
+ body["window_duration"] = self.window_duration
309
+ return body
310
+
311
+ def as_shallow_dict(self) -> dict:
312
+ """Serializes the ContinuousWindow into a shallow dictionary of its immediate attributes."""
313
+ body = {}
314
+ if self.offset is not None:
315
+ body["offset"] = self.offset
316
+ if self.window_duration is not None:
317
+ body["window_duration"] = self.window_duration
318
+ return body
319
+
320
+ @classmethod
321
+ def from_dict(cls, d: Dict[str, Any]) -> ContinuousWindow:
322
+ """Deserializes the ContinuousWindow from a dictionary."""
323
+ return cls(offset=d.get("offset", None), window_duration=d.get("window_duration", None))
324
+
325
+
294
326
  @dataclass
295
327
  class CreateCommentResponse:
296
328
  comment: Optional[CommentObject] = None
@@ -1299,11 +1331,16 @@ class Feature:
1299
1331
  description: Optional[str] = None
1300
1332
  """The description of the feature."""
1301
1333
 
1334
+ filter_condition: Optional[str] = None
1335
+ """The filter condition applied to the source data before aggregation."""
1336
+
1302
1337
  def as_dict(self) -> dict:
1303
1338
  """Serializes the Feature into a dictionary suitable for use as a JSON request body."""
1304
1339
  body = {}
1305
1340
  if self.description is not None:
1306
1341
  body["description"] = self.description
1342
+ if self.filter_condition is not None:
1343
+ body["filter_condition"] = self.filter_condition
1307
1344
  if self.full_name is not None:
1308
1345
  body["full_name"] = self.full_name
1309
1346
  if self.function:
@@ -1321,6 +1358,8 @@ class Feature:
1321
1358
  body = {}
1322
1359
  if self.description is not None:
1323
1360
  body["description"] = self.description
1361
+ if self.filter_condition is not None:
1362
+ body["filter_condition"] = self.filter_condition
1324
1363
  if self.full_name is not None:
1325
1364
  body["full_name"] = self.full_name
1326
1365
  if self.function:
@@ -1338,6 +1377,7 @@ class Feature:
1338
1377
  """Deserializes the Feature from a dictionary."""
1339
1378
  return cls(
1340
1379
  description=d.get("description", None),
1380
+ filter_condition=d.get("filter_condition", None),
1341
1381
  full_name=d.get("full_name", None),
1342
1382
  function=_from_dict(d, "function", Function),
1343
1383
  inputs=d.get("inputs", None),
@@ -2419,6 +2459,41 @@ class ListFeaturesResponse:
2419
2459
  return cls(features=_repeated_dict(d, "features", Feature), next_page_token=d.get("next_page_token", None))
2420
2460
 
2421
2461
 
2462
+ @dataclass
2463
+ class ListMaterializedFeaturesResponse:
2464
+ materialized_features: Optional[List[MaterializedFeature]] = None
2465
+ """List of materialized features."""
2466
+
2467
+ next_page_token: Optional[str] = None
2468
+ """Pagination token to request the next page of results for this query."""
2469
+
2470
+ def as_dict(self) -> dict:
2471
+ """Serializes the ListMaterializedFeaturesResponse into a dictionary suitable for use as a JSON request body."""
2472
+ body = {}
2473
+ if self.materialized_features:
2474
+ body["materialized_features"] = [v.as_dict() for v in self.materialized_features]
2475
+ if self.next_page_token is not None:
2476
+ body["next_page_token"] = self.next_page_token
2477
+ return body
2478
+
2479
+ def as_shallow_dict(self) -> dict:
2480
+ """Serializes the ListMaterializedFeaturesResponse into a shallow dictionary of its immediate attributes."""
2481
+ body = {}
2482
+ if self.materialized_features:
2483
+ body["materialized_features"] = self.materialized_features
2484
+ if self.next_page_token is not None:
2485
+ body["next_page_token"] = self.next_page_token
2486
+ return body
2487
+
2488
+ @classmethod
2489
+ def from_dict(cls, d: Dict[str, Any]) -> ListMaterializedFeaturesResponse:
2490
+ """Deserializes the ListMaterializedFeaturesResponse from a dictionary."""
2491
+ return cls(
2492
+ materialized_features=_repeated_dict(d, "materialized_features", MaterializedFeature),
2493
+ next_page_token=d.get("next_page_token", None),
2494
+ )
2495
+
2496
+
2422
2497
  @dataclass
2423
2498
  class ListModelsResponse:
2424
2499
  next_page_token: Optional[str] = None
@@ -2937,6 +3012,90 @@ class LoggedModelTag:
2937
3012
  return cls(key=d.get("key", None), value=d.get("value", None))
2938
3013
 
2939
3014
 
3015
+ @dataclass
3016
+ class MaterializedFeature:
3017
+ """A materialized feature represents a feature that is continuously computed and stored."""
3018
+
3019
+ feature_name: str
3020
+ """The full name of the feature in Unity Catalog."""
3021
+
3022
+ last_materialization_time: Optional[str] = None
3023
+ """The timestamp when the pipeline last ran and updated the materialized feature values. If the
3024
+ pipeline has not run yet, this field will be null."""
3025
+
3026
+ materialized_feature_id: Optional[str] = None
3027
+ """Unique identifier for the materialized feature."""
3028
+
3029
+ offline_store_config: Optional[OfflineStoreConfig] = None
3030
+
3031
+ online_store_config: Optional[OnlineStore] = None
3032
+
3033
+ pipeline_schedule_state: Optional[MaterializedFeaturePipelineScheduleState] = None
3034
+ """The schedule state of the materialization pipeline."""
3035
+
3036
+ table_name: Optional[str] = None
3037
+ """The fully qualified Unity Catalog path to the table containing the materialized feature (Delta
3038
+ table or Lakebase table). Output only."""
3039
+
3040
+ def as_dict(self) -> dict:
3041
+ """Serializes the MaterializedFeature into a dictionary suitable for use as a JSON request body."""
3042
+ body = {}
3043
+ if self.feature_name is not None:
3044
+ body["feature_name"] = self.feature_name
3045
+ if self.last_materialization_time is not None:
3046
+ body["last_materialization_time"] = self.last_materialization_time
3047
+ if self.materialized_feature_id is not None:
3048
+ body["materialized_feature_id"] = self.materialized_feature_id
3049
+ if self.offline_store_config:
3050
+ body["offline_store_config"] = self.offline_store_config.as_dict()
3051
+ if self.online_store_config:
3052
+ body["online_store_config"] = self.online_store_config.as_dict()
3053
+ if self.pipeline_schedule_state is not None:
3054
+ body["pipeline_schedule_state"] = self.pipeline_schedule_state.value
3055
+ if self.table_name is not None:
3056
+ body["table_name"] = self.table_name
3057
+ return body
3058
+
3059
+ def as_shallow_dict(self) -> dict:
3060
+ """Serializes the MaterializedFeature into a shallow dictionary of its immediate attributes."""
3061
+ body = {}
3062
+ if self.feature_name is not None:
3063
+ body["feature_name"] = self.feature_name
3064
+ if self.last_materialization_time is not None:
3065
+ body["last_materialization_time"] = self.last_materialization_time
3066
+ if self.materialized_feature_id is not None:
3067
+ body["materialized_feature_id"] = self.materialized_feature_id
3068
+ if self.offline_store_config:
3069
+ body["offline_store_config"] = self.offline_store_config
3070
+ if self.online_store_config:
3071
+ body["online_store_config"] = self.online_store_config
3072
+ if self.pipeline_schedule_state is not None:
3073
+ body["pipeline_schedule_state"] = self.pipeline_schedule_state
3074
+ if self.table_name is not None:
3075
+ body["table_name"] = self.table_name
3076
+ return body
3077
+
3078
+ @classmethod
3079
+ def from_dict(cls, d: Dict[str, Any]) -> MaterializedFeature:
3080
+ """Deserializes the MaterializedFeature from a dictionary."""
3081
+ return cls(
3082
+ feature_name=d.get("feature_name", None),
3083
+ last_materialization_time=d.get("last_materialization_time", None),
3084
+ materialized_feature_id=d.get("materialized_feature_id", None),
3085
+ offline_store_config=_from_dict(d, "offline_store_config", OfflineStoreConfig),
3086
+ online_store_config=_from_dict(d, "online_store_config", OnlineStore),
3087
+ pipeline_schedule_state=_enum(d, "pipeline_schedule_state", MaterializedFeaturePipelineScheduleState),
3088
+ table_name=d.get("table_name", None),
3089
+ )
3090
+
3091
+
3092
+ class MaterializedFeaturePipelineScheduleState(Enum):
3093
+
3094
+ ACTIVE = "ACTIVE"
3095
+ PAUSED = "PAUSED"
3096
+ SNAPSHOT = "SNAPSHOT"
3097
+
3098
+
2940
3099
  @dataclass
2941
3100
  class Metric:
2942
3101
  """Metric associated with a run, represented as a key-value pair."""
@@ -3613,6 +3772,52 @@ class ModelVersionTag:
3613
3772
  return cls(key=d.get("key", None), value=d.get("value", None))
3614
3773
 
3615
3774
 
3775
+ @dataclass
3776
+ class OfflineStoreConfig:
3777
+ """Configuration for offline store destination."""
3778
+
3779
+ catalog_name: str
3780
+ """The Unity Catalog catalog name."""
3781
+
3782
+ schema_name: str
3783
+ """The Unity Catalog schema name."""
3784
+
3785
+ table_name_prefix: str
3786
+ """Prefix for Unity Catalog table name. The materialized feature will be stored in a table with
3787
+ this prefix and a generated postfix."""
3788
+
3789
+ def as_dict(self) -> dict:
3790
+ """Serializes the OfflineStoreConfig into a dictionary suitable for use as a JSON request body."""
3791
+ body = {}
3792
+ if self.catalog_name is not None:
3793
+ body["catalog_name"] = self.catalog_name
3794
+ if self.schema_name is not None:
3795
+ body["schema_name"] = self.schema_name
3796
+ if self.table_name_prefix is not None:
3797
+ body["table_name_prefix"] = self.table_name_prefix
3798
+ return body
3799
+
3800
+ def as_shallow_dict(self) -> dict:
3801
+ """Serializes the OfflineStoreConfig into a shallow dictionary of its immediate attributes."""
3802
+ body = {}
3803
+ if self.catalog_name is not None:
3804
+ body["catalog_name"] = self.catalog_name
3805
+ if self.schema_name is not None:
3806
+ body["schema_name"] = self.schema_name
3807
+ if self.table_name_prefix is not None:
3808
+ body["table_name_prefix"] = self.table_name_prefix
3809
+ return body
3810
+
3811
+ @classmethod
3812
+ def from_dict(cls, d: Dict[str, Any]) -> OfflineStoreConfig:
3813
+ """Deserializes the OfflineStoreConfig from a dictionary."""
3814
+ return cls(
3815
+ catalog_name=d.get("catalog_name", None),
3816
+ schema_name=d.get("schema_name", None),
3817
+ table_name_prefix=d.get("table_name_prefix", None),
3818
+ )
3819
+
3820
+
3616
3821
  @dataclass
3617
3822
  class OnlineStore:
3618
3823
  """An OnlineStore is a logical database instance that stores and serves features online."""
@@ -4941,6 +5146,38 @@ class SetTagResponse:
4941
5146
  return cls()
4942
5147
 
4943
5148
 
5149
+ @dataclass
5150
+ class SlidingWindow:
5151
+ window_duration: str
5152
+ """The duration of the sliding window."""
5153
+
5154
+ slide_duration: str
5155
+ """The slide duration (interval by which windows advance, must be positive and less than duration)."""
5156
+
5157
+ def as_dict(self) -> dict:
5158
+ """Serializes the SlidingWindow into a dictionary suitable for use as a JSON request body."""
5159
+ body = {}
5160
+ if self.slide_duration is not None:
5161
+ body["slide_duration"] = self.slide_duration
5162
+ if self.window_duration is not None:
5163
+ body["window_duration"] = self.window_duration
5164
+ return body
5165
+
5166
+ def as_shallow_dict(self) -> dict:
5167
+ """Serializes the SlidingWindow into a shallow dictionary of its immediate attributes."""
5168
+ body = {}
5169
+ if self.slide_duration is not None:
5170
+ body["slide_duration"] = self.slide_duration
5171
+ if self.window_duration is not None:
5172
+ body["window_duration"] = self.window_duration
5173
+ return body
5174
+
5175
+ @classmethod
5176
+ def from_dict(cls, d: Dict[str, Any]) -> SlidingWindow:
5177
+ """Deserializes the SlidingWindow from a dictionary."""
5178
+ return cls(slide_duration=d.get("slide_duration", None), window_duration=d.get("window_duration", None))
5179
+
5180
+
4944
5181
  class Status(Enum):
4945
5182
  """The status of the model version. Valid values are: * `PENDING_REGISTRATION`: Request to register
4946
5183
  a new model version is pending as server performs background tasks.
@@ -4988,34 +5225,42 @@ class TestRegistryWebhookResponse:
4988
5225
 
4989
5226
  @dataclass
4990
5227
  class TimeWindow:
4991
- duration: str
4992
- """The duration of the time window."""
5228
+ continuous: Optional[ContinuousWindow] = None
4993
5229
 
4994
- offset: Optional[str] = None
4995
- """The offset of the time window."""
5230
+ sliding: Optional[SlidingWindow] = None
5231
+
5232
+ tumbling: Optional[TumblingWindow] = None
4996
5233
 
4997
5234
  def as_dict(self) -> dict:
4998
5235
  """Serializes the TimeWindow into a dictionary suitable for use as a JSON request body."""
4999
5236
  body = {}
5000
- if self.duration is not None:
5001
- body["duration"] = self.duration
5002
- if self.offset is not None:
5003
- body["offset"] = self.offset
5237
+ if self.continuous:
5238
+ body["continuous"] = self.continuous.as_dict()
5239
+ if self.sliding:
5240
+ body["sliding"] = self.sliding.as_dict()
5241
+ if self.tumbling:
5242
+ body["tumbling"] = self.tumbling.as_dict()
5004
5243
  return body
5005
5244
 
5006
5245
  def as_shallow_dict(self) -> dict:
5007
5246
  """Serializes the TimeWindow into a shallow dictionary of its immediate attributes."""
5008
5247
  body = {}
5009
- if self.duration is not None:
5010
- body["duration"] = self.duration
5011
- if self.offset is not None:
5012
- body["offset"] = self.offset
5248
+ if self.continuous:
5249
+ body["continuous"] = self.continuous
5250
+ if self.sliding:
5251
+ body["sliding"] = self.sliding
5252
+ if self.tumbling:
5253
+ body["tumbling"] = self.tumbling
5013
5254
  return body
5014
5255
 
5015
5256
  @classmethod
5016
5257
  def from_dict(cls, d: Dict[str, Any]) -> TimeWindow:
5017
5258
  """Deserializes the TimeWindow from a dictionary."""
5018
- return cls(duration=d.get("duration", None), offset=d.get("offset", None))
5259
+ return cls(
5260
+ continuous=_from_dict(d, "continuous", ContinuousWindow),
5261
+ sliding=_from_dict(d, "sliding", SlidingWindow),
5262
+ tumbling=_from_dict(d, "tumbling", TumblingWindow),
5263
+ )
5019
5264
 
5020
5265
 
5021
5266
  @dataclass
@@ -5113,6 +5358,31 @@ class TransitionStageResponse:
5113
5358
  return cls(model_version_databricks=_from_dict(d, "model_version_databricks", ModelVersionDatabricks))
5114
5359
 
5115
5360
 
5361
+ @dataclass
5362
+ class TumblingWindow:
5363
+ window_duration: str
5364
+ """The duration of each tumbling window (non-overlapping, fixed-duration windows)."""
5365
+
5366
+ def as_dict(self) -> dict:
5367
+ """Serializes the TumblingWindow into a dictionary suitable for use as a JSON request body."""
5368
+ body = {}
5369
+ if self.window_duration is not None:
5370
+ body["window_duration"] = self.window_duration
5371
+ return body
5372
+
5373
+ def as_shallow_dict(self) -> dict:
5374
+ """Serializes the TumblingWindow into a shallow dictionary of its immediate attributes."""
5375
+ body = {}
5376
+ if self.window_duration is not None:
5377
+ body["window_duration"] = self.window_duration
5378
+ return body
5379
+
5380
+ @classmethod
5381
+ def from_dict(cls, d: Dict[str, Any]) -> TumblingWindow:
5382
+ """Deserializes the TumblingWindow from a dictionary."""
5383
+ return cls(window_duration=d.get("window_duration", None))
5384
+
5385
+
5116
5386
  @dataclass
5117
5387
  class UpdateCommentResponse:
5118
5388
  comment: Optional[CommentObject] = None
@@ -5305,6 +5575,7 @@ class ExperimentsAPI:
5305
5575
 
5306
5576
  :returns: :class:`CreateExperimentResponse`
5307
5577
  """
5578
+
5308
5579
  body = {}
5309
5580
  if artifact_location is not None:
5310
5581
  body["artifact_location"] = artifact_location
@@ -5347,6 +5618,7 @@ class ExperimentsAPI:
5347
5618
 
5348
5619
  :returns: :class:`CreateLoggedModelResponse`
5349
5620
  """
5621
+
5350
5622
  body = {}
5351
5623
  if experiment_id is not None:
5352
5624
  body["experiment_id"] = experiment_id
@@ -5395,6 +5667,7 @@ class ExperimentsAPI:
5395
5667
 
5396
5668
  :returns: :class:`CreateRunResponse`
5397
5669
  """
5670
+
5398
5671
  body = {}
5399
5672
  if experiment_id is not None:
5400
5673
  body["experiment_id"] = experiment_id
@@ -5423,6 +5696,7 @@ class ExperimentsAPI:
5423
5696
 
5424
5697
 
5425
5698
  """
5699
+
5426
5700
  body = {}
5427
5701
  if experiment_id is not None:
5428
5702
  body["experiment_id"] = experiment_id
@@ -5473,6 +5747,7 @@ class ExperimentsAPI:
5473
5747
 
5474
5748
 
5475
5749
  """
5750
+
5476
5751
  body = {}
5477
5752
  if run_id is not None:
5478
5753
  body["run_id"] = run_id
@@ -5501,6 +5776,7 @@ class ExperimentsAPI:
5501
5776
 
5502
5777
  :returns: :class:`DeleteRunsResponse`
5503
5778
  """
5779
+
5504
5780
  body = {}
5505
5781
  if experiment_id is not None:
5506
5782
  body["experiment_id"] = experiment_id
@@ -5527,6 +5803,7 @@ class ExperimentsAPI:
5527
5803
 
5528
5804
 
5529
5805
  """
5806
+
5530
5807
  body = {}
5531
5808
  if key is not None:
5532
5809
  body["key"] = key
@@ -5550,6 +5827,7 @@ class ExperimentsAPI:
5550
5827
 
5551
5828
  :returns: :class:`FinalizeLoggedModelResponse`
5552
5829
  """
5830
+
5553
5831
  body = {}
5554
5832
  if status is not None:
5555
5833
  body["status"] = status.value
@@ -5888,6 +6166,7 @@ class ExperimentsAPI:
5888
6166
 
5889
6167
 
5890
6168
  """
6169
+
5891
6170
  body = {}
5892
6171
  if metrics is not None:
5893
6172
  body["metrics"] = [v.as_dict() for v in metrics]
@@ -5918,6 +6197,7 @@ class ExperimentsAPI:
5918
6197
 
5919
6198
 
5920
6199
  """
6200
+
5921
6201
  body = {}
5922
6202
  if datasets is not None:
5923
6203
  body["datasets"] = [v.as_dict() for v in datasets]
@@ -5944,6 +6224,7 @@ class ExperimentsAPI:
5944
6224
 
5945
6225
 
5946
6226
  """
6227
+
5947
6228
  body = {}
5948
6229
  if params is not None:
5949
6230
  body["params"] = [v.as_dict() for v in params]
@@ -5995,6 +6276,7 @@ class ExperimentsAPI:
5995
6276
 
5996
6277
 
5997
6278
  """
6279
+
5998
6280
  body = {}
5999
6281
  if dataset_digest is not None:
6000
6282
  body["dataset_digest"] = dataset_digest
@@ -6034,6 +6316,7 @@ class ExperimentsAPI:
6034
6316
 
6035
6317
 
6036
6318
  """
6319
+
6037
6320
  body = {}
6038
6321
  if model_json is not None:
6039
6322
  body["model_json"] = model_json
@@ -6056,6 +6339,7 @@ class ExperimentsAPI:
6056
6339
 
6057
6340
 
6058
6341
  """
6342
+
6059
6343
  body = {}
6060
6344
  if models is not None:
6061
6345
  body["models"] = [v.as_dict() for v in models]
@@ -6085,6 +6369,7 @@ class ExperimentsAPI:
6085
6369
 
6086
6370
 
6087
6371
  """
6372
+
6088
6373
  body = {}
6089
6374
  if key is not None:
6090
6375
  body["key"] = key
@@ -6113,6 +6398,7 @@ class ExperimentsAPI:
6113
6398
 
6114
6399
 
6115
6400
  """
6401
+
6116
6402
  body = {}
6117
6403
  if experiment_id is not None:
6118
6404
  body["experiment_id"] = experiment_id
@@ -6133,6 +6419,7 @@ class ExperimentsAPI:
6133
6419
 
6134
6420
 
6135
6421
  """
6422
+
6136
6423
  body = {}
6137
6424
  if run_id is not None:
6138
6425
  body["run_id"] = run_id
@@ -6161,6 +6448,7 @@ class ExperimentsAPI:
6161
6448
 
6162
6449
  :returns: :class:`RestoreRunsResponse`
6163
6450
  """
6451
+
6164
6452
  body = {}
6165
6453
  if experiment_id is not None:
6166
6454
  body["experiment_id"] = experiment_id
@@ -6202,6 +6490,7 @@ class ExperimentsAPI:
6202
6490
 
6203
6491
  :returns: Iterator over :class:`Experiment`
6204
6492
  """
6493
+
6205
6494
  body = {}
6206
6495
  if filter is not None:
6207
6496
  body["filter"] = filter
@@ -6261,6 +6550,7 @@ class ExperimentsAPI:
6261
6550
 
6262
6551
  :returns: :class:`SearchLoggedModelsResponse`
6263
6552
  """
6553
+
6264
6554
  body = {}
6265
6555
  if datasets is not None:
6266
6556
  body["datasets"] = [v.as_dict() for v in datasets]
@@ -6324,6 +6614,7 @@ class ExperimentsAPI:
6324
6614
 
6325
6615
  :returns: Iterator over :class:`Run`
6326
6616
  """
6617
+
6327
6618
  body = {}
6328
6619
  if experiment_ids is not None:
6329
6620
  body["experiment_ids"] = [v for v in experiment_ids]
@@ -6363,6 +6654,7 @@ class ExperimentsAPI:
6363
6654
 
6364
6655
 
6365
6656
  """
6657
+
6366
6658
  body = {}
6367
6659
  if experiment_id is not None:
6368
6660
  body["experiment_id"] = experiment_id
@@ -6387,6 +6679,7 @@ class ExperimentsAPI:
6387
6679
 
6388
6680
 
6389
6681
  """
6682
+
6390
6683
  body = {}
6391
6684
  if tags is not None:
6392
6685
  body["tags"] = [v.as_dict() for v in tags]
@@ -6409,6 +6702,7 @@ class ExperimentsAPI:
6409
6702
 
6410
6703
  :returns: :class:`ExperimentPermissions`
6411
6704
  """
6705
+
6412
6706
  body = {}
6413
6707
  if access_control_list is not None:
6414
6708
  body["access_control_list"] = [v.as_dict() for v in access_control_list]
@@ -6435,6 +6729,7 @@ class ExperimentsAPI:
6435
6729
 
6436
6730
 
6437
6731
  """
6732
+
6438
6733
  body = {}
6439
6734
  if key is not None:
6440
6735
  body["key"] = key
@@ -6461,6 +6756,7 @@ class ExperimentsAPI:
6461
6756
 
6462
6757
 
6463
6758
  """
6759
+
6464
6760
  body = {}
6465
6761
  if experiment_id is not None:
6466
6762
  body["experiment_id"] = experiment_id
@@ -6484,6 +6780,7 @@ class ExperimentsAPI:
6484
6780
 
6485
6781
  :returns: :class:`ExperimentPermissions`
6486
6782
  """
6783
+
6487
6784
  body = {}
6488
6785
  if access_control_list is not None:
6489
6786
  body["access_control_list"] = [v.as_dict() for v in access_control_list]
@@ -6520,6 +6817,7 @@ class ExperimentsAPI:
6520
6817
 
6521
6818
  :returns: :class:`UpdateRunResponse`
6522
6819
  """
6820
+
6523
6821
  body = {}
6524
6822
  if end_time is not None:
6525
6823
  body["end_time"] = end_time
@@ -6554,6 +6852,7 @@ class FeatureEngineeringAPI:
6554
6852
 
6555
6853
  :returns: :class:`Feature`
6556
6854
  """
6855
+
6557
6856
  body = feature.as_dict()
6558
6857
  headers = {
6559
6858
  "Accept": "application/json",
@@ -6563,6 +6862,24 @@ class FeatureEngineeringAPI:
6563
6862
  res = self._api.do("POST", "/api/2.0/feature-engineering/features", body=body, headers=headers)
6564
6863
  return Feature.from_dict(res)
6565
6864
 
6865
+ def create_materialized_feature(self, materialized_feature: MaterializedFeature) -> MaterializedFeature:
6866
+ """Create a materialized feature.
6867
+
6868
+ :param materialized_feature: :class:`MaterializedFeature`
6869
+ The materialized feature to create.
6870
+
6871
+ :returns: :class:`MaterializedFeature`
6872
+ """
6873
+
6874
+ body = materialized_feature.as_dict()
6875
+ headers = {
6876
+ "Accept": "application/json",
6877
+ "Content-Type": "application/json",
6878
+ }
6879
+
6880
+ res = self._api.do("POST", "/api/2.0/feature-engineering/materialized-features", body=body, headers=headers)
6881
+ return MaterializedFeature.from_dict(res)
6882
+
6566
6883
  def delete_feature(self, full_name: str):
6567
6884
  """Delete a Feature.
6568
6885
 
@@ -6578,6 +6895,23 @@ class FeatureEngineeringAPI:
6578
6895
 
6579
6896
  self._api.do("DELETE", f"/api/2.0/feature-engineering/features/{full_name}", headers=headers)
6580
6897
 
6898
+ def delete_materialized_feature(self, materialized_feature_id: str):
6899
+ """Delete a materialized feature.
6900
+
6901
+ :param materialized_feature_id: str
6902
+ The ID of the materialized feature to delete.
6903
+
6904
+
6905
+ """
6906
+
6907
+ headers = {
6908
+ "Accept": "application/json",
6909
+ }
6910
+
6911
+ self._api.do(
6912
+ "DELETE", f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}", headers=headers
6913
+ )
6914
+
6581
6915
  def get_feature(self, full_name: str) -> Feature:
6582
6916
  """Get a Feature.
6583
6917
 
@@ -6594,6 +6928,24 @@ class FeatureEngineeringAPI:
6594
6928
  res = self._api.do("GET", f"/api/2.0/feature-engineering/features/{full_name}", headers=headers)
6595
6929
  return Feature.from_dict(res)
6596
6930
 
6931
+ def get_materialized_feature(self, materialized_feature_id: str) -> MaterializedFeature:
6932
+ """Get a materialized feature.
6933
+
6934
+ :param materialized_feature_id: str
6935
+ The ID of the materialized feature.
6936
+
6937
+ :returns: :class:`MaterializedFeature`
6938
+ """
6939
+
6940
+ headers = {
6941
+ "Accept": "application/json",
6942
+ }
6943
+
6944
+ res = self._api.do(
6945
+ "GET", f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}", headers=headers
6946
+ )
6947
+ return MaterializedFeature.from_dict(res)
6948
+
6597
6949
  def list_features(self, *, page_size: Optional[int] = None, page_token: Optional[str] = None) -> Iterator[Feature]:
6598
6950
  """List Features.
6599
6951
 
@@ -6623,6 +6975,45 @@ class FeatureEngineeringAPI:
6623
6975
  return
6624
6976
  query["page_token"] = json["next_page_token"]
6625
6977
 
6978
+ def list_materialized_features(
6979
+ self, *, feature_name: Optional[str] = None, page_size: Optional[int] = None, page_token: Optional[str] = None
6980
+ ) -> Iterator[MaterializedFeature]:
6981
+ """List materialized features.
6982
+
6983
+ :param feature_name: str (optional)
6984
+ Filter by feature name. If specified, only materialized features materialized from this feature will
6985
+ be returned.
6986
+ :param page_size: int (optional)
6987
+ The maximum number of results to return. Defaults to 100 if not specified. Cannot be greater than
6988
+ 1000.
6989
+ :param page_token: str (optional)
6990
+ Pagination token to go to the next page based on a previous query.
6991
+
6992
+ :returns: Iterator over :class:`MaterializedFeature`
6993
+ """
6994
+
6995
+ query = {}
6996
+ if feature_name is not None:
6997
+ query["feature_name"] = feature_name
6998
+ if page_size is not None:
6999
+ query["page_size"] = page_size
7000
+ if page_token is not None:
7001
+ query["page_token"] = page_token
7002
+ headers = {
7003
+ "Accept": "application/json",
7004
+ }
7005
+
7006
+ while True:
7007
+ json = self._api.do(
7008
+ "GET", "/api/2.0/feature-engineering/materialized-features", query=query, headers=headers
7009
+ )
7010
+ if "materialized_features" in json:
7011
+ for v in json["materialized_features"]:
7012
+ yield MaterializedFeature.from_dict(v)
7013
+ if "next_page_token" not in json or not json["next_page_token"]:
7014
+ return
7015
+ query["page_token"] = json["next_page_token"]
7016
+
6626
7017
  def update_feature(self, full_name: str, feature: Feature, update_mask: str) -> Feature:
6627
7018
  """Update a Feature.
6628
7019
 
@@ -6635,6 +7026,7 @@ class FeatureEngineeringAPI:
6635
7026
 
6636
7027
  :returns: :class:`Feature`
6637
7028
  """
7029
+
6638
7030
  body = feature.as_dict()
6639
7031
  query = {}
6640
7032
  if update_mask is not None:
@@ -6649,6 +7041,40 @@ class FeatureEngineeringAPI:
6649
7041
  )
6650
7042
  return Feature.from_dict(res)
6651
7043
 
7044
+ def update_materialized_feature(
7045
+ self, materialized_feature_id: str, materialized_feature: MaterializedFeature, update_mask: str
7046
+ ) -> MaterializedFeature:
7047
+ """Update a materialized feature (pause/resume).
7048
+
7049
+ :param materialized_feature_id: str
7050
+ Unique identifier for the materialized feature.
7051
+ :param materialized_feature: :class:`MaterializedFeature`
7052
+ The materialized feature to update.
7053
+ :param update_mask: str
7054
+ Provide the materialization feature fields which should be updated. Currently, only the
7055
+ pipeline_state field can be updated.
7056
+
7057
+ :returns: :class:`MaterializedFeature`
7058
+ """
7059
+
7060
+ body = materialized_feature.as_dict()
7061
+ query = {}
7062
+ if update_mask is not None:
7063
+ query["update_mask"] = update_mask
7064
+ headers = {
7065
+ "Accept": "application/json",
7066
+ "Content-Type": "application/json",
7067
+ }
7068
+
7069
+ res = self._api.do(
7070
+ "PATCH",
7071
+ f"/api/2.0/feature-engineering/materialized-features/{materialized_feature_id}",
7072
+ query=query,
7073
+ body=body,
7074
+ headers=headers,
7075
+ )
7076
+ return MaterializedFeature.from_dict(res)
7077
+
6652
7078
 
6653
7079
  class FeatureStoreAPI:
6654
7080
  """A feature store is a centralized repository that enables data scientists to find and share features. Using
@@ -6669,6 +7095,7 @@ class FeatureStoreAPI:
6669
7095
 
6670
7096
  :returns: :class:`OnlineStore`
6671
7097
  """
7098
+
6672
7099
  body = online_store.as_dict()
6673
7100
  headers = {
6674
7101
  "Accept": "application/json",
@@ -6750,6 +7177,7 @@ class FeatureStoreAPI:
6750
7177
 
6751
7178
  :returns: :class:`PublishTableResponse`
6752
7179
  """
7180
+
6753
7181
  body = {}
6754
7182
  if publish_spec is not None:
6755
7183
  body["publish_spec"] = publish_spec.as_dict()
@@ -6775,6 +7203,7 @@ class FeatureStoreAPI:
6775
7203
 
6776
7204
  :returns: :class:`OnlineStore`
6777
7205
  """
7206
+
6778
7207
  body = online_store.as_dict()
6779
7208
  query = {}
6780
7209
  if update_mask is not None:
@@ -6907,6 +7336,7 @@ class ForecastingAPI:
6907
7336
  Long-running operation waiter for :class:`ForecastingExperiment`.
6908
7337
  See :method:wait_get_experiment_forecasting_succeeded for more details.
6909
7338
  """
7339
+
6910
7340
  body = {}
6911
7341
  if custom_weights_column is not None:
6912
7342
  body["custom_weights_column"] = custom_weights_column
@@ -7029,6 +7459,7 @@ class MaterializedFeaturesAPI:
7029
7459
 
7030
7460
  :returns: :class:`FeatureTag`
7031
7461
  """
7462
+
7032
7463
  body = feature_tag.as_dict()
7033
7464
  headers = {
7034
7465
  "Accept": "application/json",
@@ -7167,6 +7598,7 @@ class MaterializedFeaturesAPI:
7167
7598
 
7168
7599
  :returns: :class:`FeatureTag`
7169
7600
  """
7601
+
7170
7602
  body = feature_tag.as_dict()
7171
7603
  query = {}
7172
7604
  if update_mask is not None:
@@ -7224,6 +7656,7 @@ class ModelRegistryAPI:
7224
7656
 
7225
7657
  :returns: :class:`ApproveTransitionRequestResponse`
7226
7658
  """
7659
+
7227
7660
  body = {}
7228
7661
  if archive_existing_versions is not None:
7229
7662
  body["archive_existing_versions"] = archive_existing_versions
@@ -7256,6 +7689,7 @@ class ModelRegistryAPI:
7256
7689
 
7257
7690
  :returns: :class:`CreateCommentResponse`
7258
7691
  """
7692
+
7259
7693
  body = {}
7260
7694
  if comment is not None:
7261
7695
  body["comment"] = comment
@@ -7286,6 +7720,7 @@ class ModelRegistryAPI:
7286
7720
 
7287
7721
  :returns: :class:`CreateModelResponse`
7288
7722
  """
7723
+
7289
7724
  body = {}
7290
7725
  if description is not None:
7291
7726
  body["description"] = description
@@ -7330,6 +7765,7 @@ class ModelRegistryAPI:
7330
7765
 
7331
7766
  :returns: :class:`CreateModelVersionResponse`
7332
7767
  """
7768
+
7333
7769
  body = {}
7334
7770
  if description is not None:
7335
7771
  body["description"] = description
@@ -7375,6 +7811,7 @@ class ModelRegistryAPI:
7375
7811
 
7376
7812
  :returns: :class:`CreateTransitionRequestResponse`
7377
7813
  """
7814
+
7378
7815
  body = {}
7379
7816
  if comment is not None:
7380
7817
  body["comment"] = comment
@@ -7453,6 +7890,7 @@ class ModelRegistryAPI:
7453
7890
 
7454
7891
  :returns: :class:`CreateWebhookResponse`
7455
7892
  """
7893
+
7456
7894
  body = {}
7457
7895
  if description is not None:
7458
7896
  body["description"] = description
@@ -7656,6 +8094,7 @@ class ModelRegistryAPI:
7656
8094
 
7657
8095
  :returns: Iterator over :class:`ModelVersion`
7658
8096
  """
8097
+
7659
8098
  body = {}
7660
8099
  if name is not None:
7661
8100
  body["name"] = name
@@ -7925,6 +8364,7 @@ class ModelRegistryAPI:
7925
8364
 
7926
8365
  :returns: :class:`RejectTransitionRequestResponse`
7927
8366
  """
8367
+
7928
8368
  body = {}
7929
8369
  if comment is not None:
7930
8370
  body["comment"] = comment
@@ -7952,6 +8392,7 @@ class ModelRegistryAPI:
7952
8392
 
7953
8393
  :returns: :class:`RenameModelResponse`
7954
8394
  """
8395
+
7955
8396
  body = {}
7956
8397
  if name is not None:
7957
8398
  body["name"] = name
@@ -8075,6 +8516,7 @@ class ModelRegistryAPI:
8075
8516
 
8076
8517
 
8077
8518
  """
8519
+
8078
8520
  body = {}
8079
8521
  if key is not None:
8080
8522
  body["key"] = key
@@ -8106,6 +8548,7 @@ class ModelRegistryAPI:
8106
8548
 
8107
8549
 
8108
8550
  """
8551
+
8109
8552
  body = {}
8110
8553
  if key is not None:
8111
8554
  body["key"] = key
@@ -8137,6 +8580,7 @@ class ModelRegistryAPI:
8137
8580
 
8138
8581
  :returns: :class:`RegisteredModelPermissions`
8139
8582
  """
8583
+
8140
8584
  body = {}
8141
8585
  if access_control_list is not None:
8142
8586
  body["access_control_list"] = [v.as_dict() for v in access_control_list]
@@ -8163,6 +8607,7 @@ class ModelRegistryAPI:
8163
8607
 
8164
8608
  :returns: :class:`TestRegistryWebhookResponse`
8165
8609
  """
8610
+
8166
8611
  body = {}
8167
8612
  if event is not None:
8168
8613
  body["event"] = event.value
@@ -8205,6 +8650,7 @@ class ModelRegistryAPI:
8205
8650
 
8206
8651
  :returns: :class:`TransitionStageResponse`
8207
8652
  """
8653
+
8208
8654
  body = {}
8209
8655
  if archive_existing_versions is not None:
8210
8656
  body["archive_existing_versions"] = archive_existing_versions
@@ -8236,6 +8682,7 @@ class ModelRegistryAPI:
8236
8682
 
8237
8683
  :returns: :class:`UpdateCommentResponse`
8238
8684
  """
8685
+
8239
8686
  body = {}
8240
8687
  if comment is not None:
8241
8688
  body["comment"] = comment
@@ -8259,6 +8706,7 @@ class ModelRegistryAPI:
8259
8706
 
8260
8707
  :returns: :class:`UpdateModelResponse`
8261
8708
  """
8709
+
8262
8710
  body = {}
8263
8711
  if description is not None:
8264
8712
  body["description"] = description
@@ -8286,6 +8734,7 @@ class ModelRegistryAPI:
8286
8734
 
8287
8735
  :returns: :class:`UpdateModelVersionResponse`
8288
8736
  """
8737
+
8289
8738
  body = {}
8290
8739
  if description is not None:
8291
8740
  body["description"] = description
@@ -8316,6 +8765,7 @@ class ModelRegistryAPI:
8316
8765
 
8317
8766
  :returns: :class:`RegisteredModelPermissions`
8318
8767
  """
8768
+
8319
8769
  body = {}
8320
8770
  if access_control_list is not None:
8321
8771
  body["access_control_list"] = [v.as_dict() for v in access_control_list]
@@ -8380,6 +8830,7 @@ class ModelRegistryAPI:
8380
8830
 
8381
8831
  :returns: :class:`UpdateWebhookResponse`
8382
8832
  """
8833
+
8383
8834
  body = {}
8384
8835
  if description is not None:
8385
8836
  body["description"] = description