Tsubaki.3, the newest anime model on PixAI, is now officially released, and I used the release week for a small controlled test. I took one original character from a three-sentence spec to a design I would keep developing, changing one layer at a time and logging what each step changed. If you think in code, the process maps neatly onto a function call with default arguments.
Setup
- Subject: Kazane is a broom-racing witch I created for this test.
- Model: Every run used Tsubaki.3, with batches of four for the text-only runs and single images for the reference runs.
- Preprocessing: Prompt Helper was on in every run. It rewrites the prompt before generation, and each image's detail page shows the rewritten version next to the original.
- Out of scope: I skipped LoRAs. PixAI's model vs LoRA explainer covers when one is worth adding; my questions were about individual clothing pieces.
Run 1: most arguments unset
In the first prompt, I passed three values and left everything else open:
generate_character(
role="loud, competitive witch who races brooms between floating islands",
hook="flies bareheaded, anything on her head would slow her down",
style_note="dressed for speed rather than for a storybook",
# hair, eyes, outfit and footwear were never passed
)
| Check | Batch 1 |
|---|---|
| Recognizable anime witch on a broom | 4/4 |
| Bareheaded, as specified | 1/4 |
| Anything resembling racing gear | 0/4 |
| Looks like an adult in her twenties | 0/4 |
| Distinct hair colors | 4 |
The unset arguments resolved to the most familiar version of "witch": pointed hats, dark robes, school uniforms and red ribbons. In three images, that default replaced a value I had passed explicitly. The spec described a bareheaded racer, and three of the four images showed the stock witch instead.
Run 2: pass the values explicitly
I treated the batch as a diff to review. I kept the bareheaded image, the shouting expression and the trailing fabric. I rejected the hat, ribbon, robe and skirt, and I replaced the reddish hair and the teenage look. Then I appended each decision to the unchanged original three sentences:
generate_character(
..., # the original three sentences, verbatim
head="top of her head and full hairstyle visible",
hair="deep plum, single high ponytail",
eyes="golden yellow",
top="fitted midnight-navy racing top with a zip",
capelet="short, teal, right shoulder only",
legs="black trousers tucked into white knee boots",
broom="exactly three teal bands",
)
The head argument describes what must be visible instead of passing a negative flag like "no hat". Batch 2 changed many values at once, so I cannot credit the bare head to this line alone. The head stayed bare in 4/4 images, and hair, eyes, top, trousers, boots and broom bands matched in every image.
Two values still varied because I had left them loose or unset. The trailing fabric came out navy three times and teal once, and the broom handle's end changed shape. The pose also repeated across all eight images: she hovers over a rock ledge instead of riding the banked turn I asked for.
Run 3: images as arguments, and the scope bug
Tsubaki.3 accepts two reference images in the prompt box, addressed as @image1 and @image2. I passed the refined character as @image1 and a photo of a monarch butterfly as @image2, then compared two scopes:
# wide scope
redesign(target="outfit", pattern=image2)
# narrow scope
redesign(
target="capelet and its trailing fabric",
pattern=image2,
keep=["navy top", "black trousers", "white knee boots"],
)
| Run | Pattern source | Scope | Result |
|---|---|---|---|
| A | butterfly | whole outfit | pattern on the entire suit; top, capelet, trousers and boots lost |
| B | soap bubble | whole outfit | swirl pattern on the entire suit; white boots kept |
| C | butterfly | capelet only | pattern on the capelet; top, trousers and boots kept, one sleeve turned orange |
Reading the Rewritten Prompt for run A explained the result. My wide wording became "a fully covering racing suit patterned after the butterfly", so the rewrite kept my wide scope and stated it even more broadly. In the narrow-scope version, the rewrite kept every named item almost word for word. The practical rule: when you pass an image, pass the scope with it.
One more edge case: an earlier attempt that described the capelet's "streaming tail" produced a furry tail beside the fabric. Tokens like tail, wing and horn can resolve to anatomy, so I now describe those pieces as fabric.
Run 4: a style layer as a regression test
Recipes are reusable prompt add-ons in the Tsubaki.3 generator panel, and PixAI Official publishes style Recipes among them. I reran the narrow-scope setup with the Holographic Recipe switched on. Face, hair, eyes and broom bands passed. The outfit scope, the background and the camera distance all changed.
I read that like a failing regression test. The traits that passed are stable enough to build on, and the ones that failed need locking before I explore looks.
What I would tell another developer
- Unset arguments get defaults from the role word, and those defaults can override values you did pass.
- Describe what should be present instead of passing negations.
- Keep the original spec verbatim and append decisions, so each batch is a clean diff.
- Pass scope explicitly with every reference image, and read the Rewritten Prompt when a result surprises you.
- Check ambiguous tokens like tail, wing or horn before a run.
If you want to run the same experiment on your own character, start with a three-sentence spec and a batch of four on PixAI.



Top comments (0)