groundx 2.2.9__tar.gz → 2.3.0__tar.gz
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.
- {groundx-2.2.9 → groundx-2.3.0}/PKG-INFO +1 -1
- {groundx-2.2.9 → groundx-2.3.0}/pyproject.toml +1 -1
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/client_wrapper.py +1 -1
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/ingest.py +170 -60
- {groundx-2.2.9 → groundx-2.3.0}/LICENSE +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/README.md +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/buckets/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/buckets/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/api_error.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/datetime_utils.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/file.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/http_client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/jsonable_encoder.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/pydantic_utilities.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/query_encoder.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/remove_none_from_dict.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/request_options.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/core/serialization.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/csv_splitter.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/customer/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/customer/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/documents/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/documents/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/environment.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/errors/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/errors/bad_request_error.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/errors/unauthorized_error.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/groups/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/groups/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/health/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/health/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/py.typed +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/search/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/search/client.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/search/types/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/search/types/search_content_request_id.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/__init__.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bounding_box_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bucket_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bucket_list_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bucket_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bucket_update_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/bucket_update_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/customer_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/customer_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_list_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_local_ingest_request.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_lookup_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/document_type.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/group_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/group_list_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/group_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/health_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/health_response_health.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/health_service.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/health_service_status.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/ingest_local_document.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/ingest_local_document_metadata.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/ingest_remote_document.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/ingest_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/ingest_response_ingest.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/message_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/meter_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_level.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress_cancelled.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress_complete.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress_errors.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress_processing.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/processes_status_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/processing_status.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/search_response.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/search_response_search.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/search_result_item.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/sort.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/sort_order.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/subscription_detail.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/subscription_detail_meters.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/website_source.py +0 -0
- {groundx-2.2.9 → groundx-2.3.0}/src/groundx/version.py +0 -0
@@ -9,6 +9,7 @@ from .csv_splitter import CSVSplitter
|
|
9
9
|
from .types.document import Document
|
10
10
|
from .types.ingest_remote_document import IngestRemoteDocument
|
11
11
|
from .types.ingest_response import IngestResponse
|
12
|
+
from .types.ingest_response_ingest import IngestResponseIngest
|
12
13
|
|
13
14
|
# this is used as the default value for optional parameters
|
14
15
|
OMIT = typing.cast(typing.Any, ...)
|
@@ -140,6 +141,8 @@ class GroundX(GroundXBase):
|
|
140
141
|
self,
|
141
142
|
*,
|
142
143
|
documents: typing.Sequence[Document],
|
144
|
+
batch_size: typing.Optional[int] = 10,
|
145
|
+
wait_for_complete: typing.Optional[bool] = False,
|
143
146
|
upload_api: typing.Optional[str] = "https://api.eyelevel.ai/upload/file",
|
144
147
|
request_options: typing.Optional[RequestOptions] = None,
|
145
148
|
) -> IngestResponse:
|
@@ -150,6 +153,13 @@ class GroundX(GroundXBase):
|
|
150
153
|
----------
|
151
154
|
documents : typing.Sequence[Document]
|
152
155
|
|
156
|
+
# defines how many files to send per batch
|
157
|
+
# ignored unless wait_for_complete is True
|
158
|
+
batch_size : typing.Optional[int]
|
159
|
+
|
160
|
+
# will turn on progress bar and wait for ingestion to complete
|
161
|
+
wait_for_complete : typing.Optional[bool]
|
162
|
+
|
153
163
|
# an endpoint that accepts 'name' and 'type' query params
|
154
164
|
# and returns a presigned URL in a JSON dictionary with key 'URL'
|
155
165
|
upload_api : typing.Optional[str]
|
@@ -183,36 +193,84 @@ class GroundX(GroundXBase):
|
|
183
193
|
"""
|
184
194
|
remote_documents, local_documents = prep_documents(documents)
|
185
195
|
|
186
|
-
if len(remote_documents) + len(local_documents) > MAX_BATCH_SIZE:
|
187
|
-
raise ValueError("You have sent too many documents in this request")
|
188
|
-
|
189
196
|
if len(remote_documents) + len(local_documents) == 0:
|
190
197
|
raise ValueError("No valid documents were provided")
|
191
198
|
|
192
|
-
|
193
|
-
|
199
|
+
if wait_for_complete:
|
200
|
+
with tqdm(total=len(remote_documents) + len(local_documents), desc="Ingesting Files", unit="file") as pbar:
|
201
|
+
n = max(MIN_BATCH_SIZE, min(batch_size or MIN_BATCH_SIZE, MAX_BATCH_SIZE))
|
194
202
|
|
195
|
-
|
196
|
-
|
203
|
+
remote_batch: typing.List[IngestRemoteDocument] = []
|
204
|
+
ingest = IngestResponse(ingest=IngestResponseIngest(process_id="",status="queued"))
|
197
205
|
|
198
|
-
|
199
|
-
|
200
|
-
|
206
|
+
progress = float(len(remote_documents))
|
207
|
+
for rd in remote_documents:
|
208
|
+
if len(remote_batch) >= n:
|
209
|
+
ingest = self.documents.ingest_remote(
|
210
|
+
documents=remote_batch,
|
211
|
+
request_options=request_options,
|
212
|
+
)
|
213
|
+
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
201
214
|
|
202
|
-
|
203
|
-
if len(splits) == 1 and d.file_name:
|
204
|
-
fn = d.file_name
|
215
|
+
remote_batch = []
|
205
216
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
217
|
+
remote_batch.append(rd)
|
218
|
+
pbar.update(0.25)
|
219
|
+
progress -= 0.25
|
220
|
+
|
221
|
+
if remote_batch:
|
222
|
+
ingest = self.documents.ingest_remote(
|
223
|
+
documents=remote_batch,
|
224
|
+
request_options=request_options,
|
214
225
|
)
|
215
|
-
|
226
|
+
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
227
|
+
|
228
|
+
|
229
|
+
if progress > 0:
|
230
|
+
pbar.update(progress)
|
231
|
+
|
232
|
+
current_batch_size = 0
|
233
|
+
local_batch: typing.List[Document] = []
|
234
|
+
|
235
|
+
progress = float(len(local_documents))
|
236
|
+
for ld in local_documents:
|
237
|
+
fp = Path(os.path.expanduser(ld.file_path))
|
238
|
+
file_size = fp.stat().st_size
|
239
|
+
|
240
|
+
if (current_batch_size + file_size > MAX_BATCH_SIZE_BYTES) or (len(local_batch) >= n):
|
241
|
+
up_docs, progress = self._process_local(local_batch, upload_api, progress, pbar)
|
242
|
+
|
243
|
+
ingest = self.documents.ingest_remote(
|
244
|
+
documents=up_docs,
|
245
|
+
request_options=request_options,
|
246
|
+
)
|
247
|
+
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
248
|
+
|
249
|
+
local_batch = []
|
250
|
+
current_batch_size = 0
|
251
|
+
|
252
|
+
local_batch.append(ld)
|
253
|
+
current_batch_size += file_size
|
254
|
+
|
255
|
+
if local_batch:
|
256
|
+
up_docs, progress = self._process_local(local_batch, upload_api, progress, pbar)
|
257
|
+
|
258
|
+
ingest = self.documents.ingest_remote(
|
259
|
+
documents=up_docs,
|
260
|
+
request_options=request_options,
|
261
|
+
)
|
262
|
+
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
263
|
+
|
264
|
+
if progress > 0:
|
265
|
+
pbar.update(progress)
|
266
|
+
|
267
|
+
return ingest
|
268
|
+
elif len(remote_documents) + len(local_documents) > MAX_BATCH_SIZE:
|
269
|
+
raise ValueError("You have sent too many documents in this request")
|
270
|
+
|
271
|
+
|
272
|
+
up_docs, _ = self._process_local(local_documents, upload_api)
|
273
|
+
remote_documents.extend(up_docs)
|
216
274
|
|
217
275
|
return self.documents.ingest_remote(
|
218
276
|
documents=remote_documents,
|
@@ -346,6 +404,92 @@ class GroundX(GroundXBase):
|
|
346
404
|
|
347
405
|
return strip_query_params(upload_url)
|
348
406
|
|
407
|
+
def _process_local(
|
408
|
+
self,
|
409
|
+
local_docs,
|
410
|
+
upload_api,
|
411
|
+
progress = None,
|
412
|
+
pbar = None,
|
413
|
+
):
|
414
|
+
remote_docs = []
|
415
|
+
for d in local_docs:
|
416
|
+
splits = split_doc(Path(os.path.expanduser(d.file_path)))
|
417
|
+
|
418
|
+
for sd in splits:
|
419
|
+
url = self._upload_file(upload_api, sd)
|
420
|
+
|
421
|
+
ft = d.file_type
|
422
|
+
if sd.suffix.lower() in SUFFIX_ALIASES:
|
423
|
+
ft = SUFFIX_ALIASES[sd.suffix.lower()]
|
424
|
+
|
425
|
+
fn = sd.name
|
426
|
+
if len(splits) == 1 and d.file_name:
|
427
|
+
fn = d.file_name
|
428
|
+
|
429
|
+
remote_docs.append(
|
430
|
+
IngestRemoteDocument(
|
431
|
+
bucket_id=d.bucket_id,
|
432
|
+
file_name=fn,
|
433
|
+
file_type=ft,
|
434
|
+
process_level=d.process_level,
|
435
|
+
search_data=d.search_data,
|
436
|
+
source_url=url,
|
437
|
+
)
|
438
|
+
)
|
439
|
+
|
440
|
+
if progress is not None and pbar is not None and pbar.update is not None:
|
441
|
+
pbar.update(0.25)
|
442
|
+
progress -= 0.25
|
443
|
+
|
444
|
+
return remote_docs, progress
|
445
|
+
|
446
|
+
def _monitor_batch(
|
447
|
+
self,
|
448
|
+
ingest,
|
449
|
+
progress,
|
450
|
+
pbar,
|
451
|
+
):
|
452
|
+
completed_files = set()
|
453
|
+
|
454
|
+
while (
|
455
|
+
ingest is not None
|
456
|
+
and ingest.ingest.status not in ["complete", "error", "cancelled"]
|
457
|
+
):
|
458
|
+
time.sleep(3)
|
459
|
+
ingest = self.documents.get_processing_status_by_id(ingest.ingest.process_id)
|
460
|
+
|
461
|
+
if ingest.ingest.progress:
|
462
|
+
if ingest.ingest.progress.processing and ingest.ingest.progress.processing.documents:
|
463
|
+
for doc in ingest.ingest.progress.processing.documents:
|
464
|
+
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
465
|
+
pbar.update(0.75)
|
466
|
+
progress -= 0.75
|
467
|
+
completed_files.add(doc.document_id)
|
468
|
+
if ingest.ingest.progress.complete and ingest.ingest.progress.complete.documents:
|
469
|
+
for doc in ingest.ingest.progress.complete.documents:
|
470
|
+
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
471
|
+
pbar.update(0.75)
|
472
|
+
progress -= 0.75
|
473
|
+
completed_files.add(doc.document_id)
|
474
|
+
if ingest.ingest.progress.cancelled and ingest.ingest.progress.cancelled.documents:
|
475
|
+
for doc in ingest.ingest.progress.cancelled.documents:
|
476
|
+
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
477
|
+
pbar.update(0.75)
|
478
|
+
progress -= 0.75
|
479
|
+
completed_files.add(doc.document_id)
|
480
|
+
if ingest.ingest.progress.errors and ingest.ingest.progress.errors.documents:
|
481
|
+
for doc in ingest.ingest.progress.errors.documents:
|
482
|
+
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
483
|
+
pbar.update(0.75)
|
484
|
+
progress -= 0.75
|
485
|
+
completed_files.add(doc.document_id)
|
486
|
+
|
487
|
+
|
488
|
+
if ingest.ingest.status in ["error", "cancelled"]:
|
489
|
+
raise ValueError(f"Ingest failed with status: {ingest.ingest.status}")
|
490
|
+
|
491
|
+
return ingest, progress
|
492
|
+
|
349
493
|
def _upload_file_batch(
|
350
494
|
self,
|
351
495
|
bucket_id,
|
@@ -356,7 +500,7 @@ class GroundX(GroundXBase):
|
|
356
500
|
):
|
357
501
|
docs = []
|
358
502
|
|
359
|
-
progress =
|
503
|
+
progress = float(len(batch))
|
360
504
|
for file in batch:
|
361
505
|
url = self._upload_file(upload_api, file)
|
362
506
|
if file.suffix.lower() in SUFFIX_ALIASES:
|
@@ -381,44 +525,10 @@ class GroundX(GroundXBase):
|
|
381
525
|
|
382
526
|
if docs:
|
383
527
|
ingest = self.ingest(documents=docs, request_options=request_options)
|
528
|
+
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
384
529
|
|
385
|
-
|
386
|
-
|
387
|
-
while (
|
388
|
-
ingest is not None
|
389
|
-
and ingest.ingest.status not in ["complete", "error", "cancelled"]
|
390
|
-
):
|
391
|
-
time.sleep(3)
|
392
|
-
ingest = self.documents.get_processing_status_by_id(ingest.ingest.process_id)
|
393
|
-
|
394
|
-
if ingest.ingest.progress:
|
395
|
-
if ingest.ingest.progress.processing and ingest.ingest.progress.processing.documents:
|
396
|
-
for doc in ingest.ingest.progress.processing.documents:
|
397
|
-
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
398
|
-
pbar.update(0.75)
|
399
|
-
progress -= 0.75
|
400
|
-
if ingest.ingest.progress.complete and ingest.ingest.progress.complete.documents:
|
401
|
-
for doc in ingest.ingest.progress.complete.documents:
|
402
|
-
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
403
|
-
pbar.update(0.75)
|
404
|
-
progress -= 0.75
|
405
|
-
if ingest.ingest.progress.cancelled and ingest.ingest.progress.cancelled.documents:
|
406
|
-
for doc in ingest.ingest.progress.cancelled.documents:
|
407
|
-
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
408
|
-
pbar.update(0.75)
|
409
|
-
progress -= 0.75
|
410
|
-
if ingest.ingest.progress.errors and ingest.ingest.progress.errors.documents:
|
411
|
-
for doc in ingest.ingest.progress.errors.documents:
|
412
|
-
if doc.status in ["complete", "error", "cancelled"] and doc.document_id not in completed_files:
|
413
|
-
pbar.update(0.75)
|
414
|
-
progress -= 0.75
|
415
|
-
|
416
|
-
|
417
|
-
if ingest.ingest.status in ["error", "cancelled"]:
|
418
|
-
raise ValueError(f"Ingest failed with status: {ingest.ingest.status}")
|
419
|
-
|
420
|
-
if progress > 0:
|
421
|
-
pbar.update(progress)
|
530
|
+
if progress > 0:
|
531
|
+
pbar.update(progress)
|
422
532
|
|
423
533
|
|
424
534
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
{groundx-2.2.9 → groundx-2.3.0}/src/groundx/types/process_status_response_ingest_progress_errors.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|