← Visual SandboxCONTENT HISTORY

Update to Visual Sandbox

Snapshot Nov 5, 2026 · 01:19 UTC · version 1.0.8

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Visual Sandbox and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Pick the right Visual Sandbox model for any image task and prompt it well. Trigger when the user wants to generate, edit, restyle, upscale, or remove the background from images via the vsb CLI. All execution goes through `vsb run image/<slug>` — sync, ~5–10s for the standard models. Always verify slugs with `vsb models --modality image --json` first.\n",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 280
    }
  ],
  "name": "vsb-image",
  "skill_md_contents": "---\nname: vsb-image\nrenamed_from: image\ndescription: >\n  Pick the right Visual Sandbox model for any image task and prompt it well.\n  Trigger when the user wants to generate, edit, restyle, upscale, or remove\n  the background from images via the vsb CLI. All execution goes through\n  `vsb run image/<slug>` — sync, ~5–10s for the standard models. Always\n  verify slugs with `vsb models --modality image --json` first.\nlicense: Proprietary. See LICENSE for the terms.\n---\n\n# Image generation with vsb\n\n> **On the MCP surface?** If the `visual-sandbox` MCP tools are in your\n> tool list, use `generate` and `get_job` instead of the shell commands\n> below. The model choice and the prompt craft on this page still apply.\n> See `vsb` → Two ways to run.\n\nImage runs are sync — `vsb run image/<slug>` blocks until done (typically\n5–10s). No `--async` needed, but **still start the run in a background shell**\n(Claude Code: `run_in_background: true`) so the turn stays free and parallel\nvariations fan out (vsb critical rule 6).\n\nPipe `--json` and `--download \"<template>\"` to capture results, then\n**open every finished image in Preview** — `open -a Preview <file>` — so the\nuser sees the picture instead of a link\n(vsb critical rule 12). Download\nto a scratch folder (`mktemp -d`) for that; a **project** save still needs the\nopt-in from vsb critical rule 5.\nHand back the share page `https://visualsandbox.com/share/<job_id>/`, never a\nraw CDN URL.\n\n> **Before writing any image prompt, read\n> [`vsb-image-prompting`](../vsb-image-prompting/SKILL.md).** It covers the universal\n> rules, the prompt-anatomy slot list, the reference-image keep/ignore\n> pattern (what to take from an attached image and what to ignore — without\n> this, watermarks and text overlays leak into outputs), and the camera /\n> lens / lighting / grade vocabulary banks. This skill only covers\n> *picking* a model — the prompt-craft itself lives in `image-prompting`,\n> with model-specific quirks in [`vsb-nano-banana`](../vsb-nano-banana/SKILL.md) and\n> [`vsb-ugc-people`](../vsb-ugc-people/SKILL.md).\n\n## Rules for every paid image run\n\n- **Keep a simple request simple.** \"Make an image of X\" is one image: no\n  questionnaire, no extra drafts, no variations nobody asked for.\n- **One request is one paid attempt.** A complaint or \"fix it\" is not a yes\n  for a new run. Say what you would change, and ask first.\n- **Review mode (MCP).** A run of 10 cents or more can answer\n  `awaiting_approval`. In ChatGPT, call `show_media`; elsewhere, give the\n  `share_url`. Never press Generate for the person.\n- **Branded work** reads the brand first with `get_theme`\n  ([`vsb-library-themes`](../vsb-library-themes/SKILL.md)).\n\n## Picking a model\n\nVerify the live catalog with `vsb models --modality image --json | jq '.models[] | {slug, category, owner}'`.\n\n| Task | Default slug | Why |\n|------|--------------|-----|\n| Fast text-to-image / edit | `image/nano-banana-2-lite` | Google. Default. Cheapest (~$0.05/image), fastest, ~5s, on the newer NB2 architecture. Handles both text-to-image AND image edits — the same endpoint switches modes when a reference image array is non-empty. |\n| Same cost, original model | `image/nano-banana` | The original Gemini 3 model at the same ~$0.05/image. Fall back here if a lite result looks off. |\n| Higher quality / 4K / web-grounded | `image/nano-banana-2.1` | Google. The update to NB2: sharper output, cleaner text, steadier subjects across edits. **Pick it over `nano-banana-2`:** it costs about half as much at 1K and 2K (~$0.05 at 1K, ~$0.07 at 2K, ~$0.15 at 4K), and each of `google_search` / `image_search` adds a small charge, as on NB2. `resolution` `1K`/`2K`/`4K`, ten aspect ratios plus `match_input_image` (the default). References go in `image_input`: up to 14, but the backup route reads only the first three. |\n| Existing NB2 work | `image/nano-banana-2` | Full NB2 — adds `resolution` (up to 4K) and web-search grounding as a paid add-on. Superseded by `nano-banana-2.1`; keep it only for a project already built on its look. |\n| Top-tier Google output | `image/nano-banana-pro` | Most expensive of the family, sharpest detail. |\n| Fast OpenAI generate or edit, up to 4K | `image/gpt-image-2.5-flare` | OpenAI. The fast tier of GPT Image 2.5 and the default OpenAI pick. One endpoint for text-to-image and edit. ~7–12s at 1K, ~12–24s at 4K, where `gpt-image-2` averages ~50s, and about half the price at high quality. `quality` is `low`/`medium`/`high`/`xhigh`/`max`; `resolution` is a separate control at `1K`/`2K`/`4K`; eight aspect ratios plus `match_input_image`. `background: transparent` returns a real alpha channel (the schema switches JPG to PNG for you). References go in `image_input`. |\n| Precise edits that must hold across many passes | `image/gpt-image-2.5-sunburst` | OpenAI. The precision tier of GPT Image 2.5, slower than Flare. It changes only what you name and keeps the face, the composition and the light, also across multi-image composites and long chains of edits. One flat price per image for each `quality` tier (~$0.02 `low`, ~$0.06 `medium`, ~$0.16 `high`, ~$0.32 `xhigh`, ~$0.63 `max`); the ratio and the references do not move it. Seven aspect ratios plus `match_input_image`, `background: transparent`, JPG/PNG/WEBP. **No `resolution` field, so use Flare for 4K.** No seed. References go in `image_input`. Explore in Flare, finish here. |\n| Photoreal / text rendering / multi-ref edit | `image/gpt-image-2` | OpenAI, the older tier. Best for legible typography, posters, product mockups. Slower and pricier than `gpt-image-2.5-flare`; reach for it only when a Flare result looks off. |\n| Cheapest text-to-image | `image/z-image-turbo` | Tongyi-MAI via PrunaAI. Cheapest image model in the catalog, 8-step, sub-second. Renders short English and Chinese text well. **Takes no reference image, so it cannot edit.** Apache 2.0 license. |\n| Fast iteration that still takes references | `image/flux-2-klein-9b` | Black Forest Labs. 4-step, sub-second, one endpoint for text-to-image and edit. Up to 5 references, output up to 4 MP. **FLUX Non-Commercial License — never use it for client work or paid ad creative.** |\n| Cheap edits with up to 10 references, native 4K | `image/flux-3-image-klein` | Black Forest Labs. The compact FLUX 3 model (5.6B), newer than Klein 9B and scored above it by BFL. One endpoint for text-to-image and edit; up to 10 references in `image_input`, called \"image 1\", \"image 2\" in the prompt. `resolution` is `1K`/`1.5K`/`2K`/`4K`, 15 aspect ratios plus `match_input_image`, optional `seed`. ~$0.02/image up to 2K, ~$0.05 at 4K, and references are free. Weak on exact counts, charts and diagrams. **FLUX Kommunity License: free commercial use only for a user with annual revenue under $5M. Ask before you use it for client work.** |\n| Many references, product + character compositing | `image/seedream-5-pro` | ByteDance. Takes up to 10 references and holds detail at 1K or 2K. The edit-capable model with the highest reference count. Commercial use allowed. |\n| Posters, packaging, real brands and places, flat price at 2K | `image/grok-imagine-image-2` | xAI. Plans typography and layout before drawing, and names real brands, cities, and landmarks straight from the prompt. **One flat price per output image, so 2K at medium quality costs the same as a 1K draft.** Takes one reference image (a single string, not an array), so it cannot composite several. Slow: ~53s at medium/2K, ~15s at low/1K. Commercial use allowed. |\n| Change one region, keep every other pixel | `image/flux-fill-pro` | The only mask model in the catalog. It repaints the masked area and carries the rest of the photo through unchanged. It also outpaints. |\n| Budget volume, 3K, or a related set in one run | `image/seedream-5-lite` | ByteDance. The light tier of Seedream 5, on the same endpoint. One flat price per output image at 2K or 3K, up to 14 references, and a sequential mode that returns a whole set (storyboard, character sheet, brand kit) from one prompt, billed per image returned. Step up to `image/seedream-5-pro` when a single frame is the deliverable. |\n| Illustration, anime, painterly, one style across a series | `image/krea-2-medium` | Krea. Foundation model tuned for expressive artistic directions, with style transfer from up to 10 reference images and a `creativity` control (`raw`/`low`/`medium`/`high`) that sets how far it departs from the prompt. Faster and steadier than Large across a batch. **Style transfer only, so it cannot edit a photo.** Commercial use allowed. |\n| Photorealism with real texture, grain and motion blur | `image/krea-2-large` | Krea. Twice the size of Medium, with the richest output at `creativity: high`. Same 10 style references, same 8 aspect ratios including 2.35:1, same optional `moodboard_id`. Slower and pricier than Medium, so compose in Medium and finish here. **Style transfer only, so it cannot edit a photo.** Commercial use allowed. |\n| Instruction edits: a product into a new scene, a color or outfit swap, a local fix | `image/krea-3` | Krea. Fast instruction-following editor, the edit model of the Krea family. Up to 8 images in `image_input`. `thinking_mode` `fast` (default) or `high` for multi-step edits; `resolution` `1K`/`2K`. `regional_edit: true` (experimental, needs an image) changes only the part that must change and keeps every other pixel. ~$0.04–0.10 per output image by mode and resolution, **plus ~$0.03 per input megapixel**, so send inputs of about 1 MP. Text-to-image is experimental and small text is weak. No style references, no `output_format` field. Commercial use allowed. |\n| Art-directed poster, ad or brand image from a short prompt | `image/recraft-v4.1` | Recraft. Tuned with designers: it picks the layout, the palette and the light, and sets quoted text into the composition. ~$0.05/image flat, about 1 MP, 11 aspect ratios, prompts up to 10,000 characters. **Text-to-image only: no reference image, so it cannot edit.** Commercial use allowed; outputs may not train AI models. |\n| Cheap, fast drafts with a designed look | `image/recraft-v4.1-flash` | Recraft. Its fastest, cheapest model, with quality close to V4.1. ~$0.01/image flat (`image/z-image-turbo` is still cheaper), about 1 MP, the same 11 aspect ratios. No styles. **Text-to-image only, so it cannot edit.** Render the final with `image/recraft-v4.1`. |\n| Put real clothing on a real person | `image/p-image-try-on` | Pruna AI. Person photo plus up to 6 garment photos; face, pose, body and background carry through untouched, and a whole outfit layers in one pass. `garment_images` is a list even for one item. Shows the look, never the fit. Footwear is the weakest category; eyewear, handheld items, gloves and stacked jewelry are unsupported. Billed per run PLUS per input megapixel, so resize inputs before sending. |\n| Background removal | `image-enhance/recraft-remove-background` | Note: category is `image-enhance`, not `image`. |\n| Upscale, portraits and print | `image-enhance/upscale` | Topaz. Same — `image-enhance` category. Tuned for photographic realism, with five named enhance models and a face refinement step. One flat rate per image whatever the size. |\n| Cheap, fast upscale at volume | `image-enhance/p-image-upscale` | Pruna AI. About a second a run. `upscale_mode: target` names the output in megapixels; `factor` multiplies each side (2/4/6/8). `enhance_details` and `enhance_realism` both default off; Realism is for AI-generated sources. Charged by the size of the result, so it is cheapest on small outputs. Pick `image-enhance/upscale` (Topaz) for portraits and print. |\n| SVG, vector, logo, icon, cut file | see [`vsb-vector`](../vsb-vector/SKILL.md) | Not an image model job. Quiver for icons; `vector/recraft-v4.1-svg` for a new SVG from a prompt at a flat price; a flat PNG from this page traced by `vector/recraft-vectorize` for detailed art. |\n\n**Tier up for detail-critical work.** The cheap defaults are for simple,\nthrowaway, or high-volume generations. When the task is detail-critical —\nlegible in-image text (signs, tattoos, posters, packaging), dense scenes with\nmany named elements, ad creative the user will publish, or precise multi-ref\nidentity edits — go straight to `image/nano-banana-pro` or\n`image/gpt-image-2.5-flare` (Flare at `xhigh` or `max` when typography\nlegibility is the single hardest constraint; nano-banana-pro for photoreal\nscenes that *contain* text or fine detail).\nThe ~$0.15–0.20/image premium is cheaper than three failed $0.05 retries.\n\n## Prompt patterns\n\n### Nano Banana family (text-to-image)\n\n```bash\nvsb run image/nano-banana \\\n  --prompt \"a calico cat curled on a sunlit windowsill, soft morning light, shallow depth of field\" \\\n  --aspect_ratio 16:9 \\\n  --output_format jpg \\\n  --download \"./out/{request_id}.{ext}\" \\\n  --json\n```\n\nNano Banana likes concrete nouns + lighting + camera language. Aspect ratios\n(`1:1`, `16:9`, `3:2`, `4:3`, `5:4`, `4:5`, `3:4`, `2:3`, `9:16`, `21:9`) are\nstrict enums — use `vsb schema image/nano-banana --json` to confirm before\npassing.\n\n### Nano Banana (image edit — multi-ref)\n\n```bash\nURL1=$(vsb upload ./photo.jpg --json | jq -r '.url')\nURL2=$(vsb upload ./reference.jpg --json | jq -r '.url')\n\nvsb run image/nano-banana \\\n  --prompt \"Use Image A (cat photo) as the IDENTITY source — keep the cat's fur pattern, eye color, and proportions exactly. Use Image B (windowsill photo) as the BACKGROUND source — match the location and ambient light, but ignore any other subjects in it. Render: the cat from Image A curled up on the windowsill from Image B, matching the windowsill's ambient lighting. No logos, no captions, no watermarks.\" \\\n  --image_input \"[\\\"$URL1\\\",\\\"$URL2\\\"]\" \\\n  --aspect_ratio match_input_image \\\n  --download \"./out/\" \\\n  --json\n```\n\nNaming each reference (`Image A`, `Image B`) and giving it a role\n(`IDENTITY source`, `BACKGROUND source`) is the universal multi-ref rule —\nsee [`vsb-image-prompting`](../vsb-image-prompting/SKILL.md) §Multi-reference for\nthe full template.\n\nPass JSON-array inputs as a literal — `parseValue` auto-coerces. The exact\nfield name (e.g. `image_input`) is whatever `vsb schema image/nano-banana\n--json` returns; never guess. `vsb run` pre-validates flags against the\nschema and rejects unknown keys with a \"Did you mean…?\" hint before any\ncharge is incurred.\n\n`aspect_ratio: \"match_input_image\"` keeps the dimensions of the first\nreference.\n\nYou can pass server-side paths directly too — any `/media/predictions/...`\nURL from a prior `vsb run` works without re-uploading.\n\n### GPT Image 2 (typography, posters, mockups)\n\n```bash\nvsb run image/gpt-image-2 \\\n  --prompt \"minimal poster: bold serif headline 'NORTHWIND' on a kraft paper background, registration marks in the corners\" \\\n  --quality high \\\n  --aspect_ratio 3:4 \\\n  --output_format png \\\n  --download \"./out/{request_id}.png\" \\\n  --json\n```\n\nGPT Image 2 specifically excels when you need **legible, multi-line text** baked\ninto the image. Quality enum is `auto|low|medium|high`. `n` (1–4) gives\nmultiple variants in one call.\n\n### FLUX Fill Pro (masked edit and outpaint)\n\nThe only model that edits through a mask. Everything outside the mask survives\nthe run byte for byte, so use it for object removal, a product swap, new text\non a sign, or a retouch. Fields are `image` (a single string, not an array),\n`mask`, and `outpaint`.\n\n```bash\nSRC=$(vsb upload ./kitchen.jpg --json | jq -r '.url')\nMASK=$(vsb upload ./kitchen-mask.png --json | jq -r '.url')\n\nvsb run image/flux-fill-pro \\\n  --prompt \"a white marble countertop, same warm window light, same grain\" \\\n  --image \"$SRC\" \\\n  --mask \"$MASK\" \\\n  --guidance 30 \\\n  --download \"./out/{request_id}.png\" \\\n  --json\n```\n\nFour rules decide the result:\n\n- The mask is black and white, the same size as the source. White repaints,\n  black keeps. The mask may instead ride in the source image's alpha channel.\n- Describe what must be there, not the edit. Write \"a blue knit sweater\". Do\n  not write \"change the shirt\". An empty prompt makes the model paint\n  something rather than nothing.\n- Mask a little wider than the object, and include its shadow and its\n  reflection. The model invents a new object to explain a shadow you leave\n  behind.\n- High `guidance` leaves a visible seam. Lower it to about 30 for retouching\n  and object removal, so the fill settles into the surrounding light and grain.\n\nTo outpaint instead, set `--outpaint` to `zoom_out_1.5x`, `zoom_out_2x`,\n`make_square`, `extend_left`, `extend_right`, `extend_up`, or `extend_down`.\nAn `outpaint` preset makes the model ignore the mask. Output size follows the\ninput, so there is no aspect-ratio field and outpainting is the one case that\nchanges the dimensions.\n\n### Krea 3 (instruction edit and regional edit)\n\n```bash\nSRC=$(vsb upload ./living-room.jpg --json | jq -r '.url')\n\nvsb run image/krea-3 \\\n  --prompt \"Change the sofa to deep green velvet. Keep everything else the same.\" \\\n  --image_input \"[\\\"$SRC\\\"]\" \\\n  --regional_edit true \\\n  --resolution 2K \\\n  --json\n```\n\nLead with the change, then add one sentence about what stays. Do not list\neverything that should stay. With several images, name each one by what it\nshows: \"put the sneaker from the second image on the person in the first\".\n\n`regional_edit` keeps every pixel outside the change, so it is the one way to\nedit the latest output again without a loss in quality. Use it for a local\nchange: recolor or swap an object, add or remove an element, change the words\non a sign. Leave it off for a restyle, a relight or a new scene. It is\nexperimental: slower than a regular edit, and the quality can be lower.\n\nEach input image adds a charge by its megapixels. About 1 MP per input is\nenough. With five or more inputs, each one is reduced to 1536 px on its long\nedge, so send four or fewer when every reference needs its full detail. The\n`seed` does not reproduce a result, because the model expands the prompt\nfirst.\n\n### Seedream 5 Pro (up to 10 references)\n\n```bash\nvsb run image/seedream-5-pro \\\n  --prompt \"the bottle from Image A on the marble surface from Image B, studio softbox light\" \\\n  --image_input \"[\\\"$URL1\\\",\\\"$URL2\\\"]\" \\\n  --resolution 2K \\\n  --aspect_ratio 1:1 \\\n  --json\n```\n\nOne endpoint covers generate and edit, the same as Nano Banana. Iterate at\n`--resolution 1K`, then rerun the winning prompt at `2K` for print and crops.\n\n### Grok Imagine 2.0 (layout and typography, flat price at any size)\n\n```bash\nvsb run image/grok-imagine-image-2 \\\n  --prompt \"a vintage travel poster for Kyoto, Mount Fuji behind cherry blossoms, art deco typography reading 'KYOTO', rich flat color blocks\" \\\n  --aspect_ratio 2:3 \\\n  --resolution 2K \\\n  --quality medium \\\n  --json\n```\n\nTo edit, pass one reference through `--image`. The field is a **single\nstring**, not an array, so this model cannot composite several references.\n\n```bash\nURL=$(vsb upload ./storefront.jpg --json | jq -r '.url')\nvsb run image/grok-imagine-image-2 \\\n  --prompt \"make the sky a dramatic sunset\" \\\n  --image \"$URL\" \\\n  --json\n```\n\nFour rules decide the result:\n\n- **Always deliver at `--resolution 2K --quality medium`.** The price is flat\n  per output image, so 2K costs the same as 1K. `low` at `1K` is only worth it\n  as a speed setting: about 15 seconds against about 53 seconds.\n- **Waxy, over-smoothed skin means the quality knob is wrong.** Pin medium and\n  2K, then name the camera, the lens, the light direction, and the\n  imperfections to keep (skin texture, stray hair, film grain).\n- **Write long, specific prompts and put the style directive last.** Short\n  prompts get generic results here. Name real brands, cities, and landmarks\n  rather than describing them; the model knows them.\n- **On an edit, describe only the change.** Re-describing the whole frame makes\n  the model rewrite more than you asked. `aspect_ratio` is ignored on an edit,\n  because the output keeps the shape of the source.\n\n`aspect_ratio` also accepts `auto`, which lets the model pick the frame that\nsuits the prompt. `2:1` and `1:2` are in the enum and are rare elsewhere in the\ncatalog, so this is the model for site headers and tall mobile banners.\n\n### Z-Image Turbo (cheapest, text-to-image only)\n\n```bash\nvsb run image/z-image-turbo \\\n  --prompt \"a neon ramen shop sign that reads 'MIDNIGHT', wet asphalt reflection, night\" \\\n  --aspect_ratio 3:2 \\\n  --output_megapixels 2 \\\n  --json\n```\n\nIt has no reference-image field at all, so it cannot edit. Short English and\nChinese text is its strength. Quote the exact text and name the surface it\nsits on. Long paragraphs break down.\n\n### Background removal\n\n```bash\nURL=$(vsb upload ./product-photo.jpg --json | jq -r '.url')\nvsb run image-enhance/recraft-remove-background \\\n  --image \"$URL\" \\\n  --download \"./out/cutout.png\" \\\n  --json\n```\n\nNote the category is `image-enhance`, not `image`, and `recraft-remove-background`\n+ `upscale` both take a single string field (currently `image`) — different from\nNano Banana's array. Always run `vsb schema image-enhance/<slug> --json` first\nto confirm field names; the CLI rejects unknown flags with a \"Did you mean…?\"\nhint before submitting.\n\n## Cost estimation\n\n```bash\nvsb pricing image/nano-banana --json | jq '.user_cost_estimate'\n# 0.04875 → roughly 5 cents per image\n```\n\nNano Banana family is cents-per-image. GPT Image 2 is ~$0.05–0.20 depending on\nquality. Background removal and upscale are sub-cent.\n\n`z-image-turbo`, `flux-2-klein-9b`, and `nano-banana-2` bill per output\nmegapixel or per resolution tier, so `user_cost_estimate` comes back `null`\nand the tier table holds the numbers. Read it before you pick a size:\n\n```bash\nvsb pricing image/z-image-turbo --json | jq '.tiers'\n```\n\n## Common gotchas\n\n- **A second edit on the same image degrades it.** Every model redraws the\n  whole picture on each pass, so loss compounds. Never feed your own last\n  output back in as `image_input` — grow the prompt and re-run from the\n  original instead. Full workflows in\n  [`vsb-image-iteration`](../vsb-image-iteration/SKILL.md). Two exceptions\n  keep every pixel outside the change: `flux-fill-pro` with a mask, and\n  `krea-3` with `regional_edit: true`.\n- **`output_format` defaults to `jpg` on every image model except\n  `flux-fill-pro`,** which defaults to `png` because a fill is usually the\n  input to the next fill. `krea-3` has no `output_format` field. Pass\n  `--output_format png` whenever the output may become an input.\n\n- **Input field names vary by model** — Nano Banana uses an array (currently `image_input`), most enhance models take a single string (currently `image`), GPT Image 2 has its own shape. `vsb run` pre-validates against the schema, so just `vsb schema <slug>` once and copy the exact field name.\n- **`aspect_ratio: \"match_input_image\"` only makes sense in edit mode** (when reference images are set). For text-to-image alone it falls back to a default.\n- **`output_format` defaults to `jpg`.** If you want transparent PNG (e.g. for compositing), set `--output_format png` and remember the alpha channel is only meaningful for edit/cutout flows.\n- **`z-image-turbo`, `recraft-v4.1` and `recraft-v4.1-flash` cannot edit.**\n  They have no reference-image field. If the task attaches any image, pick\n  another model before you write the prompt.\n- **`flux-2-klein-9b` is non-commercial.** Never pick it for client work,\n  paid ad creative, or anything the user will sell. Use Nano Banana,\n  GPT Image 2, or Seedream 5 Pro instead.\n- **`flux-fill-pro` takes `image` as a single string, plus a `mask`.** It is\n  the only model with a mask. There is no brush tool in the composer yet, so\n  an explicit mask arrives as a file through the CLI.\n- **`grok-imagine-image-2` takes `image` as a single string too,** so it edits\n  from one reference and cannot composite. Pick `seedream-5-pro` or\n  `nano-banana-2-lite` when the job needs several references.\n- **Don't loop `vsb run` inside a tight shell loop** — use a small batch (≤5 in parallel via `&`) to respect the provider's rate limit.\n"
}

SHA-256 of public snapshot: 16705c010fdb18b1a2b1b4abba0a7f07abe1f9a45449340ee5a380c36e19027f