hushscript 1.0.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.
Files changed (187) hide show
  1. hushscript/__init__.py +97 -0
  2. hushscript/_client.py +687 -0
  3. hushscript/_clock.py +36 -0
  4. hushscript/_config.py +139 -0
  5. hushscript/_errors.py +563 -0
  6. hushscript/_guard.py +61 -0
  7. hushscript/_http.py +624 -0
  8. hushscript/_json.py +55 -0
  9. hushscript/_log.py +155 -0
  10. hushscript/_models.py +144 -0
  11. hushscript/_pacing.py +51 -0
  12. hushscript/_redact.py +140 -0
  13. hushscript/_response.py +67 -0
  14. hushscript/_retry.py +205 -0
  15. hushscript/_shape.py +197 -0
  16. hushscript/_shapes.py +248 -0
  17. hushscript/_version.py +1 -0
  18. hushscript/format.py +224 -0
  19. hushscript/generated/__init__.py +8 -0
  20. hushscript/generated/api/__init__.py +1 -0
  21. hushscript/generated/api/default/__init__.py +1 -0
  22. hushscript/generated/api/default/buy_minutes.py +248 -0
  23. hushscript/generated/api/default/claim_agent_account.py +238 -0
  24. hushscript/generated/api/default/complete_upload.py +238 -0
  25. hushscript/generated/api/default/create_agent_account_signup.py +261 -0
  26. hushscript/generated/api/default/create_setup_session.py +244 -0
  27. hushscript/generated/api/default/create_upload.py +225 -0
  28. hushscript/generated/api/default/get_account.py +169 -0
  29. hushscript/generated/api/default/get_job.py +198 -0
  30. hushscript/generated/api/default/get_org.py +169 -0
  31. hushscript/generated/api/default/get_transcript.py +226 -0
  32. hushscript/generated/api/default/get_transcription_context.py +173 -0
  33. hushscript/generated/api/default/get_upload_part_urls.py +246 -0
  34. hushscript/generated/api/default/heartbeat_upload.py +197 -0
  35. hushscript/generated/api/default/lift_transcript_hold.py +206 -0
  36. hushscript/generated/api/default/list_credit_ledger.py +229 -0
  37. hushscript/generated/api/default/list_deleted_transcripts.py +237 -0
  38. hushscript/generated/api/default/list_holds.py +233 -0
  39. hushscript/generated/api/default/list_jobs.py +249 -0
  40. hushscript/generated/api/default/list_org_audit.py +221 -0
  41. hushscript/generated/api/default/list_org_invoices.py +221 -0
  42. hushscript/generated/api/default/list_org_ledger.py +221 -0
  43. hushscript/generated/api/default/list_org_matters.py +247 -0
  44. hushscript/generated/api/default/list_org_members.py +221 -0
  45. hushscript/generated/api/default/list_org_transcripts.py +233 -0
  46. hushscript/generated/api/default/list_packs.py +169 -0
  47. hushscript/generated/api/default/list_saved_cards.py +169 -0
  48. hushscript/generated/api/default/list_transactions.py +225 -0
  49. hushscript/generated/api/default/list_transcripts.py +225 -0
  50. hushscript/generated/api/default/org_audit_csv.py +163 -0
  51. hushscript/generated/api/default/org_ledger_csv.py +163 -0
  52. hushscript/generated/api/default/org_usage_report.py +247 -0
  53. hushscript/generated/api/default/org_usage_report_csv.py +229 -0
  54. hushscript/generated/api/default/patch_org_member.py +237 -0
  55. hushscript/generated/api/default/place_transcript_hold.py +206 -0
  56. hushscript/generated/api/default/rotate_agent_credentials.py +177 -0
  57. hushscript/generated/api/default/schedule_org_custody.py +215 -0
  58. hushscript/generated/api/default/set_default_card.py +223 -0
  59. hushscript/generated/api/default/upload_part.py +249 -0
  60. hushscript/generated/catalog.py +138 -0
  61. hushscript/generated/client.py +282 -0
  62. hushscript/generated/errors.py +16 -0
  63. hushscript/generated/hints.py +28 -0
  64. hushscript/generated/models/__init__.py +193 -0
  65. hushscript/generated/models/account_response.py +114 -0
  66. hushscript/generated/models/active_hold.py +88 -0
  67. hushscript/generated/models/active_hold_kind.py +18 -0
  68. hushscript/generated/models/agent_claim_request.py +61 -0
  69. hushscript/generated/models/agent_claim_response.py +85 -0
  70. hushscript/generated/models/agent_credentials_rotate_response.py +101 -0
  71. hushscript/generated/models/agent_signup_request.py +118 -0
  72. hushscript/generated/models/agent_signup_request_agent.py +80 -0
  73. hushscript/generated/models/agent_signup_response.py +111 -0
  74. hushscript/generated/models/buy_minutes_body.py +89 -0
  75. hushscript/generated/models/card.py +132 -0
  76. hushscript/generated/models/cards_response.py +90 -0
  77. hushscript/generated/models/complete_upload_body.py +107 -0
  78. hushscript/generated/models/complete_upload_body_parts_type_0_item.py +69 -0
  79. hushscript/generated/models/context_dictionary.py +143 -0
  80. hushscript/generated/models/context_prompt_preset.py +118 -0
  81. hushscript/generated/models/create_setup_session_body.py +62 -0
  82. hushscript/generated/models/create_upload_body.py +254 -0
  83. hushscript/generated/models/create_upload_body_transcription_options_type_0.py +178 -0
  84. hushscript/generated/models/credit_ledger_entry.py +113 -0
  85. hushscript/generated/models/credit_ledger_response.py +90 -0
  86. hushscript/generated/models/deleted_transcript.py +148 -0
  87. hushscript/generated/models/deleted_transcript_cause.py +18 -0
  88. hushscript/generated/models/deleted_transcript_receipt_type_0.py +107 -0
  89. hushscript/generated/models/deleted_transcript_receipt_type_0_items_item.py +69 -0
  90. hushscript/generated/models/deleted_transcripts_response.py +90 -0
  91. hushscript/generated/models/dictionary_entry.py +123 -0
  92. hushscript/generated/models/dictionary_entry_category.py +37 -0
  93. hushscript/generated/models/error.py +155 -0
  94. hushscript/generated/models/error_details.py +94 -0
  95. hushscript/generated/models/get_upload_part_urls_response_200_type_0.py +108 -0
  96. hushscript/generated/models/heartbeat_upload_response_200.py +61 -0
  97. hushscript/generated/models/holds_response.py +90 -0
  98. hushscript/generated/models/job.py +309 -0
  99. hushscript/generated/models/job_failure_kind_type_1.py +16 -0
  100. hushscript/generated/models/job_failure_kind_type_2_type_1.py +16 -0
  101. hushscript/generated/models/job_failure_kind_type_3_type_1.py +16 -0
  102. hushscript/generated/models/job_list.py +90 -0
  103. hushscript/generated/models/lift_transcript_hold_response_200.py +61 -0
  104. hushscript/generated/models/list_jobs_active.py +17 -0
  105. hushscript/generated/models/list_org_matters_status.py +16 -0
  106. hushscript/generated/models/options_summary.py +135 -0
  107. hushscript/generated/models/org_audit_entry.py +105 -0
  108. hushscript/generated/models/org_audit_response.py +90 -0
  109. hushscript/generated/models/org_invoice.py +175 -0
  110. hushscript/generated/models/org_invoices_response.py +90 -0
  111. hushscript/generated/models/org_ledger_entry.py +155 -0
  112. hushscript/generated/models/org_ledger_response.py +90 -0
  113. hushscript/generated/models/org_matter.py +79 -0
  114. hushscript/generated/models/org_matter_status.py +16 -0
  115. hushscript/generated/models/org_matters_response.py +75 -0
  116. hushscript/generated/models/org_member.py +123 -0
  117. hushscript/generated/models/org_members_response.py +90 -0
  118. hushscript/generated/models/org_summary_response.py +482 -0
  119. hushscript/generated/models/org_transcript.py +103 -0
  120. hushscript/generated/models/org_transcripts_response.py +90 -0
  121. hushscript/generated/models/org_usage_report_csv_group_by.py +17 -0
  122. hushscript/generated/models/org_usage_report_group_by.py +17 -0
  123. hushscript/generated/models/org_usage_response.py +112 -0
  124. hushscript/generated/models/org_usage_response_group_by.py +17 -0
  125. hushscript/generated/models/org_usage_row.py +86 -0
  126. hushscript/generated/models/pack.py +107 -0
  127. hushscript/generated/models/packs_response.py +75 -0
  128. hushscript/generated/models/patch_org_member_body.py +102 -0
  129. hushscript/generated/models/patch_org_member_response_200.py +61 -0
  130. hushscript/generated/models/place_transcript_hold_response_200.py +61 -0
  131. hushscript/generated/models/presigned_part_url.py +69 -0
  132. hushscript/generated/models/purchase_response.py +76 -0
  133. hushscript/generated/models/schedule_org_custody_body.py +66 -0
  134. hushscript/generated/models/schedule_org_custody_body_custody.py +17 -0
  135. hushscript/generated/models/schedule_org_custody_response_200.py +69 -0
  136. hushscript/generated/models/set_default_card_body.py +61 -0
  137. hushscript/generated/models/set_default_card_response_200.py +61 -0
  138. hushscript/generated/models/setup_session_response.py +77 -0
  139. hushscript/generated/models/transaction.py +183 -0
  140. hushscript/generated/models/transactions_response.py +98 -0
  141. hushscript/generated/models/transcript_detail.py +194 -0
  142. hushscript/generated/models/transcript_detail_speaker_names.py +47 -0
  143. hushscript/generated/models/transcript_envelope.py +89 -0
  144. hushscript/generated/models/transcript_envelope_translations.py +62 -0
  145. hushscript/generated/models/transcript_language.py +75 -0
  146. hushscript/generated/models/transcript_list.py +90 -0
  147. hushscript/generated/models/transcript_list_row.py +152 -0
  148. hushscript/generated/models/transcript_list_row_insights_state.py +20 -0
  149. hushscript/generated/models/transcription_context_response.py +95 -0
  150. hushscript/generated/models/upload_complete_response.py +100 -0
  151. hushscript/generated/models/upload_create_response.py +148 -0
  152. hushscript/generated/models/upload_create_response_funding.py +16 -0
  153. hushscript/generated/models/upload_create_response_upload_type_0.py +108 -0
  154. hushscript/generated/models/upload_limits.py +86 -0
  155. hushscript/generated/models/upload_part_response_200.py +69 -0
  156. hushscript/generated/models/utterance.py +85 -0
  157. hushscript/generated/scopes.py +42 -0
  158. hushscript/generated/types.py +54 -0
  159. hushscript/money.py +79 -0
  160. hushscript/paginate.py +78 -0
  161. hushscript/py.typed +0 -0
  162. hushscript/resources/__init__.py +1 -0
  163. hushscript/resources/_params.py +33 -0
  164. hushscript/resources/account.py +121 -0
  165. hushscript/resources/agent.py +421 -0
  166. hushscript/resources/billing.py +567 -0
  167. hushscript/resources/jobs.py +105 -0
  168. hushscript/resources/transcripts.py +209 -0
  169. hushscript/transcribe/__init__.py +1 -0
  170. hushscript/transcribe/apipeline.py +234 -0
  171. hushscript/transcribe/aupload.py +197 -0
  172. hushscript/transcribe/heartbeat.py +78 -0
  173. hushscript/transcribe/pipeline.py +312 -0
  174. hushscript/transcribe/preflight.py +272 -0
  175. hushscript/transcribe/probe.py +185 -0
  176. hushscript/transcribe/resume.py +115 -0
  177. hushscript/transcribe/segment.py +23 -0
  178. hushscript/transcribe/session.py +34 -0
  179. hushscript/transcribe/sniff.py +30 -0
  180. hushscript/transcribe/source.py +218 -0
  181. hushscript/transcribe/upload.py +498 -0
  182. hushscript/transcribe/wait.py +124 -0
  183. hushscript/transcript.py +197 -0
  184. hushscript-1.0.0.dist-info/METADATA +502 -0
  185. hushscript-1.0.0.dist-info/RECORD +187 -0
  186. hushscript-1.0.0.dist-info/WHEEL +4 -0
  187. hushscript-1.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,237 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ... import errors
8
+ from ...client import AuthenticatedClient, Client
9
+ from ...models.error import Error
10
+ from ...models.patch_org_member_body import PatchOrgMemberBody
11
+ from ...models.patch_org_member_response_200 import PatchOrgMemberResponse200
12
+ from ...types import Response
13
+
14
+
15
+ def _get_kwargs(
16
+ user_id: str,
17
+ *,
18
+ body: PatchOrgMemberBody,
19
+ ) -> dict[str, Any]:
20
+ headers: dict[str, Any] = {}
21
+
22
+ _kwargs: dict[str, Any] = {
23
+ "method": "patch",
24
+ "url": "/v1/org/members/{user_id}".format(
25
+ user_id=quote(str(user_id), safe=""),
26
+ ),
27
+ }
28
+
29
+ _kwargs["json"] = body.to_dict()
30
+
31
+ headers["Content-Type"] = "application/json"
32
+
33
+ _kwargs["headers"] = headers
34
+ return _kwargs
35
+
36
+
37
+ def _parse_response(
38
+ *, client: AuthenticatedClient | Client, response: httpx.Response
39
+ ) -> Error | PatchOrgMemberResponse200 | None:
40
+ if response.status_code == 200:
41
+ response_200 = PatchOrgMemberResponse200.from_dict(response.json())
42
+
43
+ return response_200
44
+
45
+ if response.status_code == 400:
46
+ response_400 = Error.from_dict(response.json())
47
+
48
+ return response_400
49
+
50
+ if response.status_code == 401:
51
+ response_401 = Error.from_dict(response.json())
52
+
53
+ return response_401
54
+
55
+ if response.status_code == 403:
56
+ response_403 = Error.from_dict(response.json())
57
+
58
+ return response_403
59
+
60
+ if response.status_code == 404:
61
+ response_404 = Error.from_dict(response.json())
62
+
63
+ return response_404
64
+
65
+ if response.status_code == 409:
66
+ response_409 = Error.from_dict(response.json())
67
+
68
+ return response_409
69
+
70
+ if response.status_code == 422:
71
+ response_422 = Error.from_dict(response.json())
72
+
73
+ return response_422
74
+
75
+ if response.status_code == 429:
76
+ response_429 = Error.from_dict(response.json())
77
+
78
+ return response_429
79
+
80
+ if response.status_code == 500:
81
+ response_500 = Error.from_dict(response.json())
82
+
83
+ return response_500
84
+
85
+ if client.raise_on_unexpected_status:
86
+ raise errors.UnexpectedStatus(response.status_code, response.content)
87
+ else:
88
+ return None
89
+
90
+
91
+ def _build_response(
92
+ *, client: AuthenticatedClient | Client, response: httpx.Response
93
+ ) -> Response[Error | PatchOrgMemberResponse200]:
94
+ return Response(
95
+ status_code=HTTPStatus(response.status_code),
96
+ content=response.content,
97
+ headers=response.headers,
98
+ parsed=_parse_response(client=client, response=response),
99
+ )
100
+
101
+
102
+ def sync_detailed(
103
+ user_id: str,
104
+ *,
105
+ client: AuthenticatedClient,
106
+ body: PatchOrgMemberBody,
107
+ ) -> Response[Error | PatchOrgMemberResponse200]:
108
+ """Change a workspace member's rights or cap
109
+
110
+ Admin only. Sets any subset of the member's is_admin, is_billing and is_reviewer rights, and their
111
+ per-member monthly cap in seconds. At least one field must be present. Demoting the workspace's last
112
+ remaining admin is refused, evaluated inside the same atomic update so two concurrent demotions
113
+ cannot both succeed and strand the workspace with no admin.
114
+
115
+ Args:
116
+ user_id (str):
117
+ body (PatchOrgMemberBody):
118
+
119
+ Raises:
120
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
121
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
122
+
123
+ Returns:
124
+ Response[Error | PatchOrgMemberResponse200]
125
+ """
126
+
127
+ kwargs = _get_kwargs(
128
+ user_id=user_id,
129
+ body=body,
130
+ )
131
+
132
+ response = client.get_httpx_client().request(
133
+ **kwargs,
134
+ )
135
+
136
+ return _build_response(client=client, response=response)
137
+
138
+
139
+ def sync(
140
+ user_id: str,
141
+ *,
142
+ client: AuthenticatedClient,
143
+ body: PatchOrgMemberBody,
144
+ ) -> Error | PatchOrgMemberResponse200 | None:
145
+ """Change a workspace member's rights or cap
146
+
147
+ Admin only. Sets any subset of the member's is_admin, is_billing and is_reviewer rights, and their
148
+ per-member monthly cap in seconds. At least one field must be present. Demoting the workspace's last
149
+ remaining admin is refused, evaluated inside the same atomic update so two concurrent demotions
150
+ cannot both succeed and strand the workspace with no admin.
151
+
152
+ Args:
153
+ user_id (str):
154
+ body (PatchOrgMemberBody):
155
+
156
+ Raises:
157
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
158
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
159
+
160
+ Returns:
161
+ Error | PatchOrgMemberResponse200
162
+ """
163
+
164
+ return sync_detailed(
165
+ user_id=user_id,
166
+ client=client,
167
+ body=body,
168
+ ).parsed
169
+
170
+
171
+ async def asyncio_detailed(
172
+ user_id: str,
173
+ *,
174
+ client: AuthenticatedClient,
175
+ body: PatchOrgMemberBody,
176
+ ) -> Response[Error | PatchOrgMemberResponse200]:
177
+ """Change a workspace member's rights or cap
178
+
179
+ Admin only. Sets any subset of the member's is_admin, is_billing and is_reviewer rights, and their
180
+ per-member monthly cap in seconds. At least one field must be present. Demoting the workspace's last
181
+ remaining admin is refused, evaluated inside the same atomic update so two concurrent demotions
182
+ cannot both succeed and strand the workspace with no admin.
183
+
184
+ Args:
185
+ user_id (str):
186
+ body (PatchOrgMemberBody):
187
+
188
+ Raises:
189
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
190
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
191
+
192
+ Returns:
193
+ Response[Error | PatchOrgMemberResponse200]
194
+ """
195
+
196
+ kwargs = _get_kwargs(
197
+ user_id=user_id,
198
+ body=body,
199
+ )
200
+
201
+ response = await client.get_async_httpx_client().request(**kwargs)
202
+
203
+ return _build_response(client=client, response=response)
204
+
205
+
206
+ async def asyncio(
207
+ user_id: str,
208
+ *,
209
+ client: AuthenticatedClient,
210
+ body: PatchOrgMemberBody,
211
+ ) -> Error | PatchOrgMemberResponse200 | None:
212
+ """Change a workspace member's rights or cap
213
+
214
+ Admin only. Sets any subset of the member's is_admin, is_billing and is_reviewer rights, and their
215
+ per-member monthly cap in seconds. At least one field must be present. Demoting the workspace's last
216
+ remaining admin is refused, evaluated inside the same atomic update so two concurrent demotions
217
+ cannot both succeed and strand the workspace with no admin.
218
+
219
+ Args:
220
+ user_id (str):
221
+ body (PatchOrgMemberBody):
222
+
223
+ Raises:
224
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
225
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
226
+
227
+ Returns:
228
+ Error | PatchOrgMemberResponse200
229
+ """
230
+
231
+ return (
232
+ await asyncio_detailed(
233
+ user_id=user_id,
234
+ client=client,
235
+ body=body,
236
+ )
237
+ ).parsed
@@ -0,0 +1,206 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ... import errors
8
+ from ...client import AuthenticatedClient, Client
9
+ from ...models.error import Error
10
+ from ...models.place_transcript_hold_response_200 import PlaceTranscriptHoldResponse200
11
+ from ...types import Response
12
+
13
+
14
+ def _get_kwargs(
15
+ id: str,
16
+ ) -> dict[str, Any]:
17
+
18
+ _kwargs: dict[str, Any] = {
19
+ "method": "post",
20
+ "url": "/v1/org/transcripts/{id}/hold".format(
21
+ id=quote(str(id), safe=""),
22
+ ),
23
+ }
24
+
25
+ return _kwargs
26
+
27
+
28
+ def _parse_response(
29
+ *, client: AuthenticatedClient | Client, response: httpx.Response
30
+ ) -> Error | PlaceTranscriptHoldResponse200 | None:
31
+ if response.status_code == 200:
32
+ response_200 = PlaceTranscriptHoldResponse200.from_dict(response.json())
33
+
34
+ return response_200
35
+
36
+ if response.status_code == 400:
37
+ response_400 = Error.from_dict(response.json())
38
+
39
+ return response_400
40
+
41
+ if response.status_code == 401:
42
+ response_401 = Error.from_dict(response.json())
43
+
44
+ return response_401
45
+
46
+ if response.status_code == 403:
47
+ response_403 = Error.from_dict(response.json())
48
+
49
+ return response_403
50
+
51
+ if response.status_code == 404:
52
+ response_404 = Error.from_dict(response.json())
53
+
54
+ return response_404
55
+
56
+ if response.status_code == 429:
57
+ response_429 = Error.from_dict(response.json())
58
+
59
+ return response_429
60
+
61
+ if response.status_code == 500:
62
+ response_500 = Error.from_dict(response.json())
63
+
64
+ return response_500
65
+
66
+ if client.raise_on_unexpected_status:
67
+ raise errors.UnexpectedStatus(response.status_code, response.content)
68
+ else:
69
+ return None
70
+
71
+
72
+ def _build_response(
73
+ *, client: AuthenticatedClient | Client, response: httpx.Response
74
+ ) -> Response[Error | PlaceTranscriptHoldResponse200]:
75
+ return Response(
76
+ status_code=HTTPStatus(response.status_code),
77
+ content=response.content,
78
+ headers=response.headers,
79
+ parsed=_parse_response(client=client, response=response),
80
+ )
81
+
82
+
83
+ def sync_detailed(
84
+ id: str,
85
+ *,
86
+ client: AuthenticatedClient,
87
+ ) -> Response[Error | PlaceTranscriptHoldResponse200]:
88
+ """Place a legal hold on a transcript
89
+
90
+ Reviewer only. Places a legal hold on one transcript in the caller's firm-custody workspace. A held
91
+ transcript is exempt from the retention sweep, the retention re-clamp sweep and ordinary deletion,
92
+ and its body, translations, cleaned text and AI outputs cannot be edited or regenerated (409
93
+ transcript_legal_hold), until the hold is lifted.
94
+
95
+ Args:
96
+ id (str):
97
+
98
+ Raises:
99
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
100
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
101
+
102
+ Returns:
103
+ Response[Error | PlaceTranscriptHoldResponse200]
104
+ """
105
+
106
+ kwargs = _get_kwargs(
107
+ id=id,
108
+ )
109
+
110
+ response = client.get_httpx_client().request(
111
+ **kwargs,
112
+ )
113
+
114
+ return _build_response(client=client, response=response)
115
+
116
+
117
+ def sync(
118
+ id: str,
119
+ *,
120
+ client: AuthenticatedClient,
121
+ ) -> Error | PlaceTranscriptHoldResponse200 | None:
122
+ """Place a legal hold on a transcript
123
+
124
+ Reviewer only. Places a legal hold on one transcript in the caller's firm-custody workspace. A held
125
+ transcript is exempt from the retention sweep, the retention re-clamp sweep and ordinary deletion,
126
+ and its body, translations, cleaned text and AI outputs cannot be edited or regenerated (409
127
+ transcript_legal_hold), until the hold is lifted.
128
+
129
+ Args:
130
+ id (str):
131
+
132
+ Raises:
133
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
134
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
135
+
136
+ Returns:
137
+ Error | PlaceTranscriptHoldResponse200
138
+ """
139
+
140
+ return sync_detailed(
141
+ id=id,
142
+ client=client,
143
+ ).parsed
144
+
145
+
146
+ async def asyncio_detailed(
147
+ id: str,
148
+ *,
149
+ client: AuthenticatedClient,
150
+ ) -> Response[Error | PlaceTranscriptHoldResponse200]:
151
+ """Place a legal hold on a transcript
152
+
153
+ Reviewer only. Places a legal hold on one transcript in the caller's firm-custody workspace. A held
154
+ transcript is exempt from the retention sweep, the retention re-clamp sweep and ordinary deletion,
155
+ and its body, translations, cleaned text and AI outputs cannot be edited or regenerated (409
156
+ transcript_legal_hold), until the hold is lifted.
157
+
158
+ Args:
159
+ id (str):
160
+
161
+ Raises:
162
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
163
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
164
+
165
+ Returns:
166
+ Response[Error | PlaceTranscriptHoldResponse200]
167
+ """
168
+
169
+ kwargs = _get_kwargs(
170
+ id=id,
171
+ )
172
+
173
+ response = await client.get_async_httpx_client().request(**kwargs)
174
+
175
+ return _build_response(client=client, response=response)
176
+
177
+
178
+ async def asyncio(
179
+ id: str,
180
+ *,
181
+ client: AuthenticatedClient,
182
+ ) -> Error | PlaceTranscriptHoldResponse200 | None:
183
+ """Place a legal hold on a transcript
184
+
185
+ Reviewer only. Places a legal hold on one transcript in the caller's firm-custody workspace. A held
186
+ transcript is exempt from the retention sweep, the retention re-clamp sweep and ordinary deletion,
187
+ and its body, translations, cleaned text and AI outputs cannot be edited or regenerated (409
188
+ transcript_legal_hold), until the hold is lifted.
189
+
190
+ Args:
191
+ id (str):
192
+
193
+ Raises:
194
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
195
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
196
+
197
+ Returns:
198
+ Error | PlaceTranscriptHoldResponse200
199
+ """
200
+
201
+ return (
202
+ await asyncio_detailed(
203
+ id=id,
204
+ client=client,
205
+ )
206
+ ).parsed
@@ -0,0 +1,177 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.agent_credentials_rotate_response import AgentCredentialsRotateResponse
9
+ from ...models.error import Error
10
+ from ...types import Response
11
+
12
+
13
+ def _get_kwargs() -> dict[str, Any]:
14
+
15
+ _kwargs: dict[str, Any] = {
16
+ "method": "post",
17
+ "url": "/v1/agent/credentials/rotate",
18
+ }
19
+
20
+ return _kwargs
21
+
22
+
23
+ def _parse_response(
24
+ *, client: AuthenticatedClient | Client, response: httpx.Response
25
+ ) -> AgentCredentialsRotateResponse | Error | None:
26
+ if response.status_code == 201:
27
+ response_201 = AgentCredentialsRotateResponse.from_dict(response.json())
28
+
29
+ return response_201
30
+
31
+ if response.status_code == 401:
32
+ response_401 = Error.from_dict(response.json())
33
+
34
+ return response_401
35
+
36
+ if response.status_code == 403:
37
+ response_403 = Error.from_dict(response.json())
38
+
39
+ return response_403
40
+
41
+ if response.status_code == 429:
42
+ response_429 = Error.from_dict(response.json())
43
+
44
+ return response_429
45
+
46
+ if response.status_code == 500:
47
+ response_500 = Error.from_dict(response.json())
48
+
49
+ return response_500
50
+
51
+ if client.raise_on_unexpected_status:
52
+ raise errors.UnexpectedStatus(response.status_code, response.content)
53
+ else:
54
+ return None
55
+
56
+
57
+ def _build_response(
58
+ *, client: AuthenticatedClient | Client, response: httpx.Response
59
+ ) -> Response[AgentCredentialsRotateResponse | Error]:
60
+ return Response(
61
+ status_code=HTTPStatus(response.status_code),
62
+ content=response.content,
63
+ headers=response.headers,
64
+ parsed=_parse_response(client=client, response=response),
65
+ )
66
+
67
+
68
+ def sync_detailed(
69
+ *,
70
+ client: AuthenticatedClient,
71
+ ) -> Response[AgentCredentialsRotateResponse | Error]:
72
+ """Rotate the calling agent PAT
73
+
74
+ Atomically mints a successor personal access token and revokes the one that authenticated this
75
+ request. A machine account has no password and no usable mailbox, so this is its only way to rotate
76
+ a leaked credential. The successor keeps the predecessor's scopes, billing_enabled flag, name,
77
+ client_label, and expiry policy; only the secret changes. The predecessor fails authentication on
78
+ the very next request. This route references no token but the one that called it: it cannot list,
79
+ mint, or revoke any other credential.
80
+
81
+ Raises:
82
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
83
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
84
+
85
+ Returns:
86
+ Response[AgentCredentialsRotateResponse | Error]
87
+ """
88
+
89
+ kwargs = _get_kwargs()
90
+
91
+ response = client.get_httpx_client().request(
92
+ **kwargs,
93
+ )
94
+
95
+ return _build_response(client=client, response=response)
96
+
97
+
98
+ def sync(
99
+ *,
100
+ client: AuthenticatedClient,
101
+ ) -> AgentCredentialsRotateResponse | Error | None:
102
+ """Rotate the calling agent PAT
103
+
104
+ Atomically mints a successor personal access token and revokes the one that authenticated this
105
+ request. A machine account has no password and no usable mailbox, so this is its only way to rotate
106
+ a leaked credential. The successor keeps the predecessor's scopes, billing_enabled flag, name,
107
+ client_label, and expiry policy; only the secret changes. The predecessor fails authentication on
108
+ the very next request. This route references no token but the one that called it: it cannot list,
109
+ mint, or revoke any other credential.
110
+
111
+ Raises:
112
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
113
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
114
+
115
+ Returns:
116
+ AgentCredentialsRotateResponse | Error
117
+ """
118
+
119
+ return sync_detailed(
120
+ client=client,
121
+ ).parsed
122
+
123
+
124
+ async def asyncio_detailed(
125
+ *,
126
+ client: AuthenticatedClient,
127
+ ) -> Response[AgentCredentialsRotateResponse | Error]:
128
+ """Rotate the calling agent PAT
129
+
130
+ Atomically mints a successor personal access token and revokes the one that authenticated this
131
+ request. A machine account has no password and no usable mailbox, so this is its only way to rotate
132
+ a leaked credential. The successor keeps the predecessor's scopes, billing_enabled flag, name,
133
+ client_label, and expiry policy; only the secret changes. The predecessor fails authentication on
134
+ the very next request. This route references no token but the one that called it: it cannot list,
135
+ mint, or revoke any other credential.
136
+
137
+ Raises:
138
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
139
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
140
+
141
+ Returns:
142
+ Response[AgentCredentialsRotateResponse | Error]
143
+ """
144
+
145
+ kwargs = _get_kwargs()
146
+
147
+ response = await client.get_async_httpx_client().request(**kwargs)
148
+
149
+ return _build_response(client=client, response=response)
150
+
151
+
152
+ async def asyncio(
153
+ *,
154
+ client: AuthenticatedClient,
155
+ ) -> AgentCredentialsRotateResponse | Error | None:
156
+ """Rotate the calling agent PAT
157
+
158
+ Atomically mints a successor personal access token and revokes the one that authenticated this
159
+ request. A machine account has no password and no usable mailbox, so this is its only way to rotate
160
+ a leaked credential. The successor keeps the predecessor's scopes, billing_enabled flag, name,
161
+ client_label, and expiry policy; only the secret changes. The predecessor fails authentication on
162
+ the very next request. This route references no token but the one that called it: it cannot list,
163
+ mint, or revoke any other credential.
164
+
165
+ Raises:
166
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
167
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
168
+
169
+ Returns:
170
+ AgentCredentialsRotateResponse | Error
171
+ """
172
+
173
+ return (
174
+ await asyncio_detailed(
175
+ client=client,
176
+ )
177
+ ).parsed