agenta 0.48.8__py3-none-any.whl → 0.48.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of agenta might be problematic. Click here for more details.

Files changed (297) hide show
  1. agenta/__init__.py +3 -2
  2. agenta/client/Readme.md +258 -80
  3. agenta/client/__init__.py +205 -29
  4. agenta/client/backend/__init__.py +461 -0
  5. agenta/client/backend/access_control/__init__.py +2 -0
  6. agenta/client/backend/access_control/client.py +53 -73
  7. agenta/client/backend/access_control/raw_client.py +180 -0
  8. agenta/client/backend/admin/__init__.py +2 -0
  9. agenta/client/backend/admin/client.py +473 -268
  10. agenta/client/backend/admin/raw_client.py +1017 -0
  11. agenta/client/backend/api_keys/__init__.py +2 -0
  12. agenta/client/backend/api_keys/client.py +43 -276
  13. agenta/client/backend/api_keys/raw_client.py +364 -0
  14. agenta/client/backend/apps/__init__.py +2 -0
  15. agenta/client/backend/apps/client.py +132 -895
  16. agenta/client/backend/apps/raw_client.py +1516 -0
  17. agenta/client/backend/bases/__init__.py +2 -0
  18. agenta/client/backend/bases/client.py +33 -73
  19. agenta/client/backend/bases/raw_client.py +179 -0
  20. agenta/client/backend/billing/__init__.py +3 -0
  21. agenta/client/backend/billing/client.py +564 -0
  22. agenta/client/backend/billing/raw_client.py +805 -0
  23. agenta/client/backend/client.py +1268 -0
  24. agenta/client/backend/configs/__init__.py +2 -0
  25. agenta/client/backend/configs/client.py +49 -361
  26. agenta/client/backend/configs/raw_client.py +402 -0
  27. agenta/client/backend/containers/__init__.py +1 -3
  28. agenta/client/backend/containers/client.py +25 -548
  29. agenta/client/backend/containers/raw_client.py +112 -0
  30. agenta/client/backend/core/__init__.py +5 -0
  31. agenta/client/backend/core/api_error.py +12 -6
  32. agenta/client/backend/core/client_wrapper.py +4 -4
  33. agenta/client/backend/core/file.py +1 -3
  34. agenta/client/backend/core/force_multipart.py +16 -0
  35. agenta/client/backend/core/http_client.py +78 -34
  36. agenta/client/backend/core/http_response.py +55 -0
  37. agenta/client/backend/core/jsonable_encoder.py +0 -1
  38. agenta/client/backend/core/pydantic_utilities.py +88 -113
  39. agenta/client/backend/core/serialization.py +9 -3
  40. agenta/client/backend/environment.py +7 -0
  41. agenta/client/backend/environments/__init__.py +2 -0
  42. agenta/client/backend/environments/client.py +43 -79
  43. agenta/client/backend/environments/raw_client.py +193 -0
  44. agenta/client/backend/errors/__init__.py +2 -0
  45. agenta/client/backend/errors/unprocessable_entity_error.py +8 -2
  46. agenta/client/backend/evals/__init__.py +3 -0
  47. agenta/client/backend/evals/client.py +1042 -0
  48. agenta/client/backend/evals/raw_client.py +1549 -0
  49. agenta/client/backend/evaluations/__init__.py +2 -0
  50. agenta/client/backend/evaluations/client.py +106 -590
  51. agenta/client/backend/evaluations/raw_client.py +1344 -0
  52. agenta/client/backend/evaluators/__init__.py +2 -0
  53. agenta/client/backend/evaluators/client.py +99 -516
  54. agenta/client/backend/evaluators/raw_client.py +1182 -0
  55. agenta/client/backend/human_evaluations/__init__.py +2 -0
  56. agenta/client/backend/human_evaluations/client.py +120 -680
  57. agenta/client/backend/human_evaluations/raw_client.py +1577 -0
  58. agenta/client/backend/observability/__init__.py +14 -2
  59. agenta/client/backend/observability/client.py +185 -341
  60. agenta/client/backend/observability/raw_client.py +943 -0
  61. agenta/client/backend/observability/types/__init__.py +10 -2
  62. agenta/client/backend/observability/types/{format.py → fetch_trace_by_id_request_trace_id.py} +1 -1
  63. agenta/client/backend/observability/types/fetch_trace_by_id_response.py +15 -0
  64. agenta/client/backend/observability/types/query_analytics_response.py +2 -1
  65. agenta/client/backend/observability/types/query_traces_response.py +7 -3
  66. agenta/client/backend/organization/__init__.py +2 -0
  67. agenta/client/backend/organization/client.py +105 -361
  68. agenta/client/backend/organization/raw_client.py +774 -0
  69. agenta/client/backend/raw_client.py +1432 -0
  70. agenta/client/backend/scopes/__init__.py +2 -0
  71. agenta/client/backend/scopes/client.py +31 -45
  72. agenta/client/backend/scopes/raw_client.py +105 -0
  73. agenta/client/backend/testsets/__init__.py +14 -0
  74. agenta/client/backend/testsets/client.py +1098 -653
  75. agenta/client/backend/testsets/raw_client.py +2348 -0
  76. agenta/client/backend/testsets/types/__init__.py +17 -0
  77. agenta/client/backend/testsets/types/create_testset_from_file_request_file_type.py +7 -0
  78. agenta/client/backend/testsets/types/fetch_testset_to_file_request_file_type.py +7 -0
  79. agenta/client/backend/testsets/types/update_testset_from_file_request_file_type.py +7 -0
  80. agenta/client/backend/tracing/__init__.py +7 -0
  81. agenta/client/backend/tracing/client.py +782 -0
  82. agenta/client/backend/tracing/raw_client.py +1223 -0
  83. agenta/client/backend/tracing/types/__init__.py +8 -0
  84. agenta/client/backend/{types/variant_action_enum.py → tracing/types/fetch_trace_request_trace_id.py} +1 -1
  85. agenta/client/backend/tracing/types/remove_trace_request_trace_id.py +5 -0
  86. agenta/client/backend/types/__init__.py +153 -26
  87. agenta/client/backend/types/account_request.py +24 -0
  88. agenta/client/backend/types/account_response.py +5 -7
  89. agenta/client/backend/types/agenta_node_dto.py +13 -13
  90. agenta/client/backend/types/agenta_node_dto_nodes_value.py +1 -0
  91. agenta/client/backend/types/agenta_nodes_response.py +14 -8
  92. agenta/client/backend/types/agenta_root_dto.py +16 -8
  93. agenta/client/backend/types/agenta_roots_response.py +16 -8
  94. agenta/client/backend/types/agenta_tree_dto.py +16 -8
  95. agenta/client/backend/types/agenta_trees_response.py +16 -8
  96. agenta/client/backend/types/aggregated_result.py +5 -7
  97. agenta/client/backend/types/aggregated_result_evaluator_config.py +1 -0
  98. agenta/client/backend/types/analytics_response.py +4 -6
  99. agenta/client/backend/types/annotation.py +50 -0
  100. agenta/client/backend/types/annotation_create.py +39 -0
  101. agenta/client/backend/types/annotation_edit.py +31 -0
  102. agenta/client/backend/types/annotation_kind.py +5 -0
  103. agenta/client/backend/types/{uri.py → annotation_link.py} +6 -7
  104. agenta/client/backend/types/{provider_key_dto.py → annotation_link_response.py} +6 -7
  105. agenta/client/backend/types/annotation_query.py +40 -0
  106. agenta/client/backend/types/annotation_query_request.py +20 -0
  107. agenta/client/backend/types/annotation_reference.py +21 -0
  108. agenta/client/backend/types/annotation_references.py +22 -0
  109. agenta/client/backend/types/{docker_env_vars.py → annotation_response.py} +6 -7
  110. agenta/client/backend/types/annotation_source.py +5 -0
  111. agenta/client/backend/types/annotations_response.py +24 -0
  112. agenta/client/backend/types/app.py +3 -5
  113. agenta/client/backend/types/app_variant_response.py +3 -6
  114. agenta/client/backend/types/app_variant_revision.py +5 -6
  115. agenta/client/backend/types/artifact.py +44 -0
  116. agenta/client/backend/types/base_output.py +3 -5
  117. agenta/client/backend/types/body_fetch_workflow_revision.py +21 -0
  118. agenta/client/backend/types/body_import_testset.py +3 -5
  119. agenta/client/backend/types/bucket_dto.py +4 -6
  120. agenta/client/backend/types/collect_status_response.py +3 -5
  121. agenta/client/backend/types/config_db.py +3 -5
  122. agenta/client/backend/types/config_dto.py +5 -7
  123. agenta/client/backend/types/config_response_model.py +5 -7
  124. agenta/client/backend/types/correct_answer.py +3 -5
  125. agenta/client/backend/types/create_app_output.py +3 -5
  126. agenta/client/backend/types/custom_model_settings_dto.py +3 -5
  127. agenta/client/backend/types/custom_provider_dto.py +6 -9
  128. agenta/client/backend/types/custom_provider_kind.py +5 -5
  129. agenta/client/backend/types/custom_provider_settings_dto.py +3 -5
  130. agenta/client/backend/types/data.py +2 -1
  131. agenta/client/backend/types/delete_evaluation.py +3 -5
  132. agenta/client/backend/types/environment_output.py +3 -5
  133. agenta/client/backend/types/environment_output_extended.py +4 -6
  134. agenta/client/backend/types/environment_revision.py +5 -5
  135. agenta/client/backend/types/error.py +3 -5
  136. agenta/client/backend/types/evaluation.py +6 -8
  137. agenta/client/backend/types/evaluation_scenario.py +5 -7
  138. agenta/client/backend/types/evaluation_scenario_input.py +3 -5
  139. agenta/client/backend/types/evaluation_scenario_output.py +4 -6
  140. agenta/client/backend/types/evaluation_scenario_result.py +4 -6
  141. agenta/client/backend/types/evaluator.py +31 -12
  142. agenta/client/backend/types/evaluator_config.py +3 -5
  143. agenta/client/backend/types/evaluator_flags.py +21 -0
  144. agenta/client/backend/types/evaluator_mapping_output_interface.py +3 -5
  145. agenta/client/backend/types/evaluator_output_interface.py +3 -5
  146. agenta/client/backend/types/evaluator_query.py +32 -0
  147. agenta/client/backend/types/evaluator_query_request.py +30 -0
  148. agenta/client/backend/types/evaluator_request.py +20 -0
  149. agenta/client/backend/types/evaluator_response.py +21 -0
  150. agenta/client/backend/types/evaluators_response.py +21 -0
  151. agenta/client/backend/types/exception_dto.py +3 -5
  152. agenta/client/backend/types/{o_tel_spans_response.py → extended_o_tel_tracing_response.py} +5 -7
  153. agenta/client/backend/types/focus.py +5 -0
  154. agenta/client/backend/types/format.py +5 -0
  155. agenta/client/backend/types/full_json_input.py +34 -0
  156. agenta/client/backend/types/full_json_output.py +29 -0
  157. agenta/client/backend/types/get_config_response.py +3 -5
  158. agenta/client/backend/types/{header_dto.py → header.py} +4 -6
  159. agenta/client/backend/types/http_validation_error.py +4 -6
  160. agenta/client/backend/types/human_evaluation.py +3 -5
  161. agenta/client/backend/types/human_evaluation_scenario.py +4 -6
  162. agenta/client/backend/types/human_evaluation_scenario_input.py +3 -5
  163. agenta/client/backend/types/human_evaluation_scenario_output.py +3 -5
  164. agenta/client/backend/types/invite_request.py +4 -6
  165. agenta/client/backend/types/legacy_analytics_response.py +4 -6
  166. agenta/client/backend/types/legacy_data_point.py +3 -5
  167. agenta/client/backend/types/legacy_evaluator.py +26 -0
  168. agenta/client/backend/types/legacy_scope_request.py +4 -6
  169. agenta/client/backend/types/legacy_scopes_response.py +3 -5
  170. agenta/client/backend/types/legacy_subscription_request.py +19 -0
  171. agenta/client/backend/types/legacy_user_request.py +5 -7
  172. agenta/client/backend/types/legacy_user_response.py +3 -5
  173. agenta/client/backend/types/lifecycle_dto.py +3 -5
  174. agenta/client/backend/types/link_dto.py +4 -6
  175. agenta/client/backend/types/list_api_keys_response.py +3 -5
  176. agenta/client/backend/types/llm_run_rate_limit.py +3 -5
  177. agenta/client/backend/types/meta_request.py +30 -0
  178. agenta/client/backend/types/metrics_dto.py +3 -5
  179. agenta/client/backend/types/new_testset.py +3 -5
  180. agenta/client/backend/types/node_dto.py +4 -6
  181. agenta/client/backend/types/o_tel_context_dto.py +3 -5
  182. agenta/client/backend/types/o_tel_event.py +35 -0
  183. agenta/client/backend/types/o_tel_event_dto.py +3 -5
  184. agenta/client/backend/types/o_tel_extra_dto.py +4 -6
  185. agenta/client/backend/types/o_tel_flat_span.py +56 -0
  186. agenta/client/backend/types/o_tel_flat_span_input_end_time.py +6 -0
  187. agenta/client/backend/types/o_tel_flat_span_input_start_time.py +6 -0
  188. agenta/client/backend/types/o_tel_flat_span_output_end_time.py +6 -0
  189. agenta/client/backend/types/o_tel_flat_span_output_start_time.py +6 -0
  190. agenta/client/backend/types/o_tel_link.py +34 -0
  191. agenta/client/backend/types/o_tel_link_dto.py +4 -6
  192. agenta/client/backend/types/o_tel_links_response.py +22 -0
  193. agenta/client/backend/types/o_tel_span.py +58 -0
  194. agenta/client/backend/types/o_tel_span_dto.py +8 -10
  195. agenta/client/backend/types/o_tel_span_input_end_time.py +6 -0
  196. agenta/client/backend/types/o_tel_span_input_spans_value.py +7 -0
  197. agenta/client/backend/types/o_tel_span_input_start_time.py +6 -0
  198. agenta/client/backend/types/o_tel_span_output_end_time.py +6 -0
  199. agenta/client/backend/types/o_tel_span_output_spans_value.py +30 -0
  200. agenta/client/backend/types/o_tel_span_output_start_time.py +6 -0
  201. agenta/client/backend/types/o_tel_spans_tree.py +22 -0
  202. agenta/client/backend/types/o_tel_spans_tree_input_spans_value.py +7 -0
  203. agenta/client/backend/types/o_tel_spans_tree_output_spans_value.py +5 -0
  204. agenta/client/backend/types/o_tel_status_code.py +1 -1
  205. agenta/client/backend/types/o_tel_tracing_data_response.py +22 -0
  206. agenta/client/backend/types/o_tel_tracing_request.py +22 -0
  207. agenta/client/backend/types/o_tel_tracing_response.py +27 -0
  208. agenta/client/backend/types/organization.py +3 -5
  209. agenta/client/backend/types/organization_details.py +3 -5
  210. agenta/client/backend/types/organization_membership_request.py +5 -7
  211. agenta/client/backend/types/organization_output.py +3 -5
  212. agenta/client/backend/types/organization_request.py +3 -5
  213. agenta/client/backend/types/parent_dto.py +3 -5
  214. agenta/client/backend/types/permission.py +11 -0
  215. agenta/client/backend/types/plan.py +14 -0
  216. agenta/client/backend/types/project_membership_request.py +5 -7
  217. agenta/client/backend/types/project_request.py +4 -6
  218. agenta/client/backend/types/project_scope.py +5 -7
  219. agenta/client/backend/types/projects_response.py +3 -5
  220. agenta/client/backend/types/recursive_types.py +23 -0
  221. agenta/client/backend/types/reference.py +18 -5
  222. agenta/client/backend/types/reference_dto.py +4 -5
  223. agenta/client/backend/types/reference_request_model.py +4 -5
  224. agenta/client/backend/types/result.py +4 -6
  225. agenta/client/backend/types/root_dto.py +3 -5
  226. agenta/client/backend/types/scopes_response_model.py +4 -6
  227. agenta/client/backend/types/secret_dto.py +5 -7
  228. agenta/client/backend/types/secret_response_dto.py +11 -11
  229. agenta/client/backend/types/simple_evaluation_output.py +4 -6
  230. agenta/client/backend/types/span_dto.py +18 -14
  231. agenta/client/backend/types/span_dto_nodes_value.py +1 -1
  232. agenta/client/backend/types/standard_provider_dto.py +5 -7
  233. agenta/client/backend/types/standard_provider_settings_dto.py +3 -5
  234. agenta/client/backend/types/status_dto.py +4 -6
  235. agenta/client/backend/types/tags_request.py +30 -0
  236. agenta/client/backend/types/test_set_output_response.py +5 -7
  237. agenta/client/backend/types/test_set_simple_response.py +3 -5
  238. agenta/client/backend/types/testcase_response.py +33 -0
  239. agenta/client/backend/types/testset.py +46 -0
  240. agenta/client/backend/types/testset_request.py +20 -0
  241. agenta/client/backend/types/testset_response.py +21 -0
  242. agenta/client/backend/types/testsets_response.py +21 -0
  243. agenta/client/backend/types/time_dto.py +3 -5
  244. agenta/client/backend/types/timestamp.py +6 -0
  245. agenta/client/backend/types/tree_dto.py +4 -6
  246. agenta/client/backend/types/update_app_output.py +3 -5
  247. agenta/client/backend/types/user_request.py +3 -5
  248. agenta/client/backend/types/validation_error.py +4 -6
  249. agenta/client/backend/types/workflow_artifact.py +45 -0
  250. agenta/client/backend/types/workflow_data.py +20 -0
  251. agenta/client/backend/types/workflow_flags.py +21 -0
  252. agenta/client/backend/types/workflow_request.py +20 -0
  253. agenta/client/backend/types/workflow_response.py +21 -0
  254. agenta/client/backend/types/workflow_revision.py +57 -0
  255. agenta/client/backend/types/workflow_revision_request.py +20 -0
  256. agenta/client/backend/types/workflow_revision_response.py +21 -0
  257. agenta/client/backend/types/workflow_revisions_response.py +21 -0
  258. agenta/client/backend/types/workflow_variant.py +48 -0
  259. agenta/client/backend/types/workflow_variant_request.py +20 -0
  260. agenta/client/backend/types/workflow_variant_response.py +21 -0
  261. agenta/client/backend/types/workflow_variants_response.py +21 -0
  262. agenta/client/backend/types/workflows_response.py +21 -0
  263. agenta/client/backend/types/workspace.py +3 -5
  264. agenta/client/backend/types/workspace_member_response.py +4 -6
  265. agenta/client/backend/types/workspace_membership_request.py +5 -7
  266. agenta/client/backend/types/workspace_permission.py +5 -7
  267. agenta/client/backend/types/workspace_request.py +4 -6
  268. agenta/client/backend/types/workspace_response.py +4 -6
  269. agenta/client/backend/variants/__init__.py +2 -0
  270. agenta/client/backend/variants/client.py +306 -1651
  271. agenta/client/backend/variants/raw_client.py +2482 -0
  272. agenta/client/backend/variants/types/__init__.py +2 -0
  273. agenta/client/backend/variants/types/add_variant_from_base_and_config_response.py +1 -0
  274. agenta/client/backend/vault/__init__.py +2 -0
  275. agenta/client/backend/vault/client.py +69 -323
  276. agenta/client/backend/vault/raw_client.py +616 -0
  277. agenta/client/backend/workflows/__init__.py +3 -0
  278. agenta/client/backend/workflows/client.py +2398 -0
  279. agenta/client/backend/workflows/raw_client.py +3639 -0
  280. agenta/client/backend/workspace/__init__.py +2 -0
  281. agenta/client/backend/workspace/client.py +46 -147
  282. agenta/client/backend/workspace/raw_client.py +376 -0
  283. agenta/client/types.py +4 -0
  284. agenta/sdk/decorators/tracing.py +2 -4
  285. agenta/sdk/tracing/processors.py +26 -39
  286. agenta/sdk/types.py +28 -1
  287. {agenta-0.48.8.dist-info → agenta-0.48.10.dist-info}/METADATA +1 -1
  288. agenta-0.48.10.dist-info/RECORD +362 -0
  289. agenta/client/backend/containers/types/__init__.py +0 -5
  290. agenta/client/backend/containers/types/container_templates_response.py +0 -6
  291. agenta/client/backend/types/image.py +0 -25
  292. agenta/client/backend/types/provider_kind.py +0 -21
  293. agenta/client/backend/types/template.py +0 -23
  294. agenta/client/backend/types/template_image_info.py +0 -29
  295. agenta/client/backend/types/variant_action.py +0 -22
  296. agenta-0.48.8.dist-info/RECORD +0 -255
  297. {agenta-0.48.8.dist-info → agenta-0.48.10.dist-info}/WHEEL +0 -0
@@ -0,0 +1,2348 @@
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 .. import core
7
+ from ..core.api_error import ApiError
8
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
9
+ from ..core.http_response import AsyncHttpResponse, HttpResponse
10
+ from ..core.jsonable_encoder import jsonable_encoder
11
+ from ..core.pydantic_utilities import parse_obj_as
12
+ from ..core.request_options import RequestOptions
13
+ from ..core.serialization import convert_and_respect_annotation_metadata
14
+ from ..errors.unprocessable_entity_error import UnprocessableEntityError
15
+ from ..types.http_validation_error import HttpValidationError
16
+ from ..types.meta_request import MetaRequest
17
+ from ..types.test_set_output_response import TestSetOutputResponse
18
+ from ..types.test_set_simple_response import TestSetSimpleResponse
19
+ from ..types.testcase_response import TestcaseResponse
20
+ from ..types.testset import Testset
21
+ from ..types.testset_response import TestsetResponse
22
+ from ..types.testsets_response import TestsetsResponse
23
+ from .types.create_testset_from_file_request_file_type import (
24
+ CreateTestsetFromFileRequestFileType,
25
+ )
26
+ from .types.fetch_testset_to_file_request_file_type import (
27
+ FetchTestsetToFileRequestFileType,
28
+ )
29
+ from .types.update_testset_from_file_request_file_type import (
30
+ UpdateTestsetFromFileRequestFileType,
31
+ )
32
+
33
+ # this is used as the default value for optional parameters
34
+ OMIT = typing.cast(typing.Any, ...)
35
+
36
+
37
+ class RawTestsetsClient:
38
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
39
+ self._client_wrapper = client_wrapper
40
+
41
+ def upload_file(
42
+ self,
43
+ *,
44
+ file: core.File,
45
+ upload_type: typing.Optional[str] = OMIT,
46
+ testset_name: typing.Optional[str] = OMIT,
47
+ request_options: typing.Optional[RequestOptions] = None,
48
+ ) -> HttpResponse[TestSetSimpleResponse]:
49
+ """
50
+ Uploads a CSV or JSON file and saves its data to Postgres.
51
+
52
+ Args:
53
+ upload_type : Either a json or csv file.
54
+ file (UploadFile): The CSV or JSON file to upload.
55
+ testset_name (Optional): the name of the testset if provided.
56
+
57
+ Returns:
58
+ dict: The result of the upload process.
59
+
60
+ Parameters
61
+ ----------
62
+ file : core.File
63
+ See core.File for more documentation
64
+
65
+ upload_type : typing.Optional[str]
66
+
67
+ testset_name : typing.Optional[str]
68
+
69
+ request_options : typing.Optional[RequestOptions]
70
+ Request-specific configuration.
71
+
72
+ Returns
73
+ -------
74
+ HttpResponse[TestSetSimpleResponse]
75
+ Successful Response
76
+ """
77
+ _response = self._client_wrapper.httpx_client.request(
78
+ "testsets/upload",
79
+ method="POST",
80
+ data={
81
+ "upload_type": upload_type,
82
+ "testset_name": testset_name,
83
+ },
84
+ files={
85
+ "file": file,
86
+ },
87
+ request_options=request_options,
88
+ omit=OMIT,
89
+ force_multipart=True,
90
+ )
91
+ try:
92
+ if 200 <= _response.status_code < 300:
93
+ _data = typing.cast(
94
+ TestSetSimpleResponse,
95
+ parse_obj_as(
96
+ type_=TestSetSimpleResponse, # type: ignore
97
+ object_=_response.json(),
98
+ ),
99
+ )
100
+ return HttpResponse(response=_response, data=_data)
101
+ if _response.status_code == 422:
102
+ raise UnprocessableEntityError(
103
+ headers=dict(_response.headers),
104
+ body=typing.cast(
105
+ HttpValidationError,
106
+ parse_obj_as(
107
+ type_=HttpValidationError, # type: ignore
108
+ object_=_response.json(),
109
+ ),
110
+ ),
111
+ )
112
+ _response_json = _response.json()
113
+ except JSONDecodeError:
114
+ raise ApiError(
115
+ status_code=_response.status_code,
116
+ headers=dict(_response.headers),
117
+ body=_response.text,
118
+ )
119
+ raise ApiError(
120
+ status_code=_response.status_code,
121
+ headers=dict(_response.headers),
122
+ body=_response_json,
123
+ )
124
+
125
+ def import_testset(
126
+ self,
127
+ *,
128
+ authorization: typing.Optional[str] = None,
129
+ endpoint: typing.Optional[str] = OMIT,
130
+ testset_name: typing.Optional[str] = OMIT,
131
+ request_options: typing.Optional[RequestOptions] = None,
132
+ ) -> HttpResponse[TestSetSimpleResponse]:
133
+ """
134
+ Import JSON testset data from an endpoint and save it to Postgres.
135
+
136
+ Args:
137
+ endpoint (str): An endpoint URL to import data from.
138
+ testset_name (str): the name of the testset if provided.
139
+
140
+ Returns:
141
+ dict: The result of the import process.
142
+
143
+ Parameters
144
+ ----------
145
+ authorization : typing.Optional[str]
146
+
147
+ endpoint : typing.Optional[str]
148
+
149
+ testset_name : typing.Optional[str]
150
+
151
+ request_options : typing.Optional[RequestOptions]
152
+ Request-specific configuration.
153
+
154
+ Returns
155
+ -------
156
+ HttpResponse[TestSetSimpleResponse]
157
+ Successful Response
158
+ """
159
+ _response = self._client_wrapper.httpx_client.request(
160
+ "testsets/endpoint",
161
+ method="POST",
162
+ params={
163
+ "authorization": authorization,
164
+ },
165
+ data={
166
+ "endpoint": endpoint,
167
+ "testset_name": testset_name,
168
+ },
169
+ headers={
170
+ "content-type": "application/x-www-form-urlencoded",
171
+ },
172
+ request_options=request_options,
173
+ omit=OMIT,
174
+ )
175
+ try:
176
+ if 200 <= _response.status_code < 300:
177
+ _data = typing.cast(
178
+ TestSetSimpleResponse,
179
+ parse_obj_as(
180
+ type_=TestSetSimpleResponse, # type: ignore
181
+ object_=_response.json(),
182
+ ),
183
+ )
184
+ return HttpResponse(response=_response, data=_data)
185
+ if _response.status_code == 422:
186
+ raise UnprocessableEntityError(
187
+ headers=dict(_response.headers),
188
+ body=typing.cast(
189
+ HttpValidationError,
190
+ parse_obj_as(
191
+ type_=HttpValidationError, # type: ignore
192
+ object_=_response.json(),
193
+ ),
194
+ ),
195
+ )
196
+ _response_json = _response.json()
197
+ except JSONDecodeError:
198
+ raise ApiError(
199
+ status_code=_response.status_code,
200
+ headers=dict(_response.headers),
201
+ body=_response.text,
202
+ )
203
+ raise ApiError(
204
+ status_code=_response.status_code,
205
+ headers=dict(_response.headers),
206
+ body=_response_json,
207
+ )
208
+
209
+ def get_testsets(
210
+ self, *, request_options: typing.Optional[RequestOptions] = None
211
+ ) -> HttpResponse[typing.List[TestSetOutputResponse]]:
212
+ """
213
+ Get all testsets.
214
+
215
+ Returns:
216
+ - A list of testset objects.
217
+
218
+ Raises:
219
+ - `HTTPException` with status code 404 if no testsets are found.
220
+
221
+ Parameters
222
+ ----------
223
+ request_options : typing.Optional[RequestOptions]
224
+ Request-specific configuration.
225
+
226
+ Returns
227
+ -------
228
+ HttpResponse[typing.List[TestSetOutputResponse]]
229
+ Successful Response
230
+ """
231
+ _response = self._client_wrapper.httpx_client.request(
232
+ "testsets",
233
+ method="GET",
234
+ request_options=request_options,
235
+ )
236
+ try:
237
+ if 200 <= _response.status_code < 300:
238
+ _data = typing.cast(
239
+ typing.List[TestSetOutputResponse],
240
+ parse_obj_as(
241
+ type_=typing.List[TestSetOutputResponse], # type: ignore
242
+ object_=_response.json(),
243
+ ),
244
+ )
245
+ return HttpResponse(response=_response, data=_data)
246
+ _response_json = _response.json()
247
+ except JSONDecodeError:
248
+ raise ApiError(
249
+ status_code=_response.status_code,
250
+ headers=dict(_response.headers),
251
+ body=_response.text,
252
+ )
253
+ raise ApiError(
254
+ status_code=_response.status_code,
255
+ headers=dict(_response.headers),
256
+ body=_response_json,
257
+ )
258
+
259
+ def create_testset(
260
+ self,
261
+ *,
262
+ testset: Testset,
263
+ request_options: typing.Optional[RequestOptions] = None,
264
+ ) -> HttpResponse[TestsetResponse]:
265
+ """
266
+ Parameters
267
+ ----------
268
+ testset : Testset
269
+
270
+ request_options : typing.Optional[RequestOptions]
271
+ Request-specific configuration.
272
+
273
+ Returns
274
+ -------
275
+ HttpResponse[TestsetResponse]
276
+ Successful Response
277
+ """
278
+ _response = self._client_wrapper.httpx_client.request(
279
+ "preview/testsets/",
280
+ method="POST",
281
+ json={
282
+ "testset": convert_and_respect_annotation_metadata(
283
+ object_=testset, annotation=Testset, direction="write"
284
+ ),
285
+ },
286
+ headers={
287
+ "content-type": "application/json",
288
+ },
289
+ request_options=request_options,
290
+ omit=OMIT,
291
+ )
292
+ try:
293
+ if 200 <= _response.status_code < 300:
294
+ _data = typing.cast(
295
+ TestsetResponse,
296
+ parse_obj_as(
297
+ type_=TestsetResponse, # type: ignore
298
+ object_=_response.json(),
299
+ ),
300
+ )
301
+ return HttpResponse(response=_response, data=_data)
302
+ if _response.status_code == 422:
303
+ raise UnprocessableEntityError(
304
+ headers=dict(_response.headers),
305
+ body=typing.cast(
306
+ HttpValidationError,
307
+ parse_obj_as(
308
+ type_=HttpValidationError, # type: ignore
309
+ object_=_response.json(),
310
+ ),
311
+ ),
312
+ )
313
+ _response_json = _response.json()
314
+ except JSONDecodeError:
315
+ raise ApiError(
316
+ status_code=_response.status_code,
317
+ headers=dict(_response.headers),
318
+ body=_response.text,
319
+ )
320
+ raise ApiError(
321
+ status_code=_response.status_code,
322
+ headers=dict(_response.headers),
323
+ body=_response_json,
324
+ )
325
+
326
+ def delete_testsets(
327
+ self,
328
+ *,
329
+ testset_ids: typing.Sequence[str],
330
+ request_options: typing.Optional[RequestOptions] = None,
331
+ ) -> HttpResponse[typing.List[str]]:
332
+ """
333
+ Delete specific testsets based on their unique IDs.
334
+
335
+ Args:
336
+ testset_ids (List[str]): The unique identifiers of the testsets to delete.
337
+
338
+ Returns:
339
+ A list of the deleted testsets' IDs.
340
+
341
+ Parameters
342
+ ----------
343
+ testset_ids : typing.Sequence[str]
344
+
345
+ request_options : typing.Optional[RequestOptions]
346
+ Request-specific configuration.
347
+
348
+ Returns
349
+ -------
350
+ HttpResponse[typing.List[str]]
351
+ Successful Response
352
+ """
353
+ _response = self._client_wrapper.httpx_client.request(
354
+ "testsets",
355
+ method="DELETE",
356
+ json={
357
+ "testset_ids": testset_ids,
358
+ },
359
+ headers={
360
+ "content-type": "application/json",
361
+ },
362
+ request_options=request_options,
363
+ omit=OMIT,
364
+ )
365
+ try:
366
+ if 200 <= _response.status_code < 300:
367
+ _data = typing.cast(
368
+ typing.List[str],
369
+ parse_obj_as(
370
+ type_=typing.List[str], # type: ignore
371
+ object_=_response.json(),
372
+ ),
373
+ )
374
+ return HttpResponse(response=_response, data=_data)
375
+ if _response.status_code == 422:
376
+ raise UnprocessableEntityError(
377
+ headers=dict(_response.headers),
378
+ body=typing.cast(
379
+ HttpValidationError,
380
+ parse_obj_as(
381
+ type_=HttpValidationError, # type: ignore
382
+ object_=_response.json(),
383
+ ),
384
+ ),
385
+ )
386
+ _response_json = _response.json()
387
+ except JSONDecodeError:
388
+ raise ApiError(
389
+ status_code=_response.status_code,
390
+ headers=dict(_response.headers),
391
+ body=_response.text,
392
+ )
393
+ raise ApiError(
394
+ status_code=_response.status_code,
395
+ headers=dict(_response.headers),
396
+ body=_response_json,
397
+ )
398
+
399
+ def get_single_testset(
400
+ self,
401
+ testset_id: str,
402
+ *,
403
+ request_options: typing.Optional[RequestOptions] = None,
404
+ ) -> HttpResponse[typing.Optional[typing.Any]]:
405
+ """
406
+ Fetch a specific testset in Postgres.
407
+
408
+ Args:
409
+ testset_id (str): The id of the testset to fetch.
410
+
411
+ Returns:
412
+ The requested testset if found, else an HTTPException.
413
+
414
+ Parameters
415
+ ----------
416
+ testset_id : str
417
+
418
+ request_options : typing.Optional[RequestOptions]
419
+ Request-specific configuration.
420
+
421
+ Returns
422
+ -------
423
+ HttpResponse[typing.Optional[typing.Any]]
424
+ Successful Response
425
+ """
426
+ _response = self._client_wrapper.httpx_client.request(
427
+ f"testsets/{jsonable_encoder(testset_id)}",
428
+ method="GET",
429
+ request_options=request_options,
430
+ )
431
+ try:
432
+ if _response is None or not _response.text.strip():
433
+ return HttpResponse(response=_response, data=None)
434
+ if 200 <= _response.status_code < 300:
435
+ _data = typing.cast(
436
+ typing.Optional[typing.Any],
437
+ parse_obj_as(
438
+ type_=typing.Optional[typing.Any], # type: ignore
439
+ object_=_response.json(),
440
+ ),
441
+ )
442
+ return HttpResponse(response=_response, data=_data)
443
+ if _response.status_code == 422:
444
+ raise UnprocessableEntityError(
445
+ headers=dict(_response.headers),
446
+ body=typing.cast(
447
+ HttpValidationError,
448
+ parse_obj_as(
449
+ type_=HttpValidationError, # type: ignore
450
+ object_=_response.json(),
451
+ ),
452
+ ),
453
+ )
454
+ _response_json = _response.json()
455
+ except JSONDecodeError:
456
+ raise ApiError(
457
+ status_code=_response.status_code,
458
+ headers=dict(_response.headers),
459
+ body=_response.text,
460
+ )
461
+ raise ApiError(
462
+ status_code=_response.status_code,
463
+ headers=dict(_response.headers),
464
+ body=_response_json,
465
+ )
466
+
467
+ def update_testset(
468
+ self,
469
+ testset_id: str,
470
+ *,
471
+ name: str,
472
+ csvdata: typing.Sequence[typing.Dict[str, typing.Optional[typing.Any]]],
473
+ request_options: typing.Optional[RequestOptions] = None,
474
+ ) -> HttpResponse[typing.Optional[typing.Any]]:
475
+ """
476
+ Update a testset with given id, update the testset in Postgres.
477
+
478
+ Args:
479
+ testset_id (str): id of the test set to be updated.
480
+ csvdata (NewTestset): New data to replace the old testset.
481
+
482
+ Returns:
483
+ str: The id of the test set updated.
484
+
485
+ Parameters
486
+ ----------
487
+ testset_id : str
488
+
489
+ name : str
490
+
491
+ csvdata : typing.Sequence[typing.Dict[str, typing.Optional[typing.Any]]]
492
+
493
+ request_options : typing.Optional[RequestOptions]
494
+ Request-specific configuration.
495
+
496
+ Returns
497
+ -------
498
+ HttpResponse[typing.Optional[typing.Any]]
499
+ Successful Response
500
+ """
501
+ _response = self._client_wrapper.httpx_client.request(
502
+ f"testsets/{jsonable_encoder(testset_id)}",
503
+ method="PUT",
504
+ json={
505
+ "name": name,
506
+ "csvdata": csvdata,
507
+ },
508
+ headers={
509
+ "content-type": "application/json",
510
+ },
511
+ request_options=request_options,
512
+ omit=OMIT,
513
+ )
514
+ try:
515
+ if _response is None or not _response.text.strip():
516
+ return HttpResponse(response=_response, data=None)
517
+ if 200 <= _response.status_code < 300:
518
+ _data = 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
+ return HttpResponse(response=_response, data=_data)
526
+ if _response.status_code == 422:
527
+ raise UnprocessableEntityError(
528
+ headers=dict(_response.headers),
529
+ body=typing.cast(
530
+ HttpValidationError,
531
+ parse_obj_as(
532
+ type_=HttpValidationError, # type: ignore
533
+ object_=_response.json(),
534
+ ),
535
+ ),
536
+ )
537
+ _response_json = _response.json()
538
+ except JSONDecodeError:
539
+ raise ApiError(
540
+ status_code=_response.status_code,
541
+ headers=dict(_response.headers),
542
+ body=_response.text,
543
+ )
544
+ raise ApiError(
545
+ status_code=_response.status_code,
546
+ headers=dict(_response.headers),
547
+ body=_response_json,
548
+ )
549
+
550
+ def list_testsets(
551
+ self, *, request_options: typing.Optional[RequestOptions] = None
552
+ ) -> HttpResponse[TestsetResponse]:
553
+ """
554
+ Parameters
555
+ ----------
556
+ request_options : typing.Optional[RequestOptions]
557
+ Request-specific configuration.
558
+
559
+ Returns
560
+ -------
561
+ HttpResponse[TestsetResponse]
562
+ Successful Response
563
+ """
564
+ _response = self._client_wrapper.httpx_client.request(
565
+ "preview/testsets/",
566
+ method="GET",
567
+ request_options=request_options,
568
+ )
569
+ try:
570
+ if 200 <= _response.status_code < 300:
571
+ _data = typing.cast(
572
+ TestsetResponse,
573
+ parse_obj_as(
574
+ type_=TestsetResponse, # type: ignore
575
+ object_=_response.json(),
576
+ ),
577
+ )
578
+ return HttpResponse(response=_response, data=_data)
579
+ if _response.status_code == 422:
580
+ raise UnprocessableEntityError(
581
+ headers=dict(_response.headers),
582
+ body=typing.cast(
583
+ HttpValidationError,
584
+ parse_obj_as(
585
+ type_=HttpValidationError, # type: ignore
586
+ object_=_response.json(),
587
+ ),
588
+ ),
589
+ )
590
+ _response_json = _response.json()
591
+ except JSONDecodeError:
592
+ raise ApiError(
593
+ status_code=_response.status_code,
594
+ headers=dict(_response.headers),
595
+ body=_response.text,
596
+ )
597
+ raise ApiError(
598
+ status_code=_response.status_code,
599
+ headers=dict(_response.headers),
600
+ body=_response_json,
601
+ )
602
+
603
+ def fetch_testset(
604
+ self,
605
+ testset_id: str,
606
+ *,
607
+ request_options: typing.Optional[RequestOptions] = None,
608
+ ) -> HttpResponse[TestsetResponse]:
609
+ """
610
+ Parameters
611
+ ----------
612
+ testset_id : str
613
+
614
+ request_options : typing.Optional[RequestOptions]
615
+ Request-specific configuration.
616
+
617
+ Returns
618
+ -------
619
+ HttpResponse[TestsetResponse]
620
+ Successful Response
621
+ """
622
+ _response = self._client_wrapper.httpx_client.request(
623
+ f"preview/testsets/{jsonable_encoder(testset_id)}",
624
+ method="GET",
625
+ request_options=request_options,
626
+ )
627
+ try:
628
+ if 200 <= _response.status_code < 300:
629
+ _data = typing.cast(
630
+ TestsetResponse,
631
+ parse_obj_as(
632
+ type_=TestsetResponse, # type: ignore
633
+ object_=_response.json(),
634
+ ),
635
+ )
636
+ return HttpResponse(response=_response, data=_data)
637
+ if _response.status_code == 422:
638
+ raise UnprocessableEntityError(
639
+ headers=dict(_response.headers),
640
+ body=typing.cast(
641
+ HttpValidationError,
642
+ parse_obj_as(
643
+ type_=HttpValidationError, # type: ignore
644
+ object_=_response.json(),
645
+ ),
646
+ ),
647
+ )
648
+ _response_json = _response.json()
649
+ except JSONDecodeError:
650
+ raise ApiError(
651
+ status_code=_response.status_code,
652
+ headers=dict(_response.headers),
653
+ body=_response.text,
654
+ )
655
+ raise ApiError(
656
+ status_code=_response.status_code,
657
+ headers=dict(_response.headers),
658
+ body=_response_json,
659
+ )
660
+
661
+ def edit_testset(
662
+ self,
663
+ testset_id: str,
664
+ *,
665
+ testset: Testset,
666
+ request_options: typing.Optional[RequestOptions] = None,
667
+ ) -> HttpResponse[TestsetResponse]:
668
+ """
669
+ Parameters
670
+ ----------
671
+ testset_id : str
672
+
673
+ testset : Testset
674
+
675
+ request_options : typing.Optional[RequestOptions]
676
+ Request-specific configuration.
677
+
678
+ Returns
679
+ -------
680
+ HttpResponse[TestsetResponse]
681
+ Successful Response
682
+ """
683
+ _response = self._client_wrapper.httpx_client.request(
684
+ f"preview/testsets/{jsonable_encoder(testset_id)}",
685
+ method="PUT",
686
+ json={
687
+ "testset": convert_and_respect_annotation_metadata(
688
+ object_=testset, annotation=Testset, direction="write"
689
+ ),
690
+ },
691
+ headers={
692
+ "content-type": "application/json",
693
+ },
694
+ request_options=request_options,
695
+ omit=OMIT,
696
+ )
697
+ try:
698
+ if 200 <= _response.status_code < 300:
699
+ _data = typing.cast(
700
+ TestsetResponse,
701
+ parse_obj_as(
702
+ type_=TestsetResponse, # type: ignore
703
+ object_=_response.json(),
704
+ ),
705
+ )
706
+ return HttpResponse(response=_response, data=_data)
707
+ if _response.status_code == 422:
708
+ raise UnprocessableEntityError(
709
+ headers=dict(_response.headers),
710
+ body=typing.cast(
711
+ HttpValidationError,
712
+ parse_obj_as(
713
+ type_=HttpValidationError, # type: ignore
714
+ object_=_response.json(),
715
+ ),
716
+ ),
717
+ )
718
+ _response_json = _response.json()
719
+ except JSONDecodeError:
720
+ raise ApiError(
721
+ status_code=_response.status_code,
722
+ headers=dict(_response.headers),
723
+ body=_response.text,
724
+ )
725
+ raise ApiError(
726
+ status_code=_response.status_code,
727
+ headers=dict(_response.headers),
728
+ body=_response_json,
729
+ )
730
+
731
+ def archive_testset(
732
+ self,
733
+ testset_id: str,
734
+ *,
735
+ request_options: typing.Optional[RequestOptions] = None,
736
+ ) -> HttpResponse[TestsetResponse]:
737
+ """
738
+ Parameters
739
+ ----------
740
+ testset_id : str
741
+
742
+ request_options : typing.Optional[RequestOptions]
743
+ Request-specific configuration.
744
+
745
+ Returns
746
+ -------
747
+ HttpResponse[TestsetResponse]
748
+ Successful Response
749
+ """
750
+ _response = self._client_wrapper.httpx_client.request(
751
+ f"preview/testsets/{jsonable_encoder(testset_id)}/archive",
752
+ method="POST",
753
+ request_options=request_options,
754
+ )
755
+ try:
756
+ if 200 <= _response.status_code < 300:
757
+ _data = typing.cast(
758
+ TestsetResponse,
759
+ parse_obj_as(
760
+ type_=TestsetResponse, # type: ignore
761
+ object_=_response.json(),
762
+ ),
763
+ )
764
+ return HttpResponse(response=_response, data=_data)
765
+ if _response.status_code == 422:
766
+ raise UnprocessableEntityError(
767
+ headers=dict(_response.headers),
768
+ body=typing.cast(
769
+ HttpValidationError,
770
+ parse_obj_as(
771
+ type_=HttpValidationError, # type: ignore
772
+ object_=_response.json(),
773
+ ),
774
+ ),
775
+ )
776
+ _response_json = _response.json()
777
+ except JSONDecodeError:
778
+ raise ApiError(
779
+ status_code=_response.status_code,
780
+ headers=dict(_response.headers),
781
+ body=_response.text,
782
+ )
783
+ raise ApiError(
784
+ status_code=_response.status_code,
785
+ headers=dict(_response.headers),
786
+ body=_response_json,
787
+ )
788
+
789
+ def unarchive_testset(
790
+ self,
791
+ testset_id: str,
792
+ *,
793
+ request_options: typing.Optional[RequestOptions] = None,
794
+ ) -> HttpResponse[TestsetResponse]:
795
+ """
796
+ Parameters
797
+ ----------
798
+ testset_id : str
799
+
800
+ request_options : typing.Optional[RequestOptions]
801
+ Request-specific configuration.
802
+
803
+ Returns
804
+ -------
805
+ HttpResponse[TestsetResponse]
806
+ Successful Response
807
+ """
808
+ _response = self._client_wrapper.httpx_client.request(
809
+ f"preview/testsets/{jsonable_encoder(testset_id)}/unarchive",
810
+ method="POST",
811
+ request_options=request_options,
812
+ )
813
+ try:
814
+ if 200 <= _response.status_code < 300:
815
+ _data = typing.cast(
816
+ TestsetResponse,
817
+ parse_obj_as(
818
+ type_=TestsetResponse, # type: ignore
819
+ object_=_response.json(),
820
+ ),
821
+ )
822
+ return HttpResponse(response=_response, data=_data)
823
+ if _response.status_code == 422:
824
+ raise UnprocessableEntityError(
825
+ headers=dict(_response.headers),
826
+ body=typing.cast(
827
+ HttpValidationError,
828
+ parse_obj_as(
829
+ type_=HttpValidationError, # type: ignore
830
+ object_=_response.json(),
831
+ ),
832
+ ),
833
+ )
834
+ _response_json = _response.json()
835
+ except JSONDecodeError:
836
+ raise ApiError(
837
+ status_code=_response.status_code,
838
+ headers=dict(_response.headers),
839
+ body=_response.text,
840
+ )
841
+ raise ApiError(
842
+ status_code=_response.status_code,
843
+ headers=dict(_response.headers),
844
+ body=_response_json,
845
+ )
846
+
847
+ def query_testsets(
848
+ self,
849
+ *,
850
+ request: typing.Optional[MetaRequest] = None,
851
+ request_options: typing.Optional[RequestOptions] = None,
852
+ ) -> HttpResponse[TestsetsResponse]:
853
+ """
854
+ Parameters
855
+ ----------
856
+ request : typing.Optional[MetaRequest]
857
+
858
+ request_options : typing.Optional[RequestOptions]
859
+ Request-specific configuration.
860
+
861
+ Returns
862
+ -------
863
+ HttpResponse[TestsetsResponse]
864
+ Successful Response
865
+ """
866
+ _response = self._client_wrapper.httpx_client.request(
867
+ "preview/testsets/query",
868
+ method="POST",
869
+ json=convert_and_respect_annotation_metadata(
870
+ object_=request, annotation=MetaRequest, direction="write"
871
+ ),
872
+ headers={
873
+ "content-type": "application/json",
874
+ },
875
+ request_options=request_options,
876
+ omit=OMIT,
877
+ )
878
+ try:
879
+ if 200 <= _response.status_code < 300:
880
+ _data = typing.cast(
881
+ TestsetsResponse,
882
+ parse_obj_as(
883
+ type_=TestsetsResponse, # type: ignore
884
+ object_=_response.json(),
885
+ ),
886
+ )
887
+ return HttpResponse(response=_response, data=_data)
888
+ if _response.status_code == 422:
889
+ raise UnprocessableEntityError(
890
+ headers=dict(_response.headers),
891
+ body=typing.cast(
892
+ HttpValidationError,
893
+ parse_obj_as(
894
+ type_=HttpValidationError, # 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
+ def create_testset_from_file(
913
+ self,
914
+ *,
915
+ file: core.File,
916
+ file_type: typing.Optional[CreateTestsetFromFileRequestFileType] = OMIT,
917
+ testset_slug: typing.Optional[str] = OMIT,
918
+ testset_name: typing.Optional[str] = OMIT,
919
+ testset_description: typing.Optional[str] = OMIT,
920
+ testset_meta: typing.Optional[typing.List[str]] = OMIT,
921
+ request_options: typing.Optional[RequestOptions] = None,
922
+ ) -> HttpResponse[TestsetResponse]:
923
+ """
924
+ Parameters
925
+ ----------
926
+ file : core.File
927
+ See core.File for more documentation
928
+
929
+ file_type : typing.Optional[CreateTestsetFromFileRequestFileType]
930
+
931
+ testset_slug : typing.Optional[str]
932
+
933
+ testset_name : typing.Optional[str]
934
+
935
+ testset_description : typing.Optional[str]
936
+
937
+ testset_meta : typing.Optional[typing.List[str]]
938
+
939
+ request_options : typing.Optional[RequestOptions]
940
+ Request-specific configuration.
941
+
942
+ Returns
943
+ -------
944
+ HttpResponse[TestsetResponse]
945
+ Successful Response
946
+ """
947
+ _response = self._client_wrapper.httpx_client.request(
948
+ "preview/testsets/upload",
949
+ method="POST",
950
+ data={
951
+ "file_type": file_type,
952
+ "testset_slug": testset_slug,
953
+ "testset_name": testset_name,
954
+ "testset_description": testset_description,
955
+ "testset_meta": testset_meta,
956
+ },
957
+ files={
958
+ "file": file,
959
+ },
960
+ request_options=request_options,
961
+ omit=OMIT,
962
+ force_multipart=True,
963
+ )
964
+ try:
965
+ if 200 <= _response.status_code < 300:
966
+ _data = typing.cast(
967
+ TestsetResponse,
968
+ parse_obj_as(
969
+ type_=TestsetResponse, # type: ignore
970
+ object_=_response.json(),
971
+ ),
972
+ )
973
+ return HttpResponse(response=_response, data=_data)
974
+ if _response.status_code == 422:
975
+ raise UnprocessableEntityError(
976
+ headers=dict(_response.headers),
977
+ body=typing.cast(
978
+ HttpValidationError,
979
+ parse_obj_as(
980
+ type_=HttpValidationError, # type: ignore
981
+ object_=_response.json(),
982
+ ),
983
+ ),
984
+ )
985
+ _response_json = _response.json()
986
+ except JSONDecodeError:
987
+ raise ApiError(
988
+ status_code=_response.status_code,
989
+ headers=dict(_response.headers),
990
+ body=_response.text,
991
+ )
992
+ raise ApiError(
993
+ status_code=_response.status_code,
994
+ headers=dict(_response.headers),
995
+ body=_response_json,
996
+ )
997
+
998
+ def update_testset_from_file(
999
+ self,
1000
+ testset_id: str,
1001
+ *,
1002
+ file: core.File,
1003
+ file_type: typing.Optional[UpdateTestsetFromFileRequestFileType] = OMIT,
1004
+ request_options: typing.Optional[RequestOptions] = None,
1005
+ ) -> HttpResponse[TestsetResponse]:
1006
+ """
1007
+ Parameters
1008
+ ----------
1009
+ testset_id : str
1010
+
1011
+ file : core.File
1012
+ See core.File for more documentation
1013
+
1014
+ file_type : typing.Optional[UpdateTestsetFromFileRequestFileType]
1015
+
1016
+ request_options : typing.Optional[RequestOptions]
1017
+ Request-specific configuration.
1018
+
1019
+ Returns
1020
+ -------
1021
+ HttpResponse[TestsetResponse]
1022
+ Successful Response
1023
+ """
1024
+ _response = self._client_wrapper.httpx_client.request(
1025
+ f"preview/testsets/{jsonable_encoder(testset_id)}/upload",
1026
+ method="POST",
1027
+ data={
1028
+ "file_type": file_type,
1029
+ },
1030
+ files={
1031
+ "file": file,
1032
+ },
1033
+ request_options=request_options,
1034
+ omit=OMIT,
1035
+ force_multipart=True,
1036
+ )
1037
+ try:
1038
+ if 200 <= _response.status_code < 300:
1039
+ _data = typing.cast(
1040
+ TestsetResponse,
1041
+ parse_obj_as(
1042
+ type_=TestsetResponse, # type: ignore
1043
+ object_=_response.json(),
1044
+ ),
1045
+ )
1046
+ return HttpResponse(response=_response, data=_data)
1047
+ if _response.status_code == 422:
1048
+ raise UnprocessableEntityError(
1049
+ headers=dict(_response.headers),
1050
+ body=typing.cast(
1051
+ HttpValidationError,
1052
+ parse_obj_as(
1053
+ type_=HttpValidationError, # type: ignore
1054
+ object_=_response.json(),
1055
+ ),
1056
+ ),
1057
+ )
1058
+ _response_json = _response.json()
1059
+ except JSONDecodeError:
1060
+ raise ApiError(
1061
+ status_code=_response.status_code,
1062
+ headers=dict(_response.headers),
1063
+ body=_response.text,
1064
+ )
1065
+ raise ApiError(
1066
+ status_code=_response.status_code,
1067
+ headers=dict(_response.headers),
1068
+ body=_response_json,
1069
+ )
1070
+
1071
+ def fetch_testset_to_file(
1072
+ self,
1073
+ testset_id: str,
1074
+ *,
1075
+ file_type: typing.Optional[FetchTestsetToFileRequestFileType] = None,
1076
+ request_options: typing.Optional[RequestOptions] = None,
1077
+ ) -> HttpResponse[TestsetResponse]:
1078
+ """
1079
+ Parameters
1080
+ ----------
1081
+ testset_id : str
1082
+
1083
+ file_type : typing.Optional[FetchTestsetToFileRequestFileType]
1084
+
1085
+ request_options : typing.Optional[RequestOptions]
1086
+ Request-specific configuration.
1087
+
1088
+ Returns
1089
+ -------
1090
+ HttpResponse[TestsetResponse]
1091
+ Successful Response
1092
+ """
1093
+ _response = self._client_wrapper.httpx_client.request(
1094
+ f"preview/testsets/{jsonable_encoder(testset_id)}/download",
1095
+ method="POST",
1096
+ params={
1097
+ "file_type": file_type,
1098
+ },
1099
+ request_options=request_options,
1100
+ )
1101
+ try:
1102
+ if 200 <= _response.status_code < 300:
1103
+ _data = typing.cast(
1104
+ TestsetResponse,
1105
+ parse_obj_as(
1106
+ type_=TestsetResponse, # type: ignore
1107
+ object_=_response.json(),
1108
+ ),
1109
+ )
1110
+ return HttpResponse(response=_response, data=_data)
1111
+ if _response.status_code == 422:
1112
+ raise UnprocessableEntityError(
1113
+ headers=dict(_response.headers),
1114
+ body=typing.cast(
1115
+ HttpValidationError,
1116
+ parse_obj_as(
1117
+ type_=HttpValidationError, # type: ignore
1118
+ object_=_response.json(),
1119
+ ),
1120
+ ),
1121
+ )
1122
+ _response_json = _response.json()
1123
+ except JSONDecodeError:
1124
+ raise ApiError(
1125
+ status_code=_response.status_code,
1126
+ headers=dict(_response.headers),
1127
+ body=_response.text,
1128
+ )
1129
+ raise ApiError(
1130
+ status_code=_response.status_code,
1131
+ headers=dict(_response.headers),
1132
+ body=_response_json,
1133
+ )
1134
+
1135
+ def fetch_testcase(
1136
+ self,
1137
+ testcase_id: str,
1138
+ *,
1139
+ request_options: typing.Optional[RequestOptions] = None,
1140
+ ) -> HttpResponse[TestcaseResponse]:
1141
+ """
1142
+ Parameters
1143
+ ----------
1144
+ testcase_id : str
1145
+
1146
+ request_options : typing.Optional[RequestOptions]
1147
+ Request-specific configuration.
1148
+
1149
+ Returns
1150
+ -------
1151
+ HttpResponse[TestcaseResponse]
1152
+ Successful Response
1153
+ """
1154
+ _response = self._client_wrapper.httpx_client.request(
1155
+ f"preview/testsets/testcases/{jsonable_encoder(testcase_id)}",
1156
+ method="GET",
1157
+ request_options=request_options,
1158
+ )
1159
+ try:
1160
+ if 200 <= _response.status_code < 300:
1161
+ _data = typing.cast(
1162
+ TestcaseResponse,
1163
+ parse_obj_as(
1164
+ type_=TestcaseResponse, # type: ignore
1165
+ object_=_response.json(),
1166
+ ),
1167
+ )
1168
+ return HttpResponse(response=_response, data=_data)
1169
+ if _response.status_code == 422:
1170
+ raise UnprocessableEntityError(
1171
+ headers=dict(_response.headers),
1172
+ body=typing.cast(
1173
+ HttpValidationError,
1174
+ parse_obj_as(
1175
+ type_=HttpValidationError, # type: ignore
1176
+ object_=_response.json(),
1177
+ ),
1178
+ ),
1179
+ )
1180
+ _response_json = _response.json()
1181
+ except JSONDecodeError:
1182
+ raise ApiError(
1183
+ status_code=_response.status_code,
1184
+ headers=dict(_response.headers),
1185
+ body=_response.text,
1186
+ )
1187
+ raise ApiError(
1188
+ status_code=_response.status_code,
1189
+ headers=dict(_response.headers),
1190
+ body=_response_json,
1191
+ )
1192
+
1193
+
1194
+ class AsyncRawTestsetsClient:
1195
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
1196
+ self._client_wrapper = client_wrapper
1197
+
1198
+ async def upload_file(
1199
+ self,
1200
+ *,
1201
+ file: core.File,
1202
+ upload_type: typing.Optional[str] = OMIT,
1203
+ testset_name: typing.Optional[str] = OMIT,
1204
+ request_options: typing.Optional[RequestOptions] = None,
1205
+ ) -> AsyncHttpResponse[TestSetSimpleResponse]:
1206
+ """
1207
+ Uploads a CSV or JSON file and saves its data to Postgres.
1208
+
1209
+ Args:
1210
+ upload_type : Either a json or csv file.
1211
+ file (UploadFile): The CSV or JSON file to upload.
1212
+ testset_name (Optional): the name of the testset if provided.
1213
+
1214
+ Returns:
1215
+ dict: The result of the upload process.
1216
+
1217
+ Parameters
1218
+ ----------
1219
+ file : core.File
1220
+ See core.File for more documentation
1221
+
1222
+ upload_type : typing.Optional[str]
1223
+
1224
+ testset_name : typing.Optional[str]
1225
+
1226
+ request_options : typing.Optional[RequestOptions]
1227
+ Request-specific configuration.
1228
+
1229
+ Returns
1230
+ -------
1231
+ AsyncHttpResponse[TestSetSimpleResponse]
1232
+ Successful Response
1233
+ """
1234
+ _response = await self._client_wrapper.httpx_client.request(
1235
+ "testsets/upload",
1236
+ method="POST",
1237
+ data={
1238
+ "upload_type": upload_type,
1239
+ "testset_name": testset_name,
1240
+ },
1241
+ files={
1242
+ "file": file,
1243
+ },
1244
+ request_options=request_options,
1245
+ omit=OMIT,
1246
+ force_multipart=True,
1247
+ )
1248
+ try:
1249
+ if 200 <= _response.status_code < 300:
1250
+ _data = typing.cast(
1251
+ TestSetSimpleResponse,
1252
+ parse_obj_as(
1253
+ type_=TestSetSimpleResponse, # type: ignore
1254
+ object_=_response.json(),
1255
+ ),
1256
+ )
1257
+ return AsyncHttpResponse(response=_response, data=_data)
1258
+ if _response.status_code == 422:
1259
+ raise UnprocessableEntityError(
1260
+ headers=dict(_response.headers),
1261
+ body=typing.cast(
1262
+ HttpValidationError,
1263
+ parse_obj_as(
1264
+ type_=HttpValidationError, # type: ignore
1265
+ object_=_response.json(),
1266
+ ),
1267
+ ),
1268
+ )
1269
+ _response_json = _response.json()
1270
+ except JSONDecodeError:
1271
+ raise ApiError(
1272
+ status_code=_response.status_code,
1273
+ headers=dict(_response.headers),
1274
+ body=_response.text,
1275
+ )
1276
+ raise ApiError(
1277
+ status_code=_response.status_code,
1278
+ headers=dict(_response.headers),
1279
+ body=_response_json,
1280
+ )
1281
+
1282
+ async def import_testset(
1283
+ self,
1284
+ *,
1285
+ authorization: typing.Optional[str] = None,
1286
+ endpoint: typing.Optional[str] = OMIT,
1287
+ testset_name: typing.Optional[str] = OMIT,
1288
+ request_options: typing.Optional[RequestOptions] = None,
1289
+ ) -> AsyncHttpResponse[TestSetSimpleResponse]:
1290
+ """
1291
+ Import JSON testset data from an endpoint and save it to Postgres.
1292
+
1293
+ Args:
1294
+ endpoint (str): An endpoint URL to import data from.
1295
+ testset_name (str): the name of the testset if provided.
1296
+
1297
+ Returns:
1298
+ dict: The result of the import process.
1299
+
1300
+ Parameters
1301
+ ----------
1302
+ authorization : typing.Optional[str]
1303
+
1304
+ endpoint : typing.Optional[str]
1305
+
1306
+ testset_name : typing.Optional[str]
1307
+
1308
+ request_options : typing.Optional[RequestOptions]
1309
+ Request-specific configuration.
1310
+
1311
+ Returns
1312
+ -------
1313
+ AsyncHttpResponse[TestSetSimpleResponse]
1314
+ Successful Response
1315
+ """
1316
+ _response = await self._client_wrapper.httpx_client.request(
1317
+ "testsets/endpoint",
1318
+ method="POST",
1319
+ params={
1320
+ "authorization": authorization,
1321
+ },
1322
+ data={
1323
+ "endpoint": endpoint,
1324
+ "testset_name": testset_name,
1325
+ },
1326
+ headers={
1327
+ "content-type": "application/x-www-form-urlencoded",
1328
+ },
1329
+ request_options=request_options,
1330
+ omit=OMIT,
1331
+ )
1332
+ try:
1333
+ if 200 <= _response.status_code < 300:
1334
+ _data = typing.cast(
1335
+ TestSetSimpleResponse,
1336
+ parse_obj_as(
1337
+ type_=TestSetSimpleResponse, # type: ignore
1338
+ object_=_response.json(),
1339
+ ),
1340
+ )
1341
+ return AsyncHttpResponse(response=_response, data=_data)
1342
+ if _response.status_code == 422:
1343
+ raise UnprocessableEntityError(
1344
+ headers=dict(_response.headers),
1345
+ body=typing.cast(
1346
+ HttpValidationError,
1347
+ parse_obj_as(
1348
+ type_=HttpValidationError, # type: ignore
1349
+ object_=_response.json(),
1350
+ ),
1351
+ ),
1352
+ )
1353
+ _response_json = _response.json()
1354
+ except JSONDecodeError:
1355
+ raise ApiError(
1356
+ status_code=_response.status_code,
1357
+ headers=dict(_response.headers),
1358
+ body=_response.text,
1359
+ )
1360
+ raise ApiError(
1361
+ status_code=_response.status_code,
1362
+ headers=dict(_response.headers),
1363
+ body=_response_json,
1364
+ )
1365
+
1366
+ async def get_testsets(
1367
+ self, *, request_options: typing.Optional[RequestOptions] = None
1368
+ ) -> AsyncHttpResponse[typing.List[TestSetOutputResponse]]:
1369
+ """
1370
+ Get all testsets.
1371
+
1372
+ Returns:
1373
+ - A list of testset objects.
1374
+
1375
+ Raises:
1376
+ - `HTTPException` with status code 404 if no testsets are found.
1377
+
1378
+ Parameters
1379
+ ----------
1380
+ request_options : typing.Optional[RequestOptions]
1381
+ Request-specific configuration.
1382
+
1383
+ Returns
1384
+ -------
1385
+ AsyncHttpResponse[typing.List[TestSetOutputResponse]]
1386
+ Successful Response
1387
+ """
1388
+ _response = await self._client_wrapper.httpx_client.request(
1389
+ "testsets",
1390
+ method="GET",
1391
+ request_options=request_options,
1392
+ )
1393
+ try:
1394
+ if 200 <= _response.status_code < 300:
1395
+ _data = typing.cast(
1396
+ typing.List[TestSetOutputResponse],
1397
+ parse_obj_as(
1398
+ type_=typing.List[TestSetOutputResponse], # type: ignore
1399
+ object_=_response.json(),
1400
+ ),
1401
+ )
1402
+ return AsyncHttpResponse(response=_response, data=_data)
1403
+ _response_json = _response.json()
1404
+ except JSONDecodeError:
1405
+ raise ApiError(
1406
+ status_code=_response.status_code,
1407
+ headers=dict(_response.headers),
1408
+ body=_response.text,
1409
+ )
1410
+ raise ApiError(
1411
+ status_code=_response.status_code,
1412
+ headers=dict(_response.headers),
1413
+ body=_response_json,
1414
+ )
1415
+
1416
+ async def create_testset(
1417
+ self,
1418
+ *,
1419
+ testset: Testset,
1420
+ request_options: typing.Optional[RequestOptions] = None,
1421
+ ) -> AsyncHttpResponse[TestsetResponse]:
1422
+ """
1423
+ Parameters
1424
+ ----------
1425
+ testset : Testset
1426
+
1427
+ request_options : typing.Optional[RequestOptions]
1428
+ Request-specific configuration.
1429
+
1430
+ Returns
1431
+ -------
1432
+ AsyncHttpResponse[TestsetResponse]
1433
+ Successful Response
1434
+ """
1435
+ _response = await self._client_wrapper.httpx_client.request(
1436
+ "preview/testsets/",
1437
+ method="POST",
1438
+ json={
1439
+ "testset": convert_and_respect_annotation_metadata(
1440
+ object_=testset, annotation=Testset, direction="write"
1441
+ ),
1442
+ },
1443
+ headers={
1444
+ "content-type": "application/json",
1445
+ },
1446
+ request_options=request_options,
1447
+ omit=OMIT,
1448
+ )
1449
+ try:
1450
+ if 200 <= _response.status_code < 300:
1451
+ _data = typing.cast(
1452
+ TestsetResponse,
1453
+ parse_obj_as(
1454
+ type_=TestsetResponse, # type: ignore
1455
+ object_=_response.json(),
1456
+ ),
1457
+ )
1458
+ return AsyncHttpResponse(response=_response, data=_data)
1459
+ if _response.status_code == 422:
1460
+ raise UnprocessableEntityError(
1461
+ headers=dict(_response.headers),
1462
+ body=typing.cast(
1463
+ HttpValidationError,
1464
+ parse_obj_as(
1465
+ type_=HttpValidationError, # type: ignore
1466
+ object_=_response.json(),
1467
+ ),
1468
+ ),
1469
+ )
1470
+ _response_json = _response.json()
1471
+ except JSONDecodeError:
1472
+ raise ApiError(
1473
+ status_code=_response.status_code,
1474
+ headers=dict(_response.headers),
1475
+ body=_response.text,
1476
+ )
1477
+ raise ApiError(
1478
+ status_code=_response.status_code,
1479
+ headers=dict(_response.headers),
1480
+ body=_response_json,
1481
+ )
1482
+
1483
+ async def delete_testsets(
1484
+ self,
1485
+ *,
1486
+ testset_ids: typing.Sequence[str],
1487
+ request_options: typing.Optional[RequestOptions] = None,
1488
+ ) -> AsyncHttpResponse[typing.List[str]]:
1489
+ """
1490
+ Delete specific testsets based on their unique IDs.
1491
+
1492
+ Args:
1493
+ testset_ids (List[str]): The unique identifiers of the testsets to delete.
1494
+
1495
+ Returns:
1496
+ A list of the deleted testsets' IDs.
1497
+
1498
+ Parameters
1499
+ ----------
1500
+ testset_ids : typing.Sequence[str]
1501
+
1502
+ request_options : typing.Optional[RequestOptions]
1503
+ Request-specific configuration.
1504
+
1505
+ Returns
1506
+ -------
1507
+ AsyncHttpResponse[typing.List[str]]
1508
+ Successful Response
1509
+ """
1510
+ _response = await self._client_wrapper.httpx_client.request(
1511
+ "testsets",
1512
+ method="DELETE",
1513
+ json={
1514
+ "testset_ids": testset_ids,
1515
+ },
1516
+ headers={
1517
+ "content-type": "application/json",
1518
+ },
1519
+ request_options=request_options,
1520
+ omit=OMIT,
1521
+ )
1522
+ try:
1523
+ if 200 <= _response.status_code < 300:
1524
+ _data = typing.cast(
1525
+ typing.List[str],
1526
+ parse_obj_as(
1527
+ type_=typing.List[str], # type: ignore
1528
+ object_=_response.json(),
1529
+ ),
1530
+ )
1531
+ return AsyncHttpResponse(response=_response, data=_data)
1532
+ if _response.status_code == 422:
1533
+ raise UnprocessableEntityError(
1534
+ headers=dict(_response.headers),
1535
+ body=typing.cast(
1536
+ HttpValidationError,
1537
+ parse_obj_as(
1538
+ type_=HttpValidationError, # type: ignore
1539
+ object_=_response.json(),
1540
+ ),
1541
+ ),
1542
+ )
1543
+ _response_json = _response.json()
1544
+ except JSONDecodeError:
1545
+ raise ApiError(
1546
+ status_code=_response.status_code,
1547
+ headers=dict(_response.headers),
1548
+ body=_response.text,
1549
+ )
1550
+ raise ApiError(
1551
+ status_code=_response.status_code,
1552
+ headers=dict(_response.headers),
1553
+ body=_response_json,
1554
+ )
1555
+
1556
+ async def get_single_testset(
1557
+ self,
1558
+ testset_id: str,
1559
+ *,
1560
+ request_options: typing.Optional[RequestOptions] = None,
1561
+ ) -> AsyncHttpResponse[typing.Optional[typing.Any]]:
1562
+ """
1563
+ Fetch a specific testset in Postgres.
1564
+
1565
+ Args:
1566
+ testset_id (str): The id of the testset to fetch.
1567
+
1568
+ Returns:
1569
+ The requested testset if found, else an HTTPException.
1570
+
1571
+ Parameters
1572
+ ----------
1573
+ testset_id : str
1574
+
1575
+ request_options : typing.Optional[RequestOptions]
1576
+ Request-specific configuration.
1577
+
1578
+ Returns
1579
+ -------
1580
+ AsyncHttpResponse[typing.Optional[typing.Any]]
1581
+ Successful Response
1582
+ """
1583
+ _response = await self._client_wrapper.httpx_client.request(
1584
+ f"testsets/{jsonable_encoder(testset_id)}",
1585
+ method="GET",
1586
+ request_options=request_options,
1587
+ )
1588
+ try:
1589
+ if _response is None or not _response.text.strip():
1590
+ return AsyncHttpResponse(response=_response, data=None)
1591
+ if 200 <= _response.status_code < 300:
1592
+ _data = typing.cast(
1593
+ typing.Optional[typing.Any],
1594
+ parse_obj_as(
1595
+ type_=typing.Optional[typing.Any], # type: ignore
1596
+ object_=_response.json(),
1597
+ ),
1598
+ )
1599
+ return AsyncHttpResponse(response=_response, data=_data)
1600
+ if _response.status_code == 422:
1601
+ raise UnprocessableEntityError(
1602
+ headers=dict(_response.headers),
1603
+ body=typing.cast(
1604
+ HttpValidationError,
1605
+ parse_obj_as(
1606
+ type_=HttpValidationError, # type: ignore
1607
+ object_=_response.json(),
1608
+ ),
1609
+ ),
1610
+ )
1611
+ _response_json = _response.json()
1612
+ except JSONDecodeError:
1613
+ raise ApiError(
1614
+ status_code=_response.status_code,
1615
+ headers=dict(_response.headers),
1616
+ body=_response.text,
1617
+ )
1618
+ raise ApiError(
1619
+ status_code=_response.status_code,
1620
+ headers=dict(_response.headers),
1621
+ body=_response_json,
1622
+ )
1623
+
1624
+ async def update_testset(
1625
+ self,
1626
+ testset_id: str,
1627
+ *,
1628
+ name: str,
1629
+ csvdata: typing.Sequence[typing.Dict[str, typing.Optional[typing.Any]]],
1630
+ request_options: typing.Optional[RequestOptions] = None,
1631
+ ) -> AsyncHttpResponse[typing.Optional[typing.Any]]:
1632
+ """
1633
+ Update a testset with given id, update the testset in Postgres.
1634
+
1635
+ Args:
1636
+ testset_id (str): id of the test set to be updated.
1637
+ csvdata (NewTestset): New data to replace the old testset.
1638
+
1639
+ Returns:
1640
+ str: The id of the test set updated.
1641
+
1642
+ Parameters
1643
+ ----------
1644
+ testset_id : str
1645
+
1646
+ name : str
1647
+
1648
+ csvdata : typing.Sequence[typing.Dict[str, typing.Optional[typing.Any]]]
1649
+
1650
+ request_options : typing.Optional[RequestOptions]
1651
+ Request-specific configuration.
1652
+
1653
+ Returns
1654
+ -------
1655
+ AsyncHttpResponse[typing.Optional[typing.Any]]
1656
+ Successful Response
1657
+ """
1658
+ _response = await self._client_wrapper.httpx_client.request(
1659
+ f"testsets/{jsonable_encoder(testset_id)}",
1660
+ method="PUT",
1661
+ json={
1662
+ "name": name,
1663
+ "csvdata": csvdata,
1664
+ },
1665
+ headers={
1666
+ "content-type": "application/json",
1667
+ },
1668
+ request_options=request_options,
1669
+ omit=OMIT,
1670
+ )
1671
+ try:
1672
+ if _response is None or not _response.text.strip():
1673
+ return AsyncHttpResponse(response=_response, data=None)
1674
+ if 200 <= _response.status_code < 300:
1675
+ _data = typing.cast(
1676
+ typing.Optional[typing.Any],
1677
+ parse_obj_as(
1678
+ type_=typing.Optional[typing.Any], # type: ignore
1679
+ object_=_response.json(),
1680
+ ),
1681
+ )
1682
+ return AsyncHttpResponse(response=_response, data=_data)
1683
+ if _response.status_code == 422:
1684
+ raise UnprocessableEntityError(
1685
+ headers=dict(_response.headers),
1686
+ body=typing.cast(
1687
+ HttpValidationError,
1688
+ parse_obj_as(
1689
+ type_=HttpValidationError, # type: ignore
1690
+ object_=_response.json(),
1691
+ ),
1692
+ ),
1693
+ )
1694
+ _response_json = _response.json()
1695
+ except JSONDecodeError:
1696
+ raise ApiError(
1697
+ status_code=_response.status_code,
1698
+ headers=dict(_response.headers),
1699
+ body=_response.text,
1700
+ )
1701
+ raise ApiError(
1702
+ status_code=_response.status_code,
1703
+ headers=dict(_response.headers),
1704
+ body=_response_json,
1705
+ )
1706
+
1707
+ async def list_testsets(
1708
+ self, *, request_options: typing.Optional[RequestOptions] = None
1709
+ ) -> AsyncHttpResponse[TestsetResponse]:
1710
+ """
1711
+ Parameters
1712
+ ----------
1713
+ request_options : typing.Optional[RequestOptions]
1714
+ Request-specific configuration.
1715
+
1716
+ Returns
1717
+ -------
1718
+ AsyncHttpResponse[TestsetResponse]
1719
+ Successful Response
1720
+ """
1721
+ _response = await self._client_wrapper.httpx_client.request(
1722
+ "preview/testsets/",
1723
+ method="GET",
1724
+ request_options=request_options,
1725
+ )
1726
+ try:
1727
+ if 200 <= _response.status_code < 300:
1728
+ _data = typing.cast(
1729
+ TestsetResponse,
1730
+ parse_obj_as(
1731
+ type_=TestsetResponse, # type: ignore
1732
+ object_=_response.json(),
1733
+ ),
1734
+ )
1735
+ return AsyncHttpResponse(response=_response, data=_data)
1736
+ if _response.status_code == 422:
1737
+ raise UnprocessableEntityError(
1738
+ headers=dict(_response.headers),
1739
+ body=typing.cast(
1740
+ HttpValidationError,
1741
+ parse_obj_as(
1742
+ type_=HttpValidationError, # type: ignore
1743
+ object_=_response.json(),
1744
+ ),
1745
+ ),
1746
+ )
1747
+ _response_json = _response.json()
1748
+ except JSONDecodeError:
1749
+ raise ApiError(
1750
+ status_code=_response.status_code,
1751
+ headers=dict(_response.headers),
1752
+ body=_response.text,
1753
+ )
1754
+ raise ApiError(
1755
+ status_code=_response.status_code,
1756
+ headers=dict(_response.headers),
1757
+ body=_response_json,
1758
+ )
1759
+
1760
+ async def fetch_testset(
1761
+ self,
1762
+ testset_id: str,
1763
+ *,
1764
+ request_options: typing.Optional[RequestOptions] = None,
1765
+ ) -> AsyncHttpResponse[TestsetResponse]:
1766
+ """
1767
+ Parameters
1768
+ ----------
1769
+ testset_id : str
1770
+
1771
+ request_options : typing.Optional[RequestOptions]
1772
+ Request-specific configuration.
1773
+
1774
+ Returns
1775
+ -------
1776
+ AsyncHttpResponse[TestsetResponse]
1777
+ Successful Response
1778
+ """
1779
+ _response = await self._client_wrapper.httpx_client.request(
1780
+ f"preview/testsets/{jsonable_encoder(testset_id)}",
1781
+ method="GET",
1782
+ request_options=request_options,
1783
+ )
1784
+ try:
1785
+ if 200 <= _response.status_code < 300:
1786
+ _data = typing.cast(
1787
+ TestsetResponse,
1788
+ parse_obj_as(
1789
+ type_=TestsetResponse, # type: ignore
1790
+ object_=_response.json(),
1791
+ ),
1792
+ )
1793
+ return AsyncHttpResponse(response=_response, data=_data)
1794
+ if _response.status_code == 422:
1795
+ raise UnprocessableEntityError(
1796
+ headers=dict(_response.headers),
1797
+ body=typing.cast(
1798
+ HttpValidationError,
1799
+ parse_obj_as(
1800
+ type_=HttpValidationError, # type: ignore
1801
+ object_=_response.json(),
1802
+ ),
1803
+ ),
1804
+ )
1805
+ _response_json = _response.json()
1806
+ except JSONDecodeError:
1807
+ raise ApiError(
1808
+ status_code=_response.status_code,
1809
+ headers=dict(_response.headers),
1810
+ body=_response.text,
1811
+ )
1812
+ raise ApiError(
1813
+ status_code=_response.status_code,
1814
+ headers=dict(_response.headers),
1815
+ body=_response_json,
1816
+ )
1817
+
1818
+ async def edit_testset(
1819
+ self,
1820
+ testset_id: str,
1821
+ *,
1822
+ testset: Testset,
1823
+ request_options: typing.Optional[RequestOptions] = None,
1824
+ ) -> AsyncHttpResponse[TestsetResponse]:
1825
+ """
1826
+ Parameters
1827
+ ----------
1828
+ testset_id : str
1829
+
1830
+ testset : Testset
1831
+
1832
+ request_options : typing.Optional[RequestOptions]
1833
+ Request-specific configuration.
1834
+
1835
+ Returns
1836
+ -------
1837
+ AsyncHttpResponse[TestsetResponse]
1838
+ Successful Response
1839
+ """
1840
+ _response = await self._client_wrapper.httpx_client.request(
1841
+ f"preview/testsets/{jsonable_encoder(testset_id)}",
1842
+ method="PUT",
1843
+ json={
1844
+ "testset": convert_and_respect_annotation_metadata(
1845
+ object_=testset, annotation=Testset, direction="write"
1846
+ ),
1847
+ },
1848
+ headers={
1849
+ "content-type": "application/json",
1850
+ },
1851
+ request_options=request_options,
1852
+ omit=OMIT,
1853
+ )
1854
+ try:
1855
+ if 200 <= _response.status_code < 300:
1856
+ _data = typing.cast(
1857
+ TestsetResponse,
1858
+ parse_obj_as(
1859
+ type_=TestsetResponse, # type: ignore
1860
+ object_=_response.json(),
1861
+ ),
1862
+ )
1863
+ return AsyncHttpResponse(response=_response, data=_data)
1864
+ if _response.status_code == 422:
1865
+ raise UnprocessableEntityError(
1866
+ headers=dict(_response.headers),
1867
+ body=typing.cast(
1868
+ HttpValidationError,
1869
+ parse_obj_as(
1870
+ type_=HttpValidationError, # type: ignore
1871
+ object_=_response.json(),
1872
+ ),
1873
+ ),
1874
+ )
1875
+ _response_json = _response.json()
1876
+ except JSONDecodeError:
1877
+ raise ApiError(
1878
+ status_code=_response.status_code,
1879
+ headers=dict(_response.headers),
1880
+ body=_response.text,
1881
+ )
1882
+ raise ApiError(
1883
+ status_code=_response.status_code,
1884
+ headers=dict(_response.headers),
1885
+ body=_response_json,
1886
+ )
1887
+
1888
+ async def archive_testset(
1889
+ self,
1890
+ testset_id: str,
1891
+ *,
1892
+ request_options: typing.Optional[RequestOptions] = None,
1893
+ ) -> AsyncHttpResponse[TestsetResponse]:
1894
+ """
1895
+ Parameters
1896
+ ----------
1897
+ testset_id : str
1898
+
1899
+ request_options : typing.Optional[RequestOptions]
1900
+ Request-specific configuration.
1901
+
1902
+ Returns
1903
+ -------
1904
+ AsyncHttpResponse[TestsetResponse]
1905
+ Successful Response
1906
+ """
1907
+ _response = await self._client_wrapper.httpx_client.request(
1908
+ f"preview/testsets/{jsonable_encoder(testset_id)}/archive",
1909
+ method="POST",
1910
+ request_options=request_options,
1911
+ )
1912
+ try:
1913
+ if 200 <= _response.status_code < 300:
1914
+ _data = typing.cast(
1915
+ TestsetResponse,
1916
+ parse_obj_as(
1917
+ type_=TestsetResponse, # type: ignore
1918
+ object_=_response.json(),
1919
+ ),
1920
+ )
1921
+ return AsyncHttpResponse(response=_response, data=_data)
1922
+ if _response.status_code == 422:
1923
+ raise UnprocessableEntityError(
1924
+ headers=dict(_response.headers),
1925
+ body=typing.cast(
1926
+ HttpValidationError,
1927
+ parse_obj_as(
1928
+ type_=HttpValidationError, # type: ignore
1929
+ object_=_response.json(),
1930
+ ),
1931
+ ),
1932
+ )
1933
+ _response_json = _response.json()
1934
+ except JSONDecodeError:
1935
+ raise ApiError(
1936
+ status_code=_response.status_code,
1937
+ headers=dict(_response.headers),
1938
+ body=_response.text,
1939
+ )
1940
+ raise ApiError(
1941
+ status_code=_response.status_code,
1942
+ headers=dict(_response.headers),
1943
+ body=_response_json,
1944
+ )
1945
+
1946
+ async def unarchive_testset(
1947
+ self,
1948
+ testset_id: str,
1949
+ *,
1950
+ request_options: typing.Optional[RequestOptions] = None,
1951
+ ) -> AsyncHttpResponse[TestsetResponse]:
1952
+ """
1953
+ Parameters
1954
+ ----------
1955
+ testset_id : str
1956
+
1957
+ request_options : typing.Optional[RequestOptions]
1958
+ Request-specific configuration.
1959
+
1960
+ Returns
1961
+ -------
1962
+ AsyncHttpResponse[TestsetResponse]
1963
+ Successful Response
1964
+ """
1965
+ _response = await self._client_wrapper.httpx_client.request(
1966
+ f"preview/testsets/{jsonable_encoder(testset_id)}/unarchive",
1967
+ method="POST",
1968
+ request_options=request_options,
1969
+ )
1970
+ try:
1971
+ if 200 <= _response.status_code < 300:
1972
+ _data = typing.cast(
1973
+ TestsetResponse,
1974
+ parse_obj_as(
1975
+ type_=TestsetResponse, # type: ignore
1976
+ object_=_response.json(),
1977
+ ),
1978
+ )
1979
+ return AsyncHttpResponse(response=_response, data=_data)
1980
+ if _response.status_code == 422:
1981
+ raise UnprocessableEntityError(
1982
+ headers=dict(_response.headers),
1983
+ body=typing.cast(
1984
+ HttpValidationError,
1985
+ parse_obj_as(
1986
+ type_=HttpValidationError, # type: ignore
1987
+ object_=_response.json(),
1988
+ ),
1989
+ ),
1990
+ )
1991
+ _response_json = _response.json()
1992
+ except JSONDecodeError:
1993
+ raise ApiError(
1994
+ status_code=_response.status_code,
1995
+ headers=dict(_response.headers),
1996
+ body=_response.text,
1997
+ )
1998
+ raise ApiError(
1999
+ status_code=_response.status_code,
2000
+ headers=dict(_response.headers),
2001
+ body=_response_json,
2002
+ )
2003
+
2004
+ async def query_testsets(
2005
+ self,
2006
+ *,
2007
+ request: typing.Optional[MetaRequest] = None,
2008
+ request_options: typing.Optional[RequestOptions] = None,
2009
+ ) -> AsyncHttpResponse[TestsetsResponse]:
2010
+ """
2011
+ Parameters
2012
+ ----------
2013
+ request : typing.Optional[MetaRequest]
2014
+
2015
+ request_options : typing.Optional[RequestOptions]
2016
+ Request-specific configuration.
2017
+
2018
+ Returns
2019
+ -------
2020
+ AsyncHttpResponse[TestsetsResponse]
2021
+ Successful Response
2022
+ """
2023
+ _response = await self._client_wrapper.httpx_client.request(
2024
+ "preview/testsets/query",
2025
+ method="POST",
2026
+ json=convert_and_respect_annotation_metadata(
2027
+ object_=request, annotation=MetaRequest, direction="write"
2028
+ ),
2029
+ headers={
2030
+ "content-type": "application/json",
2031
+ },
2032
+ request_options=request_options,
2033
+ omit=OMIT,
2034
+ )
2035
+ try:
2036
+ if 200 <= _response.status_code < 300:
2037
+ _data = typing.cast(
2038
+ TestsetsResponse,
2039
+ parse_obj_as(
2040
+ type_=TestsetsResponse, # type: ignore
2041
+ object_=_response.json(),
2042
+ ),
2043
+ )
2044
+ return AsyncHttpResponse(response=_response, data=_data)
2045
+ if _response.status_code == 422:
2046
+ raise UnprocessableEntityError(
2047
+ headers=dict(_response.headers),
2048
+ body=typing.cast(
2049
+ HttpValidationError,
2050
+ parse_obj_as(
2051
+ type_=HttpValidationError, # type: ignore
2052
+ object_=_response.json(),
2053
+ ),
2054
+ ),
2055
+ )
2056
+ _response_json = _response.json()
2057
+ except JSONDecodeError:
2058
+ raise ApiError(
2059
+ status_code=_response.status_code,
2060
+ headers=dict(_response.headers),
2061
+ body=_response.text,
2062
+ )
2063
+ raise ApiError(
2064
+ status_code=_response.status_code,
2065
+ headers=dict(_response.headers),
2066
+ body=_response_json,
2067
+ )
2068
+
2069
+ async def create_testset_from_file(
2070
+ self,
2071
+ *,
2072
+ file: core.File,
2073
+ file_type: typing.Optional[CreateTestsetFromFileRequestFileType] = OMIT,
2074
+ testset_slug: typing.Optional[str] = OMIT,
2075
+ testset_name: typing.Optional[str] = OMIT,
2076
+ testset_description: typing.Optional[str] = OMIT,
2077
+ testset_meta: typing.Optional[typing.List[str]] = OMIT,
2078
+ request_options: typing.Optional[RequestOptions] = None,
2079
+ ) -> AsyncHttpResponse[TestsetResponse]:
2080
+ """
2081
+ Parameters
2082
+ ----------
2083
+ file : core.File
2084
+ See core.File for more documentation
2085
+
2086
+ file_type : typing.Optional[CreateTestsetFromFileRequestFileType]
2087
+
2088
+ testset_slug : typing.Optional[str]
2089
+
2090
+ testset_name : typing.Optional[str]
2091
+
2092
+ testset_description : typing.Optional[str]
2093
+
2094
+ testset_meta : typing.Optional[typing.List[str]]
2095
+
2096
+ request_options : typing.Optional[RequestOptions]
2097
+ Request-specific configuration.
2098
+
2099
+ Returns
2100
+ -------
2101
+ AsyncHttpResponse[TestsetResponse]
2102
+ Successful Response
2103
+ """
2104
+ _response = await self._client_wrapper.httpx_client.request(
2105
+ "preview/testsets/upload",
2106
+ method="POST",
2107
+ data={
2108
+ "file_type": file_type,
2109
+ "testset_slug": testset_slug,
2110
+ "testset_name": testset_name,
2111
+ "testset_description": testset_description,
2112
+ "testset_meta": testset_meta,
2113
+ },
2114
+ files={
2115
+ "file": file,
2116
+ },
2117
+ request_options=request_options,
2118
+ omit=OMIT,
2119
+ force_multipart=True,
2120
+ )
2121
+ try:
2122
+ if 200 <= _response.status_code < 300:
2123
+ _data = typing.cast(
2124
+ TestsetResponse,
2125
+ parse_obj_as(
2126
+ type_=TestsetResponse, # type: ignore
2127
+ object_=_response.json(),
2128
+ ),
2129
+ )
2130
+ return AsyncHttpResponse(response=_response, data=_data)
2131
+ if _response.status_code == 422:
2132
+ raise UnprocessableEntityError(
2133
+ headers=dict(_response.headers),
2134
+ body=typing.cast(
2135
+ HttpValidationError,
2136
+ parse_obj_as(
2137
+ type_=HttpValidationError, # type: ignore
2138
+ object_=_response.json(),
2139
+ ),
2140
+ ),
2141
+ )
2142
+ _response_json = _response.json()
2143
+ except JSONDecodeError:
2144
+ raise ApiError(
2145
+ status_code=_response.status_code,
2146
+ headers=dict(_response.headers),
2147
+ body=_response.text,
2148
+ )
2149
+ raise ApiError(
2150
+ status_code=_response.status_code,
2151
+ headers=dict(_response.headers),
2152
+ body=_response_json,
2153
+ )
2154
+
2155
+ async def update_testset_from_file(
2156
+ self,
2157
+ testset_id: str,
2158
+ *,
2159
+ file: core.File,
2160
+ file_type: typing.Optional[UpdateTestsetFromFileRequestFileType] = OMIT,
2161
+ request_options: typing.Optional[RequestOptions] = None,
2162
+ ) -> AsyncHttpResponse[TestsetResponse]:
2163
+ """
2164
+ Parameters
2165
+ ----------
2166
+ testset_id : str
2167
+
2168
+ file : core.File
2169
+ See core.File for more documentation
2170
+
2171
+ file_type : typing.Optional[UpdateTestsetFromFileRequestFileType]
2172
+
2173
+ request_options : typing.Optional[RequestOptions]
2174
+ Request-specific configuration.
2175
+
2176
+ Returns
2177
+ -------
2178
+ AsyncHttpResponse[TestsetResponse]
2179
+ Successful Response
2180
+ """
2181
+ _response = await self._client_wrapper.httpx_client.request(
2182
+ f"preview/testsets/{jsonable_encoder(testset_id)}/upload",
2183
+ method="POST",
2184
+ data={
2185
+ "file_type": file_type,
2186
+ },
2187
+ files={
2188
+ "file": file,
2189
+ },
2190
+ request_options=request_options,
2191
+ omit=OMIT,
2192
+ force_multipart=True,
2193
+ )
2194
+ try:
2195
+ if 200 <= _response.status_code < 300:
2196
+ _data = typing.cast(
2197
+ TestsetResponse,
2198
+ parse_obj_as(
2199
+ type_=TestsetResponse, # type: ignore
2200
+ object_=_response.json(),
2201
+ ),
2202
+ )
2203
+ return AsyncHttpResponse(response=_response, data=_data)
2204
+ if _response.status_code == 422:
2205
+ raise UnprocessableEntityError(
2206
+ headers=dict(_response.headers),
2207
+ body=typing.cast(
2208
+ HttpValidationError,
2209
+ parse_obj_as(
2210
+ type_=HttpValidationError, # type: ignore
2211
+ object_=_response.json(),
2212
+ ),
2213
+ ),
2214
+ )
2215
+ _response_json = _response.json()
2216
+ except JSONDecodeError:
2217
+ raise ApiError(
2218
+ status_code=_response.status_code,
2219
+ headers=dict(_response.headers),
2220
+ body=_response.text,
2221
+ )
2222
+ raise ApiError(
2223
+ status_code=_response.status_code,
2224
+ headers=dict(_response.headers),
2225
+ body=_response_json,
2226
+ )
2227
+
2228
+ async def fetch_testset_to_file(
2229
+ self,
2230
+ testset_id: str,
2231
+ *,
2232
+ file_type: typing.Optional[FetchTestsetToFileRequestFileType] = None,
2233
+ request_options: typing.Optional[RequestOptions] = None,
2234
+ ) -> AsyncHttpResponse[TestsetResponse]:
2235
+ """
2236
+ Parameters
2237
+ ----------
2238
+ testset_id : str
2239
+
2240
+ file_type : typing.Optional[FetchTestsetToFileRequestFileType]
2241
+
2242
+ request_options : typing.Optional[RequestOptions]
2243
+ Request-specific configuration.
2244
+
2245
+ Returns
2246
+ -------
2247
+ AsyncHttpResponse[TestsetResponse]
2248
+ Successful Response
2249
+ """
2250
+ _response = await self._client_wrapper.httpx_client.request(
2251
+ f"preview/testsets/{jsonable_encoder(testset_id)}/download",
2252
+ method="POST",
2253
+ params={
2254
+ "file_type": file_type,
2255
+ },
2256
+ request_options=request_options,
2257
+ )
2258
+ try:
2259
+ if 200 <= _response.status_code < 300:
2260
+ _data = typing.cast(
2261
+ TestsetResponse,
2262
+ parse_obj_as(
2263
+ type_=TestsetResponse, # type: ignore
2264
+ object_=_response.json(),
2265
+ ),
2266
+ )
2267
+ return AsyncHttpResponse(response=_response, data=_data)
2268
+ if _response.status_code == 422:
2269
+ raise UnprocessableEntityError(
2270
+ headers=dict(_response.headers),
2271
+ body=typing.cast(
2272
+ HttpValidationError,
2273
+ parse_obj_as(
2274
+ type_=HttpValidationError, # type: ignore
2275
+ object_=_response.json(),
2276
+ ),
2277
+ ),
2278
+ )
2279
+ _response_json = _response.json()
2280
+ except JSONDecodeError:
2281
+ raise ApiError(
2282
+ status_code=_response.status_code,
2283
+ headers=dict(_response.headers),
2284
+ body=_response.text,
2285
+ )
2286
+ raise ApiError(
2287
+ status_code=_response.status_code,
2288
+ headers=dict(_response.headers),
2289
+ body=_response_json,
2290
+ )
2291
+
2292
+ async def fetch_testcase(
2293
+ self,
2294
+ testcase_id: str,
2295
+ *,
2296
+ request_options: typing.Optional[RequestOptions] = None,
2297
+ ) -> AsyncHttpResponse[TestcaseResponse]:
2298
+ """
2299
+ Parameters
2300
+ ----------
2301
+ testcase_id : str
2302
+
2303
+ request_options : typing.Optional[RequestOptions]
2304
+ Request-specific configuration.
2305
+
2306
+ Returns
2307
+ -------
2308
+ AsyncHttpResponse[TestcaseResponse]
2309
+ Successful Response
2310
+ """
2311
+ _response = await self._client_wrapper.httpx_client.request(
2312
+ f"preview/testsets/testcases/{jsonable_encoder(testcase_id)}",
2313
+ method="GET",
2314
+ request_options=request_options,
2315
+ )
2316
+ try:
2317
+ if 200 <= _response.status_code < 300:
2318
+ _data = typing.cast(
2319
+ TestcaseResponse,
2320
+ parse_obj_as(
2321
+ type_=TestcaseResponse, # type: ignore
2322
+ object_=_response.json(),
2323
+ ),
2324
+ )
2325
+ return AsyncHttpResponse(response=_response, data=_data)
2326
+ if _response.status_code == 422:
2327
+ raise UnprocessableEntityError(
2328
+ headers=dict(_response.headers),
2329
+ body=typing.cast(
2330
+ HttpValidationError,
2331
+ parse_obj_as(
2332
+ type_=HttpValidationError, # type: ignore
2333
+ object_=_response.json(),
2334
+ ),
2335
+ ),
2336
+ )
2337
+ _response_json = _response.json()
2338
+ except JSONDecodeError:
2339
+ raise ApiError(
2340
+ status_code=_response.status_code,
2341
+ headers=dict(_response.headers),
2342
+ body=_response.text,
2343
+ )
2344
+ raise ApiError(
2345
+ status_code=_response.status_code,
2346
+ headers=dict(_response.headers),
2347
+ body=_response_json,
2348
+ )