groundx 2.0.15__py3-none-any.whl → 2.7.7__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 (147) hide show
  1. groundx/__init__.py +73 -21
  2. groundx/buckets/__init__.py +2 -0
  3. groundx/buckets/client.py +55 -388
  4. groundx/buckets/raw_client.py +628 -0
  5. groundx/client.py +22 -21
  6. groundx/core/__init__.py +5 -0
  7. groundx/core/api_error.py +13 -5
  8. groundx/core/client_wrapper.py +4 -3
  9. groundx/core/force_multipart.py +16 -0
  10. groundx/core/http_client.py +76 -32
  11. groundx/core/http_response.py +55 -0
  12. groundx/core/jsonable_encoder.py +0 -1
  13. groundx/core/pydantic_utilities.py +71 -112
  14. groundx/core/serialization.py +7 -3
  15. groundx/csv_splitter.py +64 -0
  16. groundx/customer/__init__.py +2 -0
  17. groundx/customer/client.py +31 -43
  18. groundx/customer/raw_client.py +91 -0
  19. groundx/documents/__init__.py +1 -2
  20. groundx/documents/client.py +455 -953
  21. groundx/documents/raw_client.py +1450 -0
  22. groundx/errors/__init__.py +2 -0
  23. groundx/errors/bad_request_error.py +4 -3
  24. groundx/errors/unauthorized_error.py +4 -3
  25. groundx/extract/__init__.py +48 -0
  26. groundx/extract/agents/__init__.py +7 -0
  27. groundx/extract/agents/agent.py +202 -0
  28. groundx/extract/classes/__init__.py +24 -0
  29. groundx/extract/classes/agent.py +23 -0
  30. groundx/extract/classes/api.py +15 -0
  31. groundx/extract/classes/document.py +338 -0
  32. groundx/extract/classes/field.py +88 -0
  33. groundx/extract/classes/groundx.py +147 -0
  34. groundx/extract/classes/prompt.py +36 -0
  35. groundx/extract/classes/test_document.py +109 -0
  36. groundx/extract/classes/test_field.py +43 -0
  37. groundx/extract/classes/test_groundx.py +223 -0
  38. groundx/extract/classes/test_prompt.py +68 -0
  39. groundx/extract/post_process/__init__.py +7 -0
  40. groundx/extract/post_process/post_process.py +33 -0
  41. groundx/extract/services/.DS_Store +0 -0
  42. groundx/extract/services/__init__.py +14 -0
  43. groundx/extract/services/csv.py +76 -0
  44. groundx/extract/services/logger.py +126 -0
  45. groundx/extract/services/logging_cfg.py +53 -0
  46. groundx/extract/services/ratelimit.py +104 -0
  47. groundx/extract/services/sheets_client.py +160 -0
  48. groundx/extract/services/status.py +197 -0
  49. groundx/extract/services/upload.py +68 -0
  50. groundx/extract/services/upload_minio.py +122 -0
  51. groundx/extract/services/upload_s3.py +91 -0
  52. groundx/extract/services/utility.py +52 -0
  53. groundx/extract/settings/__init__.py +15 -0
  54. groundx/extract/settings/settings.py +212 -0
  55. groundx/extract/settings/test_settings.py +512 -0
  56. groundx/extract/tasks/__init__.py +6 -0
  57. groundx/extract/tasks/utility.py +27 -0
  58. groundx/extract/utility/__init__.py +15 -0
  59. groundx/extract/utility/classes.py +193 -0
  60. groundx/extract/utility/test_utility.py +81 -0
  61. groundx/groups/__init__.py +2 -0
  62. groundx/groups/client.py +63 -550
  63. groundx/groups/raw_client.py +901 -0
  64. groundx/health/__init__.py +2 -0
  65. groundx/health/client.py +35 -101
  66. groundx/health/raw_client.py +193 -0
  67. groundx/ingest.py +771 -0
  68. groundx/search/__init__.py +2 -0
  69. groundx/search/client.py +94 -227
  70. groundx/search/raw_client.py +442 -0
  71. groundx/search/types/__init__.py +2 -0
  72. groundx/types/__init__.py +68 -16
  73. groundx/types/bounding_box_detail.py +4 -4
  74. groundx/types/bucket_detail.py +5 -5
  75. groundx/types/bucket_list_response.py +17 -3
  76. groundx/types/bucket_response.py +3 -3
  77. groundx/types/bucket_update_detail.py +4 -4
  78. groundx/types/bucket_update_response.py +3 -3
  79. groundx/types/customer_detail.py +2 -2
  80. groundx/types/customer_response.py +3 -3
  81. groundx/types/document.py +54 -0
  82. groundx/types/document_detail.py +16 -4
  83. groundx/types/document_list_response.py +4 -4
  84. groundx/types/document_local_ingest_request.py +7 -0
  85. groundx/types/document_lookup_response.py +8 -3
  86. groundx/types/document_response.py +3 -3
  87. groundx/types/document_type.py +21 -1
  88. groundx/types/group_detail.py +4 -4
  89. groundx/types/group_list_response.py +17 -3
  90. groundx/types/group_response.py +3 -3
  91. groundx/types/health_response.py +3 -3
  92. groundx/types/health_response_health.py +3 -3
  93. groundx/types/health_service.py +5 -5
  94. groundx/types/ingest_local_document.py +25 -0
  95. groundx/types/ingest_local_document_metadata.py +51 -0
  96. groundx/types/ingest_remote_document.py +15 -6
  97. groundx/types/ingest_response.py +4 -4
  98. groundx/types/{process_status_response_ingest.py → ingest_status.py} +8 -7
  99. groundx/types/{ingest_response_ingest.py → ingest_status_light.py} +7 -5
  100. groundx/types/ingest_status_progress.py +26 -0
  101. groundx/types/{process_status_response_ingest_progress_errors.py → ingest_status_progress_cancelled.py} +4 -4
  102. groundx/types/{process_status_response_ingest_progress_complete.py → ingest_status_progress_complete.py} +4 -4
  103. groundx/types/{process_status_response_ingest_progress_cancelled.py → ingest_status_progress_errors.py} +4 -4
  104. groundx/types/{process_status_response_ingest_progress_processing.py → ingest_status_progress_processing.py} +4 -4
  105. groundx/types/message_response.py +2 -2
  106. groundx/types/meter_detail.py +2 -2
  107. groundx/types/process_level.py +5 -0
  108. groundx/types/{process_status_response.py → processes_status_response.py} +8 -5
  109. groundx/types/processing_status.py +3 -1
  110. groundx/types/search_response.py +3 -3
  111. groundx/types/search_response_search.py +3 -3
  112. groundx/types/search_result_item.py +7 -5
  113. groundx/types/search_result_item_pages_item.py +41 -0
  114. groundx/types/subscription_detail.py +3 -3
  115. groundx/types/subscription_detail_meters.py +5 -5
  116. groundx/{documents/types/website_crawl_request_websites_item.py → types/website_source.py} +7 -7
  117. groundx/types/workflow_apply_request.py +24 -0
  118. groundx/types/workflow_detail.py +59 -0
  119. groundx/types/workflow_detail_chunk_strategy.py +5 -0
  120. groundx/types/workflow_detail_relationships.py +36 -0
  121. groundx/types/workflow_engine.py +58 -0
  122. groundx/types/workflow_engine_reasoning_effort.py +5 -0
  123. groundx/types/workflow_engine_service.py +7 -0
  124. groundx/types/workflow_prompt.py +37 -0
  125. groundx/types/workflow_prompt_group.py +25 -0
  126. groundx/types/workflow_prompt_role.py +5 -0
  127. groundx/types/workflow_request.py +31 -0
  128. groundx/types/workflow_request_chunk_strategy.py +5 -0
  129. groundx/types/workflow_response.py +20 -0
  130. groundx/types/workflow_step.py +33 -0
  131. groundx/types/workflow_step_config.py +33 -0
  132. groundx/types/workflow_step_config_field.py +8 -0
  133. groundx/types/workflow_steps.py +38 -0
  134. groundx/types/workflows_response.py +20 -0
  135. groundx/workflows/__init__.py +7 -0
  136. groundx/workflows/client.py +736 -0
  137. groundx/workflows/raw_client.py +841 -0
  138. groundx/workflows/types/__init__.py +7 -0
  139. groundx/workflows/types/workflows_get_request_id.py +5 -0
  140. {groundx-2.0.15.dist-info → groundx-2.7.7.dist-info}/LICENSE +1 -1
  141. {groundx-2.0.15.dist-info → groundx-2.7.7.dist-info}/METADATA +39 -22
  142. groundx-2.7.7.dist-info/RECORD +155 -0
  143. groundx/documents/types/__init__.py +0 -6
  144. groundx/documents/types/documents_ingest_local_request_files_item.py +0 -43
  145. groundx/types/process_status_response_ingest_progress.py +0 -26
  146. groundx-2.0.15.dist-info/RECORD +0 -82
  147. {groundx-2.0.15.dist-info → groundx-2.7.7.dist-info}/WHEEL +0 -0
@@ -0,0 +1,1450 @@
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 ..core.serialization import convert_and_respect_annotation_metadata
13
+ from ..errors.bad_request_error import BadRequestError
14
+ from ..errors.unauthorized_error import UnauthorizedError
15
+ from ..types.document_list_response import DocumentListResponse
16
+ from ..types.document_local_ingest_request import DocumentLocalIngestRequest
17
+ from ..types.document_lookup_response import DocumentLookupResponse
18
+ from ..types.document_response import DocumentResponse
19
+ from ..types.ingest_remote_document import IngestRemoteDocument
20
+ from ..types.ingest_response import IngestResponse
21
+ from ..types.processes_status_response import ProcessesStatusResponse
22
+ from ..types.processing_status import ProcessingStatus
23
+ from ..types.sort import Sort
24
+ from ..types.sort_order import SortOrder
25
+ from ..types.website_source import WebsiteSource
26
+
27
+ # this is used as the default value for optional parameters
28
+ OMIT = typing.cast(typing.Any, ...)
29
+
30
+
31
+ class RawDocumentsClient:
32
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
33
+ self._client_wrapper = client_wrapper
34
+
35
+ def ingest_remote(
36
+ self,
37
+ *,
38
+ documents: typing.Sequence[IngestRemoteDocument],
39
+ callback_url: typing.Optional[str] = OMIT,
40
+ callback_data: typing.Optional[str] = OMIT,
41
+ request_options: typing.Optional[RequestOptions] = None,
42
+ ) -> HttpResponse[IngestResponse]:
43
+ """
44
+ Ingest documents hosted on public URLs into a GroundX bucket.
45
+
46
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
47
+
48
+ Parameters
49
+ ----------
50
+ documents : typing.Sequence[IngestRemoteDocument]
51
+
52
+ callback_url : typing.Optional[str]
53
+ An endpoint that will receive processing event updates as POST.
54
+
55
+ callback_data : typing.Optional[str]
56
+ A string that is returned, along with processing event updates, to the callback URL.
57
+
58
+ request_options : typing.Optional[RequestOptions]
59
+ Request-specific configuration.
60
+
61
+ Returns
62
+ -------
63
+ HttpResponse[IngestResponse]
64
+ Documents successfully uploaded
65
+ """
66
+ _response = self._client_wrapper.httpx_client.request(
67
+ "v1/ingest/documents/remote",
68
+ method="POST",
69
+ json={
70
+ "documents": convert_and_respect_annotation_metadata(
71
+ object_=documents, annotation=typing.Sequence[IngestRemoteDocument], direction="write"
72
+ ),
73
+ "callbackUrl": callback_url,
74
+ "callbackData": callback_data,
75
+ },
76
+ headers={
77
+ "content-type": "application/json",
78
+ },
79
+ request_options=request_options,
80
+ omit=OMIT,
81
+ )
82
+ try:
83
+ if 200 <= _response.status_code < 300:
84
+ _data = typing.cast(
85
+ IngestResponse,
86
+ parse_obj_as(
87
+ type_=IngestResponse, # type: ignore
88
+ object_=_response.json(),
89
+ ),
90
+ )
91
+ return HttpResponse(response=_response, data=_data)
92
+ if _response.status_code == 400:
93
+ raise BadRequestError(
94
+ headers=dict(_response.headers),
95
+ body=typing.cast(
96
+ typing.Optional[typing.Any],
97
+ parse_obj_as(
98
+ type_=typing.Optional[typing.Any], # type: ignore
99
+ object_=_response.json(),
100
+ ),
101
+ ),
102
+ )
103
+ if _response.status_code == 401:
104
+ raise UnauthorizedError(
105
+ headers=dict(_response.headers),
106
+ body=typing.cast(
107
+ typing.Optional[typing.Any],
108
+ parse_obj_as(
109
+ type_=typing.Optional[typing.Any], # type: ignore
110
+ object_=_response.json(),
111
+ ),
112
+ ),
113
+ )
114
+ _response_json = _response.json()
115
+ except JSONDecodeError:
116
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
117
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
118
+
119
+ def ingest_local(
120
+ self, *, request: DocumentLocalIngestRequest, request_options: typing.Optional[RequestOptions] = None
121
+ ) -> HttpResponse[IngestResponse]:
122
+ """
123
+ Upload documents hosted on a local file system into a GroundX bucket.
124
+
125
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
126
+
127
+ Parameters
128
+ ----------
129
+ request : DocumentLocalIngestRequest
130
+
131
+ request_options : typing.Optional[RequestOptions]
132
+ Request-specific configuration.
133
+
134
+ Returns
135
+ -------
136
+ HttpResponse[IngestResponse]
137
+ Documents successfully uploaded
138
+ """
139
+ _response = self._client_wrapper.httpx_client.request(
140
+ "v1/ingest/documents/local",
141
+ method="POST",
142
+ json=convert_and_respect_annotation_metadata(
143
+ object_=request, annotation=DocumentLocalIngestRequest, direction="write"
144
+ ),
145
+ headers={
146
+ "content-type": "application/json",
147
+ },
148
+ request_options=request_options,
149
+ omit=OMIT,
150
+ )
151
+ try:
152
+ if 200 <= _response.status_code < 300:
153
+ _data = typing.cast(
154
+ IngestResponse,
155
+ parse_obj_as(
156
+ type_=IngestResponse, # type: ignore
157
+ object_=_response.json(),
158
+ ),
159
+ )
160
+ return HttpResponse(response=_response, data=_data)
161
+ if _response.status_code == 400:
162
+ raise BadRequestError(
163
+ headers=dict(_response.headers),
164
+ body=typing.cast(
165
+ typing.Optional[typing.Any],
166
+ parse_obj_as(
167
+ type_=typing.Optional[typing.Any], # type: ignore
168
+ object_=_response.json(),
169
+ ),
170
+ ),
171
+ )
172
+ if _response.status_code == 401:
173
+ raise UnauthorizedError(
174
+ headers=dict(_response.headers),
175
+ body=typing.cast(
176
+ typing.Optional[typing.Any],
177
+ parse_obj_as(
178
+ type_=typing.Optional[typing.Any], # type: ignore
179
+ object_=_response.json(),
180
+ ),
181
+ ),
182
+ )
183
+ _response_json = _response.json()
184
+ except JSONDecodeError:
185
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
186
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
187
+
188
+ def crawl_website(
189
+ self,
190
+ *,
191
+ websites: typing.Sequence[WebsiteSource],
192
+ callback_url: typing.Optional[str] = OMIT,
193
+ callback_data: typing.Optional[str] = OMIT,
194
+ request_options: typing.Optional[RequestOptions] = None,
195
+ ) -> HttpResponse[IngestResponse]:
196
+ """
197
+ Upload the content of a publicly accessible website for ingestion into a GroundX bucket. This is done by following links within a specified URL, recursively, up to a specified depth or number of pages.
198
+
199
+ Note1: This endpoint is currently not supported for on-prem deployments.
200
+ Note2: The `source_url` must include the protocol, http:// or https://.
201
+
202
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
203
+
204
+ Parameters
205
+ ----------
206
+ websites : typing.Sequence[WebsiteSource]
207
+
208
+ callback_url : typing.Optional[str]
209
+ The URL that will receive processing event updates.
210
+
211
+ callback_data : typing.Optional[str]
212
+ A string that is returned, along with processing event updates, to the callback URL.
213
+
214
+ request_options : typing.Optional[RequestOptions]
215
+ Request-specific configuration.
216
+
217
+ Returns
218
+ -------
219
+ HttpResponse[IngestResponse]
220
+ Website successfully queued
221
+ """
222
+ _response = self._client_wrapper.httpx_client.request(
223
+ "v1/ingest/documents/website",
224
+ method="POST",
225
+ json={
226
+ "websites": convert_and_respect_annotation_metadata(
227
+ object_=websites, annotation=typing.Sequence[WebsiteSource], direction="write"
228
+ ),
229
+ "callbackUrl": callback_url,
230
+ "callbackData": callback_data,
231
+ },
232
+ headers={
233
+ "content-type": "application/json",
234
+ },
235
+ request_options=request_options,
236
+ omit=OMIT,
237
+ )
238
+ try:
239
+ if 200 <= _response.status_code < 300:
240
+ _data = typing.cast(
241
+ IngestResponse,
242
+ parse_obj_as(
243
+ type_=IngestResponse, # type: ignore
244
+ object_=_response.json(),
245
+ ),
246
+ )
247
+ return HttpResponse(response=_response, data=_data)
248
+ if _response.status_code == 400:
249
+ raise BadRequestError(
250
+ headers=dict(_response.headers),
251
+ body=typing.cast(
252
+ typing.Optional[typing.Any],
253
+ parse_obj_as(
254
+ type_=typing.Optional[typing.Any], # type: ignore
255
+ object_=_response.json(),
256
+ ),
257
+ ),
258
+ )
259
+ if _response.status_code == 401:
260
+ raise UnauthorizedError(
261
+ headers=dict(_response.headers),
262
+ body=typing.cast(
263
+ typing.Optional[typing.Any],
264
+ parse_obj_as(
265
+ type_=typing.Optional[typing.Any], # type: ignore
266
+ object_=_response.json(),
267
+ ),
268
+ ),
269
+ )
270
+ _response_json = _response.json()
271
+ except JSONDecodeError:
272
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
273
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
274
+
275
+ def list(
276
+ self,
277
+ *,
278
+ n: typing.Optional[int] = None,
279
+ filter: typing.Optional[str] = None,
280
+ sort: typing.Optional[Sort] = None,
281
+ sort_order: typing.Optional[SortOrder] = None,
282
+ status: typing.Optional[ProcessingStatus] = None,
283
+ next_token: typing.Optional[str] = None,
284
+ request_options: typing.Optional[RequestOptions] = None,
285
+ ) -> HttpResponse[DocumentListResponse]:
286
+ """
287
+ lookup all documents across all resources which are currently on GroundX
288
+
289
+ Parameters
290
+ ----------
291
+ n : typing.Optional[int]
292
+ The maximum number of returned documents. Accepts 1-100 with a default of 20.
293
+
294
+ filter : typing.Optional[str]
295
+ Only documents with names that contain the filter string will be returned in the results.
296
+
297
+ sort : typing.Optional[Sort]
298
+ The document attribute that will be used to sort the results.
299
+
300
+ sort_order : typing.Optional[SortOrder]
301
+ The order in which to sort the results. A value for sort must also be set.
302
+
303
+ status : typing.Optional[ProcessingStatus]
304
+ A status filter on the get documents query. If this value is set, then only documents with this status will be returned in the results.
305
+
306
+ next_token : typing.Optional[str]
307
+ A token for pagination. If the number of documents for a given query is larger than n, the response will include a "nextToken" value. That token can be included in this field to retrieve the next batch of n documents.
308
+
309
+ request_options : typing.Optional[RequestOptions]
310
+ Request-specific configuration.
311
+
312
+ Returns
313
+ -------
314
+ HttpResponse[DocumentListResponse]
315
+ Look up success
316
+ """
317
+ _response = self._client_wrapper.httpx_client.request(
318
+ "v1/ingest/documents",
319
+ method="GET",
320
+ params={
321
+ "n": n,
322
+ "filter": filter,
323
+ "sort": sort,
324
+ "sortOrder": sort_order,
325
+ "status": status,
326
+ "nextToken": next_token,
327
+ },
328
+ request_options=request_options,
329
+ )
330
+ try:
331
+ if 200 <= _response.status_code < 300:
332
+ _data = typing.cast(
333
+ DocumentListResponse,
334
+ parse_obj_as(
335
+ type_=DocumentListResponse, # type: ignore
336
+ object_=_response.json(),
337
+ ),
338
+ )
339
+ return HttpResponse(response=_response, data=_data)
340
+ _response_json = _response.json()
341
+ except JSONDecodeError:
342
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
343
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
344
+
345
+ def delete(
346
+ self,
347
+ *,
348
+ document_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
349
+ request_options: typing.Optional[RequestOptions] = None,
350
+ ) -> HttpResponse[IngestResponse]:
351
+ """
352
+ Delete multiple documents hosted on GroundX
353
+
354
+ Parameters
355
+ ----------
356
+ document_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]]
357
+ A list of documentIds which correspond to documents ingested by GroundX
358
+
359
+ request_options : typing.Optional[RequestOptions]
360
+ Request-specific configuration.
361
+
362
+ Returns
363
+ -------
364
+ HttpResponse[IngestResponse]
365
+ Documents are queued to be deleted
366
+ """
367
+ _response = self._client_wrapper.httpx_client.request(
368
+ "v1/ingest/documents",
369
+ method="DELETE",
370
+ params={
371
+ "documentIds": document_ids,
372
+ },
373
+ request_options=request_options,
374
+ )
375
+ try:
376
+ if 200 <= _response.status_code < 300:
377
+ _data = typing.cast(
378
+ IngestResponse,
379
+ parse_obj_as(
380
+ type_=IngestResponse, # type: ignore
381
+ object_=_response.json(),
382
+ ),
383
+ )
384
+ return HttpResponse(response=_response, data=_data)
385
+ if _response.status_code == 400:
386
+ raise BadRequestError(
387
+ headers=dict(_response.headers),
388
+ body=typing.cast(
389
+ typing.Optional[typing.Any],
390
+ parse_obj_as(
391
+ type_=typing.Optional[typing.Any], # type: ignore
392
+ object_=_response.json(),
393
+ ),
394
+ ),
395
+ )
396
+ if _response.status_code == 401:
397
+ raise UnauthorizedError(
398
+ headers=dict(_response.headers),
399
+ body=typing.cast(
400
+ typing.Optional[typing.Any],
401
+ parse_obj_as(
402
+ type_=typing.Optional[typing.Any], # type: ignore
403
+ object_=_response.json(),
404
+ ),
405
+ ),
406
+ )
407
+ _response_json = _response.json()
408
+ except JSONDecodeError:
409
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
410
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
411
+
412
+ def get_processing_status_by_id(
413
+ self, process_id: str, *, request_options: typing.Optional[RequestOptions] = None
414
+ ) -> HttpResponse[IngestResponse]:
415
+ """
416
+ Get the current status of an ingest, initiated with documents.ingest_remote, documents.ingest_local, or documents.crawl_website, by specifying the processId (the processId is included in the response of the documents.ingest functions).
417
+
418
+ Parameters
419
+ ----------
420
+ process_id : str
421
+ the processId for the ingest process being checked
422
+
423
+ request_options : typing.Optional[RequestOptions]
424
+ Request-specific configuration.
425
+
426
+ Returns
427
+ -------
428
+ HttpResponse[IngestResponse]
429
+ Look up success
430
+ """
431
+ _response = self._client_wrapper.httpx_client.request(
432
+ f"v1/ingest/{jsonable_encoder(process_id)}",
433
+ method="GET",
434
+ request_options=request_options,
435
+ )
436
+ try:
437
+ if 200 <= _response.status_code < 300:
438
+ _data = typing.cast(
439
+ IngestResponse,
440
+ parse_obj_as(
441
+ type_=IngestResponse, # type: ignore
442
+ object_=_response.json(),
443
+ ),
444
+ )
445
+ return HttpResponse(response=_response, data=_data)
446
+ if _response.status_code == 400:
447
+ raise BadRequestError(
448
+ headers=dict(_response.headers),
449
+ body=typing.cast(
450
+ typing.Optional[typing.Any],
451
+ parse_obj_as(
452
+ type_=typing.Optional[typing.Any], # type: ignore
453
+ object_=_response.json(),
454
+ ),
455
+ ),
456
+ )
457
+ if _response.status_code == 401:
458
+ raise UnauthorizedError(
459
+ headers=dict(_response.headers),
460
+ body=typing.cast(
461
+ typing.Optional[typing.Any],
462
+ parse_obj_as(
463
+ type_=typing.Optional[typing.Any], # type: ignore
464
+ object_=_response.json(),
465
+ ),
466
+ ),
467
+ )
468
+ _response_json = _response.json()
469
+ except JSONDecodeError:
470
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
471
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
472
+
473
+ def lookup(
474
+ self,
475
+ id: int,
476
+ *,
477
+ n: typing.Optional[int] = None,
478
+ filter: typing.Optional[str] = None,
479
+ sort: typing.Optional[Sort] = None,
480
+ sort_order: typing.Optional[SortOrder] = None,
481
+ status: typing.Optional[ProcessingStatus] = None,
482
+ next_token: typing.Optional[str] = None,
483
+ request_options: typing.Optional[RequestOptions] = None,
484
+ ) -> HttpResponse[DocumentLookupResponse]:
485
+ """
486
+ lookup the document(s) associated with a processId, bucketId, or groupId.
487
+
488
+ Parameters
489
+ ----------
490
+ id : int
491
+ a processId, bucketId, or groupId
492
+
493
+ n : typing.Optional[int]
494
+ The maximum number of returned documents. Accepts 1-100 with a default of 20.
495
+
496
+ filter : typing.Optional[str]
497
+ Only documents with names that contain the filter string will be returned in the results.
498
+
499
+ sort : typing.Optional[Sort]
500
+ The document attribute that will be used to sort the results.
501
+
502
+ sort_order : typing.Optional[SortOrder]
503
+ The order in which to sort the results. A value for sort must also be set.
504
+
505
+ status : typing.Optional[ProcessingStatus]
506
+ A status filter on the get documents query. If this value is set, then only documents with this status will be returned in the results.
507
+
508
+ next_token : typing.Optional[str]
509
+ A token for pagination. If the number of documents for a given query is larger than n, the response will include a "nextToken" value. That token can be included in this field to retrieve the next batch of n documents.
510
+
511
+ request_options : typing.Optional[RequestOptions]
512
+ Request-specific configuration.
513
+
514
+ Returns
515
+ -------
516
+ HttpResponse[DocumentLookupResponse]
517
+ Look up success
518
+ """
519
+ _response = self._client_wrapper.httpx_client.request(
520
+ f"v1/ingest/documents/{jsonable_encoder(id)}",
521
+ method="GET",
522
+ params={
523
+ "n": n,
524
+ "filter": filter,
525
+ "sort": sort,
526
+ "sortOrder": sort_order,
527
+ "status": status,
528
+ "nextToken": next_token,
529
+ },
530
+ request_options=request_options,
531
+ )
532
+ try:
533
+ if 200 <= _response.status_code < 300:
534
+ _data = typing.cast(
535
+ DocumentLookupResponse,
536
+ parse_obj_as(
537
+ type_=DocumentLookupResponse, # type: ignore
538
+ object_=_response.json(),
539
+ ),
540
+ )
541
+ return HttpResponse(response=_response, data=_data)
542
+ if _response.status_code == 400:
543
+ raise BadRequestError(
544
+ headers=dict(_response.headers),
545
+ body=typing.cast(
546
+ typing.Optional[typing.Any],
547
+ parse_obj_as(
548
+ type_=typing.Optional[typing.Any], # type: ignore
549
+ object_=_response.json(),
550
+ ),
551
+ ),
552
+ )
553
+ if _response.status_code == 401:
554
+ raise UnauthorizedError(
555
+ headers=dict(_response.headers),
556
+ body=typing.cast(
557
+ typing.Optional[typing.Any],
558
+ parse_obj_as(
559
+ type_=typing.Optional[typing.Any], # type: ignore
560
+ object_=_response.json(),
561
+ ),
562
+ ),
563
+ )
564
+ _response_json = _response.json()
565
+ except JSONDecodeError:
566
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
567
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
568
+
569
+ def get(
570
+ self, document_id: str, *, request_options: typing.Optional[RequestOptions] = None
571
+ ) -> HttpResponse[DocumentResponse]:
572
+ """
573
+ Look up an existing document by documentId.
574
+
575
+ Parameters
576
+ ----------
577
+ document_id : str
578
+ The documentId of the document for which GroundX information will be provided.
579
+
580
+ request_options : typing.Optional[RequestOptions]
581
+ Request-specific configuration.
582
+
583
+ Returns
584
+ -------
585
+ HttpResponse[DocumentResponse]
586
+ Look up success
587
+ """
588
+ _response = self._client_wrapper.httpx_client.request(
589
+ f"v1/ingest/document/{jsonable_encoder(document_id)}",
590
+ method="GET",
591
+ request_options=request_options,
592
+ )
593
+ try:
594
+ if 200 <= _response.status_code < 300:
595
+ _data = typing.cast(
596
+ DocumentResponse,
597
+ parse_obj_as(
598
+ type_=DocumentResponse, # type: ignore
599
+ object_=_response.json(),
600
+ ),
601
+ )
602
+ return HttpResponse(response=_response, data=_data)
603
+ if _response.status_code == 400:
604
+ raise BadRequestError(
605
+ headers=dict(_response.headers),
606
+ body=typing.cast(
607
+ typing.Optional[typing.Any],
608
+ parse_obj_as(
609
+ type_=typing.Optional[typing.Any], # type: ignore
610
+ object_=_response.json(),
611
+ ),
612
+ ),
613
+ )
614
+ if _response.status_code == 401:
615
+ raise UnauthorizedError(
616
+ headers=dict(_response.headers),
617
+ body=typing.cast(
618
+ typing.Optional[typing.Any],
619
+ parse_obj_as(
620
+ type_=typing.Optional[typing.Any], # type: ignore
621
+ object_=_response.json(),
622
+ ),
623
+ ),
624
+ )
625
+ _response_json = _response.json()
626
+ except JSONDecodeError:
627
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
628
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
629
+
630
+ def delete_by_id(
631
+ self, document_id: str, *, request_options: typing.Optional[RequestOptions] = None
632
+ ) -> HttpResponse[IngestResponse]:
633
+ """
634
+ Delete a single document hosted on GroundX
635
+
636
+ Parameters
637
+ ----------
638
+ document_id : str
639
+ A documentId which correspond to a document ingested by GroundX
640
+
641
+ request_options : typing.Optional[RequestOptions]
642
+ Request-specific configuration.
643
+
644
+ Returns
645
+ -------
646
+ HttpResponse[IngestResponse]
647
+ Document successfully deleted
648
+ """
649
+ _response = self._client_wrapper.httpx_client.request(
650
+ f"v1/ingest/document/{jsonable_encoder(document_id)}",
651
+ method="DELETE",
652
+ request_options=request_options,
653
+ )
654
+ try:
655
+ if 200 <= _response.status_code < 300:
656
+ _data = typing.cast(
657
+ IngestResponse,
658
+ parse_obj_as(
659
+ type_=IngestResponse, # type: ignore
660
+ object_=_response.json(),
661
+ ),
662
+ )
663
+ return HttpResponse(response=_response, data=_data)
664
+ if _response.status_code == 400:
665
+ raise BadRequestError(
666
+ headers=dict(_response.headers),
667
+ body=typing.cast(
668
+ typing.Optional[typing.Any],
669
+ parse_obj_as(
670
+ type_=typing.Optional[typing.Any], # type: ignore
671
+ object_=_response.json(),
672
+ ),
673
+ ),
674
+ )
675
+ if _response.status_code == 401:
676
+ raise UnauthorizedError(
677
+ headers=dict(_response.headers),
678
+ body=typing.cast(
679
+ typing.Optional[typing.Any],
680
+ parse_obj_as(
681
+ type_=typing.Optional[typing.Any], # type: ignore
682
+ object_=_response.json(),
683
+ ),
684
+ ),
685
+ )
686
+ _response_json = _response.json()
687
+ except JSONDecodeError:
688
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
689
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
690
+
691
+ def get_processes(
692
+ self,
693
+ *,
694
+ n: typing.Optional[int] = None,
695
+ status: typing.Optional[ProcessingStatus] = None,
696
+ request_options: typing.Optional[RequestOptions] = None,
697
+ ) -> HttpResponse[ProcessesStatusResponse]:
698
+ """
699
+ Get a list of ingest process requests, sorted from most recent to least.
700
+
701
+ Parameters
702
+ ----------
703
+ n : typing.Optional[int]
704
+ The maximum number of returned processes. Accepts 1-100 with a default of 20.
705
+
706
+ status : typing.Optional[ProcessingStatus]
707
+ A status filter on the processing status. If this value is set, then only processes with this status will be returned in the results.
708
+
709
+ request_options : typing.Optional[RequestOptions]
710
+ Request-specific configuration.
711
+
712
+ Returns
713
+ -------
714
+ HttpResponse[ProcessesStatusResponse]
715
+ Look up success
716
+ """
717
+ _response = self._client_wrapper.httpx_client.request(
718
+ "v1/ingest",
719
+ method="GET",
720
+ params={
721
+ "n": n,
722
+ "status": status,
723
+ },
724
+ request_options=request_options,
725
+ )
726
+ try:
727
+ if 200 <= _response.status_code < 300:
728
+ _data = typing.cast(
729
+ ProcessesStatusResponse,
730
+ parse_obj_as(
731
+ type_=ProcessesStatusResponse, # type: ignore
732
+ object_=_response.json(),
733
+ ),
734
+ )
735
+ return HttpResponse(response=_response, data=_data)
736
+ _response_json = _response.json()
737
+ except JSONDecodeError:
738
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
739
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
740
+
741
+
742
+ class AsyncRawDocumentsClient:
743
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
744
+ self._client_wrapper = client_wrapper
745
+
746
+ async def ingest_remote(
747
+ self,
748
+ *,
749
+ documents: typing.Sequence[IngestRemoteDocument],
750
+ callback_url: typing.Optional[str] = OMIT,
751
+ callback_data: typing.Optional[str] = OMIT,
752
+ request_options: typing.Optional[RequestOptions] = None,
753
+ ) -> AsyncHttpResponse[IngestResponse]:
754
+ """
755
+ Ingest documents hosted on public URLs into a GroundX bucket.
756
+
757
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
758
+
759
+ Parameters
760
+ ----------
761
+ documents : typing.Sequence[IngestRemoteDocument]
762
+
763
+ callback_url : typing.Optional[str]
764
+ An endpoint that will receive processing event updates as POST.
765
+
766
+ callback_data : typing.Optional[str]
767
+ A string that is returned, along with processing event updates, to the callback URL.
768
+
769
+ request_options : typing.Optional[RequestOptions]
770
+ Request-specific configuration.
771
+
772
+ Returns
773
+ -------
774
+ AsyncHttpResponse[IngestResponse]
775
+ Documents successfully uploaded
776
+ """
777
+ _response = await self._client_wrapper.httpx_client.request(
778
+ "v1/ingest/documents/remote",
779
+ method="POST",
780
+ json={
781
+ "documents": convert_and_respect_annotation_metadata(
782
+ object_=documents, annotation=typing.Sequence[IngestRemoteDocument], direction="write"
783
+ ),
784
+ "callbackUrl": callback_url,
785
+ "callbackData": callback_data,
786
+ },
787
+ headers={
788
+ "content-type": "application/json",
789
+ },
790
+ request_options=request_options,
791
+ omit=OMIT,
792
+ )
793
+ try:
794
+ if 200 <= _response.status_code < 300:
795
+ _data = typing.cast(
796
+ IngestResponse,
797
+ parse_obj_as(
798
+ type_=IngestResponse, # type: ignore
799
+ object_=_response.json(),
800
+ ),
801
+ )
802
+ return AsyncHttpResponse(response=_response, data=_data)
803
+ if _response.status_code == 400:
804
+ raise BadRequestError(
805
+ headers=dict(_response.headers),
806
+ body=typing.cast(
807
+ typing.Optional[typing.Any],
808
+ parse_obj_as(
809
+ type_=typing.Optional[typing.Any], # type: ignore
810
+ object_=_response.json(),
811
+ ),
812
+ ),
813
+ )
814
+ if _response.status_code == 401:
815
+ raise UnauthorizedError(
816
+ headers=dict(_response.headers),
817
+ body=typing.cast(
818
+ typing.Optional[typing.Any],
819
+ parse_obj_as(
820
+ type_=typing.Optional[typing.Any], # type: ignore
821
+ object_=_response.json(),
822
+ ),
823
+ ),
824
+ )
825
+ _response_json = _response.json()
826
+ except JSONDecodeError:
827
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
828
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
829
+
830
+ async def ingest_local(
831
+ self, *, request: DocumentLocalIngestRequest, request_options: typing.Optional[RequestOptions] = None
832
+ ) -> AsyncHttpResponse[IngestResponse]:
833
+ """
834
+ Upload documents hosted on a local file system into a GroundX bucket.
835
+
836
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
837
+
838
+ Parameters
839
+ ----------
840
+ request : DocumentLocalIngestRequest
841
+
842
+ request_options : typing.Optional[RequestOptions]
843
+ Request-specific configuration.
844
+
845
+ Returns
846
+ -------
847
+ AsyncHttpResponse[IngestResponse]
848
+ Documents successfully uploaded
849
+ """
850
+ _response = await self._client_wrapper.httpx_client.request(
851
+ "v1/ingest/documents/local",
852
+ method="POST",
853
+ json=convert_and_respect_annotation_metadata(
854
+ object_=request, annotation=DocumentLocalIngestRequest, direction="write"
855
+ ),
856
+ headers={
857
+ "content-type": "application/json",
858
+ },
859
+ request_options=request_options,
860
+ omit=OMIT,
861
+ )
862
+ try:
863
+ if 200 <= _response.status_code < 300:
864
+ _data = typing.cast(
865
+ IngestResponse,
866
+ parse_obj_as(
867
+ type_=IngestResponse, # type: ignore
868
+ object_=_response.json(),
869
+ ),
870
+ )
871
+ return AsyncHttpResponse(response=_response, data=_data)
872
+ if _response.status_code == 400:
873
+ raise BadRequestError(
874
+ headers=dict(_response.headers),
875
+ body=typing.cast(
876
+ typing.Optional[typing.Any],
877
+ parse_obj_as(
878
+ type_=typing.Optional[typing.Any], # type: ignore
879
+ object_=_response.json(),
880
+ ),
881
+ ),
882
+ )
883
+ if _response.status_code == 401:
884
+ raise UnauthorizedError(
885
+ headers=dict(_response.headers),
886
+ body=typing.cast(
887
+ typing.Optional[typing.Any],
888
+ parse_obj_as(
889
+ type_=typing.Optional[typing.Any], # type: ignore
890
+ object_=_response.json(),
891
+ ),
892
+ ),
893
+ )
894
+ _response_json = _response.json()
895
+ except JSONDecodeError:
896
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
897
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
898
+
899
+ async def crawl_website(
900
+ self,
901
+ *,
902
+ websites: typing.Sequence[WebsiteSource],
903
+ callback_url: typing.Optional[str] = OMIT,
904
+ callback_data: typing.Optional[str] = OMIT,
905
+ request_options: typing.Optional[RequestOptions] = None,
906
+ ) -> AsyncHttpResponse[IngestResponse]:
907
+ """
908
+ Upload the content of a publicly accessible website for ingestion into a GroundX bucket. This is done by following links within a specified URL, recursively, up to a specified depth or number of pages.
909
+
910
+ Note1: This endpoint is currently not supported for on-prem deployments.
911
+ Note2: The `source_url` must include the protocol, http:// or https://.
912
+
913
+ [Supported Document Types and Ingest Capacities](https://docs.eyelevel.ai/documentation/fundamentals/document-types-and-ingest-capacities)
914
+
915
+ Parameters
916
+ ----------
917
+ websites : typing.Sequence[WebsiteSource]
918
+
919
+ callback_url : typing.Optional[str]
920
+ The URL that will receive processing event updates.
921
+
922
+ callback_data : typing.Optional[str]
923
+ A string that is returned, along with processing event updates, to the callback URL.
924
+
925
+ request_options : typing.Optional[RequestOptions]
926
+ Request-specific configuration.
927
+
928
+ Returns
929
+ -------
930
+ AsyncHttpResponse[IngestResponse]
931
+ Website successfully queued
932
+ """
933
+ _response = await self._client_wrapper.httpx_client.request(
934
+ "v1/ingest/documents/website",
935
+ method="POST",
936
+ json={
937
+ "websites": convert_and_respect_annotation_metadata(
938
+ object_=websites, annotation=typing.Sequence[WebsiteSource], direction="write"
939
+ ),
940
+ "callbackUrl": callback_url,
941
+ "callbackData": callback_data,
942
+ },
943
+ headers={
944
+ "content-type": "application/json",
945
+ },
946
+ request_options=request_options,
947
+ omit=OMIT,
948
+ )
949
+ try:
950
+ if 200 <= _response.status_code < 300:
951
+ _data = typing.cast(
952
+ IngestResponse,
953
+ parse_obj_as(
954
+ type_=IngestResponse, # type: ignore
955
+ object_=_response.json(),
956
+ ),
957
+ )
958
+ return AsyncHttpResponse(response=_response, data=_data)
959
+ if _response.status_code == 400:
960
+ raise BadRequestError(
961
+ headers=dict(_response.headers),
962
+ body=typing.cast(
963
+ typing.Optional[typing.Any],
964
+ parse_obj_as(
965
+ type_=typing.Optional[typing.Any], # type: ignore
966
+ object_=_response.json(),
967
+ ),
968
+ ),
969
+ )
970
+ if _response.status_code == 401:
971
+ raise UnauthorizedError(
972
+ headers=dict(_response.headers),
973
+ body=typing.cast(
974
+ typing.Optional[typing.Any],
975
+ parse_obj_as(
976
+ type_=typing.Optional[typing.Any], # type: ignore
977
+ object_=_response.json(),
978
+ ),
979
+ ),
980
+ )
981
+ _response_json = _response.json()
982
+ except JSONDecodeError:
983
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
984
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
985
+
986
+ async def list(
987
+ self,
988
+ *,
989
+ n: typing.Optional[int] = None,
990
+ filter: typing.Optional[str] = None,
991
+ sort: typing.Optional[Sort] = None,
992
+ sort_order: typing.Optional[SortOrder] = None,
993
+ status: typing.Optional[ProcessingStatus] = None,
994
+ next_token: typing.Optional[str] = None,
995
+ request_options: typing.Optional[RequestOptions] = None,
996
+ ) -> AsyncHttpResponse[DocumentListResponse]:
997
+ """
998
+ lookup all documents across all resources which are currently on GroundX
999
+
1000
+ Parameters
1001
+ ----------
1002
+ n : typing.Optional[int]
1003
+ The maximum number of returned documents. Accepts 1-100 with a default of 20.
1004
+
1005
+ filter : typing.Optional[str]
1006
+ Only documents with names that contain the filter string will be returned in the results.
1007
+
1008
+ sort : typing.Optional[Sort]
1009
+ The document attribute that will be used to sort the results.
1010
+
1011
+ sort_order : typing.Optional[SortOrder]
1012
+ The order in which to sort the results. A value for sort must also be set.
1013
+
1014
+ status : typing.Optional[ProcessingStatus]
1015
+ A status filter on the get documents query. If this value is set, then only documents with this status will be returned in the results.
1016
+
1017
+ next_token : typing.Optional[str]
1018
+ A token for pagination. If the number of documents for a given query is larger than n, the response will include a "nextToken" value. That token can be included in this field to retrieve the next batch of n documents.
1019
+
1020
+ request_options : typing.Optional[RequestOptions]
1021
+ Request-specific configuration.
1022
+
1023
+ Returns
1024
+ -------
1025
+ AsyncHttpResponse[DocumentListResponse]
1026
+ Look up success
1027
+ """
1028
+ _response = await self._client_wrapper.httpx_client.request(
1029
+ "v1/ingest/documents",
1030
+ method="GET",
1031
+ params={
1032
+ "n": n,
1033
+ "filter": filter,
1034
+ "sort": sort,
1035
+ "sortOrder": sort_order,
1036
+ "status": status,
1037
+ "nextToken": next_token,
1038
+ },
1039
+ request_options=request_options,
1040
+ )
1041
+ try:
1042
+ if 200 <= _response.status_code < 300:
1043
+ _data = typing.cast(
1044
+ DocumentListResponse,
1045
+ parse_obj_as(
1046
+ type_=DocumentListResponse, # type: ignore
1047
+ object_=_response.json(),
1048
+ ),
1049
+ )
1050
+ return AsyncHttpResponse(response=_response, data=_data)
1051
+ _response_json = _response.json()
1052
+ except JSONDecodeError:
1053
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1054
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1055
+
1056
+ async def delete(
1057
+ self,
1058
+ *,
1059
+ document_ids: typing.Optional[typing.Union[str, typing.Sequence[str]]] = None,
1060
+ request_options: typing.Optional[RequestOptions] = None,
1061
+ ) -> AsyncHttpResponse[IngestResponse]:
1062
+ """
1063
+ Delete multiple documents hosted on GroundX
1064
+
1065
+ Parameters
1066
+ ----------
1067
+ document_ids : typing.Optional[typing.Union[str, typing.Sequence[str]]]
1068
+ A list of documentIds which correspond to documents ingested by GroundX
1069
+
1070
+ request_options : typing.Optional[RequestOptions]
1071
+ Request-specific configuration.
1072
+
1073
+ Returns
1074
+ -------
1075
+ AsyncHttpResponse[IngestResponse]
1076
+ Documents are queued to be deleted
1077
+ """
1078
+ _response = await self._client_wrapper.httpx_client.request(
1079
+ "v1/ingest/documents",
1080
+ method="DELETE",
1081
+ params={
1082
+ "documentIds": document_ids,
1083
+ },
1084
+ request_options=request_options,
1085
+ )
1086
+ try:
1087
+ if 200 <= _response.status_code < 300:
1088
+ _data = typing.cast(
1089
+ IngestResponse,
1090
+ parse_obj_as(
1091
+ type_=IngestResponse, # type: ignore
1092
+ object_=_response.json(),
1093
+ ),
1094
+ )
1095
+ return AsyncHttpResponse(response=_response, data=_data)
1096
+ if _response.status_code == 400:
1097
+ raise BadRequestError(
1098
+ headers=dict(_response.headers),
1099
+ body=typing.cast(
1100
+ typing.Optional[typing.Any],
1101
+ parse_obj_as(
1102
+ type_=typing.Optional[typing.Any], # type: ignore
1103
+ object_=_response.json(),
1104
+ ),
1105
+ ),
1106
+ )
1107
+ if _response.status_code == 401:
1108
+ raise UnauthorizedError(
1109
+ headers=dict(_response.headers),
1110
+ body=typing.cast(
1111
+ typing.Optional[typing.Any],
1112
+ parse_obj_as(
1113
+ type_=typing.Optional[typing.Any], # type: ignore
1114
+ object_=_response.json(),
1115
+ ),
1116
+ ),
1117
+ )
1118
+ _response_json = _response.json()
1119
+ except JSONDecodeError:
1120
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1121
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1122
+
1123
+ async def get_processing_status_by_id(
1124
+ self, process_id: str, *, request_options: typing.Optional[RequestOptions] = None
1125
+ ) -> AsyncHttpResponse[IngestResponse]:
1126
+ """
1127
+ Get the current status of an ingest, initiated with documents.ingest_remote, documents.ingest_local, or documents.crawl_website, by specifying the processId (the processId is included in the response of the documents.ingest functions).
1128
+
1129
+ Parameters
1130
+ ----------
1131
+ process_id : str
1132
+ the processId for the ingest process being checked
1133
+
1134
+ request_options : typing.Optional[RequestOptions]
1135
+ Request-specific configuration.
1136
+
1137
+ Returns
1138
+ -------
1139
+ AsyncHttpResponse[IngestResponse]
1140
+ Look up success
1141
+ """
1142
+ _response = await self._client_wrapper.httpx_client.request(
1143
+ f"v1/ingest/{jsonable_encoder(process_id)}",
1144
+ method="GET",
1145
+ request_options=request_options,
1146
+ )
1147
+ try:
1148
+ if 200 <= _response.status_code < 300:
1149
+ _data = typing.cast(
1150
+ IngestResponse,
1151
+ parse_obj_as(
1152
+ type_=IngestResponse, # type: ignore
1153
+ object_=_response.json(),
1154
+ ),
1155
+ )
1156
+ return AsyncHttpResponse(response=_response, data=_data)
1157
+ if _response.status_code == 400:
1158
+ raise BadRequestError(
1159
+ headers=dict(_response.headers),
1160
+ body=typing.cast(
1161
+ typing.Optional[typing.Any],
1162
+ parse_obj_as(
1163
+ type_=typing.Optional[typing.Any], # type: ignore
1164
+ object_=_response.json(),
1165
+ ),
1166
+ ),
1167
+ )
1168
+ if _response.status_code == 401:
1169
+ raise UnauthorizedError(
1170
+ headers=dict(_response.headers),
1171
+ body=typing.cast(
1172
+ typing.Optional[typing.Any],
1173
+ parse_obj_as(
1174
+ type_=typing.Optional[typing.Any], # type: ignore
1175
+ object_=_response.json(),
1176
+ ),
1177
+ ),
1178
+ )
1179
+ _response_json = _response.json()
1180
+ except JSONDecodeError:
1181
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1182
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1183
+
1184
+ async def lookup(
1185
+ self,
1186
+ id: int,
1187
+ *,
1188
+ n: typing.Optional[int] = None,
1189
+ filter: typing.Optional[str] = None,
1190
+ sort: typing.Optional[Sort] = None,
1191
+ sort_order: typing.Optional[SortOrder] = None,
1192
+ status: typing.Optional[ProcessingStatus] = None,
1193
+ next_token: typing.Optional[str] = None,
1194
+ request_options: typing.Optional[RequestOptions] = None,
1195
+ ) -> AsyncHttpResponse[DocumentLookupResponse]:
1196
+ """
1197
+ lookup the document(s) associated with a processId, bucketId, or groupId.
1198
+
1199
+ Parameters
1200
+ ----------
1201
+ id : int
1202
+ a processId, bucketId, or groupId
1203
+
1204
+ n : typing.Optional[int]
1205
+ The maximum number of returned documents. Accepts 1-100 with a default of 20.
1206
+
1207
+ filter : typing.Optional[str]
1208
+ Only documents with names that contain the filter string will be returned in the results.
1209
+
1210
+ sort : typing.Optional[Sort]
1211
+ The document attribute that will be used to sort the results.
1212
+
1213
+ sort_order : typing.Optional[SortOrder]
1214
+ The order in which to sort the results. A value for sort must also be set.
1215
+
1216
+ status : typing.Optional[ProcessingStatus]
1217
+ A status filter on the get documents query. If this value is set, then only documents with this status will be returned in the results.
1218
+
1219
+ next_token : typing.Optional[str]
1220
+ A token for pagination. If the number of documents for a given query is larger than n, the response will include a "nextToken" value. That token can be included in this field to retrieve the next batch of n documents.
1221
+
1222
+ request_options : typing.Optional[RequestOptions]
1223
+ Request-specific configuration.
1224
+
1225
+ Returns
1226
+ -------
1227
+ AsyncHttpResponse[DocumentLookupResponse]
1228
+ Look up success
1229
+ """
1230
+ _response = await self._client_wrapper.httpx_client.request(
1231
+ f"v1/ingest/documents/{jsonable_encoder(id)}",
1232
+ method="GET",
1233
+ params={
1234
+ "n": n,
1235
+ "filter": filter,
1236
+ "sort": sort,
1237
+ "sortOrder": sort_order,
1238
+ "status": status,
1239
+ "nextToken": next_token,
1240
+ },
1241
+ request_options=request_options,
1242
+ )
1243
+ try:
1244
+ if 200 <= _response.status_code < 300:
1245
+ _data = typing.cast(
1246
+ DocumentLookupResponse,
1247
+ parse_obj_as(
1248
+ type_=DocumentLookupResponse, # type: ignore
1249
+ object_=_response.json(),
1250
+ ),
1251
+ )
1252
+ return AsyncHttpResponse(response=_response, data=_data)
1253
+ if _response.status_code == 400:
1254
+ raise BadRequestError(
1255
+ headers=dict(_response.headers),
1256
+ body=typing.cast(
1257
+ typing.Optional[typing.Any],
1258
+ parse_obj_as(
1259
+ type_=typing.Optional[typing.Any], # type: ignore
1260
+ object_=_response.json(),
1261
+ ),
1262
+ ),
1263
+ )
1264
+ if _response.status_code == 401:
1265
+ raise UnauthorizedError(
1266
+ headers=dict(_response.headers),
1267
+ body=typing.cast(
1268
+ typing.Optional[typing.Any],
1269
+ parse_obj_as(
1270
+ type_=typing.Optional[typing.Any], # type: ignore
1271
+ object_=_response.json(),
1272
+ ),
1273
+ ),
1274
+ )
1275
+ _response_json = _response.json()
1276
+ except JSONDecodeError:
1277
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1278
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1279
+
1280
+ async def get(
1281
+ self, document_id: str, *, request_options: typing.Optional[RequestOptions] = None
1282
+ ) -> AsyncHttpResponse[DocumentResponse]:
1283
+ """
1284
+ Look up an existing document by documentId.
1285
+
1286
+ Parameters
1287
+ ----------
1288
+ document_id : str
1289
+ The documentId of the document for which GroundX information will be provided.
1290
+
1291
+ request_options : typing.Optional[RequestOptions]
1292
+ Request-specific configuration.
1293
+
1294
+ Returns
1295
+ -------
1296
+ AsyncHttpResponse[DocumentResponse]
1297
+ Look up success
1298
+ """
1299
+ _response = await self._client_wrapper.httpx_client.request(
1300
+ f"v1/ingest/document/{jsonable_encoder(document_id)}",
1301
+ method="GET",
1302
+ request_options=request_options,
1303
+ )
1304
+ try:
1305
+ if 200 <= _response.status_code < 300:
1306
+ _data = typing.cast(
1307
+ DocumentResponse,
1308
+ parse_obj_as(
1309
+ type_=DocumentResponse, # type: ignore
1310
+ object_=_response.json(),
1311
+ ),
1312
+ )
1313
+ return AsyncHttpResponse(response=_response, data=_data)
1314
+ if _response.status_code == 400:
1315
+ raise BadRequestError(
1316
+ headers=dict(_response.headers),
1317
+ body=typing.cast(
1318
+ typing.Optional[typing.Any],
1319
+ parse_obj_as(
1320
+ type_=typing.Optional[typing.Any], # type: ignore
1321
+ object_=_response.json(),
1322
+ ),
1323
+ ),
1324
+ )
1325
+ if _response.status_code == 401:
1326
+ raise UnauthorizedError(
1327
+ headers=dict(_response.headers),
1328
+ body=typing.cast(
1329
+ typing.Optional[typing.Any],
1330
+ parse_obj_as(
1331
+ type_=typing.Optional[typing.Any], # type: ignore
1332
+ object_=_response.json(),
1333
+ ),
1334
+ ),
1335
+ )
1336
+ _response_json = _response.json()
1337
+ except JSONDecodeError:
1338
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1339
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1340
+
1341
+ async def delete_by_id(
1342
+ self, document_id: str, *, request_options: typing.Optional[RequestOptions] = None
1343
+ ) -> AsyncHttpResponse[IngestResponse]:
1344
+ """
1345
+ Delete a single document hosted on GroundX
1346
+
1347
+ Parameters
1348
+ ----------
1349
+ document_id : str
1350
+ A documentId which correspond to a document ingested by GroundX
1351
+
1352
+ request_options : typing.Optional[RequestOptions]
1353
+ Request-specific configuration.
1354
+
1355
+ Returns
1356
+ -------
1357
+ AsyncHttpResponse[IngestResponse]
1358
+ Document successfully deleted
1359
+ """
1360
+ _response = await self._client_wrapper.httpx_client.request(
1361
+ f"v1/ingest/document/{jsonable_encoder(document_id)}",
1362
+ method="DELETE",
1363
+ request_options=request_options,
1364
+ )
1365
+ try:
1366
+ if 200 <= _response.status_code < 300:
1367
+ _data = typing.cast(
1368
+ IngestResponse,
1369
+ parse_obj_as(
1370
+ type_=IngestResponse, # type: ignore
1371
+ object_=_response.json(),
1372
+ ),
1373
+ )
1374
+ return AsyncHttpResponse(response=_response, data=_data)
1375
+ if _response.status_code == 400:
1376
+ raise BadRequestError(
1377
+ headers=dict(_response.headers),
1378
+ body=typing.cast(
1379
+ typing.Optional[typing.Any],
1380
+ parse_obj_as(
1381
+ type_=typing.Optional[typing.Any], # type: ignore
1382
+ object_=_response.json(),
1383
+ ),
1384
+ ),
1385
+ )
1386
+ if _response.status_code == 401:
1387
+ raise UnauthorizedError(
1388
+ headers=dict(_response.headers),
1389
+ body=typing.cast(
1390
+ typing.Optional[typing.Any],
1391
+ parse_obj_as(
1392
+ type_=typing.Optional[typing.Any], # type: ignore
1393
+ object_=_response.json(),
1394
+ ),
1395
+ ),
1396
+ )
1397
+ _response_json = _response.json()
1398
+ except JSONDecodeError:
1399
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1400
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)
1401
+
1402
+ async def get_processes(
1403
+ self,
1404
+ *,
1405
+ n: typing.Optional[int] = None,
1406
+ status: typing.Optional[ProcessingStatus] = None,
1407
+ request_options: typing.Optional[RequestOptions] = None,
1408
+ ) -> AsyncHttpResponse[ProcessesStatusResponse]:
1409
+ """
1410
+ Get a list of ingest process requests, sorted from most recent to least.
1411
+
1412
+ Parameters
1413
+ ----------
1414
+ n : typing.Optional[int]
1415
+ The maximum number of returned processes. Accepts 1-100 with a default of 20.
1416
+
1417
+ status : typing.Optional[ProcessingStatus]
1418
+ A status filter on the processing status. If this value is set, then only processes with this status will be returned in the results.
1419
+
1420
+ request_options : typing.Optional[RequestOptions]
1421
+ Request-specific configuration.
1422
+
1423
+ Returns
1424
+ -------
1425
+ AsyncHttpResponse[ProcessesStatusResponse]
1426
+ Look up success
1427
+ """
1428
+ _response = await self._client_wrapper.httpx_client.request(
1429
+ "v1/ingest",
1430
+ method="GET",
1431
+ params={
1432
+ "n": n,
1433
+ "status": status,
1434
+ },
1435
+ request_options=request_options,
1436
+ )
1437
+ try:
1438
+ if 200 <= _response.status_code < 300:
1439
+ _data = typing.cast(
1440
+ ProcessesStatusResponse,
1441
+ parse_obj_as(
1442
+ type_=ProcessesStatusResponse, # type: ignore
1443
+ object_=_response.json(),
1444
+ ),
1445
+ )
1446
+ return AsyncHttpResponse(response=_response, data=_data)
1447
+ _response_json = _response.json()
1448
+ except JSONDecodeError:
1449
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response.text)
1450
+ raise ApiError(status_code=_response.status_code, headers=dict(_response.headers), body=_response_json)