pixelkiln 0.92.1 → 0.92.3

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.
@@ -26,6 +26,11 @@ confirmed gap with real demand rather than a guess. Nothing here is a
26
26
  commitment to build it — it is what is missing, with the evidence for why it
27
27
  might matter, so that decision can be made deliberately.
28
28
 
29
+ For which PixelLab endpoints PixelKiln already calls, and how much is measured
30
+ about each (so a live run can be chosen by risk), read the [validation
31
+ ledger](https://pixelkiln.griffen.codes/docs/endpoints#validation-ledger)
32
+ (`docs/ENDPOINTS.md`).
33
+
29
34
  Each open entry names the PixelLab tool, why pixelkiln doesn't have it today,
30
35
  and which tutorial(s) demonstrated real (not hypothetical) demand for it.
31
36
 
@@ -52,7 +57,8 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
52
57
  `mode: "skeleton-v3"` poses a template with the skeleton video model
53
58
  (2 to 4 generations and 3 to 5 minutes per direction, beta, Tier 1 and
54
59
  up). Now a character loop's `mode: "skeleton-v3"`; see
55
- `docs/CHARACTERS.md`. Not yet billed live.
60
+ `docs/CHARACTERS.md`. A template loop on a v3 character billed 3
61
+ generations live (October 2026).
56
62
 
57
63
  - **Masked inpainting and whole-image editing** — was the single largest gap
58
64
  found (routine in at least 6 of the 26 tutorials). Now the `revision` asset
@@ -118,8 +124,8 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
118
124
  generating a 384×216 scene background in "How to Make Animated Pixel Art
119
125
  Scenes with PixelLab." Closed by the `imagePro` generator; see
120
126
  `pixellab.md`. Reference images and a style image
121
- (`reference_images`/`style_image`) remain unmodeled, and the completed
122
- job's response shape has not itself been exercised live yet.
127
+ (`reference_images`/`style_image`) remain unmodeled. The completed job's
128
+ response shape has been read live (a 64×64 call billed 10).
123
129
  - **A standalone single isometric tile** (`/create-isometric-tile`, a third,
124
130
  separate path to isometric content distinct from both `tiles`'
125
131
  `tileType: "isometric"` and `terrain`'s `/create-tileset`, which is
@@ -147,11 +153,11 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
147
153
  rotation, states, or animation for a plain object. Closed by the
148
154
  `objectPro` generator; see `pixellab.md`. It reuses `character`'s own
149
155
  `asset.state`/`asset.animation` authoring shapes and mirror handling
150
- rather than inventing parallel ones. **Cost is not independently
151
- measured**: assumed identical to `character` pro-flash's own measured
152
- formula, since the request bodies are near-identical minus `template_id` —
153
- a real assumption pending a live check, not a confirmed number the way
154
- `isometricTile`'s now is. Batch "pack" generation (N distinct objects from
156
+ rather than inventing parallel ones. **The base is measured**: a 32px
157
+ base billed 6 and returned 8 files (November 2026), matching `character`
158
+ pro-flash's formula, which the estimate assumes since the request bodies
159
+ are near-identical minus `template_id`. States and `pro` animations remain
160
+ that assumption pending a live check. Batch "pack" generation (N distinct objects from
155
161
  one call) is covered on `1dir` by its `batch` field — see below.
156
162
  - **Pixel correction** (`/correct-pixelart`, a dedicated cleanup pass distinct
157
163
  from `image-to-pixelart` — the latter is documented, docs/ENDPOINTS.md, as
@@ -203,17 +209,21 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
203
209
  `pixellab.md`. `lastFrame` covers both the "pin an ending pose" and the
204
210
  "chain from a prior animation's final frame" cases — it is just a
205
211
  manifest-relative image, which can be any earlier asset's own generated
206
- output file. **Neither endpoint's cost or completed-response shape is
207
- measured against a live account** — cost borrows `character`'s own
208
- measured v3-loop formula, and the frame list is extracted defensively from
209
- several plausible field names rather than one confirmed shape, the way
210
- `pollRevision` already handles `image-to-image`/`inpaint`. The dedicated
212
+ output file. **Both ran live in November 2026**: `animate` at 64×64 and 4 frames
213
+ billed 1 (5 frames back, input included), `animate-pixminimax` billed 1 at 8
214
+ frames and 2 at 16 (9 and 17 frames back), and the completed jobs were read
215
+ correctly. `animate`'s cost borrows `character`'s measured v3-loop formula;
216
+ `animate-pixminimax` follows PixelLab's published table. The frame list is
217
+ still extracted defensively from several plausible field names. The dedicated
211
218
  **Interpolate** endpoint (`/interpolation-v2`, a separate "Pro" two-keyframe
212
219
  tool distinct from `last_frame` pinning on the animate endpoints above) is
213
220
  now wrapped too, as the `interpolate` revision mode (parent = start
214
221
  keyframe, required `lastFrame` = end keyframe), alongside
215
222
  `/edit-animation-v2` as `edit-animation` (one text edit across a whole
216
- frame set). Both unmeasured, both borrowing the 10/15/25 Pro canvas tiers.
223
+ frame set). Both ran live in November 2026 and billed 10 each (a 64×64
224
+ `interpolate` returning 14 frames; an `edit-animation` of a 9-frame 64×64
225
+ set), on the 10/15/25 Pro canvas tiers; the planner used to read them as 25
226
+ and is calibrated. Larger canvases are unbilled.
217
227
  Real demonstrated demand for Interpolate: "Level Up Your Game: Custom
218
228
  Sprite Animation Tutorial" used it
219
229
  repeatedly, in Aseprite via PixelLab's own extension, as the fix for an
@@ -278,7 +288,8 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
278
288
  `/generate-ui-v2` ("Generate UI (Pro)": one element from a description,
279
289
  16px and up, with an optional concept image and palette hint), found on a
280
290
  later full read of the path list and now wrapped as the `uiElement`
281
- generator; see `docs/GENERATORS.md#uielement`. Unmeasured. **Splitting into individual elements and
291
+ generator; see `docs/GENERATORS.md#uielement`. A 32×32 call billed 10 and
292
+ returned 64 candidates (November 2026). **Splitting into individual elements and
282
293
  nine-slice are not buildable at all**: `GET /ui-assets/{id}` returns one
283
294
  flat composited image with no per-piece sub-image or bounding-box data in
284
295
  its response schema, regardless of how many `pieces` the request declared.
@@ -297,10 +308,11 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
297
308
  this one. **Cost confirmed live, and it overturned the borrowed
298
309
  formula**: a real 256x192 call against a Tier 2 account billed exactly 20
299
310
  generations (balance 4979.8 → 4959.8), the low end of the `create_ui_asset`
300
- MCP tool description's "20-40 generations" claim. No dedicated cost branch
311
+ MCP tool description's then "20-40 generations" claim (10-25 since the
312
+ October 2026 cut). No dedicated cost branch
301
313
  exists, so `uiAsset` still falls through to the same canvas-tier formula
302
314
  `1dir`/`tiles` use, which — given this generator's 192px floor — always
303
- predicts the 40 ceiling; the measured call billed the floor price at an
315
+ predicts the 25 ceiling; the measured call billed the floor price at an
304
316
  area well past where that formula would bill the ceiling, so it does not
305
317
  actually describe `uiAsset`'s pricing. Left unpatched from one data point:
306
318
  over-reading stays the safe `--budget` direction, but a real call likely
@@ -325,9 +337,8 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
325
337
  `animate-with-skeleton-v3` against a *different* reference image reusing
326
338
  those keypoints — a two-endpoint composition a person can now build by
327
339
  hand with the primitives above, not a primitive pixelkiln itself
328
- automates. Neither `animate-with-skeleton-v3` nor `estimate-skeleton` has
329
- been exercised against a live account; request field names come from the
330
- MCP tool schema, not an observed call.
340
+ automates. Both endpoints have run live (see above); request field names
341
+ came from the MCP tool schema, and the live run found `description` is required.
331
342
  - **Remove background** (`/remove-background`, a transparent cutout of one
332
343
  image up to 400x400, `simple` or `complex` task, optional foreground text
333
344
  hint) — closed by the `revision` asset shape's `remove-background` mode.
@@ -451,7 +462,8 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
451
462
  - Cost quotes (provisional): `create` 5 at 32 and 64px, 9 at 256px;
452
463
  `edit`/`inpaint` 5 at 64px, `inpaint` 6 at 128px; `character` and
453
464
  `object` at 64px `image: 5, rotations: 1, total: 6`, matching
454
- pixelkiln's measured `proFlashCharacterCost`. None billed live yet.
465
+ pixelkiln's measured `proFlashCharacterCost`. Only `create` has been billed
466
+ live (a 32×32 still with a palette, 5); `edit` and `inpaint` have not.
455
467
 
456
468
  Still unmodeled: `edit`'s `"reference"` method, the
457
469
  `use_color_palette_correction` flag (snap the edit back to the source's
@@ -536,15 +548,17 @@ missing:
536
548
  - **Trimming a loop's repeated frame.** The video deletes the last frame of
537
549
  a fireball loop because it repeats the first. `animate_image_pixminimax`
538
550
  says `get_image` returns `frame_count + 1` images with index 0 the input
539
- unchanged. pixelkiln's frame extraction for this mode is unexercised live,
540
- so whether the input frame lands in the set is unknown. There is no
541
- manifest way to drop a frame either way.
542
- - **The cost estimate under-reads long clips.** The MCP tool now prices
543
- PixMiniMax by generation time: 64×64 at 4, 8, 16, and 40 frames costs 1, 1,
544
- 2, and 6 generations. pixelkiln's placeholder,
545
- `ceil(width × height × frames / 65536)`, gives 1, 1, 1, and 3 for the same
546
- clips. Unlike every other unmeasured estimate here, this one under-reads,
547
- so `--budget` can be too low.
551
+ unchanged. Confirmed live (November 2026): an 8-frame clip came back as 9
552
+ frames and a 16-frame clip as 17, with pixelkiln's frame extraction reading
553
+ all of them, so the input frame is in the set. There is no manifest way to
554
+ drop a frame.
555
+ - **The cost estimate used to under-read long clips (fixed).** The MCP tool
556
+ prices PixMiniMax by generation time: 64×64 at 4, 8, 16, and 40 frames costs
557
+ 1, 1, 2, and 6 generations. pixelkiln's old placeholder,
558
+ `ceil(width × height × frames / 65536)`, gave 1, 1, 1, and 3, and a live
559
+ 16-frame clip billed 2 against a plan of 1. The estimate (`pixMiniMaxCost`)
560
+ now follows the published points and extrapolates above them; the 40-frame
561
+ point has not been billed.
548
562
  - **Joining two clips.** The video joins two orb animations end to end in
549
563
  Aseprite. pixelkiln has no frame-set concatenation; `lastFrame` can pin a
550
564
  clip's ending to another clip's frame file, but the two sets stay separate.
@@ -26,11 +26,11 @@ providers, or before any PixelLab account operation.
26
26
  | `tiles` | Ground variations or connected structures | 10–25 generations |
27
27
  | `terrain` | A two-terrain Wang tileset for elevation (grass-to-water, floor-to-cliff), or a sidescroller platform set | Sidescroller **3**, measured. Pro **15** at 32px, measured (a connected second set also billed 15). Pro **25** at 64px and standard **3** measured too; standard plans at 4, the top of PixelLab's quoted 1–4 |
28
28
  | `imagePro` | A larger or non-square background/scene, or real style transfer; takes the style `palette` as a hard constraint | **10–25 generations** by canvas (64px billed 10; a flat 40 before October 2026) |
29
- | `character` | A character in 4 or 8 directions, its poses (`state`), its loops (`animation`), bust `portrait`s, and `outfit` transfers onto a loop | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 20–40 per pose or portrait, 1 per template loop per direction (2–4 as `skeleton-v3`), 20 per outfit (measured once) |
30
- | `objectPro` | A prop, creature, or vehicle that needs rotations, states, or loops but has no character rig | 6 per base at 64px (1 from a `reference`), **unmeasured**; assumed to match `character` pro-flash |
29
+ | `character` | A character in 4 or 8 directions, its poses (`state`), its loops (`animation`), bust `portrait`s, and `outfit` transfers onto a loop | 1 per standard base, 6 per pro-flash base at 64px (1 from a `reference`), 10–25 per pose or portrait (20–40 before the October 2026 cut), 1 per template loop per direction (2–4 as `skeleton-v3`), 20 per outfit (measured once, before the cut) |
30
+ | `objectPro` | A prop, creature, or vehicle that needs rotations, states, or loops but has no character rig | 6 per base (billed 6 at 32px, November 2026; 1 from a `reference`, unmeasured); states and animations assumed to match `character` pro-flash |
31
31
  | `isometricTile` | One standalone isometric tile (a raised mesa, a cliff block), 16–64px | **1 generation, measured once** (32px `block`) |
32
- | `uiAsset` | A UI panel, button, health bar, or other chrome, from precise `pieces` and/or named `elements` | **20 generations, measured once** (256×192); the borrowed canvas-tier estimate still predicts 40 |
33
- | `uiElement` | One UI element (button, slot, bar, dialogue box) from the prompt, 16px and up, with an optional concept image | 10–25 generations, **unmeasured** |
32
+ | `uiAsset` | A UI panel, button, health bar, or other chrome, from precise `pieces` and/or named `elements` | **20 generations, measured once** (256×192, before the October 2026 cut); the borrowed canvas-tier estimate still predicts the 25 ceiling |
33
+ | `uiElement` | One UI element (button, slot, bar, dialogue box) from the prompt, 16px and up, with an optional concept image | 10–25 generations (a 32×32 call billed 10; 64 candidates at 32×32) |
34
34
  | `vfx` | An animated effect (explosion, aura, lightning, status icons) from a `vfx` block: a `preset` or `recipe`, `parts`, an optional `sprite` to build around; cut into an ordered frame set. Or a `description` (+ `artist`: `lite`/`pro`, a local PNG `sprite`) for PixelLab's paid VFX artist | workbench **free** (a renderer, not a model); `description`: lite 1–5, pro 6–28 by sprite size, billed up to 2× the quote, which is what plan counts (a lite effect with no sprite billed its quote of 1, measured once) |
35
35
  | `imageProFlash` | A styled still on the Pro Flash model (style image + `styleTraits`), 16–256px in multiples of 4; also the natural source for a Pro Flash character's south sprite | 5–9 generations, PixelLab's provisional quote |
36
36
 
@@ -221,10 +221,9 @@ mapping is not wrapped: it is "single images only", and this endpoint
221
221
  returns a grid of candidates below 171px. Reference
222
222
  images and a style image (`reference_images`, `style_image` +
223
223
  `style_options`, up to 4 subject references plus one style reference) exist
224
- on this endpoint but are not modeled yet, and the completed job's exact
225
- response shape has not been exercised against a live account — see
226
- `pollImagePro` in `src/providers/pixellab.ts` if a real call ever
227
- contradicts what it assumes.
224
+ on this endpoint but are not modeled yet. The completed job has been read
225
+ live (a 64×64 call billed 10); `pollImagePro` in `src/providers/pixellab.ts`
226
+ still reads it defensively.
228
227
 
229
228
  `objectPro` wraps `/create-object-pro-flash` — the same base → state →
230
229
  animation family `character` uses (`docs/CHARACTERS.md`), for PixelLab's
@@ -244,11 +243,12 @@ target `south` — passing any other direction, or `directions` at all to the
244
243
  API for a 1-direction object, is what the endpoint itself 400s on.
245
244
  Regenerating an already-animated direction is simpler than `character`'s
246
245
  own "find and delete the prior take" dance: `/objects/{id}/animations` has
247
- its own `replace_existing` flag, which PixelKiln always passes. **Cost is
248
- not independently measured** — `objectProCost()` assumes it prices
249
- identically to `character` pro-flash's own measured formula
250
- (`proFlashCharacterCost`), since the request bodies are near-identical minus
251
- `template_id`; treat it as a working assumption pending a live check.
246
+ its own `replace_existing` flag, which PixelKiln always passes. **Cost: the
247
+ base is measured** (32px billed 6 and returned 8 files, November 2026) —
248
+ `objectProCost()` prices it identically to `character` pro-flash's own
249
+ measured formula (`proFlashCharacterCost`), since the request bodies are
250
+ near-identical minus `template_id`. States and `pro` animations are still
251
+ that assumption, pending a live check.
252
252
  `objectPro`'s own place in `pixelkiln adopt` is not modeled yet. (N distinct
253
253
  objects from one call, PixelLab's Object Creator "pack", is the `1dir`
254
254
  `batch` field above.) `pixelkiln gallery --edit` offers "+ New state" and
@@ -318,10 +318,11 @@ dedicated "state" mechanism — it is a plain `revision` (image-to-image) of
318
318
  the base panel, the same mechanism every other generator already has.
319
319
  **Cost: confirmed live at one data point.** A real 256×192 call against a
320
320
  Tier 2 account billed exactly 20 generations (balance 4979.8 → 4959.8),
321
- matching the low end of the `create_ui_asset` MCP tool's "20–40 generations"
322
- claim. No dedicated cost branch exists, so pixelkiln still estimates it with
323
- the same canvas-tier formula `1dir`/`tiles` use — which predicts the 40
324
- ceiling for every valid `uiAsset` size, since the 192px floor already clears
321
+ matching the low end of the `create_ui_asset` MCP tool's then "20–40
322
+ generations" claim (PixelLab cut it to 10–25 in October 2026). No dedicated
323
+ cost branch exists, so pixelkiln still estimates it with the same
324
+ canvas-tier formula `1dir`/`tiles` use — which predicts the 25 ceiling
325
+ for every valid `uiAsset` size, since the 192px floor already clears
325
326
  that formula's own top tier. The measured call disproves the formula for
326
327
  this generator (it billed the floor price at an area where `1dir`/`tiles`
327
328
  would bill the ceiling), but the estimate is left as-is, an intentional
@@ -332,9 +333,10 @@ the prompt, no `pieces`/`elements` layout, sizes from 16×16 (up to 792 wide,
332
333
  688 tall, aspect-gated upstream). A style's one `styleImages` entry becomes
333
334
  the `concept_image` (design guidance); `uiColorPalette` is sent as
334
335
  `color_palette`. Reach for it over `uiAsset` for icons, slots, and small
335
- widgets under `uiAsset`'s 192px floor. Unmeasured: the plan borrows the
336
- 10/15/25 canvas tiers, and the completed job's shape has not been observed
337
- live.
336
+ widgets under `uiAsset`'s 192px floor. A 32×32 call billed 10 and returned
337
+ 64 candidates (November 2026); the plan borrows the 10/15/25 canvas tiers and
338
+ counts candidates by size (`uiElementCandidateCount`), and sizes other than
339
+ 32px are unbilled.
338
340
 
339
341
  `imageProFlash` wraps `/create-image-pro-flash`, the Pro Flash model as a plain
340
342
  still: priced 5 up to 96px, 6 up to 208px, 9 beyond (PixelLab's own
@@ -529,17 +531,17 @@ written as a set (a character's directions, an animation's frames) goes to
529
531
  so every member shares one palette or edit; the other modes refuse a set
530
532
  parent. `reduce-colors`/`correct-pixelart` cost is **confirmed live**: a flat
531
533
  0.1 generations each (not the schema's dollar-denominated example), at least
532
- at a 32×32 source — `animate`/`animate-pixminimax`/`animate-skeleton`/
533
- `interpolate`/`edit-animation` remain schema-only and unexercised.
534
- `animate-skeleton`'s request field names come from the live
535
- `animate_with_skeleton_v3` MCP tool schema, a more authoritative source than
536
- the OpenAPI document the others are taken from, but still not an observed
537
- call. `estimate-skeleton` (auto-derive a reference image's own keypoints) is
534
+ at a 32×32 source — `animate`/`animate-pixminimax`/`interpolate`/
535
+ `edit-animation` remain schema-only and unexercised.
536
+ `animate-skeleton` has run live (8 frames billed exactly 3); its request
537
+ field names come from the `animate_with_skeleton_v3` MCP tool schema, a more
538
+ authoritative source than the OpenAPI document the others are taken from, and
539
+ the run found `description` is required. `estimate-skeleton` (auto-derive a reference image's own keypoints) is
538
540
  wrapped too, but deliberately as a standalone `pixelkiln estimate-skeleton`
539
541
  CLI command, never inside `submitRevision` — see
540
542
  [pixellab-roadmap.md](./pixellab-roadmap.md)'s now-closed skeleton-driven-
541
- animation entry for why composing two never-tested-live endpoints in one
542
- submission was rejected.
543
+ animation entry for why composing two endpoints in one submission was
544
+ rejected.
543
545
 
544
546
  `animate-pixminimax`'s `direction` + `enhancePrompt` combination has a
545
547
  measured-in-practice gotcha, not just a schema quirk: PixelLab's own tutorial
@@ -621,7 +623,11 @@ high-fidelity showcase asset) rather than a default, read
621
623
  [pixellab-fidelity.md](./pixellab-fidelity.md) before choosing `size`,
622
624
  `detail`, `shading`, or `outline`. For what PixelLab can do that this adapter
623
625
  does not yet reach at all, read [pixellab-roadmap.md](./pixellab-roadmap.md)
624
- before proposing new work.
626
+ before proposing new work. To pick which PixelLab endpoint to spend a live run
627
+ on, read the [validation
628
+ ledger](https://pixelkiln.griffen.codes/docs/endpoints#validation-ledger)
629
+ (`docs/ENDPOINTS.md`): it rates each endpoint by what has been measured and
630
+ what a wrong guess could cost.
625
631
 
626
632
  For setup and current field constraints, use
627
633
  <https://pixelkiln.griffen.codes/docs/pixellab>. When working in the PixelKiln