groundx 2.3.8__tar.gz → 2.4.1__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.
Potentially problematic release.
This version of groundx might be problematic. Click here for more details.
- {groundx-2.3.8 → groundx-2.4.1}/PKG-INFO +1 -1
- {groundx-2.3.8 → groundx-2.4.1}/pyproject.toml +1 -1
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/buckets/client.py +8 -2
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/client_wrapper.py +2 -2
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/documents/client.py +36 -4
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/groups/client.py +8 -2
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/ingest.py +83 -38
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/search/client.py +8 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_detail.py +7 -0
- {groundx-2.3.8 → groundx-2.4.1}/LICENSE +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/README.md +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/buckets/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/buckets/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/api_error.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/datetime_utils.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/file.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/force_multipart.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/http_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/http_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/jsonable_encoder.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/pydantic_utilities.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/query_encoder.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/remove_none_from_dict.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/request_options.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/core/serialization.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/csv_splitter.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/customer/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/customer/client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/customer/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/documents/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/documents/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/environment.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/errors/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/errors/bad_request_error.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/errors/unauthorized_error.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/groups/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/groups/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/health/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/health/client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/health/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/py.typed +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/search/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/search/raw_client.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/search/types/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/search/types/search_content_request_id.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/__init__.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bounding_box_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bucket_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bucket_list_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bucket_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bucket_update_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/bucket_update_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/customer_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/customer_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_list_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_local_ingest_request.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_lookup_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/document_type.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/group_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/group_list_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/group_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/health_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/health_response_health.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/health_service.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/health_service_status.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_local_document.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_local_document_metadata.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_remote_document.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_light.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_progress.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_progress_cancelled.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_progress_complete.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_progress_errors.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/ingest_status_progress_processing.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/message_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/meter_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/process_level.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/processes_status_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/processing_status.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/search_response.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/search_response_search.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/search_result_item.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/search_result_item_pages_item.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/sort.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/sort_order.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/subscription_detail.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/subscription_detail_meters.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/types/website_source.py +0 -0
- {groundx-2.3.8 → groundx-2.4.1}/src/groundx/version.py +0 -0
|
@@ -62,7 +62,10 @@ class BucketsClient:
|
|
|
62
62
|
client = GroundX(
|
|
63
63
|
api_key="YOUR_API_KEY",
|
|
64
64
|
)
|
|
65
|
-
client.buckets.list(
|
|
65
|
+
client.buckets.list(
|
|
66
|
+
n=1,
|
|
67
|
+
next_token="nextToken",
|
|
68
|
+
)
|
|
66
69
|
"""
|
|
67
70
|
_response = self._raw_client.list(n=n, next_token=next_token, request_options=request_options)
|
|
68
71
|
return _response.data
|
|
@@ -250,7 +253,10 @@ class AsyncBucketsClient:
|
|
|
250
253
|
|
|
251
254
|
|
|
252
255
|
async def main() -> None:
|
|
253
|
-
await client.buckets.list(
|
|
256
|
+
await client.buckets.list(
|
|
257
|
+
n=1,
|
|
258
|
+
next_token="nextToken",
|
|
259
|
+
)
|
|
254
260
|
|
|
255
261
|
|
|
256
262
|
asyncio.run(main())
|
|
@@ -14,10 +14,10 @@ class BaseClientWrapper:
|
|
|
14
14
|
|
|
15
15
|
def get_headers(self) -> typing.Dict[str, str]:
|
|
16
16
|
headers: typing.Dict[str, str] = {
|
|
17
|
-
"User-Agent": "groundx/2.
|
|
17
|
+
"User-Agent": "groundx/2.4.1",
|
|
18
18
|
"X-Fern-Language": "Python",
|
|
19
19
|
"X-Fern-SDK-Name": "groundx",
|
|
20
|
-
"X-Fern-SDK-Version": "2.
|
|
20
|
+
"X-Fern-SDK-Version": "2.4.1",
|
|
21
21
|
}
|
|
22
22
|
headers["X-API-Key"] = self.api_key
|
|
23
23
|
return headers
|
|
@@ -240,7 +240,14 @@ class DocumentsClient:
|
|
|
240
240
|
client = GroundX(
|
|
241
241
|
api_key="YOUR_API_KEY",
|
|
242
242
|
)
|
|
243
|
-
client.documents.list(
|
|
243
|
+
client.documents.list(
|
|
244
|
+
n=1,
|
|
245
|
+
filter="filter",
|
|
246
|
+
sort="name",
|
|
247
|
+
sort_order="asc",
|
|
248
|
+
status="queued",
|
|
249
|
+
next_token="nextToken",
|
|
250
|
+
)
|
|
244
251
|
"""
|
|
245
252
|
_response = self._raw_client.list(
|
|
246
253
|
n=n,
|
|
@@ -377,6 +384,12 @@ class DocumentsClient:
|
|
|
377
384
|
)
|
|
378
385
|
client.documents.lookup(
|
|
379
386
|
id=1,
|
|
387
|
+
n=1,
|
|
388
|
+
filter="filter",
|
|
389
|
+
sort="name",
|
|
390
|
+
sort_order="asc",
|
|
391
|
+
status="queued",
|
|
392
|
+
next_token="nextToken",
|
|
380
393
|
)
|
|
381
394
|
"""
|
|
382
395
|
_response = self._raw_client.lookup(
|
|
@@ -488,7 +501,10 @@ class DocumentsClient:
|
|
|
488
501
|
client = GroundX(
|
|
489
502
|
api_key="YOUR_API_KEY",
|
|
490
503
|
)
|
|
491
|
-
client.documents.get_processes(
|
|
504
|
+
client.documents.get_processes(
|
|
505
|
+
n=1,
|
|
506
|
+
status="queued",
|
|
507
|
+
)
|
|
492
508
|
"""
|
|
493
509
|
_response = self._raw_client.get_processes(n=n, status=status, request_options=request_options)
|
|
494
510
|
return _response.data
|
|
@@ -746,7 +762,14 @@ class AsyncDocumentsClient:
|
|
|
746
762
|
|
|
747
763
|
|
|
748
764
|
async def main() -> None:
|
|
749
|
-
await client.documents.list(
|
|
765
|
+
await client.documents.list(
|
|
766
|
+
n=1,
|
|
767
|
+
filter="filter",
|
|
768
|
+
sort="name",
|
|
769
|
+
sort_order="asc",
|
|
770
|
+
status="queued",
|
|
771
|
+
next_token="nextToken",
|
|
772
|
+
)
|
|
750
773
|
|
|
751
774
|
|
|
752
775
|
asyncio.run(main())
|
|
@@ -907,6 +930,12 @@ class AsyncDocumentsClient:
|
|
|
907
930
|
async def main() -> None:
|
|
908
931
|
await client.documents.lookup(
|
|
909
932
|
id=1,
|
|
933
|
+
n=1,
|
|
934
|
+
filter="filter",
|
|
935
|
+
sort="name",
|
|
936
|
+
sort_order="asc",
|
|
937
|
+
status="queued",
|
|
938
|
+
next_token="nextToken",
|
|
910
939
|
)
|
|
911
940
|
|
|
912
941
|
|
|
@@ -1044,7 +1073,10 @@ class AsyncDocumentsClient:
|
|
|
1044
1073
|
|
|
1045
1074
|
|
|
1046
1075
|
async def main() -> None:
|
|
1047
|
-
await client.documents.get_processes(
|
|
1076
|
+
await client.documents.get_processes(
|
|
1077
|
+
n=1,
|
|
1078
|
+
status="queued",
|
|
1079
|
+
)
|
|
1048
1080
|
|
|
1049
1081
|
|
|
1050
1082
|
asyncio.run(main())
|
|
@@ -61,7 +61,10 @@ class GroupsClient:
|
|
|
61
61
|
client = GroundX(
|
|
62
62
|
api_key="YOUR_API_KEY",
|
|
63
63
|
)
|
|
64
|
-
client.groups.list(
|
|
64
|
+
client.groups.list(
|
|
65
|
+
n=1,
|
|
66
|
+
next_token="nextToken",
|
|
67
|
+
)
|
|
65
68
|
"""
|
|
66
69
|
_response = self._raw_client.list(n=n, next_token=next_token, request_options=request_options)
|
|
67
70
|
return _response.data
|
|
@@ -333,7 +336,10 @@ class AsyncGroupsClient:
|
|
|
333
336
|
|
|
334
337
|
|
|
335
338
|
async def main() -> None:
|
|
336
|
-
await client.groups.list(
|
|
339
|
+
await client.groups.list(
|
|
340
|
+
n=1,
|
|
341
|
+
next_token="nextToken",
|
|
342
|
+
)
|
|
337
343
|
|
|
338
344
|
|
|
339
345
|
asyncio.run(main())
|
|
@@ -125,7 +125,7 @@ def prep_documents(
|
|
|
125
125
|
return remote_documents, local_documents
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
def split_doc(file):
|
|
128
|
+
def split_doc(file: Path) -> typing.List[Path]:
|
|
129
129
|
if file.is_file() and (
|
|
130
130
|
file.suffix.lower() in ALLOWED_SUFFIXES
|
|
131
131
|
or file.suffix.lower() in SUFFIX_ALIASES
|
|
@@ -142,9 +142,11 @@ class GroundX(GroundXBase):
|
|
|
142
142
|
self,
|
|
143
143
|
*,
|
|
144
144
|
documents: typing.Sequence[Document],
|
|
145
|
-
batch_size:
|
|
146
|
-
wait_for_complete:
|
|
147
|
-
upload_api:
|
|
145
|
+
batch_size: int = 10,
|
|
146
|
+
wait_for_complete: bool = False,
|
|
147
|
+
upload_api: str = "https://api.eyelevel.ai/upload/file",
|
|
148
|
+
callback_url: typing.Optional[str] = None,
|
|
149
|
+
callback_data: typing.Optional[str] = None,
|
|
148
150
|
request_options: typing.Optional[RequestOptions] = None,
|
|
149
151
|
) -> IngestResponse:
|
|
150
152
|
"""
|
|
@@ -165,6 +167,13 @@ class GroundX(GroundXBase):
|
|
|
165
167
|
# and returns a presigned URL in a JSON dictionary with key 'URL'
|
|
166
168
|
upload_api : typing.Optional[str]
|
|
167
169
|
|
|
170
|
+
# an endpoint that will receive processing event updates as POST
|
|
171
|
+
callback_url : typing.Optional[str]
|
|
172
|
+
|
|
173
|
+
# a string that is returned, along with processing event updates,
|
|
174
|
+
# to the callback URL.
|
|
175
|
+
callback_data : typing.Optional[str]
|
|
176
|
+
|
|
168
177
|
request_options : typing.Optional[RequestOptions]
|
|
169
178
|
Request-specific configuration.
|
|
170
179
|
|
|
@@ -209,6 +218,8 @@ class GroundX(GroundXBase):
|
|
|
209
218
|
if len(remote_batch) >= n:
|
|
210
219
|
ingest = self.documents.ingest_remote(
|
|
211
220
|
documents=remote_batch,
|
|
221
|
+
callback_url=callback_url,
|
|
222
|
+
callback_data=callback_data,
|
|
212
223
|
request_options=request_options,
|
|
213
224
|
)
|
|
214
225
|
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
|
@@ -222,6 +233,8 @@ class GroundX(GroundXBase):
|
|
|
222
233
|
if remote_batch:
|
|
223
234
|
ingest = self.documents.ingest_remote(
|
|
224
235
|
documents=remote_batch,
|
|
236
|
+
callback_data=callback_data,
|
|
237
|
+
callback_url=callback_url,
|
|
225
238
|
request_options=request_options,
|
|
226
239
|
)
|
|
227
240
|
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
|
@@ -243,6 +256,8 @@ class GroundX(GroundXBase):
|
|
|
243
256
|
|
|
244
257
|
ingest = self.documents.ingest_remote(
|
|
245
258
|
documents=up_docs,
|
|
259
|
+
callback_url=callback_url,
|
|
260
|
+
callback_data=callback_data,
|
|
246
261
|
request_options=request_options,
|
|
247
262
|
)
|
|
248
263
|
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
|
@@ -258,6 +273,8 @@ class GroundX(GroundXBase):
|
|
|
258
273
|
|
|
259
274
|
ingest = self.documents.ingest_remote(
|
|
260
275
|
documents=up_docs,
|
|
276
|
+
callback_data=callback_data,
|
|
277
|
+
callback_url=callback_url,
|
|
261
278
|
request_options=request_options,
|
|
262
279
|
)
|
|
263
280
|
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
|
@@ -270,11 +287,13 @@ class GroundX(GroundXBase):
|
|
|
270
287
|
raise ValueError("You have sent too many documents in this request")
|
|
271
288
|
|
|
272
289
|
|
|
273
|
-
up_docs, _ = self._process_local(local_documents, upload_api)
|
|
290
|
+
up_docs, _ = self._process_local(local_documents, upload_api, 0, None)
|
|
274
291
|
remote_documents.extend(up_docs)
|
|
275
292
|
|
|
276
293
|
return self.documents.ingest_remote(
|
|
277
294
|
documents=remote_documents,
|
|
295
|
+
callback_url=callback_url,
|
|
296
|
+
callback_data=callback_data,
|
|
278
297
|
request_options=request_options,
|
|
279
298
|
)
|
|
280
299
|
|
|
@@ -283,8 +302,10 @@ class GroundX(GroundXBase):
|
|
|
283
302
|
*,
|
|
284
303
|
bucket_id: int,
|
|
285
304
|
path: str,
|
|
286
|
-
batch_size:
|
|
287
|
-
upload_api:
|
|
305
|
+
batch_size: int = 10,
|
|
306
|
+
upload_api: str = "https://api.eyelevel.ai/upload/file",
|
|
307
|
+
callback_url: typing.Optional[str] = None,
|
|
308
|
+
callback_data: typing.Optional[str] = None,
|
|
288
309
|
request_options: typing.Optional[RequestOptions] = None,
|
|
289
310
|
):
|
|
290
311
|
"""
|
|
@@ -300,6 +321,13 @@ class GroundX(GroundXBase):
|
|
|
300
321
|
# and returns a presigned URL in a JSON dictionary with key 'URL'
|
|
301
322
|
upload_api : typing.Optional[str]
|
|
302
323
|
|
|
324
|
+
# an endpoint that will receive processing event updates as POST
|
|
325
|
+
callback_url : typing.Optional[str]
|
|
326
|
+
|
|
327
|
+
# a string that is returned, along with processing event updates,
|
|
328
|
+
# to the callback URL.
|
|
329
|
+
callback_data : typing.Optional[str]
|
|
330
|
+
|
|
303
331
|
request_options : typing.Optional[RequestOptions]
|
|
304
332
|
Request-specific configuration.
|
|
305
333
|
|
|
@@ -357,7 +385,7 @@ class GroundX(GroundXBase):
|
|
|
357
385
|
file_size = file.stat().st_size
|
|
358
386
|
|
|
359
387
|
if (current_batch_size + file_size > MAX_BATCH_SIZE_BYTES) or (len(current_batch) >= n):
|
|
360
|
-
self._upload_file_batch(bucket_id, current_batch, upload_api, request_options, pbar)
|
|
388
|
+
self._upload_file_batch(bucket_id, current_batch, upload_api, callback_url, callback_data, request_options, pbar)
|
|
361
389
|
current_batch = []
|
|
362
390
|
current_batch_size = 0
|
|
363
391
|
|
|
@@ -365,13 +393,13 @@ class GroundX(GroundXBase):
|
|
|
365
393
|
current_batch_size += file_size
|
|
366
394
|
|
|
367
395
|
if current_batch:
|
|
368
|
-
self._upload_file_batch(bucket_id, current_batch, upload_api, request_options, pbar)
|
|
396
|
+
self._upload_file_batch(bucket_id, current_batch, upload_api, callback_url, callback_data, request_options, pbar)
|
|
369
397
|
|
|
370
398
|
def _upload_file(
|
|
371
399
|
self,
|
|
372
|
-
endpoint,
|
|
373
|
-
file_path,
|
|
374
|
-
):
|
|
400
|
+
endpoint: str,
|
|
401
|
+
file_path: Path,
|
|
402
|
+
) -> str:
|
|
375
403
|
file_name = os.path.basename(file_path)
|
|
376
404
|
file_extension = os.path.splitext(file_name)[1][1:].lower()
|
|
377
405
|
if f".{file_extension}" in SUFFIX_ALIASES:
|
|
@@ -407,12 +435,12 @@ class GroundX(GroundXBase):
|
|
|
407
435
|
|
|
408
436
|
def _process_local(
|
|
409
437
|
self,
|
|
410
|
-
local_docs,
|
|
411
|
-
upload_api,
|
|
412
|
-
progress
|
|
413
|
-
pbar = None,
|
|
414
|
-
):
|
|
415
|
-
remote_docs = []
|
|
438
|
+
local_docs: typing.List[Document],
|
|
439
|
+
upload_api: str,
|
|
440
|
+
progress: float,
|
|
441
|
+
pbar: typing.Optional[typing.Any] = None,
|
|
442
|
+
) -> typing.Tuple[typing.List[IngestRemoteDocument], float]:
|
|
443
|
+
remote_docs: typing.List[IngestRemoteDocument] = []
|
|
416
444
|
for d in local_docs:
|
|
417
445
|
splits = split_doc(Path(os.path.expanduser(d.file_path)))
|
|
418
446
|
|
|
@@ -439,23 +467,22 @@ class GroundX(GroundXBase):
|
|
|
439
467
|
)
|
|
440
468
|
)
|
|
441
469
|
|
|
442
|
-
|
|
470
|
+
progress -= 0.25
|
|
471
|
+
if pbar is not None and pbar.update is not None:
|
|
443
472
|
pbar.update(0.25)
|
|
444
|
-
progress -= 0.25
|
|
445
473
|
|
|
446
474
|
return remote_docs, progress
|
|
447
475
|
|
|
448
476
|
def _monitor_batch(
|
|
449
477
|
self,
|
|
450
|
-
ingest,
|
|
451
|
-
progress,
|
|
452
|
-
pbar,
|
|
453
|
-
):
|
|
454
|
-
completed_files = set()
|
|
478
|
+
ingest: IngestResponse,
|
|
479
|
+
progress: float,
|
|
480
|
+
pbar: typing.Any,
|
|
481
|
+
) -> typing.Tuple[IngestResponse, float]:
|
|
482
|
+
completed_files: typing.Set[str] = set()
|
|
455
483
|
|
|
456
484
|
while (
|
|
457
|
-
ingest
|
|
458
|
-
and ingest.ingest.status not in ["complete", "error", "cancelled"]
|
|
485
|
+
ingest.ingest.status not in ["complete", "error", "cancelled"]
|
|
459
486
|
):
|
|
460
487
|
time.sleep(3)
|
|
461
488
|
ingest = self.documents.get_processing_status_by_id(ingest.ingest.process_id)
|
|
@@ -494,13 +521,15 @@ class GroundX(GroundXBase):
|
|
|
494
521
|
|
|
495
522
|
def _upload_file_batch(
|
|
496
523
|
self,
|
|
497
|
-
bucket_id,
|
|
498
|
-
batch,
|
|
499
|
-
upload_api,
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
524
|
+
bucket_id: int,
|
|
525
|
+
batch: typing.List[Path],
|
|
526
|
+
upload_api: str,
|
|
527
|
+
callback_url: typing.Optional[str],
|
|
528
|
+
callback_data: typing.Optional[str],
|
|
529
|
+
request_options: typing.Optional[RequestOptions],
|
|
530
|
+
pbar: typing.Any,
|
|
531
|
+
) -> None:
|
|
532
|
+
docs: typing.List[Document] = []
|
|
504
533
|
|
|
505
534
|
progress = float(len(batch))
|
|
506
535
|
for file in batch:
|
|
@@ -526,7 +555,12 @@ class GroundX(GroundXBase):
|
|
|
526
555
|
progress -= 0.25
|
|
527
556
|
|
|
528
557
|
if docs:
|
|
529
|
-
ingest = self.ingest(
|
|
558
|
+
ingest = self.ingest(
|
|
559
|
+
documents=docs,
|
|
560
|
+
callback_data=callback_data,
|
|
561
|
+
callback_url=callback_url,
|
|
562
|
+
request_options=request_options,
|
|
563
|
+
)
|
|
530
564
|
ingest, progress = self._monitor_batch(ingest, progress, pbar)
|
|
531
565
|
|
|
532
566
|
if progress > 0:
|
|
@@ -540,6 +574,8 @@ class AsyncGroundX(AsyncGroundXBase):
|
|
|
540
574
|
*,
|
|
541
575
|
documents: typing.Sequence[Document],
|
|
542
576
|
upload_api: str = "https://api.eyelevel.ai/upload/file",
|
|
577
|
+
callback_url: typing.Optional[str] = None,
|
|
578
|
+
callback_data: typing.Optional[str] = None,
|
|
543
579
|
request_options: typing.Optional[RequestOptions] = None,
|
|
544
580
|
) -> IngestResponse:
|
|
545
581
|
"""
|
|
@@ -553,6 +589,13 @@ class AsyncGroundX(AsyncGroundXBase):
|
|
|
553
589
|
# and returns a presigned URL in a JSON dictionary with key 'URL'
|
|
554
590
|
upload_api : typing.Optional[str]
|
|
555
591
|
|
|
592
|
+
# an endpoint that will receive processing event updates as POST
|
|
593
|
+
callback_url : typing.Optional[str]
|
|
594
|
+
|
|
595
|
+
# a string that is returned, along with processing event updates,
|
|
596
|
+
# to the callback URL.
|
|
597
|
+
callback_data : typing.Optional[str]
|
|
598
|
+
|
|
556
599
|
request_options : typing.Optional[RequestOptions]
|
|
557
600
|
Request-specific configuration.
|
|
558
601
|
|
|
@@ -621,14 +664,16 @@ class AsyncGroundX(AsyncGroundXBase):
|
|
|
621
664
|
|
|
622
665
|
return await self.documents.ingest_remote(
|
|
623
666
|
documents=remote_documents,
|
|
667
|
+
callback_url=callback_url,
|
|
668
|
+
callback_data=callback_data,
|
|
624
669
|
request_options=request_options,
|
|
625
670
|
)
|
|
626
671
|
|
|
627
672
|
def _upload_file(
|
|
628
673
|
self,
|
|
629
|
-
endpoint,
|
|
630
|
-
file_path,
|
|
631
|
-
):
|
|
674
|
+
endpoint: str,
|
|
675
|
+
file_path: Path,
|
|
676
|
+
) -> str:
|
|
632
677
|
file_name = os.path.basename(file_path)
|
|
633
678
|
file_extension = os.path.splitext(file_name)[1][1:].lower()
|
|
634
679
|
if f".{file_extension}" in SUFFIX_ALIASES:
|
|
@@ -83,7 +83,9 @@ class SearchClient:
|
|
|
83
83
|
)
|
|
84
84
|
client.search.content(
|
|
85
85
|
id=1,
|
|
86
|
+
n=1,
|
|
86
87
|
next_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
|
|
88
|
+
verbosity=1,
|
|
87
89
|
query="my search query",
|
|
88
90
|
)
|
|
89
91
|
"""
|
|
@@ -154,7 +156,9 @@ class SearchClient:
|
|
|
154
156
|
api_key="YOUR_API_KEY",
|
|
155
157
|
)
|
|
156
158
|
client.search.documents(
|
|
159
|
+
n=1,
|
|
157
160
|
next_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
|
|
161
|
+
verbosity=1,
|
|
158
162
|
query="my search query",
|
|
159
163
|
document_ids=["docUUID1", "docUUID2"],
|
|
160
164
|
)
|
|
@@ -248,7 +252,9 @@ class AsyncSearchClient:
|
|
|
248
252
|
async def main() -> None:
|
|
249
253
|
await client.search.content(
|
|
250
254
|
id=1,
|
|
255
|
+
n=1,
|
|
251
256
|
next_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
|
|
257
|
+
verbosity=1,
|
|
252
258
|
query="my search query",
|
|
253
259
|
)
|
|
254
260
|
|
|
@@ -327,7 +333,9 @@ class AsyncSearchClient:
|
|
|
327
333
|
|
|
328
334
|
async def main() -> None:
|
|
329
335
|
await client.search.documents(
|
|
336
|
+
n=1,
|
|
330
337
|
next_token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",
|
|
338
|
+
verbosity=1,
|
|
331
339
|
query="my search query",
|
|
332
340
|
document_ids=["docUUID1", "docUUID2"],
|
|
333
341
|
)
|
|
@@ -50,6 +50,13 @@ class DocumentDetail(UniversalBaseModel):
|
|
|
50
50
|
|
|
51
51
|
status: typing.Optional[ProcessingStatus] = None
|
|
52
52
|
status_message: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="statusMessage")] = None
|
|
53
|
+
text_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="textUrl")] = pydantic.Field(
|
|
54
|
+
default=None
|
|
55
|
+
)
|
|
56
|
+
"""
|
|
57
|
+
Extracted text URL, if using the extract agent
|
|
58
|
+
"""
|
|
59
|
+
|
|
53
60
|
xray_url: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="xrayUrl")] = pydantic.Field(
|
|
54
61
|
default=None
|
|
55
62
|
)
|
|
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
|
|
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
|