Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
67ac171
Temporarily disable arm64 builds (#1323)
jdye64 Jan 20, 2026
19988fd
Document MIG slice configuration for NIM models per chat message (#1324)
kheiss-uwzoo Jan 20, 2026
34bd7d7
Fallback to image only embeddings if text is empty (#1321)
ChrisJar Jan 21, 2026
edd6d7b
MIGslice update (#1329)
kheiss-uwzoo Jan 21, 2026
2298941
Update release notes for nv-ingest for page elements topic (#1333)
kheiss-uwzoo Jan 21, 2026
2e30c07
Sohail/update version refs (#1331)
sosahi Jan 22, 2026
518b950
Lancedb Retrieval Rework, harness compatibility, example notebook (#…
jioffe502 Jan 23, 2026
4e8f3f3
feat(harness): Add Helm deployment support to test harness (#1306)
charlesbluca Jan 27, 2026
bc0039b
Switch Compose dynamic scaling default to disabled (#1341)
charlesbluca Jan 28, 2026
75b4ec4
feat(harness): Service log dumping, support for compose override file…
charlesbluca Jan 28, 2026
d197d72
Deduplicate images that overlap with tables using bounding boxes (#1344)
edknv Jan 29, 2026
19ef908
Add pre-commit hook to validate Compose/Helm configs (#1345)
charlesbluca Feb 2, 2026
c953712
refactor: Complete GitHub Actions overhaul with unified release proce…
jdye64 Feb 2, 2026
0e0fe98
Add github action to build Nvidia nemotron huggingface models nightly…
jdye64 Feb 2, 2026
cee571d
Nightly hf build script (#1350)
jdye64 Feb 2, 2026
0923479
Build Nemotron OCR with specific Nvidia GPU ARCH support (#1351)
jdye64 Feb 2, 2026
265d4f3
Workflow location update (#1352)
jdye64 Feb 2, 2026
5b0b0ca
Workflow tweaks (#1353)
jdye64 Feb 2, 2026
b058ece
Further workflow tweaks to address syntax issues (#1354)
jdye64 Feb 2, 2026
30ca621
Sanitize build refs for docker build names (#1355)
jdye64 Feb 2, 2026
1e85404
Attempt to resolve workflows for docs build, conda publishing, and di…
jdye64 Feb 2, 2026
8b2366b
Disable arm64 commit builds (#1358)
jdye64 Feb 2, 2026
700539c
docker-compose-update (#1339)
kheiss-uwzoo Feb 2, 2026
9796ea2
changes references to blueprint (#1357)
kheiss-uwzoo Feb 2, 2026
af8ba2b
Cancel any in progress actions after a new commit to an existing PR (…
jdye64 Feb 2, 2026
9c9194c
Refactor docker build and test into a single job to prevent artifacts…
jdye64 Feb 3, 2026
9e215e8
Add LanceDB hybrid search support and update harness defaults (#1346)
jioffe502 Feb 3, 2026
f21944f
added documentation resources section to NV-Ingest GitHub home page (…
kheiss-uwzoo Feb 3, 2026
5e4002b
Update NIM service configs to reflect latest releases (#1360)
charlesbluca Feb 4, 2026
33d1151
VLM image captioning model choice (#1366)
kheiss-uwzoo Feb 4, 2026
695fe74
Dataset prerequisites (#1372)
kheiss-uwzoo Feb 4, 2026
828cca3
NIM-trition-limit (#1338)
kheiss-uwzoo Feb 5, 2026
c765444
update extraction images in audio and GitHub Readme (#1377)
kheiss-uwzoo Feb 5, 2026
5627686
[feat:] Render at target scale to avoid expensive downscaling (#1368)
jioffe502 Feb 5, 2026
20e706b
[Harness] Feat: test config flag (#1382)
jioffe502 Feb 6, 2026
2df1cac
Sohail/readme name change (#1384)
sosahi Feb 6, 2026
be6d849
[Harness] Add tests for hf pypi packages of page-elements, graphic-el…
ChrisJar Feb 9, 2026
80daf89
Jp20 dataset (#1390)
jioffe502 Feb 10, 2026
95a72ea
fix(harness): add hybrid param to jp20_recall evaluator (#1391)
jioffe502 Feb 10, 2026
ea493ab
Move moviepy to dedicated test group in nv-ingest-api (#1395)
charlesbluca Feb 11, 2026
aa8d13c
Merge harness dependency groups (#1396)
charlesbluca Feb 11, 2026
d9a91b1
Cache huggingface tokenizers to persist between jobs (#1401)
ChrisJar Feb 13, 2026
0142710
(harness) Add instructions / requirements for pip install (#1406)
charlesbluca Feb 18, 2026
d25bef9
fix(pdfium): Replace rev_byteorder with in-place cv2 channel swap (#1…
jioffe502 Feb 18, 2026
2f1e668
Update nightly HuggingFace builds to use Cuda 13 (#1409)
jdye64 Feb 19, 2026
6877624
Hf python version build (#1410)
jdye64 Feb 19, 2026
cd3c368
Update PDF blueprint architecture diagram
kheiss-uwzoo Feb 19, 2026
9ff816a
Update `extract_primitives_from_pdf_*` authentication kwarg to match …
charlesbluca Feb 19, 2026
607aeb9
Update PDF blueprint architecture diagram (#1412)
kheiss-uwzoo Feb 19, 2026
d8e17ad
updated docker overrides (#1381)
kheiss-uwzoo Feb 23, 2026
a44d64f
Document VLM Captioning for Infographics (#1369)
kheiss-uwzoo Feb 23, 2026
9e99bb9
allow providing vlm captions with surrounding page text (#1389)
edknv Feb 24, 2026
70b5a80
Merge remote-tracking branch 'upstream/main'
kheiss-uwzoo Feb 24, 2026
b72e614
Add text_image modality support for text elements in multimodal embed…
edknv Feb 25, 2026
26b68f1
Retriever (#1427)
jdye64 Feb 25, 2026
8118ea8
(retriever) upload nightly wheels to test.pypi.org (#1429)
jdye64 Feb 25, 2026
b35ad2e
Rename retriever wheel -> nemo-retriever since retriever is already o…
jdye64 Feb 25, 2026
84d310b
[retriever] add option to use multimodal vl embedder (#1435)
edknv Feb 25, 2026
7f0248c
Merge remote-tracking branch 'upstream/main'
kheiss-uwzoo Feb 25, 2026
7bf37fe
Add LanceDB hybrid search (dense + FTS) for retriever recall (#1438)
jioffe502 Feb 26, 2026
9296674
Retriever unit test ci (#1431)
jdye64 Feb 26, 2026
4b017ba
add docker container base to github actions for retriever (#1434)
jperez999 Feb 26, 2026
7175e41
Kheiss/vlm caption rm (#1436)
kheiss-uwzoo Feb 26, 2026
1881180
(helm) Add override files to match Compose (#1405)
charlesbluca Feb 26, 2026
1271e46
feature: perf improvement thru redis adding instrumented connection p…
jioffe502 Feb 26, 2026
ebb9fbf
(helm) Ray env parity, remove resource limits from ingest pod (#1404)
charlesbluca Feb 26, 2026
fc00d0d
Remove padding for page elements (#1376)
edknv Feb 26, 2026
f489a58
(CI) atexit handling for SimpleMessageBroker, enforce upper bound on …
charlesbluca Feb 26, 2026
0dd5f1b
Merge remote-tracking branch 'upstream/main'
kheiss-uwzoo Feb 26, 2026
fd03934
(retriever) Add multimodal (image/text_image) embedding support (#1443)
edknv Feb 27, 2026
ee0fdaf
(retriever) Add support for audio extraction (#1439)
charlesbluca Feb 27, 2026
3eb0711
Rename module to nemo_retriever (#1449)
jdye64 Feb 27, 2026
dea2770
Merge remote-tracking branch 'upstream/main'
kheiss-uwzoo Feb 27, 2026
368f414
(retriever) - Nemotron parse support (#1442)
jdye64 Feb 27, 2026
347c5ac
rework project to favor UV and remove conda (#1446)
jdye64 Feb 27, 2026
6ac7d8e
Kheiss/title change (#1452)
kheiss-uwzoo Feb 27, 2026
080967c
Kheiss/vlm caption (#1423)
kheiss-uwzoo Feb 27, 2026
3ff2f1f
Merge remote-tracking branch 'upstream/main'
kheiss-uwzoo Feb 27, 2026
8c1e22f
Changes to documentation for lanceDB implementation
kheiss-uwzoo Feb 27, 2026
7e07ab7
updated files for Lance DB implementation
kheiss-uwzoo Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
34 changes: 10 additions & 24 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,28 @@
ARG BASE_IMG=nvcr.io/nvidia/cuda
ARG BASE_IMG_TAG=12.4.1-base-ubuntu22.04

# Use NVIDIA cuda
FROM $BASE_IMG:$BASE_IMG_TAG AS base

ARG RELEASE_TYPE="dev"
ARG VERSION=""
ARG VERSION_REV="0"

# Install necessary dependencies using apt-get
RUN apt-get update && apt-get install -y \
wget \
bzip2 \
ca-certificates \
curl \
git \
libgl1-mesa-glx \
vim \
git \
wget \
&& apt-get clean

RUN wget -O Miniforge3.sh "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" -O /tmp/miniforge.sh \
&& bash /tmp/miniforge.sh -b -p /opt/conda \
&& rm /tmp/miniforge.sh

# Add conda to the PATH
ENV PATH=/opt/conda/bin:$PATH
RUN curl -LsSf https://astral.sh/uv/install.sh | sh

# Install Mamba, a faster alternative to conda, within the base environment
RUN conda install -y mamba -n base -c conda-forge
ENV PATH=/root/.local/bin:$PATH
ENV UV_LINK_MODE=copy

COPY conda/environments/nv_ingest_environment.yml /workspace/nv_ingest_environment.yml
RUN --mount=type=cache,target=/root/.cache/uv \
uv python install 3.12 \
&& uv venv --python 3.12 /opt/nv_ingest_runtime

# Create nv_ingest base environment
RUN mamba env create -f /workspace/nv_ingest_environment.yml \
&& conda clean --all --yes
ENV VIRTUAL_ENV=/opt/nv_ingest_runtime
ENV PATH=/opt/nv_ingest_runtime/bin:/root/.local/bin:$PATH

# Set default shell to bash
SHELL ["/bin/bash", "-c"]

# Activate the environment (make it default for subsequent commands)
RUN echo "source activate nv_ingest_runtime" >> ~/.bashrc
2 changes: 1 addition & 1 deletion .devcontainer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ limitations under the License.

# NV-Ingest Devcontainer

The nv-ingest devcontainer is provided as a quick-to-set-up development and exploration environment for use with [Visual Studio Code](https://code.visualstudio.com) (Code). The devcontainer is a lightweight container which mounts-in a Conda environment with cached packages, alleviating long Conda download times on subsequent launches. It provides a simple framework for adding developer-centric [scripts](#development-scripts), and incorporates some helpful Code plugins.
The nv-ingest devcontainer is provided as a quick-to-set-up development and exploration environment for use with [Visual Studio Code](https://code.visualstudio.com) (Code). The devcontainer is a lightweight container with a pre-created `uv` Python environment and package cache for fast launches. It provides a simple framework for adding developer-centric [scripts](#development-scripts), and incorporates some helpful Code plugins.

> [!Note]
> NV-Ingest is also known as NVIDIA Ingest and NeMo Retriever extraction.
Expand Down
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"stkb.rewrap" // Wrapping all text in any language
],
"settings": {
"cmake.cmakePath": "/tmp/.current-conda-env/bin/cmake",
"cmake.cmakePath": "/usr/bin/cmake",
"C_Cpp.intelliSenseEngine": "disabled",
"python.terminal.activateEnvironment": false,
"files.watcherExclude": {
Expand Down
41 changes: 41 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,43 @@
# Ensure user local scripts are not included in resulting docker images that are built
scripts/private_local

# Exclude large or permission-restricted paths from build context
.volumes/
**/.volumes/
models/
outputs/
triton_models/

.cursor/
tools/private_local/
test_results/
sweep_results/
artifacts/

lancedb_*/
tools/harness/lancedb/

history.db
history.db-shm
history.db-wal

dist/

.venv/
.env/
.env.local/
.env.development.local/
.env.test.local/
.env.production.local/

.env.development/
.env.test/
.env.production/

# Keep build context small and avoid permission issues
.git/
**/__pycache__/
**/*.pyc
*.egg-info/
**/*.egg-info/
nemo_retriever/.venv/
54 changes: 54 additions & 0 deletions .github/actions/determine-version/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Determine Version
description: Determine version string from inputs or generate from date

inputs:
version:
description: 'Explicit version string (leave empty for auto-generation)'
required: false
default: ''
date-format:
description: 'Date format for auto-generated version'
required: false
default: '%Y.%m.%d'
branch-name:
description: 'Branch name to extract version from (for release branches)'
required: false
default: ''

outputs:
version:
description: 'Determined version string'
value: ${{ steps.determine.outputs.version }}

runs:
using: composite
steps:
- name: Determine version
id: determine
shell: bash
run: |
VERSION=""
INPUT_VERSION="${{ inputs.version }}"
INPUT_BRANCH_NAME="${{ inputs.branch-name }}"
INPUT_DATE_FORMAT="${{ inputs.date-format }}"

# Priority 1: Explicit version input
if [ -n "${INPUT_VERSION}" ]; then
VERSION="${INPUT_VERSION}"
echo "Using explicit version: $VERSION"

# Priority 2: Extract from branch name (for release/* branches)
elif [ -n "${INPUT_BRANCH_NAME}" ]; then
if [[ "${INPUT_BRANCH_NAME}" == release/* ]]; then
VERSION="${INPUT_BRANCH_NAME#release/}"
echo "Extracted version from branch: $VERSION"
fi
fi

# Priority 3: Generate from date
if [ -z "$VERSION" ]; then
VERSION="$(date +"${INPUT_DATE_FORMAT}")"
echo "Generated version from date: $VERSION"
fi

echo "version=$VERSION" >> $GITHUB_OUTPUT
19 changes: 19 additions & 0 deletions .github/actions/docker-login-ngc/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Login to NGC Registry
description: Authenticate with NVIDIA NGC Container Registry

inputs:
registry:
description: 'Registry URL'
required: false
default: 'nvcr.io'
password:
description: 'NGC API token'
required: true

runs:
using: composite
steps:
- name: Log in to NGC Registry
shell: bash
run: |
echo "${{ inputs.password }}" | docker login ${{ inputs.registry }} --username "\$oauthtoken" --password-stdin
24 changes: 24 additions & 0 deletions .github/actions/setup-docker-buildx/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Setup Docker Buildx
description: Set up Docker Buildx with optional QEMU for multi-platform builds

inputs:
use-qemu:
description: 'Enable QEMU emulation for cross-platform builds'
required: false
default: 'false'
platforms:
description: 'Platforms to support (comma-separated)'
required: false
default: 'linux/amd64'

runs:
using: composite
steps:
- name: Set up QEMU
if: ${{ inputs.use-qemu == 'true' }}
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
platforms: ${{ inputs.platforms }}
68 changes: 68 additions & 0 deletions .github/workflows/ci-main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Main Branch CI

on:
push:
branches:
- main

jobs:
# Pre-commit checks
pre-commit:
name: Pre-commit Checks
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4

- uses: actions/setup-python@v3

- uses: pre-commit/action@v3.0.1

# Build standard Docker image
docker-build:
name: Build Docker Image (amd64)
uses: ./.github/workflows/reusable-docker-build.yml
with:
platform: 'linux/amd64'
target: 'runtime'
push: false
tags: 'nv-ingest:main-${{ github.sha }}'
base-image: 'ubuntu'
base-image-tag: 'jammy-20250415.1'
runner: 'linux-large-disk'
secrets:
HF_ACCESS_TOKEN: ${{ secrets.HF_ACCESS_TOKEN }}

# Test Docker image
docker-test:
name: Test Docker Image
needs: docker-build
uses: ./.github/workflows/reusable-docker-test.yml
with:
image-tag: 'nv-ingest:main-${{ github.sha }}'
platform: 'linux/amd64'
test-selection: 'full'
pytest-markers: 'not integration'
coverage: true
runner: 'linux-large-disk'

# Test library mode
library-mode-test:
name: Test Library Mode
uses: ./.github/workflows/reusable-integration-test.yml
with:
runner: 'ubuntu-latest'
timeout-minutes: 60
source-ref: 'main'
secrets:
AUDIO_FUNCTION_ID: ${{ secrets.AUDIO_FUNCTION_ID }}
EMBEDDING_NIM_MODEL_NAME: ${{ secrets.EMBEDDING_NIM_MODEL_NAME }}
NEMOTRON_PARSE_MODEL_NAME: ${{ secrets.NEMOTRON_PARSE_MODEL_NAME }}
NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
PADDLE_HTTP_ENDPOINT: ${{ secrets.PADDLE_HTTP_ENDPOINT }}
VLM_CAPTION_ENDPOINT: ${{ secrets.VLM_CAPTION_ENDPOINT }}
VLM_CAPTION_MODEL_NAME: ${{ secrets.VLM_CAPTION_MODEL_NAME }}
YOLOX_GRAPHIC_ELEMENTS_HTTP_ENDPOINT: ${{ secrets.YOLOX_GRAPHIC_ELEMENTS_HTTP_ENDPOINT }}
YOLOX_HTTP_ENDPOINT: ${{ secrets.YOLOX_HTTP_ENDPOINT }}
YOLOX_TABLE_STRUCTURE_HTTP_ENDPOINT: ${{ secrets.YOLOX_TABLE_STRUCTURE_HTTP_ENDPOINT }}
110 changes: 110 additions & 0 deletions .github/workflows/ci-pull-request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
name: Pull Request Validation

on:
pull_request:
types:
- opened
- synchronize
- reopened
pull_request_target:
types:
- opened
- synchronize
- reopened
- labeled

concurrency:
group: ${{ github.workflow }}-pr-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
# Fast pre-commit checks (runs first)
pre-commit:
name: Pre-commit Checks
runs-on: ubuntu-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4

- uses: actions/setup-python@v3

- uses: pre-commit/action@v3.0.1

# Docker build + test for x86_64 (single job so built image is available locally)
docker-build-and-test:
name: Build & Test Docker (amd64)
uses: ./.github/workflows/reusable-docker-build-and-test.yml
with:
platform: 'linux/amd64'
target: 'test'
tags: 'nv-ingest:pr-${{ github.event.pull_request.number }}'
base-image: 'ubuntu'
base-image-tag: 'jammy-20250415.1'
test-selection: 'full'
pytest-markers: 'not integration'
coverage: true
runner: 'linux-large-disk'
secrets:
HF_ACCESS_TOKEN: ${{ secrets.HF_ACCESS_TOKEN }}

# Library mode integration tests (requires approval for external contributors)
library-mode-check-access:
name: Check Library Mode Test Access
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-latest
outputs:
has-access: ${{ steps.check.outputs.has-access }}
steps:
- name: Check access
id: check
run: |
HAS_ACCESS="false"
if [[ "${{ github.event.pull_request.author_association }}" == "MEMBER" ]] || \
[[ "${{ github.event.pull_request.author_association }}" == "COLLABORATOR" ]] || \
[[ "${{ github.event.pull_request.author_association }}" == "OWNER" ]] || \
[[ "${{ contains(github.event.pull_request.labels.*.name, 'ok-to-test') }}" == "true" ]]; then
HAS_ACCESS="true"
fi
echo "has-access=$HAS_ACCESS" >> $GITHUB_OUTPUT

library-mode-test:
name: Test Library Mode
needs: library-mode-check-access
if: |
github.event_name == 'pull_request_target' &&
needs.library-mode-check-access.outputs.has-access == 'true'
uses: ./.github/workflows/reusable-integration-test.yml
with:
runner: 'ubuntu-latest'
timeout-minutes: 60
source-ref: ${{ github.event.pull_request.head.sha }}
secrets:
AUDIO_FUNCTION_ID: ${{ secrets.AUDIO_FUNCTION_ID }}
EMBEDDING_NIM_MODEL_NAME: ${{ secrets.EMBEDDING_NIM_MODEL_NAME }}
NEMOTRON_PARSE_MODEL_NAME: ${{ secrets.NEMOTRON_PARSE_MODEL_NAME }}
NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
PADDLE_HTTP_ENDPOINT: ${{ secrets.PADDLE_HTTP_ENDPOINT }}
VLM_CAPTION_ENDPOINT: ${{ secrets.VLM_CAPTION_ENDPOINT }}
VLM_CAPTION_MODEL_NAME: ${{ secrets.VLM_CAPTION_MODEL_NAME }}
YOLOX_GRAPHIC_ELEMENTS_HTTP_ENDPOINT: ${{ secrets.YOLOX_GRAPHIC_ELEMENTS_HTTP_ENDPOINT }}
YOLOX_HTTP_ENDPOINT: ${{ secrets.YOLOX_HTTP_ENDPOINT }}
YOLOX_TABLE_STRUCTURE_HTTP_ENDPOINT: ${{ secrets.YOLOX_TABLE_STRUCTURE_HTTP_ENDPOINT }}

# Summary job
pr-validation-complete:
name: PR Validation Complete
needs:
- pre-commit
- docker-build-and-test
runs-on: ubuntu-latest
if: always()
steps:
- name: Check job results
run: |
if [[ "${{ needs.pre-commit.result }}" != "success" ]] || \
[[ "${{ needs.docker-build-and-test.result }}" != "success" ]]; then
echo "One or more required jobs failed"
exit 1
fi
echo "All required PR checks passed!"
Loading
Loading