mirascope 2.0.0a3__py3-none-any.whl → 2.0.0a5__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 (118) hide show
  1. mirascope/api/_generated/__init__.py +78 -6
  2. mirascope/api/_generated/api_keys/__init__.py +7 -0
  3. mirascope/api/_generated/api_keys/client.py +453 -0
  4. mirascope/api/_generated/api_keys/raw_client.py +853 -0
  5. mirascope/api/_generated/api_keys/types/__init__.py +9 -0
  6. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +36 -0
  7. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +35 -0
  8. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +35 -0
  9. mirascope/api/_generated/client.py +14 -0
  10. mirascope/api/_generated/environments/__init__.py +17 -0
  11. mirascope/api/_generated/environments/client.py +532 -0
  12. mirascope/api/_generated/environments/raw_client.py +1088 -0
  13. mirascope/api/_generated/environments/types/__init__.py +15 -0
  14. mirascope/api/_generated/environments/types/environments_create_response.py +26 -0
  15. mirascope/api/_generated/environments/types/environments_get_response.py +26 -0
  16. mirascope/api/_generated/environments/types/environments_list_response_item.py +26 -0
  17. mirascope/api/_generated/environments/types/environments_update_response.py +26 -0
  18. mirascope/api/_generated/errors/__init__.py +11 -1
  19. mirascope/api/_generated/errors/conflict_error.py +15 -0
  20. mirascope/api/_generated/errors/forbidden_error.py +15 -0
  21. mirascope/api/_generated/errors/internal_server_error.py +15 -0
  22. mirascope/api/_generated/errors/not_found_error.py +15 -0
  23. mirascope/api/_generated/organizations/__init__.py +25 -0
  24. mirascope/api/_generated/organizations/client.py +404 -0
  25. mirascope/api/_generated/organizations/raw_client.py +902 -0
  26. mirascope/api/_generated/organizations/types/__init__.py +23 -0
  27. mirascope/api/_generated/organizations/types/organizations_create_response.py +25 -0
  28. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +7 -0
  29. mirascope/api/_generated/organizations/types/organizations_get_response.py +25 -0
  30. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +7 -0
  31. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +25 -0
  32. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +7 -0
  33. mirascope/api/_generated/organizations/types/organizations_update_response.py +25 -0
  34. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +7 -0
  35. mirascope/api/_generated/projects/__init__.py +17 -0
  36. mirascope/api/_generated/projects/client.py +482 -0
  37. mirascope/api/_generated/projects/raw_client.py +1058 -0
  38. mirascope/api/_generated/projects/types/__init__.py +15 -0
  39. mirascope/api/_generated/projects/types/projects_create_response.py +31 -0
  40. mirascope/api/_generated/projects/types/projects_get_response.py +31 -0
  41. mirascope/api/_generated/projects/types/projects_list_response_item.py +31 -0
  42. mirascope/api/_generated/projects/types/projects_update_response.py +31 -0
  43. mirascope/api/_generated/reference.md +1311 -0
  44. mirascope/api/_generated/types/__init__.py +20 -4
  45. mirascope/api/_generated/types/already_exists_error.py +24 -0
  46. mirascope/api/_generated/types/already_exists_error_tag.py +5 -0
  47. mirascope/api/_generated/types/database_error.py +24 -0
  48. mirascope/api/_generated/types/database_error_tag.py +5 -0
  49. mirascope/api/_generated/types/http_api_decode_error.py +1 -3
  50. mirascope/api/_generated/types/issue.py +1 -5
  51. mirascope/api/_generated/types/not_found_error_body.py +24 -0
  52. mirascope/api/_generated/types/not_found_error_tag.py +5 -0
  53. mirascope/api/_generated/types/permission_denied_error.py +24 -0
  54. mirascope/api/_generated/types/permission_denied_error_tag.py +7 -0
  55. mirascope/api/_generated/types/property_key.py +2 -2
  56. mirascope/api/_generated/types/{property_key_tag.py → property_key_key.py} +3 -5
  57. mirascope/api/_generated/types/{property_key_tag_tag.py → property_key_key_tag.py} +1 -1
  58. mirascope/llm/__init__.py +6 -2
  59. mirascope/llm/exceptions.py +28 -0
  60. mirascope/llm/providers/__init__.py +12 -4
  61. mirascope/llm/providers/anthropic/__init__.py +6 -1
  62. mirascope/llm/providers/anthropic/_utils/__init__.py +17 -5
  63. mirascope/llm/providers/anthropic/_utils/beta_decode.py +271 -0
  64. mirascope/llm/providers/anthropic/_utils/beta_encode.py +216 -0
  65. mirascope/llm/providers/anthropic/_utils/decode.py +39 -7
  66. mirascope/llm/providers/anthropic/_utils/encode.py +156 -64
  67. mirascope/llm/providers/anthropic/_utils/errors.py +46 -0
  68. mirascope/llm/providers/anthropic/beta_provider.py +328 -0
  69. mirascope/llm/providers/anthropic/model_id.py +10 -27
  70. mirascope/llm/providers/anthropic/model_info.py +87 -0
  71. mirascope/llm/providers/anthropic/provider.py +132 -145
  72. mirascope/llm/providers/base/__init__.py +2 -1
  73. mirascope/llm/providers/base/_utils.py +15 -1
  74. mirascope/llm/providers/base/base_provider.py +173 -58
  75. mirascope/llm/providers/google/_utils/__init__.py +2 -0
  76. mirascope/llm/providers/google/_utils/decode.py +55 -3
  77. mirascope/llm/providers/google/_utils/encode.py +14 -6
  78. mirascope/llm/providers/google/_utils/errors.py +49 -0
  79. mirascope/llm/providers/google/model_id.py +7 -13
  80. mirascope/llm/providers/google/model_info.py +62 -0
  81. mirascope/llm/providers/google/provider.py +13 -8
  82. mirascope/llm/providers/mlx/_utils.py +31 -2
  83. mirascope/llm/providers/mlx/encoding/transformers.py +17 -1
  84. mirascope/llm/providers/mlx/provider.py +12 -0
  85. mirascope/llm/providers/ollama/__init__.py +19 -0
  86. mirascope/llm/providers/ollama/provider.py +71 -0
  87. mirascope/llm/providers/openai/__init__.py +10 -1
  88. mirascope/llm/providers/openai/_utils/__init__.py +5 -0
  89. mirascope/llm/providers/openai/_utils/errors.py +46 -0
  90. mirascope/llm/providers/openai/completions/__init__.py +6 -1
  91. mirascope/llm/providers/openai/completions/_utils/decode.py +57 -5
  92. mirascope/llm/providers/openai/completions/_utils/encode.py +9 -8
  93. mirascope/llm/providers/openai/completions/base_provider.py +513 -0
  94. mirascope/llm/providers/openai/completions/provider.py +13 -447
  95. mirascope/llm/providers/openai/model_info.py +57 -0
  96. mirascope/llm/providers/openai/provider.py +30 -5
  97. mirascope/llm/providers/openai/responses/_utils/decode.py +55 -4
  98. mirascope/llm/providers/openai/responses/_utils/encode.py +9 -9
  99. mirascope/llm/providers/openai/responses/provider.py +33 -28
  100. mirascope/llm/providers/provider_id.py +11 -1
  101. mirascope/llm/providers/provider_registry.py +59 -4
  102. mirascope/llm/providers/together/__init__.py +19 -0
  103. mirascope/llm/providers/together/provider.py +40 -0
  104. mirascope/llm/responses/__init__.py +3 -0
  105. mirascope/llm/responses/base_response.py +4 -0
  106. mirascope/llm/responses/base_stream_response.py +25 -1
  107. mirascope/llm/responses/finish_reason.py +1 -0
  108. mirascope/llm/responses/response.py +9 -0
  109. mirascope/llm/responses/root_response.py +5 -1
  110. mirascope/llm/responses/usage.py +95 -0
  111. mirascope/ops/_internal/closure.py +62 -11
  112. {mirascope-2.0.0a3.dist-info → mirascope-2.0.0a5.dist-info}/METADATA +3 -3
  113. {mirascope-2.0.0a3.dist-info → mirascope-2.0.0a5.dist-info}/RECORD +115 -56
  114. mirascope/llm/providers/load_provider.py +0 -48
  115. mirascope/llm/providers/openai/shared/__init__.py +0 -7
  116. mirascope/llm/providers/openai/shared/_utils.py +0 -59
  117. {mirascope-2.0.0a3.dist-info → mirascope-2.0.0a5.dist-info}/WHEEL +0 -0
  118. {mirascope-2.0.0a3.dist-info → mirascope-2.0.0a5.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,1088 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ..core.api_error import ApiError
7
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
9
+ from ..core.jsonable_encoder import jsonable_encoder
10
+ from ..core.pydantic_utilities import parse_obj_as
11
+ from ..core.request_options import RequestOptions
12
+ from ..errors.bad_request_error import BadRequestError
13
+ from ..errors.conflict_error import ConflictError
14
+ from ..errors.forbidden_error import ForbiddenError
15
+ from ..errors.internal_server_error import InternalServerError
16
+ from ..errors.not_found_error import NotFoundError
17
+ from ..types.already_exists_error import AlreadyExistsError
18
+ from ..types.database_error import DatabaseError
19
+ from ..types.http_api_decode_error import HttpApiDecodeError
20
+ from ..types.not_found_error_body import NotFoundErrorBody
21
+ from ..types.permission_denied_error import PermissionDeniedError
22
+ from .types.environments_create_response import EnvironmentsCreateResponse
23
+ from .types.environments_get_response import EnvironmentsGetResponse
24
+ from .types.environments_list_response_item import EnvironmentsListResponseItem
25
+ from .types.environments_update_response import EnvironmentsUpdateResponse
26
+
27
+ # this is used as the default value for optional parameters
28
+ OMIT = typing.cast(typing.Any, ...)
29
+
30
+
31
+ class RawEnvironmentsClient:
32
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
33
+ self._client_wrapper = client_wrapper
34
+
35
+ def list(
36
+ self,
37
+ organization_id: str,
38
+ project_id: str,
39
+ *,
40
+ request_options: typing.Optional[RequestOptions] = None,
41
+ ) -> HttpResponse[typing.List[EnvironmentsListResponseItem]]:
42
+ """
43
+ Parameters
44
+ ----------
45
+ organization_id : str
46
+
47
+ project_id : str
48
+
49
+ request_options : typing.Optional[RequestOptions]
50
+ Request-specific configuration.
51
+
52
+ Returns
53
+ -------
54
+ HttpResponse[typing.List[EnvironmentsListResponseItem]]
55
+ Success
56
+ """
57
+ _response = self._client_wrapper.httpx_client.request(
58
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments",
59
+ method="GET",
60
+ request_options=request_options,
61
+ )
62
+ try:
63
+ if 200 <= _response.status_code < 300:
64
+ _data = typing.cast(
65
+ typing.List[EnvironmentsListResponseItem],
66
+ parse_obj_as(
67
+ type_=typing.List[EnvironmentsListResponseItem], # type: ignore
68
+ object_=_response.json(),
69
+ ),
70
+ )
71
+ return HttpResponse(response=_response, data=_data)
72
+ if _response.status_code == 400:
73
+ raise BadRequestError(
74
+ headers=dict(_response.headers),
75
+ body=typing.cast(
76
+ HttpApiDecodeError,
77
+ parse_obj_as(
78
+ type_=HttpApiDecodeError, # type: ignore
79
+ object_=_response.json(),
80
+ ),
81
+ ),
82
+ )
83
+ if _response.status_code == 403:
84
+ raise ForbiddenError(
85
+ headers=dict(_response.headers),
86
+ body=typing.cast(
87
+ PermissionDeniedError,
88
+ parse_obj_as(
89
+ type_=PermissionDeniedError, # type: ignore
90
+ object_=_response.json(),
91
+ ),
92
+ ),
93
+ )
94
+ if _response.status_code == 404:
95
+ raise NotFoundError(
96
+ headers=dict(_response.headers),
97
+ body=typing.cast(
98
+ NotFoundErrorBody,
99
+ parse_obj_as(
100
+ type_=NotFoundErrorBody, # type: ignore
101
+ object_=_response.json(),
102
+ ),
103
+ ),
104
+ )
105
+ if _response.status_code == 500:
106
+ raise InternalServerError(
107
+ headers=dict(_response.headers),
108
+ body=typing.cast(
109
+ DatabaseError,
110
+ parse_obj_as(
111
+ type_=DatabaseError, # type: ignore
112
+ object_=_response.json(),
113
+ ),
114
+ ),
115
+ )
116
+ _response_json = _response.json()
117
+ except JSONDecodeError:
118
+ raise ApiError(
119
+ status_code=_response.status_code,
120
+ headers=dict(_response.headers),
121
+ body=_response.text,
122
+ )
123
+ raise ApiError(
124
+ status_code=_response.status_code,
125
+ headers=dict(_response.headers),
126
+ body=_response_json,
127
+ )
128
+
129
+ def create(
130
+ self,
131
+ organization_id: str,
132
+ project_id: str,
133
+ *,
134
+ name: str,
135
+ slug: str,
136
+ request_options: typing.Optional[RequestOptions] = None,
137
+ ) -> HttpResponse[EnvironmentsCreateResponse]:
138
+ """
139
+ Parameters
140
+ ----------
141
+ organization_id : str
142
+
143
+ project_id : str
144
+
145
+ name : str
146
+ a string at most 100 character(s) long
147
+
148
+ slug : str
149
+ a string matching the pattern ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
150
+
151
+ request_options : typing.Optional[RequestOptions]
152
+ Request-specific configuration.
153
+
154
+ Returns
155
+ -------
156
+ HttpResponse[EnvironmentsCreateResponse]
157
+ Success
158
+ """
159
+ _response = self._client_wrapper.httpx_client.request(
160
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments",
161
+ method="POST",
162
+ json={
163
+ "name": name,
164
+ "slug": slug,
165
+ },
166
+ headers={
167
+ "content-type": "application/json",
168
+ },
169
+ request_options=request_options,
170
+ omit=OMIT,
171
+ )
172
+ try:
173
+ if 200 <= _response.status_code < 300:
174
+ _data = typing.cast(
175
+ EnvironmentsCreateResponse,
176
+ parse_obj_as(
177
+ type_=EnvironmentsCreateResponse, # type: ignore
178
+ object_=_response.json(),
179
+ ),
180
+ )
181
+ return HttpResponse(response=_response, data=_data)
182
+ if _response.status_code == 400:
183
+ raise BadRequestError(
184
+ headers=dict(_response.headers),
185
+ body=typing.cast(
186
+ HttpApiDecodeError,
187
+ parse_obj_as(
188
+ type_=HttpApiDecodeError, # type: ignore
189
+ object_=_response.json(),
190
+ ),
191
+ ),
192
+ )
193
+ if _response.status_code == 403:
194
+ raise ForbiddenError(
195
+ headers=dict(_response.headers),
196
+ body=typing.cast(
197
+ PermissionDeniedError,
198
+ parse_obj_as(
199
+ type_=PermissionDeniedError, # type: ignore
200
+ object_=_response.json(),
201
+ ),
202
+ ),
203
+ )
204
+ if _response.status_code == 404:
205
+ raise NotFoundError(
206
+ headers=dict(_response.headers),
207
+ body=typing.cast(
208
+ NotFoundErrorBody,
209
+ parse_obj_as(
210
+ type_=NotFoundErrorBody, # type: ignore
211
+ object_=_response.json(),
212
+ ),
213
+ ),
214
+ )
215
+ if _response.status_code == 409:
216
+ raise ConflictError(
217
+ headers=dict(_response.headers),
218
+ body=typing.cast(
219
+ AlreadyExistsError,
220
+ parse_obj_as(
221
+ type_=AlreadyExistsError, # type: ignore
222
+ object_=_response.json(),
223
+ ),
224
+ ),
225
+ )
226
+ if _response.status_code == 500:
227
+ raise InternalServerError(
228
+ headers=dict(_response.headers),
229
+ body=typing.cast(
230
+ DatabaseError,
231
+ parse_obj_as(
232
+ type_=DatabaseError, # type: ignore
233
+ object_=_response.json(),
234
+ ),
235
+ ),
236
+ )
237
+ _response_json = _response.json()
238
+ except JSONDecodeError:
239
+ raise ApiError(
240
+ status_code=_response.status_code,
241
+ headers=dict(_response.headers),
242
+ body=_response.text,
243
+ )
244
+ raise ApiError(
245
+ status_code=_response.status_code,
246
+ headers=dict(_response.headers),
247
+ body=_response_json,
248
+ )
249
+
250
+ def get(
251
+ self,
252
+ organization_id: str,
253
+ project_id: str,
254
+ environment_id: str,
255
+ *,
256
+ request_options: typing.Optional[RequestOptions] = None,
257
+ ) -> HttpResponse[EnvironmentsGetResponse]:
258
+ """
259
+ Parameters
260
+ ----------
261
+ organization_id : str
262
+
263
+ project_id : str
264
+
265
+ environment_id : str
266
+
267
+ request_options : typing.Optional[RequestOptions]
268
+ Request-specific configuration.
269
+
270
+ Returns
271
+ -------
272
+ HttpResponse[EnvironmentsGetResponse]
273
+ Success
274
+ """
275
+ _response = self._client_wrapper.httpx_client.request(
276
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
277
+ method="GET",
278
+ request_options=request_options,
279
+ )
280
+ try:
281
+ if 200 <= _response.status_code < 300:
282
+ _data = typing.cast(
283
+ EnvironmentsGetResponse,
284
+ parse_obj_as(
285
+ type_=EnvironmentsGetResponse, # type: ignore
286
+ object_=_response.json(),
287
+ ),
288
+ )
289
+ return HttpResponse(response=_response, data=_data)
290
+ if _response.status_code == 400:
291
+ raise BadRequestError(
292
+ headers=dict(_response.headers),
293
+ body=typing.cast(
294
+ HttpApiDecodeError,
295
+ parse_obj_as(
296
+ type_=HttpApiDecodeError, # type: ignore
297
+ object_=_response.json(),
298
+ ),
299
+ ),
300
+ )
301
+ if _response.status_code == 403:
302
+ raise ForbiddenError(
303
+ headers=dict(_response.headers),
304
+ body=typing.cast(
305
+ PermissionDeniedError,
306
+ parse_obj_as(
307
+ type_=PermissionDeniedError, # type: ignore
308
+ object_=_response.json(),
309
+ ),
310
+ ),
311
+ )
312
+ if _response.status_code == 404:
313
+ raise NotFoundError(
314
+ headers=dict(_response.headers),
315
+ body=typing.cast(
316
+ NotFoundErrorBody,
317
+ parse_obj_as(
318
+ type_=NotFoundErrorBody, # type: ignore
319
+ object_=_response.json(),
320
+ ),
321
+ ),
322
+ )
323
+ if _response.status_code == 500:
324
+ raise InternalServerError(
325
+ headers=dict(_response.headers),
326
+ body=typing.cast(
327
+ DatabaseError,
328
+ parse_obj_as(
329
+ type_=DatabaseError, # type: ignore
330
+ object_=_response.json(),
331
+ ),
332
+ ),
333
+ )
334
+ _response_json = _response.json()
335
+ except JSONDecodeError:
336
+ raise ApiError(
337
+ status_code=_response.status_code,
338
+ headers=dict(_response.headers),
339
+ body=_response.text,
340
+ )
341
+ raise ApiError(
342
+ status_code=_response.status_code,
343
+ headers=dict(_response.headers),
344
+ body=_response_json,
345
+ )
346
+
347
+ def update(
348
+ self,
349
+ organization_id: str,
350
+ project_id: str,
351
+ environment_id: str,
352
+ *,
353
+ name: typing.Optional[str] = OMIT,
354
+ slug: typing.Optional[str] = OMIT,
355
+ request_options: typing.Optional[RequestOptions] = None,
356
+ ) -> HttpResponse[EnvironmentsUpdateResponse]:
357
+ """
358
+ Parameters
359
+ ----------
360
+ organization_id : str
361
+
362
+ project_id : str
363
+
364
+ environment_id : str
365
+
366
+ name : typing.Optional[str]
367
+ a string at most 100 character(s) long
368
+
369
+ slug : typing.Optional[str]
370
+ a string matching the pattern ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
371
+
372
+ request_options : typing.Optional[RequestOptions]
373
+ Request-specific configuration.
374
+
375
+ Returns
376
+ -------
377
+ HttpResponse[EnvironmentsUpdateResponse]
378
+ Success
379
+ """
380
+ _response = self._client_wrapper.httpx_client.request(
381
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
382
+ method="PUT",
383
+ json={
384
+ "name": name,
385
+ "slug": slug,
386
+ },
387
+ headers={
388
+ "content-type": "application/json",
389
+ },
390
+ request_options=request_options,
391
+ omit=OMIT,
392
+ )
393
+ try:
394
+ if 200 <= _response.status_code < 300:
395
+ _data = typing.cast(
396
+ EnvironmentsUpdateResponse,
397
+ parse_obj_as(
398
+ type_=EnvironmentsUpdateResponse, # type: ignore
399
+ object_=_response.json(),
400
+ ),
401
+ )
402
+ return HttpResponse(response=_response, data=_data)
403
+ if _response.status_code == 400:
404
+ raise BadRequestError(
405
+ headers=dict(_response.headers),
406
+ body=typing.cast(
407
+ HttpApiDecodeError,
408
+ parse_obj_as(
409
+ type_=HttpApiDecodeError, # type: ignore
410
+ object_=_response.json(),
411
+ ),
412
+ ),
413
+ )
414
+ if _response.status_code == 403:
415
+ raise ForbiddenError(
416
+ headers=dict(_response.headers),
417
+ body=typing.cast(
418
+ PermissionDeniedError,
419
+ parse_obj_as(
420
+ type_=PermissionDeniedError, # type: ignore
421
+ object_=_response.json(),
422
+ ),
423
+ ),
424
+ )
425
+ if _response.status_code == 404:
426
+ raise NotFoundError(
427
+ headers=dict(_response.headers),
428
+ body=typing.cast(
429
+ NotFoundErrorBody,
430
+ parse_obj_as(
431
+ type_=NotFoundErrorBody, # type: ignore
432
+ object_=_response.json(),
433
+ ),
434
+ ),
435
+ )
436
+ if _response.status_code == 409:
437
+ raise ConflictError(
438
+ headers=dict(_response.headers),
439
+ body=typing.cast(
440
+ AlreadyExistsError,
441
+ parse_obj_as(
442
+ type_=AlreadyExistsError, # type: ignore
443
+ object_=_response.json(),
444
+ ),
445
+ ),
446
+ )
447
+ if _response.status_code == 500:
448
+ raise InternalServerError(
449
+ headers=dict(_response.headers),
450
+ body=typing.cast(
451
+ DatabaseError,
452
+ parse_obj_as(
453
+ type_=DatabaseError, # type: ignore
454
+ object_=_response.json(),
455
+ ),
456
+ ),
457
+ )
458
+ _response_json = _response.json()
459
+ except JSONDecodeError:
460
+ raise ApiError(
461
+ status_code=_response.status_code,
462
+ headers=dict(_response.headers),
463
+ body=_response.text,
464
+ )
465
+ raise ApiError(
466
+ status_code=_response.status_code,
467
+ headers=dict(_response.headers),
468
+ body=_response_json,
469
+ )
470
+
471
+ def delete(
472
+ self,
473
+ organization_id: str,
474
+ project_id: str,
475
+ environment_id: str,
476
+ *,
477
+ request_options: typing.Optional[RequestOptions] = None,
478
+ ) -> HttpResponse[None]:
479
+ """
480
+ Parameters
481
+ ----------
482
+ organization_id : str
483
+
484
+ project_id : str
485
+
486
+ environment_id : str
487
+
488
+ request_options : typing.Optional[RequestOptions]
489
+ Request-specific configuration.
490
+
491
+ Returns
492
+ -------
493
+ HttpResponse[None]
494
+ """
495
+ _response = self._client_wrapper.httpx_client.request(
496
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
497
+ method="DELETE",
498
+ request_options=request_options,
499
+ )
500
+ try:
501
+ if 200 <= _response.status_code < 300:
502
+ return HttpResponse(response=_response, data=None)
503
+ if _response.status_code == 400:
504
+ raise BadRequestError(
505
+ headers=dict(_response.headers),
506
+ body=typing.cast(
507
+ HttpApiDecodeError,
508
+ parse_obj_as(
509
+ type_=HttpApiDecodeError, # type: ignore
510
+ object_=_response.json(),
511
+ ),
512
+ ),
513
+ )
514
+ if _response.status_code == 403:
515
+ raise ForbiddenError(
516
+ headers=dict(_response.headers),
517
+ body=typing.cast(
518
+ PermissionDeniedError,
519
+ parse_obj_as(
520
+ type_=PermissionDeniedError, # type: ignore
521
+ object_=_response.json(),
522
+ ),
523
+ ),
524
+ )
525
+ if _response.status_code == 404:
526
+ raise NotFoundError(
527
+ headers=dict(_response.headers),
528
+ body=typing.cast(
529
+ NotFoundErrorBody,
530
+ parse_obj_as(
531
+ type_=NotFoundErrorBody, # type: ignore
532
+ object_=_response.json(),
533
+ ),
534
+ ),
535
+ )
536
+ if _response.status_code == 500:
537
+ raise InternalServerError(
538
+ headers=dict(_response.headers),
539
+ body=typing.cast(
540
+ DatabaseError,
541
+ parse_obj_as(
542
+ type_=DatabaseError, # type: ignore
543
+ object_=_response.json(),
544
+ ),
545
+ ),
546
+ )
547
+ _response_json = _response.json()
548
+ except JSONDecodeError:
549
+ raise ApiError(
550
+ status_code=_response.status_code,
551
+ headers=dict(_response.headers),
552
+ body=_response.text,
553
+ )
554
+ raise ApiError(
555
+ status_code=_response.status_code,
556
+ headers=dict(_response.headers),
557
+ body=_response_json,
558
+ )
559
+
560
+
561
+ class AsyncRawEnvironmentsClient:
562
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
563
+ self._client_wrapper = client_wrapper
564
+
565
+ async def list(
566
+ self,
567
+ organization_id: str,
568
+ project_id: str,
569
+ *,
570
+ request_options: typing.Optional[RequestOptions] = None,
571
+ ) -> AsyncHttpResponse[typing.List[EnvironmentsListResponseItem]]:
572
+ """
573
+ Parameters
574
+ ----------
575
+ organization_id : str
576
+
577
+ project_id : str
578
+
579
+ request_options : typing.Optional[RequestOptions]
580
+ Request-specific configuration.
581
+
582
+ Returns
583
+ -------
584
+ AsyncHttpResponse[typing.List[EnvironmentsListResponseItem]]
585
+ Success
586
+ """
587
+ _response = await self._client_wrapper.httpx_client.request(
588
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments",
589
+ method="GET",
590
+ request_options=request_options,
591
+ )
592
+ try:
593
+ if 200 <= _response.status_code < 300:
594
+ _data = typing.cast(
595
+ typing.List[EnvironmentsListResponseItem],
596
+ parse_obj_as(
597
+ type_=typing.List[EnvironmentsListResponseItem], # type: ignore
598
+ object_=_response.json(),
599
+ ),
600
+ )
601
+ return AsyncHttpResponse(response=_response, data=_data)
602
+ if _response.status_code == 400:
603
+ raise BadRequestError(
604
+ headers=dict(_response.headers),
605
+ body=typing.cast(
606
+ HttpApiDecodeError,
607
+ parse_obj_as(
608
+ type_=HttpApiDecodeError, # type: ignore
609
+ object_=_response.json(),
610
+ ),
611
+ ),
612
+ )
613
+ if _response.status_code == 403:
614
+ raise ForbiddenError(
615
+ headers=dict(_response.headers),
616
+ body=typing.cast(
617
+ PermissionDeniedError,
618
+ parse_obj_as(
619
+ type_=PermissionDeniedError, # type: ignore
620
+ object_=_response.json(),
621
+ ),
622
+ ),
623
+ )
624
+ if _response.status_code == 404:
625
+ raise NotFoundError(
626
+ headers=dict(_response.headers),
627
+ body=typing.cast(
628
+ NotFoundErrorBody,
629
+ parse_obj_as(
630
+ type_=NotFoundErrorBody, # type: ignore
631
+ object_=_response.json(),
632
+ ),
633
+ ),
634
+ )
635
+ if _response.status_code == 500:
636
+ raise InternalServerError(
637
+ headers=dict(_response.headers),
638
+ body=typing.cast(
639
+ DatabaseError,
640
+ parse_obj_as(
641
+ type_=DatabaseError, # type: ignore
642
+ object_=_response.json(),
643
+ ),
644
+ ),
645
+ )
646
+ _response_json = _response.json()
647
+ except JSONDecodeError:
648
+ raise ApiError(
649
+ status_code=_response.status_code,
650
+ headers=dict(_response.headers),
651
+ body=_response.text,
652
+ )
653
+ raise ApiError(
654
+ status_code=_response.status_code,
655
+ headers=dict(_response.headers),
656
+ body=_response_json,
657
+ )
658
+
659
+ async def create(
660
+ self,
661
+ organization_id: str,
662
+ project_id: str,
663
+ *,
664
+ name: str,
665
+ slug: str,
666
+ request_options: typing.Optional[RequestOptions] = None,
667
+ ) -> AsyncHttpResponse[EnvironmentsCreateResponse]:
668
+ """
669
+ Parameters
670
+ ----------
671
+ organization_id : str
672
+
673
+ project_id : str
674
+
675
+ name : str
676
+ a string at most 100 character(s) long
677
+
678
+ slug : str
679
+ a string matching the pattern ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
680
+
681
+ request_options : typing.Optional[RequestOptions]
682
+ Request-specific configuration.
683
+
684
+ Returns
685
+ -------
686
+ AsyncHttpResponse[EnvironmentsCreateResponse]
687
+ Success
688
+ """
689
+ _response = await self._client_wrapper.httpx_client.request(
690
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments",
691
+ method="POST",
692
+ json={
693
+ "name": name,
694
+ "slug": slug,
695
+ },
696
+ headers={
697
+ "content-type": "application/json",
698
+ },
699
+ request_options=request_options,
700
+ omit=OMIT,
701
+ )
702
+ try:
703
+ if 200 <= _response.status_code < 300:
704
+ _data = typing.cast(
705
+ EnvironmentsCreateResponse,
706
+ parse_obj_as(
707
+ type_=EnvironmentsCreateResponse, # type: ignore
708
+ object_=_response.json(),
709
+ ),
710
+ )
711
+ return AsyncHttpResponse(response=_response, data=_data)
712
+ if _response.status_code == 400:
713
+ raise BadRequestError(
714
+ headers=dict(_response.headers),
715
+ body=typing.cast(
716
+ HttpApiDecodeError,
717
+ parse_obj_as(
718
+ type_=HttpApiDecodeError, # type: ignore
719
+ object_=_response.json(),
720
+ ),
721
+ ),
722
+ )
723
+ if _response.status_code == 403:
724
+ raise ForbiddenError(
725
+ headers=dict(_response.headers),
726
+ body=typing.cast(
727
+ PermissionDeniedError,
728
+ parse_obj_as(
729
+ type_=PermissionDeniedError, # type: ignore
730
+ object_=_response.json(),
731
+ ),
732
+ ),
733
+ )
734
+ if _response.status_code == 404:
735
+ raise NotFoundError(
736
+ headers=dict(_response.headers),
737
+ body=typing.cast(
738
+ NotFoundErrorBody,
739
+ parse_obj_as(
740
+ type_=NotFoundErrorBody, # type: ignore
741
+ object_=_response.json(),
742
+ ),
743
+ ),
744
+ )
745
+ if _response.status_code == 409:
746
+ raise ConflictError(
747
+ headers=dict(_response.headers),
748
+ body=typing.cast(
749
+ AlreadyExistsError,
750
+ parse_obj_as(
751
+ type_=AlreadyExistsError, # type: ignore
752
+ object_=_response.json(),
753
+ ),
754
+ ),
755
+ )
756
+ if _response.status_code == 500:
757
+ raise InternalServerError(
758
+ headers=dict(_response.headers),
759
+ body=typing.cast(
760
+ DatabaseError,
761
+ parse_obj_as(
762
+ type_=DatabaseError, # type: ignore
763
+ object_=_response.json(),
764
+ ),
765
+ ),
766
+ )
767
+ _response_json = _response.json()
768
+ except JSONDecodeError:
769
+ raise ApiError(
770
+ status_code=_response.status_code,
771
+ headers=dict(_response.headers),
772
+ body=_response.text,
773
+ )
774
+ raise ApiError(
775
+ status_code=_response.status_code,
776
+ headers=dict(_response.headers),
777
+ body=_response_json,
778
+ )
779
+
780
+ async def get(
781
+ self,
782
+ organization_id: str,
783
+ project_id: str,
784
+ environment_id: str,
785
+ *,
786
+ request_options: typing.Optional[RequestOptions] = None,
787
+ ) -> AsyncHttpResponse[EnvironmentsGetResponse]:
788
+ """
789
+ Parameters
790
+ ----------
791
+ organization_id : str
792
+
793
+ project_id : str
794
+
795
+ environment_id : str
796
+
797
+ request_options : typing.Optional[RequestOptions]
798
+ Request-specific configuration.
799
+
800
+ Returns
801
+ -------
802
+ AsyncHttpResponse[EnvironmentsGetResponse]
803
+ Success
804
+ """
805
+ _response = await self._client_wrapper.httpx_client.request(
806
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
807
+ method="GET",
808
+ request_options=request_options,
809
+ )
810
+ try:
811
+ if 200 <= _response.status_code < 300:
812
+ _data = typing.cast(
813
+ EnvironmentsGetResponse,
814
+ parse_obj_as(
815
+ type_=EnvironmentsGetResponse, # type: ignore
816
+ object_=_response.json(),
817
+ ),
818
+ )
819
+ return AsyncHttpResponse(response=_response, data=_data)
820
+ if _response.status_code == 400:
821
+ raise BadRequestError(
822
+ headers=dict(_response.headers),
823
+ body=typing.cast(
824
+ HttpApiDecodeError,
825
+ parse_obj_as(
826
+ type_=HttpApiDecodeError, # type: ignore
827
+ object_=_response.json(),
828
+ ),
829
+ ),
830
+ )
831
+ if _response.status_code == 403:
832
+ raise ForbiddenError(
833
+ headers=dict(_response.headers),
834
+ body=typing.cast(
835
+ PermissionDeniedError,
836
+ parse_obj_as(
837
+ type_=PermissionDeniedError, # type: ignore
838
+ object_=_response.json(),
839
+ ),
840
+ ),
841
+ )
842
+ if _response.status_code == 404:
843
+ raise NotFoundError(
844
+ headers=dict(_response.headers),
845
+ body=typing.cast(
846
+ NotFoundErrorBody,
847
+ parse_obj_as(
848
+ type_=NotFoundErrorBody, # type: ignore
849
+ object_=_response.json(),
850
+ ),
851
+ ),
852
+ )
853
+ if _response.status_code == 500:
854
+ raise InternalServerError(
855
+ headers=dict(_response.headers),
856
+ body=typing.cast(
857
+ DatabaseError,
858
+ parse_obj_as(
859
+ type_=DatabaseError, # type: ignore
860
+ object_=_response.json(),
861
+ ),
862
+ ),
863
+ )
864
+ _response_json = _response.json()
865
+ except JSONDecodeError:
866
+ raise ApiError(
867
+ status_code=_response.status_code,
868
+ headers=dict(_response.headers),
869
+ body=_response.text,
870
+ )
871
+ raise ApiError(
872
+ status_code=_response.status_code,
873
+ headers=dict(_response.headers),
874
+ body=_response_json,
875
+ )
876
+
877
+ async def update(
878
+ self,
879
+ organization_id: str,
880
+ project_id: str,
881
+ environment_id: str,
882
+ *,
883
+ name: typing.Optional[str] = OMIT,
884
+ slug: typing.Optional[str] = OMIT,
885
+ request_options: typing.Optional[RequestOptions] = None,
886
+ ) -> AsyncHttpResponse[EnvironmentsUpdateResponse]:
887
+ """
888
+ Parameters
889
+ ----------
890
+ organization_id : str
891
+
892
+ project_id : str
893
+
894
+ environment_id : str
895
+
896
+ name : typing.Optional[str]
897
+ a string at most 100 character(s) long
898
+
899
+ slug : typing.Optional[str]
900
+ a string matching the pattern ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
901
+
902
+ request_options : typing.Optional[RequestOptions]
903
+ Request-specific configuration.
904
+
905
+ Returns
906
+ -------
907
+ AsyncHttpResponse[EnvironmentsUpdateResponse]
908
+ Success
909
+ """
910
+ _response = await self._client_wrapper.httpx_client.request(
911
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
912
+ method="PUT",
913
+ json={
914
+ "name": name,
915
+ "slug": slug,
916
+ },
917
+ headers={
918
+ "content-type": "application/json",
919
+ },
920
+ request_options=request_options,
921
+ omit=OMIT,
922
+ )
923
+ try:
924
+ if 200 <= _response.status_code < 300:
925
+ _data = typing.cast(
926
+ EnvironmentsUpdateResponse,
927
+ parse_obj_as(
928
+ type_=EnvironmentsUpdateResponse, # type: ignore
929
+ object_=_response.json(),
930
+ ),
931
+ )
932
+ return AsyncHttpResponse(response=_response, data=_data)
933
+ if _response.status_code == 400:
934
+ raise BadRequestError(
935
+ headers=dict(_response.headers),
936
+ body=typing.cast(
937
+ HttpApiDecodeError,
938
+ parse_obj_as(
939
+ type_=HttpApiDecodeError, # type: ignore
940
+ object_=_response.json(),
941
+ ),
942
+ ),
943
+ )
944
+ if _response.status_code == 403:
945
+ raise ForbiddenError(
946
+ headers=dict(_response.headers),
947
+ body=typing.cast(
948
+ PermissionDeniedError,
949
+ parse_obj_as(
950
+ type_=PermissionDeniedError, # type: ignore
951
+ object_=_response.json(),
952
+ ),
953
+ ),
954
+ )
955
+ if _response.status_code == 404:
956
+ raise NotFoundError(
957
+ headers=dict(_response.headers),
958
+ body=typing.cast(
959
+ NotFoundErrorBody,
960
+ parse_obj_as(
961
+ type_=NotFoundErrorBody, # type: ignore
962
+ object_=_response.json(),
963
+ ),
964
+ ),
965
+ )
966
+ if _response.status_code == 409:
967
+ raise ConflictError(
968
+ headers=dict(_response.headers),
969
+ body=typing.cast(
970
+ AlreadyExistsError,
971
+ parse_obj_as(
972
+ type_=AlreadyExistsError, # type: ignore
973
+ object_=_response.json(),
974
+ ),
975
+ ),
976
+ )
977
+ if _response.status_code == 500:
978
+ raise InternalServerError(
979
+ headers=dict(_response.headers),
980
+ body=typing.cast(
981
+ DatabaseError,
982
+ parse_obj_as(
983
+ type_=DatabaseError, # type: ignore
984
+ object_=_response.json(),
985
+ ),
986
+ ),
987
+ )
988
+ _response_json = _response.json()
989
+ except JSONDecodeError:
990
+ raise ApiError(
991
+ status_code=_response.status_code,
992
+ headers=dict(_response.headers),
993
+ body=_response.text,
994
+ )
995
+ raise ApiError(
996
+ status_code=_response.status_code,
997
+ headers=dict(_response.headers),
998
+ body=_response_json,
999
+ )
1000
+
1001
+ async def delete(
1002
+ self,
1003
+ organization_id: str,
1004
+ project_id: str,
1005
+ environment_id: str,
1006
+ *,
1007
+ request_options: typing.Optional[RequestOptions] = None,
1008
+ ) -> AsyncHttpResponse[None]:
1009
+ """
1010
+ Parameters
1011
+ ----------
1012
+ organization_id : str
1013
+
1014
+ project_id : str
1015
+
1016
+ environment_id : str
1017
+
1018
+ request_options : typing.Optional[RequestOptions]
1019
+ Request-specific configuration.
1020
+
1021
+ Returns
1022
+ -------
1023
+ AsyncHttpResponse[None]
1024
+ """
1025
+ _response = await self._client_wrapper.httpx_client.request(
1026
+ f"organizations/{jsonable_encoder(organization_id)}/projects/{jsonable_encoder(project_id)}/environments/{jsonable_encoder(environment_id)}",
1027
+ method="DELETE",
1028
+ request_options=request_options,
1029
+ )
1030
+ try:
1031
+ if 200 <= _response.status_code < 300:
1032
+ return AsyncHttpResponse(response=_response, data=None)
1033
+ if _response.status_code == 400:
1034
+ raise BadRequestError(
1035
+ headers=dict(_response.headers),
1036
+ body=typing.cast(
1037
+ HttpApiDecodeError,
1038
+ parse_obj_as(
1039
+ type_=HttpApiDecodeError, # type: ignore
1040
+ object_=_response.json(),
1041
+ ),
1042
+ ),
1043
+ )
1044
+ if _response.status_code == 403:
1045
+ raise ForbiddenError(
1046
+ headers=dict(_response.headers),
1047
+ body=typing.cast(
1048
+ PermissionDeniedError,
1049
+ parse_obj_as(
1050
+ type_=PermissionDeniedError, # type: ignore
1051
+ object_=_response.json(),
1052
+ ),
1053
+ ),
1054
+ )
1055
+ if _response.status_code == 404:
1056
+ raise NotFoundError(
1057
+ headers=dict(_response.headers),
1058
+ body=typing.cast(
1059
+ NotFoundErrorBody,
1060
+ parse_obj_as(
1061
+ type_=NotFoundErrorBody, # type: ignore
1062
+ object_=_response.json(),
1063
+ ),
1064
+ ),
1065
+ )
1066
+ if _response.status_code == 500:
1067
+ raise InternalServerError(
1068
+ headers=dict(_response.headers),
1069
+ body=typing.cast(
1070
+ DatabaseError,
1071
+ parse_obj_as(
1072
+ type_=DatabaseError, # type: ignore
1073
+ object_=_response.json(),
1074
+ ),
1075
+ ),
1076
+ )
1077
+ _response_json = _response.json()
1078
+ except JSONDecodeError:
1079
+ raise ApiError(
1080
+ status_code=_response.status_code,
1081
+ headers=dict(_response.headers),
1082
+ body=_response.text,
1083
+ )
1084
+ raise ApiError(
1085
+ status_code=_response.status_code,
1086
+ headers=dict(_response.headers),
1087
+ body=_response_json,
1088
+ )