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