Skill: ljquan/tuzi-nano-banana (version 1.0.0)

--- name: tuzi-nano-banana description: Generate/edit images via Tuzi API (default), Google Gemini, OpenAI, DashScope, Replicate. Text-to-image + image-to-image editing; 1K/2K/4K resolution. Use for image create/modify/edit requests incl. --input-image. --- # Nano Banana Image Generation & Editing Multi-provider image generation and editing. Default provider: Tuzi (兔子API, api.tu-zi.com). ## Script Directory **Agent Execution**: 1. `SKILL_DIR` = this SKILL.md file's directory 2. Script path = `${SKILL_DIR}/scripts/main.ts` ## Usage Run the script using absolute path (do NOT cd to skill directory first): **Generate new image:** ```bash npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "your image description" --filename "output.png" [--resolution 1K|2K|4K] [--provider tuzi|google|openai|dashscope|replicate] [--model MODEL_ID] ``` **Edit existing image:** ```bash npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "editing instructions" --filename "output.png" --input-image "path/to/input.png" [--resolution 1K|2K|4K] ``` **Important:** Always run from the user's current working directory so images are saved where the user is working. ## Default Workflow (draft → iterate → final) Goal: fast iteration without burning time on 4K until the prompt is correct. - Draft (1K): quick feedback loop - `npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "<draft prompt>" --filename "yyyy-mm-dd-hh-mm-ss-draft.png" --resolution 1K` - Iterate: adjust prompt in small diffs; keep filename new per run - If editing: keep the same `--input-image` for every iteration until you're happy. - Final (4K): only when prompt is locked - `npx -y bun ${SKILL_DIR}/scripts/main.ts --prompt "<final prompt>" --filename "yyyy-mm-dd-hh-mm-ss-final.png" --resolution 4K` ## Options | Option | Description | |--------|-------------| | `--prompt <text>`, `-p` | Prompt text (required) | | `--filename <path>`, `-f` | Output filename (required) | | `--input-image <path>`, `-i` | Input image for editing | | `--resolution 1K\|2K\|4K`, `-r` | Output resolution (default: 1K) | | `--provider tuzi\|google\|openai\|dashscope\|replicate` | Force provider (default: auto-detect, Tuzi first) | | `--model <id>`, `-m` | Model ID | | `--api-key <key>`, `-k` | API key (overrides env var) | ## Resolution Options - **1K** (default) - ~1024px resolution - **2K** - ~2048px resolution - **4K** - ~4096px resolution Map user requests: - No mention of resolution → `1K` - "low resolution", "1080", "1080p", "1K" → `1K` - "2K", "2048", "normal", "medium resolution" → `2K` - "high resolution", "high-res", "hi-res", "4K", "ultra" → `4K` ## Provider Selection 1. `--provider` specified → use it 2. `--api-key` provided (no `--provider`) → Google (direct Gemini API) 3. Only one API key available → use that provider 4. Multiple available → Tuzi first ## Tuzi Models | Model ID | Quality | Notes | |----------|---------|-------| | `gemini-3-pro-image-preview` | 1k/2k/4k | Default. High quality | | `gemini-3.1-flash-image-preview` | 1k/2k/4k | Fast, extended aspect ratios | | `gemini-3-pro-image-preview-vip` | 1k built-in | VIP | | [REDACTED_SECRET] | 2k built-in | VIP | | [REDACTED_SECRET] | 4k built-in | VIP | ## Environment Variables | Variable | Description | |----------|-------------| | `TUZI_API_KEY` | Tuzi API key (https://api.tu-zi.com) | | `TUZI_IMAGE_MODEL` | Tuzi default model | | `TUZI_BASE_URL` | Custom Tuzi endpoint | | `GEMINI_API_KEY` | Google Gemini API key | | `GOOGLE_API_KEY` | Google API key (alias) | | `OPENAI_API_KEY` | OpenAI API key | | `DASHSCOPE_API_KEY` | DashScope API key | | `REPLICATE_API_TOKEN` | Replicate API token | **Load Priority**: CLI `--api-key` > env vars > `<cwd>/.tuzi-skills/.env` > `~/.tuzi-skills/.env` ## Image Editing When the user wants to modify an existing image: 1. Use `--input-image` parameter with the path to the image 2. The prompt should contain editing instructions 3. Resolution auto-detects from input image size if not specified ## Prompt Handling **For generation:** Pass user's image description as-is to `--prompt`. Only rework if clearly insufficient. **For editing:** Pass editing instructions in `--prompt` (e.g., "add a rainbow in the sky") ## Prompt Templates - Generation: "Create an image of: <subject>. Style: <style>. Composition: <camera/shot>. Lighting: <lighting>. Background: <background>." - Editing: "Change ONLY: <single change>. Keep identical: subject, composition, pose, lighting, color palette, background, text, and overall style." ## Filename Generation Pattern: `yyyy-mm-dd-hh-mm-ss-name.png` - Timestamp: Current date/time in 24-hour format - Name: Descriptive lowercase text with hyphens (1-5 words) ## Preflight + Common Failures - `command -v npx` (must exist) - API key must be available (env or `--api-key`) - If editing: input image must exist ## Output - Saves PNG to current directory (or specified path) - Script outputs the full path to the generated image - **Do not read the image back** - just inform the user of the saved path


Security scan verdicts — ClawScan: suspicious | static analysis: suspicious | VirusTotal: clean | SkillSpector: suspicious (HIGH)