nv-ingest-api 25.4.2__py3-none-any.whl → 25.6.0__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.

Files changed (46) hide show
  1. nv_ingest_api/internal/extract/docx/docx_extractor.py +3 -3
  2. nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docxreader.py +142 -86
  3. nv_ingest_api/internal/extract/html/__init__.py +3 -0
  4. nv_ingest_api/internal/extract/html/html_extractor.py +84 -0
  5. nv_ingest_api/internal/extract/image/chart_extractor.py +3 -3
  6. nv_ingest_api/internal/extract/image/image_extractor.py +5 -5
  7. nv_ingest_api/internal/extract/image/image_helpers/common.py +1 -1
  8. nv_ingest_api/internal/extract/image/infographic_extractor.py +1 -1
  9. nv_ingest_api/internal/extract/image/table_extractor.py +2 -2
  10. nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py +2 -2
  11. nv_ingest_api/internal/extract/pdf/engines/pdfium.py +1 -1
  12. nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py +213 -187
  13. nv_ingest_api/internal/extract/pptx/pptx_extractor.py +6 -9
  14. nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py +35 -38
  15. nv_ingest_api/internal/primitives/nim/model_interface/yolox.py +7 -1
  16. nv_ingest_api/internal/primitives/nim/nim_client.py +17 -9
  17. nv_ingest_api/internal/primitives/tracing/tagging.py +20 -16
  18. nv_ingest_api/internal/schemas/extract/extract_chart_schema.py +1 -1
  19. nv_ingest_api/internal/schemas/extract/extract_html_schema.py +34 -0
  20. nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py +1 -1
  21. nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py +1 -1
  22. nv_ingest_api/internal/schemas/extract/extract_table_schema.py +1 -1
  23. nv_ingest_api/internal/schemas/message_brokers/message_broker_client_schema.py +26 -12
  24. nv_ingest_api/internal/schemas/meta/ingest_job_schema.py +34 -23
  25. nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py +11 -10
  26. nv_ingest_api/internal/schemas/transform/transform_text_splitter_schema.py +9 -7
  27. nv_ingest_api/internal/store/image_upload.py +1 -0
  28. nv_ingest_api/internal/transform/embed_text.py +75 -52
  29. nv_ingest_api/internal/transform/split_text.py +9 -3
  30. nv_ingest_api/util/__init__.py +3 -0
  31. nv_ingest_api/util/exception_handlers/converters.py +1 -1
  32. nv_ingest_api/util/exception_handlers/decorators.py +309 -51
  33. nv_ingest_api/util/image_processing/processing.py +1 -1
  34. nv_ingest_api/util/logging/configuration.py +15 -8
  35. nv_ingest_api/util/pdf/pdfium.py +2 -2
  36. nv_ingest_api/util/schema/__init__.py +3 -0
  37. nv_ingest_api/util/service_clients/redis/__init__.py +3 -0
  38. nv_ingest_api/util/service_clients/redis/redis_client.py +1 -1
  39. nv_ingest_api/util/service_clients/rest/rest_client.py +2 -2
  40. nv_ingest_api/util/system/__init__.py +0 -0
  41. nv_ingest_api/util/system/hardware_info.py +430 -0
  42. {nv_ingest_api-25.4.2.dist-info → nv_ingest_api-25.6.0.dist-info}/METADATA +2 -1
  43. {nv_ingest_api-25.4.2.dist-info → nv_ingest_api-25.6.0.dist-info}/RECORD +46 -41
  44. {nv_ingest_api-25.4.2.dist-info → nv_ingest_api-25.6.0.dist-info}/WHEEL +1 -1
  45. {nv_ingest_api-25.4.2.dist-info → nv_ingest_api-25.6.0.dist-info}/licenses/LICENSE +0 -0
  46. {nv_ingest_api-25.4.2.dist-info → nv_ingest_api-25.6.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,430 @@
1
+ import logging
2
+ import os
3
+ import platform
4
+ from typing import Optional, Dict, Any, Tuple
5
+
6
+ # Try importing psutil, but don't make it a hard requirement if only cgroups are needed
7
+ try:
8
+ import psutil
9
+ except ImportError:
10
+ psutil = None
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ # --- Cgroup Constants ---
15
+ CGROUP_V1_CPU_DIR = "/sys/fs/cgroup/cpu"
16
+ CGROUP_V1_CPUACCT_DIR = "/sys/fs/cgroup/cpuacct" # Sometimes usage is here
17
+ CGROUP_V2_CPU_FILE = "/sys/fs/cgroup/cpu.max" # Standard path in v2 unified hierarchy
18
+
19
+
20
+ class SystemResourceProbe:
21
+ """
22
+ Detects the effective CPU core count available to the current process,
23
+ optionally applying a weighting factor for hyperthreads (SMT).
24
+
25
+ It attempts to reconcile information from:
26
+ 1. Linux Cgroup v2 CPU limits (cpu.max)
27
+ 2. Linux Cgroup v1 CPU limits (cpu.cfs_quota_us, cpu.cfs_period_us)
28
+ 3. OS scheduler affinity (os.sched_getaffinity)
29
+ 4. OS reported CPU counts (psutil.cpu_count for logical/physical)
30
+
31
+ Prioritizes Cgroup quota limits. If the limit is based on core count
32
+ (affinity/OS), it applies hyperthreading weight if psutil provides
33
+ physical/logical counts.
34
+ """
35
+
36
+ def __init__(self, hyperthread_weight: float = 0.75):
37
+ """
38
+ Initializes the detector and performs the detection.
39
+
40
+ Parameters
41
+ ----------
42
+ hyperthread_weight : float, optional
43
+ The performance weighting factor for hyperthreads (0.0 to 1.0).
44
+ A value of 1.0 treats hyperthreads the same as physical cores.
45
+ A value of 0.5 suggests a hyperthread adds 50% extra performance.
46
+ Requires psutil to be installed and report physical cores.
47
+ Defaults to 0.75.
48
+
49
+ Note: the default value of 0.75 is a heuristic and may not be optimal
50
+ for all situations. It is where parallel pdf decomposition efficiency
51
+ is observed to begin rolling off.
52
+ """
53
+ if not (0.0 <= hyperthread_weight <= 1.0):
54
+ raise ValueError("hyperthread_weight must be between 0.0 and 1.0")
55
+
56
+ self.hyperthread_weight: float = hyperthread_weight if psutil else 1.0 # Force 1.0 if psutil missing
57
+ if not psutil and hyperthread_weight != 1.0:
58
+ logger.warning("psutil not found. Hyperthreading weight ignored (effectively 1.0).")
59
+
60
+ # OS Info
61
+ self.os_logical_cores: Optional[int] = None
62
+ self.os_physical_cores: Optional[int] = None
63
+ self.os_sched_affinity_cores: Optional[int] = None
64
+
65
+ # Cgroup Info
66
+ self.cgroup_type: Optional[str] = None
67
+ self.cgroup_quota_cores: Optional[float] = None
68
+ self.cgroup_period_us: Optional[int] = None
69
+ self.cgroup_shares: Optional[int] = None
70
+ self.cgroup_usage_percpu_us: Optional[list[int]] = None
71
+ self.cgroup_usage_total_us: Optional[int] = None
72
+
73
+ # --- Result ---
74
+ # Raw limit before potential weighting
75
+ self.raw_limit_value: Optional[float] = None
76
+ self.raw_limit_method: str = "unknown"
77
+ # Final potentially weighted result
78
+ self.effective_cores: Optional[float] = None
79
+ self.detection_method: str = "unknown" # Method for the final effective_cores
80
+
81
+ self._detect()
82
+
83
+ @staticmethod
84
+ def _read_file_int(path: str) -> Optional[int]:
85
+ """Safely reads an integer from a file."""
86
+ try:
87
+ if os.path.exists(path):
88
+ with open(path, "r") as f:
89
+ content = f.read().strip()
90
+ if content:
91
+ return int(content)
92
+ except (IOError, ValueError, PermissionError) as e:
93
+ logger.debug(f"Failed to read or parse int from {path}: {e}")
94
+ return None
95
+
96
+ @staticmethod
97
+ def _read_file_str(path: str) -> Optional[str]:
98
+ """Safely reads a string from a file."""
99
+ try:
100
+ if os.path.exists(path):
101
+ with open(path, "r") as f:
102
+ return f.read().strip()
103
+ except (IOError, PermissionError) as e:
104
+ logger.debug(f"Failed to read string from {path}: {e}")
105
+ return None
106
+
107
+ def _read_cgroup_v1(self) -> bool:
108
+ """Attempts to read Cgroup v1 CPU limits."""
109
+ if not os.path.exists(CGROUP_V1_CPU_DIR):
110
+ logger.debug(f"Cgroup v1 CPU dir not found: {CGROUP_V1_CPU_DIR}")
111
+ return False
112
+
113
+ logger.debug(f"Checking Cgroup v1 limits in {CGROUP_V1_CPU_DIR}")
114
+ quota_us = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.cfs_quota_us"))
115
+ period_us = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.cfs_period_us"))
116
+ shares = self._read_file_int(os.path.join(CGROUP_V1_CPU_DIR, "cpu.shares"))
117
+
118
+ # Check cpuacct for usage stats if dir exists
119
+ if os.path.exists(CGROUP_V1_CPUACCT_DIR):
120
+ usage_total = self._read_file_int(os.path.join(CGROUP_V1_CPUACCT_DIR, "cpuacct.usage"))
121
+ usage_percpu_str = self._read_file_str(os.path.join(CGROUP_V1_CPUACCT_DIR, "cpuacct.usage_percpu"))
122
+ if usage_percpu_str:
123
+ try:
124
+ self.cgroup_usage_percpu_us = [int(x) for x in usage_percpu_str.split()]
125
+ except ValueError:
126
+ logger.warning("Could not parse cpuacct.usage_percpu")
127
+ if usage_total is not None:
128
+ self.cgroup_usage_total_us = usage_total
129
+
130
+ if quota_us is not None and period_us is not None:
131
+ self.cgroup_type = "v1"
132
+ self.cgroup_period_us = period_us
133
+ self.cgroup_shares = shares # May be None if file doesn't exist/readable
134
+
135
+ if quota_us > 0 and period_us > 0:
136
+ self.cgroup_quota_cores = quota_us / period_us
137
+ logger.info(
138
+ f"Cgroup v1 quota detected: {quota_us} us / {period_us} us = {self.cgroup_quota_cores:.2f}"
139
+ f" effective cores"
140
+ )
141
+ return True
142
+ elif quota_us == -1:
143
+ logger.info("Cgroup v1 quota detected: Unlimited (-1)")
144
+ # No quota limit, but we know it's cgroup v1
145
+ return True # Return true because we identified the type
146
+ else:
147
+ logger.warning(f"Cgroup v1 quota/period values invalid? Quota: {quota_us}, Period: {period_us}")
148
+
149
+ elif shares is not None: # If only shares are readable, still note it's v1
150
+ self.cgroup_type = "v1"
151
+ self.cgroup_shares = shares
152
+ logger.info(f"Cgroup v1 shares detected: {shares} (no quota found)")
153
+ return True
154
+
155
+ return False
156
+
157
+ def _read_cgroup_v2(self) -> bool:
158
+ """Attempts to read Cgroup v2 CPU limits."""
159
+ if not os.path.exists(CGROUP_V2_CPU_FILE):
160
+ logger.debug(f"Cgroup v2 cpu.max file not found: {CGROUP_V2_CPU_FILE}")
161
+ return False
162
+
163
+ logger.debug(f"Checking Cgroup v2 limits in {CGROUP_V2_CPU_FILE}")
164
+ content = self._read_file_str(CGROUP_V2_CPU_FILE)
165
+ if content:
166
+ self.cgroup_type = "v2"
167
+ parts = content.split()
168
+ if len(parts) == 2:
169
+ quota_str, period_str = parts
170
+ try:
171
+ period_us = int(period_str)
172
+ self.cgroup_period_us = period_us
173
+ if quota_str == "max":
174
+ logger.info("Cgroup v2 quota detected: Unlimited ('max')")
175
+ return True # Identified type, no quota limit
176
+ else:
177
+ quota_us = int(quota_str)
178
+ if quota_us > 0 and period_us > 0:
179
+ self.cgroup_quota_cores = quota_us / period_us
180
+ logger.info(
181
+ f"Cgroup v2 quota detected: {quota_us} us / {period_us}"
182
+ f" us = {self.cgroup_quota_cores:.2f} effective cores"
183
+ )
184
+ return True
185
+ else:
186
+ logger.warning(
187
+ f"Cgroup v2 quota/period values invalid? Quota: {quota_us}, Period: {period_us}"
188
+ )
189
+
190
+ except ValueError:
191
+ logger.warning(f"Could not parse Cgroup v2 cpu.max content: '{content}'")
192
+ else:
193
+ logger.warning(f"Unexpected format in Cgroup v2 cpu.max: '{content}'")
194
+ return False
195
+
196
+ @staticmethod
197
+ def _get_os_affinity() -> Optional[int]:
198
+ """Gets CPU count via os.sched_getaffinity."""
199
+ if platform.system() != "Linux":
200
+ logger.debug("os.sched_getaffinity is Linux-specific.")
201
+ return None
202
+ try:
203
+ # sched_getaffinity exists on Linux
204
+ affinity = os.sched_getaffinity(0) # 0 for current process
205
+ count = len(affinity)
206
+ if count > 0:
207
+ logger.info(f"Detected {count} cores via os.sched_getaffinity.")
208
+ return count
209
+ else:
210
+ logger.warning("os.sched_getaffinity(0) returned 0 or empty set.")
211
+ return None
212
+ except AttributeError:
213
+ logger.debug("os.sched_getaffinity not available on this platform/Python version.")
214
+ return None
215
+ except OSError as e:
216
+ logger.warning(f"Could not get affinity: {e}")
217
+ return None
218
+
219
+ @staticmethod
220
+ def _get_os_cpu_counts() -> Tuple[Optional[int], Optional[int]]:
221
+ """Gets logical and physical CPU counts using psutil or os.cpu_count."""
222
+ logical = None
223
+ physical = None
224
+ source = "unknown"
225
+
226
+ if psutil:
227
+ try:
228
+ logical = psutil.cpu_count(logical=True)
229
+ physical = psutil.cpu_count(logical=False)
230
+ source = "psutil"
231
+ if not logical:
232
+ logical = None # Ensure None if psutil returns 0/None
233
+ if not physical:
234
+ physical = None
235
+ except Exception as e:
236
+ logger.warning(f"psutil.cpu_count failed: {e}. Falling back to os.cpu_count.")
237
+ logical, physical = None, None # Reset before fallback
238
+
239
+ if logical is None: # Fallback if psutil failed or not installed
240
+ try:
241
+ logical = os.cpu_count()
242
+ source = "os.cpu_count"
243
+ # os.cpu_count doesn't usually provide physical count, leave as None
244
+ except NotImplementedError:
245
+ logger.error("os.cpu_count() is not implemented on this system.")
246
+ except Exception as e:
247
+ logger.error(f"os.cpu_count() failed: {e}")
248
+
249
+ if logical:
250
+ logger.info(f"Detected {logical} logical cores via {source}.")
251
+ if physical:
252
+ logger.info(f"Detected {physical} physical cores via {source}.")
253
+
254
+ return logical, physical
255
+
256
+ # --- Weighting Function ---
257
+ def _apply_hyperthread_weight(self, logical_limit: int) -> float:
258
+ """
259
+ Applies hyperthreading weight to an integer logical core limit.
260
+
261
+ Parameters
262
+ ----------
263
+ logical_limit : int
264
+ The maximum number of logical cores allowed (e.g., from affinity or OS count).
265
+
266
+ Returns
267
+ -------
268
+ float
269
+ The estimated effective core performance based on weighting.
270
+ Returns logical_limit if weighting cannot be applied.
271
+ """
272
+ P = self.os_physical_cores
273
+ # Weighting requires knowing both physical and logical counts
274
+ if P is not None and P > 0 and self.os_logical_cores is not None:
275
+ # Apply the heuristic: P physical cores + (N-P) hyperthreads * weight
276
+ # Ensure N is capped by the actual number of logical cores available
277
+ N = min(logical_limit, self.os_logical_cores)
278
+
279
+ physical_part = min(N, P)
280
+ hyperthread_part = max(0, N - P)
281
+
282
+ weighted_cores = (physical_part * 1.0) + (hyperthread_part * self.hyperthread_weight)
283
+
284
+ if weighted_cores != N: # Log only if weighting changes the value
285
+ logger.info(
286
+ f"Applying hyperthread weight ({self.hyperthread_weight:.2f}) to "
287
+ f"logical limit {logical_limit} (System: {P}P/{self.os_logical_cores}L): "
288
+ f"Effective weighted cores = {weighted_cores:.2f}"
289
+ )
290
+ else:
291
+ logger.debug(
292
+ f"Hyperthread weighting ({self.hyperthread_weight:.2f}) applied to "
293
+ f"logical limit {logical_limit} (System: {P}P/{self.os_logical_cores}L), "
294
+ f"but result is still {weighted_cores:.2f} (e.g., limit <= physical or weight=1.0)"
295
+ )
296
+ return weighted_cores
297
+ else:
298
+ # Cannot apply weighting
299
+ if self.hyperthread_weight != 1.0: # Only warn if weighting was requested
300
+ if not psutil:
301
+ # Already warned about missing psutil during init
302
+ pass
303
+ elif P is None:
304
+ logger.warning("Cannot apply hyperthread weight: Physical core count not available.")
305
+ else: # L must be missing
306
+ logger.warning("Cannot apply hyperthread weight: Logical core count not available.")
307
+
308
+ logger.debug(f"Skipping hyperthread weight calculation for logical limit {logical_limit}.")
309
+ return float(logical_limit) # Return the original limit as float
310
+
311
+ def _detect(self):
312
+ """Performs the detection sequence and applies weighting."""
313
+ logger.debug("Starting effective core count detection...")
314
+
315
+ # 1. Get OS level counts first
316
+ self.os_logical_cores, self.os_physical_cores = self._get_os_cpu_counts()
317
+
318
+ # 2. Try Cgroup v2
319
+ cgroup_detected = self._read_cgroup_v2()
320
+
321
+ # 3. Try Cgroup v1 if v2 not found or didn't yield quota
322
+ if not cgroup_detected or (self.cgroup_type == "v2" and self.cgroup_quota_cores is None):
323
+ cgroup_detected = self._read_cgroup_v1()
324
+
325
+ # 4. Get OS Affinity
326
+ self.os_sched_affinity_cores = self._get_os_affinity()
327
+
328
+ # --- 5. Determine the RAW Limit (before weighting) ---
329
+ raw_limit = float("inf")
330
+ raw_method = "unknown"
331
+
332
+ # Priority 1: Cgroup Quota
333
+ if self.cgroup_quota_cores is not None and self.cgroup_quota_cores > 0:
334
+ raw_limit = min(raw_limit, self.cgroup_quota_cores)
335
+ raw_method = f"cgroup_{self.cgroup_type}_quota"
336
+ logger.debug(f"Raw limit set by Cgroup Quota: {self.cgroup_quota_cores:.2f}")
337
+
338
+ # Priority 2: Scheduler Affinity
339
+ if self.os_sched_affinity_cores is not None and self.os_sched_affinity_cores > 0:
340
+ affinity_limit = float(self.os_sched_affinity_cores)
341
+ if affinity_limit < raw_limit:
342
+ raw_limit = affinity_limit
343
+ raw_method = "sched_affinity"
344
+ logger.debug(f"Raw limit updated by Sched Affinity: {affinity_limit}")
345
+ elif raw_method.startswith("cgroup"):
346
+ logger.debug(
347
+ f"Sched Affinity limit ({affinity_limit}) not stricter than Cgroup Quota ({raw_limit:.2f})."
348
+ )
349
+
350
+ # Priority 3: OS Logical Cores
351
+ if raw_limit == float("inf"): # If no cgroup quota or affinity was found/applied
352
+ if self.os_logical_cores is not None and self.os_logical_cores > 0:
353
+ raw_limit = float(self.os_logical_cores)
354
+ raw_method = "os_logical_count"
355
+ logger.debug(f"Raw limit set by OS Logical Core count: {self.os_logical_cores}")
356
+ else:
357
+ # Absolute fallback
358
+ logger.warning("Could not determine any CPU core limit. Defaulting raw limit to 1.0.")
359
+ raw_limit = 1.0
360
+ raw_method = "fallback_default"
361
+
362
+ self.raw_limit_value = raw_limit
363
+ self.raw_limit_method = raw_method
364
+ logger.info(f"Raw CPU limit determined: {self.raw_limit_value:.2f} (Method: {self.raw_limit_method})")
365
+
366
+ # --- 6. Apply Weighting (if applicable) ---
367
+ final_effective_cores = raw_limit
368
+ final_method = raw_method
369
+
370
+ # Apply weighting ONLY if the raw limit is NOT from a cgroup quota
371
+ # AND the limit is an integer (or effectively integer) core count
372
+ if not raw_method.startswith("cgroup_"):
373
+ # Check if raw_limit is effectively an integer
374
+ if abs(raw_limit - round(raw_limit)) < 1e-9 and raw_limit > 0:
375
+ logical_limit_int = int(round(raw_limit))
376
+ weighted_value = self._apply_hyperthread_weight(logical_limit_int)
377
+ final_effective_cores = weighted_value
378
+ # Update method if weighting was actually applied and changed the value
379
+ if abs(weighted_value - raw_limit) > 1e-9:
380
+ final_method = f"{raw_method}_weighted"
381
+ else:
382
+ # Keep original method name if weighting didn't change result
383
+ final_method = raw_method
384
+
385
+ else: # Raw limit was affinity/os count but not an integer? Should be rare.
386
+ logger.debug(
387
+ f"Raw limit method '{raw_method}' is not cgroup quota, "
388
+ f"but value {raw_limit:.2f} is not integer. Skipping weighting."
389
+ )
390
+
391
+ elif raw_method.startswith("cgroup_"):
392
+ logger.debug("Raw limit is from Cgroup quota. Using quota value directly (skipping SMT weighting).")
393
+
394
+ self.effective_cores = final_effective_cores
395
+ self.detection_method = final_method # The method for the final value
396
+
397
+ logger.info(
398
+ f"Effective CPU core limit determined: {self.effective_cores:.2f} " f"(Method: {self.detection_method})"
399
+ )
400
+
401
+ def get_effective_cores(self) -> Optional[float]:
402
+ """Returns the primary result: the effective core limit, potentially weighted."""
403
+ return self.effective_cores
404
+
405
+ def get_details(self) -> Dict[str, Any]:
406
+ """Returns a dictionary with all detected information."""
407
+ # Calculate full system weighted potential for info
408
+ os_weighted_cores = None
409
+ if self.os_physical_cores and self.os_logical_cores:
410
+ # Use weighting func with the total logical cores as the limit
411
+ os_weighted_cores = self._apply_hyperthread_weight(self.os_logical_cores)
412
+
413
+ return {
414
+ "effective_cores": self.effective_cores,
415
+ "detection_method": self.detection_method,
416
+ "raw_limit_value": self.raw_limit_value,
417
+ "raw_limit_method": self.raw_limit_method,
418
+ "hyperthread_weight_applied": self.hyperthread_weight,
419
+ "os_logical_cores": self.os_logical_cores,
420
+ "os_physical_cores": self.os_physical_cores,
421
+ "os_weighted_potential": os_weighted_cores, # Full system potential weighted
422
+ "os_sched_affinity_cores": self.os_sched_affinity_cores,
423
+ "cgroup_type": self.cgroup_type,
424
+ "cgroup_quota_cores": self.cgroup_quota_cores,
425
+ "cgroup_period_us": self.cgroup_period_us,
426
+ "cgroup_shares": self.cgroup_shares,
427
+ "cgroup_usage_total_us": self.cgroup_usage_total_us,
428
+ "cgroup_usage_percpu_us": self.cgroup_usage_percpu_us,
429
+ "platform": platform.system(),
430
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nv-ingest-api
3
- Version: 25.4.2
3
+ Version: 25.6.0
4
4
  Summary: Python module with core document ingestion functions.
5
5
  Author-email: Jeremy Dyer <jdyer@nvidia.com>
6
6
  License: Apache License
@@ -213,6 +213,7 @@ Classifier: License :: OSI Approved :: MIT License
213
213
  Classifier: Operating System :: OS Independent
214
214
  Description-Content-Type: text/markdown
215
215
  License-File: LICENSE
216
+ Requires-Dist: backoff==2.2.1
216
217
  Requires-Dist: pandas>=2.0
217
218
  Requires-Dist: pydantic>2.0.0
218
219
  Requires-Dist: pydantic-settings>2.0.0
@@ -12,32 +12,34 @@ nv_ingest_api/internal/extract/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTf
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=L8cK7xB6QTaSx8gsrdyaYHYh0HpW6lycGfduCk7XSMg,5364
14
14
  nv_ingest_api/internal/extract/docx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
15
- nv_ingest_api/internal/extract/docx/docx_extractor.py,sha256=lzZPSa-oHBmLk7ynop5aOLM2rVbYAbzSkPqVlAuT8RE,8319
15
+ nv_ingest_api/internal/extract/docx/docx_extractor.py,sha256=jjbL12F5dtpbqHRbhL0uomSiQ90bcQq3N7M43XYsq34,8356
16
16
  nv_ingest_api/internal/extract/docx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
18
18
  nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docx_helper.py,sha256=1wkciAxu8lz9WuPuoleJFy2s09ieSzXl1S71F9r0BWA,4385
19
- nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docxreader.py,sha256=CM2yV8lfEw1F1ORAjupD4gyIKX0PDDJrL3nsZ5Mnrgg,31539
19
+ nv_ingest_api/internal/extract/docx/engines/docxreader_helpers/docxreader.py,sha256=FOZZBD9gRRAr93qgK_L6o9xVBYD-6EE5-xI2-cWKvzo,33713
20
+ nv_ingest_api/internal/extract/html/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
21
+ nv_ingest_api/internal/extract/html/html_extractor.py,sha256=I9oWfj6_As4898GDDh0zsSuKxO3lBsvyYzhvUotjzJI,3282
20
22
  nv_ingest_api/internal/extract/image/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
21
- nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=Jy_fNmDbZcdni55Fq7vT6NdbYnCyGoyw0J7QjpK-KPc,13315
22
- nv_ingest_api/internal/extract/image/image_extractor.py,sha256=ocLvlVMzO9CQvduxbjupOeKxnt2aq1_CzJCqcdD-loo,8783
23
- nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=k4Z6JwsoNKsyfmpaQkN_dxJpAv9-RVsRL1BfSWUtXTM,8908
24
- nv_ingest_api/internal/extract/image/table_extractor.py,sha256=80FQef4Dsn6__MNIRCQzFf32s4wUyTOzBFgmA84JZJk,13133
23
+ nv_ingest_api/internal/extract/image/chart_extractor.py,sha256=CkaW8ihPmGMQGrZh0ih14gtEpWuGOJ8InPQfZwpsP2g,13300
24
+ nv_ingest_api/internal/extract/image/image_extractor.py,sha256=4tUWinuFMN3ukWa2tZa2_LtzRiTyUAUCBF6BDkUEvm0,8705
25
+ nv_ingest_api/internal/extract/image/infographic_extractor.py,sha256=yc9b2q_Ea08CEVclZ47UkpU4F7qlakPuU3UV9P013W0,8903
26
+ nv_ingest_api/internal/extract/image/table_extractor.py,sha256=ivHaJxYjeHvFM1PZIpxVabPadxtcTsu51j398ZjMhD4,13123
25
27
  nv_ingest_api/internal/extract/image/image_helpers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
26
- nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=NU8TEU9p2aIL_KppyhtTgRUPqD4MsanxATG19rKhGjw,15032
28
+ nv_ingest_api/internal/extract/image/image_helpers/common.py,sha256=P8rcl4YPyeWeMJg7u1yejD3k9EnDVEbJgfYEnJ4WO5c,15025
27
29
  nv_ingest_api/internal/extract/pdf/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
28
30
  nv_ingest_api/internal/extract/pdf/pdf_extractor.py,sha256=CxtWaD6mql9MEqSdk2CfSQ9T-Bn87beBkCOuGGjxGt8,2934
29
31
  nv_ingest_api/internal/extract/pdf/engines/__init__.py,sha256=u4GnAZmDKRl0RwYGIRiozIRw70Kybw3A72-lcKFeoTI,582
30
32
  nv_ingest_api/internal/extract/pdf/engines/adobe.py,sha256=VT0dEqkU-y2uGkaCqxtKYov_Q8R1028UQVBchgMLca4,17466
31
33
  nv_ingest_api/internal/extract/pdf/engines/llama.py,sha256=PpKTqS8jGHBV6mKLGZWwjpfT8ga6Fy8ffrvL-gPAf2c,8182
32
- nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=F8hZdqYRr0CTNeIRJIG6H__CCh_3GWQ4_ySCM0WPLPU,22913
33
- nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=jUcquCWbyQPNCHZLaV-XnVqUFsajX4YxVFCiWWwD4QQ,22367
34
+ nv_ingest_api/internal/extract/pdf/engines/nemoretriever.py,sha256=Uqj1NH7yWga9P6_vCzgny1WKALfF--UdAaGHUF8K_aQ,22926
35
+ nv_ingest_api/internal/extract/pdf/engines/pdfium.py,sha256=fDbrZwJ-lgeHYOq107WXehzdSvyF8zEDza_9UkDm5aE,22360
34
36
  nv_ingest_api/internal/extract/pdf/engines/tika.py,sha256=6GyR2l6EsgNZl9jnYDXLeKNK9Fj2Mw9y2UWDq-eSkOc,3169
35
37
  nv_ingest_api/internal/extract/pdf/engines/unstructured_io.py,sha256=jrv2B4VZAH4PevAQrFz965qz8UyXq3rViiOTbGLejec,14908
36
38
  nv_ingest_api/internal/extract/pdf/engines/pdf_helpers/__init__.py,sha256=Jk3wrQ2CZs167juvEZ-uV6qXWQjR08hhIu8otk2MWj4,4931
37
39
  nv_ingest_api/internal/extract/pptx/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
38
- nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=15gU7NtTmTwr1ml679gABQABXI463ZKoqPOh31EK98s,7867
40
+ nv_ingest_api/internal/extract/pptx/pptx_extractor.py,sha256=o-0P2dDyRFW37uQi_lKk6-eFozTcZvbq-2Y4I0EBMIY,7749
39
41
  nv_ingest_api/internal/extract/pptx/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py,sha256=tmUXw4H35o6dMcsS73Q6L_zd-qDqwCshTGfCv_V610c,28435
42
+ nv_ingest_api/internal/extract/pptx/engines/pptx_helper.py,sha256=IZu0c_RHDSJwwclOZD3_tDu5jg4AEEfumbwKB78dUE0,29716
41
43
  nv_ingest_api/internal/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
42
44
  nv_ingest_api/internal/mutate/deduplicate.py,sha256=hmvTTGevpCtlkM_wVZSoc8-Exr6rUJwqLjoEnbPcPzY,3849
43
45
  nv_ingest_api/internal/mutate/filter.py,sha256=H-hOTBVP-zLpvQr-FoGIJKxkhtj4l_sZ9V2Fgu3rTEM,5183
@@ -46,7 +48,7 @@ nv_ingest_api/internal/primitives/control_message_task.py,sha256=nWVB3QsP6p8BKwH
46
48
  nv_ingest_api/internal/primitives/ingest_control_message.py,sha256=rvipBiiUaHuRhupFCFDCG8rv0PylSJibCiJ7rDeb98A,8514
47
49
  nv_ingest_api/internal/primitives/nim/__init__.py,sha256=i_i_fBR2EcRCh2Y19DF6GM3s_Q0VPgo_thPnhEIJUyg,266
48
50
  nv_ingest_api/internal/primitives/nim/default_values.py,sha256=W92XjfyeC6uuVxut6J7p00x1kpNsnXIDb97gSVytZJk,380
49
- nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=7C_t3BnYz_hL2H8RmvOShLCKlfYmwIREC6vnOnzOHWA,14483
51
+ nv_ingest_api/internal/primitives/nim/nim_client.py,sha256=pvNxwMgNS7lFjXvLgRVUrL6FdXDGkfGnOGQh9WrpYzs,14858
50
52
  nv_ingest_api/internal/primitives/nim/nim_model_interface.py,sha256=wMEgoi79YQn_4338MVemkeZgM1J-vnz0aZWpvqDhib4,2392
51
53
  nv_ingest_api/internal/primitives/nim/model_interface/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
52
54
  nv_ingest_api/internal/primitives/nim/model_interface/cached.py,sha256=b1HX-PY1ExW5V6pXC1ZiHdobeG_BmbPr3rBbVJef13s,11003
@@ -56,30 +58,31 @@ nv_ingest_api/internal/primitives/nim/model_interface/helpers.py,sha256=x35a9AyT
56
58
  nv_ingest_api/internal/primitives/nim/model_interface/nemoretriever_parse.py,sha256=MFWPqMTXs_MZG3ripRR21o7f_mVeoE46Q10yvJ8KNr0,7023
57
59
  nv_ingest_api/internal/primitives/nim/model_interface/paddle.py,sha256=rSUPwl5XOrqneoS6aKhatVjrNBg_LhP3nwUWS_aTwz0,17950
58
60
  nv_ingest_api/internal/primitives/nim/model_interface/parakeet.py,sha256=OYg4AGki_wm--Np9VlSm0eZC-r54GbDOISbe9v0B9fw,12967
59
- nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py,sha256=oai0-moKDJOnOMfTaGQf-vo6qMRD6pbcf7_XRIt-oJ8,4934
61
+ nv_ingest_api/internal/primitives/nim/model_interface/text_embedding.py,sha256=lFhppNqrq5X_fzbCWKphvZQMzaJd3gHrkWsyJORzFrU,5010
60
62
  nv_ingest_api/internal/primitives/nim/model_interface/vlm.py,sha256=qJ382PU1ZrIM-SR3cqIhtY_W2rmHec2HIa2aUB2SvaU,6031
61
- nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=exN0pKTBXd3pb5kKP96jinTYisgz1Y7EyWmWUuDNnCY,49312
63
+ nv_ingest_api/internal/primitives/nim/model_interface/yolox.py,sha256=uYXqdvqgkyS4Yfr9ZoikRDX4e94OV3ch3Xhv3JVg-3s,49581
62
64
  nv_ingest_api/internal/primitives/tracing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
65
  nv_ingest_api/internal/primitives/tracing/latency.py,sha256=5kVTeYRbRdTlT_aI4MeS20N_S7mqCcLqZR6YHtxhXkY,2215
64
66
  nv_ingest_api/internal/primitives/tracing/logging.py,sha256=SSzIgS7afLH-e1C7VagYDmkkA6rTXmQ-bmtLjoEguhg,3851
65
- nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=RC-sF6-w8YBb74nZ2JjEnkCBAxBIamhIHdn1ksxDtRI,7577
67
+ nv_ingest_api/internal/primitives/tracing/tagging.py,sha256=O5dD7Z7j43nrjqn0AxhxOPm5zIyMFo0akxaWU_FguAM,7866
66
68
  nv_ingest_api/internal/schemas/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
67
69
  nv_ingest_api/internal/schemas/extract/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
68
70
  nv_ingest_api/internal/schemas/extract/extract_audio_schema.py,sha256=VVppZgV1lnyJCTfADexzoj3V0lOSq3t6Dw_6VhIxZ7k,3771
69
- nv_ingest_api/internal/schemas/extract/extract_chart_schema.py,sha256=mNsv628oslNieU6KPUHw_Iwr4WohtK2dIHoVo2HnaEs,4302
71
+ nv_ingest_api/internal/schemas/extract/extract_chart_schema.py,sha256=iu8lHQC0zbBB9VRK7PZisAVzpeSpFqjcXRAnwZ9OzoM,4301
70
72
  nv_ingest_api/internal/schemas/extract/extract_docx_schema.py,sha256=M2N7WjMNvSemHcJHWeNUD_kFG0wC5VE2W3K6SVrJqvA,3761
73
+ nv_ingest_api/internal/schemas/extract/extract_html_schema.py,sha256=lazpONTGZ6Fl420BGBAr6rogFGtlzBiZTc1uA694OIs,841
71
74
  nv_ingest_api/internal/schemas/extract/extract_image_schema.py,sha256=GC4xV8Z9TPLOuxlEtf2fbklSSp8ETGMrDpZgMQ02UwA,3766
72
- nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py,sha256=_ptTrxN74tpasJ0aQZgaXEUYFe298PJGbGNk6gyeM94,3992
73
- nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py,sha256=ZBCppSNmnr4jrPl2-R_j0RBw2L4ej_r0hVdFn02AG18,6569
75
+ nv_ingest_api/internal/schemas/extract/extract_infographic_schema.py,sha256=rl_hFDoJaJLTKbtnEpDSBj-73KQL9aUEVKGiW0IdXiU,3991
76
+ nv_ingest_api/internal/schemas/extract/extract_pdf_schema.py,sha256=G9g1lEORmryUWTzDyZ0vHAuPnVMK7VaRx0E4xzmAw3Q,6589
74
77
  nv_ingest_api/internal/schemas/extract/extract_pptx_schema.py,sha256=5dT0kv-Mmpe5KW-BZc1JOW3rUlgzVZI0rpB79NWytmw,3761
75
- nv_ingest_api/internal/schemas/extract/extract_table_schema.py,sha256=SXBYDU3V97-pPOLfhFmXQveP_awARXP7k1aGcMMEJtU,3951
78
+ nv_ingest_api/internal/schemas/extract/extract_table_schema.py,sha256=sbt3TvQrLsXc8-muKnsyOs4MfpA4VzrprYHdu1IrY8M,3950
76
79
  nv_ingest_api/internal/schemas/message_brokers/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
77
- nv_ingest_api/internal/schemas/message_brokers/message_broker_client_schema.py,sha256=nbnNzCQCCduoFw4k8XPfkpn3jyyMRpDLROTwEosaSG8,766
80
+ nv_ingest_api/internal/schemas/message_brokers/message_broker_client_schema.py,sha256=4xTSFE_vH7yZE9RRJRflFAG9hNXIaF6K020M_xA7ylw,1351
78
81
  nv_ingest_api/internal/schemas/message_brokers/request_schema.py,sha256=LZX_wXDxTamVFqTQs2Yd8uvWyPE5mddHAWSU4PtfEIQ,966
79
82
  nv_ingest_api/internal/schemas/message_brokers/response_schema.py,sha256=4b275HlzBSzpmuE2wdoeaGKPCdKki3wuWldtRIfrj8w,727
80
83
  nv_ingest_api/internal/schemas/meta/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
81
84
  nv_ingest_api/internal/schemas/meta/base_model_noext.py,sha256=8hXU1uuiqZ6t8EsoZ8vlC5EFf2zSZrKEX133FcfZMwI,316
82
- nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=4Ylcz5CDJXYUKd79-CnyrG7mI463jLd4Uachy7uTRVE,7735
85
+ nv_ingest_api/internal/schemas/meta/ingest_job_schema.py,sha256=Xe3oJ6oyMI49jvOZy_fiYldJUd9-n1_hn3qaA3LbFww,8075
83
86
  nv_ingest_api/internal/schemas/meta/metadata_schema.py,sha256=_FAE-yeb01hxq05SXrV3NLM4DPUPSfnIbH6ZMliWsEg,6625
84
87
  nv_ingest_api/internal/schemas/mutate/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
85
88
  nv_ingest_api/internal/schemas/mutate/mutate_image_dedup_schema.py,sha256=k1JOdlPPpsipc0XhHf-9YxJ_-W0HvpVE1ZhYmr7fzj0,395
@@ -89,16 +92,16 @@ nv_ingest_api/internal/schemas/store/store_image_schema.py,sha256=p2LGij9i6sG6RY
89
92
  nv_ingest_api/internal/schemas/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
90
93
  nv_ingest_api/internal/schemas/transform/transform_image_caption_schema.py,sha256=ORXAowdjxBUyfkw95eg2F82DRFqEsuV9PwNKVBulcmY,568
91
94
  nv_ingest_api/internal/schemas/transform/transform_image_filter_schema.py,sha256=31ThI5fr0yyENeJeE1xMAA-pxk1QVJLwM842zMate_k,429
92
- nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py,sha256=vlTjAj1T78QkQXYkC83vZQKTW04x7PeoukEzmkam7sY,732
93
- nv_ingest_api/internal/schemas/transform/transform_text_splitter_schema.py,sha256=iM1sUklcZVA6fdeEWRsMqV_ls-E4UcUsGwewv0JJRi4,759
95
+ nv_ingest_api/internal/schemas/transform/transform_text_embedding_schema.py,sha256=ongmHkJA2953f9_RI7ZYzf5BUnFzVL6Al5E8WKyfgw4,885
96
+ nv_ingest_api/internal/schemas/transform/transform_text_splitter_schema.py,sha256=D9K8tvu-tkEBQkZo7uuRzgrHdGyM3ZcNycHbHy5HV2E,791
94
97
  nv_ingest_api/internal/store/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
95
98
  nv_ingest_api/internal/store/embed_text_upload.py,sha256=maxb4FPsBvWgvlrjAPEBlRZEFdJX5NxPG-p8kUbzV7I,9898
96
- nv_ingest_api/internal/store/image_upload.py,sha256=J5EHNng7Z5I6M4f3UcbniKQB29Scr3Qe05wsBpaVXds,9653
99
+ nv_ingest_api/internal/store/image_upload.py,sha256=GNlY4k3pfcHv3lzXxkbmGLeHFsf9PI25bkBn6Xn9h3I,9654
97
100
  nv_ingest_api/internal/transform/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
98
101
  nv_ingest_api/internal/transform/caption_image.py,sha256=0ILCG2F8ESqKtZiPUM-6F1BHUflFZ76Dzi2GNzkE-lU,8517
99
- nv_ingest_api/internal/transform/embed_text.py,sha256=W-RKM9D9yQy8WAKiiqpkHESpLsL70SacvHwU9EdMeqs,15728
100
- nv_ingest_api/internal/transform/split_text.py,sha256=y6NYRkCEVpVsDu-AqrKx2D6JPp1vwxclw9obNZNJIIs,6561
101
- nv_ingest_api/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
+ nv_ingest_api/internal/transform/embed_text.py,sha256=F8kg-WXihtuUMwDQUUYjnfGDCdQp1Mkd-jeThOiJT0s,16507
103
+ nv_ingest_api/internal/transform/split_text.py,sha256=DlVoyHLqZ-6_FiWwZmofPcq7TX8Ta23hIE0St9tw1IY,6822
104
+ nv_ingest_api/util/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
102
105
  nv_ingest_api/util/control_message/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
106
  nv_ingest_api/util/control_message/validators.py,sha256=KvvbyheJ5rbzvJbH9JKpMR9VfoI0b0uM6eTAZte1p44,1315
104
107
  nv_ingest_api/util/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -111,18 +114,18 @@ nv_ingest_api/util/converters/type_mappings.py,sha256=5TVXRyU6BlQvFOdqknEuQw3ss4
111
114
  nv_ingest_api/util/detectors/__init__.py,sha256=HIHfzSig66GT0Uk8qsGBm_f13fKYcPtItBicRUWOOVA,183
112
115
  nv_ingest_api/util/detectors/language.py,sha256=TvzcESYY0bn0U4aLY6GjB4VaCWA6XrXxAGZbVzHTMuE,965
113
116
  nv_ingest_api/util/exception_handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
- nv_ingest_api/util/exception_handlers/converters.py,sha256=MYl7b-_V1g661EVDgaep9-nO3A6ka9uyV6pKoN0pEDA,2223
115
- nv_ingest_api/util/exception_handlers/decorators.py,sha256=F1E_xIpNY5S9TvBEZcsbli88iI5vHrcT1PGmPu5KwcE,8865
117
+ nv_ingest_api/util/exception_handlers/converters.py,sha256=fX64p5GeoHOPbGccR2JrsKQLa0Ge9Mmi2W-9mLnVVl8,2221
118
+ nv_ingest_api/util/exception_handlers/decorators.py,sha256=ywaqekT9g2gfDH8my7JTJdcnDYbguSzWfAQ6TVxqQvE,21459
116
119
  nv_ingest_api/util/exception_handlers/detectors.py,sha256=Q1O-QOzsShPpNian2lawXVAOCstIE7nSytNw516hTg8,2288
117
120
  nv_ingest_api/util/exception_handlers/pdf.py,sha256=FUC41QJKDCfiTv-1c1_8Isxwt1xMxDZw9BN8JLEJKBw,3654
118
121
  nv_ingest_api/util/exception_handlers/schemas.py,sha256=NJngVNf9sk5Uz6CFFfkNO_LBAMt2QZUcMYGxX64oYRk,2179
119
122
  nv_ingest_api/util/image_processing/__init__.py,sha256=Jiy8C1ZuSrNb_eBM1ZTV9IKFIsnjhZi6Ku3JJhVLimA,104
120
123
  nv_ingest_api/util/image_processing/clustering.py,sha256=sUGlZI4cx1q8h4Pns1N9JVpdfSM2BOH8zRmn9QFCtzI,9236
121
- nv_ingest_api/util/image_processing/processing.py,sha256=dHyoxoI2btKT04ODJK0ChB8MR6eCnZ0ZLpbEQowCb5A,6561
124
+ nv_ingest_api/util/image_processing/processing.py,sha256=LSoDDEmahr7a-qSS12McVcowRe3dOrAZwa1h-PD_JPQ,6554
122
125
  nv_ingest_api/util/image_processing/table_and_chart.py,sha256=bxOu9PZYkG_WFCDGw_JLaO60S2pDSN8EOWK3xkIwr2A,14376
123
126
  nv_ingest_api/util/image_processing/transforms.py,sha256=Kz9hrizV314Hy7cRCYK9ZmhmBbVUOZ_z0HEpzZYcslQ,14081
124
127
  nv_ingest_api/util/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
- nv_ingest_api/util/logging/configuration.py,sha256=GFO7Fofco00O3DbovXDNqInVKpFuvS0i_-WT-GvxKlE,814
128
+ nv_ingest_api/util/logging/configuration.py,sha256=XUo7yON9V8IDPfN3x8RBwpZ3Gv4zrRq8QwsByf4dGNE,981
126
129
  nv_ingest_api/util/message_brokers/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
127
130
  nv_ingest_api/util/message_brokers/simple_message_broker/__init__.py,sha256=WaQ3CWIpIKWEivT5kL-bkmzcSQKLGFNFHdXHUJjqZFs,325
128
131
  nv_ingest_api/util/message_brokers/simple_message_broker/broker.py,sha256=h9Q4q_alXGxCLNlJUZPan46q8fJ7B72sQy2eBfHdk6I,17265
@@ -134,19 +137,21 @@ nv_ingest_api/util/multi_processing/__init__.py,sha256=4fojP8Rp_5Hu1YAkqGylqTyEZ
134
137
  nv_ingest_api/util/multi_processing/mp_pool_singleton.py,sha256=dTfP82DgGPaXEJH3jywTO8rNlLZUniD4FFzwv84_giE,7372
135
138
  nv_ingest_api/util/nim/__init__.py,sha256=UqbiXFCqjWcjNvoduXd_0gOUOGBT8JvppiYHOmMyneA,1775
136
139
  nv_ingest_api/util/pdf/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
137
- nv_ingest_api/util/pdf/pdfium.py,sha256=puqw9lYloNJwjdx9X63TQ9u6vA6FRJqmmPiaquUm3HM,15767
138
- nv_ingest_api/util/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ nv_ingest_api/util/pdf/pdfium.py,sha256=Ch9Gh5jRLcBr3stjCckqWwTUL-T0sI50PlQnZHo_9NA,15761
141
+ nv_ingest_api/util/schema/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
139
142
  nv_ingest_api/util/schema/schema_validator.py,sha256=H0yZ_i_HZaiBRUCGmTBfRB9-hURhVqyd10aS_ynM1_0,321
140
143
  nv_ingest_api/util/service_clients/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
141
144
  nv_ingest_api/util/service_clients/client_base.py,sha256=eCOeq3Rr6Xnnsh-oHszYlQTOffQyzsT8s43V4V8H_h8,2716
142
145
  nv_ingest_api/util/service_clients/kafka/__init__.py,sha256=uLsBITo_XfgbwpzqXUm1IYX6XlZrTfx6T1cIhdILwG8,140
143
- nv_ingest_api/util/service_clients/redis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
- nv_ingest_api/util/service_clients/redis/redis_client.py,sha256=Xa9eeI3kfDBDlLsG5AX-MqbJsI8Pt0geNpuIwmzoEZQ,37419
146
+ nv_ingest_api/util/service_clients/redis/__init__.py,sha256=wQSlVx3T14ZgQAt-EPzEczQusXVW0W8yynnUaFFGE3s,143
147
+ nv_ingest_api/util/service_clients/redis/redis_client.py,sha256=3NLecvIvVN1v-sA7d7G-_f6qJVZyfJE2H8Iu5KG3Aew,37417
145
148
  nv_ingest_api/util/service_clients/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
- nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=tjh9BYPscMQ1-IubbI7O7MWwvga5ZYb7OJu65JtPgGw,21732
149
+ nv_ingest_api/util/service_clients/rest/rest_client.py,sha256=dZ-jrk7IK7oNtHoXFSNTf7psoOpLREiLN5ezpHFW0HI,21732
147
150
  nv_ingest_api/util/string_processing/__init__.py,sha256=mkwHthyS-IILcLcL1tJYeF6mpqX3pxEw5aUzDGjTSeU,1411
148
- nv_ingest_api-25.4.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
149
- nv_ingest_api-25.4.2.dist-info/METADATA,sha256=0c7SebSauK0PS4HHpMCnzIYDWnfUt9KMqGfiny4_8o4,13874
150
- nv_ingest_api-25.4.2.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
151
- nv_ingest_api-25.4.2.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
152
- nv_ingest_api-25.4.2.dist-info/RECORD,,
151
+ nv_ingest_api/util/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
+ nv_ingest_api/util/system/hardware_info.py,sha256=ORZeKpH9kSGU_vuPhyBwkIiMyCViKUX2CP__MCjrfbU,19463
153
+ nv_ingest_api-25.6.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
154
+ nv_ingest_api-25.6.0.dist-info/METADATA,sha256=vwGY9bm0J1ITplXoxJjSIwMnH4Tx92ZcQmi4AZNHBqs,13904
155
+ nv_ingest_api-25.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
156
+ nv_ingest_api-25.6.0.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
157
+ nv_ingest_api-25.6.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5