Use when the user wants to generate or edit images with Google's Nanobanana/Gemini image models using the official Gemini API shape, or when they need publication-style scientific figures rendered exactly from data with the bundled Python plotting tool. Prefer this skill for text-to-image, image-to-image editing, multi-image reference workflows, attachment-based recreations, exact bar/trend/heatmap/scatter plots, or when the user wants publication-style figures such as materials-science paper schematics. Use it when the user asks for a materials-science figure, journal-style scientific illustration, graphical abstract, mechanism diagram, device architecture, processing workflow, or paper-ready materials figure.
This skill now supports two modes:
image mode
Gemini or Nanobanana generation and editing through the official generateContent flowplot mode
Exact Python or matplotlib rendering of publication-style figures from numeric dataUse image mode for mechanism figures, graphical abstracts, device schematics, style-matched redraws, and diagram-first work.
Use plot mode for exact bar charts, trend curves, heatmaps, scatter plots, and multi-panel figures that must preserve numeric truth.
Runtime policy:
image and plot workflows.scripts/generate_image.js is an optional parity CLI for environments that already use Node.js, not the required runtime baseline for registry gating.When the user is working in Codex and describes a plot in natural language, do not require them to hand-write a JSON spec. Codex should translate the request into an internal plot request or spec and run the plotting scripts.
For image mode, follow Google's official examples and replace:
Do not use OpenAI-style /images/generations or /images/edits routes for this skill.
If the image exists only as a chat attachment and the platform does not expose a local file path, do not claim the script can upload it directly.
Use this rule:
For requests like "replace the English text in this attached image with Chinese", the fallback recreation workflow is acceptable when exact pixel-preserving edit is impossible.
Preflight:
plot mode is local-only and does not require API credentials or outbound network access.image mode sends prompt text, API credentials, and any --input-image files to the configured Gemini-compatible endpoint.--allow-third-party or NANOBANANA_ALLOW_THIRD_PARTY=1 and treat that as an explicit trust decision.Set environment variables:
export NANOBANANA_API_KEY="your-provider-key"
export NANOBANANA_BASE_URL="https://generativelanguage.googleapis.com"
export NANOBANANA_MODEL="gemini-3.1-flash-image-preview"
Optional third-party provider:
export NANOBANANA_BASE_URL="https://api.zhizengzeng.com/google"
export NANOBANANA_ALLOW_THIRD_PARTY=1
If you do not want the API key to appear in the command line, store it in a file and use:
export NANOBANANA_API_KEY_FILE="$PWD/.secrets/nanobanana_api_key"
Generate an image:
python3 scripts/generate_image.py "Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme"
Edit an image:
python3 scripts/generate_image.py "Using the provided image, change only the blue sofa to a vintage brown leather Chesterfield sofa. Keep everything else exactly the same." --input-image ./living-room.png
Recreate an attached diagram with translated labels:
python3 scripts/generate_image.py "Recreate the attached pastel technical diagram with the same layout, icons, arrows, and hand-drawn style. Replace all visible English labels with natural Simplified Chinese. Keep the composition unchanged." --aspect-ratio 16:9 --image-size 2K
Safety note:
scripts/build_materials_figure_prompt.py and --print-prompt are local-only and do not send data over the network.--allow-third-party or NANOBANANA_ALLOW_THIRD_PARTY=1.NANOBANANA_API_KEY_FILE over inline --api-key when you do not want the key to appear in shell history.Choose a mode first:
plot mode.
Read references/publication-plot-api.md and run scripts/plot_publication_figure.py.
For natural-language requests, also read references/natural-language-plot-workflow.md.image mode.
Follow the Gemini generateContent flow below.For image mode:
POST /v1beta/models/{model}:generateContent with X-goog-api-key.contents[].parts.
Text-only generation uses one text part. Image editing appends one or more inline image parts.generationConfig.imageConfig.
Prefer --aspect-ratio and --image-size, matching the official docs.python3 scripts/build_materials_figure_prompt.py --materials-figure ... when you want to inspect or refine the prompt before sending any API request.candidates[0].content.parts[].inlineData.
Save text parts too when returned.For plot mode:
scripts/build_plot_spec.py.style, layout, and panels.bar, trend, heatmap, scatter, legend, or empty panels.python3 skills/nanobanana-image-generation/scripts/plot_publication_figure.py spec.json
Required:
NANOBANANA_API_KEYNANOBANANA_BASE_URL
Must be set explicitly. Official Google endpoint: https://generativelanguage.googleapis.comOptional:
NANOBANANA_MODEL
Default: gemini-3.1-flash-image-previewNANOBANANA_TIMEOUT
Default: 120NANOBANANA_API_KEY_FILE
Path to a file containing the API key. Prefer this when you do not want the key shown in command history or command logs.NANOBANANA_ALLOW_THIRD_PARTY
Set to 1 only when you intentionally want to send API keys and user-provided files to a non-official Gemini-compatible provider.scripts/generate_image.py
Python CLI that follows the official Gemini generateContent request shape.scripts/generate_image.js
Node.js CLI with the same request format.scripts/plot_publication_figure.py
Python CLI for exact publication-style plotting from JSON specs.scripts/build_plot_spec.py
Python CLI that expands a concise request JSON into a full plotting spec.Common options:
--input-image ./source.png--prompt-file ./background.md--aspect-ratio 16:9--image-size 2K--text-only--thinking-level high--include-thoughts--materials-figure mechanism-figure--lang zh--style-note "Nature Energy style"--print-prompt--allow-third-party--api-key-file ./.secrets/nanobanana_api_keyDefault output location:
./output/nanobanana/ relative to the current Codex working directoryDeterministic plotting:
python3 skills/nanobanana-image-generation/scripts/plot_publication_figure.py ./spec.json \
--out-path ./output/plots/result \
--formats png pdf svg \
--dpi 300
Natural-language-friendly internal workflow:
python3 skills/nanobanana-image-generation/scripts/build_plot_spec.py ./request.json --out ./spec.json
python3 skills/nanobanana-image-generation/scripts/plot_publication_figure.py ./spec.json
Official Google examples:
api_key="GEMINI_API_KEY"base_url="https://generativelanguage.googleapis.com"Third-party provider replacements:
api_key="your_provider_api_key"base_url="your_google_compatible_endpoint"allow_third_party=trueOptional Zhizengzeng example:
api_key="your_zzz_api_key"base_url="https://api.zhizengzeng.com/google"allow_third_party=trueEverything else should stay aligned with the official Gemini documentation.
zh-CN prompts when image fidelity matters.If the user asks for a materials-science paper figure, journal-style scientific schematic, graphical abstract, mechanism diagram, synthesis workflow figure, microstructure-property diagram, device architecture figure, or characterization-plan figure, use the bundled materials-science templates instead of writing the prompt from scratch.
Workflow:
graphical-abstractmechanism-figuredevice-architectureprocessing-workflowenzhScientific Background slot, or use the script shortcut directly.--prompt-file or scripts/build_materials_figure_prompt.py --background-file ... instead of squeezing it into one shell argument.This skill includes a distilled publication-figure playbook adapted from the figures4papers project. Use it to make Nanobanana outputs look like journal figures rather than generic AI art.
Read the reference files only as needed:
Apply these rules when prompting:
This skill is strong for:
This skill is not a guarantee of exact quantitative plotting. If the user needs exact bar heights, exact heatmap values, or faithful axis tick math from raw numbers, treat Nanobanana as a layout or visual-direction tool unless the request is explicitly a redraw from a trusted reference image.
For exact plotting, switch to plot mode and use references/publication-plot-api.md plus scripts/plot_publication_figure.py.
Python shortcut:
python3 scripts/generate_image.py "paste the scientific background here" \
--materials-figure mechanism-figure \
--lang en \
--style-note "Benchmark the figure against Nature Materials aesthetics." \
--aspect-ratio 4:3 \
--image-size 2K
JavaScript shortcut:
node scripts/generate_image.js "paste the scientific background here" \
--materials-figure graphical-abstract \
--lang zh \
--aspect-ratio 4:3 \
--image-size 2K
Prompt-only preflight:
python3 scripts/build_materials_figure_prompt.py \
--materials-figure mechanism-figure \
--lang en \
--background-file ./background.md \
--style-note "Nature Materials aesthetic with concise panel labels."
401 or 403, verify NANOBANANA_API_KEY.NANOBANANA_BASE_URL or pass --base-url.--allow-third-party or set NANOBANANA_ALLOW_THIRD_PARTY=1 only if that provider is intentional.404, verify that the request is going to /v1beta/models/{model}:generateContent.candidates[0].content.parts and check whether the request asked for image output.figures4papers.