databricks-sdk 0.63.0__py3-none-any.whl → 0.64.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.

@@ -45,7 +45,7 @@ class CleanRoom:
45
45
  using the separate CreateCleanRoomOutputCatalog API."""
46
46
 
47
47
  owner: Optional[str] = None
48
- """This is Databricks username of the owner of the local clean room securable for permission
48
+ """This is the Databricks username of the owner of the local clean room securable for permission
49
49
  management."""
50
50
 
51
51
  remote_detailed_info: Optional[CleanRoomRemoteDetail] = None
@@ -358,7 +358,7 @@ class CleanRoomAssetNotebook:
358
358
  """All existing approvals or rejections"""
359
359
 
360
360
  runner_collaborator_aliases: Optional[List[str]] = None
361
- """collaborators that can run the notebook"""
361
+ """Aliases of collaborators that can run the notebook."""
362
362
 
363
363
  def as_dict(self) -> dict:
364
364
  """Serializes the CleanRoomAssetNotebook into a dictionary suitable for use as a JSON request body."""
@@ -643,7 +643,7 @@ class CleanRoomCollaborator:
643
643
  It is not restricted to these values and could change in the future"""
644
644
 
645
645
  global_metastore_id: Optional[str] = None
646
- """The global Unity Catalog metastore id of the collaborator. The identifier is of format
646
+ """The global Unity Catalog metastore ID of the collaborator. The identifier is of format
647
647
  cloud:region:metastore-uuid."""
648
648
 
649
649
  invite_recipient_email: Optional[str] = None
@@ -413,6 +413,14 @@ class GenieConversationSummary:
413
413
  )
414
414
 
415
415
 
416
+ class GenieFeedbackRating(Enum):
417
+ """Feedback rating for Genie messages"""
418
+
419
+ NEGATIVE = "NEGATIVE"
420
+ NONE = "NONE"
421
+ POSITIVE = "POSITIVE"
422
+
423
+
416
424
  @dataclass
417
425
  class GenieGetMessageQueryResultResponse:
418
426
  statement_response: Optional[sql.StatementResponse] = None
@@ -439,6 +447,38 @@ class GenieGetMessageQueryResultResponse:
439
447
  return cls(statement_response=_from_dict(d, "statement_response", sql.StatementResponse))
440
448
 
441
449
 
450
+ @dataclass
451
+ class GenieListConversationMessagesResponse:
452
+ messages: Optional[List[GenieMessage]] = None
453
+ """List of messages in the conversation."""
454
+
455
+ next_page_token: Optional[str] = None
456
+ """The token to use for retrieving the next page of results."""
457
+
458
+ def as_dict(self) -> dict:
459
+ """Serializes the GenieListConversationMessagesResponse into a dictionary suitable for use as a JSON request body."""
460
+ body = {}
461
+ if self.messages:
462
+ body["messages"] = [v.as_dict() for v in self.messages]
463
+ if self.next_page_token is not None:
464
+ body["next_page_token"] = self.next_page_token
465
+ return body
466
+
467
+ def as_shallow_dict(self) -> dict:
468
+ """Serializes the GenieListConversationMessagesResponse into a shallow dictionary of its immediate attributes."""
469
+ body = {}
470
+ if self.messages:
471
+ body["messages"] = self.messages
472
+ if self.next_page_token is not None:
473
+ body["next_page_token"] = self.next_page_token
474
+ return body
475
+
476
+ @classmethod
477
+ def from_dict(cls, d: Dict[str, Any]) -> GenieListConversationMessagesResponse:
478
+ """Deserializes the GenieListConversationMessagesResponse from a dictionary."""
479
+ return cls(messages=_repeated_dict(d, "messages", GenieMessage), next_page_token=d.get("next_page_token", None))
480
+
481
+
442
482
  @dataclass
443
483
  class GenieListConversationsResponse:
444
484
  conversations: Optional[List[GenieConversationSummary]] = None
@@ -1630,6 +1670,29 @@ class GenieAPI:
1630
1670
 
1631
1671
  self._api.do("DELETE", f"/api/2.0/genie/spaces/{space_id}/conversations/{conversation_id}", headers=headers)
1632
1672
 
1673
+ def delete_conversation_message(self, space_id: str, conversation_id: str, message_id: str):
1674
+ """Delete a conversation message.
1675
+
1676
+ :param space_id: str
1677
+ The ID associated with the Genie space where the message is located.
1678
+ :param conversation_id: str
1679
+ The ID associated with the conversation.
1680
+ :param message_id: str
1681
+ The ID associated with the message to delete.
1682
+
1683
+
1684
+ """
1685
+
1686
+ headers = {
1687
+ "Accept": "application/json",
1688
+ }
1689
+
1690
+ self._api.do(
1691
+ "DELETE",
1692
+ f"/api/2.0/genie/spaces/{space_id}/conversations/{conversation_id}/messages/{message_id}",
1693
+ headers=headers,
1694
+ )
1695
+
1633
1696
  def execute_message_attachment_query(
1634
1697
  self, space_id: str, conversation_id: str, message_id: str, attachment_id: str
1635
1698
  ) -> GenieGetMessageQueryResultResponse:
@@ -1662,7 +1725,8 @@ class GenieAPI:
1662
1725
  def execute_message_query(
1663
1726
  self, space_id: str, conversation_id: str, message_id: str
1664
1727
  ) -> GenieGetMessageQueryResultResponse:
1665
- """Execute the SQL query in the message.
1728
+ """DEPRECATED: Use [Execute Message Attachment Query](:method:genie/executemessageattachmentquery)
1729
+ instead.
1666
1730
 
1667
1731
  :param space_id: str
1668
1732
  Genie space ID
@@ -1741,8 +1805,8 @@ class GenieAPI:
1741
1805
  def get_message_query_result(
1742
1806
  self, space_id: str, conversation_id: str, message_id: str
1743
1807
  ) -> GenieGetMessageQueryResultResponse:
1744
- """Get the result of SQL query if the message has a query attachment. This is only available if a message
1745
- has a query attachment and the message status is `EXECUTING_QUERY`.
1808
+ """DEPRECATED: Use [Get Message Attachment Query Result](:method:genie/getmessageattachmentqueryresult)
1809
+ instead.
1746
1810
 
1747
1811
  :param space_id: str
1748
1812
  Genie space ID
@@ -1768,8 +1832,8 @@ class GenieAPI:
1768
1832
  def get_message_query_result_by_attachment(
1769
1833
  self, space_id: str, conversation_id: str, message_id: str, attachment_id: str
1770
1834
  ) -> GenieGetMessageQueryResultResponse:
1771
- """Get the result of SQL query if the message has a query attachment. This is only available if a message
1772
- has a query attachment and the message status is `EXECUTING_QUERY` OR `COMPLETED`.
1835
+ """DEPRECATED: Use [Get Message Attachment Query Result](:method:genie/getmessageattachmentqueryresult)
1836
+ instead.
1773
1837
 
1774
1838
  :param space_id: str
1775
1839
  Genie space ID
@@ -1810,13 +1874,55 @@ class GenieAPI:
1810
1874
  res = self._api.do("GET", f"/api/2.0/genie/spaces/{space_id}", headers=headers)
1811
1875
  return GenieSpace.from_dict(res)
1812
1876
 
1877
+ def list_conversation_messages(
1878
+ self, space_id: str, conversation_id: str, *, page_size: Optional[int] = None, page_token: Optional[str] = None
1879
+ ) -> GenieListConversationMessagesResponse:
1880
+ """List messages in a conversation
1881
+
1882
+ :param space_id: str
1883
+ The ID associated with the Genie space where the conversation is located
1884
+ :param conversation_id: str
1885
+ The ID of the conversation to list messages from
1886
+ :param page_size: int (optional)
1887
+ Maximum number of messages to return per page
1888
+ :param page_token: str (optional)
1889
+ Token to get the next page of results
1890
+
1891
+ :returns: :class:`GenieListConversationMessagesResponse`
1892
+ """
1893
+
1894
+ query = {}
1895
+ if page_size is not None:
1896
+ query["page_size"] = page_size
1897
+ if page_token is not None:
1898
+ query["page_token"] = page_token
1899
+ headers = {
1900
+ "Accept": "application/json",
1901
+ }
1902
+
1903
+ res = self._api.do(
1904
+ "GET",
1905
+ f"/api/2.0/genie/spaces/{space_id}/conversations/{conversation_id}/messages",
1906
+ query=query,
1907
+ headers=headers,
1908
+ )
1909
+ return GenieListConversationMessagesResponse.from_dict(res)
1910
+
1813
1911
  def list_conversations(
1814
- self, space_id: str, *, page_size: Optional[int] = None, page_token: Optional[str] = None
1912
+ self,
1913
+ space_id: str,
1914
+ *,
1915
+ include_all: Optional[bool] = None,
1916
+ page_size: Optional[int] = None,
1917
+ page_token: Optional[str] = None,
1815
1918
  ) -> GenieListConversationsResponse:
1816
1919
  """Get a list of conversations in a Genie Space.
1817
1920
 
1818
1921
  :param space_id: str
1819
1922
  The ID of the Genie space to retrieve conversations from.
1923
+ :param include_all: bool (optional)
1924
+ Include all conversations in the space across all users. Requires "Can Manage" permission on the
1925
+ space.
1820
1926
  :param page_size: int (optional)
1821
1927
  Maximum number of conversations to return per page
1822
1928
  :param page_token: str (optional)
@@ -1826,6 +1932,8 @@ class GenieAPI:
1826
1932
  """
1827
1933
 
1828
1934
  query = {}
1935
+ if include_all is not None:
1936
+ query["include_all"] = include_all
1829
1937
  if page_size is not None:
1830
1938
  query["page_size"] = page_size
1831
1939
  if page_token is not None:
@@ -1862,6 +1970,47 @@ class GenieAPI:
1862
1970
  res = self._api.do("GET", "/api/2.0/genie/spaces", query=query, headers=headers)
1863
1971
  return GenieListSpacesResponse.from_dict(res)
1864
1972
 
1973
+ def send_message_feedback(
1974
+ self,
1975
+ space_id: str,
1976
+ conversation_id: str,
1977
+ message_id: str,
1978
+ feedback_rating: GenieFeedbackRating,
1979
+ *,
1980
+ feedback_text: Optional[str] = None,
1981
+ ):
1982
+ """Send feedback for a message.
1983
+
1984
+ :param space_id: str
1985
+ The ID associated with the Genie space where the message is located.
1986
+ :param conversation_id: str
1987
+ The ID associated with the conversation.
1988
+ :param message_id: str
1989
+ The ID associated with the message to provide feedback for.
1990
+ :param feedback_rating: :class:`GenieFeedbackRating`
1991
+ The rating (POSITIVE, NEGATIVE, or NONE).
1992
+ :param feedback_text: str (optional)
1993
+ Optional text feedback that will be stored as a comment.
1994
+
1995
+
1996
+ """
1997
+ body = {}
1998
+ if feedback_rating is not None:
1999
+ body["feedback_rating"] = feedback_rating.value
2000
+ if feedback_text is not None:
2001
+ body["feedback_text"] = feedback_text
2002
+ headers = {
2003
+ "Accept": "application/json",
2004
+ "Content-Type": "application/json",
2005
+ }
2006
+
2007
+ self._api.do(
2008
+ "POST",
2009
+ f"/api/2.0/genie/spaces/{space_id}/conversations/{conversation_id}/messages/{message_id}/feedback",
2010
+ body=body,
2011
+ headers=headers,
2012
+ )
2013
+
1865
2014
  def start_conversation(self, space_id: str, content: str) -> Wait[GenieMessage]:
1866
2015
  """Start a new conversation.
1867
2016
 
@@ -42,6 +42,9 @@ class BaseJob:
42
42
  Jobs UI in the job details page and Jobs API using `budget_policy_id` 3. Inferred default based
43
43
  on accessible budget policies of the run_as identity on job creation or modification."""
44
44
 
45
+ effective_usage_policy_id: Optional[str] = None
46
+ """The id of the usage policy used by this job for cost attribution purposes."""
47
+
45
48
  has_more: Optional[bool] = None
46
49
  """Indicates if the job has more array properties (`tasks`, `job_clusters`) that are not shown.
47
50
  They can be accessed via :method:jobs/get endpoint. It is only relevant for API 2.2
@@ -66,6 +69,8 @@ class BaseJob:
66
69
  body["creator_user_name"] = self.creator_user_name
67
70
  if self.effective_budget_policy_id is not None:
68
71
  body["effective_budget_policy_id"] = self.effective_budget_policy_id
72
+ if self.effective_usage_policy_id is not None:
73
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
69
74
  if self.has_more is not None:
70
75
  body["has_more"] = self.has_more
71
76
  if self.job_id is not None:
@@ -85,6 +90,8 @@ class BaseJob:
85
90
  body["creator_user_name"] = self.creator_user_name
86
91
  if self.effective_budget_policy_id is not None:
87
92
  body["effective_budget_policy_id"] = self.effective_budget_policy_id
93
+ if self.effective_usage_policy_id is not None:
94
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
88
95
  if self.has_more is not None:
89
96
  body["has_more"] = self.has_more
90
97
  if self.job_id is not None:
@@ -102,6 +109,7 @@ class BaseJob:
102
109
  created_time=d.get("created_time", None),
103
110
  creator_user_name=d.get("creator_user_name", None),
104
111
  effective_budget_policy_id=d.get("effective_budget_policy_id", None),
112
+ effective_usage_policy_id=d.get("effective_usage_policy_id", None),
105
113
  has_more=d.get("has_more", None),
106
114
  job_id=d.get("job_id", None),
107
115
  settings=_from_dict(d, "settings", JobSettings),
@@ -147,6 +155,9 @@ class BaseRun:
147
155
  `PERFORMANCE_OPTIMIZED`: Prioritizes fast startup and execution times through rapid scaling and
148
156
  optimized cluster performance."""
149
157
 
158
+ effective_usage_policy_id: Optional[str] = None
159
+ """The id of the usage policy used by this run for cost attribution purposes."""
160
+
150
161
  end_time: Optional[int] = None
151
162
  """The time at which this run ended in epoch milliseconds (milliseconds since 1/1/1970 UTC). This
152
163
  field is set to 0 if the job is still running."""
@@ -267,6 +278,8 @@ class BaseRun:
267
278
  body["description"] = self.description
268
279
  if self.effective_performance_target is not None:
269
280
  body["effective_performance_target"] = self.effective_performance_target.value
281
+ if self.effective_usage_policy_id is not None:
282
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
270
283
  if self.end_time is not None:
271
284
  body["end_time"] = self.end_time
272
285
  if self.execution_duration is not None:
@@ -338,6 +351,8 @@ class BaseRun:
338
351
  body["description"] = self.description
339
352
  if self.effective_performance_target is not None:
340
353
  body["effective_performance_target"] = self.effective_performance_target
354
+ if self.effective_usage_policy_id is not None:
355
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
341
356
  if self.end_time is not None:
342
357
  body["end_time"] = self.end_time
343
358
  if self.execution_duration is not None:
@@ -403,6 +418,7 @@ class BaseRun:
403
418
  creator_user_name=d.get("creator_user_name", None),
404
419
  description=d.get("description", None),
405
420
  effective_performance_target=_enum(d, "effective_performance_target", PerformanceTarget),
421
+ effective_usage_policy_id=d.get("effective_usage_policy_id", None),
406
422
  end_time=d.get("end_time", None),
407
423
  execution_duration=d.get("execution_duration", None),
408
424
  git_source=_from_dict(d, "git_source", GitSource),
@@ -2212,6 +2228,9 @@ class Job:
2212
2228
  Jobs UI in the job details page and Jobs API using `budget_policy_id` 3. Inferred default based
2213
2229
  on accessible budget policies of the run_as identity on job creation or modification."""
2214
2230
 
2231
+ effective_usage_policy_id: Optional[str] = None
2232
+ """The id of the usage policy used by this job for cost attribution purposes."""
2233
+
2215
2234
  has_more: Optional[bool] = None
2216
2235
  """Indicates if the job has more array properties (`tasks`, `job_clusters`) that are not shown.
2217
2236
  They can be accessed via :method:jobs/get endpoint. It is only relevant for API 2.2
@@ -2248,6 +2267,8 @@ class Job:
2248
2267
  body["creator_user_name"] = self.creator_user_name
2249
2268
  if self.effective_budget_policy_id is not None:
2250
2269
  body["effective_budget_policy_id"] = self.effective_budget_policy_id
2270
+ if self.effective_usage_policy_id is not None:
2271
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
2251
2272
  if self.has_more is not None:
2252
2273
  body["has_more"] = self.has_more
2253
2274
  if self.job_id is not None:
@@ -2271,6 +2292,8 @@ class Job:
2271
2292
  body["creator_user_name"] = self.creator_user_name
2272
2293
  if self.effective_budget_policy_id is not None:
2273
2294
  body["effective_budget_policy_id"] = self.effective_budget_policy_id
2295
+ if self.effective_usage_policy_id is not None:
2296
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
2274
2297
  if self.has_more is not None:
2275
2298
  body["has_more"] = self.has_more
2276
2299
  if self.job_id is not None:
@@ -2292,6 +2315,7 @@ class Job:
2292
2315
  created_time=d.get("created_time", None),
2293
2316
  creator_user_name=d.get("creator_user_name", None),
2294
2317
  effective_budget_policy_id=d.get("effective_budget_policy_id", None),
2318
+ effective_usage_policy_id=d.get("effective_usage_policy_id", None),
2295
2319
  has_more=d.get("has_more", None),
2296
2320
  job_id=d.get("job_id", None),
2297
2321
  next_page_token=d.get("next_page_token", None),
@@ -3039,8 +3063,8 @@ class JobSettings:
3039
3063
 
3040
3064
  usage_policy_id: Optional[str] = None
3041
3065
  """The id of the user specified usage policy to use for this job. If not specified, a default usage
3042
- policy may be applied when creating or modifying the job. See `effective_budget_policy_id` for
3043
- the budget policy used by this workload."""
3066
+ policy may be applied when creating or modifying the job. See `effective_usage_policy_id` for
3067
+ the usage policy used by this workload."""
3044
3068
 
3045
3069
  webhook_notifications: Optional[WebhookNotifications] = None
3046
3070
  """A collection of system notification IDs to notify when runs of this job begin or complete."""
@@ -4509,6 +4533,9 @@ class Run:
4509
4533
  `PERFORMANCE_OPTIMIZED`: Prioritizes fast startup and execution times through rapid scaling and
4510
4534
  optimized cluster performance."""
4511
4535
 
4536
+ effective_usage_policy_id: Optional[str] = None
4537
+ """The id of the usage policy used by this run for cost attribution purposes."""
4538
+
4512
4539
  end_time: Optional[int] = None
4513
4540
  """The time at which this run ended in epoch milliseconds (milliseconds since 1/1/1970 UTC). This
4514
4541
  field is set to 0 if the job is still running."""
@@ -4635,6 +4662,8 @@ class Run:
4635
4662
  body["description"] = self.description
4636
4663
  if self.effective_performance_target is not None:
4637
4664
  body["effective_performance_target"] = self.effective_performance_target.value
4665
+ if self.effective_usage_policy_id is not None:
4666
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
4638
4667
  if self.end_time is not None:
4639
4668
  body["end_time"] = self.end_time
4640
4669
  if self.execution_duration is not None:
@@ -4710,6 +4739,8 @@ class Run:
4710
4739
  body["description"] = self.description
4711
4740
  if self.effective_performance_target is not None:
4712
4741
  body["effective_performance_target"] = self.effective_performance_target
4742
+ if self.effective_usage_policy_id is not None:
4743
+ body["effective_usage_policy_id"] = self.effective_usage_policy_id
4713
4744
  if self.end_time is not None:
4714
4745
  body["end_time"] = self.end_time
4715
4746
  if self.execution_duration is not None:
@@ -4779,6 +4810,7 @@ class Run:
4779
4810
  creator_user_name=d.get("creator_user_name", None),
4780
4811
  description=d.get("description", None),
4781
4812
  effective_performance_target=_enum(d, "effective_performance_target", PerformanceTarget),
4813
+ effective_usage_policy_id=d.get("effective_usage_policy_id", None),
4782
4814
  end_time=d.get("end_time", None),
4783
4815
  execution_duration=d.get("execution_duration", None),
4784
4816
  git_source=_from_dict(d, "git_source", GitSource),
@@ -8546,8 +8578,8 @@ class JobsAPI:
8546
8578
  `runNow`.
8547
8579
  :param usage_policy_id: str (optional)
8548
8580
  The id of the user specified usage policy to use for this job. If not specified, a default usage
8549
- policy may be applied when creating or modifying the job. See `effective_budget_policy_id` for the
8550
- budget policy used by this workload.
8581
+ policy may be applied when creating or modifying the job. See `effective_usage_policy_id` for the
8582
+ usage policy used by this workload.
8551
8583
  :param webhook_notifications: :class:`WebhookNotifications` (optional)
8552
8584
  A collection of system notification IDs to notify when runs of this job begin or complete.
8553
8585
 
@@ -314,6 +314,9 @@ class AiGatewayRateLimit:
314
314
  """Principal field for a user, user group, or service principal to apply rate limiting to. Accepts
315
315
  a user email, group name, or service principal application ID."""
316
316
 
317
+ tokens: Optional[int] = None
318
+ """Used to specify how many tokens are allowed for a key within the renewal_period."""
319
+
317
320
  def as_dict(self) -> dict:
318
321
  """Serializes the AiGatewayRateLimit into a dictionary suitable for use as a JSON request body."""
319
322
  body = {}
@@ -325,6 +328,8 @@ class AiGatewayRateLimit:
325
328
  body["principal"] = self.principal
326
329
  if self.renewal_period is not None:
327
330
  body["renewal_period"] = self.renewal_period.value
331
+ if self.tokens is not None:
332
+ body["tokens"] = self.tokens
328
333
  return body
329
334
 
330
335
  def as_shallow_dict(self) -> dict:
@@ -338,6 +343,8 @@ class AiGatewayRateLimit:
338
343
  body["principal"] = self.principal
339
344
  if self.renewal_period is not None:
340
345
  body["renewal_period"] = self.renewal_period
346
+ if self.tokens is not None:
347
+ body["tokens"] = self.tokens
341
348
  return body
342
349
 
343
350
  @classmethod
@@ -348,6 +355,7 @@ class AiGatewayRateLimit:
348
355
  key=_enum(d, "key", AiGatewayRateLimitKey),
349
356
  principal=d.get("principal", None),
350
357
  renewal_period=_enum(d, "renewal_period", AiGatewayRateLimitRenewalPeriod),
358
+ tokens=d.get("tokens", None),
351
359
  )
352
360
 
353
361
 
@@ -3374,6 +3382,9 @@ class ServingEndpoint:
3374
3382
  task: Optional[str] = None
3375
3383
  """The task type of the serving endpoint."""
3376
3384
 
3385
+ usage_policy_id: Optional[str] = None
3386
+ """The usage policy associated with serving endpoint."""
3387
+
3377
3388
  def as_dict(self) -> dict:
3378
3389
  """Serializes the ServingEndpoint into a dictionary suitable for use as a JSON request body."""
3379
3390
  body = {}
@@ -3401,6 +3412,8 @@ class ServingEndpoint:
3401
3412
  body["tags"] = [v.as_dict() for v in self.tags]
3402
3413
  if self.task is not None:
3403
3414
  body["task"] = self.task
3415
+ if self.usage_policy_id is not None:
3416
+ body["usage_policy_id"] = self.usage_policy_id
3404
3417
  return body
3405
3418
 
3406
3419
  def as_shallow_dict(self) -> dict:
@@ -3430,6 +3443,8 @@ class ServingEndpoint:
3430
3443
  body["tags"] = self.tags
3431
3444
  if self.task is not None:
3432
3445
  body["task"] = self.task
3446
+ if self.usage_policy_id is not None:
3447
+ body["usage_policy_id"] = self.usage_policy_id
3433
3448
  return body
3434
3449
 
3435
3450
  @classmethod
@@ -3448,6 +3463,7 @@ class ServingEndpoint:
3448
3463
  state=_from_dict(d, "state", EndpointState),
3449
3464
  tags=_repeated_dict(d, "tags", EndpointTag),
3450
3465
  task=d.get("task", None),
3466
+ usage_policy_id=d.get("usage_policy_id", None),
3451
3467
  )
3452
3468
 
3453
3469