AI Asset Generation
Purpose
Generate production-candidate game assets from text prompts through the generative
provider registry (manifests/asset-providers.json) so projects can move from
procedural placeholders to real content without leaving the scaffold — while
keeping generation engine-neutral, reproducible, provenance-tracked, and subject
to the same acceptance gates as authored content.
Optional Capability — Gate Before Use
AI generation is an optional layer, not a dependency. It is available only when the
active provider's API key is set in the environment (FAL_KEY for the default
fal.ai provider). The scaffold's asset workflow does not require it:
- Key present → this skill is available; the project may upgrade placeholders to generated content.
- Key absent → this skill is inert. Fall back to the default scaffold tooling
exactly as before the capability existed —
placeholder-asset-pipelineand the engine placeholder commands (/unity-placeholders,/godot-placeholders,/web-placeholders) for sprites, 3D primitives, and procedural audio. A project built entirely on placeholders is a fully valid, shippable-to-prototype outcome; generation is an enhancement, never a gate.
Detecting the gate is cheap: the generator (scripts/generate-assets.js) reads the
key from the environment and reports clearly when it is missing, pointing back to
the placeholder path. Never fabricate or hand-place assets to "stand in" for the API.
Resolution Order and Cost
- Prefer free before paid. For
image/skybox(the registry'snativeFirstCapabilities), if the running harness has a native image generator (e.g. Codex$imagegen), use it instead of the paid API — keep the same names, paths, and acceptance gates. Fall to the API only when no native generator exists and a key is set; fall to placeholders otherwise.model3d/sfx/music/speech/videohave no native path — API or placeholders only. - Confirm before spending. Every run prints an estimated cost; the generator
refuses runs at or above
confirmOverUsdwithout--yes. For a single asset the user explicitly asked for, dry-run, show the estimate, and proceed if cheap. For autonomous or batch flows, get a clear yes on the total before running. Iterate on the cheap default model; reserve the expensive alternative and video for finals. - Quality vs price tier. Ask the user once, before a batch, which tier to use —
budget,balanced, orpremium— and pass--quality(defaultbalanced). The registry'sbyQualitymap picks the model per capability (e.g. image: flux-schnell / nano-banana-2 / nano-banana-pro; video: Wan / Seedance / Veo). Budget can keep a whole video run under the cost gate; premium crosses it and needs--yes. Tier sets the spend; the gate prevents surprises.
Use When
- placeholder assets exist and the project is ready to upgrade them to real content
- a game needs images, textures, skyboxes, 3D models, sound effects, music, voice lines, or intro/cinematic video that no artist is available to produce
- concept art needs to be lifted into 3D (image-to-3D) or into motion (image-to-video)
- the team wants reproducible asset generation runs (prompt + seed + model recorded) instead of one-off results pasted from a chat tool
Inputs
- the provider registry (
manifests/asset-providers.json) and a valid API key in the provider'sapiKeyEnvenvironment variable (never committed) - art bible or visual direction document, and the audio direction where relevant
- asset inventory: which entities need which asset type, at which target size or length
- the placeholder manifest of the project, so generated files can adopt the same names and paths (drop-in replacement contract)
- a staging directory outside the engine's import folders
Process
- classify each requested asset by capability:
image,skybox,model3d,sfx,music,speech, orvideo - define the acceptance contract before generating (for raster assets this is the
generated-raster-asset-pipelinecontract: background policy, display size, collision envelope; for audio: length, loopability, loudness target; for 3D: poly budget, scale, pivot; for video: duration, aspect ratio, codec) - resolve the model from the registry — do not hardcode model ids in project code;
pass
--modelonly to deviate intentionally - dry-run first to review the resolved payload:
node scripts/generate-assets.js --type <capability> --prompt "..." --out <staging> --dry-run - generate with a fixed
--seedwhere the model supports it, iterating on the cheap/fast default model and switching to the higher-fidelity alternative for finals - review candidates against the acceptance contract before any engine import
- move accepted files into the project under the placeholder names and paths, keep
the
.provenance.jsonsidecar next to each accepted asset, and record raster assets in the project'sgenerated-assets.jsonmanifest - import through the active engine layer only (Unity/Unreal/Godot/web import rules
stay in their engine packs), then run the matching review command
(
/art-2d-pass,/art-3d-pass,/audio-pass)
Outputs
- generated asset files in neutral formats (PNG, GLB, MP3/WAV, MP4) staged and then integrated under the project's existing names and paths
- a
.provenance.jsonsidecar per generation run: provider, model, prompt, seed, request id, timestamp, source URLs, license note - updated
generated-assets.jsonentries for accepted raster assets - a short generation log in the project docs: what was generated, with which model, what was rejected and why
Quality Bar
- every generated file has a provenance sidecar; an asset without provenance is treated as unlicensed third-party content
- generation is reproducible: prompt, seed, and model id recorded, so a lost file can be regenerated or deliberately re-rolled
- generated assets pass the same acceptance gates as authored content — no "the AI made it" exemption from naming, budget, or review rules
- engine isolation holds: the generation step never writes into engine-specific import folders directly
- cost is managed deliberately: iterate cheap, finalize expensive, and dry-run video (the costliest capability) before batch runs
Common Failure Modes
- hardcoding a model id in project code or docs and having it rot when the provider catalog rotates — the registry is the only source of truth
- accepting a "transparent" sprite with a baked checkerboard background (run the
raster acceptance contract;
validate:generated-assetscatches PNGs) - treating a generated skybox as valid without checking the equirectangular 2:1 projection and horizon continuity
- importing a generated GLB at the wrong scale because the poly/scale/pivot contract was never defined before generation
- generating voice lines outside the localization pipeline and discovering the text was never source-controlled
- burning budget on video generation iterations that an image-to-video workflow with an accepted still would have art-directed for a fraction of the cost
Related Agents
- technical-artist
- 2d-artist
- audio-designer
Related Commands
- generate-assets
- art-2d-pass
- art-3d-pass
- audio-pass
Related Skills
- generated-raster-asset-pipeline
- placeholder-asset-pipeline
- 3d-asset-pipeline
- cinematic-pipeline
- audio-implementation
Notes
- The registry's default provider is fal.ai because a single pay-per-use key covers every capability; the design is provider-agnostic and a second provider is a manifest entry away.
- Rigging and animation of generated 3D models are out of scope for the current
registry — generated meshes are static; route rigging through the
rigging-skinning-pipelineskill and a dedicated tool or provider. - An optional
fal-mediaMCP server (seemcp-configs/mcp-servers.json) exposes the same catalog interactively for exploration; reproducible production runs should go throughscripts/generate-assets.jsso provenance is written.

