From e9aa409790b40cca04af75d00ad57c67c4141916 Mon Sep 17 00:00:00 2001 From: Goose Date: Sat, 11 Apr 2026 02:35:18 +0000 Subject: [PATCH] feat: add minimax-image-generation skill for MiniMax image generation Wraps the MiniMax /v1/image_generation API (model: image-01) as a Claude Code skill. Pure bash implementation using curl + jq + base64. Co-Authored-By: Claude Opus 4.6 --- minimax-image-generation/CLAUDE.md | 64 ++++++ minimax-image-generation/SKILL.md | 198 +++++++++++++++++++ minimax-image-generation/scripts/generate.sh | 123 ++++++++++++ 3 files changed, 385 insertions(+) create mode 100644 minimax-image-generation/CLAUDE.md create mode 100644 minimax-image-generation/SKILL.md create mode 100755 minimax-image-generation/scripts/generate.sh diff --git a/minimax-image-generation/CLAUDE.md b/minimax-image-generation/CLAUDE.md new file mode 100644 index 0000000..677c93e --- /dev/null +++ b/minimax-image-generation/CLAUDE.md @@ -0,0 +1,64 @@ +# MiniMax Image Generation — Implementation Notes + +## API Reference + +- **Endpoint**: `POST /v1/image_generation` +- **Base URL**: `https://api.minimax.io` (international) or `https://api.minimaxi.com` (China) +- **Auth**: `Authorization: Bearer ` +- **Model**: `image-01` +- **Response**: JSON with `data.image_base64[]` array + +## Example API Call + +```bash +curl -X POST "https://api.minimax.io/v1/image_generation" \ + -H "Authorization: Bearer ${MINIMAX_API_KEY}" \ + -H "Content-Type: application/json" \ + -d '{ + "model": "image-01", + "prompt": "men Dressing in white t shirt, full-body stand front view image :25, outdoor", + "aspect_ratio": "16:9", + "num_images": 1, + "response_format": "base64" + }' +``` + +## Response Format + +```json +{ + "data": { + "image_base64": [""] + }, + "model": "image-01", + "request_id": "" +} +``` + +## Aspect Ratios + +| Ratio | Dimensions | Use Case | +|-------|-----------|----------| +| `16:9` | 1920×1080 | Desktop wallpaper, banners | +| `1:1` | 1024×1024 | Social media, profile images | +| `9:16` | 1080×1920 | Mobile wallpaper, stories | +| `4:3` | 1024×768 | Presentations | +| `3:4` | 768×1024 | Posters, portraits | + +## Dependencies + +- `curl` — HTTP requests +- `jq` — JSON parsing +- `base64` — Decode image data (coreutils) + +All three are standard Unix tools. No Python or Node required. + +## File Structure + +``` +minimax-image-generation/ +├── SKILL.md # Skill definition + user-facing docs +├── scripts/ +│ └── generate.sh # Generation script (CLI entry point) +└── CLAUDE.md # These implementation notes +``` diff --git a/minimax-image-generation/SKILL.md b/minimax-image-generation/SKILL.md new file mode 100644 index 0000000..7144b63 --- /dev/null +++ b/minimax-image-generation/SKILL.md @@ -0,0 +1,198 @@ +# MiniMax Image Generation Skill + +Claude Code skill for generating images via the MiniMax API. +Wraps the MiniMax `/v1/image_generation` endpoint as a `/minimax-image-generation` slash command. + +## Structure +- `SKILL.md` — skill definition (deployed to ~/.claude/skills/minimax-image-generation/) +- `scripts/generate.sh` — image generation script +- `CLAUDE.md` — implementation notes + +## Commands +```bash +bash scripts/generate.sh [options] +``` + +## Rules +- The generated image is written to disk as `output-0.jpeg` (and `output-1.jpeg`, etc. for multiple images) +- Set `MINIMAX_API_KEY` env var before use +- After edits: run `bash scripts/sync.sh` to deploy (if provided) + +--- +name: minimax-image-generation +version: "1.0.0" +description: "Generate images from MiniMax's image-01 model. Triggered by phrases like 'generate image', 'create picture', 'minimax image', 'text to image'." +argument-hint: '"a sunset over the ocean, cinematic" [--aspect-ratio=16:9] [--num-images=1] [--output=output.jpeg]' +allowed-tools: Bash, Read, Write +user-invocable: true +metadata: + openclaw: + emoji: "🎨" + category: "media" + requires: + env: + - MINIMAX_API_KEY + optionalEnv: + - MINIMAX_API_BASE_URL + bins: + - curl + - jq + primaryEnv: MINIMAX_API_KEY + files: + - "scripts/*" + tags: + - image + - image-generation + - generative-ai + - minimax + - text-to-image + - AI +--- + +# MiniMax Image Generation + +> Generate images using MiniMax's `image-01` model via the `/v1/image_generation` API. + +## Quick Start + +```bash +# Set your API key +export MINIMAX_API_KEY="your-minimax-api-key" + +# Generate an image +/minimax-image-generation "a cat wearing a spacesuit, cinematic photography" + +# With options +/minimax-image-generation "a sunset over the ocean" --aspect-ratio=16:9 --num-images=1 --output=sunset.jpeg +``` + +--- + +## Parse User Intent + +Extract from the user's input: + +1. **PROMPT**: The image description (required) +2. **ASPECT_RATIO**: `16:9` (default), `1:1`, `9:16`, `4:3`, `3:4` +3. **NUM_IMAGES**: Number of images to generate (1–4, default 1) +4. **OUTPUT**: Output filename (default `output-{index}.jpeg`) + +--- + +## Step 1: Verify Credentials + +```bash +if [ -z "${MINIMAX_API_KEY:-}" ]; then + echo "ERROR: MINIMAX_API_KEY is not set." + echo "Set it with: export MINIMAX_API_KEY='your-api-key'" + exit 1 +fi + +API_BASE_URL="${MINIMAX_API_BASE_URL:-https://api.minimax.io}" +echo "Using API base: $API_BASE_URL" +``` + +--- + +## Step 2: Call the MiniMax Image Generation API + +```bash +PROMPT="a serene mountain landscape at dawn, cinematic, photorealistic" +ASPECT_RATIO="${ASPECT_RATIO:-16:9}" +NUM_IMAGES="${NUM_IMAGES:-1}" +OUTPUT="${OUTPUT:-}" + +URL="${API_BASE_URL}/v1/image_generation" + +response=$(curl -s -X POST "${URL}" \ + -H "Authorization: Bearer ${MINIMAX_API_KEY}" \ + -H "Content-Type: application/json" \ + -d "{ + \"model\": \"image-01\", + \"prompt\": \"${PROMPT}\", + \"aspect_ratio\": \"${ASPECT_RATIO}\", + \"num_images\": ${NUM_IMAGES}, + \"response_format\": \"base64\" + }") + +# Check for errors +if echo "$response" | jq -e '.error' >/dev/null 2>&1; then + error_msg=$(echo "$response" | jq -r '.error.message // "Unknown error"') + echo "ERROR: $error_msg" + exit 1 +fi +``` + +--- + +## Step 3: Decode and Save Images + +```bash +images=$(echo "$response" | jq -r '.data.image_base64[]') + +idx=0 +for image_b64 in $images; do + if [ -n "${OUTPUT}" ]; then + # Single output filename (use index if multiple images) + if [ "$NUM_IMAGES" -gt 1 ]; then + filename="${OUTPUT%.*}-${idx}.${OUTPUT##*.}" + else + filename="$OUTPUT" + fi + else + filename="output-${idx}.jpeg" + fi + + echo "$image_b64" | base64 -d > "$filename" + echo "Saved: $filename" + idx=$((idx + 1)) +done +``` + +--- + +## Aspect Ratio Guide + +| Ratio | Use Case | +|-------|----------| +| `16:9` | Widescreen (default) — desktop wallpaper, banners | +| `1:1` | Square — social media posts, profile images | +| `9:16` | Portrait — mobile wallpapers, stories | +| `4:3` | Standard — presentations, blog images | +| `3:4` | Portrait standard — posters, portraits | + +--- + +## Configuration Reference + +### Environment Variables + +| Variable | Required | Description | +|----------|----------|-------------| +| `MINIMAX_API_KEY` | Yes | Your MiniMax API key | +| `MINIMAX_API_BASE_URL` | No | API base URL (default: `https://api.minimax.io`) | + +### API Parameters + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `model` | string | `image-01` | Model to use | +| `prompt` | string | required | Image description | +| `aspect_ratio` | string | `16:9` | Image aspect ratio | +| `num_images` | integer | `1` | Number of images (1–4) | +| `response_format` | string | `base64` | Output format | + +--- + +## Example Output + +``` +🎨 MiniMax Image Generation +├─ Prompt: "a cat wearing a spacesuit, cinematic photography" +├─ Aspect ratio: 16:9 +├─ Model: image-01 +└─ Generating... + +Saved: output-0.jpeg +Done. +``` diff --git a/minimax-image-generation/scripts/generate.sh b/minimax-image-generation/scripts/generate.sh new file mode 100755 index 0000000..c01ac81 --- /dev/null +++ b/minimax-image-generation/scripts/generate.sh @@ -0,0 +1,123 @@ +#!/usr/bin/env bash +# generate.sh — Generate images via MiniMax API +set -euo pipefail + +die() { + echo "ERROR: $1" >&2 + exit 1 +} + +usage() { + cat < Image description (required) + -a, --aspect-ratio Aspect ratio: 16:9 (default), 1:1, 9:16, 4:3, 3:4 + -n, --num-images Number of images (1-4, default 1) + -o, --output Output filename (default: output-{index}.jpeg) + -k, --api-key MiniMax API key (or set MINIMAX_API_KEY env var) + -u, --base-url API base URL (default: https://api.minimax.io) + -h, --help Show this help + +Examples: + $(basename "$0") -p "a sunset over the ocean, cinematic" + $(basename "$0") -p "a cat" -a 1:1 -n 2 -o mycat.jpeg +EOF + exit 0 +} + +# Parse arguments +PROMPT="" +ASPECT_RATIO="16:9" +NUM_IMAGES=1 +OUTPUT="" +API_KEY="${MINIMAX_API_KEY:-}" +BASE_URL="${MINIMAX_API_BASE_URL:-https://api.minimax.io}" + +while [[ $# -gt 0 ]]; do + case "$1" in + -p|--prompt) PROMPT="$2"; shift 2 ;; + -a|--aspect-ratio) ASPECT_RATIO="$2"; shift 2 ;; + -n|--num-images) NUM_IMAGES="$2"; shift 2 ;; + -o|--output) OUTPUT="$2"; shift 2 ;; + -k|--api-key) API_KEY="$2"; shift 2 ;; + -u|--base-url) BASE_URL="$2"; shift 2 ;; + -h|--help) usage ;; + *) die "Unknown option: $1" ;; + esac +done + +# Validate required inputs +if [ -z "$PROMPT" ]; then + die "Prompt is required. Use -p 'description'" +fi + +if [ -z "$API_KEY" ]; then + die "MINIMAX_API_KEY is not set. Pass -k or export MINIMAX_API_KEY" +fi + +# Validate aspect ratio +case "$ASPECT_RATIO" in + 16:9|1:1|9:16|4:3|3:4) ;; + *) die "Invalid aspect ratio: $ASPECT_RATIO. Use 16:9, 1:1, 9:16, 4:3, or 3:4" ;; +esac + +# Validate num_images +if ! [[ "$NUM_IMAGES" =~ ^[1-4]$ ]]; then + die "num-images must be between 1 and 4" +fi + +# Make the API call +URL="${BASE_URL}/v1/image_generation" + +echo "🎨 MiniMax Image Generation" +echo "├─ Prompt: $PROMPT" +echo "├─ Aspect ratio: $ASPECT_RATIO" +echo "├─ Num images: $NUM_IMAGES" +echo "└─ Model: image-01" +echo "" + +response=$(curl -s -X POST "${URL}" \ + -H "Authorization: Bearer ${API_KEY}" \ + -H "Content-Type: application/json" \ + -d "$(jq -n \ + --arg prompt "$PROMPT" \ + --arg ratio "$ASPECT_RATIO" \ + --argjson num "$NUM_IMAGES" \ + '{ + model: "image-01", + prompt: $prompt, + aspect_ratio: $ratio, + num_images: $num, + response_format: "base64" + }')") + +# Check for HTTP errors +if echo "$response" | jq -e '.error' >/dev/null 2>&1; then + error_msg=$(echo "$response" | jq -r '.error.message // "Unknown error"') + die "API error: $error_msg" +fi + +# Decode and save images +images=$(echo "$response" | jq -r '.data.image_base64[]') + +idx=0 +for image_b64 in $images; do + if [ -n "$OUTPUT" ]; then + if [ "$NUM_IMAGES" -gt 1 ]; then + filename="${OUTPUT%.*}-${idx}.${OUTPUT##*.}" + else + filename="$OUTPUT" + fi + else + filename="output-${idx}.jpeg" + fi + + echo "$image_b64" | base64 -d > "$filename" + echo "Saved: $filename" + idx=$((idx + 1)) +done + +echo "" +echo "Done."