mirascope 2.0.0a5__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 (349) hide show
  1. mirascope/__init__.py +10 -1
  2. mirascope/_stubs.py +363 -0
  3. mirascope/api/__init__.py +8 -0
  4. mirascope/api/_generated/__init__.py +285 -2
  5. mirascope/api/_generated/annotations/__init__.py +33 -0
  6. mirascope/api/_generated/annotations/client.py +506 -0
  7. mirascope/api/_generated/annotations/raw_client.py +1414 -0
  8. mirascope/api/_generated/annotations/types/__init__.py +31 -0
  9. mirascope/api/_generated/annotations/types/annotations_create_request_label.py +5 -0
  10. mirascope/api/_generated/annotations/types/annotations_create_response.py +48 -0
  11. mirascope/api/_generated/annotations/types/annotations_create_response_label.py +5 -0
  12. mirascope/api/_generated/annotations/types/annotations_get_response.py +48 -0
  13. mirascope/api/_generated/annotations/types/annotations_get_response_label.py +5 -0
  14. mirascope/api/_generated/annotations/types/annotations_list_request_label.py +5 -0
  15. mirascope/api/_generated/annotations/types/annotations_list_response.py +21 -0
  16. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item.py +50 -0
  17. mirascope/api/_generated/annotations/types/annotations_list_response_annotations_item_label.py +5 -0
  18. mirascope/api/_generated/annotations/types/annotations_update_request_label.py +5 -0
  19. mirascope/api/_generated/annotations/types/annotations_update_response.py +48 -0
  20. mirascope/api/_generated/annotations/types/annotations_update_response_label.py +5 -0
  21. mirascope/api/_generated/api_keys/__init__.py +12 -2
  22. mirascope/api/_generated/api_keys/client.py +77 -0
  23. mirascope/api/_generated/api_keys/raw_client.py +422 -39
  24. mirascope/api/_generated/api_keys/types/__init__.py +7 -1
  25. mirascope/api/_generated/api_keys/types/api_keys_create_response.py +4 -12
  26. mirascope/api/_generated/api_keys/types/api_keys_get_response.py +4 -12
  27. mirascope/api/_generated/api_keys/types/api_keys_list_all_for_org_response_item.py +40 -0
  28. mirascope/api/_generated/api_keys/types/api_keys_list_response_item.py +4 -12
  29. mirascope/api/_generated/client.py +42 -0
  30. mirascope/api/_generated/core/client_wrapper.py +2 -14
  31. mirascope/api/_generated/core/datetime_utils.py +1 -3
  32. mirascope/api/_generated/core/file.py +2 -5
  33. mirascope/api/_generated/core/http_client.py +36 -112
  34. mirascope/api/_generated/core/jsonable_encoder.py +1 -3
  35. mirascope/api/_generated/core/pydantic_utilities.py +19 -74
  36. mirascope/api/_generated/core/query_encoder.py +1 -3
  37. mirascope/api/_generated/core/serialization.py +4 -10
  38. mirascope/api/_generated/docs/client.py +2 -6
  39. mirascope/api/_generated/docs/raw_client.py +51 -5
  40. mirascope/api/_generated/environment.py +3 -3
  41. mirascope/api/_generated/environments/__init__.py +6 -0
  42. mirascope/api/_generated/environments/client.py +117 -0
  43. mirascope/api/_generated/environments/raw_client.py +530 -51
  44. mirascope/api/_generated/environments/types/__init__.py +10 -0
  45. mirascope/api/_generated/environments/types/environments_create_response.py +1 -3
  46. mirascope/api/_generated/environments/types/environments_get_analytics_response.py +60 -0
  47. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_functions_item.py +24 -0
  48. mirascope/api/_generated/environments/types/environments_get_analytics_response_top_models_item.py +22 -0
  49. mirascope/api/_generated/environments/types/environments_get_response.py +1 -3
  50. mirascope/api/_generated/environments/types/environments_list_response_item.py +1 -3
  51. mirascope/api/_generated/environments/types/environments_update_response.py +1 -3
  52. mirascope/api/_generated/errors/__init__.py +8 -0
  53. mirascope/api/_generated/errors/bad_request_error.py +1 -2
  54. mirascope/api/_generated/errors/conflict_error.py +1 -2
  55. mirascope/api/_generated/errors/forbidden_error.py +1 -5
  56. mirascope/api/_generated/errors/internal_server_error.py +1 -6
  57. mirascope/api/_generated/errors/not_found_error.py +1 -5
  58. mirascope/api/_generated/errors/payment_required_error.py +15 -0
  59. mirascope/api/_generated/errors/service_unavailable_error.py +14 -0
  60. mirascope/api/_generated/errors/too_many_requests_error.py +15 -0
  61. mirascope/api/_generated/errors/unauthorized_error.py +11 -0
  62. mirascope/api/_generated/functions/__init__.py +39 -0
  63. mirascope/api/_generated/functions/client.py +647 -0
  64. mirascope/api/_generated/functions/raw_client.py +1890 -0
  65. mirascope/api/_generated/functions/types/__init__.py +53 -0
  66. mirascope/api/_generated/functions/types/functions_create_request_dependencies_value.py +20 -0
  67. mirascope/api/_generated/functions/types/functions_create_response.py +37 -0
  68. mirascope/api/_generated/functions/types/functions_create_response_dependencies_value.py +20 -0
  69. mirascope/api/_generated/functions/types/functions_find_by_hash_response.py +39 -0
  70. mirascope/api/_generated/functions/types/functions_find_by_hash_response_dependencies_value.py +20 -0
  71. mirascope/api/_generated/functions/types/functions_get_by_env_response.py +53 -0
  72. mirascope/api/_generated/functions/types/functions_get_by_env_response_dependencies_value.py +22 -0
  73. mirascope/api/_generated/functions/types/functions_get_response.py +37 -0
  74. mirascope/api/_generated/functions/types/functions_get_response_dependencies_value.py +20 -0
  75. mirascope/api/_generated/functions/types/functions_list_by_env_response.py +25 -0
  76. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item.py +56 -0
  77. mirascope/api/_generated/functions/types/functions_list_by_env_response_functions_item_dependencies_value.py +22 -0
  78. mirascope/api/_generated/functions/types/functions_list_response.py +21 -0
  79. mirascope/api/_generated/functions/types/functions_list_response_functions_item.py +41 -0
  80. mirascope/api/_generated/functions/types/functions_list_response_functions_item_dependencies_value.py +20 -0
  81. mirascope/api/_generated/health/client.py +2 -6
  82. mirascope/api/_generated/health/raw_client.py +51 -5
  83. mirascope/api/_generated/health/types/health_check_response.py +1 -3
  84. mirascope/api/_generated/organization_invitations/__init__.py +33 -0
  85. mirascope/api/_generated/organization_invitations/client.py +546 -0
  86. mirascope/api/_generated/organization_invitations/raw_client.py +1519 -0
  87. mirascope/api/_generated/organization_invitations/types/__init__.py +53 -0
  88. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response.py +34 -0
  89. mirascope/api/_generated/organization_invitations/types/organization_invitations_accept_response_role.py +7 -0
  90. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_request_role.py +7 -0
  91. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response.py +48 -0
  92. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_role.py +7 -0
  93. mirascope/api/_generated/organization_invitations/types/organization_invitations_create_response_status.py +7 -0
  94. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response.py +48 -0
  95. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_role.py +7 -0
  96. mirascope/api/_generated/organization_invitations/types/organization_invitations_get_response_status.py +7 -0
  97. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item.py +48 -0
  98. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_role.py +7 -0
  99. mirascope/api/_generated/organization_invitations/types/organization_invitations_list_response_item_status.py +7 -0
  100. mirascope/api/_generated/organization_memberships/__init__.py +19 -0
  101. mirascope/api/_generated/organization_memberships/client.py +302 -0
  102. mirascope/api/_generated/organization_memberships/raw_client.py +736 -0
  103. mirascope/api/_generated/organization_memberships/types/__init__.py +27 -0
  104. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item.py +33 -0
  105. mirascope/api/_generated/organization_memberships/types/organization_memberships_list_response_item_role.py +7 -0
  106. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_request_role.py +7 -0
  107. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response.py +31 -0
  108. mirascope/api/_generated/organization_memberships/types/organization_memberships_update_response_role.py +7 -0
  109. mirascope/api/_generated/organizations/__init__.py +26 -0
  110. mirascope/api/_generated/organizations/client.py +465 -0
  111. mirascope/api/_generated/organizations/raw_client.py +1799 -108
  112. mirascope/api/_generated/organizations/types/__init__.py +48 -0
  113. mirascope/api/_generated/organizations/types/organizations_create_payment_intent_response.py +24 -0
  114. mirascope/api/_generated/organizations/types/organizations_create_response.py +4 -3
  115. mirascope/api/_generated/organizations/types/organizations_create_response_role.py +1 -3
  116. mirascope/api/_generated/organizations/types/organizations_get_response.py +4 -3
  117. mirascope/api/_generated/organizations/types/organizations_get_response_role.py +1 -3
  118. mirascope/api/_generated/organizations/types/organizations_list_response_item.py +4 -3
  119. mirascope/api/_generated/organizations/types/organizations_list_response_item_role.py +1 -3
  120. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_request_target_plan.py +7 -0
  121. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response.py +47 -0
  122. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item.py +33 -0
  123. mirascope/api/_generated/organizations/types/organizations_preview_subscription_change_response_validation_errors_item_resource.py +7 -0
  124. mirascope/api/_generated/organizations/types/organizations_router_balance_response.py +24 -0
  125. mirascope/api/_generated/organizations/types/organizations_subscription_response.py +53 -0
  126. mirascope/api/_generated/organizations/types/organizations_subscription_response_current_plan.py +7 -0
  127. mirascope/api/_generated/organizations/types/organizations_subscription_response_payment_method.py +26 -0
  128. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change.py +34 -0
  129. mirascope/api/_generated/organizations/types/organizations_subscription_response_scheduled_change_target_plan.py +7 -0
  130. mirascope/api/_generated/organizations/types/organizations_update_response.py +4 -3
  131. mirascope/api/_generated/organizations/types/organizations_update_response_role.py +1 -3
  132. mirascope/api/_generated/organizations/types/organizations_update_subscription_request_target_plan.py +7 -0
  133. mirascope/api/_generated/organizations/types/organizations_update_subscription_response.py +35 -0
  134. mirascope/api/_generated/project_memberships/__init__.py +25 -0
  135. mirascope/api/_generated/project_memberships/client.py +437 -0
  136. mirascope/api/_generated/project_memberships/raw_client.py +1039 -0
  137. mirascope/api/_generated/project_memberships/types/__init__.py +29 -0
  138. mirascope/api/_generated/project_memberships/types/project_memberships_create_request_role.py +7 -0
  139. mirascope/api/_generated/project_memberships/types/project_memberships_create_response.py +35 -0
  140. mirascope/api/_generated/project_memberships/types/project_memberships_create_response_role.py +7 -0
  141. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item.py +33 -0
  142. mirascope/api/_generated/project_memberships/types/project_memberships_list_response_item_role.py +7 -0
  143. mirascope/api/_generated/project_memberships/types/project_memberships_update_request_role.py +7 -0
  144. mirascope/api/_generated/project_memberships/types/project_memberships_update_response.py +35 -0
  145. mirascope/api/_generated/project_memberships/types/project_memberships_update_response_role.py +7 -0
  146. mirascope/api/_generated/projects/__init__.py +2 -12
  147. mirascope/api/_generated/projects/client.py +17 -71
  148. mirascope/api/_generated/projects/raw_client.py +295 -51
  149. mirascope/api/_generated/projects/types/__init__.py +1 -6
  150. mirascope/api/_generated/projects/types/projects_create_response.py +3 -9
  151. mirascope/api/_generated/projects/types/projects_get_response.py +3 -9
  152. mirascope/api/_generated/projects/types/projects_list_response_item.py +3 -9
  153. mirascope/api/_generated/projects/types/projects_update_response.py +3 -9
  154. mirascope/api/_generated/reference.md +3619 -182
  155. mirascope/api/_generated/tags/__init__.py +19 -0
  156. mirascope/api/_generated/tags/client.py +504 -0
  157. mirascope/api/_generated/tags/raw_client.py +1288 -0
  158. mirascope/api/_generated/tags/types/__init__.py +17 -0
  159. mirascope/api/_generated/tags/types/tags_create_response.py +41 -0
  160. mirascope/api/_generated/tags/types/tags_get_response.py +41 -0
  161. mirascope/api/_generated/tags/types/tags_list_response.py +23 -0
  162. mirascope/api/_generated/tags/types/tags_list_response_tags_item.py +41 -0
  163. mirascope/api/_generated/tags/types/tags_update_response.py +41 -0
  164. mirascope/api/_generated/token_cost/__init__.py +7 -0
  165. mirascope/api/_generated/token_cost/client.py +160 -0
  166. mirascope/api/_generated/token_cost/raw_client.py +264 -0
  167. mirascope/api/_generated/token_cost/types/__init__.py +8 -0
  168. mirascope/api/_generated/token_cost/types/token_cost_calculate_request_usage.py +54 -0
  169. mirascope/api/_generated/token_cost/types/token_cost_calculate_response.py +52 -0
  170. mirascope/api/_generated/traces/__init__.py +42 -0
  171. mirascope/api/_generated/traces/client.py +941 -0
  172. mirascope/api/_generated/traces/raw_client.py +2177 -23
  173. mirascope/api/_generated/traces/types/__init__.py +60 -0
  174. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item.py +4 -11
  175. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource.py +2 -6
  176. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item.py +1 -3
  177. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value.py +8 -24
  178. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_array_value.py +2 -6
  179. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value.py +3 -9
  180. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_resource_attributes_item_value_kvlist_value_values_item.py +2 -6
  181. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item.py +3 -9
  182. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope.py +4 -8
  183. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item.py +2 -6
  184. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value.py +8 -24
  185. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_array_value.py +2 -6
  186. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value.py +3 -9
  187. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_scope_attributes_item_value_kvlist_value_values_item.py +1 -3
  188. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item.py +6 -18
  189. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item.py +3 -9
  190. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value.py +8 -24
  191. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_array_value.py +2 -6
  192. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value.py +2 -6
  193. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_attributes_item_value_kvlist_value_values_item.py +1 -3
  194. mirascope/api/_generated/traces/types/traces_create_request_resource_spans_item_scope_spans_item_spans_item_status.py +2 -6
  195. mirascope/api/_generated/traces/types/traces_create_response.py +2 -5
  196. mirascope/api/_generated/traces/types/traces_create_response_partial_success.py +3 -9
  197. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response.py +60 -0
  198. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_functions_item.py +24 -0
  199. mirascope/api/_generated/traces/types/traces_get_analytics_summary_response_top_models_item.py +22 -0
  200. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response.py +33 -0
  201. mirascope/api/_generated/traces/types/traces_get_trace_detail_by_env_response_spans_item.py +88 -0
  202. mirascope/api/_generated/traces/types/traces_get_trace_detail_response.py +33 -0
  203. mirascope/api/_generated/traces/types/traces_get_trace_detail_response_spans_item.py +88 -0
  204. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response.py +25 -0
  205. mirascope/api/_generated/traces/types/traces_list_by_function_hash_response_traces_item.py +44 -0
  206. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item.py +26 -0
  207. mirascope/api/_generated/traces/types/traces_search_by_env_request_attribute_filters_item_operator.py +7 -0
  208. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_by.py +7 -0
  209. mirascope/api/_generated/traces/types/traces_search_by_env_request_sort_order.py +7 -0
  210. mirascope/api/_generated/traces/types/traces_search_by_env_response.py +26 -0
  211. mirascope/api/_generated/traces/types/traces_search_by_env_response_spans_item.py +50 -0
  212. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item.py +26 -0
  213. mirascope/api/_generated/traces/types/traces_search_request_attribute_filters_item_operator.py +7 -0
  214. mirascope/api/_generated/traces/types/traces_search_request_sort_by.py +7 -0
  215. mirascope/api/_generated/traces/types/traces_search_request_sort_order.py +5 -0
  216. mirascope/api/_generated/traces/types/traces_search_response.py +26 -0
  217. mirascope/api/_generated/traces/types/traces_search_response_spans_item.py +50 -0
  218. mirascope/api/_generated/types/__init__.py +48 -0
  219. mirascope/api/_generated/types/already_exists_error.py +1 -3
  220. mirascope/api/_generated/types/bad_request_error_body.py +50 -0
  221. mirascope/api/_generated/types/click_house_error.py +22 -0
  222. mirascope/api/_generated/types/database_error.py +1 -3
  223. mirascope/api/_generated/types/date.py +3 -0
  224. mirascope/api/_generated/types/http_api_decode_error.py +1 -3
  225. mirascope/api/_generated/types/immutable_resource_error.py +22 -0
  226. mirascope/api/_generated/types/internal_server_error_body.py +49 -0
  227. mirascope/api/_generated/types/issue.py +1 -3
  228. mirascope/api/_generated/types/issue_tag.py +1 -8
  229. mirascope/api/_generated/types/not_found_error_body.py +1 -3
  230. mirascope/api/_generated/types/number_from_string.py +3 -0
  231. mirascope/api/_generated/types/permission_denied_error.py +1 -3
  232. mirascope/api/_generated/types/permission_denied_error_tag.py +1 -3
  233. mirascope/api/_generated/types/plan_limit_exceeded_error.py +32 -0
  234. mirascope/api/_generated/types/plan_limit_exceeded_error_tag.py +7 -0
  235. mirascope/api/_generated/types/pricing_unavailable_error.py +23 -0
  236. mirascope/api/_generated/types/property_key_key.py +1 -3
  237. mirascope/api/_generated/types/rate_limit_error.py +31 -0
  238. mirascope/api/_generated/types/rate_limit_error_tag.py +5 -0
  239. mirascope/api/_generated/types/service_unavailable_error_body.py +24 -0
  240. mirascope/api/_generated/types/service_unavailable_error_tag.py +7 -0
  241. mirascope/api/_generated/types/stripe_error.py +20 -0
  242. mirascope/api/_generated/types/subscription_past_due_error.py +31 -0
  243. mirascope/api/_generated/types/subscription_past_due_error_tag.py +7 -0
  244. mirascope/api/_generated/types/unauthorized_error_body.py +21 -0
  245. mirascope/api/_generated/types/unauthorized_error_tag.py +5 -0
  246. mirascope/api/settings.py +19 -1
  247. mirascope/llm/__init__.py +55 -8
  248. mirascope/llm/calls/__init__.py +2 -1
  249. mirascope/llm/calls/calls.py +3 -1
  250. mirascope/llm/calls/decorator.py +21 -7
  251. mirascope/llm/content/tool_call.py +6 -0
  252. mirascope/llm/content/tool_output.py +22 -5
  253. mirascope/llm/exceptions.py +284 -71
  254. mirascope/llm/formatting/__init__.py +19 -2
  255. mirascope/llm/formatting/format.py +219 -30
  256. mirascope/llm/formatting/output_parser.py +178 -0
  257. mirascope/llm/formatting/partial.py +80 -7
  258. mirascope/llm/formatting/primitives.py +192 -0
  259. mirascope/llm/formatting/types.py +21 -64
  260. mirascope/llm/mcp/__init__.py +2 -2
  261. mirascope/llm/mcp/mcp_client.py +130 -0
  262. mirascope/llm/messages/__init__.py +3 -0
  263. mirascope/llm/messages/_utils.py +34 -0
  264. mirascope/llm/models/__init__.py +5 -0
  265. mirascope/llm/models/models.py +137 -69
  266. mirascope/llm/{providers/base → models}/params.py +16 -37
  267. mirascope/llm/models/thinking_config.py +61 -0
  268. mirascope/llm/prompts/_utils.py +0 -32
  269. mirascope/llm/prompts/decorator.py +16 -5
  270. mirascope/llm/prompts/prompts.py +131 -68
  271. mirascope/llm/providers/__init__.py +18 -2
  272. mirascope/llm/providers/anthropic/__init__.py +3 -21
  273. mirascope/llm/providers/anthropic/_utils/__init__.py +2 -0
  274. mirascope/llm/providers/anthropic/_utils/beta_decode.py +22 -11
  275. mirascope/llm/providers/anthropic/_utils/beta_encode.py +75 -25
  276. mirascope/llm/providers/anthropic/_utils/decode.py +22 -11
  277. mirascope/llm/providers/anthropic/_utils/encode.py +82 -20
  278. mirascope/llm/providers/anthropic/_utils/errors.py +2 -2
  279. mirascope/llm/providers/anthropic/beta_provider.py +64 -18
  280. mirascope/llm/providers/anthropic/provider.py +91 -33
  281. mirascope/llm/providers/base/__init__.py +0 -2
  282. mirascope/llm/providers/base/_utils.py +55 -11
  283. mirascope/llm/providers/base/base_provider.py +116 -37
  284. mirascope/llm/providers/google/__init__.py +2 -17
  285. mirascope/llm/providers/google/_utils/__init__.py +2 -0
  286. mirascope/llm/providers/google/_utils/decode.py +37 -15
  287. mirascope/llm/providers/google/_utils/encode.py +127 -19
  288. mirascope/llm/providers/google/_utils/errors.py +3 -2
  289. mirascope/llm/providers/google/model_info.py +1 -0
  290. mirascope/llm/providers/google/provider.py +68 -19
  291. mirascope/llm/providers/mirascope/__init__.py +5 -0
  292. mirascope/llm/providers/mirascope/_utils.py +73 -0
  293. mirascope/llm/providers/mirascope/provider.py +349 -0
  294. mirascope/llm/providers/mlx/__init__.py +2 -17
  295. mirascope/llm/providers/mlx/_utils.py +8 -3
  296. mirascope/llm/providers/mlx/encoding/base.py +5 -2
  297. mirascope/llm/providers/mlx/encoding/transformers.py +5 -2
  298. mirascope/llm/providers/mlx/mlx.py +23 -6
  299. mirascope/llm/providers/mlx/provider.py +42 -13
  300. mirascope/llm/providers/ollama/__init__.py +1 -13
  301. mirascope/llm/providers/openai/_utils/errors.py +2 -2
  302. mirascope/llm/providers/openai/completions/__init__.py +2 -20
  303. mirascope/llm/providers/openai/completions/_utils/decode.py +14 -3
  304. mirascope/llm/providers/openai/completions/_utils/encode.py +35 -28
  305. mirascope/llm/providers/openai/completions/base_provider.py +40 -11
  306. mirascope/llm/providers/openai/provider.py +40 -10
  307. mirascope/llm/providers/openai/responses/__init__.py +1 -17
  308. mirascope/llm/providers/openai/responses/_utils/__init__.py +2 -0
  309. mirascope/llm/providers/openai/responses/_utils/decode.py +21 -8
  310. mirascope/llm/providers/openai/responses/_utils/encode.py +59 -19
  311. mirascope/llm/providers/openai/responses/provider.py +56 -18
  312. mirascope/llm/providers/provider_id.py +1 -0
  313. mirascope/llm/providers/provider_registry.py +96 -19
  314. mirascope/llm/providers/together/__init__.py +1 -13
  315. mirascope/llm/responses/__init__.py +6 -1
  316. mirascope/llm/responses/_utils.py +102 -12
  317. mirascope/llm/responses/base_response.py +5 -2
  318. mirascope/llm/responses/base_stream_response.py +139 -45
  319. mirascope/llm/responses/response.py +2 -1
  320. mirascope/llm/responses/root_response.py +89 -17
  321. mirascope/llm/responses/stream_response.py +6 -9
  322. mirascope/llm/tools/decorator.py +17 -8
  323. mirascope/llm/tools/tool_schema.py +43 -10
  324. mirascope/llm/tools/toolkit.py +35 -27
  325. mirascope/llm/tools/tools.py +123 -30
  326. mirascope/ops/__init__.py +64 -109
  327. mirascope/ops/_internal/configuration.py +82 -31
  328. mirascope/ops/_internal/exporters/exporters.py +64 -11
  329. mirascope/ops/_internal/instrumentation/llm/common.py +530 -0
  330. mirascope/ops/_internal/instrumentation/llm/cost.py +190 -0
  331. mirascope/ops/_internal/instrumentation/llm/encode.py +1 -1
  332. mirascope/ops/_internal/instrumentation/llm/llm.py +116 -1243
  333. mirascope/ops/_internal/instrumentation/llm/model.py +1798 -0
  334. mirascope/ops/_internal/instrumentation/llm/response.py +521 -0
  335. mirascope/ops/_internal/instrumentation/llm/serialize.py +300 -0
  336. mirascope/ops/_internal/protocols.py +83 -1
  337. mirascope/ops/_internal/traced_calls.py +4 -0
  338. mirascope/ops/_internal/traced_functions.py +141 -12
  339. mirascope/ops/_internal/tracing.py +78 -1
  340. mirascope/ops/_internal/utils.py +52 -4
  341. mirascope/ops/_internal/versioned_functions.py +54 -43
  342. {mirascope-2.0.0a5.dist-info → mirascope-2.0.1.dist-info}/METADATA +14 -13
  343. mirascope-2.0.1.dist-info/RECORD +423 -0
  344. {mirascope-2.0.0a5.dist-info → mirascope-2.0.1.dist-info}/licenses/LICENSE +1 -1
  345. mirascope/llm/formatting/_utils.py +0 -78
  346. mirascope/llm/mcp/client.py +0 -118
  347. mirascope/llm/providers/_missing_import_stubs.py +0 -49
  348. mirascope-2.0.0a5.dist-info/RECORD +0 -265
  349. {mirascope-2.0.0a5.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
+ )