{"service":"Character Animation for Agents: SkinTokens auto-rigging + UniMate text-to-animation on ZeroGPU","models":{"rigging":{"model":"VAST-AI/SkinTokens","model_revision":"79736cad0fd84de384d5eede659b4ebd24effe33","checkpoint":"experiments/articulation_xl_quantization_256_token_4/grpo_1400.ckpt","skin_vae":"experiments/skin_vae_2_10_32768/last.ckpt","llm_backbone":"Qwen/Qwen3-0.6B architecture (config revision c1899de2); weights from the checkpoint","model_license":"MIT","code":"https://github.com/VAST-AI-Research/SkinTokens/tree/273b691d35989d71cd17ff2895fdc735097b92d1","code_license":"MIT","vendored_from":"https://huggingface.co/spaces/VAST-AI/SkinTokens/tree/1f4445ba2afc15adec83eb4108f893066dc2f61b (src/, configs/, bpy_server.py)","blender":"bpy 4.5.4 (wheel from the official Space)","paper":"https://arxiv.org/abs/2602.04805","method":"TokenRig: autoregressive skeleton tokens + learned skin tokens (FSQ-CVAE), beam search"},"animation":{"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)","asset_preparation":"https://github.com/Friedrich-M/UniMate data_process.rig_preprocess at b78c7807 (general profile, offline rule annotation; Blender bpy 4.5.4)"}},"gpu":"ZeroGPU slice of an NVIDIA RTX Pro 6000 Blackwell; only the TokenRig forward pass (rig) and the flow ODE rollout (motion) run there; Blender and the asset preparation run on the CPU","workflow":{"one_call":"POST /api/animate_mesh with the mesh (body, multipart, \"example\" or \"mesh_url\") and \"prompt\" (or \"prompts\" for a chain): rig -> asset -> motion; returns every file URL","steps":["POST /api/rig (SkinTokens) -> r_ job with rigged.glb","POST /api/assets {\"rig_job_id\": \"r_...\"} (or a rigged glb/fbx) -> u_ asset: labels, facing, canonical T-pose, preview.png to check","POST /api/animate {\"asset\": \"u_...\", \"prompt\": \"An object walks forward.\"} -> a_ job with animation.glb; then /api/inbetween, /api/edit, /api/expand with that job as reference","GET /api/jobs/{job_id} to read any result again (24 h); assets live until the Space restarts"]},"input":"one mesh file (.glb, .gltf, .obj, .fbx, up to 60 MB): the raw request body (?filename=), a multipart `file` field, or JSON with \"example\" or \"mesh_url\"; POST /api/assets also takes a rigged glb/gltf/fbx or a zipped rig_preprocess output","parameters":{"rigging (POST /api/rig; in /api/animate_mesh: rig_seed instead of seed)":{"num_beams":"1-20 (default 10): beam-search width; more beams, better skeletons, slower","seed / rig_seed":"integer (default random): the same mesh, options and seed reproduce the rig","keep_skeleton":"true: keep the armature found in the file and predict only the skin weights (default false)","preserve_original":"true: transfer the rig onto the untouched input mesh so textures, materials and world scale survive (default false: the GLB is in the normalized [-1, 1] frame)","postprocess":"true: voxel-based mask on the skin weights before normalization, slower (default false)","influences":"1-8 bones kept per vertex in the GLB (default 4)","top_k, top_p, temperature, repetition_penalty":"decoder sampling (defaults 5, 0.95, 1.0, 2.0)"},"asset preparation (POST /api/assets, /api/animate_mesh)":{"labels":"{joint name: label} corrections of the automatic joint labels (vocabulary: GET /api/assets/{id}/annotation)","face_right, face_left":"the two joints that define the facing (the asset's right / left thigh, shoulder, hip...)","body_axis":"true when face_right / face_left are a head / tail pair (snakes, fish)","rest_rotation":"axis turns that stand up a rest pose authored lying down or upside down, e.g. \"x180\", \"x90,y180\"","annotation":"a complete annotation.json (from GET /api/assets/{id}/annotation, edited) instead of labels / facing"},"animation (POST /api/animate, /api/animate_mesh)":{"asset":"an asset id from GET /api/assets (bundled unitree_go2, eagle, shark, or a prepared 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)","prompts":"2-6 captions (list, or separated by |): one 60-frame segment each, chained (/api/expand)","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","overlap":"expand: frames pinned between consecutive segments, 1-59 (default 10)","preview":"true (default) also renders the skeleton MP4 and contact sheet (about 1-2 s of CPU)"},"editing (POST /api/inbetween, /api/edit)":{"reference_job_id":"the a_ job_id of an earlier result of the same asset (kept 24 h)","reference_sample":"which sample of that result (default 0)","reference_start":"first frame of the 60-frame reference window (default 0; useful on expand results)","keep_frames":"inbetween: frame indices held at the reference, list or 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 Thigh\" selects every joint with that label)"}},"limits":{"upload_bytes":62914560,"formats":[".glb",".gltf",".obj",".fbx"],"rig_max_tokens":2048,"max_joints":71,"frames_per_prompt":60,"fps":30,"num_samples":4,"expand_prompts":6,"segments_x_samples_per_call":8,"prompt_chars":300,"job_ttl_h":24},"assets":["eagle","shark","u_1a2b0ae5ff20","u_aa39605e8189","unitree_go2"],"examples":["cesium_man","fox","giraffe","rigged_figure"],"docs":{"guide":"https://townbox-character-animation-for-agents.hf.space/llms.txt","openapi":"https://townbox-character-animation-for-agents.hf.space/openapi.json","swagger":"https://townbox-character-animation-for-agents.hf.space/docs","mcp":"https://townbox-character-animation-for-agents.hf.space/gradio_api/mcp/","gradio_api":"https://townbox-character-animation-for-agents.hf.space/gradio_api/info","examples":"https://townbox-character-animation-for-agents.hf.space/api/examples"},"stats":{"rig_gpu_calls":3,"motion_gpu_calls":31,"assets_prepared":2,"startup_seconds":{"rigging":22.0,"animation":8.0},"bpy_launches":1}}