THE FIELD GUIDE
From terminal
to game.
Sign in once. Make images, music, speech, sound effects, video, 3D models, and 3D places as local files for your engine and your coding agent.
1. Install and sign in once
Use Python 3.10 or later on Windows, macOS, or Linux. The package gives two command names, assetyard and uncen. They run the same CLI.
python -m pip install https://uncen.ai/static/downloads/uncen_cli-0.12.1-py3-none-any.whl
assetyard --versionThe command installs the CLI and its dependencies. It does not install a GPU model on your computer. If your Python command is python3, use that name. A virtual environment keeps the installation separate.
Then sign in one time on this PC. Do this yourself, in a terminal:
assetyard login
assetyard whoami
assetyard balance
assetyard capabilities- The CLI opens the approval page in your browser.
- Sign in with Google.
- Check that the account and the code match your terminal.
- Select Connect this device.
- Return to the terminal.
The login makes the default profile. Coding agents never run login. They use projects.
Personal access uses your account credits. It has no separate allowance. The CLI cannot buy credits or change your subscription. Never give an agent your Google password.
The CLI keeps the sign-in in the operating system credential store. To approve from another browser or a phone, run assetyard login --no-browser and open the printed URL. For a headless Linux host, see Credentials and headless hosts.
Install from a source checkout
python -m pip install -e packages/uncen-cliRun it from the repository root. The public wheel does not need the source repository.
2. Profiles and projects
A profile is a saved sign-in on this PC. Each profile has its own entry in the credential store (Windows Credential Manager on Windows) and its own lock. Select it with the global option --profile NAME, before the command. Without the option, the CLI uses default.
A project is a named connection of the same account. You make it from a signed-in profile, with no browser step. The CLI saves its sign-in as the profile of the same name.
Use one project for each game. A problem in one project never signs out another project or the default profile.
assetyard projects create my-game
assetyard --profile my-game whoami
assetyard projects listprojects create NAME uses a signed-in profile to authorize the request: default, or the profile that you give with --profile. Add --device-label TEXT to name this PC on the connections page. Then assetyard --profile NAME ... works.
What projects create returns
status | Meaning |
|---|---|
created | The account has a new project. |
reconnected | The account already has an active project with this name. For example, another PC made it, or this PC lost its sign-in. This PC becomes a new device of that project. The connection and its spent credits stay the same. |
already_signed_in | Profile NAME already works on this PC for that project. Nothing changes. You can run the command again safely. |
If profile NAME on this PC holds a different working sign-in, for example your login, the command fails with profile_in_use and changes nothing. If profile NAME holds a sign-in that the server rejects, the command replaces it.
A name has 1 to 40 characters: lowercase letters, digits, hyphens, and underscores. It starts with a letter or a digit. The name is also the local profile name.
What a project is
- A project is personal access. It uses the account balance and has the same permissions as a login. It has no expiry.
- Each device sign-in lasts 90 days from its last use, the same as a login.
- Each project counts its own spent credits.
- Requests belong to the account and the site. Any project can list, wait for, and download requests that another project or the login made.
- Each project shows on CLI connections with its name, a Project badge, its devices, and a Revoke project button.
- An account can have 1000 active projects on each site. It can call
projects create60 times a minute and 1000 times an hour. - Only a personal connection (a login or a project) can create, list, or revoke projects. A restricted connection gets
personal_access_required.
Check a profile
assetyard --profile NAME whoami shows profile (the local profile name), account_email, account_name, and project_name. project_name is null for the login. It also shows owner_user_id, grant_id, label, scopes, and spent_credits.
List projects
assetyard projects list lists the account's projects on this site. The output also has current_project.
| Field | Meaning |
|---|---|
name | The project name. |
status | active; signed_out (no device is still connected; run projects create NAME to reconnect); or revoked. |
created_at | When the project was made. |
last_used_at | The last token refresh of any device. It can be up to about 15 minutes old. |
spent_credits | The credits that this project spent. |
devices | The number of connected devices. |
current | True for the project of the profile that ran the command. |
local_profile | True when this PC has a saved sign-in for that project under that name. The command does not test that sign-in against the server. |
Revoke a project
assetyard projects revoke my-game --yesThe command revokes the project on the server for every device. It also removes the local profile NAME when that profile holds the project. --yes is required. It cannot revoke the login.
Revoking one project, or the parent profile, never affects other projects. You can use a revoked name again. The new project starts with zero spent credits.
3. Rules for coding agents
Every agent on a PC shares the saved sign-ins. One wrong command can sign out a profile. Give these rules to each agent, with the agent brief.
- Never run
loginorlogout. Login is the person's step.logoutrevokes the connection on the server.loginholds the profile lock while it waits for browser approval, for up to 10 minutes, and every other call on that profile waits. - Get a project with
projects create, never withlogin. Runassetyard --profile default --no-dynamic-defaults projects create NAME. Use one project for each game. - Put
--profile NAME --no-dynamic-defaultson every call. Put it in the one helper that the game uses to call Asset Yard. Do not useconfigure default-profile: it changes the profile for every project on the PC. - Never interrupt a running CLI process. Do not kill it, do not press Ctrl-C, and do not put it behind a short timeout. An access token lasts 15 minutes. The next call refreshes it, and the server retires the old refresh token. If the process stops during that refresh, the saved sign-in keeps the used refresh token. When a later call presents that token, the server treats it as stolen and signs the profile out. For a long wait, run the command in the background, or submit without
--waitand runjobs waitlater. - Make each request idempotent. Give
--request-ida UUID that you derive from the content, for example a name-based UUID of the prompt and settings. A rerun then finds the same job and does not make a new one. Keep a small jobs file in the project. Do not store private download URLs in it. - Never run
projects revokeunless the person asks for it. - Never print, copy, or read tokens.
whoamiandbalanceshow no secrets, so they are safe. - Do not change where the CLI keeps its state on a shared PC. Do not use
--state-dir,UNCEN_CLI_STATE_DIR,--credential-file, or--token-env. Every process must use the same lock files and the same credential store entry. Otherwise two processes can refresh the same token at once, and the server signs the profile out. - Run many agents at once if you need to. Processes that share a profile take turns through the lock. The account allows 1000 active requests. Submit, keep working, and download later.
- When a sign-in fails, read the error. For a project profile, it gives
next_command, for exampleassetyard --profile default projects create NAME. Run that command. If thedefaultprofile also fails, stop using Asset Yard. Report the exact error to the person and continue other work.
assetyard --profile my-game --no-dynamic-defaults whoami
assetyard --profile my-game --no-dynamic-defaults capabilities
assetyard --profile my-game --no-dynamic-defaults estimate tts --voice VOICE_KEY --text "Hold the line."
assetyard --profile my-game --no-dynamic-defaults generate tts --voice VOICE_KEY --text "Hold the line." --request-id STABLE_UUID --out assets/hold.flac
assetyard --profile my-game --no-dynamic-defaults jobs wait STABLE_UUIDMake a stable UUID from a name you control:
python -c "import uuid; print(uuid.uuid5(uuid.NAMESPACE_URL, 'my-game/tts/hold-the-line/v1'))"Change the name (for example v2) when you want a new generation. The same UUID with a changed payload returns a conflict.
4. Generate an asset
assetyard generate image --prompt "A painted starport at dusk" --width 1024 --height 1024 --out assets/starport.png
assetyard generate sfx --prompt "One short metal hatch impact, no music" --duration 2 --out assets/hatch.wav
assetyard generate music --prompt "Quiet orbital exploration" --duration 20 --music-kind gameplay_loop --instrumental --wait
assetyard generate model --prompt "One low-poly cargo container" --geometry-profile prop --out assets/cargo.glb
assetyard generate tts --voice VOICE_KEY --text "The next round starts now." --out assets/round.flac
assetyard generate video --prompt "A slow camera move around the object" --image-media-id OWNED_IMAGE_ID --duration 5 --out assets/preview.mp4
assetyard generate environment --reference-image assets/hall.png --out assets/hall.glb--out waits for completion and downloads the result. --wait waits without a download. The library flags --mark-favorite and --add-to also wait. With none of these flags, the command returns the queued request.
Run capabilities to see the kinds, providers, settings, formats, prices, and availability for your account. A command does not enable a missing worker or substitute another provider. An unavailable provider returns an error.
estimate takes the same arguments as generate. It does not generate or reserve credits. Prices can change before submission.
Use --max-credits N to cap one request. The account balance and any restricted allowance still apply. --max-credits 0 permits only a free request.
Use --provider only with an ID from capabilities. Use --set KEY=VALUE (JSON values or bare strings) or --settings JSON for exact provider settings. A duplicate setting name is an error.
Notes for each kind
- Image: backgrounds, concept art, textures, and references. Check the supported dimensions in capabilities.
- Speech: use
--text, not--prompt. Select a voice key from the voice catalog. - Sound effect: WAV output, 1 to 30 seconds, and 1 to 8 sampling steps (
--set steps=8). Describe one event and its timing for a game action sound. - Music: see Music.
- Video:
--image-media-idis a completed image from your account. The API does not accept an arbitrary image URL. Frame spacing can change the exact duration: one second at 16 frames per second gives 17 frames. Readmetadata.duration_secondsandmetadata.dimensionsfor the measured values. - 3D model and 3D place: see 3D and animation and 3D places.
- Voice design: not open to the public yet. See Voice design.
Music and speech formats depend on the provider. Inspect download.filename and download.mime_type before you choose an output extension.
Music and sound effects do not guarantee seamless loops. Seeds do not guarantee identical files across runs or hardware. Keep the downloaded file when you need an exact match.
5. Keep a character consistent
assetyard generate image --prompt "Cali gives a mission briefing on the carrier bridge. Keep her face, hair, uniform, and insignia consistent." --reference-image references/cali.png --out assets/cali-briefing.png
assetyard generate image --prompt "Cali and the commander study a tactical display. Preserve both identities." --reference-image references/cali.png --reference-image references/commander.png --out assets/tactical-briefing.pngRepeat --reference-image for up to five PNG, JPEG, or WebP references. Each file can be up to 20 MiB. Local files and media IDs share the five-image limit. A provider can set a lower limit: check image.reference_providers in capabilities.
Choose an image editor
An image request with a reference image goes to an image editor. Run assetyard capabilities and read kinds.image.reference_providers. Each entry is an editor, with its id, display_name, max_reference_images, and classification. kinds.image.providers lists only generators, so each of them shows max_reference_images: 0. CLI 0.12.1 also prints the editors on stderr under Image editors (accept --reference-image); stdout stays JSON.
assetyard generate image --provider EDITOR_PROVIDER_ID --reference-image references/cali.png --prompt "Cali kneels beside a damaged drone. Keep her face, hair, and uniform." --out assets/cali-kneel.pngReplace EDITOR_PROVIDER_ID with an editor id. Omit --provider to use the default editor of the site.
The CLI calculates SHA-256 before upload. The server reuses a matching private upload within the same account and collection.
assetyard generate image --prompt "Cali examines a navigation chart" --reference-image-media-id OWNED_IMAGE_ID --out assets/cali-chart.pngYou can mix both options. The CLI rejects duplicate or invalid media IDs. The server checks the owner, state, file type, and collection before dispatch. A media ID never grants access to another account. The API does not accept an arbitrary image URL.
The generated image also stays in your private library. A manifest cannot hold a local reference path. Use settings.reference_image_media_ids after the upload exists.
For image-to-video, use an owned image as the starting frame:
assetyard generate video --prompt "A slow camera move through the hangar" --image-media-id OWNED_IMAGE_ID --duration 5 --out assets/hangar.mp4A reference improves consistency. It does not guarantee exact identity or an unchanged design.
Remove an image background
Background removal is a standalone image request. It keeps the source RGB pixels and adds an alpha channel to a PNG.
Run assetyard capabilities. Under kinds.image.reference_providers, find the background removal entry. Replace REMOVAL_PROVIDER_ID below with its id.
assetyard generate image --provider REMOVAL_PROVIDER_ID --reference-image assets/pose.png --prompt "Remove the background" --max-credits 1 --out assets/pose-cutout.pngSupply exactly one reference image. You can use --reference-image-media-id OWNED_IMAGE_ID instead of a local file. The server checks image access.
The removal request currently costs one credit. Check the current price in capabilities before submission. The credit cap rejects a higher price.
There is no combined background removal flag on a generation request. Generate or edit the image first, then submit the removal request.
The two steps have separate request IDs and separate charges. Keep both results and their provenance.
Use the master reference with an image editor to create a new pose. The same kinds.image.reference_providers list names the editors; see Choose an image editor. Background removal cannot correct a changed face or costume.
Inspect fine edges, hair, and equipment before selecting the cutout. A removal mask can erase small details.
Omit --out and --wait to submit without waiting. Use jobs wait later.
Live jobs without status polling
The CLI uses authenticated Server-Sent Events (SSE) for --wait, --out, and jobs wait.
The same event endpoint serves all asset kinds. You do not need Redis, an inbound port, a callback server, or a WebSocket library on your computer.
Omit both wait flags to submit a job and return immediately. Save its request ID and continue other work.
assetyard generate image --prompt "A ruined chapel at dusk" --json
assetyard jobs wait REQUEST_UUID --timeout 1800
assetyard jobs download REQUEST_UUID --out assets/chapel.pngEach new variation needs a new request ID. Reuse an ID only to resume that exact request, not to create another image.
Account capacity limits still apply. Closing a terminal does not cancel the server job.
After a connection failure, the CLI reconnects with bounded retries and receives the current state. It does not resubmit generation.
An access token lasts 15 minutes. When it expires during a long wait, the server ends the stream. The CLI refreshes the token and reconnects. A token that the server always rejects stops the wait after five reconnects.
A stream failure is explicit. The CLI does not fall back to repeated status requests. jobs status remains a one-time check.
A missing request (HTTP 404) is a final answer. jobs wait and downloads stop at once, and the error names the request ID and the server. The CLI retries only server errors, network failures, and rate limits.
Do not run jobs status in a loop on an unknown request ID. Many 404 answers in a short time can block your network address for one hour.
To integrate your own client, see Custom clients.
6. Cast a voice by name
Open the voice library to listen, search, and save a shortlist. Pre-launch preview access requires an approved account.
assetyard voices list --search deep --gender male
assetyard voices list --category hfy_narration --gender male --age middle_aged --search deep
assetyard voices list --language es
assetyard voices list --limit 100 --offset 100
assetyard voices show VOICE_KEY
assetyard generate tts --voice VOICE_KEY --text "All pilots, prepare for launch." --out assets/launch.wavThe catalog has 7,111 published voices in 75 browse categories. voices list returns 100 items by default. Use --limit and --offset to page. Filter with --category, --search, --gender, --age, and --language.
Each voice has a stable voice_key and a readable name. For example, ayv2_hero_vanguard_c1 is candidate one of the Hero Vanguard design. Store the key with your character. Keep each character's key the same across the game. Do not store a private sample URL.
| Voice | Stable key | Requested role |
|---|---|---|
| Atlas Deep Narrator | ayq1_atlas_narrator_c1 | Deep male HFY narrator, middle-aged, General American English |
| Orion Vanguard | ayq1_orion_vanguard_c1 | Adult male military hero, General American English |
| Lyra Vanguard | ayq1_lyra_vanguard_c1 | Adult female military hero, General American English |
assetyard generate tts --voice ayq1_atlas_narrator_c1 --text "They called our world a death trap. Humanity called it home." --out assets/narrator.flac
assetyard generate tts --voice ayq1_orion_vanguard_c1 --text "Stay together. Nobody gets left behind." --add-to "Sector Prime" --out assets/commander.flac
assetyard generate tts --voice ayq1_lyra_vanguard_c1 --text "The route is clear. Bring our people home." --mark-favorite --out assets/heroine.flacOne pipeline speaks the new line, and a voice-design model can create the reference voice. You do not need a different command for each source. The provider field names the speech engine. The optional source_provider field records which model made the sample.
Ask for a performance
Use --expressiveness for a line that carries strain. The scale runs from 0.0 to 1.0. 0.0 is flat and even. The default is ordinary delivery. 1.0 is a battle cry, a warning, or a shout.
assetyard generate tts --voice VOICE_KEY --expressiveness 0.05 --text "Log entry, day ninety." --out assets/log.flac
assetyard generate tts --voice VOICE_KEY --expressiveness 0.95 --text "Get back! Now!" --out assets/warn.flacThe scale is the service's own, not a speech model's. We map it onto whatever control the model behind your voice exposes, so a stored request keeps its meaning after that model changes. A voice whose model has no such control ignores the argument rather than guessing.
Hear both ends of the scale on the showcase.
Speak another language
Add --language CODE, for example es, fr, pt-BR, or zh-Hans. See Speech languages.
Requested age, presentation, accent, and delivery describe the casting target. They are not proof of the exact sound. human_reviewed and release_basis separate listening review from technical checks. See Voice catalog details.
Voice references stay private. Do not redistribute the reference bank. Ordinary generated dialogue belongs in your game, subject to the applicable terms.
7. Build a 3D game asset
The 3D modeler is the default model pipeline. You need no provider flag. A normal model request returns a textured static GLB.
assetyard generate model --prompt "One low-poly wooden supply crate with a closed lid" --geometry-profile prop --out assets/crate.glb
assetyard generate model --prompt "One game-ready space pilot" --geometry-profile character --target-faces 40000 --texture-resolution 1024 --out assets/pilot.glbGeometry profiles are prop (simple objects), standard, character, and source. Texture resolution accepts 512, 1024, or 2048 pixels. Fewer vertices do not guarantee sharp edges.
3D mesh work is free during the beta. A generated reference image still uses its normal image price. Model requests enter the normal durable queue, so you can submit a batch and close the terminal.
Align a rigid vehicle
assetyard generate model --prompt "One symmetric courier spacecraft with a pointed nose and two wings" --geometry-profile prop --orientation-profile rigid_vehicle --out assets/courier.glbThe modeler keeps the pose of the reference view, so a three-quarter view can give a tilted model. The rigid vehicle profile requests a front reference and applies geometric alignment. It requires a generated reference.
Aligned output uses +Y up, +Z forward, and a centered pivot. A game that moves along -Z needs one shared 180-degree Y import rotation. Check orientation.status; see Orientation details.
Rig and animate a character
Use the character profile and describe a complete person in a neutral T-pose. An animation pack automatically enables rigging.
assetyard generate model \
--prompt "A practical salvage pilot in a neutral T-pose, full body, hands visible" \
--geometry-profile character \
--target-faces 40000 \
--texture-resolution 1024 \
--animation-pack humanoid_core \
--out assets/salvage-pilot.glbThe final GLB contains the textured mesh, skin weights, named humanoid bones, and named animation tracks. The CLI waits for every stage before it downloads that file.
| Pack | Designed for |
|---|---|
humanoid_core | Idle, walk, run, and left and right turns. |
humanoid_standard | Core movement plus traversal, common gestures, and object interaction. |
humanoid_combat | Combat movement, attacks, reactions, and a death fall. |
Use --rig without an animation pack when you need a skeleton without motion. Repeat --animation-clip to select specific clips from one pack. Rigging requires --geometry-profile character. A humanoid pack requires a humanoid mesh. Use --body-plan creature --rig for a creature without humanoid clips.
Asset Yard keeps the static mesh and rigged model as separate private assets. This supports inspection and later animation changes.
Start from an existing image
assetyard generate model --reference-image character.png --geometry-profile character --animation-pack humanoid_core --out assets/character.glb
assetyard generate model --reference-image-media-id OWNED_IMAGE_ID --geometry-profile character --rig --out assets/rigged.glbThe server checks the image owner and collection. A supplied reference skips internal image generation and costs no image price. Personal access can reuse same-account images from other connections on the same site. For up to four views of one object, see Model settings.
Check orientation.status for rigid assets. Inspect every mesh, texture, rig, animation, scale, and polygon count before release.
Review a rigged character
New humanoid rigs use the server correction. You need no flag for it.
Use a T-pose, open hands, and at least 15 cm of clearance from the body and clothing.
Supplied reference images skip image generation. Prepare their pose and clearance before submission.
assetyard generate model --prompt "A salvage pilot in a T-pose, open hands, full body" --geometry-profile character --rig --out assets/pilot-rig.glb
assetyard jobs status REQUEST_UUID --jsonFor a rig-only result, inspect metadata.facts.character_quality in the status response. The rig GLB also contains extras.character_quality.
An older output can lack this report. For an animated request, inspect the private rig intermediate if the final motion output does not retain it.
needs_review means that defects or unmeasured checks remain. A completed job does not mean that all quality checks pass.
The correction blends wrist and ankle weights and adds estimated LeftHandGrip and RightHandGrip sockets.
It rejects weight changes that increase the maximum stretch in a test pose. It preserves usable output and reports unresolved defects.
Finger articulation, fused parts, texture detail, and some mixed weights can remain unresolved. Grip orientation requires review.
Open the character comparison viewer. Select the source and corrected GLBs. The viewer reads local files without uploading them.
Select an embedded animation for synchronized playback. Use Pause, Speed, and Time to inspect a frame. Only matching clip names appear. Compare both wrist directions. Enable the skeleton and grip sockets. Rotate the camera to inspect the forearm and robe.
The viewer renders every skin influence set, including JOINTS_1 and WEIGHTS_1. It uses fixed local joint axes.
8. Build a 3D place from a picture
The environment backend turns one picture into one textured 3D place. A game camera can stand where the picture was taken, and a character can walk on its floor.
assetyard generate environment --reference-image assets/hall.png --out assets/hall.glb
assetyard generate environment --prompt "A long stone dungeon hall with a flat flagstone floor" --out assets/hall.glbGive one reference image, or only a prompt. With only a prompt, the server first paints a landscape reference picture and then rebuilds it.
assetyard generate model --provider environment sends the same request. Add --seed N to set the seed. The shared flags work as for every generate command: --wait, --out, --max-credits, --request-id, --collection, --json.
The rebuild costs 0 credits during the free beta. A request with --reference-image costs 0 credits. A request with only a prompt pays the image price for the reference picture that the server paints. The rebuild takes seconds of GPU time. The request rejects the settings that shape an object, such as a geometry profile, a rig, or an animation pack.
Use jobs list --kind model to find environment requests. In a manifest, kind: environment builds the same request.
What the GLB holds
| Part | Contents |
|---|---|
backdrop | A mesh at metric scale, textured with the picture. |
source_camera | A camera node at the position, rotation, and field of view of the picture. |
floor_collider | A hidden mesh over the walkable cells. Only a picture with a visible floor has one. Use it for collision, not for drawing. |
scenes[0].extras.asset_yard_environment | The camera, the source view, the floor plane, and the walkable grid. Each grid cell is . for walkable, # for blocked, or ? for unknown. |
+Y is up, -Z is forward, and one unit is one metre. When the backend finds a floor, the floor lies on y = 0. A game can draw the picture on a far plane behind the backdrop to fill small cracks.
Write a picture that rebuilds well
- A wide view from slightly above. A raised viewpoint keeps a lot of floor in frame.
- A broad flat floor in the lower half. The walkable grid can only cover floor that the picture shows.
- Even light. The picture is the texture, so its light stays the light of the room.
- No people and no text. A person becomes part of the backdrop, and a game cannot move them.
Know the limits
- One picture shows one side of a place. The result looks right near the viewpoint of the picture. It has nothing behind objects.
- The camera stays near the viewpoint. A game camera can pan, zoom and turn a little. Characters can walk anywhere on the walkable floor.
- The floor must be visible. A surface tilted more than 45 degrees from level is not a floor.
- Metric scale is an estimate. Check a size in metres against something you know, such as a door.
- No floor means no collider. A picture without a visible floor still returns a backdrop, but no floor collider and no walkable grid.
See three rooms built this way, and read a real GLB record →
9. Music
Generate a song with exact lyrics
assetyard generate music --prompt "Irish folk ballad, male baritone, acoustic guitar" --duration 75 --lyrics-file song.txt --waitThe CLI sends the prompt as style tags for the music model. It sends the file as the separate lyrics input. The CLI preserves UTF-8 newlines and section tags such as [verse], [chorus], and [bridge]. Use --lyrics for short inline lyrics. Use --instrumental for no vocals. Use --vocal without lyrics to let the music model write them.
Let Asset Yard write a timed song
assetyard generate music --music-kind song --preset catchy_female_pop --language es --duration 180 --waitA song defaults to vocals. Asset Yard asks the lyricist to fit the selected duration. Run assetyard capabilities to list curated presets and languages. A preset can replace the raw prompt.
Use --prompt for the subject and --preset for the style. Without a subject, the songwriter chooses one. Use --enhance to expand instrumental directions. Automatic lyrics and enhancement require the music LLM. A failed call fails the job explicitly.
--language controls automatic lyrics only. It does not translate supplied text or affect instrumentals. Vietnamese, Polish, and Dutch are available.
All music kinds accept 15 to 240 seconds. Songs default to 180 seconds; other kinds default to 45 seconds. Music currently costs one credit per request.
The music model sings supplied lyrics once. Sung English commonly uses 1.5 to 2.5 words each second. Start near duration_seconds × 1.6 words.
Status includes measured duration and decoded trailing silence. Silence measurement does not detect vocals or an instrumental vamp. Status also returns metadata.lyrics and metadata.song_title when available. The lyrics are generation input, not an audio transcription. Unknown measurements are omitted. The CLI uses UTF-8 on Windows, including pipes.
10. Fewer arguments. Clear defaults.
TTS picks the service default when you omit the provider. Run capabilities to see which providers your account can select, then set a default only from that list.
assetyard configure default-tts-provider PROVIDER_FROM_CAPABILITIES
assetyard configure default-collection my-game
assetyard configure --showAn explicit argument wins. Configuration is local and needs no login. Agents must not change default-profile; see the rules.
The collection default sets the generation scope label, not a library folder or a login permission. Use --add-to "Sector Prime" for library organization.
Optional: remember recent choices
Automatic remembering is off by default. Enable it for profiles, generation scope labels, and voice search filters.
assetyard configure --dynamic-defaults
assetyard voices list --category hero --gender male
assetyard voices list
assetyard --reset
assetyard configure --no-dynamic-defaultsThe CLI reports defaults on stderr and keeps JSON on stdout. It never remembers prompts, text, references, output paths, or spending limits.
Manifest builds do not inherit local provider, collection, or filter preferences. Put those choices in the manifest for repeatable builds.
11. Give your coding agent a clear brief
Make the project first, or let the agent make it. Replace my-game with one stable project name for the game.
Read https://assetyard.dev/docs/ before you use Asset Yard. Use https://assetyard.dev/docs/reference/ for details.
This game uses the Asset Yard project my-game.
Never run assetyard login or assetyard logout. Signing in is my step.
If the my-game profile is missing, run: assetyard --profile default --no-dynamic-defaults projects create my-game
Put --profile my-game --no-dynamic-defaults before every command.
Never kill, interrupt, or put a short timeout on a running assetyard command.
Run whoami, balance, and capabilities before you create an asset.
Derive each --request-id UUID from the request content. Keep a jobs file.
Resume an existing request instead of submitting a duplicate.
Never run projects revoke unless I ask.
Never print, copy, or read tokens.
Do not use --state-dir, --credential-file, --token-env, or UNCEN_CLI_STATE_DIR.
If a sign-in error gives a projects create next_command, run it. Otherwise stop and report the error.
Use owned reference images to keep a character consistent.
To edit a picture, pick an editor from kinds.image.reference_providers in capabilities.
Use the character profile and an animation pack for playable characters.
Select stable voice keys from the voice catalog.
Download final files into the game project with --out.
Keep request IDs, lock files, checksums, and license notices.
Never put tokens or private download URLs into game source.Global options such as --profile go before the command. A CLI collection is not a Multiplayers game project. It does not attach files to a game.
Inside Multiplayers, the coding agent uses project-bound tools instead of the CLI: list_tts_voices, request_tts, request_image (which accepts owned reference_image_media_ids), and request_model then sync_models to add a GLB and its license file to the game workspace.
The public game must load downloaded assets from its own build or delivery service. Players do not need an Asset Yard token.
12. Jobs, errors, and recovery
A timeout does not mean generation stopped. Keep the request ID. Inspect the job before you submit another request.
assetyard jobs list --kind model --limit 50
assetyard jobs status REQUEST_UUID
assetyard jobs wait REQUEST_UUID --timeout 1800
assetyard jobs download REQUEST_UUID --out assets/recovered.glbThe CLI records the request UUID before it submits the job. --request-id UUID can create or resume one exact request. A changed payload returns a conflict. A new generate command without --request-id creates another request.
The CLI retries capacity limits and incomplete dispatches with the same saved request. Use --timeout to bound this wait. If all request slots are busy, the CLI follows the server retry delay.
Errors report retryable. Keep waiting while a failed job remains retryable. Inspect a terminal failure before submitting another request.
Any project or login of the account can access earlier jobs from the same account and site.
Default output is one final JSON document. Explicit --json uses JSON Lines and reports request_saved first. Human progress uses stderr. See Output and exit codes.
The standard account limit is 1000 active requests. An account entitlement can set a different limit. capabilities reports it as max_inflight.
All agents, profiles, and projects for one account share that limit. Credits and request capacity are separate limits: more credits do not clear a concurrency_limit response.
Stopping the local command does not cancel its server job. The job keeps its slot until it finishes or fails.
An existing output file stays unchanged until a verified download completes.
Bash scripts that use tee must enable set -o pipefail.