{"service":"UniMate: text-to-animation for any rigged skeleton (SIGGRAPH Asia 2026)","model":{"model":"Linzhan/UniMate/unimate_uniml3d_f60_v3","model_revision":"174fc755ec248d0c98f27759b7a95648e7f05905","checkpoint":"checkpoints/checkpoint_step_150000.pt","checkpoint_step":150000,"weights":"ema","model_license":"CC BY-NC 4.0","text_encoder":"google/flan-t5-base","code":"https://github.com/Friedrich-M/UniMate/tree/b78c7807df7cf4231d4e67f8d0ece29c5e11025b","code_license":"MIT","paper":"https://arxiv.org/abs/2609.05415","ode_steps":50,"sampler":"flow matching, linear path, velocity prediction, classifier-free guidance (generate: adaptive dopri5; inbetween, edit, expand: fixed-step Euler with per-step replacement of the kept slice, as upstream)"},"gpu":"ZeroGPU slice of an NVIDIA RTX Pro 6000 Blackwell (large); only the flow ODE rollout runs there","output":"60 frames at 30 fps per sample (expand: 60 + 50 per extra prompt): animated GLB (when the asset has a mesh), motion features .npy (frames x joints x 12: root-relative position 3, rotation 6D 6, velocity 3), joint positions JSON, skeleton preview MP4 and a 6-frame contact sheet PNG","modes":{"generate":"POST /api/animate {asset, prompt}: text to motion, 60 frames","inbetween":"POST /api/inbetween {reference_job_id, reference_sample?, reference_start?, keep_frames?, prompt}: hold the listed frames of an earlier result (default \"0,-1\": first and last) and regenerate every other frame under the prompt (upstream --inbetween --keep_frames)","edit":"POST /api/edit {reference_job_id, reference_sample?, reference_start?, keep_joints, prompt}: hold the listed joints (names or labels) of an earlier result over the whole clip and regenerate the other joints under the prompt (upstream --motion_edit --keep_joints)","expand":"POST /api/expand {asset, prompts: [2-6 captions], overlap?}: one 60-frame segment per prompt, each pinned to the last `overlap` frames of the previous one; 60 + (60 - overlap) x (prompts - 1) frames in one motion (upstream --motion_expand --expand_overlap)"},"parameters":{"asset":"an asset id from GET /api/assets (unitree_go2, eagle, shark, or an uploaded u_... id)","prompt":"short caption in the training style: start with \"An object\" and describe ONE motion, e.g. \"An object walks forward.\", \"An object flaps its wings.\" (max 300 chars)","num_samples":"1-4 (default 1): independent samples of the same prompt","cfg_scale":"classifier-free guidance, 1.0-15.0 (default 3.0): 5-7 when the prompt is ignored, lower for smoother, calmer motion, 1.0 = unconditional (generate only)","seed":"integer (default random) for reproducible samples","preview":"true (default) also renders the skeleton MP4 and contact sheet (about 1-2 s of CPU)","reference_job_id":"inbetween, edit: the job_id of an earlier result of the same asset (kept 24 h)","reference_sample":"inbetween, edit: which sample of that result (default 0)","reference_start":"inbetween, edit: first frame of the 60-frame reference window (default 0; useful on expand results, which are longer; the window is re-aligned to face +Z)","keep_frames":"inbetween: frame indices held at the reference, as a list or a comma-separated string; negatives count from the end (default \"0,-1\")","keep_joints":"edit: joint names or anatomical labels held at the reference (list or comma-separated, case-insensitive; a label such as \"Left Wing\" selects every joint with that label)","prompts":"expand: 2-6 captions, one 60-frame segment each, in order","overlap":"expand: frames pinned between consecutive segments, 1-59 (default 10)"},"limits":{"num_samples":4,"prompt_chars":300,"upload_bytes":62914560,"max_joints":71,"frames":60,"fps":30,"expand_prompts":6,"segments_x_samples_per_call":8,"job_ttl_h":24},"assets":["eagle","shark","u_7fbcdb700f35","u_c08f3c506c34","unitree_go2"],"workflow":["GET /api/assets (pick a skeleton, or POST a rig_preprocess output zip)","POST /api/animate {asset, prompt, num_samples?, cfg_scale?, seed?} -> result with file URLs","GET the animation_glb / joints_json / motion_npy URLs","optionally refine: POST /api/inbetween or /api/edit with reference_job_id = that job_id, or build a longer motion with POST /api/expand","GET /api/jobs/{job_id} to read a result again (24 h)"],"docs":{"guide":"https://townbox-unimate-for-agents.hf.space/llms.txt","openapi":"https://townbox-unimate-for-agents.hf.space/openapi.json","swagger":"https://townbox-unimate-for-agents.hf.space/docs","mcp":"https://townbox-unimate-for-agents.hf.space/gradio_api/mcp/","gradio_api":"https://townbox-unimate-for-agents.hf.space/gradio_api/info","examples":"https://townbox-unimate-for-agents.hf.space/api/examples"},"stats":{"gpu_calls":22,"last_gpu_seconds":9.925,"startup_seconds":9.1}}