nv-ingest-api 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-api might be problematic. Click here for more details.

Files changed (24) hide show
  1. nv_ingest_api/internal/enums/common.py +37 -0
  2. nv_ingest_api/internal/extract/image/image_extractor.py +5 -1
  3. nv_ingest_api/internal/meta/__init__.py +3 -0
  4. nv_ingest_api/internal/meta/udf.py +232 -0
  5. nv_ingest_api/internal/primitives/ingest_control_message.py +63 -22
  6. nv_ingest_api/internal/primitives/tracing/tagging.py +102 -15
  7. nv_ingest_api/internal/schemas/meta/ingest_job_schema.py +40 -4
  8. nv_ingest_api/internal/schemas/meta/udf.py +23 -0
  9. nv_ingest_api/internal/transform/embed_text.py +5 -0
  10. nv_ingest_api/util/exception_handlers/decorators.py +104 -156
  11. nv_ingest_api/util/imports/callable_signatures.py +59 -1
  12. nv_ingest_api/util/imports/dynamic_resolvers.py +53 -5
  13. nv_ingest_api/util/introspection/__init__.py +3 -0
  14. nv_ingest_api/util/introspection/class_inspect.py +145 -0
  15. nv_ingest_api/util/introspection/function_inspect.py +65 -0
  16. nv_ingest_api/util/logging/configuration.py +71 -7
  17. nv_ingest_api/util/string_processing/configuration.py +682 -0
  18. nv_ingest_api/util/string_processing/yaml.py +45 -0
  19. nv_ingest_api/util/system/hardware_info.py +178 -13
  20. {nv_ingest_api-2025.8.13.dev20250813.dist-info → nv_ingest_api-2025.8.15.dev20250815.dist-info}/METADATA +1 -1
  21. {nv_ingest_api-2025.8.13.dev20250813.dist-info → nv_ingest_api-2025.8.15.dev20250815.dist-info}/RECORD +24 -16
  22. {nv_ingest_api-2025.8.13.dev20250813.dist-info → nv_ingest_api-2025.8.15.dev20250815.dist-info}/WHEEL +0 -0
  23. {nv_ingest_api-2025.8.13.dev20250813.dist-info → nv_ingest_api-2025.8.15.dev20250815.dist-info}/licenses/LICENSE +0 -0
  24. {nv_ingest_api-2025.8.13.dev20250813.dist-info → nv_ingest_api-2025.8.15.dev20250815.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.info(
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.info("Cgroup v1 quota detected: Unlimited (-1)")
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.info(f"Cgroup v1 shares detected: {shares} (no quota found)")
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.info("Cgroup v2 quota detected: Unlimited ('max')")
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.info(
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.info(f"Detected {count} cores via os.sched_getaffinity.")
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.info(f"Detected {logical} logical cores via {source}.")
262
+ logger.debug(f"Detected {logical} logical cores via {source}.")
251
263
  if physical:
252
- logger.info(f"Detected {physical} physical cores via {source}.")
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.info(
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
- # --- 5. Determine the RAW Limit (before weighting) ---
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.info(f"Raw CPU limit determined: {self.raw_limit_value:.2f} (Method: {self.raw_limit_method})")
510
+ logger.debug(f"Raw CPU limit determined: {self.raw_limit_value:.2f} (Method: {self.raw_limit_method})")
365
511
 
366
- # --- 6. Apply Weighting (if applicable) ---
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.info(
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
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nv-ingest-api
3
- Version: 2025.8.13.dev20250813
3
+ Version: 2025.8.15.dev20250815
4
4
  Summary: Python module with core document ingestion functions.
5
5
  Author-email: Jeremy Dyer <jdyer@nvidia.com>
6
6
  License: Apache License
@@ -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=lzDJ35VWfIwlL_Lx_q0dfHUuwEB7CXudHIQAilpjoRw,12611
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=4tUWinuFMN3ukWa2tZa2_LtzRiTyUAUCBF6BDkUEvm0,8705
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=rvipBiiUaHuRhupFCFDCG8rv0PylSJibCiJ7rDeb98A,8514
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=O5dD7Z7j43nrjqn0AxhxOPm5zIyMFo0akxaWU_FguAM,7866
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=ceYQjRjhBSDbbZ6q-Db7Y6GHVOvWPdGAMb3TX1vMWfY,8321
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=z9P5AtUo_e7s5qLlyhcUISQ1HUhBD93bdmEcXls_Fwc,19768
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=ywaqekT9g2gfDH8my7JTJdcnDYbguSzWfAQ6TVxqQvE,21459
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=e2bJB1pmkN4Ee-Bf-VggOSBaQ4RXofWF5eKkWXgIj2U,1855
129
- nv_ingest_api/util/imports/dynamic_resolvers.py,sha256=7GByV_-8z2X0tnVoabCxVioxOP3sYMros3ZllVAW-wY,4343
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=XUo7yON9V8IDPfN3x8RBwpZ3Gv4zrRq8QwsByf4dGNE,981
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=ORZeKpH9kSGU_vuPhyBwkIiMyCViKUX2CP__MCjrfbU,19463
156
- nv_ingest_api-2025.8.13.dev20250813.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
157
- nv_ingest_api-2025.8.13.dev20250813.dist-info/METADATA,sha256=P4gGvIsM3Uo9f7So5Ema1tn9B0RQz_YJ84OXPNPBz7g,13947
158
- nv_ingest_api-2025.8.13.dev20250813.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
159
- nv_ingest_api-2025.8.13.dev20250813.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
160
- nv_ingest_api-2025.8.13.dev20250813.dist-info/RECORD,,
163
+ nv_ingest_api/util/system/hardware_info.py,sha256=1UFM8XE6M3pgQcpbVsCsqDQ7Dj-zzptL-XRE-DEu9UA,27213
164
+ nv_ingest_api-2025.8.15.dev20250815.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
165
+ nv_ingest_api-2025.8.15.dev20250815.dist-info/METADATA,sha256=RFPlXNlhPWmxfR0x1RpZGYUb2ICmFdkL6giKG2va40g,13947
166
+ nv_ingest_api-2025.8.15.dev20250815.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
167
+ nv_ingest_api-2025.8.15.dev20250815.dist-info/top_level.txt,sha256=abjYMlTJGoG5tOdfIB-IWvLyKclw6HLaRSc8MxX4X6I,14
168
+ nv_ingest_api-2025.8.15.dev20250815.dist-info/RECORD,,