nv-ingest-api 2025.8.14.dev20250814__py3-none-any.whl → 2025.8.16.dev20250816__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-api might be problematic. Click here for more details.
- nv_ingest_api/internal/enums/common.py +37 -0
- nv_ingest_api/internal/extract/image/image_extractor.py +5 -1
- nv_ingest_api/internal/meta/__init__.py +3 -0
- nv_ingest_api/internal/meta/udf.py +232 -0
- nv_ingest_api/internal/primitives/ingest_control_message.py +63 -22
- nv_ingest_api/internal/primitives/tracing/tagging.py +102 -15
- nv_ingest_api/internal/schemas/meta/ingest_job_schema.py +40 -4
- nv_ingest_api/internal/schemas/meta/udf.py +23 -0
- nv_ingest_api/internal/transform/embed_text.py +5 -0
- nv_ingest_api/util/exception_handlers/decorators.py +104 -156
- nv_ingest_api/util/imports/callable_signatures.py +59 -1
- nv_ingest_api/util/imports/dynamic_resolvers.py +53 -5
- nv_ingest_api/util/introspection/__init__.py +3 -0
- nv_ingest_api/util/introspection/class_inspect.py +145 -0
- nv_ingest_api/util/introspection/function_inspect.py +65 -0
- nv_ingest_api/util/logging/configuration.py +71 -7
- nv_ingest_api/util/string_processing/configuration.py +682 -0
- nv_ingest_api/util/string_processing/yaml.py +45 -0
- nv_ingest_api/util/system/hardware_info.py +178 -13
- {nv_ingest_api-2025.8.14.dev20250814.dist-info → nv_ingest_api-2025.8.16.dev20250816.dist-info}/METADATA +1 -1
- {nv_ingest_api-2025.8.14.dev20250814.dist-info → nv_ingest_api-2025.8.16.dev20250816.dist-info}/RECORD +24 -16
- {nv_ingest_api-2025.8.14.dev20250814.dist-info → nv_ingest_api-2025.8.16.dev20250816.dist-info}/WHEEL +0 -0
- {nv_ingest_api-2025.8.14.dev20250814.dist-info → nv_ingest_api-2025.8.16.dev20250816.dist-info}/licenses/LICENSE +0 -0
- {nv_ingest_api-2025.8.14.dev20250814.dist-info → nv_ingest_api-2025.8.16.dev20250816.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
# This regex finds all forms of environment variables:
|
|
5
|
+
# $VAR, ${VAR}, $VAR|default, and ${VAR|default}
|
|
6
|
+
# It avoids matching escaped variables like $$.
|
|
7
|
+
# Default values can be quoted or unquoted.
|
|
8
|
+
_ENV_VAR_PATTERN = re.compile(
|
|
9
|
+
r"""(?<!\$)\$(?:
|
|
10
|
+
{(?P<braced>\w+)(?:\|(?P<braced_default>[^}]+))?}
|
|
11
|
+
|
|
|
12
|
+
(?P<named>\w+)(?:\|(?P<named_default>"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|\S+))?
|
|
13
|
+
)""",
|
|
14
|
+
re.VERBOSE,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _replacer(match: re.Match) -> str:
|
|
19
|
+
"""Replaces a regex match with the corresponding environment variable."""
|
|
20
|
+
var_name = match.group("braced") or match.group("named")
|
|
21
|
+
default_val = match.group("braced_default") or match.group("named_default")
|
|
22
|
+
|
|
23
|
+
# Get value from environment, or use default.
|
|
24
|
+
value = os.environ.get(var_name, default_val)
|
|
25
|
+
|
|
26
|
+
if value is None:
|
|
27
|
+
return ""
|
|
28
|
+
return value
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def substitute_env_vars_in_yaml_content(raw_content: str) -> str:
|
|
32
|
+
"""
|
|
33
|
+
Substitutes environment variables in a YAML string.
|
|
34
|
+
|
|
35
|
+
This function finds all occurrences of environment variable placeholders
|
|
36
|
+
($VAR, ${VAR}, $VAR|default, ${VAR|default}) in the input string
|
|
37
|
+
and replaces them with their corresponding environment variable values.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
raw_content: The raw string content of a YAML file.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
The YAML string with environment variables substituted.
|
|
44
|
+
"""
|
|
45
|
+
return _ENV_VAR_PATTERN.sub(_replacer, raw_content)
|
|
@@ -16,6 +16,11 @@ CGROUP_V1_CPU_DIR = "/sys/fs/cgroup/cpu"
|
|
|
16
16
|
CGROUP_V1_CPUACCT_DIR = "/sys/fs/cgroup/cpuacct" # Sometimes usage is here
|
|
17
17
|
CGROUP_V2_CPU_FILE = "/sys/fs/cgroup/cpu.max" # Standard path in v2 unified hierarchy
|
|
18
18
|
|
|
19
|
+
# Memory cgroup paths
|
|
20
|
+
CGROUP_V1_MEMORY_DIR = "/sys/fs/cgroup/memory"
|
|
21
|
+
CGROUP_V2_MEMORY_FILE = "/sys/fs/cgroup/memory.max" # v2 unified hierarchy
|
|
22
|
+
CGROUP_V2_MEMORY_CURRENT = "/sys/fs/cgroup/memory.current" # Current usage in v2
|
|
23
|
+
|
|
19
24
|
|
|
20
25
|
class SystemResourceProbe:
|
|
21
26
|
"""
|
|
@@ -70,6 +75,13 @@ class SystemResourceProbe:
|
|
|
70
75
|
self.cgroup_usage_percpu_us: Optional[list[int]] = None
|
|
71
76
|
self.cgroup_usage_total_us: Optional[int] = None
|
|
72
77
|
|
|
78
|
+
# Memory Info
|
|
79
|
+
self.os_total_memory_bytes: Optional[int] = None
|
|
80
|
+
self.cgroup_memory_limit_bytes: Optional[int] = None
|
|
81
|
+
self.cgroup_memory_usage_bytes: Optional[int] = None
|
|
82
|
+
self.effective_memory_bytes: Optional[int] = None
|
|
83
|
+
self.memory_detection_method: str = "unknown"
|
|
84
|
+
|
|
73
85
|
# --- Result ---
|
|
74
86
|
# Raw limit before potential weighting
|
|
75
87
|
self.raw_limit_value: Optional[float] = None
|
|
@@ -134,13 +146,13 @@ class SystemResourceProbe:
|
|
|
134
146
|
|
|
135
147
|
if quota_us > 0 and period_us > 0:
|
|
136
148
|
self.cgroup_quota_cores = quota_us / period_us
|
|
137
|
-
logger.
|
|
149
|
+
logger.debug(
|
|
138
150
|
f"Cgroup v1 quota detected: {quota_us} us / {period_us} us = {self.cgroup_quota_cores:.2f}"
|
|
139
151
|
f" effective cores"
|
|
140
152
|
)
|
|
141
153
|
return True
|
|
142
154
|
elif quota_us == -1:
|
|
143
|
-
logger.
|
|
155
|
+
logger.debug("Cgroup v1 quota detected: Unlimited (-1)")
|
|
144
156
|
# No quota limit, but we know it's cgroup v1
|
|
145
157
|
return True # Return true because we identified the type
|
|
146
158
|
else:
|
|
@@ -149,7 +161,7 @@ class SystemResourceProbe:
|
|
|
149
161
|
elif shares is not None: # If only shares are readable, still note it's v1
|
|
150
162
|
self.cgroup_type = "v1"
|
|
151
163
|
self.cgroup_shares = shares
|
|
152
|
-
logger.
|
|
164
|
+
logger.debug(f"Cgroup v1 shares detected: {shares} (no quota found)")
|
|
153
165
|
return True
|
|
154
166
|
|
|
155
167
|
return False
|
|
@@ -171,13 +183,13 @@ class SystemResourceProbe:
|
|
|
171
183
|
period_us = int(period_str)
|
|
172
184
|
self.cgroup_period_us = period_us
|
|
173
185
|
if quota_str == "max":
|
|
174
|
-
logger.
|
|
186
|
+
logger.debug("Cgroup v2 quota detected: Unlimited ('max')")
|
|
175
187
|
return True # Identified type, no quota limit
|
|
176
188
|
else:
|
|
177
189
|
quota_us = int(quota_str)
|
|
178
190
|
if quota_us > 0 and period_us > 0:
|
|
179
191
|
self.cgroup_quota_cores = quota_us / period_us
|
|
180
|
-
logger.
|
|
192
|
+
logger.debug(
|
|
181
193
|
f"Cgroup v2 quota detected: {quota_us} us / {period_us}"
|
|
182
194
|
f" us = {self.cgroup_quota_cores:.2f} effective cores"
|
|
183
195
|
)
|
|
@@ -204,7 +216,7 @@ class SystemResourceProbe:
|
|
|
204
216
|
affinity = os.sched_getaffinity(0) # 0 for current process
|
|
205
217
|
count = len(affinity)
|
|
206
218
|
if count > 0:
|
|
207
|
-
logger.
|
|
219
|
+
logger.debug(f"Detected {count} cores via os.sched_getaffinity.")
|
|
208
220
|
return count
|
|
209
221
|
else:
|
|
210
222
|
logger.warning("os.sched_getaffinity(0) returned 0 or empty set.")
|
|
@@ -247,9 +259,9 @@ class SystemResourceProbe:
|
|
|
247
259
|
logger.error(f"os.cpu_count() failed: {e}")
|
|
248
260
|
|
|
249
261
|
if logical:
|
|
250
|
-
logger.
|
|
262
|
+
logger.debug(f"Detected {logical} logical cores via {source}.")
|
|
251
263
|
if physical:
|
|
252
|
-
logger.
|
|
264
|
+
logger.debug(f"Detected {physical} physical cores via {source}.")
|
|
253
265
|
|
|
254
266
|
return logical, physical
|
|
255
267
|
|
|
@@ -282,7 +294,7 @@ class SystemResourceProbe:
|
|
|
282
294
|
weighted_cores = (physical_part * 1.0) + (hyperthread_part * self.hyperthread_weight)
|
|
283
295
|
|
|
284
296
|
if weighted_cores != N: # Log only if weighting changes the value
|
|
285
|
-
logger.
|
|
297
|
+
logger.debug(
|
|
286
298
|
f"Applying hyperthread weight ({self.hyperthread_weight:.2f}) to "
|
|
287
299
|
f"logical limit {logical_limit} (System: {P}P/{self.os_logical_cores}L): "
|
|
288
300
|
f"Effective weighted cores = {weighted_cores:.2f}"
|
|
@@ -308,6 +320,137 @@ class SystemResourceProbe:
|
|
|
308
320
|
logger.debug(f"Skipping hyperthread weight calculation for logical limit {logical_limit}.")
|
|
309
321
|
return float(logical_limit) # Return the original limit as float
|
|
310
322
|
|
|
323
|
+
# --- Memory Detection Methods ---
|
|
324
|
+
@staticmethod
|
|
325
|
+
def _get_os_memory() -> Optional[int]:
|
|
326
|
+
"""Gets total system memory in bytes using psutil or /proc/meminfo."""
|
|
327
|
+
# Try psutil first
|
|
328
|
+
if psutil:
|
|
329
|
+
try:
|
|
330
|
+
memory = psutil.virtual_memory()
|
|
331
|
+
total_bytes = memory.total
|
|
332
|
+
if total_bytes and total_bytes > 0:
|
|
333
|
+
logger.debug(f"Detected {total_bytes / (1024**3):.2f} GB system memory via psutil.")
|
|
334
|
+
return total_bytes
|
|
335
|
+
except Exception as e:
|
|
336
|
+
logger.warning(f"psutil.virtual_memory() failed: {e}. Falling back to /proc/meminfo.")
|
|
337
|
+
|
|
338
|
+
# Fallback to /proc/meminfo
|
|
339
|
+
try:
|
|
340
|
+
if os.path.exists("/proc/meminfo"):
|
|
341
|
+
with open("/proc/meminfo", "r") as f:
|
|
342
|
+
for line in f:
|
|
343
|
+
if line.startswith("MemTotal:"):
|
|
344
|
+
# MemTotal is in KB
|
|
345
|
+
parts = line.split()
|
|
346
|
+
if len(parts) >= 2:
|
|
347
|
+
total_kb = int(parts[1])
|
|
348
|
+
total_bytes = total_kb * 1024
|
|
349
|
+
logger.debug(
|
|
350
|
+
f"Detected {total_bytes / (1024**3):.2f} GB system memory via /proc/meminfo."
|
|
351
|
+
)
|
|
352
|
+
return total_bytes
|
|
353
|
+
break
|
|
354
|
+
except (IOError, ValueError, PermissionError) as e:
|
|
355
|
+
logger.warning(f"Failed to read /proc/meminfo: {e}")
|
|
356
|
+
|
|
357
|
+
logger.error("Could not determine system memory from any source.")
|
|
358
|
+
return None
|
|
359
|
+
|
|
360
|
+
def _read_memory_cgroup_v2(self) -> bool:
|
|
361
|
+
"""Attempts to read Cgroup v2 memory limits."""
|
|
362
|
+
if not os.path.exists(CGROUP_V2_MEMORY_FILE):
|
|
363
|
+
logger.debug(f"Cgroup v2 memory.max file not found: {CGROUP_V2_MEMORY_FILE}")
|
|
364
|
+
return False
|
|
365
|
+
|
|
366
|
+
logger.debug(f"Checking Cgroup v2 memory limits in {CGROUP_V2_MEMORY_FILE}")
|
|
367
|
+
content = self._read_file_str(CGROUP_V2_MEMORY_FILE)
|
|
368
|
+
if content:
|
|
369
|
+
try:
|
|
370
|
+
if content == "max":
|
|
371
|
+
logger.debug("Cgroup v2 memory limit: unlimited")
|
|
372
|
+
return True
|
|
373
|
+
else:
|
|
374
|
+
limit_bytes = int(content)
|
|
375
|
+
self.cgroup_memory_limit_bytes = limit_bytes
|
|
376
|
+
logger.debug(f"Cgroup v2 memory limit: {limit_bytes / (1024**3):.2f} GB")
|
|
377
|
+
|
|
378
|
+
# Also try to read current usage
|
|
379
|
+
usage_content = self._read_file_str(CGROUP_V2_MEMORY_CURRENT)
|
|
380
|
+
if usage_content:
|
|
381
|
+
try:
|
|
382
|
+
usage_bytes = int(usage_content)
|
|
383
|
+
self.cgroup_memory_usage_bytes = usage_bytes
|
|
384
|
+
logger.debug(f"Cgroup v2 memory usage: {usage_bytes / (1024**3):.2f} GB")
|
|
385
|
+
except ValueError:
|
|
386
|
+
logger.debug(f"Could not parse memory.current: '{usage_content}'")
|
|
387
|
+
|
|
388
|
+
return True
|
|
389
|
+
except ValueError:
|
|
390
|
+
logger.warning(f"Could not parse Cgroup v2 memory.max content: '{content}'")
|
|
391
|
+
return False
|
|
392
|
+
|
|
393
|
+
def _read_memory_cgroup_v1(self) -> bool:
|
|
394
|
+
"""Attempts to read Cgroup v1 memory limits."""
|
|
395
|
+
if not os.path.exists(CGROUP_V1_MEMORY_DIR):
|
|
396
|
+
logger.debug(f"Cgroup v1 memory dir not found: {CGROUP_V1_MEMORY_DIR}")
|
|
397
|
+
return False
|
|
398
|
+
|
|
399
|
+
logger.debug(f"Checking Cgroup v1 memory limits in {CGROUP_V1_MEMORY_DIR}")
|
|
400
|
+
|
|
401
|
+
# Try memory.limit_in_bytes
|
|
402
|
+
limit_bytes = self._read_file_int(os.path.join(CGROUP_V1_MEMORY_DIR, "memory.limit_in_bytes"))
|
|
403
|
+
usage_bytes = self._read_file_int(os.path.join(CGROUP_V1_MEMORY_DIR, "memory.usage_in_bytes"))
|
|
404
|
+
|
|
405
|
+
if limit_bytes is not None:
|
|
406
|
+
# Cgroup v1 often shows very large values (like 9223372036854775807) for unlimited
|
|
407
|
+
# We consider values >= 2^63-1 or >= system memory * 100 as unlimited
|
|
408
|
+
if limit_bytes >= 9223372036854775807 or (
|
|
409
|
+
self.os_total_memory_bytes and limit_bytes >= self.os_total_memory_bytes * 100
|
|
410
|
+
):
|
|
411
|
+
logger.debug("Cgroup v1 memory limit: unlimited (very large value)")
|
|
412
|
+
return True
|
|
413
|
+
else:
|
|
414
|
+
self.cgroup_memory_limit_bytes = limit_bytes
|
|
415
|
+
logger.debug(f"Cgroup v1 memory limit: {limit_bytes / (1024**3):.2f} GB")
|
|
416
|
+
|
|
417
|
+
if usage_bytes is not None:
|
|
418
|
+
self.cgroup_memory_usage_bytes = usage_bytes
|
|
419
|
+
logger.debug(f"Cgroup v1 memory usage: {usage_bytes / (1024**3):.2f} GB")
|
|
420
|
+
|
|
421
|
+
return True
|
|
422
|
+
|
|
423
|
+
return False
|
|
424
|
+
|
|
425
|
+
def _detect_memory(self):
|
|
426
|
+
"""Performs memory detection sequence."""
|
|
427
|
+
logger.debug("Starting memory detection...")
|
|
428
|
+
|
|
429
|
+
# 1. Get OS level memory first
|
|
430
|
+
self.os_total_memory_bytes = self._get_os_memory()
|
|
431
|
+
|
|
432
|
+
# 2. Try Cgroup v2 memory limits
|
|
433
|
+
cgroup_memory_detected = self._read_memory_cgroup_v2()
|
|
434
|
+
|
|
435
|
+
# 3. Try Cgroup v1 if v2 not found or didn't yield a limit
|
|
436
|
+
if not cgroup_memory_detected or self.cgroup_memory_limit_bytes is None:
|
|
437
|
+
cgroup_memory_detected = self._read_memory_cgroup_v1()
|
|
438
|
+
|
|
439
|
+
# 4. Determine effective memory
|
|
440
|
+
if self.cgroup_memory_limit_bytes is not None and self.os_total_memory_bytes is not None:
|
|
441
|
+
# Use the smaller of cgroup limit and system memory
|
|
442
|
+
self.effective_memory_bytes = min(self.cgroup_memory_limit_bytes, self.os_total_memory_bytes)
|
|
443
|
+
self.memory_detection_method = "cgroup_limited"
|
|
444
|
+
logger.debug(f"Effective memory: {self.effective_memory_bytes / (1024**3):.2f} GB (cgroup limited)")
|
|
445
|
+
elif self.os_total_memory_bytes is not None:
|
|
446
|
+
# No cgroup limit, use system memory
|
|
447
|
+
self.effective_memory_bytes = self.os_total_memory_bytes
|
|
448
|
+
self.memory_detection_method = "system_memory"
|
|
449
|
+
logger.debug(f"Effective memory: {self.effective_memory_bytes / (1024**3):.2f} GB (system memory)")
|
|
450
|
+
else:
|
|
451
|
+
logger.error("Could not determine effective memory limit")
|
|
452
|
+
self.memory_detection_method = "failed"
|
|
453
|
+
|
|
311
454
|
def _detect(self):
|
|
312
455
|
"""Performs the detection sequence and applies weighting."""
|
|
313
456
|
logger.debug("Starting effective core count detection...")
|
|
@@ -325,7 +468,10 @@ class SystemResourceProbe:
|
|
|
325
468
|
# 4. Get OS Affinity
|
|
326
469
|
self.os_sched_affinity_cores = self._get_os_affinity()
|
|
327
470
|
|
|
328
|
-
#
|
|
471
|
+
# 5. Detect Memory
|
|
472
|
+
self._detect_memory()
|
|
473
|
+
|
|
474
|
+
# --- 6. Determine the RAW Limit (before weighting) ---
|
|
329
475
|
raw_limit = float("inf")
|
|
330
476
|
raw_method = "unknown"
|
|
331
477
|
|
|
@@ -361,9 +507,9 @@ class SystemResourceProbe:
|
|
|
361
507
|
|
|
362
508
|
self.raw_limit_value = raw_limit
|
|
363
509
|
self.raw_limit_method = raw_method
|
|
364
|
-
logger.
|
|
510
|
+
logger.debug(f"Raw CPU limit determined: {self.raw_limit_value:.2f} (Method: {self.raw_limit_method})")
|
|
365
511
|
|
|
366
|
-
# ---
|
|
512
|
+
# --- 7. Apply Weighting (if applicable) ---
|
|
367
513
|
final_effective_cores = raw_limit
|
|
368
514
|
final_method = raw_method
|
|
369
515
|
|
|
@@ -394,7 +540,7 @@ class SystemResourceProbe:
|
|
|
394
540
|
self.effective_cores = final_effective_cores
|
|
395
541
|
self.detection_method = final_method # The method for the final value
|
|
396
542
|
|
|
397
|
-
logger.
|
|
543
|
+
logger.debug(
|
|
398
544
|
f"Effective CPU core limit determined: {self.effective_cores:.2f} " f"(Method: {self.detection_method})"
|
|
399
545
|
)
|
|
400
546
|
|
|
@@ -402,6 +548,18 @@ class SystemResourceProbe:
|
|
|
402
548
|
"""Returns the primary result: the effective core limit, potentially weighted."""
|
|
403
549
|
return self.effective_cores
|
|
404
550
|
|
|
551
|
+
@property
|
|
552
|
+
def total_memory_mb(self) -> Optional[float]:
|
|
553
|
+
"""Returns the effective memory limit in megabytes."""
|
|
554
|
+
if self.effective_memory_bytes is not None:
|
|
555
|
+
return self.effective_memory_bytes / (1024 * 1024)
|
|
556
|
+
return None
|
|
557
|
+
|
|
558
|
+
@property
|
|
559
|
+
def cpu_count(self) -> Optional[float]:
|
|
560
|
+
"""Returns the effective CPU count for compatibility."""
|
|
561
|
+
return self.effective_cores
|
|
562
|
+
|
|
405
563
|
def get_details(self) -> Dict[str, Any]:
|
|
406
564
|
"""Returns a dictionary with all detected information."""
|
|
407
565
|
# Calculate full system weighted potential for info
|
|
@@ -426,5 +584,12 @@ class SystemResourceProbe:
|
|
|
426
584
|
"cgroup_shares": self.cgroup_shares,
|
|
427
585
|
"cgroup_usage_total_us": self.cgroup_usage_total_us,
|
|
428
586
|
"cgroup_usage_percpu_us": self.cgroup_usage_percpu_us,
|
|
587
|
+
# Memory information
|
|
588
|
+
"effective_memory_bytes": self.effective_memory_bytes,
|
|
589
|
+
"effective_memory_mb": self.total_memory_mb,
|
|
590
|
+
"memory_detection_method": self.memory_detection_method,
|
|
591
|
+
"os_total_memory_bytes": self.os_total_memory_bytes,
|
|
592
|
+
"cgroup_memory_limit_bytes": self.cgroup_memory_limit_bytes,
|
|
593
|
+
"cgroup_memory_usage_bytes": self.cgroup_memory_usage_bytes,
|
|
429
594
|
"platform": platform.system(),
|
|
430
595
|
}
|
|
@@ -7,7 +7,7 @@ nv_ingest_api/interface/transform.py,sha256=g6YnFR7TpEU0xNtzCvv6kqnFbuCwQ6vRMjjB
|
|
|
7
7
|
nv_ingest_api/interface/utility.py,sha256=AL4l0cJNvTjG1MAe1YNTk1jbbPED3g4HCewzx6Ffcio,7296
|
|
8
8
|
nv_ingest_api/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
nv_ingest_api/internal/enums/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
10
|
-
nv_ingest_api/internal/enums/common.py,sha256=
|
|
10
|
+
nv_ingest_api/internal/enums/common.py,sha256=qD2fEYyvPTmurJZZL7MXOmcgRiK5aCn8EZI4b4yjlB4,13342
|
|
11
11
|
nv_ingest_api/internal/extract/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
|
|
12
12
|
nv_ingest_api/internal/extract/audio/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
13
13
|
nv_ingest_api/internal/extract/audio/audio_extraction.py,sha256=_jf_UC_FTqZr-xEpwG8edwBzdDjM01gGhqm9ulOsDcY,6973
|
|
@@ -21,7 +21,7 @@ nv_ingest_api/internal/extract/html/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQus
|
|
|
21
21
|
nv_ingest_api/internal/extract/html/html_extractor.py,sha256=I9oWfj6_As4898GDDh0zsSuKxO3lBsvyYzhvUotjzJI,3282
|
|
22
22
|
nv_ingest_api/internal/extract/image/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
23
23
|
nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=gk-O-9wjZBoaLVE_6Erb4gMwsSFk4UtPQ2QLpMCW4H4,13212
|
|
24
|
-
nv_ingest_api/internal/extract/image/image_extractor.py,sha256=
|
|
24
|
+
nv_ingest_api/internal/extract/image/image_extractor.py,sha256=gBKjlx28hA_e-dupatu46YQgOHJ0DLpAWxREiLaZLyo,9039
|
|
25
25
|
nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=i7zt_ow1gytU4hK2JCRg7T1wlbokaeuUpXX69LIQkzY,9687
|
|
26
26
|
nv_ingest_api/internal/extract/image/table_extractor.py,sha256=O0m3N2Tz9W6X7TBI4o-rbBXc8dFOf9zSZq1v9qC1U4M,13780
|
|
27
27
|
nv_ingest_api/internal/extract/image/image_helpers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
@@ -40,12 +40,14 @@ nv_ingest_api/internal/extract/pptx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13
|
|
|
40
40
|
nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=o-0P2dDyRFW37uQi_lKk6-eFozTcZvbq-2Y4I0EBMIY,7749
|
|
41
41
|
nv_ingest_api/internal/extract/pptx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
42
|
nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py,sha256=p9-77JoG-ztMBrAFfvveSx94y0OE-Q4oCJfzw2iMVgI,29754
|
|
43
|
+
nv_ingest_api/internal/meta/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
44
|
+
nv_ingest_api/internal/meta/udf.py,sha256=kBBsU5DD1oZZyCMLd6TGh1sHahh9FNkj80wN_L--asU,8620
|
|
43
45
|
nv_ingest_api/internal/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
44
46
|
nv_ingest_api/internal/mutate/deduplicate.py,sha256=hmvTTGevpCtlkM_wVZSoc8-Exr6rUJwqLjoEnbPcPzY,3849
|
|
45
47
|
nv_ingest_api/internal/mutate/filter.py,sha256=H-hOTBVP-zLpvQr-FoGIJKxkhtj4l_sZ9V2Fgu3rTEM,5183
|
|
46
48
|
nv_ingest_api/internal/primitives/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
49
|
nv_ingest_api/internal/primitives/control_message_task.py,sha256=nWVB3QsP6p8BKwHThd-SNv_zwJAEA1mKCRharuju1mc,439
|
|
48
|
-
nv_ingest_api/internal/primitives/ingest_control_message.py,sha256=
|
|
50
|
+
nv_ingest_api/internal/primitives/ingest_control_message.py,sha256=8rA0UbPDSB3avReAKNxiUa_FCy7fIQpqk6tfmcYUibA,9879
|
|
49
51
|
nv_ingest_api/internal/primitives/nim/__init__.py,sha256=i_i_fBR2EcRCh2Y19DF6GM3s_Q0VPgo_thPnhEIJUyg,266
|
|
50
52
|
nv_ingest_api/internal/primitives/nim/default_values.py,sha256=W92XjfyeC6uuVxut6J7p00x1kpNsnXIDb97gSVytZJk,380
|
|
51
53
|
nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=m8_whtmfXFGSw4-Efu938NKG97nzhygyuHB8Tq-a0Ec,16570
|
|
@@ -64,7 +66,7 @@ nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=zpfEZIPctW
|
|
|
64
66
|
nv_ingest_api/internal/primitives/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
67
|
nv_ingest_api/internal/primitives/tracing/latency.py,sha256=5kVTeYRbRdTlT_aI4MeS20N_S7mqCcLqZR6YHtxhXkY,2215
|
|
66
68
|
nv_ingest_api/internal/primitives/tracing/logging.py,sha256=SSzIgS7afLH-e1C7VagYDmkkA6rTXmQ-bmtLjoEguhg,3851
|
|
67
|
-
nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=
|
|
69
|
+
nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=xU534rb94uKnsSu0_DzyZcCSkIpa5SWTMxX7NSA3HoE,11671
|
|
68
70
|
nv_ingest_api/internal/schemas/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
69
71
|
nv_ingest_api/internal/schemas/extract/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
70
72
|
nv_ingest_api/internal/schemas/extract/extract_audio_schema.py,sha256=W-nEBriqiNkjpaQ5AT_8LhtVXlW8AhlcftmoeQQtKAs,3812
|
|
@@ -82,8 +84,9 @@ nv_ingest_api/internal/schemas/message_brokers/request_schema.py,sha256=LZX_wXDx
|
|
|
82
84
|
nv_ingest_api/internal/schemas/message_brokers/response_schema.py,sha256=4b275HlzBSzpmuE2wdoeaGKPCdKki3wuWldtRIfrj8w,727
|
|
83
85
|
nv_ingest_api/internal/schemas/meta/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
84
86
|
nv_ingest_api/internal/schemas/meta/base_model_noext.py,sha256=8hXU1uuiqZ6t8EsoZ8vlC5EFf2zSZrKEX133FcfZMwI,316
|
|
85
|
-
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=
|
|
87
|
+
nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=En7wcLPB6hvfAXx2-xZM49wbJXmRX2Ckc0i6edqn21c,10145
|
|
86
88
|
nv_ingest_api/internal/schemas/meta/metadata_schema.py,sha256=VnAzkSFat_ckI19mlwQTlFrvP6EZVCwyNl9bt51b8oU,7193
|
|
89
|
+
nv_ingest_api/internal/schemas/meta/udf.py,sha256=GgzqbZOlipQgMpDhbXLqbF8xrHenj_hMNqhR_P-1ynw,779
|
|
87
90
|
nv_ingest_api/internal/schemas/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
88
91
|
nv_ingest_api/internal/schemas/mutate/mutate_image_dedup_schema.py,sha256=k1JOdlPPpsipc0XhHf-9YxJ_-W0HvpVE1ZhYmr7fzj0,395
|
|
89
92
|
nv_ingest_api/internal/schemas/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
@@ -99,7 +102,7 @@ nv_ingest_api/internal/store/embed_text_upload.py,sha256=maxb4FPsBvWgvlrjAPEBlRZ
|
|
|
99
102
|
nv_ingest_api/internal/store/image_upload.py,sha256=GNlY4k3pfcHv3lzXxkbmGLeHFsf9PI25bkBn6Xn9h3I,9654
|
|
100
103
|
nv_ingest_api/internal/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
101
104
|
nv_ingest_api/internal/transform/caption_image.py,sha256=0ILCG2F8ESqKtZiPUM-6F1BHUflFZ76Dzi2GNzkE-lU,8517
|
|
102
|
-
nv_ingest_api/internal/transform/embed_text.py,sha256=
|
|
105
|
+
nv_ingest_api/internal/transform/embed_text.py,sha256=AdUXVosBHuZadaFLi9_RVB7vB_hjTziCLUeBZ1oWGZo,20003
|
|
103
106
|
nv_ingest_api/internal/transform/split_text.py,sha256=LAtInGVuydH43UwjNMQWFVC1A6NdhXP_dZup2xX4qEo,7745
|
|
104
107
|
nv_ingest_api/util/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
105
108
|
nv_ingest_api/util/control_message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -115,7 +118,7 @@ nv_ingest_api/util/detectors/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtI
|
|
|
115
118
|
nv_ingest_api/util/detectors/language.py,sha256=TvzcESYY0bn0U4aLY6GjB4VaCWA6XrXxAGZbVzHTMuE,965
|
|
116
119
|
nv_ingest_api/util/exception_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
117
120
|
nv_ingest_api/util/exception_handlers/converters.py,sha256=fX64p5GeoHOPbGccR2JrsKQLa0Ge9Mmi2W-9mLnVVl8,2221
|
|
118
|
-
nv_ingest_api/util/exception_handlers/decorators.py,sha256=
|
|
121
|
+
nv_ingest_api/util/exception_handlers/decorators.py,sha256=bDuazHYDDCTMT7TlyLIzM4iS6eB7O3xlJu3yU04Iw2k,18527
|
|
119
122
|
nv_ingest_api/util/exception_handlers/detectors.py,sha256=Q1O-QOzsShPpNian2lawXVAOCstIE7nSytNw516hTg8,2288
|
|
120
123
|
nv_ingest_api/util/exception_handlers/pdf.py,sha256=FUC41QJKDCfiTv-1c1_8Isxwt1xMxDZw9BN8JLEJKBw,3654
|
|
121
124
|
nv_ingest_api/util/exception_handlers/schemas.py,sha256=NJngVNf9sk5Uz6CFFfkNO_LBAMt2QZUcMYGxX64oYRk,2179
|
|
@@ -125,10 +128,13 @@ nv_ingest_api/util/image_processing/processing.py,sha256=LSoDDEmahr7a-qSS12McVco
|
|
|
125
128
|
nv_ingest_api/util/image_processing/table_and_chart.py,sha256=idCIjiLkY-usI2EARchg3omWLtIYmYA-1tdUUV2lbno,16338
|
|
126
129
|
nv_ingest_api/util/image_processing/transforms.py,sha256=FBcORrvjimn3c1naaVxRMm6PMJ2Dt6Uy9AZRUxdbkR0,23829
|
|
127
130
|
nv_ingest_api/util/imports/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
128
|
-
nv_ingest_api/util/imports/callable_signatures.py,sha256=
|
|
129
|
-
nv_ingest_api/util/imports/dynamic_resolvers.py,sha256=
|
|
131
|
+
nv_ingest_api/util/imports/callable_signatures.py,sha256=ipzXNZJpfu7oeTBrQz2h6zrFVIQaqb2KBpzSuIX3u-Y,4138
|
|
132
|
+
nv_ingest_api/util/imports/dynamic_resolvers.py,sha256=qy7RpmBZrXJarOQl3J7jiCKnbZMNChXTL_Z-H4c9zlc,6170
|
|
133
|
+
nv_ingest_api/util/introspection/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
134
|
+
nv_ingest_api/util/introspection/class_inspect.py,sha256=sEYe37ICHdhXxSbD0JTCDg3J9XIhYwCc2D4ysdT4XK4,5037
|
|
135
|
+
nv_ingest_api/util/introspection/function_inspect.py,sha256=_yCUUT1x3tLCsbXmUpTv_O8Qi6af4NiCpJ1qGfcksvw,2066
|
|
130
136
|
nv_ingest_api/util/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
131
|
-
nv_ingest_api/util/logging/configuration.py,sha256=
|
|
137
|
+
nv_ingest_api/util/logging/configuration.py,sha256=05KR3LOS-PCqU-Io__iiKG_Ds730eKxciklFfNeId3w,3126
|
|
132
138
|
nv_ingest_api/util/message_brokers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
|
|
133
139
|
nv_ingest_api/util/message_brokers/simple_message_broker/__init__.py,sha256=WaQ3CWIpIKWEivT5kL-bkmzcSQKLGFNFHdXHUJjqZFs,325
|
|
134
140
|
nv_ingest_api/util/message_brokers/simple_message_broker/broker.py,sha256=PekxaxVcAa9k1wgUtozlr04SW3sAeqYJE-wdVBZf9eo,17264
|
|
@@ -151,10 +157,12 @@ nv_ingest_api/util/service_clients/redis/redis_client.py,sha256=3NLecvIvVN1v-sA7
|
|
|
151
157
|
nv_ingest_api/util/service_clients/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
152
158
|
nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=dZ-jrk7IK7oNtHoXFSNTf7psoOpLREiLN5ezpHFW0HI,21732
|
|
153
159
|
nv_ingest_api/util/string_processing/__init__.py,sha256=mkwHthyS-IILcLcL1tJYeF6mpqX3pxEw5aUzDGjTSeU,1411
|
|
160
|
+
nv_ingest_api/util/string_processing/configuration.py,sha256=2HS08msccuPCT0fn_jfXRo9_M6hCZ59OxKLxG_47HRY,29888
|
|
161
|
+
nv_ingest_api/util/string_processing/yaml.py,sha256=6SW2O6wbXRhGbhETMbtXjYCZn53HeCNOP6a96AaxlHs,1454
|
|
154
162
|
nv_ingest_api/util/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
|
-
nv_ingest_api/util/system/hardware_info.py,sha256=
|
|
156
|
-
nv_ingest_api-2025.8.
|
|
157
|
-
nv_ingest_api-2025.8.
|
|
158
|
-
nv_ingest_api-2025.8.
|
|
159
|
-
nv_ingest_api-2025.8.
|
|
160
|
-
nv_ingest_api-2025.8.
|
|
163
|
+
nv_ingest_api/util/system/hardware_info.py,sha256=1UFM8XE6M3pgQcpbVsCsqDQ7Dj-zzptL-XRE-DEu9UA,27213
|
|
164
|
+
nv_ingest_api-2025.8.16.dev20250816.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
165
|
+
nv_ingest_api-2025.8.16.dev20250816.dist-info/METADATA,sha256=i8zdn2_kHXVUBq5VBK3skgNS6494ZHb9Dxmp8vY01qo,13947
|
|
166
|
+
nv_ingest_api-2025.8.16.dev20250816.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
167
|
+
nv_ingest_api-2025.8.16.dev20250816.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
|
|
168
|
+
nv_ingest_api-2025.8.16.dev20250816.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|