pixelkiln 0.89.6 → 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.
@@ -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, or a plain template, v3, or pro loop,
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 the skeleton-v3 choice is greyed out; the new-loop
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
@@ -920,7 +920,11 @@ generations and finished in about two minutes:
920
920
  the top-level amount is a dollar zero. PixelLab says the action is written
921
921
  into one 3D motion that every direction is drawn from, so later directions
922
922
  added with `animation_group_id` move the same way (humanoids). pixelkiln
923
- does not send this mode yet.
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`).
924
928
 
925
929
  ## Characters, measured
926
930
 
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 pro loop still needs the motion in words. |
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` (optional: what the
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
@@ -560,8 +561,10 @@ anchor, and returned 8 frames at the sprite's own 64×64 size. The endpoint
560
561
  **requires both `description` and `action`**: the asset's `prompt` is sent as
561
562
  `action` (a short motion label such as "wave"), and `revision.description`
562
563
  (what the character looks like) is sent as `description`. Without a
563
- `description` PixelLab answers `422` with `description: Field required`,
564
- and `plan` does not catch that yet.
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.
565
568
 
566
569
  ComfyUI does not support this mode either, for the same structural reason as
567
570
  `animate`/`animate-pixminimax`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixelkiln",
3
- "version": "0.89.6",
3
+ "version": "0.90.0",
4
4
  "description": "Manifest-driven pixel-art generation, review, recovery, and packaging with deterministic provenance.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1307,7 +1307,7 @@
1307
1307
  },
1308
1308
  "frames": {
1309
1309
  "type": "integer",
1310
- "minimum": 4,
1310
+ "minimum": 3,
1311
1311
  "maximum": 16
1312
1312
  },
1313
1313
  "fps": {
@@ -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
@@ -299,7 +306,7 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
299
306
  `resolveSpecs`/`estimate()`-time call — so `animate-skeleton`'s submission
300
307
  composes exactly one PixelLab endpoint, not two chained together. Both
301
308
  endpoints have since run live once (8 frames billed exactly 3), and the
302
- run found that `description` is required: `plan` does not check for it yet. **Correcting this catalog's own prior research**: this entry
309
+ run found that `description` is required, which `plan` now enforces. **Correcting this catalog's own prior research**: this entry
303
310
  used to also claim a distinct "animation to animation" endpoint existed,
304
311
  for transferring an existing walk cycle's motion onto a different
305
312
  character. Checked against the live `animate_with_skeleton_v3` MCP tool
@@ -517,19 +524,16 @@ missing:
517
524
  Aseprite. pixelkiln has no frame-set concatenation; `lastFrame` can pin a
518
525
  clip's ending to another clip's frame file, but the two sets stay separate.
519
526
 
520
- ## Sentence-driven skeleton-v3 loops
527
+ ## Sentence-driven skeleton-v3 loops, shared motion across directions
521
528
 
522
- PixelLab's October 2026 character-creator update adds custom animation on the
523
- skeleton v3 model: a sentence becomes one 3D motion that every direction of
524
- the animation is drawn from, so a direction added later moves the same way.
525
- It is `POST /characters/animations` with `mode: "skeleton-v3"`, an
526
- `action_description`, and no `template_animation_id` (3 to 15 frames, humanoid
527
- v3 characters). **Measured once**: an 8-frame south loop billed exactly 3 and
528
- came back at 96×96 (docs/ENDPOINTS.md, "Skeleton-driven motion, measured").
529
- Still a gap: a character loop's `mode: "skeleton-v3"` needs a `template`,
530
- and the request never sends `action_description` for it. Closing it means a
531
- loop that names `skeleton-v3` and a `prompt` without a template, a
532
- `frames` count from 3 to 15, and adding a direction to an existing group.
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.
533
537
 
534
538
  ## Map Workshop (scene composition)
535
539
 
@@ -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