nv-ingest-client 2025.8.13.dev20250813__py3-none-any.whl → 2025.8.15.dev20250815__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nv-ingest-client might be problematic. Click here for more details.
- nv_ingest_client/cli/util/click.py +182 -30
- nv_ingest_client/client/interface.py +209 -26
- nv_ingest_client/nv_ingest_cli.py +16 -0
- nv_ingest_client/primitives/jobs/job_spec.py +29 -9
- nv_ingest_client/primitives/tasks/__init__.py +6 -4
- nv_ingest_client/primitives/tasks/audio_extraction.py +27 -23
- nv_ingest_client/primitives/tasks/caption.py +10 -16
- nv_ingest_client/primitives/tasks/chart_extraction.py +16 -10
- nv_ingest_client/primitives/tasks/dedup.py +12 -21
- nv_ingest_client/primitives/tasks/embed.py +21 -76
- nv_ingest_client/primitives/tasks/extract.py +67 -168
- nv_ingest_client/primitives/tasks/filter.py +21 -27
- nv_ingest_client/primitives/tasks/infographic_extraction.py +16 -13
- nv_ingest_client/primitives/tasks/split.py +17 -18
- nv_ingest_client/primitives/tasks/store.py +29 -29
- nv_ingest_client/primitives/tasks/task_base.py +1 -72
- nv_ingest_client/primitives/tasks/task_factory.py +2 -0
- nv_ingest_client/primitives/tasks/udf.py +352 -0
- nv_ingest_client/util/vdb/milvus.py +1 -0
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/METADATA +1 -1
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/RECORD +25 -27
- nv_ingest_client/cli/util/tasks.py +0 -3
- nv_ingest_client/primitives/exceptions.py +0 -0
- nv_ingest_client/primitives/tasks/transform.py +0 -0
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/WHEEL +0 -0
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/entry_points.txt +0 -0
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/licenses/LICENSE +0 -0
- {nv_ingest_client-2025.8.13.dev20250813.dist-info → nv_ingest_client-2025.8.15.dev20250815.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES.
|
|
2
|
+
# All rights reserved.
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# pylint: disable=too-few-public-methods
|
|
7
|
+
# pylint: disable=too-many-arguments
|
|
8
|
+
|
|
9
|
+
import importlib.util
|
|
10
|
+
import logging
|
|
11
|
+
import importlib
|
|
12
|
+
import inspect
|
|
13
|
+
import ast
|
|
14
|
+
from typing import Dict, Optional, Union
|
|
15
|
+
|
|
16
|
+
from nv_ingest_api.internal.enums.common import PipelinePhase
|
|
17
|
+
from nv_ingest_api.internal.schemas.meta.ingest_job_schema import IngestTaskUDFSchema
|
|
18
|
+
from nv_ingest_client.primitives.tasks.task_base import Task
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _load_function_from_import_path(import_path: str):
|
|
24
|
+
"""Load a function from an import path like 'module.submodule.function'."""
|
|
25
|
+
try:
|
|
26
|
+
parts = import_path.split(".")
|
|
27
|
+
module_path = ".".join(parts[:-1])
|
|
28
|
+
function_name = parts[-1]
|
|
29
|
+
|
|
30
|
+
module = importlib.import_module(module_path)
|
|
31
|
+
func = getattr(module, function_name)
|
|
32
|
+
|
|
33
|
+
if not callable(func):
|
|
34
|
+
raise ValueError(f"'{function_name}' is not callable in module '{module_path}'")
|
|
35
|
+
|
|
36
|
+
return func
|
|
37
|
+
except ImportError as e:
|
|
38
|
+
raise ValueError(f"Failed to import module from '{import_path}': {e}")
|
|
39
|
+
except AttributeError as e:
|
|
40
|
+
raise ValueError(f"Function '{function_name}' not found in module '{module_path}': {e}")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _load_function_from_file_path(file_path: str, function_name: str):
|
|
44
|
+
"""Load a function from a file path."""
|
|
45
|
+
try:
|
|
46
|
+
|
|
47
|
+
# Create a module spec from the file
|
|
48
|
+
spec = importlib.util.spec_from_file_location("udf_module", file_path)
|
|
49
|
+
if spec is None:
|
|
50
|
+
raise ValueError(f"Could not create module spec from file: {file_path}")
|
|
51
|
+
|
|
52
|
+
module = importlib.util.module_from_spec(spec)
|
|
53
|
+
|
|
54
|
+
# Execute the module to load its contents
|
|
55
|
+
spec.loader.exec_module(module)
|
|
56
|
+
|
|
57
|
+
# Get the function
|
|
58
|
+
func = getattr(module, function_name)
|
|
59
|
+
|
|
60
|
+
if not callable(func):
|
|
61
|
+
raise ValueError(f"'{function_name}' is not callable in file '{file_path}'")
|
|
62
|
+
|
|
63
|
+
return func
|
|
64
|
+
except Exception as e:
|
|
65
|
+
raise ValueError(f"Failed to load function '{function_name}' from file '{file_path}': {e}")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def _extract_function_with_context(file_path: str, function_name: str) -> str:
|
|
69
|
+
"""
|
|
70
|
+
Extract a function from a file while preserving the full module context.
|
|
71
|
+
|
|
72
|
+
This includes all imports, module-level variables, and other functions
|
|
73
|
+
that the target function might depend on.
|
|
74
|
+
|
|
75
|
+
Parameters
|
|
76
|
+
----------
|
|
77
|
+
file_path : str
|
|
78
|
+
Path to the Python file containing the function
|
|
79
|
+
function_name : str
|
|
80
|
+
Name of the function to extract
|
|
81
|
+
|
|
82
|
+
Returns
|
|
83
|
+
-------
|
|
84
|
+
str
|
|
85
|
+
Complete module source code with the target function
|
|
86
|
+
"""
|
|
87
|
+
try:
|
|
88
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
89
|
+
module_source = f.read()
|
|
90
|
+
|
|
91
|
+
# Parse the module to verify the function exists
|
|
92
|
+
try:
|
|
93
|
+
tree = ast.parse(module_source)
|
|
94
|
+
function_found = False
|
|
95
|
+
|
|
96
|
+
for node in ast.walk(tree):
|
|
97
|
+
if isinstance(node, ast.FunctionDef) and node.name == function_name:
|
|
98
|
+
function_found = True
|
|
99
|
+
break
|
|
100
|
+
|
|
101
|
+
if not function_found:
|
|
102
|
+
raise ValueError(f"Function '{function_name}' not found in file '{file_path}'")
|
|
103
|
+
|
|
104
|
+
except SyntaxError as e:
|
|
105
|
+
raise ValueError(f"Syntax error in file '{file_path}': {e}")
|
|
106
|
+
|
|
107
|
+
return module_source
|
|
108
|
+
|
|
109
|
+
except FileNotFoundError:
|
|
110
|
+
raise ValueError(f"File not found: {file_path}")
|
|
111
|
+
except Exception as e:
|
|
112
|
+
raise ValueError(f"Failed to read file '{file_path}': {e}")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _resolve_udf_function(udf_function_spec: str) -> str:
|
|
116
|
+
"""
|
|
117
|
+
Resolve UDF function specification to function string.
|
|
118
|
+
|
|
119
|
+
Supports four formats:
|
|
120
|
+
1. Inline function string: 'def my_func(control_message): ...'
|
|
121
|
+
2. Module path with colon: 'my_module.my_submodule:my_function' (preserves imports)
|
|
122
|
+
3. File path: '/path/to/file.py:my_function'
|
|
123
|
+
4. Legacy import path: 'my_module.my_function' (function name only, no imports)
|
|
124
|
+
"""
|
|
125
|
+
if udf_function_spec.strip().startswith("def "):
|
|
126
|
+
# Already an inline function string
|
|
127
|
+
return udf_function_spec
|
|
128
|
+
|
|
129
|
+
elif ".py:" in udf_function_spec:
|
|
130
|
+
# File path format: /path/to/file.py:function_name
|
|
131
|
+
file_path, function_name = udf_function_spec.split(":", 1)
|
|
132
|
+
return _extract_function_with_context(file_path, function_name)
|
|
133
|
+
|
|
134
|
+
elif udf_function_spec.endswith(".py"):
|
|
135
|
+
# File path format without function name - this is an error
|
|
136
|
+
raise ValueError(
|
|
137
|
+
f"File path '{udf_function_spec}' is missing function name. "
|
|
138
|
+
f"Use format 'file.py:function_name' to specify which function to use."
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
elif ":" in udf_function_spec and ".py:" not in udf_function_spec:
|
|
142
|
+
# Module path format with colon: my_module.submodule:function_name
|
|
143
|
+
# This preserves imports and module context
|
|
144
|
+
module_path, function_name = udf_function_spec.split(":", 1)
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
# Import the module to get its file path
|
|
148
|
+
module = importlib.import_module(module_path)
|
|
149
|
+
module_file = inspect.getfile(module)
|
|
150
|
+
|
|
151
|
+
# Extract the function with full module context
|
|
152
|
+
return _extract_function_with_context(module_file, function_name)
|
|
153
|
+
|
|
154
|
+
except ImportError as e:
|
|
155
|
+
raise ValueError(f"Failed to import module '{module_path}': {e}")
|
|
156
|
+
except Exception as e:
|
|
157
|
+
raise ValueError(f"Failed to resolve module path '{module_path}': {e}")
|
|
158
|
+
|
|
159
|
+
elif "." in udf_function_spec:
|
|
160
|
+
# Legacy import path format: module.submodule.function
|
|
161
|
+
# This only extracts the function source without imports (legacy behavior)
|
|
162
|
+
func = _load_function_from_import_path(udf_function_spec)
|
|
163
|
+
|
|
164
|
+
# Get the source code of the function only
|
|
165
|
+
try:
|
|
166
|
+
source = inspect.getsource(func)
|
|
167
|
+
return source
|
|
168
|
+
except (OSError, TypeError) as e:
|
|
169
|
+
raise ValueError(f"Could not get source code for function from '{udf_function_spec}': {e}")
|
|
170
|
+
|
|
171
|
+
else:
|
|
172
|
+
raise ValueError(f"Invalid UDF function specification: {udf_function_spec}")
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
class UDFTask(Task):
|
|
176
|
+
"""
|
|
177
|
+
User-Defined Function (UDF) task for custom processing logic.
|
|
178
|
+
|
|
179
|
+
This task allows users to provide custom Python functions that will be executed
|
|
180
|
+
during the ingestion pipeline. The UDF function must accept a control_message
|
|
181
|
+
parameter and return an IngestControlMessage.
|
|
182
|
+
|
|
183
|
+
Supports four UDF function specification formats:
|
|
184
|
+
1. Inline function string: 'def my_func(control_message): ...'
|
|
185
|
+
2. Module path with colon: 'my_module.my_submodule:my_function' (preserves imports)
|
|
186
|
+
3. File path: '/path/to/file.py:my_function'
|
|
187
|
+
4. Legacy import path: 'my_module.my_function' (function name only, no imports)
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
def __init__(
|
|
191
|
+
self,
|
|
192
|
+
udf_function: Optional[str] = None,
|
|
193
|
+
udf_function_name: Optional[str] = None,
|
|
194
|
+
phase: Union[PipelinePhase, int, str, None] = PipelinePhase.RESPONSE,
|
|
195
|
+
target_stage: Optional[str] = None,
|
|
196
|
+
run_before: bool = False,
|
|
197
|
+
run_after: bool = False,
|
|
198
|
+
) -> None:
|
|
199
|
+
super().__init__()
|
|
200
|
+
self._udf_function = udf_function
|
|
201
|
+
self._udf_function_name = udf_function_name
|
|
202
|
+
self._target_stage = target_stage
|
|
203
|
+
self._run_before = run_before
|
|
204
|
+
self._run_after = run_after
|
|
205
|
+
|
|
206
|
+
# Convert phase to the appropriate format for API schema
|
|
207
|
+
# If target_stage is provided and phase is None, don't convert phase
|
|
208
|
+
if target_stage is not None and phase is None:
|
|
209
|
+
converted_phase = None
|
|
210
|
+
self._phase = None # Set to None when using target_stage
|
|
211
|
+
else:
|
|
212
|
+
converted_phase = self._convert_phase(phase)
|
|
213
|
+
self._phase = PipelinePhase(converted_phase) # Convert back to enum for internal use
|
|
214
|
+
|
|
215
|
+
# Use the API schema for validation
|
|
216
|
+
_ = IngestTaskUDFSchema(
|
|
217
|
+
udf_function=udf_function or "",
|
|
218
|
+
udf_function_name=udf_function_name or "",
|
|
219
|
+
phase=converted_phase,
|
|
220
|
+
target_stage=target_stage,
|
|
221
|
+
run_before=run_before,
|
|
222
|
+
run_after=run_after,
|
|
223
|
+
)
|
|
224
|
+
self._resolved_udf_function = None
|
|
225
|
+
|
|
226
|
+
def _convert_phase(self, phase: Union[PipelinePhase, int, str]) -> int:
|
|
227
|
+
"""Convert phase to integer for API schema validation."""
|
|
228
|
+
if isinstance(phase, PipelinePhase):
|
|
229
|
+
return phase.value
|
|
230
|
+
|
|
231
|
+
if isinstance(phase, int):
|
|
232
|
+
try:
|
|
233
|
+
PipelinePhase(phase) # Validate it's a valid phase number
|
|
234
|
+
return phase
|
|
235
|
+
except ValueError:
|
|
236
|
+
valid_values = [p.value for p in PipelinePhase]
|
|
237
|
+
raise ValueError(f"Invalid phase number {phase}. Valid values are: {valid_values}")
|
|
238
|
+
|
|
239
|
+
if isinstance(phase, str):
|
|
240
|
+
# Convert string to uppercase and try to match enum name
|
|
241
|
+
phase_name = phase.upper().strip()
|
|
242
|
+
|
|
243
|
+
# Handle common aliases and variations
|
|
244
|
+
phase_aliases = {
|
|
245
|
+
"EXTRACT": "EXTRACTION",
|
|
246
|
+
"PREPROCESS": "PRE_PROCESSING",
|
|
247
|
+
"PRE_PROCESS": "PRE_PROCESSING",
|
|
248
|
+
"PREPROCESSING": "PRE_PROCESSING",
|
|
249
|
+
"POSTPROCESS": "POST_PROCESSING",
|
|
250
|
+
"POST_PROCESS": "POST_PROCESSING",
|
|
251
|
+
"POSTPROCESSING": "POST_PROCESSING",
|
|
252
|
+
"MUTATE": "MUTATION",
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
# Apply alias if exists
|
|
256
|
+
if phase_name in phase_aliases:
|
|
257
|
+
phase_name = phase_aliases[phase_name]
|
|
258
|
+
|
|
259
|
+
try:
|
|
260
|
+
return PipelinePhase[phase_name].value
|
|
261
|
+
except KeyError:
|
|
262
|
+
valid_names = [p.name for p in PipelinePhase]
|
|
263
|
+
valid_aliases = list(phase_aliases.keys())
|
|
264
|
+
raise ValueError(
|
|
265
|
+
f"Invalid phase name '{phase}'. Valid phase names are: {valid_names}. "
|
|
266
|
+
f"Also supported aliases: {valid_aliases}"
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
raise ValueError(f"Phase must be a PipelinePhase enum, integer, or string, got {type(phase)}")
|
|
270
|
+
|
|
271
|
+
@property
|
|
272
|
+
def udf_function(self) -> Optional[str]:
|
|
273
|
+
"""
|
|
274
|
+
Returns the UDF function string or specification.
|
|
275
|
+
"""
|
|
276
|
+
return self._udf_function
|
|
277
|
+
|
|
278
|
+
@property
|
|
279
|
+
def udf_function_name(self) -> Optional[str]:
|
|
280
|
+
"""
|
|
281
|
+
Returns the UDF function name.
|
|
282
|
+
"""
|
|
283
|
+
return self._udf_function_name
|
|
284
|
+
|
|
285
|
+
@property
|
|
286
|
+
def phase(self) -> PipelinePhase:
|
|
287
|
+
"""
|
|
288
|
+
Returns the pipeline phase for this UDF task.
|
|
289
|
+
"""
|
|
290
|
+
return self._phase
|
|
291
|
+
|
|
292
|
+
def __str__(self) -> str:
|
|
293
|
+
"""
|
|
294
|
+
Returns a string with the object's config and run time state
|
|
295
|
+
"""
|
|
296
|
+
info = ""
|
|
297
|
+
info += "User-Defined Function (UDF) Task:\n"
|
|
298
|
+
|
|
299
|
+
if self._udf_function:
|
|
300
|
+
# Show first 100 characters of the function for brevity
|
|
301
|
+
function_preview = self._udf_function[:100]
|
|
302
|
+
if len(self._udf_function) > 100:
|
|
303
|
+
function_preview += "..."
|
|
304
|
+
info += f" udf_function: {function_preview}\n"
|
|
305
|
+
else:
|
|
306
|
+
info += " udf_function: None\n"
|
|
307
|
+
|
|
308
|
+
# Display phase information
|
|
309
|
+
if isinstance(self._phase, PipelinePhase):
|
|
310
|
+
info += f" phase: {self._phase.name} ({self._phase.value})\n"
|
|
311
|
+
else:
|
|
312
|
+
info += f" phase: {self._phase}\n"
|
|
313
|
+
|
|
314
|
+
return info
|
|
315
|
+
|
|
316
|
+
def to_dict(self) -> Dict:
|
|
317
|
+
"""
|
|
318
|
+
Convert to a dict for submission to redis
|
|
319
|
+
"""
|
|
320
|
+
task_properties = {}
|
|
321
|
+
|
|
322
|
+
if self._udf_function:
|
|
323
|
+
# Resolve the UDF function specification to function string
|
|
324
|
+
resolved_function = self._resolve_udf_function()
|
|
325
|
+
task_properties["udf_function"] = resolved_function
|
|
326
|
+
|
|
327
|
+
if self._udf_function_name:
|
|
328
|
+
task_properties["udf_function_name"] = self._udf_function_name
|
|
329
|
+
|
|
330
|
+
# Convert phase to integer value for serialization
|
|
331
|
+
if isinstance(self._phase, PipelinePhase):
|
|
332
|
+
task_properties["phase"] = self._phase.value
|
|
333
|
+
else:
|
|
334
|
+
task_properties["phase"] = self._phase
|
|
335
|
+
|
|
336
|
+
# Add new stage targeting parameters
|
|
337
|
+
if self._target_stage:
|
|
338
|
+
task_properties["target_stage"] = self._target_stage
|
|
339
|
+
|
|
340
|
+
task_properties["run_before"] = self._run_before
|
|
341
|
+
task_properties["run_after"] = self._run_after
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
"type": "udf",
|
|
345
|
+
"task_properties": task_properties,
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
def _resolve_udf_function(self):
|
|
349
|
+
"""Resolve UDF function specification to function string."""
|
|
350
|
+
if self._resolved_udf_function is None and self._udf_function:
|
|
351
|
+
self._resolved_udf_function = _resolve_udf_function(self._udf_function)
|
|
352
|
+
return self._resolved_udf_function
|
|
@@ -1,35 +1,33 @@
|
|
|
1
1
|
nv_ingest_client/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
2
|
-
nv_ingest_client/nv_ingest_cli.py,sha256=
|
|
2
|
+
nv_ingest_client/nv_ingest_cli.py,sha256=uonsSDRSKXqUl5meY2u_FMgUjgDCOkDRPDzCpAIIM6I,12966
|
|
3
3
|
nv_ingest_client/cli/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
4
4
|
nv_ingest_client/cli/util/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
5
|
-
nv_ingest_client/cli/util/click.py,sha256=
|
|
5
|
+
nv_ingest_client/cli/util/click.py,sha256=YjQU1uF148FU5D3ozC2m1kkfOOJxO1U8U552-T8PjU4,20029
|
|
6
6
|
nv_ingest_client/cli/util/processing.py,sha256=7mXPjjNjLzWQY7WSxpm6et6ZEZOj0GYhLqvz-jx6MO4,24002
|
|
7
7
|
nv_ingest_client/cli/util/system.py,sha256=AQLq0DD2Ns8jRanrKu1tmVBKPA9rl-F3-ZsGI6FXLqE,1105
|
|
8
|
-
nv_ingest_client/cli/util/tasks.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
9
8
|
nv_ingest_client/client/__init__.py,sha256=eEX9l1qmkLH2lAAZU3eP17SCV06ZjjrshHAB_xbboHA,375
|
|
10
9
|
nv_ingest_client/client/client.py,sha256=wgPeLUByBNcQRkl1FXe7neHNNC5eY2sVve99g5sW41k,65068
|
|
11
|
-
nv_ingest_client/client/interface.py,sha256=
|
|
10
|
+
nv_ingest_client/client/interface.py,sha256=D4kosPM5q-DpeGIe6hKNNrX_p5V9nT6LvCKufkEvYAc,46261
|
|
12
11
|
nv_ingest_client/client/util/processing.py,sha256=MtVRtGnRB8unwTa5b6-LYODx-7kg-RYP3wLmjdqymXw,2195
|
|
13
12
|
nv_ingest_client/primitives/__init__.py,sha256=3rbpLCI7Bl0pntGatAxXD_V01y6dcLhHFheI3wqet-I,269
|
|
14
|
-
nv_ingest_client/primitives/exceptions.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
13
|
nv_ingest_client/primitives/jobs/__init__.py,sha256=-yohgHv3LcCtSleHSaxjv1oO7nNcMCjN3ZYoOkIypIk,469
|
|
16
|
-
nv_ingest_client/primitives/jobs/job_spec.py,sha256=
|
|
14
|
+
nv_ingest_client/primitives/jobs/job_spec.py,sha256=NYT8K31b6p2v0zbIYugcARqJ8DTHpSNf_D1-V6M8YXA,15609
|
|
17
15
|
nv_ingest_client/primitives/jobs/job_state.py,sha256=CEe_oZr4p_MobauWIyhuNrP8y7AUwxhIGBuO7dN-VOQ,5277
|
|
18
|
-
nv_ingest_client/primitives/tasks/__init__.py,sha256=
|
|
19
|
-
nv_ingest_client/primitives/tasks/audio_extraction.py,sha256=
|
|
20
|
-
nv_ingest_client/primitives/tasks/caption.py,sha256=
|
|
21
|
-
nv_ingest_client/primitives/tasks/chart_extraction.py,sha256=
|
|
22
|
-
nv_ingest_client/primitives/tasks/dedup.py,sha256=
|
|
23
|
-
nv_ingest_client/primitives/tasks/embed.py,sha256=
|
|
24
|
-
nv_ingest_client/primitives/tasks/extract.py,sha256=
|
|
25
|
-
nv_ingest_client/primitives/tasks/filter.py,sha256
|
|
26
|
-
nv_ingest_client/primitives/tasks/infographic_extraction.py,sha256=
|
|
27
|
-
nv_ingest_client/primitives/tasks/split.py,sha256=
|
|
28
|
-
nv_ingest_client/primitives/tasks/store.py,sha256=
|
|
16
|
+
nv_ingest_client/primitives/tasks/__init__.py,sha256=D8X4XuwCxk4g_sMSpNRL1XsjVE1eACYaUdEjSanSEfU,1130
|
|
17
|
+
nv_ingest_client/primitives/tasks/audio_extraction.py,sha256=KD5VvaRm6PYelfofZq_-83CbOmupgosokZzFERI5wDA,3559
|
|
18
|
+
nv_ingest_client/primitives/tasks/caption.py,sha256=J8sMIYujPb-ysWj1w3TXPSBLCnhHns_z4tZjzhDOQIs,2130
|
|
19
|
+
nv_ingest_client/primitives/tasks/chart_extraction.py,sha256=s5hsljgSXxQMZHGekpAg6OYJ9k3-DHk5NmFpvtKJ6Zs,1493
|
|
20
|
+
nv_ingest_client/primitives/tasks/dedup.py,sha256=qort6p3t6ZJuK_74sfOOLp3vMT3hkB5DAu3467WenyY,1719
|
|
21
|
+
nv_ingest_client/primitives/tasks/embed.py,sha256=I6Irmvm1Qj9oqzDGSgfykCtfz8pz9LNxiXO-t29nXv8,5916
|
|
22
|
+
nv_ingest_client/primitives/tasks/extract.py,sha256=yJEMGIiquhPlIofE6ERbM-U5tXk-GjZvvnnWOnU7YOA,9335
|
|
23
|
+
nv_ingest_client/primitives/tasks/filter.py,sha256=wjcfSBGhdEyPh2tf42NMcyKZziigm24CO9B4obpQytU,2618
|
|
24
|
+
nv_ingest_client/primitives/tasks/infographic_extraction.py,sha256=SyTjZQbdVA3QwM5yVm4fUzE4Gu4zm4tAfNLDZMvySV8,1537
|
|
25
|
+
nv_ingest_client/primitives/tasks/split.py,sha256=8UkB3EialsOTEbsOZLxzmnDIfTJzC6uvjNv21IbgAVA,2332
|
|
26
|
+
nv_ingest_client/primitives/tasks/store.py,sha256=nIOnCH8vw4FLCLVBJYnsS5Unc0QmuO_jEtUp7-E9FU4,4199
|
|
29
27
|
nv_ingest_client/primitives/tasks/table_extraction.py,sha256=wQIC70ZNFt0DNQ1lxfvyR3Ci8hl5uAymHXTC0p6v0FY,1107
|
|
30
|
-
nv_ingest_client/primitives/tasks/task_base.py,sha256=
|
|
31
|
-
nv_ingest_client/primitives/tasks/task_factory.py,sha256=
|
|
32
|
-
nv_ingest_client/primitives/tasks/
|
|
28
|
+
nv_ingest_client/primitives/tasks/task_base.py,sha256=Mrx6kgePJHolYd3Im6mVISXcVgdulLst2MYG5gPov9I,1687
|
|
29
|
+
nv_ingest_client/primitives/tasks/task_factory.py,sha256=x8FXrhlgRYTxM0rLvsUvM8whLntXsOSWXrBZ196KO5I,2983
|
|
30
|
+
nv_ingest_client/primitives/tasks/udf.py,sha256=5e_WJVgocnK-z0EGCEwPO_zG8WJEhuIsOUTjPmr8REY,12833
|
|
33
31
|
nv_ingest_client/primitives/tasks/vdb_upload.py,sha256=mXOyQJfQfaoN96nntzevd0sKUs60-AHi8lc1jxG3DAw,1765
|
|
34
32
|
nv_ingest_client/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
33
|
nv_ingest_client/util/dataset.py,sha256=b6if_hM15iUJC4rvSHS0cmGBsSuZ3W-NoKDMTulx4b8,3316
|
|
@@ -44,11 +42,11 @@ nv_ingest_client/util/file_processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
44
42
|
nv_ingest_client/util/file_processing/extract.py,sha256=uXEATBYZXjxdymGTNQvvzDD2eHgpuq4PdU6HsMl0Lp0,4662
|
|
45
43
|
nv_ingest_client/util/vdb/__init__.py,sha256=ZmoEzeM9LzwwrVvu_DVUnjRNx-x8ahkNeIrSfSKzbAk,513
|
|
46
44
|
nv_ingest_client/util/vdb/adt_vdb.py,sha256=UubzAMSfyrqqpD-OQErpBs25hC2Mw8zGZ4waenGXPOk,515
|
|
47
|
-
nv_ingest_client/util/vdb/milvus.py,sha256=
|
|
45
|
+
nv_ingest_client/util/vdb/milvus.py,sha256=SIUiW285lDFUXwJjes_58Y3c4pK51SHFqbn0QEqOmm4,75243
|
|
48
46
|
nv_ingest_client/util/vdb/opensearch.py,sha256=I4FzF95VWCOkyzhfm-szdfK1Zd9ugUc8AxxpAdEMWGE,7538
|
|
49
|
-
nv_ingest_client-2025.8.
|
|
50
|
-
nv_ingest_client-2025.8.
|
|
51
|
-
nv_ingest_client-2025.8.
|
|
52
|
-
nv_ingest_client-2025.8.
|
|
53
|
-
nv_ingest_client-2025.8.
|
|
54
|
-
nv_ingest_client-2025.8.
|
|
47
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
48
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/METADATA,sha256=jroQISfHMPBf_mGeiW-zdURvwzZs9m2Md-Er-7k8oDE,30737
|
|
49
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
50
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/entry_points.txt,sha256=3uQVZkTZIjO08_bjTV-g0CDF5H1nrP1zWXU9gJOweuI,137
|
|
51
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/top_level.txt,sha256=1eMhBFD3SiWmpXnod2LM66C1HrSLSk96ninZi5XX-cE,17
|
|
52
|
+
nv_ingest_client-2025.8.15.dev20250815.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|