Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate and edit images/video with Google's Gemini media models (Nano Banana 2/Pro, Gemini Omni Flash), with cost-approval gates, reference-image support, and a prompt/output log per call.
.claude/skills/sickn33-generate-nanobanana/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 244% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 449% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 419% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 125% | 0% |
generate-nanobanana calls Google's Gemini media models directly through the Gemini API — no third-party routing layer — to generate and edit images and video. It routes each request to the right model tier (draft, standard, quality, or video), loads real reference images instead of relying on text descriptions, gates every paid call behind explicit user approval, and writes a JSON sidecar next to every output recording the exact prompt, model, and cost. It registers a single /generate command.
This skill adapts the workflow (model routing, reference-image handling, sidecar logging) from AntonioCardenas/generate-nanobanana. The actual request shapes in references/ were independently verified against the live Gemini API docs rather than copied from that upstream repo, whose examples predate Google's migration to the Interactions API and use stale, non-functional request methods. Model IDs, request contracts, and pricing all change on Google's own schedule — re-verify against the docs linked from each reference file before relying on this skill in a new session.
/generate or /generate frf <set>, even without naming a specific model.Pick the model for the job and read its reference file under references/ before calling anything — each file holds the current, verified request shape for that model.
| Task | Model | Model ID | Reference | | --- | --- | --- | --- | | Image (draft) | Nano Banana 2 Lite | gemini-3.1-flash-lite-image | references/gemini-3.1-flash-lite-image.md | | Image (standard) | Nano Banana 2 | gemini-3.1-flash-image | references/gemini-3.1-flash-image.md | | Image (quality, multi-image fusion) | Nano Banana Pro | gemini-3-pro-image | references/gemini-3-pro-image.md | | Video | Gemini Omni Flash | gemini-omni-flash-preview | references/gemini-omni-flash-preview.md |
All four models are called through the Interactions API (client.interactions.create(...), REST POST /v1beta/interactions) — see each reference file for the exact shape, including reference-image input and, for video, large-output retrieval. Every call is billable; see Step 3.
Draft on Nano Banana 2 Lite first and rerun the picked favorite on Nano Banana 2 or Pro; reserve Pro for heavy multi-image fusion, character-consistent series, or dense on-image text.
Pull real reference images from generations/refs/, or from a named reference set when the request says "on brand" or invokes /generate frf <set>. Never substitute a text description for a reference image (logo, face, brand mark) that already exists — stop and ask if a named reference is missing instead of approximating it.
Reference sets are registered by importing (copying files into generations/refs/<set>/, a snapshot) or linking (recording the source path in generations/refs/sets.json, read live at generation time). A set may carry a style.md whose contents are prepended verbatim to every prompt generated from that set.
Call the Gemini API per the model's reference file. Every generation — image or video — is billable and requires an explicit approval gate: quote the current per-unit price from the live pricing page for the selected model and get explicit user go-ahead before that specific call. One approval covers exactly one call; a rerun needs its own. Run generations one at a time, never in parallel, so approval and cost tracking stay accurate.
No model in this skill documents a seed or reproducibility parameter — do not promise an identical re-roll. For "same image but change X" requests, reuse the exact original prompt and reference images (from the sidecar log) and change only the requested delta; for video, chain edits via previous_interaction_id where supported (see the Omni Flash reference).
Confirm the generated file is on disk and non-empty, then write a matching .json sidecar next to it (see Examples) recording the exact model ID, prompt, references used, response id, cost, and timestamp. Never log a generation whose file isn't there, and never write a sidecar for a failed or safety-blocked call.
User: generate a thumbnail on brand for the new pricing pageThe skill resolves the brand reference set from generations/refs/sets.json, prepends its style.md (if present), picks the relevant reference images (e.g. the logo and a style shot), quotes the current Nano Banana 2 Lite price and gets approval, then saves the result to generations/pricing_page_thumbnail_<timestamp>.png with a sidecar.
json{ "model": "gemini-3.1-flash-lite-image", "prompt": "the exact prompt sent", "reference_images": ["generations/refs/brand/logo_dark.png"], "reference_set": "brand", "response_id": "v1_...", "params": { "aspect_ratio": "16:9", "image_size": "1K" }, "cost": "{price quoted from the live pricing page before running}", "created": "2026-07-31T14:20:00Z", "approved_by_user": true }
references/ before calling it — model IDs and request shapes have already changed once in this skill's lifetime (Interactions API migration, gemini-3-pro-image-preview shutdown).GEMINI_API_KEY) and, outside Antigravity's native tool fallback, the google-genai Python package.generativelanguage.googleapis.com; checking current docs or pricing contacts ai.google.dev, and an explicitly approved package install contacts the configured PyPI index. Never send prompts or reference media to any other endpoint.GEMINI_API_KEY is only ever read from the environment or a workspace .env the user already set up; it is never logged, printed, or written into a sidecar, prompt, or committed file. The skill never creates or edits .env, .env.example, or .gitignore itself.generations/ folder (including generations/refs/, REST request/response files, and sets.json); nothing is written outside the current project except an explicitly approved package installation in its selected environment.google-genai PyPI package, and only when missing; never installed silently or alongside any other package.risk: critical rather than safe.generations/ as a design decision for the user to approve, not something to do quietly.Solution: Create generations/refs/<name>/, tell the user its path, and wait for at least one image before generating.
Solution: Read the original's sidecar for its exact prompt and references, and change only the requested delta.
Solution: Always quote the current per-unit price from the live pricing page and get explicit approval before submitting any paid call.
Solution: Model IDs shift (e.g. gemini-3-pro-image-preview was shut down and replaced by gemini-3-pro-image) — always read references/<model>.md first.
@image-generator - Nano Banana Pro image generation and editing without the multi-model routing, reference-set library, or cost-gate workflow.@nanobanana-ppt-skills - AI-powered PPT generation with document analysis and styled images.@2slides-ppt-generator - Presentation generation via 2slides API.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | fail→pass | 23,384 | 15,342 | -34% | 1 | 1 | 0% | 1,363 | 4,682 | +244% | 0 | 0 | — |
case-01 | fail→fail | 7,907 | 21,971 | +178% | 1 | 1 | 0% | 1,339 | 3,143 | +135% | 0 | 0 | — |
case-02 | fail→fail | 6,960 | 7,427 | +7% | 1 | 1 | 0% | 929 | 2,913 | +214% | 0 | 0 | — |
case-03 | fail→fail | 12,134 | 5,894 | -51% | 1 | 1 | 0% | 1,538 | 2,930 | +91% | 0 | 0 | — |
case-04 | fail→pass | 13,955 | 8,520 | -39% | 1 | 1 | 0% | 2,727 | 4,142 | +52% | 0 | 0 | — |
case-05 | fail→fail | 15,948 | 10,953 | -31% | 1 | 1 | 0% | 3,158 | 4,436 | +40% | 0 | 0 | — |
case-06 | fail→fail | 3,442 | 7,178 | +109% | 1 | 1 | 0% | 490 | 3,855 | +687% | 0 | 0 | — |
case-07 | fail→pass | 3,613 | 3,381 | -6% | 1 | 1 | 0% | 581 | 3,192 | +449% | 0 | 0 | — |
case-08 | fail→pass | 3,615 | 3,926 | +9% | 1 | 1 | 0% | 629 | 3,267 | +419% | 0 | 0 | — |
case-09 | fail→pass | 7,979 | 3,103 | -61% | 1 | 1 | 0% | 1,353 | 3,044 | +125% | 0 | 0 | — |
case-11 | fail→pass | 13,816 | 18,589 | +35% | 1 | 1 | 0% | 840 | 5,940 | +607% | 0 | 0 | — |
case-12 | pass→pass | 6,119 | 7,065 | +15% | 1 | 1 | 0% | 881 | 3,855 | +338% | 0 | 0 | — |
case-13 | pass→pass | 8,559 | 4,525 | -47% | 1 | 1 | 0% | 1,386 | 3,364 | +143% | 0 | 0 | — |
case-14 | pass→pass | 11,720 | 5,115 | -56% | 1 | 1 | 0% | 1,794 | 3,324 | +85% | 0 | 0 | — |
case-15 | fail→pass | 6,909 | 2,635 | -62% | 1 | 1 | 0% | 1,188 | 2,929 | +147% | 0 | 0 | — |
case-16 | fail→pass | 12,102 | 3,962 | -67% | 1 | 1 | 0% | 1,884 | 3,226 | +71% | 0 | 0 | — |
case-17 | fail→pass | 12,864 | 4,201 | -67% | 1 | 1 | 0% | 2,092 | 3,236 | +55% | 0 | 0 | — |
case-18 | fail→pass | 11,932 | 5,510 | -54% | 1 | 1 | 0% | 2,075 | 3,403 | +64% | 0 | 0 | — |
case-19 | fail→pass | 13,329 | 7,032 | -47% | 1 | 1 | 0% | 2,063 | 3,781 | +83% | 0 | 0 | — |
case-20 | fail→pass | 10,837 | 2,149 | -80% | 1 | 1 | 0% | 1,916 | 2,868 | +50% | 0 | 0 | — |
case-21 | fail→pass | 7,476 | 5,157 | -31% | 1 | 1 | 0% | 1,383 | 3,468 | +151% | 0 | 0 | — |
case-22 | pass→pass | 13,485 | 3,176 | -76% | 1 | 1 | 0% | 2,056 | 3,086 | +50% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.