Asset Processor#
The Asset Processor is a sample implementation that demonstrates how to build a web front-end on top of the aif-pipeline CLI. In server mode, the Flask back-end calls aif-pipeline convert, optimize, validate, run, and metadata commands through subprocess. Those CLI commands in turn use the Omniverse SDKs and APIs (Scene Optimizer, omni.usd, pxr). You can adapt or extend the pattern for your own pipeline tooling.
The interface also includes a visual preset builder for composing Scene Optimizer presets. The output is a JSON preset file compatible with the aif-pipeline CLI.
What the Sample Covers#
The web interface exposes the same operations available through the aif-pipeline CLI:
Convert - CAD-to-USD conversion
Optimize - Run Scene Optimizer presets
Validate - Asset validation (OAV and AIF rules)
Metadata - Apply and update metadata templates
Run - Full pipeline execution
It also provides two browser-only features: a visual preset builder for composing Scene Optimizer presets and a metadata template editor.
Prerequisites#
Complete Setup first. You should have:
USD Composer installed and built (Kit)
aif-pipelineCLI installed and verified (aif-pipeline --versionprints a version number)Virtual environment active (
.venv/exists in the repo root)AIF_PIPELINE_SAMPLES_ROOTenvironment variable set (needed by Python processors)
If any of these are missing, return to Setup and complete all four steps.
Opening the Tool#
Start the server from the aif-pipeline-samples repo root:
uv run python asset_processor/server.py
You should see output like:
* Running on http://127.0.0.1:8080
Open http://127.0.0.1:8080 in your browser. The landing page shows the Conversion panel with Kit configuration cards.
Important
Closing the browser does not stop the server. The server process continues running in the terminal where you started it. You must stop it explicitly:
Press Ctrl+C in the server terminal, or
Close the terminal window.
If you forget to stop it, the next time you try to start the server you will get an “Address already in use” error. Refer to Troubleshooting below for how to find and kill a stale server process.
Use a dedicated terminal for the server so your main terminal stays free for CLI commands.
Open a second PowerShell window for CLI work while the server runs in the first.
You can also background the server and redirect its output:
uv run python asset_processor/server.py > /dev/null 2>&1 &
To stop a backgrounded server later:
kill %1
# or find and kill by port:
kill $(lsof -t -i:8080)
Tip
A static mode (no server) is also available for preset editing only. Refer to asset_processor/README.md in the repository for details.
Kit Configurations#
You should already have at least one Kit configuration from Step 2: Add a Kit Configuration in the Quickstart. If you do, the landing page shows a card with the Kit version, executable path, and an Active badge. If you see No Kit configurations found instead, click + Add in the UI to add one (or use the CLI: aif-pipeline config add <name> --from).
You can maintain multiple Kit configurations at the same time - for example, a production 109.x build and a preview 110.x build. Each configuration carries its own Kit executable path, release directory, validator versions, and processing settings. This lets you test the same assets against different Kit versions or validation rule sets without editing config files.
Click a card to switch the active configuration. The clicked card turns green with an Active badge. All CLI operations (convert, optimize, validate) run against that Kit installation.
To add more configurations:
From the UI: Click + Add in the top bar. In the dialog, provide a name (for example,
composer-109) and the Kit project root - the directory containingrepo.bat/repo.sh(Kit App Template) or the top-level NGC extract directory. Do not point to_build/or a subdirectory. The tool resolves those automatically. After clicking Add, the new card appears and is auto-activated if it is the only configuration.From the CLI:
aif-pipeline config add <name> --from <kit_project_root>
To delete a configuration, hover over its card and click the trash icon. A confirmation dialog appears before deletion.
Tip
Configuration files are stored on disk at ~/.aif-pipeline/ (that is, %USERPROFILE%\.aif-pipeline\ on Windows). Each named config is a YAML file named <name>_config.yaml, and the currently active config is a copy at config.yaml. You can manually inspect, edit, or remove these files to clean up stale or duplicate entries.
Updating the Processor Library#
The processor library (left panel in the Preset Factory) reflects the Scene Optimizer operations available in the active Kit configuration. If you switch to a different Kit config, click Update Library to refresh the processor list. The update launches Kit in headless mode, extracts all available operations and their parameters, and regenerates the processor definitions. Progress streams in the browser. The page reloads automatically when the update completes.
Note
The library update requires a working Kit executable. If the update fails with a Kit path error, verify that your active Kit configuration points to a valid build (see Kit Configurations above and Quickstart).
For CLI-based and manual update methods, refer to asset_processor/README.md in the repository.
Preset Best Practices#
Refer to Scene Optimizer Presets for the recommended processor order based on the generic preset.
Processor Categories#
Category |
Purpose |
|---|---|
Stage Setup |
Units, up-axis, transforms |
Geometry |
Mesh cleanup, decimation, normals |
UVs |
Atlas UVs, projection UVs |
Materials |
Consolidation, cleanup |
Optimization |
Deduplication, primvars, time samples |
Hierarchy |
Flattening, pivot adjustments |
Cleanup |
Empty prims, small geometry |
Analysis |
Diagnostics, statistics |
Finalization |
Compute extents, print stats |
Python Library |
Custom processors from |
Python Processors#
The preset builder supports library processors from so/generic/lib/ and custom Python scripts. Refer to Scene Optimizer Presets for development patterns and asset_processor/README.md in the repository for UI-specific details.
Loading Existing Presets#
Click Load Preset and select a Scene Optimizer JSON file. The tool reconstructs the processor cards. Built-in operations match automatically. Python scripts match to library processors when possible.
Example presets in the repo: so/generic/generic_preset.json, so/spt/gb300/, so/trane/, so/vertiv/.
Troubleshooting#
Server does not start - port already in use#
If you see Address already in use or OSError: [Errno 98], a previous server process is still running. This typically happens when you closed the browser or terminal without pressing Ctrl+C first (remember: closing the browser does not stop the server).
# Find the process using port 8080
netstat -ano | findstr :8080
# Kill it by PID (replace 12345 with the actual PID from the output above)
taskkill /PID 12345 /F
# Find and kill the process on port 8080
kill $(lsof -t -i:8080)
# If lsof is not available:
fuser -k 8080/tcp
For additional troubleshooting, refer to asset_processor/README.md in the repository.
See also
Quickstart - Quickstart tutorial
Scene Optimizer Presets - Preset concepts and examples
CLI Reference - aif-pipeline CLI reference