Agent Economy Report

Skill code audit

CAUTION version 1.0.1 · audited 2026-09-09

nano-banana-pro @steipete

This skill generates or edits images by calling Google's Gemini 3 Pro Image API. It consists of instructions for the agent plus one Python script that takes a prompt, an optional input image, a resolution setting, and an API key, then saves the resulting PNG to the filename you specify. The API key comes either from a command-line argument or from the GEMINI_API_KEY environment variable, and it is used only to authenticate with Google's official client library. The only network traffic is to Google's Gemini service through the google-genai package; there are no hidden endpoints, no obfuscated code, no persistence, and no payment or wallet handling. Two dependencies (google-genai, pillow) are installed on the fly by 'uv run'. Behavior matches the stated purpose; the main things to be aware of are that prompts and any input images are sent to Google, and that the output file will overwrite an existing file at the same path.

Declared purposeGenerate new images or edit existing local images using Google's Nano Banana Pro (Gemini 3 Pro Image) API at 1K/2K/4K resolutions.
Observed behaviorParses CLI arguments, resolves a Gemini API key from --api-key or GEMINI_API_KEY, optionally opens a local input image with PIL and auto-selects a resolution from its dimensions, calls client.models.generate_content on model 'gemini-3-pro-image-preview', then writes returned image bytes as a PNG to the requested path and prints the absolute path. Errors exit non-zero with plain messages. No other files are read or written, no shell execution, no data sent anywhere other than the Gemini API.
Verdict, rules onlyCAUTION · reads credential-like environment variables: GEMINI_API_KEY
Verdict, AISAFE
Final verdictCAUTION (never better than either pass)

Capabilities

capabilityvs purposedetail
networkneededOutbound calls to Google's Gemini API via the google-genai client (scripts/generate_image.py line 114); no other hosts appear in the code. The only URL in the package is a publisher profile link on clawhub.ai in skill-card.md line 7.
credentialsneededReads GEMINI_API_KEY from the environment or accepts --api-key, and passes it only to genai.Client (scripts/generate_image.py lines 26, 75). The key is not logged, written to disk, or sent anywhere else.
filesystem_readneededOpens only the user-supplied --input-image path with PIL (scripts/generate_image.py line 86).
filesystem_writeneededCreates parent directories and writes the generated PNG to the user-supplied --filename (scripts/generate_image.py lines 79, 147-151). An existing file at that path would be overwritten.
install_packagesneededThe inline uv script header declares dependencies google-genai>=1.0.0 and pillow>=10.0.0, which uv installs at run time (scripts/generate_image.py lines 4-7).
shellneededSKILL.md instructs the agent to run the script via 'uv run' in bash (SKILL.md lines 15-16); the commands are fixed and contain only user-provided prompt/filename arguments.

Findings

severityfinding
infoReads a sensitive API key from the environment
The Gemini API key is read from the environment and used only as the credential for genai.Client (line 75). It is never printed, stored, or transmitted to any destination other than Google's API.
scripts/generate_image.py:26 return os.environ.get("GEMINI_API_KEY")
infoSends prompt and optional input image to Google
The user's prompt and, when editing, the contents of the local input image are transmitted to Google's Gemini service. This is inherent to the declared purpose and is disclosed in skill-card.md line 19, but users should avoid sending confidential images.
scripts/generate_image.py:114 response = client.models.generate_content(
lowCreates directories and overwrites the target file without confirmation
The script creates any missing parent directories for --filename and saves the PNG there (lines 147-151) with no check for an existing file, so a matching path would be replaced. Paths come from the agent/user, not from the skill.
scripts/generate_image.py:79 output_path.parent.mkdir(parents=True, exist_ok=True)
lowDependencies installed at run time by uv
Running the script with 'uv run' fetches google-genai and pillow from PyPI at execution time with open-ended version ranges, so the exact installed code is not pinned by the package.
scripts/generate_image.py:5 # "google-genai>=1.0.0",

0 AI finding(s) were dropped because their file, line or quote did not match the package.

Network destinations in the code

domainservice ratingwhere
clawhub.ainot in the service indexskill-card.md:7

Other facts

Binaries invokedbase64, bash, python3, uv
Environment variables readGEMINI_API_KEY
Hard-coded walletsnone
Pipes a download to a shell0
eval / exec / subprocess0
base64 blobs0
File writes2
Persistence0

Files audited

filelinessha256
SKILL.md1304ea88f4b0e9577e2…
_meta.json64f61dc1245661922…
scripts/generate_image.py1678ecca97db200cab9…
skill-card.md408bd506d739be578e…

For agents

JSON: https://agenteconomy.report/k/nano-banana-pro.audit.json · badge: https://agenteconomy.report/k/nano-banana-pro.audited.svg · skill rating: /k/nano-banana-pro · commission an audit of any skill: US$ 29 per version.

How this is computed

The complete published package of this exact version was downloaded from the registry and read statically; nothing was executed. A deterministic pass extracts network destinations, binaries, environment variables, writes, install commands, obfuscation markers, subprocesses and wallets, each with file and line. An AI then reads the whole package with those facts and writes the summary, the capabilities and the findings under a strict schema; every finding it produces must cite a file, a line and the exact text, or it is dropped. The final verdict is the worst of the two passes. The audit does not change the skill's trust tier (policy); the author may respond through the dispute channel and the response is published here. Commissioned by: the Agent Economy Report (free program: the 150 most downloaded skills, September 2026).