0
stars
61
commits
Python
primary language
Jun 23, 2026
updated
AI-driven game asset generation pipeline β Kubernetes-style client/server architecture for 3D game development.
π Full Documentation β aallbrig.github.io/assgen
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β assgen (client CLI) β
β βββ visual model create --prompt "sword" --wait β
β βββ audio sfx generate "laser blast" --wait β
β βββ jobs list / status / wait / cancel β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β HTTP (REST)
βββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ
β assgen-server β
β βββ FastAPI REST API (/jobs /models /health) β
β βββ WorkerThread (polls SQLite queue) β
β βββ ModelManager (HuggingFace Hub download/cache) β
β βββ Validation (allow-list + HF tag check) β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
~/.config/assgen/assgen.db (SQLite)
~/.local/share/assgen/models/ (model cache)
The client auto-detects whether a server is configured:
server_url is set in ~/.config/assgen/client.yaml β use that server.assgen-server process (PID-tracked) and use it.This lets you run the server on a powerful GPU machine and point your laptop's client at it, or just run everything locally.
pip install assgen
# For GPU inference (RTX 4070 recommended):
pip install "assgen[inference]"
[inference]extra: Installstorch,transformers,diffusers,accelerate, andtrimeshfor local GPU inference. Without it, assgen is a fully functional client that can talk to a remoteassgen-server, but a local server will return stub outputs instead of running real models.For CI environments or machines without a GPU,
pip install assgen(without[inference]) is the right choice.
Clone and run from source:
git clone https://github.com/aallbrig/assgen.git
cd assgen
# Create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate # Linux / macOS
# .venv\Scripts\activate # Windows PowerShell
# Install in editable mode with dev dependencies
pip install -e ".[dev]"
# For GPU inference (optional β needs CUDA-capable GPU):
pip install -e ".[dev,inference]"
# Verify the install
assgen version
assgen-server --help
Run tests: pytest -v (or make test)
Version note: assgen uses
hatch-vcsto derive its version from git tags. If you install without a git tag (fresh clone, no tags), the version will appear as0.1.dev0. Rungit tag v0.1.0to set a version, or ignore the warning β it does not affect functionality.
# Check version
assgen version
# Start local server (optional β client auto-starts if not configured)
assgen-server start --daemon
# Once the server is running, explore the REST API interactively:
# http://127.0.0.1:8432/docs (Swagger UI)
# http://127.0.0.1:8432/redoc (ReDoc)
# http://127.0.0.1:8432/health (health check)
# Generate a 3D model
assgen visual model create --prompt "low-poly medieval sword" --wait
# Generate sound effects
assgen audio sfx generate "laser gun firing" --wait
# Generate background music
assgen audio music compose "epic orchestral battle theme" --duration 30 --wait
# Auto-rig a character
assgen visual rig auto character.glb --wait
# List recent jobs
assgen jobs list
# Point client at a remote GPU server
assgen client config set-server http://my-gpu-machine:8432
# View full game dev task β model catalog
assgen tasks
# Show current server config
assgen server config show
assgen-servervsassgen server:
assgen-server startβ runs the inference server directly (the process itself)assgen server startβ tells the client to launch a localassgen-serverprocess for youassgen server status/assgen server stopβ manage the locally auto-started serverFor a remote GPU machine, run
assgen-server start --daemonthere, then on your laptop:assgen client config set-server http://<gpu-machine>:8432
assgen
βββ tasks # View all game dev tasks and their assigned models
β βββ [--domain DOMAIN] # filter by visual / audio / scene / pipeline / qa / support
βββ visual # All 3D visual assets
β βββ concept # AI concept art (SDXL)
β β βββ generate # text β concept art
β β βββ ref # multi-view reference sheet
β β βββ style # art style samples
β βββ blockout # Greybox prototyping
β β βββ create # text/image β blockout mesh
β β βββ assemble # combine pieces into scene
β β βββ iterate # quick variation
β βββ model # 3D mesh generation
β β βββ create # text/image β .glb (TripoSR)
β β βββ highpoly # high-poly refinement
β β βββ retopo # auto-retopology
β β βββ splat # Gaussian Splatting (3DGS)
β β βββ edit # deform / boolean / combine
β β βββ optimize # LOD generation
β β βββ export # convert to engine format
β βββ uv # UV unwrapping
β β βββ auto # AI smart-unwrap
β β βββ manual # seam suggestions
β β βββ optimize # texel density optimisation
β βββ texture # PBR texturing & baking
β β βββ generate # text β albedo + PBR maps
β β βββ apply # project onto mesh
β β βββ bake # high-to-low bake
β β βββ pbr # full PBR material set
β βββ rig # Character rigging
β β βββ auto # auto-skeleton (UniRig)
β β βββ skin # skin weight maps
β β βββ retarget # rig retargeting
β βββ animate # Animation generation
β β βββ keyframe # text β animation (AnimateDiff)
β β βββ mocap # video β motion capture
β β βββ blend # mix/loop animations
β β βββ retarget # animation retargeting
β βββ vfx # VFX & particles
β β βββ particle # particle sprite sheets
β β βββ decal # dynamic decal textures
β β βββ sim # physics VFX bake
β βββ ui # UI/HUD elements
β βββ icon # icons & sprites
β βββ hud # health bars, minimaps
β βββ overlay # 2D canvas overlays
βββ audio # Sound & music
β βββ sfx # Sound effects (AudioLDM2)
β β βββ generate # text β WAV
β β βββ edit # pitch/reverb/layer
β β βββ library # browse local SFX library
β βββ music # Music (MusicGen)
β β βββ compose # text β music track
β β βββ loop # seamless loop generation
β β βββ adaptive # mood-based stems
β βββ voice # Voice synthesis (Bark)
β βββ tts # text β speech
β βββ clone # voice cloning
β βββ dialog # batch NPC dialog
βββ scene # Physics + lighting data
β βββ physics # Collision & simulation
β β βββ collider # optimised collision mesh
β β βββ rigid # rigid body setup
β β βββ cloth # cloth/hair simulation bake
β β βββ export # engine physics export
β βββ lighting # Lighting assets
β βββ hdri # text β HDR sky map
β βββ probes # reflection/irradiance probes
β βββ volumetrics # fog, clouds, atmosphere
β βββ bake # GI lightmap bake
βββ pipeline # Orchestration
β βββ workflow # Multi-step workflows
β β βββ create # define step sequence
β β βββ run # execute with inputs
β β βββ list # browse saved workflows
β βββ batch # Batch processing
β β βββ queue # enqueue from JSON manifest
β β βββ variant # style/damage variants
β β βββ status # batch queue overview
β βββ integrate # Engine integration
β βββ export # engine-specific export
β βββ prefab # bundle into prefab
β βββ script # behavior stubs
βββ support # Narrative & data
β βββ narrative
β β βββ dialog # NPC dialog trees
β β βββ lore # world-building text
β βββ data
β βββ lightmap # AI lightmap baking
β βββ proc # procedural gen scripts
βββ qa # Quality assurance
β βββ validate # mesh/UV/normal checks
β βββ perf # polygon/VRAM analysis
β βββ style # art style consistency
β βββ report # full QA report
βββ jobs # Job management
β βββ list # list all jobs
β βββ status <id> # single job status (8-char prefix ok)
β βββ wait <id> # wait with progress bar
β βββ cancel <id> # cancel a job
β βββ clean # remove old jobs from DB
βββ models # Model management
β βββ list # catalog + install status
β βββ status <id> # single model details
β βββ install [id...] # download from HuggingFace
βββ config # Task β model catalog management
β βββ list [--domain] # browse all job types and their models
β βββ show <job-type> # detail for one job type
β βββ set <job-type> # set model for a job type (interactive HF search)
β βββ remove <job-type> # revert user override β built-in catalog
β βββ search <query> # search HuggingFace for compatible models
βββ client # Client-side configuration
β βββ config
β βββ show # show resolved server URL + health check
β βββ set-server <url> # point client at a remote server
β βββ unset-server # revert to auto-start local server
βββ server # Server management
βββ start [--daemon] # start local server
βββ stop # stop local server
βββ status # server health check
βββ config
β βββ show # show all server settings
β βββ set <key> <val> # persist a setting to server.yaml
β βββ models [--domain] # view/manage task β model catalog
βββ use <url> # (alias for client config set-server)
βββ unset # (alias for client config unset-server)
Config lives in the OS-appropriate directory (XDG on Linux/macOS, %APPDATA% on Windows):
| File | Purpose |
|---|---|
client.yaml | Server URL, poll interval, default --wait |
server.yaml | Host, port, device, security policy |
models.yaml | User catalog overrides (task β HF model) |
assgen.db | SQLite job database |
server.pid | Running local server PID |
# ~/.config/assgen/client.yaml
server_url: null # null = auto-start local server
default_wait: false
poll_interval: 2.0
# ~/.config/assgen/server.yaml
host: "127.0.0.1"
port: 8432
device: "auto" # auto | cuda | cpu
log_level: "info"
# Security / model governance
allow_list: [] # [] = allow all models; restrict with a list:
# allow_list: ["stabilityai/TripoSR", "cvssp/audioldm2"]
skip_model_validation: false # true = bypass HF pipeline_tag compatibility checks
Every game-dev task maps to a HuggingFace model. The built-in catalog lives in
src/assgen/catalog.yaml. Users can override any entry:
# Browse all tasks and their models
assgen tasks
# Override the model for a task (interactive HF Hub search)
assgen config set visual.model.create
# Or specify directly
assgen config set visual.model.create --model-id stabilityai/TripoSR
# Revert to built-in
assgen config remove visual.model.create
Client-side overrides are stored in ~/.config/assgen/models.yaml and sent
with each job submission (via the model_id field in the job request).
When a job is submitted the server validates the requested model against the task type using the HuggingFace Hub API:
allow_list is non-empty in server.yaml, only
models on the list may be downloaded/used.pipeline_tag from HF Hub is checked
against a compatibility table for the task (e.g., a TTS model will be
rejected for visual.model.create which expects image-to-3d).# Restrict downloads to approved models only
assgen server config set allow_list '["stabilityai/TripoSR","cvssp/audioldm2"]'
# Trust all models (default)
assgen server config set allow_list '[]'
# Skip compatibility checks (useful for research / experimental models)
assgen server config set skip_model_validation true
When skip_model_validation: false (default) and the HF Hub API is
unreachable, the server allows the model (fail-open for offline use).
# /etc/systemd/system/assgen-server.service
[Unit]
Description=assgen asset generation server
After=network.target
[Service]
Type=simple
User=youruser
ExecStart=/path/to/.venv/bin/assgen-server start
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl enable --now assgen-server
journalctl -u assgen-server -f # follow JSON-structured logs
device: "cuda" in server.yaml for GPU accelerationdevice: "cpu" works but is slowerHF_TOKEN env var for authenticated Hub downloads (higher rate limits)The worker dispatches each job_type to assgen/server/handlers/<job_type>.py.
Create a module with a run() function:
# src/assgen/server/handlers/visual_model_create.py
from pathlib import Path
from typing import Any, Callable
def run(
job_type: str,
params: dict[str, Any],
model_id: str | None,
model_path: str | None,
device: str,
progress_cb: Callable[[float, str], None],
output_dir: str,
) -> dict[str, Any]:
progress_cb(0.2, "Loading model")
# ... load transformers pipeline from model_path ...
progress_cb(0.8, "Running inference")
# ... write output files to output_dir ...
return {
"files": ["output.glb"],
"metadata": {"model": model_id},
}
Without a handler, jobs run through the stub handler (which simulates steps and returns immediately β useful for development).
PRs welcome. CI runs on every push/PR:
ruff check β lintingpytest -v β unit tests (no GPU required)pip install -e ".[dev]"
ruff check src/ tests/
pytest -v
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β assgen (client CLI) β
β βββ visual model create --prompt "sword" --wait β
β βββ audio sfx generate "laser blast" --wait β
β βββ jobs list / status / wait / cancel β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β HTTP (REST)
βββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ
β assgen-server β
β βββ FastAPI REST API (/jobs /models /health) β
β βββ WorkerThread (polls SQLite queue) β
β βββ ModelManager (HuggingFace Hub download/cache) β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
~/.config/assgen/assgen.db (SQLite)
~/.local/share/assgen/models/ (model cache)
The client auto-detects whether a server is configured:
server_url is set in ~/.config/assgen/client.yaml β use that server.assgen-server process (PID-tracked) and use it.This lets you run the server on a powerful GPU machine and point your laptop's client at it, or just run everything locally.
pip install assgen
# For GPU inference (RTX 4070 recommended):
pip install "assgen[inference]"
# Check version
assgen version
# Start local server (optional β client auto-starts if not configured)
assgen-server start --daemon
# Generate a 3D model
assgen visual model create --prompt "low-poly medieval sword" --wait
# Generate sound effects
assgen audio sfx generate "laser gun firing" --wait
# Generate background music
assgen audio music compose "epic orchestral battle theme" --duration 30 --wait
# Auto-rig a character
assgen visual rig auto character.glb --wait
# List recent jobs
assgen jobs list
# Point client at a remote server
assgen server use http://my-gpu-machine:8432
assgen
βββ visual # All 3D visual assets
β βββ concept # AI concept art (SDXL)
β β βββ generate # text β concept art
β β βββ ref # multi-view reference sheet
β β βββ style # art style samples
β βββ blockout # Greybox prototyping
β β βββ create # text/image β blockout mesh
β β βββ assemble # combine pieces into scene
β β βββ iterate # quick variation
β βββ model # 3D mesh generation
β β βββ create # text/image β .glb (TripoSR)
β β βββ highpoly # high-poly refinement
β β βββ retopo # auto-retopology
β β βββ splat # Gaussian Splatting (3DGS)
β β βββ edit # deform / boolean / combine
β β βββ optimize # LOD generation
β β βββ export # convert to engine format
β βββ uv # UV unwrapping
β β βββ auto # AI smart-unwrap
β β βββ manual # seam suggestions
β β βββ optimize # texel density optimisation
β βββ texture # PBR texturing & baking
β β βββ generate # text β albedo + PBR maps
β β βββ apply # project onto mesh
β β βββ bake # high-to-low bake
β β βββ pbr # full PBR material set
β βββ rig # Character rigging
β β βββ auto # auto-skeleton (UniRig)
β β βββ skin # skin weight maps
β β βββ retarget # rig retargeting
β βββ animate # Animation generation
β β βββ keyframe # text β animation (AnimateDiff)
β β βββ mocap # video β motion capture
β β βββ blend # mix/loop animations
β β βββ retarget # animation retargeting
β βββ vfx # VFX & particles
β β βββ particle # particle sprite sheets
β β βββ decal # dynamic decal textures
β β βββ sim # physics VFX bake
β βββ ui # UI/HUD elements
β βββ icon # icons & sprites
β βββ hud # health bars, minimaps
β βββ overlay # 2D canvas overlays
βββ audio # Sound & music
β βββ sfx # Sound effects (AudioLDM2)
β β βββ generate # text β WAV
β β βββ edit # pitch/reverb/layer
β β βββ library # browse local SFX library
β βββ music # Music (MusicGen)
β β βββ compose # text β music track
β β βββ loop # seamless loop generation
β β βββ adaptive # mood-based stems
β βββ voice # Voice synthesis (Bark)
β βββ tts # text β speech
β βββ clone # voice cloning
β βββ dialog # batch NPC dialog
βββ scene # Physics + lighting data
β βββ physics # Collision & simulation
β β βββ collider # optimised collision mesh
β β βββ rigid # rigid body setup
β β βββ cloth # cloth/hair simulation bake
β β βββ export # engine physics export
β βββ lighting # Lighting assets
β βββ hdri # text β HDR sky map
β βββ probes # reflection/irradiance probes
β βββ volumetrics # fog, clouds, atmosphere
β βββ bake # GI lightmap bake
βββ pipeline # Orchestration
β βββ workflow # Multi-step workflows
β β βββ create # define step sequence
β β βββ run # execute with inputs
β β βββ list # browse saved workflows
β βββ batch # Batch processing
β β βββ queue # enqueue from JSON manifest
β β βββ variant # style/damage variants
β β βββ status # batch queue overview
β βββ integrate # Engine integration
β βββ export # engine-specific export
β βββ prefab # bundle into prefab
β βββ script # behavior stubs
βββ support # Narrative & data
β βββ narrative
β β βββ dialog # NPC dialog trees
β β βββ lore # world-building text
β βββ data
β βββ lightmap # AI lightmap baking
β βββ proc # procedural gen scripts
βββ qa # Quality assurance
β βββ validate # mesh/UV/normal checks
β βββ perf # polygon/VRAM analysis
β βββ style # art style consistency
β βββ report # full QA report
βββ jobs # Job management
β βββ list # list all jobs
β βββ status <id> # single job status
β βββ wait <id> # wait with progress bar
β βββ cancel <id> # cancel a job
β βββ clean # remove old jobs from DB
βββ models # Model management
β βββ list # catalog + install status
β βββ status <id> # single model details
β βββ install [id...] # download from HuggingFace
βββ server # Server management
βββ start [--daemon] # start local server
βββ stop # stop local server
βββ status # server health check
βββ config # show resolved config
βββ use <url> # point client at server
βββ unset # revert to auto-start
Config lives in the OS-appropriate directory (XDG on Linux/macOS, %APPDATA% on Windows):
| File | Purpose |
|---|---|
client.yaml | Server URL, poll interval, default --wait |
server.yaml | Host, port, device (cuda/cpu), log level |
models.yaml | User catalog overrides |
assgen.db | SQLite job database |
server.pid | Running local server PID |
# ~/.config/assgen/client.yaml
server_url: null # null = auto-start local server
default_wait: false
poll_interval: 2.0
# ~/.config/assgen/server.yaml
host: "127.0.0.1"
port: 8432
device: "auto" # auto | cuda | cpu
log_level: "info"
# /etc/systemd/system/assgen-server.service
[Unit]
Description=assgen asset generation server
After=network.target
[Service]
Type=simple
User=youruser
ExecStart=/path/to/.venv/bin/assgen-server start
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl enable --now assgen-server
journalctl -u assgen-server -f # follow JSON-structured logs
device: "cuda" in server.yaml for GPU accelerationdevice: "cpu" works but is slowerHF_TOKEN env var for authenticated Hub downloads (higher rate limits)The worker dispatches each job_type to assgen/server/handlers/<job_type>.py.
Create a module with a run() function:
# src/assgen/server/handlers/visual_model_create.py
from pathlib import Path
from typing import Any, Callable
def run(
job_type: str,
params: dict[str, Any],
model_id: str | None,
model_path: str | None,
device: str,
progress_cb: Callable[[float, str], None],
output_dir: str,
) -> dict[str, Any]:
progress_cb(0.2, "Loading model")
# ... load transformers pipeline from model_path ...
progress_cb(0.8, "Running inference")
# ... write output files to output_dir ...
return {
"files": ["output.glb"],
"metadata": {"model": model_id},
}
Without a handler, jobs run through the stub handler (which simulates steps and returns immediately β useful for development).
Python
99.7%
0
stars
61
commits
Python
primary language
Jun 23, 2026
updated
AI-driven game asset generation pipeline β Kubernetes-style client/server architecture for 3D game development.
π Full Documentation β aallbrig.github.io/assgen
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β assgen (client CLI) β
β βββ visual model create --prompt "sword" --wait β
β βββ audio sfx generate "laser blast" --wait β
β βββ jobs list / status / wait / cancel β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β HTTP (REST)
βββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ
β assgen-server β
β βββ FastAPI REST API (/jobs /models /health) β
β βββ WorkerThread (polls SQLite queue) β
β βββ ModelManager (HuggingFace Hub download/cache) β
β βββ Validation (allow-list + HF tag check) β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
~/.config/assgen/assgen.db (SQLite)
~/.local/share/assgen/models/ (model cache)
The client auto-detects whether a server is configured:
server_url is set in ~/.config/assgen/client.yaml β use that server.assgen-server process (PID-tracked) and use it.This lets you run the server on a powerful GPU machine and point your laptop's client at it, or just run everything locally.
pip install assgen
# For GPU inference (RTX 4070 recommended):
pip install "assgen[inference]"
[inference]extra: Installstorch,transformers,diffusers,accelerate, andtrimeshfor local GPU inference. Without it, assgen is a fully functional client that can talk to a remoteassgen-server, but a local server will return stub outputs instead of running real models.For CI environments or machines without a GPU,
pip install assgen(without[inference]) is the right choice.
Clone and run from source:
git clone https://github.com/aallbrig/assgen.git
cd assgen
# Create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate # Linux / macOS
# .venv\Scripts\activate # Windows PowerShell
# Install in editable mode with dev dependencies
pip install -e ".[dev]"
# For GPU inference (optional β needs CUDA-capable GPU):
pip install -e ".[dev,inference]"
# Verify the install
assgen version
assgen-server --help
Run tests: pytest -v (or make test)
Version note: assgen uses
hatch-vcsto derive its version from git tags. If you install without a git tag (fresh clone, no tags), the version will appear as0.1.dev0. Rungit tag v0.1.0to set a version, or ignore the warning β it does not affect functionality.
# Check version
assgen version
# Start local server (optional β client auto-starts if not configured)
assgen-server start --daemon
# Once the server is running, explore the REST API interactively:
# http://127.0.0.1:8432/docs (Swagger UI)
# http://127.0.0.1:8432/redoc (ReDoc)
# http://127.0.0.1:8432/health (health check)
# Generate a 3D model
assgen visual model create --prompt "low-poly medieval sword" --wait
# Generate sound effects
assgen audio sfx generate "laser gun firing" --wait
# Generate background music
assgen audio music compose "epic orchestral battle theme" --duration 30 --wait
# Auto-rig a character
assgen visual rig auto character.glb --wait
# List recent jobs
assgen jobs list
# Point client at a remote GPU server
assgen client config set-server http://my-gpu-machine:8432
# View full game dev task β model catalog
assgen tasks
# Show current server config
assgen server config show
assgen-servervsassgen server:
assgen-server startβ runs the inference server directly (the process itself)assgen server startβ tells the client to launch a localassgen-serverprocess for youassgen server status/assgen server stopβ manage the locally auto-started serverFor a remote GPU machine, run
assgen-server start --daemonthere, then on your laptop:assgen client config set-server http://<gpu-machine>:8432
assgen
βββ tasks # View all game dev tasks and their assigned models
β βββ [--domain DOMAIN] # filter by visual / audio / scene / pipeline / qa / support
βββ visual # All 3D visual assets
β βββ concept # AI concept art (SDXL)
β β βββ generate # text β concept art
β β βββ ref # multi-view reference sheet
β β βββ style # art style samples
β βββ blockout # Greybox prototyping
β β βββ create # text/image β blockout mesh
β β βββ assemble # combine pieces into scene
β β βββ iterate # quick variation
β βββ model # 3D mesh generation
β β βββ create # text/image β .glb (TripoSR)
β β βββ highpoly # high-poly refinement
β β βββ retopo # auto-retopology
β β βββ splat # Gaussian Splatting (3DGS)
β β βββ edit # deform / boolean / combine
β β βββ optimize # LOD generation
β β βββ export # convert to engine format
β βββ uv # UV unwrapping
β β βββ auto # AI smart-unwrap
β β βββ manual # seam suggestions
β β βββ optimize # texel density optimisation
β βββ texture # PBR texturing & baking
β β βββ generate # text β albedo + PBR maps
β β βββ apply # project onto mesh
β β βββ bake # high-to-low bake
β β βββ pbr # full PBR material set
β βββ rig # Character rigging
β β βββ auto # auto-skeleton (UniRig)
β β βββ skin # skin weight maps
β β βββ retarget # rig retargeting
β βββ animate # Animation generation
β β βββ keyframe # text β animation (AnimateDiff)
β β βββ mocap # video β motion capture
β β βββ blend # mix/loop animations
β β βββ retarget # animation retargeting
β βββ vfx # VFX & particles
β β βββ particle # particle sprite sheets
β β βββ decal # dynamic decal textures
β β βββ sim # physics VFX bake
β βββ ui # UI/HUD elements
β βββ icon # icons & sprites
β βββ hud # health bars, minimaps
β βββ overlay # 2D canvas overlays
βββ audio # Sound & music
β βββ sfx # Sound effects (AudioLDM2)
β β βββ generate # text β WAV
β β βββ edit # pitch/reverb/layer
β β βββ library # browse local SFX library
β βββ music # Music (MusicGen)
β β βββ compose # text β music track
β β βββ loop # seamless loop generation
β β βββ adaptive # mood-based stems
β βββ voice # Voice synthesis (Bark)
β βββ tts # text β speech
β βββ clone # voice cloning
β βββ dialog # batch NPC dialog
βββ scene # Physics + lighting data
β βββ physics # Collision & simulation
β β βββ collider # optimised collision mesh
β β βββ rigid # rigid body setup
β β βββ cloth # cloth/hair simulation bake
β β βββ export # engine physics export
β βββ lighting # Lighting assets
β βββ hdri # text β HDR sky map
β βββ probes # reflection/irradiance probes
β βββ volumetrics # fog, clouds, atmosphere
β βββ bake # GI lightmap bake
βββ pipeline # Orchestration
β βββ workflow # Multi-step workflows
β β βββ create # define step sequence
β β βββ run # execute with inputs
β β βββ list # browse saved workflows
β βββ batch # Batch processing
β β βββ queue # enqueue from JSON manifest
β β βββ variant # style/damage variants
β β βββ status # batch queue overview
β βββ integrate # Engine integration
β βββ export # engine-specific export
β βββ prefab # bundle into prefab
β βββ script # behavior stubs
βββ support # Narrative & data
β βββ narrative
β β βββ dialog # NPC dialog trees
β β βββ lore # world-building text
β βββ data
β βββ lightmap # AI lightmap baking
β βββ proc # procedural gen scripts
βββ qa # Quality assurance
β βββ validate # mesh/UV/normal checks
β βββ perf # polygon/VRAM analysis
β βββ style # art style consistency
β βββ report # full QA report
βββ jobs # Job management
β βββ list # list all jobs
β βββ status <id> # single job status (8-char prefix ok)
β βββ wait <id> # wait with progress bar
β βββ cancel <id> # cancel a job
β βββ clean # remove old jobs from DB
βββ models # Model management
β βββ list # catalog + install status
β βββ status <id> # single model details
β βββ install [id...] # download from HuggingFace
βββ config # Task β model catalog management
β βββ list [--domain] # browse all job types and their models
β βββ show <job-type> # detail for one job type
β βββ set <job-type> # set model for a job type (interactive HF search)
β βββ remove <job-type> # revert user override β built-in catalog
β βββ search <query> # search HuggingFace for compatible models
βββ client # Client-side configuration
β βββ config
β βββ show # show resolved server URL + health check
β βββ set-server <url> # point client at a remote server
β βββ unset-server # revert to auto-start local server
βββ server # Server management
βββ start [--daemon] # start local server
βββ stop # stop local server
βββ status # server health check
βββ config
β βββ show # show all server settings
β βββ set <key> <val> # persist a setting to server.yaml
β βββ models [--domain] # view/manage task β model catalog
βββ use <url> # (alias for client config set-server)
βββ unset # (alias for client config unset-server)
Config lives in the OS-appropriate directory (XDG on Linux/macOS, %APPDATA% on Windows):
| File | Purpose |
|---|---|
client.yaml | Server URL, poll interval, default --wait |
server.yaml | Host, port, device, security policy |
models.yaml | User catalog overrides (task β HF model) |
assgen.db | SQLite job database |
server.pid | Running local server PID |
# ~/.config/assgen/client.yaml
server_url: null # null = auto-start local server
default_wait: false
poll_interval: 2.0
# ~/.config/assgen/server.yaml
host: "127.0.0.1"
port: 8432
device: "auto" # auto | cuda | cpu
log_level: "info"
# Security / model governance
allow_list: [] # [] = allow all models; restrict with a list:
# allow_list: ["stabilityai/TripoSR", "cvssp/audioldm2"]
skip_model_validation: false # true = bypass HF pipeline_tag compatibility checks
Every game-dev task maps to a HuggingFace model. The built-in catalog lives in
src/assgen/catalog.yaml. Users can override any entry:
# Browse all tasks and their models
assgen tasks
# Override the model for a task (interactive HF Hub search)
assgen config set visual.model.create
# Or specify directly
assgen config set visual.model.create --model-id stabilityai/TripoSR
# Revert to built-in
assgen config remove visual.model.create
Client-side overrides are stored in ~/.config/assgen/models.yaml and sent
with each job submission (via the model_id field in the job request).
When a job is submitted the server validates the requested model against the task type using the HuggingFace Hub API:
allow_list is non-empty in server.yaml, only
models on the list may be downloaded/used.pipeline_tag from HF Hub is checked
against a compatibility table for the task (e.g., a TTS model will be
rejected for visual.model.create which expects image-to-3d).# Restrict downloads to approved models only
assgen server config set allow_list '["stabilityai/TripoSR","cvssp/audioldm2"]'
# Trust all models (default)
assgen server config set allow_list '[]'
# Skip compatibility checks (useful for research / experimental models)
assgen server config set skip_model_validation true
When skip_model_validation: false (default) and the HF Hub API is
unreachable, the server allows the model (fail-open for offline use).
# /etc/systemd/system/assgen-server.service
[Unit]
Description=assgen asset generation server
After=network.target
[Service]
Type=simple
User=youruser
ExecStart=/path/to/.venv/bin/assgen-server start
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl enable --now assgen-server
journalctl -u assgen-server -f # follow JSON-structured logs
device: "cuda" in server.yaml for GPU accelerationdevice: "cpu" works but is slowerHF_TOKEN env var for authenticated Hub downloads (higher rate limits)The worker dispatches each job_type to assgen/server/handlers/<job_type>.py.
Create a module with a run() function:
# src/assgen/server/handlers/visual_model_create.py
from pathlib import Path
from typing import Any, Callable
def run(
job_type: str,
params: dict[str, Any],
model_id: str | None,
model_path: str | None,
device: str,
progress_cb: Callable[[float, str], None],
output_dir: str,
) -> dict[str, Any]:
progress_cb(0.2, "Loading model")
# ... load transformers pipeline from model_path ...
progress_cb(0.8, "Running inference")
# ... write output files to output_dir ...
return {
"files": ["output.glb"],
"metadata": {"model": model_id},
}
Without a handler, jobs run through the stub handler (which simulates steps and returns immediately β useful for development).
PRs welcome. CI runs on every push/PR:
ruff check β lintingpytest -v β unit tests (no GPU required)pip install -e ".[dev]"
ruff check src/ tests/
pytest -v
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β assgen (client CLI) β
β βββ visual model create --prompt "sword" --wait β
β βββ audio sfx generate "laser blast" --wait β
β βββ jobs list / status / wait / cancel β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β HTTP (REST)
βββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββ
β assgen-server β
β βββ FastAPI REST API (/jobs /models /health) β
β βββ WorkerThread (polls SQLite queue) β
β βββ ModelManager (HuggingFace Hub download/cache) β
βββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ
β
~/.config/assgen/assgen.db (SQLite)
~/.local/share/assgen/models/ (model cache)
The client auto-detects whether a server is configured:
server_url is set in ~/.config/assgen/client.yaml β use that server.assgen-server process (PID-tracked) and use it.This lets you run the server on a powerful GPU machine and point your laptop's client at it, or just run everything locally.
pip install assgen
# For GPU inference (RTX 4070 recommended):
pip install "assgen[inference]"
# Check version
assgen version
# Start local server (optional β client auto-starts if not configured)
assgen-server start --daemon
# Generate a 3D model
assgen visual model create --prompt "low-poly medieval sword" --wait
# Generate sound effects
assgen audio sfx generate "laser gun firing" --wait
# Generate background music
assgen audio music compose "epic orchestral battle theme" --duration 30 --wait
# Auto-rig a character
assgen visual rig auto character.glb --wait
# List recent jobs
assgen jobs list
# Point client at a remote server
assgen server use http://my-gpu-machine:8432
assgen
βββ visual # All 3D visual assets
β βββ concept # AI concept art (SDXL)
β β βββ generate # text β concept art
β β βββ ref # multi-view reference sheet
β β βββ style # art style samples
β βββ blockout # Greybox prototyping
β β βββ create # text/image β blockout mesh
β β βββ assemble # combine pieces into scene
β β βββ iterate # quick variation
β βββ model # 3D mesh generation
β β βββ create # text/image β .glb (TripoSR)
β β βββ highpoly # high-poly refinement
β β βββ retopo # auto-retopology
β β βββ splat # Gaussian Splatting (3DGS)
β β βββ edit # deform / boolean / combine
β β βββ optimize # LOD generation
β β βββ export # convert to engine format
β βββ uv # UV unwrapping
β β βββ auto # AI smart-unwrap
β β βββ manual # seam suggestions
β β βββ optimize # texel density optimisation
β βββ texture # PBR texturing & baking
β β βββ generate # text β albedo + PBR maps
β β βββ apply # project onto mesh
β β βββ bake # high-to-low bake
β β βββ pbr # full PBR material set
β βββ rig # Character rigging
β β βββ auto # auto-skeleton (UniRig)
β β βββ skin # skin weight maps
β β βββ retarget # rig retargeting
β βββ animate # Animation generation
β β βββ keyframe # text β animation (AnimateDiff)
β β βββ mocap # video β motion capture
β β βββ blend # mix/loop animations
β β βββ retarget # animation retargeting
β βββ vfx # VFX & particles
β β βββ particle # particle sprite sheets
β β βββ decal # dynamic decal textures
β β βββ sim # physics VFX bake
β βββ ui # UI/HUD elements
β βββ icon # icons & sprites
β βββ hud # health bars, minimaps
β βββ overlay # 2D canvas overlays
βββ audio # Sound & music
β βββ sfx # Sound effects (AudioLDM2)
β β βββ generate # text β WAV
β β βββ edit # pitch/reverb/layer
β β βββ library # browse local SFX library
β βββ music # Music (MusicGen)
β β βββ compose # text β music track
β β βββ loop # seamless loop generation
β β βββ adaptive # mood-based stems
β βββ voice # Voice synthesis (Bark)
β βββ tts # text β speech
β βββ clone # voice cloning
β βββ dialog # batch NPC dialog
βββ scene # Physics + lighting data
β βββ physics # Collision & simulation
β β βββ collider # optimised collision mesh
β β βββ rigid # rigid body setup
β β βββ cloth # cloth/hair simulation bake
β β βββ export # engine physics export
β βββ lighting # Lighting assets
β βββ hdri # text β HDR sky map
β βββ probes # reflection/irradiance probes
β βββ volumetrics # fog, clouds, atmosphere
β βββ bake # GI lightmap bake
βββ pipeline # Orchestration
β βββ workflow # Multi-step workflows
β β βββ create # define step sequence
β β βββ run # execute with inputs
β β βββ list # browse saved workflows
β βββ batch # Batch processing
β β βββ queue # enqueue from JSON manifest
β β βββ variant # style/damage variants
β β βββ status # batch queue overview
β βββ integrate # Engine integration
β βββ export # engine-specific export
β βββ prefab # bundle into prefab
β βββ script # behavior stubs
βββ support # Narrative & data
β βββ narrative
β β βββ dialog # NPC dialog trees
β β βββ lore # world-building text
β βββ data
β βββ lightmap # AI lightmap baking
β βββ proc # procedural gen scripts
βββ qa # Quality assurance
β βββ validate # mesh/UV/normal checks
β βββ perf # polygon/VRAM analysis
β βββ style # art style consistency
β βββ report # full QA report
βββ jobs # Job management
β βββ list # list all jobs
β βββ status <id> # single job status
β βββ wait <id> # wait with progress bar
β βββ cancel <id> # cancel a job
β βββ clean # remove old jobs from DB
βββ models # Model management
β βββ list # catalog + install status
β βββ status <id> # single model details
β βββ install [id...] # download from HuggingFace
βββ server # Server management
βββ start [--daemon] # start local server
βββ stop # stop local server
βββ status # server health check
βββ config # show resolved config
βββ use <url> # point client at server
βββ unset # revert to auto-start
Config lives in the OS-appropriate directory (XDG on Linux/macOS, %APPDATA% on Windows):
| File | Purpose |
|---|---|
client.yaml | Server URL, poll interval, default --wait |
server.yaml | Host, port, device (cuda/cpu), log level |
models.yaml | User catalog overrides |
assgen.db | SQLite job database |
server.pid | Running local server PID |
# ~/.config/assgen/client.yaml
server_url: null # null = auto-start local server
default_wait: false
poll_interval: 2.0
# ~/.config/assgen/server.yaml
host: "127.0.0.1"
port: 8432
device: "auto" # auto | cuda | cpu
log_level: "info"
# /etc/systemd/system/assgen-server.service
[Unit]
Description=assgen asset generation server
After=network.target
[Service]
Type=simple
User=youruser
ExecStart=/path/to/.venv/bin/assgen-server start
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
systemctl enable --now assgen-server
journalctl -u assgen-server -f # follow JSON-structured logs
device: "cuda" in server.yaml for GPU accelerationdevice: "cpu" works but is slowerHF_TOKEN env var for authenticated Hub downloads (higher rate limits)The worker dispatches each job_type to assgen/server/handlers/<job_type>.py.
Create a module with a run() function:
# src/assgen/server/handlers/visual_model_create.py
from pathlib import Path
from typing import Any, Callable
def run(
job_type: str,
params: dict[str, Any],
model_id: str | None,
model_path: str | None,
device: str,
progress_cb: Callable[[float, str], None],
output_dir: str,
) -> dict[str, Any]:
progress_cb(0.2, "Loading model")
# ... load transformers pipeline from model_path ...
progress_cb(0.8, "Running inference")
# ... write output files to output_dir ...
return {
"files": ["output.glb"],
"metadata": {"model": model_id},
}
Without a handler, jobs run through the stub handler (which simulates steps and returns immediately β useful for development).
Python
99.7%