pixelkiln 0.83.0 → 0.85.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/PROVIDERS.md +3 -3
- package/dist/cli.js +957 -611
- package/dist/cli.js.map +1 -1
- package/dist/client/gallery.css +2 -0
- package/dist/client/gallery.js +3366 -3087
- package/dist/index.cjs +876 -530
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +792 -71
- package/dist/index.d.ts +792 -71
- package/dist/index.js +783 -437
- package/dist/index.js.map +1 -1
- package/docs/MANIFEST.md +10 -6
- package/docs/REVISIONS.md +66 -15
- package/docs/SCENARIO.md +174 -7
- package/package.json +1 -1
- package/schema/manifest.schema.json +22 -0
- package/skills/pixelkiln/references/pixellab-roadmap.md +10 -0
- package/skills/pixelkiln/references/pixellab.md +6 -3
- package/skills/pixelkiln/references/revisions.md +13 -7
- package/skills/pixelkiln/references/scenario.md +8 -4
package/docs/MANIFEST.md
CHANGED
|
@@ -64,7 +64,7 @@ not merely a label edit.
|
|
|
64
64
|
| `source` | string | Manifest-relative committed art used instead of generation. For a set of PNG outputs (a `frames` animation, a `tiles` set) a path that is not a file is the stem of a hand edit laid beside the generated members (`<stem>-<role>.png` each); the set still generates. Mutually exclusive with `revision`. |
|
|
65
65
|
| `sourceByStyle` | object | Per-style `source`, keyed by style id; wins over `source` for that style. Written by `pixelkiln edit` for a hand edit of an asset that is in several styles. |
|
|
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
|
-
| `revision` | object | Controlled dependency on another asset: `image-to-image`, `inpaint`, or `outpaint`; on PixelLab also `reduce-colors`, `correct-pixelart`, 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). |
|
|
67
|
+
| `revision` | object | Controlled dependency on another asset: `image-to-image`, `inpaint`, or `outpaint`; on PixelLab also `reduce-colors`, `correct-pixelart`, `remove-background`, 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
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). |
|
|
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). |
|
|
@@ -471,22 +471,26 @@ their own page: [Characters](./CHARACTERS.md) and
|
|
|
471
471
|
|
|
472
472
|
| Revision field | Type | Meaning |
|
|
473
473
|
|---|---|---|
|
|
474
|
-
| `mode` | enum, required | `image-to-image`, `inpaint`, `outpaint`, `reduce-colors`, `correct-pixelart`, `animate`, `animate-pixminimax`, `animate-skeleton`, `interpolate`, or `edit-animation`. The selected provider must opt into the mode. |
|
|
474
|
+
| `mode` | enum, required | `image-to-image`, `inpaint`, `outpaint`, `reduce-colors`, `correct-pixelart`, `remove-background`, `animate`, `animate-pixminimax`, `animate-skeleton`, `interpolate`, or `edit-animation`. The selected provider must opt into the mode. |
|
|
475
475
|
| `from` | asset id, required | Parent asset in the same style. Self-references, unknown ids, and cycles are rejected. A parent written as a set (a character's directions, an animation's frames) is read as every member: `reduce-colors`, `correct-pixelart`, and `edit-animation` take the whole set in one call; the other modes refuse it. See [Revising a whole set at once](./REVISIONS.md#revising-a-whole-set-at-once). |
|
|
476
476
|
| `mask` | string | Manifest-relative PNG required for `inpaint`; rejected for the other modes. Its dimensions must match an available source. |
|
|
477
|
-
| `strength` | number 0–1 | Workflow edit/denoise strength (`image-to-image`, `correct-pixelart`); rejected for `reduce-colors`, `animate`, `animate-pixminimax`, `interpolate`, and `edit-animation`. Interpretation is provider- and model-specific. |
|
|
477
|
+
| `strength` | number 0–1 | Workflow edit/denoise strength (`image-to-image`, `correct-pixelart`); rejected for `reduce-colors`, `remove-background`, `animate`, `animate-pixminimax`, `interpolate`, and `edit-animation`. Interpretation is provider- and model-specific. |
|
|
478
478
|
| `numColors` | integer 2–256 | `reduce-colors` only. Target palette size; mutually exclusive with `paletteImage`. |
|
|
479
|
+
| `removalTask` | `simple` or `complex` | `remove-background` only. `simple` (PixelLab's default) is faster for flat backgrounds; `complex` handles detailed edges. |
|
|
479
480
|
| `paletteImage` | string | `reduce-colors` only. Manifest-relative image whose colors become the palette; unlike `mask`, no size relationship to the source is required. |
|
|
480
481
|
| `dithering` | enum | `reduce-colors` only. `none` (default), `2x2`, `4x4`, or `8x8`. |
|
|
481
482
|
| `ditheringStrength` | number 0–10 | `reduce-colors` only. Ignored when `dithering` is `none`. |
|
|
482
|
-
| `frames` | integer 4–40, even | `animate`/`animate-pixminimax` only. `animate` caps at 16; `animate-pixminimax` allows up to 40. Rejected for `animate-skeleton` (frame count comes from `keypointsFile` instead), `interpolate`, and `edit-animation`. |
|
|
483
|
+
| `frames` | integer 4–40, even | `animate`/`animate-pixminimax` only. `animate` caps at 16 (even); `animate-pixminimax` allows up to 40 in multiples of 4. Rejected for `animate-skeleton` (frame count comes from `keypointsFile` instead), `interpolate`, and `edit-animation`. |
|
|
483
484
|
| `fps` | integer 1–60 | `animate`/`animate-pixminimax`/`interpolate`/`edit-animation` only. Playback rate recorded with the frames; the provider does not store one. Defaults to the parent's own rate when it is a loop, else 8. |
|
|
484
485
|
| `lastFrame` | string | `animate`/`animate-pixminimax`: manifest-relative image pinning where the motion ends, turning an open-ended animation into an interpolation. `interpolate`: required, the ending keyframe (the parent is the start); it must match the parent's size. |
|
|
485
|
-
| `direction` | enum | `animate-pixminimax`/`animate-skeleton`. Optional (
|
|
486
|
+
| `direction` | enum | `animate-pixminimax`/`animate-skeleton`. Optional for the former (a caption field PixelLab otherwise reads off the image); **required** for the latter. |
|
|
486
487
|
| `enhancePrompt` | boolean | `animate`/`animate-pixminimax` only. Lets the provider expand the prompt into a fuller motion description first, for an extra documented +0.05-generation surcharge. |
|
|
488
|
+
| `driftThreshold` | number ≥ 0 | `animate`/`animate-pixminimax` only. Colour de-flicker sensitivity: frames drifting from the first beyond it are corrected toward it; `0` corrects every frame. Omit for PixelLab's default. |
|
|
489
|
+
| `subjectDescription` | string ≤ 300 | `animate-pixminimax` only. What the parent shows, one noun phrase; PixelLab reads it off the image when omitted and can decline some images. |
|
|
490
|
+
| `initialPose` | string ≤ 300 | `animate-pixminimax` only. The pose the parent is in; read off the image when omitted. |
|
|
487
491
|
| `keypointsFile` | string, required for `animate-skeleton` | Manifest-relative JSON file (`src/skeleton.ts`'s `SkeletonSetSchema`): the pose the source is already in, plus 3–15 per-frame poses. See [Skeleton-driven animation](./REVISIONS.md#skeleton-driven-animation). |
|
|
488
492
|
| `skeletonTemplate` | string | `animate-skeleton` only. Body a joint's missing `depth` is taken from: `mannequin` (default), `bear`, `cat`, `dog`, `horse`, or `lion`. |
|
|
489
|
-
| `description` | string | `animate-skeleton
|
|
493
|
+
| `description` | string | `animate-skeleton`: what the subject *looks like* (colours, clothing, held items) — the asset's own `prompt` is sent as the motion's short label instead. `remove-background`: a hint naming the foreground. Rejected on other modes. |
|
|
490
494
|
| `engine` | enum | `image-to-image`/`inpaint` only. `pro-flash` draws the edit with PixelLab's Pro Flash edit or inpaint endpoint instead of the default Pro one: 5–9 generations instead of 20–40, 32 to 256px per side in multiples of 4, no `strength`. Omit for the default. |
|
|
491
495
|
|
|
492
496
|
The parent may use committed `source`, downloaded generated output, or a
|
package/docs/REVISIONS.md
CHANGED
|
@@ -5,14 +5,16 @@ The parent may be committed art, a downloaded generation, or an approved
|
|
|
5
5
|
quality output. PixelKiln hashes the exact parent and mask bytes, blocks stale
|
|
6
6
|
dependencies before submission, and records the lineage in the lockfile.
|
|
7
7
|
|
|
8
|
-
The manifest and pipeline are provider-neutral. ComfyUI and
|
|
8
|
+
The manifest and pipeline are provider-neutral. ComfyUI, PixelLab and Scenario implement
|
|
9
9
|
it; PixelLab covers `image-to-image`, `inpaint`, `reduce-colors`,
|
|
10
|
-
`correct-pixelart`, `
|
|
11
|
-
`interpolate`, and `edit-animation`, not `outpaint` (its API has no
|
|
10
|
+
`correct-pixelart`, `remove-background`, `animate`, `animate-pixminimax`,
|
|
11
|
+
`animate-skeleton`, `interpolate`, and `edit-animation`, not `outpaint` (its API has no
|
|
12
12
|
canvas-expansion endpoint). ComfyUI covers every mode generically except the
|
|
13
13
|
five frame-set modes (`animate`, `animate-pixminimax`, `animate-skeleton`,
|
|
14
14
|
`interpolate`, `edit-animation`), which need an ordered frame set its
|
|
15
|
-
revision path cannot produce.
|
|
15
|
+
revision path cannot produce. Scenario covers `image-to-image` only, by uploading the parent as a reference
|
|
16
|
+
image to its editing models ([Set up Scenario](./SCENARIO.md#reference-images-and-edits)).
|
|
17
|
+
Retro Diffusion rejects revision
|
|
16
18
|
work during offline resolution instead of silently starting a fresh
|
|
17
19
|
text-to-image job.
|
|
18
20
|
|
|
@@ -59,17 +61,28 @@ input to the provider workflow, not a cross-model quality guarantee.
|
|
|
59
61
|
**From the gallery** (`pixelkiln gallery --edit`): open a completed or
|
|
60
62
|
committed asset's drawer and use "+ New revision" under "Revisions from this
|
|
61
63
|
asset" to create a child of it. On a PixelLab sprite the mode picker offers
|
|
62
|
-
`image-to-image`, `animate`, `animate-pixminimax`, `
|
|
63
|
-
`correct-pixelart`; on a PixelLab
|
|
64
|
-
offers `edit-animation`,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
`image-to-image`, `inpaint`, `animate`, `animate-pixminimax`, `interpolate`,
|
|
65
|
+
`reduce-colors`, `correct-pixelart`, and `remove-background`; on a PixelLab
|
|
66
|
+
frame set (or a character's directions) it offers `edit-animation`,
|
|
67
|
+
`reduce-colors`, and `correct-pixelart`, which take the whole set. ComfyUI
|
|
68
|
+
sprites get `image-to-image` and `inpaint`; other providers get
|
|
69
|
+
`image-to-image`. The form asks only for the new asset id, the instruction or
|
|
70
|
+
motion, and the mode's own options (strength, frames, fps, colours,
|
|
71
|
+
dithering, removal task).
|
|
72
|
+
|
|
73
|
+
`inpaint` opens a mask editor over the sprite: paint the area to repaint with
|
|
74
|
+
a brush sized in sprite pixels, erase, invert, undo. Saving writes the mask
|
|
75
|
+
as a black-and-white PNG of the sprite's size at the path you give (default
|
|
76
|
+
`masks/<asset-id>.png`) and declares the revision in one step; if the manifest
|
|
77
|
+
refuses the asset the mask file is removed again. The sprite must be 32 to 512
|
|
78
|
+
pixels per side. `interpolate` offers the project's other single-image
|
|
79
|
+
records of the same style and size as the ending keyframe (the parent is the
|
|
80
|
+
start), for sprites 16 to 128 pixels per side; it appears only when there is
|
|
81
|
+
one. The button only
|
|
68
82
|
appears once the parent has usable pixels (committed `source`, a current
|
|
69
83
|
downloaded generation, or a current approved quality output); the plan still
|
|
70
84
|
reports `blocked` with the real reason if that turns out wrong once the asset
|
|
71
|
-
exists. `
|
|
72
|
-
the gallery offers neither, so those still have to be added by hand.
|
|
85
|
+
exists. `outpaint` is not offered; no provider implements it.
|
|
73
86
|
|
|
74
87
|
"+ Skeleton animation", beside it on a single PixelLab sprite, creates an
|
|
75
88
|
`animate-skeleton` child instead. The poses come from a keypoints file already
|
|
@@ -165,6 +178,31 @@ photographs and 3-D renders, not for reprocessing" pixel art):
|
|
|
165
178
|
`strength` (0–1, PixelLab's own default 0.1) is how far the model may move
|
|
166
179
|
from the source; start low and only raise it for real repair.
|
|
167
180
|
|
|
181
|
+
### Remove a background
|
|
182
|
+
|
|
183
|
+
`remove-background` calls PixelLab's `/remove-background` and returns the
|
|
184
|
+
same sprite on a transparent background. It is synchronous like the other
|
|
185
|
+
cleanup modes, takes one image of at most 400 by 400 pixels, and refuses a
|
|
186
|
+
set parent. Our measurements found it the one utility that leaves a locked
|
|
187
|
+
palette intact (it also drops stray fringe pixels; see
|
|
188
|
+
[ENDPOINTS](./ENDPOINTS.md#post-processing-utilities-measured)); cost is 1
|
|
189
|
+
generation.
|
|
190
|
+
|
|
191
|
+
```jsonc
|
|
192
|
+
{
|
|
193
|
+
"revision": {
|
|
194
|
+
"mode": "remove-background",
|
|
195
|
+
"from": "hero",
|
|
196
|
+
"removalTask": "complex",
|
|
197
|
+
"description": "a knight holding a sword"
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`removalTask` is `simple` (PixelLab's default: faster, for flat backgrounds)
|
|
203
|
+
or `complex` (slower, for detailed edges). `description` is an optional hint
|
|
204
|
+
naming the foreground. Both are rejected on other modes, as is `strength`.
|
|
205
|
+
|
|
168
206
|
### Revising a whole set at once
|
|
169
207
|
|
|
170
208
|
Both modes also take a parent that is a **set** rather than one image: a
|
|
@@ -233,8 +271,18 @@ pixels the same way `image-to-image` does:
|
|
|
233
271
|
`animate` calls `/animate-with-text-v3` (4–16 frames, even). `animate-pixminimax`
|
|
234
272
|
calls `/animate-pixminimax` — PixelLab's MiniMax-powered engine, beta and
|
|
235
273
|
gated to a tier 1 subscription or higher — for 4 to 40 frames and two extra
|
|
236
|
-
knobs: `direction` (the sprite's facing,
|
|
237
|
-
|
|
274
|
+
knobs: `direction` (the sprite's facing, which also aims `enhancePrompt`'s
|
|
275
|
+
motion the right way on screen) and the same `enhancePrompt`. It also takes
|
|
276
|
+
two caption fields, `subjectDescription` (what the parent shows, one noun
|
|
277
|
+
phrase) and `initialPose` (the pose it is in). PixelLab reads any caption
|
|
278
|
+
field you leave out off the image with an AI model, and can decline some
|
|
279
|
+
images, failing the job until you send them yourself; sending all of them,
|
|
280
|
+
with `enhancePrompt` off, rewrites nothing. The style's `view` is sent as the
|
|
281
|
+
view caption. `frames` must be a multiple of 4 for this mode, which is
|
|
282
|
+
checked at plan time. Both modes take `driftThreshold`, PixelLab's colour
|
|
283
|
+
de-flicker sensitivity: frames whose foreground drifts from the first frame
|
|
284
|
+
beyond it are corrected toward it, `0` corrects every frame, and omitting it
|
|
285
|
+
keeps PixelLab's default. Both
|
|
238
286
|
reject a declared `strength` (there is no denoise knob here, same as
|
|
239
287
|
`image-to-image`) and both send the asset's own `prompt` as the motion
|
|
240
288
|
description — `action` for `animate`, `description` for `animate-pixminimax`.
|
|
@@ -369,7 +417,10 @@ inline pixels. It must match the shape `src/skeleton.ts`'s `SkeletonSetSchema`
|
|
|
369
417
|
validates: `{"firstFrameKeypoints": [...18 joints], "frames": [[...18
|
|
370
418
|
joints], ...3 to 15 of them]}`, each joint `{"label": "RIGHT KNEE", "x": 0.52,
|
|
371
419
|
"y": 0.71, "z_index": 9, "depth": 4}` (`depth` optional — PixelLab fills it
|
|
372
|
-
from `skeletonTemplate`, default `mannequin`, when omitted).
|
|
420
|
+
from `skeletonTemplate`, default `mannequin`, when omitted). The request also
|
|
421
|
+
carries the style's `view` (`side`, `low top-down`, or `high top-down`) so the
|
|
422
|
+
motion is posed for the sprite's own camera; PixelLab assumes `low top-down`
|
|
423
|
+
otherwise. `label` is one
|
|
373
424
|
of PixelLab's 18 joints (`NOSE`, `NECK`, `RIGHT`/`LEFT` `SHOULDER`, `ELBOW`,
|
|
374
425
|
`ARM` for the wrist, `HIP`, `KNEE`, `LEG` for the ankle, `EYE`, `EAR`), each
|
|
375
426
|
exactly once per pose; a misspelled or repeated joint fails when the manifest
|
package/docs/SCENARIO.md
CHANGED
|
@@ -31,8 +31,12 @@ override the production API root. Ordinary projects should leave it unset.
|
|
|
31
31
|
PixelKiln calls `POST /generate/custom/{modelId}`. Scenario model inputs vary;
|
|
32
32
|
inspect the model's current parameter reference before adding optional inputs.
|
|
33
33
|
The initial PixelKiln contract sends `prompt`, `width`, `height`, `numOutputs`,
|
|
34
|
-
and an optional `seed`. It accepts dimensions from
|
|
35
|
-
|
|
34
|
+
and an optional `seed`. It accepts whole-number dimensions from 16 to 4096px and one to four PNG
|
|
35
|
+
outputs. Each model has its own tighter bounds (FLUX takes 128 to 2048 in
|
|
36
|
+
steps of 16, Retro Diffusion Plus 16 to 384); the free dry run that precedes
|
|
37
|
+
every paid request reports them, for example "Input width must be at least
|
|
38
|
+
672", before anything is spent. A model may also return a different canvas than
|
|
39
|
+
the one requested, so check real dimensions.
|
|
36
40
|
|
|
37
41
|
The public `model_bfl-flux-2-dev` profile documents that input shape. A custom
|
|
38
42
|
LoRA used with that base can be supplied as `parameters.modelId` when the
|
|
@@ -78,9 +82,146 @@ keeps job and asset lookup scoped to the intended Scenario project.
|
|
|
78
82
|
replace PixelKiln-owned `prompt`, dimensions, seed, output count, project, or
|
|
79
83
|
budget fields.
|
|
80
84
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
85
|
+
## Reference images and edits
|
|
86
|
+
|
|
87
|
+
Most Scenario image models take reference images, which serve both as style
|
|
88
|
+
guidance and as the image to edit. PixelKiln uploads each local image to
|
|
89
|
+
Scenario once (`POST /assets`, free), keeps the returned asset id by content
|
|
90
|
+
hash in a temporary cache so a rerun does not upload it again, and sends the ids
|
|
91
|
+
as the model's `referenceImages` input. Two things use this:
|
|
92
|
+
|
|
93
|
+
- A style's `styleImages` are sent as references with every asset in the style.
|
|
94
|
+
- An `image-to-image` revision sends its parent first, then any style images.
|
|
95
|
+
The prompt is the edit instruction, as in
|
|
96
|
+
[controlled revisions](./REVISIONS.md). Masked `inpaint` and the
|
|
97
|
+
PixelLab animation and cleanup modes are not available, and `strength` is
|
|
98
|
+
refused because Scenario has no common one; use the model's own `parameters`.
|
|
99
|
+
|
|
100
|
+
```jsonc
|
|
101
|
+
{
|
|
102
|
+
"styles": {
|
|
103
|
+
"edit": {
|
|
104
|
+
"generator": "map",
|
|
105
|
+
"size": 512,
|
|
106
|
+
"outDir": "assets/generated",
|
|
107
|
+
"providerOptions": {
|
|
108
|
+
"scenario": { "modelId": "model_bfl-flux-2-klein-9b", "maxComputeUnits": 1 }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"assets": {
|
|
113
|
+
"keep": { "prompt": "a stone mountain keep", "source": "art/keep.png" },
|
|
114
|
+
"keep-snow": {
|
|
115
|
+
"prompt": "the same keep in winter: snow on the roofs, pixel art",
|
|
116
|
+
"revision": { "mode": "image-to-image", "from": "keep" }
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The adapter does not know each model's input names, so a model whose image
|
|
123
|
+
input is not called `referenceImages` needs `referenceParameter` (for example
|
|
124
|
+
`"image"`), and `referenceArray: false` if it takes one image rather than a
|
|
125
|
+
list. `parameters` may not also set that input. A model must accept images at
|
|
126
|
+
all: the free dry run, which now includes the references, rejects one that
|
|
127
|
+
does not before anything is spent. A reference can add to the quote (GPT Image 2
|
|
128
|
+
priced one text-only 512×512 request at 11 CU and the same request with a
|
|
129
|
+
reference at 12).
|
|
130
|
+
|
|
131
|
+
On October 5, 2026 a one-image `image-to-image` revision of the bake-off's GPT
|
|
132
|
+
Image 2 keep through `model_bfl-flux-2-klein-9b` quoted and billed 1 CU and
|
|
133
|
+
returned the same keep with snow on its roofs and battlements, banners and
|
|
134
|
+
layout intact. The committed
|
|
135
|
+
[Scenario edit smoke](../benchmarks/provider-scenario-edit/README.md) has the
|
|
136
|
+
manifest, lockfile, and both images. That is one sample on one model.
|
|
137
|
+
|
|
138
|
+
### Tool models as image-to-image
|
|
139
|
+
|
|
140
|
+
Scenario's single-image tools (pixel snapper, pixelate, background removal,
|
|
141
|
+
upscalers) are models like any other, so they run through the same
|
|
142
|
+
`image-to-image` revision with no extra mode: point the style at the tool's
|
|
143
|
+
model, name its input `image`, and put its settings in `parameters`. The
|
|
144
|
+
adapter's other fields (`prompt`, `width`, `height`, `numOutputs`, `seed`) are
|
|
145
|
+
accepted and ignored by these tools, and the free dry run prices the exact
|
|
146
|
+
request. Free dry runs on October 5, 2026 quoted these on a `cu-basic` account:
|
|
147
|
+
|
|
148
|
+
| Model | CU | Inputs besides `image` |
|
|
149
|
+
|---|---:|---|
|
|
150
|
+
| `model_birefnet-background-removal` | 2 | none |
|
|
151
|
+
| `model_recraft-crisp-upscale` | 2 | none |
|
|
152
|
+
| `model_bria-remove-background`, `model_photoroom-background-removal` | 3 | none |
|
|
153
|
+
| `model_pixel-snapper` | 5 | `colors` 8 to 256 (default 16) |
|
|
154
|
+
| `model_sc-pixelate` | 5 | `pixelGridSize` 1 to 512, `removeNoise`, `colorPalette`, `colorPaletteSize` |
|
|
155
|
+
| `model_upscale-v3`, `model_topaz-image-upscale` | 10 | none |
|
|
156
|
+
|
|
157
|
+
```jsonc
|
|
158
|
+
{
|
|
159
|
+
"styles": {
|
|
160
|
+
"snap": {
|
|
161
|
+
"generator": "map",
|
|
162
|
+
"size": 512,
|
|
163
|
+
"outDir": "assets/snapped",
|
|
164
|
+
"providerOptions": {
|
|
165
|
+
"scenario": {
|
|
166
|
+
"modelId": "model_pixel-snapper",
|
|
167
|
+
"maxComputeUnits": 5,
|
|
168
|
+
"referenceParameter": "image",
|
|
169
|
+
"referenceArray": false,
|
|
170
|
+
"parameters": { "colors": 16 }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
"assets": {
|
|
176
|
+
"keep-snapped": {
|
|
177
|
+
"prompt": "snap to the pixel grid",
|
|
178
|
+
"revision": { "mode": "image-to-image", "from": "keep" }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Birefnet and Pixel Snapper were then run once each through the adapter (7 CU,
|
|
185
|
+
quoted and billed identically; see the
|
|
186
|
+
[tool-model smoke](../benchmarks/provider-scenario-tools/README.md)). Pixel
|
|
187
|
+
Snapper returned an 83×83, exactly-16-colour native-grid version of a 512×512
|
|
188
|
+
image, a different size than the manifest's canvas, and Birefnet's cutout kept
|
|
189
|
+
its subject at alpha 254 rather than 255. The other tools were only quoted. They overlap PixelKiln's own offline work: `pixelkiln refine` snaps
|
|
190
|
+
the grid and palette for free, and PixelLab's `remove-background` revision costs
|
|
191
|
+
one generation. Reach for these when the art is already on Scenario.
|
|
192
|
+
|
|
193
|
+
### Retro Diffusion on Scenario
|
|
194
|
+
|
|
195
|
+
Scenario hosts three Retro Diffusion models, and they are the most pixel-art-specific
|
|
196
|
+
models in its catalog: `model_retrodiffusion-plus` (18 styles from `default` and
|
|
197
|
+
`retro` to `isometric_asset`, `topdown_asset`, `character_turnaround`, and
|
|
198
|
+
`ui_element`), `model_retrodiffusion-tile` (`tileset`, `tileset_advanced`,
|
|
199
|
+
`single_tile`, `tile_variation`, `tile_object`, `scene_object`), and
|
|
200
|
+
`model_retrodiffusion-animation` (`four_angle_walking`, `walking_and_idle`,
|
|
201
|
+
`small_sprites`, `vfx`). On a `cu-basic` account every dry run answered
|
|
202
|
+
`ModelAccessRestrictedError` with `requiredPlan: cu-pro-q3-25`, so none of this
|
|
203
|
+
has been run, and no price is known until the plan is upgraded.
|
|
204
|
+
|
|
205
|
+
Judging from Scenario's parameter reference (nothing here was exercised), what
|
|
206
|
+
the adapter already supports and what it does not:
|
|
207
|
+
|
|
208
|
+
| Need | Status |
|
|
209
|
+
|---|---|
|
|
210
|
+
| `style`, `removeBg`, `tileX`, `tileY`, `strength`, `bypassPromptExpansion` | Pass-through `parameters`. |
|
|
211
|
+
| 16 to 384 px canvas | Accepted now; the model's bound comes from the free dry run. |
|
|
212
|
+
| `image` (image-to-image) | Supported through an `image-to-image` revision with `referenceParameter: "image"` and `referenceArray: false`. |
|
|
213
|
+
| `inputPalette` (a palette image) | Not supported: the adapter has one reference input. |
|
|
214
|
+
| More than 4 outputs (Plus and Tile allow 10) | Not supported: `numOutputs` stops at 4. |
|
|
215
|
+
| Animation as a PNG spritesheet (`returnSpritesheet: true`) | Lands as one still image; there is no frame-set output for Scenario, so a person would slice it. The default GIF output is refused. |
|
|
216
|
+
| Tilesets | Land as one still; PixelKiln's tile roles and exports do not apply. |
|
|
217
|
+
|
|
218
|
+
PixelKiln also has a direct [Retro Diffusion](./RETRO_DIFFUSION.md) provider
|
|
219
|
+
with live-tested single stills. Choosing between them is a billing and plan
|
|
220
|
+
question (Retro Diffusion's USD credits against Scenario's compute units), not a
|
|
221
|
+
feature one, until the Scenario route is measured. The first live check after
|
|
222
|
+
upgrading should be one `model_retrodiffusion-plus` still at 64×64 with the
|
|
223
|
+
default style: quote, billed amount, dimensions, and whether it comes back as
|
|
224
|
+
PNG.
|
|
84
225
|
|
|
85
226
|
## Plan before spending
|
|
86
227
|
|
|
@@ -114,6 +255,12 @@ quote stops the run before paid work. Scenario's `costDetails` already sum to
|
|
|
114
255
|
`creativeUnitsCost`; PixelKiln records both without double-counting. A separate
|
|
115
256
|
IP-detection charge is additive when Scenario reports one.
|
|
116
257
|
|
|
258
|
+
A 429 on a generation request means the account's concurrent-job limit
|
|
259
|
+
refused it: nothing was accepted or billed, and the adapter retries for about
|
|
260
|
+
80 seconds. Past that, rerun `gen`; the assets that landed are kept. A finished
|
|
261
|
+
job whose asset is not a PNG (some models return JPEG) is billed, so that asset
|
|
262
|
+
is marked failed rather than polled again.
|
|
263
|
+
|
|
117
264
|
The command budget is still a hard ceiling over the whole selected run. The
|
|
118
265
|
manifest ceiling protects each request from a changed live quote.
|
|
119
266
|
|
|
@@ -123,6 +270,24 @@ closed palette, and require named approval before pack or mount. This offline
|
|
|
123
270
|
policy does not change the Scenario request or CU quote. See
|
|
124
271
|
[Manifest quality profiles](./MANIFEST.md#quality-profiles).
|
|
125
272
|
|
|
273
|
+
### Models and what they cost
|
|
274
|
+
|
|
275
|
+
A free survey on October 5, 2026 quoted every non-deprecated text-to-image
|
|
276
|
+
model with a prompt-only 512×512 dry run on a `cu-basic` account. 37 were
|
|
277
|
+
usable and 19 were refused with `ModelAccessRestrictedError` (the Retro
|
|
278
|
+
Diffusion Plus, Tile, and Animation models need the `cu-pro-q3-25` plan).
|
|
279
|
+
Quotes ran from 1 CU (FLUX.2 Klein 9b, FLUX.1 Schnell, P-Image) through 2 to 6
|
|
280
|
+
for the Krea 2, Recraft V4.1 Flash, Meta Muse, Ernie, Z-Image, and Qwen Image
|
|
281
|
+
models, 11 to 12 for GPT Image 2 and Gemini 3.1 Flash, to 16 for the FLUX.2 Dev
|
|
282
|
+
this page was first validated on. The
|
|
283
|
+
[model bake-off](../benchmarks/provider-scenario-bakeoff/README.md) ran ten of
|
|
284
|
+
them once: price did not predict fit, several models ignore the requested
|
|
285
|
+
canvas size, and one returned a JPEG, which the adapter refuses.
|
|
286
|
+
|
|
287
|
+
Scenario's catalog also lists pixel-art LoRAs, background-removal and upscale
|
|
288
|
+
models, and a `pixel-snapper` cleanup tool. LoRA models answer a different
|
|
289
|
+
endpoint than `/generate/custom/{modelId}`, which this adapter does not call.
|
|
290
|
+
|
|
126
291
|
### Current live validation
|
|
127
292
|
|
|
128
293
|
On September 5, 2026, PixelKiln authenticated against the read-only model
|
|
@@ -184,9 +349,11 @@ for every style:
|
|
|
184
349
|
| `numOutputs` | One to four PNG candidates; defaults to one. |
|
|
185
350
|
| `projectId` | Optional Scenario ownership/routing project. |
|
|
186
351
|
| `parameters` | Additional model-specific JSON inputs. PixelKiln-owned request fields cannot be overridden. |
|
|
352
|
+
| `referenceParameter` | The model input that takes images, default `referenceImages`. |
|
|
353
|
+
| `referenceArray` | `false` when that input takes one image rather than a list. |
|
|
187
354
|
|
|
188
|
-
The current adapter supports `map`, dimensions from
|
|
189
|
-
|
|
355
|
+
The current adapter supports `map`, whole-number dimensions from 16 to 4096px,
|
|
356
|
+
optional seed, style images and `image-to-image` revisions as reference uploads. Every paid request is preceded
|
|
190
357
|
by an identical `dryRun=true` request. See [Set up Scenario](SCENARIO.md) for
|
|
191
358
|
credentials, cost semantics, recovery, and the paid live-test boundary.
|
|
192
359
|
|
package/package.json
CHANGED
|
@@ -1010,6 +1010,7 @@
|
|
|
1010
1010
|
"outpaint",
|
|
1011
1011
|
"reduce-colors",
|
|
1012
1012
|
"correct-pixelart",
|
|
1013
|
+
"remove-background",
|
|
1013
1014
|
"animate",
|
|
1014
1015
|
"animate-pixminimax",
|
|
1015
1016
|
"animate-skeleton",
|
|
@@ -1067,6 +1068,20 @@
|
|
|
1067
1068
|
"type": "string",
|
|
1068
1069
|
"minLength": 1
|
|
1069
1070
|
},
|
|
1071
|
+
"driftThreshold": {
|
|
1072
|
+
"type": "number",
|
|
1073
|
+
"minimum": 0
|
|
1074
|
+
},
|
|
1075
|
+
"subjectDescription": {
|
|
1076
|
+
"type": "string",
|
|
1077
|
+
"minLength": 1,
|
|
1078
|
+
"maxLength": 300
|
|
1079
|
+
},
|
|
1080
|
+
"initialPose": {
|
|
1081
|
+
"type": "string",
|
|
1082
|
+
"minLength": 1,
|
|
1083
|
+
"maxLength": 300
|
|
1084
|
+
},
|
|
1070
1085
|
"direction": {
|
|
1071
1086
|
"type": "string",
|
|
1072
1087
|
"enum": [
|
|
@@ -1091,6 +1106,13 @@
|
|
|
1091
1106
|
"type": "string",
|
|
1092
1107
|
"minLength": 1
|
|
1093
1108
|
},
|
|
1109
|
+
"removalTask": {
|
|
1110
|
+
"type": "string",
|
|
1111
|
+
"enum": [
|
|
1112
|
+
"simple",
|
|
1113
|
+
"complex"
|
|
1114
|
+
]
|
|
1115
|
+
},
|
|
1094
1116
|
"description": {
|
|
1095
1117
|
"type": "string",
|
|
1096
1118
|
"minLength": 1
|
|
@@ -275,6 +275,16 @@ and which tutorial(s) demonstrated real (not hypothetical) demand for it.
|
|
|
275
275
|
automates. Neither `animate-with-skeleton-v3` nor `estimate-skeleton` has
|
|
276
276
|
been exercised against a live account; request field names come from the
|
|
277
277
|
MCP tool schema, not an observed call.
|
|
278
|
+
- **Remove background** (`/remove-background`, a transparent cutout of one
|
|
279
|
+
image up to 400x400, `simple` or `complex` task, optional foreground text
|
|
280
|
+
hint) — closed by the `revision` asset shape's `remove-background` mode.
|
|
281
|
+
Cost is the measured 1 generation from docs/ENDPOINTS.md's utilities
|
|
282
|
+
table; the `complex` task and the text hint have not been exercised live.
|
|
283
|
+
- **The legacy `/animate-with-skeleton`** (no `-v3`) is deliberately not
|
|
284
|
+
wrapped: its live schema takes exactly 3 skeleton frames per call (other
|
|
285
|
+
counts are a 422), plus view, direction, init-image and inpainting
|
|
286
|
+
parameters, while v3 takes 3 to 15 frames. `animate-skeleton` covers the
|
|
287
|
+
same job.
|
|
278
288
|
|
|
279
289
|
- **Fonts** (`/generate-font-pro`, an 80-glyph atlas plus a `.ttf` from a
|
|
280
290
|
style description) — no tutorial demonstrated it in depth, so demand is
|
|
@@ -408,7 +408,9 @@ contained a generated signature-like glyph.
|
|
|
408
408
|
An asset that declares `revision` against a PixelLab style calls `inpaint`
|
|
409
409
|
(masked), `image-to-image` (whole-image, no mask), `reduce-colors`
|
|
410
410
|
(palette quantize, `/reduce-colors`), `correct-pixelart` (edge/noise
|
|
411
|
-
cleanup, `/correct-pixelart`), `
|
|
411
|
+
cleanup, `/correct-pixelart`), `remove-background` (transparent cutout,
|
|
412
|
+
`/remove-background`, one image up to 400x400, 1 generation measured),
|
|
413
|
+
`animate` (`/animate-with-text-v3`),
|
|
412
414
|
`animate-pixminimax` (`/animate-pixminimax`, beta, tier 1 subscription or
|
|
413
415
|
higher), `animate-skeleton` (`/animate-with-skeleton-v3`, also beta/tier
|
|
414
416
|
1+ — poses the source frame-by-frame from a supplied 18-joint skeleton per
|
|
@@ -416,8 +418,9 @@ frame, via a committed `keypointsFile` rather than a text motion
|
|
|
416
418
|
description), `interpolate` (`/interpolation-v2`, in-betweens from the parent
|
|
417
419
|
to a required `lastFrame` keyframe), or `edit-animation` (`/edit-animation-v2`,
|
|
418
420
|
one edit across a whole frame set); `outpaint` is refused, since PixelLab has
|
|
419
|
-
no canvas-expansion endpoint. `reduce-colors`/`correct-pixelart
|
|
420
|
-
|
|
421
|
+
no canvas-expansion endpoint. `reduce-colors`/`correct-pixelart`/
|
|
422
|
+
`remove-background` send no prompt (`remove-background` sends only its
|
|
423
|
+
optional `description` as a foreground hint) to PixelLab at all — they are mechanical, not described — and complete
|
|
421
424
|
synchronously with no background job, unlike every other PixelLab call this
|
|
422
425
|
adapter makes. `animate`/`animate-pixminimax`/`animate-skeleton` DO send the
|
|
423
426
|
asset's own prompt, as the motion description (`animate-skeleton` calls it
|
|
@@ -17,6 +17,10 @@ Read this reference when an asset declares `revision`.
|
|
|
17
17
|
5 generations up to 96px, 6 up to 208px, 9 beyond (provisional quotes),
|
|
18
18
|
against 20–40. The parent must be 32–256px per side in multiples of 4, and
|
|
19
19
|
`strength` is refused. Other modes reject `engine`.
|
|
20
|
+
- `remove-background` (PixelLab, one image up to 400x400, `removalTask`
|
|
21
|
+
`simple` or `complex`, optional `description` hint) cuts the background out
|
|
22
|
+
to transparency and leaves a locked palette intact; 1 generation measured.
|
|
23
|
+
It refuses a set parent.
|
|
20
24
|
- `reduce-colors` and `correct-pixelart` send no prompt to the provider — the
|
|
21
25
|
asset's `prompt` stays a manifest-only label. `numColors`/`paletteImage`
|
|
22
26
|
are mutually exclusive; a `paletteImage` has no size relationship to the
|
|
@@ -83,17 +87,19 @@ Read this reference when an asset declares `revision`.
|
|
|
83
87
|
silhouette or layout drift before post-processing.
|
|
84
88
|
- `pixelkiln gallery --edit` can create a revision directly from a parent's
|
|
85
89
|
drawer ("+ New revision" under "Revisions from this asset"), once the parent
|
|
86
|
-
has usable pixels: on a PixelLab sprite `image-to-image`, `
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
PixelLab
|
|
90
|
+
has usable pixels: on a PixelLab sprite `image-to-image`, `inpaint` (a
|
|
91
|
+
paint-over-the-sprite mask editor that writes the mask PNG into the project),
|
|
92
|
+
`animate`, `animate-pixminimax`, `interpolate` (another same-size sprite as
|
|
93
|
+
the ending keyframe), `reduce-colors`, `correct-pixelart`, or
|
|
94
|
+
`remove-background`; on a PixelLab frame set (or a character's directions)
|
|
95
|
+
`edit-animation`, `reduce-colors`, or `correct-pixelart`; on ComfyUI
|
|
96
|
+
`image-to-image` or `inpaint`; on other providers `image-to-image`. On a
|
|
97
|
+
single PixelLab sprite, "+ Skeleton animation" creates an `animate-skeleton`
|
|
91
98
|
revision: poses from a project file, pasted JSON, or "Estimate poses" (one
|
|
92
99
|
confirmed, un-budgeted PixelLab call), edited in a drag-to-edit pose editor
|
|
93
100
|
over the sprite, written into the project on save. "Edit poses" on an
|
|
94
101
|
existing `animate-skeleton` record reopens the editor on its keypoints file.
|
|
95
|
-
|
|
96
|
-
`interpolate` (needs an ending keyframe), so add those by hand.
|
|
102
|
+
Only `outpaint` is not offered; no provider implements it.
|
|
97
103
|
- Before an outside image becomes a `styleImages` or `reference` path,
|
|
98
104
|
suggest `pixelkiln unzoom --from <file>`: upscaled pixel art (every art
|
|
99
105
|
pixel a block of screen pixels) degrades every reference-taking PixelLab
|
|
@@ -20,11 +20,15 @@ schemas remain unverified. Require a one-asset smoke before widening a batch.
|
|
|
20
20
|
existing Scenario asset and must not trigger another generation.
|
|
21
21
|
- Treat `scenario://` job and asset references as the recovery contract.
|
|
22
22
|
Temporary signed Scenario URLs must not remain in a settled lockfile.
|
|
23
|
-
- Verify the chosen model returns PNG. The
|
|
24
|
-
|
|
23
|
+
- Verify the chosen model returns PNG. The adapter rejects other media
|
|
24
|
+
formats, animation, and tiles.
|
|
25
|
+
- Style images and `image-to-image` revisions are uploaded once (free) and sent
|
|
26
|
+
as the model's `referenceImages` input; set `referenceParameter` and
|
|
27
|
+
`referenceArray` for a model that names it differently. Other revision modes
|
|
28
|
+
and `strength` are refused.
|
|
25
29
|
|
|
26
|
-
Scenario model parameters vary. The MVP supplies prompt,
|
|
27
|
-
|
|
30
|
+
Scenario model parameters vary. The MVP supplies prompt, 16–4096px dimensions
|
|
31
|
+
(each model has tighter bounds, reported by the free dry run), one to four outputs, and optional seed. Put only documented
|
|
28
32
|
model inputs in `parameters`; PixelKiln rejects attempts to override its prompt,
|
|
29
33
|
dimensions, seed, output count, project routing, or CU ceiling.
|
|
30
34
|
|