pixelkiln 0.89.5 → 0.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +53 -16
- package/dist/cli.js.map +1 -1
- package/dist/client/gallery.css +1 -0
- package/dist/client/gallery.js +54 -17
- package/dist/index.cjs +53 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +36 -13
- package/dist/index.d.ts +36 -13
- package/dist/index.js +53 -16
- package/dist/index.js.map +1 -1
- package/docs/CHARACTERS.md +43 -3
- package/docs/ENDPOINTS.md +32 -0
- package/docs/MANIFEST.md +2 -2
- package/docs/REVISIONS.md +15 -8
- package/package.json +1 -1
- package/schema/manifest.schema.json +1 -1
- package/skills/pixelkiln/references/pixellab-roadmap.md +21 -2
- package/skills/pixelkiln/references/pixellab.md +8 -0
package/docs/CHARACTERS.md
CHANGED
|
@@ -222,6 +222,45 @@ single direction before a batch.
|
|
|
222
222
|
"mira.walk": { "animation": { "of": "mira", "template": "walk", "mode": "skeleton-v3", "directions": ["south", "west", "north"] } }
|
|
223
223
|
```
|
|
224
224
|
|
|
225
|
+
### Loops from a sentence
|
|
226
|
+
|
|
227
|
+
`mode: "skeleton-v3"` with **no `template`** animates the asset's `prompt`
|
|
228
|
+
instead: PixelLab writes the sentence into one 3D motion and draws the
|
|
229
|
+
character from it, with no template to pick. `frames` takes PixelLab's own
|
|
230
|
+
3 to 15 for this combination (odd counts included, default 8); a template
|
|
231
|
+
`skeleton-v3` loop still takes none.
|
|
232
|
+
|
|
233
|
+
```jsonc
|
|
234
|
+
"mira.swing": {
|
|
235
|
+
"prompt": "swinging a sword in a wide arc",
|
|
236
|
+
"animation": { "of": "mira", "mode": "skeleton-v3", "frames": 8, "directions": ["south", "west"] }
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- **A v3 base is required.** The sentence is written onto the character's
|
|
241
|
+
stored 3D skeleton, which a `standard` base lacks, so `plan` and `validate`
|
|
242
|
+
refuse the pairing and name the engine. `pro` and `pro-flash` bases are
|
|
243
|
+
not refused but are unverified. An `objectPro` has no skeleton at all.
|
|
244
|
+
- **The prompt is the sentence**, sent as written as `action_description`
|
|
245
|
+
(a loop's prompt never takes the style's prefix or suffix, same as a v3
|
|
246
|
+
loop). It is required; `startFrame`, `endFrame`, `enhancePrompt`,
|
|
247
|
+
`subject`, and the template style hints are refused.
|
|
248
|
+
- **The canvas can grow.** The measured 64px loop came back at 96×96. The
|
|
249
|
+
frames are saved as PixelLab returns them; a mirror flips them locally like
|
|
250
|
+
any other loop.
|
|
251
|
+
- **Cost**: the plan budgets 4 per direction, the same ceiling as a template
|
|
252
|
+
`skeleton-v3` loop. Measured live on a v3 character: 8 frames at 64px billed
|
|
253
|
+
exactly 3 generations for one direction, about 15 seconds before the jobs
|
|
254
|
+
start. `billed` in the lock records the real amount.
|
|
255
|
+
- **Directions do not share one motion yet.** PixelLab draws every direction
|
|
256
|
+
of a request from one 3D motion, and `animation_group_id` appends a
|
|
257
|
+
direction to an existing animation so it moves the same way. pixelkiln
|
|
258
|
+
makes one request per direction asset (including each direction of
|
|
259
|
+
`directions`), so each direction's motion is written from the sentence
|
|
260
|
+
separately and may differ a little. Appending to a recorded group is not
|
|
261
|
+
wired up; the lock keeps each direction's `animationGroupId` for when it is.
|
|
262
|
+
Verified live is a single south direction only.
|
|
263
|
+
|
|
225
264
|
### Pose frames and other loop controls
|
|
226
265
|
|
|
227
266
|
A v3 loop can start and end where you say. `startFrame` is a
|
|
@@ -489,11 +528,12 @@ reference image change alone also makes it stale.
|
|
|
489
528
|
style (engine, size, directions, body, view, folder) or an existing one,
|
|
490
529
|
the base with an optional sprite of your own (uploaded into `refs/`, so
|
|
491
530
|
only the rotations are billed), any number of loops (each a template
|
|
492
|
-
posed by `skeleton-v3` by default,
|
|
531
|
+
posed by `skeleton-v3` by default, a `skeleton-v3` loop described in words
|
|
532
|
+
with a 3 to 15 frame count, or a plain template, v3, or pro loop,
|
|
493
533
|
in the directions you tick, mirrors added free), and a portrait. A
|
|
494
534
|
`standard` base has no 3D skeleton for `skeleton-v3` to pose, so its loops
|
|
495
|
-
start on `template` and
|
|
496
|
-
form on an existing base does the same. The
|
|
535
|
+
start on `template` and both skeleton-v3 choices are greyed out; the
|
|
536
|
+
new-loop form on an existing base does the same. The
|
|
497
537
|
sheet prices the draft live, the way `plan` would. Pro Flash bases are
|
|
498
538
|
priced by PixelLab's own quote (`/pro-flash/cost`, a free call) when the
|
|
499
539
|
project has a key; those rows are marked live, and the offline estimate
|
package/docs/ENDPOINTS.md
CHANGED
|
@@ -894,6 +894,38 @@ Listed so the gaps are known rather than assumed away:
|
|
|
894
894
|
`animate-character`, portraits, and outfit transfer are covered in full; see
|
|
895
895
|
the September 2026 measurements below.
|
|
896
896
|
|
|
897
|
+
## Skeleton-driven motion, measured
|
|
898
|
+
|
|
899
|
+
October 2026, on a v3 character (64×64, `pixen_v3`), each billed exactly 3
|
|
900
|
+
generations and finished in about two minutes:
|
|
901
|
+
|
|
902
|
+
- **`POST /animate-with-skeleton-v3`** (pixelkiln's `animate-skeleton`):
|
|
903
|
+
8 hand-edited poses on a 64×64 sprite returned 8 frames at 64×64, matching
|
|
904
|
+
PixelLab's anchor (8 frames = 3). `description` and `action` are both
|
|
905
|
+
required. Sent with neither, the endpoint answers `422` with a field
|
|
906
|
+
error for each, and a failed request bills nothing. The completed job's
|
|
907
|
+
`last_response` carries `images` (base64, `width`, `height`), `flow_kind`,
|
|
908
|
+
and `billing_usage` beside the top-level `usage`.
|
|
909
|
+
- **`POST /characters/animations`, `mode: "skeleton-v3"` with no
|
|
910
|
+
`template_animation_id`** (PixelLab's new custom motion): a one-sentence
|
|
911
|
+
`action_description` and `frame_count` 8 returned 8 frames at **96×96**
|
|
912
|
+
(the character's own canvas grows from 64) in one job for `south`, saved
|
|
913
|
+
onto the character as an animation (`animation_id`, `animation_group_id`),
|
|
914
|
+
and billed 3. The submit answers `{ background_job_ids, directions,
|
|
915
|
+
animation_group_id, status, enhanced_prompt, enhance_usage }`. The finished
|
|
916
|
+
job's `last_response` has `images`, `storage_urls.frames`,
|
|
917
|
+
`generation_model: "skeleton-v3_custom"`, `animation_description`, and
|
|
918
|
+
`billing_usage: {usd: 0, type: "generations", generations: 3}`, the same
|
|
919
|
+
nested field as the other character jobs, which is where `poll` looks when
|
|
920
|
+
the top-level amount is a dollar zero. PixelLab says the action is written
|
|
921
|
+
into one 3D motion that every direction is drawn from, so later directions
|
|
922
|
+
added with `animation_group_id` move the same way (humanoids). pixelkiln
|
|
923
|
+
sends this mode for a character loop with `mode: "skeleton-v3"`, a prompt,
|
|
924
|
+
and no template (docs/CHARACTERS.md, "Loops from a sentence"), one request
|
|
925
|
+
per direction asset and without `animation_group_id`. Verified live with
|
|
926
|
+
one south direction on a v3 character; a standard-engine character is
|
|
927
|
+
refused (`has no stored 3D skeleton`).
|
|
928
|
+
|
|
897
929
|
## Characters, measured
|
|
898
930
|
|
|
899
931
|
- Standard bases draw on a canvas 28px larger than `image_size` (64 → 92,
|
package/docs/MANIFEST.md
CHANGED
|
@@ -56,7 +56,7 @@ not merely a label edit.
|
|
|
56
56
|
|
|
57
57
|
| Field | Type/default | Meaning |
|
|
58
58
|
|---|---|---|
|
|
59
|
-
| `prompt` | string, required unless `mirror`, `portrait`, `outfit`, or a template loop (`animation.template`) | The subject wording wrapped by the selected style's prompt prefix and suffix. A template loop is described by its template; a v3 or
|
|
59
|
+
| `prompt` | string, required unless `mirror`, `portrait`, `outfit`, or a template loop (`animation.template`) | The subject wording wrapped by the selected style's prompt prefix and suffix. A template loop is described by its template; a v3, pro, or sentence (`skeleton-v3` with no template) loop still needs the motion in words. |
|
|
60
60
|
| `width` / `height` | integer 16–8192 | Per-asset dimensions for generators that accept rectangular output. Provider limits may be lower. |
|
|
61
61
|
| `size` | integer 16–8192 | Per-asset square size where the generator uses one dimension. |
|
|
62
62
|
| `file` | string | Output path below the style's `outDir`; defaults to `<category>/<assetId>.png`. |
|
|
@@ -66,7 +66,7 @@ not merely a label edit.
|
|
|
66
66
|
| `remoteId` | string | The provider's own id for art that already exists on the account, so `adopt` maps it without matching bytes: an object id, a character id, or `<character id>#<animation group id>`. Not part of the spec's identity. |
|
|
67
67
|
| `revision` | object | Controlled dependency on another asset: `image-to-image`, `inpaint`, or `outpaint`; on PixelLab also `reduce-colors`, `correct-pixelart`, `remove-background`, `normal-map`, the animate modes (`animate`, `animate-pixminimax`, `animate-skeleton`), `interpolate`, and `edit-animation`. `engine: "pro-flash"` selects PixelLab's Pro Flash tier for `image-to-image`/`inpaint`. See [controlled revisions](REVISIONS.md). |
|
|
68
68
|
| `state` | object | `character` styles: a pose or outfit of another character asset. See [Characters](./CHARACTERS.md). |
|
|
69
|
-
| `animation` | object | `character` styles: a loop of another character asset in one direction. `directions` (a list, instead of `direction`) declares the loop for several directions at once and fills the unnamed flips with mirrors; see [One loop, several directions](./CHARACTERS.md#one-loop-several-directions). |
|
|
69
|
+
| `animation` | object | `character` styles: a loop of another character asset in one direction. `directions` (a list, instead of `direction`) declares the loop for several directions at once and fills the unnamed flips with mirrors; see [One loop, several directions](./CHARACTERS.md#one-loop-several-directions). `mode: "skeleton-v3"` with no `template` animates the asset's `prompt` as a sentence (3–15 `frames`, default 8; a v3 base); see [Loops from a sentence](./CHARACTERS.md#loops-from-a-sentence). |
|
|
70
70
|
| `portrait` | object | `character` styles: a bust of a base or state's south sprite, `{ "of": "<asset>", "size": 64 }`; `size` is 16, 32, 48, 64 (default), 128, or 160. See [Portraits](./CHARACTERS.md#portraits). |
|
|
71
71
|
| `outfit` | object | `character` styles: an existing loop's frames re-clothed from an outfit image, `{ "of": "<loop asset>", "reference": "<image>" }`, with optional `additionalInstructions`. See [Outfit transfer](./CHARACTERS.md#outfit-transfer). |
|
|
72
72
|
| `mirror` | string | Another asset of the same style flipped left to right, made locally at no cost. See [Mirrors](./CHARACTERS.md#mirrors). |
|
package/docs/REVISIONS.md
CHANGED
|
@@ -492,7 +492,8 @@ a supplied 18-joint skeleton per frame instead of a text motion description:
|
|
|
492
492
|
"mode": "animate-skeleton",
|
|
493
493
|
"from": "hero-idle",
|
|
494
494
|
"keypointsFile": "poses/hero-swing.json",
|
|
495
|
-
"direction": "south"
|
|
495
|
+
"direction": "south",
|
|
496
|
+
"description": "a knight in steel armour holding a sword"
|
|
496
497
|
}
|
|
497
498
|
}
|
|
498
499
|
}
|
|
@@ -522,8 +523,8 @@ over the source image, locally and for free.
|
|
|
522
523
|
`direction` is **required** for this mode (unlike `animate-pixminimax`,
|
|
523
524
|
where it is optional). `frames`/`fps`/`lastFrame`/`enhancePrompt` are all
|
|
524
525
|
rejected — the frame count comes from the keypoints file itself
|
|
525
|
-
(`frames.length`), never a manifest number. `description` (
|
|
526
|
-
character *looks like* — colours, clothing, held items) is a new field
|
|
526
|
+
(`frames.length`), never a manifest number. `description` (**required**: what
|
|
527
|
+
the character *looks like* — colours, clothing, held items) is a new field
|
|
527
528
|
distinct from the asset's own `prompt`, which this mode sends as the motion's
|
|
528
529
|
short label (PixelLab's `action`) — the same `prompt`-as-motion convention
|
|
529
530
|
`animate`/`animate-pixminimax` already use, just under this endpoint's own
|
|
@@ -553,11 +554,17 @@ Cost uses PixelLab's own documented anchors (3 frames = 2 generations, 8 = 3,
|
|
|
553
554
|
15 = 4 — barely moving with length, unlike `animate`/`animate-pixminimax`'s
|
|
554
555
|
canvas-area formula) and interpolates between the nearest two for any
|
|
555
556
|
in-between frame count, ceiling'd — the safe direction for `--budget` — since
|
|
556
|
-
no in-between value is confirmed live. **
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
557
|
+
no in-between value is confirmed live. **Both have now run live once**
|
|
558
|
+
(October 2026): `estimate-skeleton` on a 64×64 sprite, then an 8-frame
|
|
559
|
+
`animate-skeleton` revision of it billed exactly 3 generations, matching the
|
|
560
|
+
anchor, and returned 8 frames at the sprite's own 64×64 size. The endpoint
|
|
561
|
+
**requires both `description` and `action`**: the asset's `prompt` is sent as
|
|
562
|
+
`action` (a short motion label such as "wave"), and `revision.description`
|
|
563
|
+
(what the character looks like) is sent as `description`. Without a
|
|
564
|
+
`description` PixelLab answers `422` with `description: Field required`, so
|
|
565
|
+
`plan` refuses an `animate-skeleton` revision without a non-empty
|
|
566
|
+
`revision.description` (or an empty `prompt`) and the gallery's form asks for
|
|
567
|
+
one.
|
|
561
568
|
|
|
562
569
|
ComfyUI does not support this mode either, for the same structural reason as
|
|
563
570
|
`animate`/`animate-pixminimax`.
|
package/package.json
CHANGED
|
@@ -31,6 +31,13 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
31
31
|
|
|
32
32
|
## Already closed since this catalog's research began
|
|
33
33
|
|
|
34
|
+
- **Sentence-driven skeleton-v3 loops** — a character loop with
|
|
35
|
+
`mode: "skeleton-v3"`, no `template`, and a `prompt` animates the sentence
|
|
36
|
+
on `/characters/animations` (`action_description`, 3 to 15 `frames`). Billed
|
|
37
|
+
exactly 3 generations for 8 frames at 64px, frames back at 96×96; the plan
|
|
38
|
+
budgets 4. See `docs/CHARACTERS.md`, "Loops from a sentence". Shared motion
|
|
39
|
+
across directions is not wired up (one request per direction asset).
|
|
40
|
+
|
|
34
41
|
- **Skeleton-v3 template loops** — `/characters/animations`'
|
|
35
42
|
`mode: "skeleton-v3"` poses a template with the skeleton video model
|
|
36
43
|
(2 to 4 generations and 3 to 5 minutes per direction, beta, Tier 1 and
|
|
@@ -297,8 +304,9 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
297
304
|
is wrapped too, but deliberately kept outside the manifest pipeline — a
|
|
298
305
|
standalone `pixelkiln estimate-skeleton` CLI command, not a
|
|
299
306
|
`resolveSpecs`/`estimate()`-time call — so `animate-skeleton`'s submission
|
|
300
|
-
composes exactly one
|
|
301
|
-
|
|
307
|
+
composes exactly one PixelLab endpoint, not two chained together. Both
|
|
308
|
+
endpoints have since run live once (8 frames billed exactly 3), and the
|
|
309
|
+
run found that `description` is required, which `plan` now enforces. **Correcting this catalog's own prior research**: this entry
|
|
302
310
|
used to also claim a distinct "animation to animation" endpoint existed,
|
|
303
311
|
for transferring an existing walk cycle's motion onto a different
|
|
304
312
|
character. Checked against the live `animate_with_skeleton_v3` MCP tool
|
|
@@ -516,6 +524,17 @@ missing:
|
|
|
516
524
|
Aseprite. pixelkiln has no frame-set concatenation; `lastFrame` can pin a
|
|
517
525
|
clip's ending to another clip's frame file, but the two sets stay separate.
|
|
518
526
|
|
|
527
|
+
## Sentence-driven skeleton-v3 loops, shared motion across directions
|
|
528
|
+
|
|
529
|
+
PixelLab's sentence loops (`mode: "skeleton-v3"`, no template) are supported;
|
|
530
|
+
see "Already closed". What is still open: every direction of one request is
|
|
531
|
+
drawn from one 3D motion, and `animation_group_id` appends a direction to an
|
|
532
|
+
existing animation so it moves the same way. pixelkiln makes one request per
|
|
533
|
+
direction asset and never sends the group id, so each direction's motion is
|
|
534
|
+
written separately. Closing it means linking the direction assets of a
|
|
535
|
+
`directions` loop to one group (a batch like `1dir`'s, or the recorded
|
|
536
|
+
`animationGroupId` of a sibling) and passing it on the later requests.
|
|
537
|
+
|
|
519
538
|
## Map Workshop (scene composition)
|
|
520
539
|
|
|
521
540
|
PixelLab's actual scene-building surface: lay out a tile floor, place
|
|
@@ -394,6 +394,14 @@ stored 3D skeleton: a `v3` base has one (measured, 3 generations); a
|
|
|
394
394
|
refuses the loop at `plan`/`validate`, pointing at `mode: "template"`. `pro`
|
|
395
395
|
and `pro-flash` bases are not refused but are unverified.
|
|
396
396
|
|
|
397
|
+
`"mode": "skeleton-v3"` with **no** `template` animates the asset's `prompt`
|
|
398
|
+
as a sentence (`frames` 3 to 15, default 8; a v3 base): PixelLab writes it
|
|
399
|
+
into one 3D motion. Measured: 8 frames at 64px billed exactly 3 generations
|
|
400
|
+
and came back at 96×96, so the canvas can grow. The plan still budgets 4. One
|
|
401
|
+
request goes out per direction asset, so directions are not drawn from one
|
|
402
|
+
shared motion yet (docs/CHARACTERS.md, "Loops from a sentence"). The
|
|
403
|
+
`prompt` is required and gets no style prefix or suffix.
|
|
404
|
+
|
|
397
405
|
A named `template` loop (`walk`, `breathing-idle`, and similar) is trained
|
|
398
406
|
mostly on characters with empty hands, and reliably struggles once a
|
|
399
407
|
character holds an item — a weapon, a tool, anything gripped. For a
|