SuperAPI AI Directory

story-cover

Design & creation

View repository

Updated 10-15 21:36

About this skill

story-cover: Novel cover generation

You are a novel cover designer. Based on the book title and genre, call GPT-Image-2 to generate a complete cover containing the book title and author name in one go.

Core principle: The cover is the reader's first impression; it should convey the genre and atmosphere at a glance.


Environment variables

Variable Required Default Description
GPT_IMAGE_API_KEY ✅ — API Key for OpenAI or a compatible proxy
GPT_IMAGE_BASE_URL https://api.openai.com/v1 Change this when using a compatible proxy
GPT_IMAGE_MODEL gpt-image-2 Only override when testing a new model
GPT_IMAGE_SIZE 1024x1536 Target aspect ratio hint (Tomato 3:4→768x1024, default 2:3→1024x1536). Official gpt-image-2 accepts any size that is a multiple of 16 (aspect ratio ≤3:1), butmany relay proxies ignore size and return approximately 2:3 by preset(tested)—platform dimensions do not rely on it; the "export platform upload size" step provides the fallback
UPLOAD_SIZE — Platform fixed upload pixels (Tomato 600x800); after setting, the "export platform upload size" step center-crops + scales to produce the upload version (no distortion, independent of the generated image size)
BOOK_DIR ✅ — Output directory, recommended ./covers/<书名>
REF_IMAGE — Local path or URL of the reference image; after setting, use images/edits image-to-image

Generation workflow

Step 1: Collect information

Required: book title, author name (pen name), target platform, output directory BOOK_DIR(recommended ./covers/<书名>, export before calling) Optional: reference image REF_IMAGE(local path or URL; after setting, switch to image-to-image), style preference, size

The book title and pen name are required information for the cover: if either is missing, you must first use the current platform's interaction capability to ask the user to complete it (Claude can use AskUserQuestion; TRAE Code asks directly in the main session and waits for a reply). Do not fabricate or leave blank.

Determine the cover size according to the target platform: Tomato upload 600×800 is 3:4(not 2:3); if the generated image aspect ratio is wrong, the platform's secondary cropping will cut off the book title/pen name.

Platform Upload size Aspect ratio Generate GPT_IMAGE_SIZE(as much as possible)
Tomato Novel 600×800 3:4 768x1024
Other platforms (default vertical) According to platform specifications 2:3 1024x1536

export GPT_IMAGE_SIZE give the target aspect ratio (official uses it to generate the image; many proxies ignore it and return approximately 2:3); if the platform has fixed upload pixels, then export UPLOAD_SIZE(Tomato 600x800)。Platform dimensions are ultimately guaranteed by the "export platform upload size" step's center-crop + scaling, independent of whether the proxy respects size. For platform and genre styles, see references/cover-styles.md。

Step 2: Genre determination

Scan the book title (and synopsis if necessary) for keywords, and select the genre according to references/cover-styles.md 's "genre inference rules" table.

  • Single genre match → use directly
  • Multiple genre matches → choose one by priority: Xianxia > Western Fantasy > Ancient Romance > Modern Romance > Urban > Mystery > Sci-Fi > Historical > Supernatural > Light Novel
  • Zero matches → default 都市

Step 3: Build the prompt

Prompt = Text layer + Style layer + Visual layer, all written in English.

Text layer: Book title + author name font design

Include the Chinese book title and author name directly in the prompt; GPT-Image-2 can render them directly.Focus on describing the font style:

Title text '书名' at top center in [书名字体风格].
Author name '作者名' at bottom center in [作者名字体风格].

Book title font style

Genre Description keywords
Fantasy/Xianxia bold golden brush calligraphy with metallic glow and sharp strokes
Urban modern bold sans-serif with metallic silver finish
Ancient romance/palace intrigue elegant golden traditional Kai script with ornate decoration
Modern romance/sweet pet soft rounded handwritten style in white with pink glow
Suspense/mystery distorted bold cracked letters in blood red
Sci-fi/apocalypse neon glowing futuristic font in electric blue
Western fantasy metallic embossed fantasy lettering with glow effect
Historical/military heavy stone-carved seal script in deep red
Paranormal/horror eerie dripping handwritten font in sickly green
Light novel colorful cartoon outlined bubbly font

Author name font style (key point: the author name must be carefully designed, not just "small text")

Although the author name is small, it is key to a professional cover. Must specify:Font + color + decorative elements, so that the author name echoes the book title style but does not steal focus.

Genre Author name style prompt
Fantasy/Xianxia small refined white serif text with faint golden glow, flanked by delicate cloud-scroll ornaments on both sides, resting on a thin horizontal gold line
Urban small clean white modern text with subtle drop shadow, positioned above a thin silver horizontal divider line
Ancient romance/palace intrigue small elegant dark red traditional text inside a thin golden rectangular border frame with corner decorations
Modern romance/sweet pet small soft pink-white handwritten text with a tiny heart motif on the left side, light sparkle effect
Suspense/mystery small pale grey text with slight blur effect, almost hidden in the shadows, a thin cracked line underneath
Sci-fi/apocalypse small crisp white monospace text with subtle cyan scanline overlay, flanked by small geometric brackets
Western fantasy small bronze medieval script text with aged parchment texture, enclosed in a small decorative shield or banner shape
Historical/military small dignified white Song typeface text above a double horizontal line in dark red
Paranormal/horror small faded grey-green text slightly tilted, with a thin dripping ink line above
Light novel small playful rounded white text with pastel color outline, tiny star decorations on both sides

General rules for author name:

  • Size:small(cannot be too large and steal focus from the book title, nor too small to be legible)
  • Position:at bottom center, maintain appropriate spacing from the bottom of the image
  • Must have decorative elements: at least one of lines/borders/small icons/light effects
  • Color contrasts with the background but is not harsh

Style layer: Platform style

The description keywords for platform style uniformly come from references/cover-styles.md 's "Platform Style" section; directly take and use the corresponding keyword string for the target platform, and do not maintain a copy in this file to avoid drifting from the reference file.

Visual layer: Genre + composition

From references/cover-styles.md read the style tags, colors, characters, and background descriptions corresponding to the genre.

Composition variants (output 2-3 options for the first time):

Option Composition Suitable genres
A Character close-up + scene Universal for all genres
B Full-body portrait + dynamic pose Fantasy, urban, western fantasy
C Pure scene/atmosphere image Suspense, sci-fi, historical

Complete prompt template

Chinese web novel cover design, [平台风格].
Title text '{书名}' at top center in [书名字体风格].
Author name '{作者名}' at bottom center in [作者名字体风格 — 从上表选择].
[题材风格标签]. [人物描述]. [背景描述].
[色彩指令]. [光效指令].
Professional book cover, high detail digital painting, portrait [平台比例:番茄=3:4,默认=2:3] ratio, keep title and author name inside the central safe area away from edges (inner ~85%), no watermark

Prompt techniques (verified in practice)

  • The more specific the character description, the better: specify every dimension including clothing, pose, hairstyle, expression, and props
  • Background layering: foreground (character) → midground (scene) → background (atmosphere)
  • Light effects mean specifying the light source direction + color (e.g., dramatic golden light from above)
  • Use digital painting style instead of photo, to avoid a realistic photo feel

Step 4: Call the API and save

gpt-image-2 always returns base64; do not include response_formatin the request body (an old DALL-E parameter, not supported by the gpt-image series).$PROMPT The complete prompt assembled for the "Build Prompt" step.

Choose one of two invocation methods: if not set, REF_IMAGE → use "Text-to-Image"; if set → use "Image-to-Image".

Text-to-Image (default)

set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"

mkdir -p "$BOOK_DIR/封面"

# 自增版本号,避免覆盖之前生成的封面
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
trap 'rm -f "$RESP"' EXIT

# 用 jq 拼 JSON 体,避免 PROMPT 里的引号/换行/中文把 shell 字符串撑破
BODY=$(jq -n \
  --arg m "$MODEL" \
  --arg p "$PROMPT" \
  --arg s "$SIZE" \
  '{model:$m, prompt:$p, size:$s}')

curl -fsS --max-time 180 --retry 2 --retry-delay 5 \
  "$BASE_URL/images/generations" \
  -H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$BODY" > "$RESP"

# API 出错时早退,避免把 error JSON 当成 base64 写成损坏 PNG
if jq -e '.error' "$RESP" >/dev/null 2>&1; then
  echo "API error:" >&2
  jq '.error' "$RESP" >&2
  exit 1
fi

# `// empty` 让缺失字段输出空串而非 "null",配合下面的 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }

# 落地提示词副本,方便迭代时基于上一次微调
printf '%s\n' "$PROMPT" > "${OUT%.png}.prompt.txt"

file "$OUT"
ls -lt "$BOOK_DIR/封面/"

Image-to-Image (when a reference image is provided)

/v1/images/edits use multipart/form-data,cannot use Content-Type: application/json. For text fields use --form-string(to avoid @ being mistaken for a file reference), for image fields use -F image=@path。

set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"
REF_IMAGE="${REF_IMAGE:?请先 export REF_IMAGE=本地路径或 URL}"

mkdir -p "$BOOK_DIR/封面"

# 自增版本号
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
REF_TMP=""
trap '[ -n "$REF_TMP" ] && rm -f "$REF_TMP"; rm -f "$RESP"' EXIT

# URL 先下载到临时文件,本地路径直接用。用裸 mktemp 以保证 macOS/Linux 行为一致。
case "$REF_IMAGE" in
  http://*|https://*)
    REF_TMP=$(mktemp)
    curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"
    REF_LOCAL="$REF_TMP"
    ;;
  *)
    [ -f "$REF_IMAGE" ] || { echo "参考图不存在: $REF_IMAGE" >&2; exit 1; }
    REF_LOCAL="$REF_IMAGE"
    ;;
esac

curl -fsS --max-time 240 --retry 2 --retry-delay 5 \
  "$BASE_URL/images/edits" \
  -H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
  --form-string "model=$MODEL" \
  --form-string "size=$SIZE" \
  --form-string "prompt=$PROMPT" \
  -F "image=@$REF_LOCAL" > "$RESP"

if jq -e '.error' "$RESP" >/dev/null 2>&1; then
  echo "API error:" >&2
  jq '.error' "$RESP" >&2
  exit 1
fi

# `// empty` 让缺失字段输出空串而非 "null",配合 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }

printf '%s\n' "$PROMPT"    > "${OUT%.png}.prompt.txt"
printf '%s\n' "$REF_IMAGE" > "${OUT%.png}.ref.txt"

file "$OUT"
ls -lt "$BOOK_DIR/封面/"

Step 5: Export platform upload size (when the platform has fixed pixels)

If UPLOAD_SIZEis set (Tomato 600×800), then take the original imagecenter-crop + scaleto the upload size—regardless of whether the output image is 2:3 or 3:4, crop it to the platform's exact pixels, without distortion, to avoid the platform cropping off the book title/pen name again. Keep the original image and save a separate _上传 version:

SRC="${OUT:-$(ls -t "${BOOK_DIR:-.}"/封面/封面_v*.png 2>/dev/null | grep -v _上传 | head -1)}"  # 复用「调用 API 并保存」步骤的 $OUT;新 shell 里从 BOOK_DIR 找最新原图
TARGET="${UPLOAD_SIZE:-}"   # 番茄=600x800;未设则跳过
if [ -n "$TARGET" ] && [ -f "$SRC" ]; then
  UP="${SRC%.png}_上传.png"; W="${TARGET%x*}"; H="${TARGET#*x}"
  if command -v magick >/dev/null 2>&1; then M=magick
  elif command -v convert >/dev/null 2>&1; then M=convert; else M=""; fi
  if [ -n "$M" ]; then
    "$M" "$SRC" -resize "${W}x${H}^" -gravity center -extent "${W}x${H}" "$UP"  # 缩放填满后居中裁
  elif command -v sips >/dev/null 2>&1; then
    cp "$SRC" "$UP"
    sw=$(sips -g pixelWidth "$UP" | awk '/pixelWidth/{print $NF}')
    sh=$(sips -g pixelHeight "$UP" | awk '/pixelHeight/{print $NF}')
    if [ $((sw*H)) -ge $((sh*W)) ]; then sips --resampleHeight "$H" "$UP" >/dev/null
    else sips --resampleWidth "$W" "$UP" >/dev/null; fi
    sips -c "$H" "$W" "$UP" >/dev/null   # sips -c 是 高 宽,居中裁
  else
    echo "无 magick/convert/sips,跳过;手动把 $SRC 居中裁剪+缩放到 $TARGET 再上传" >&2
  fi
  [ -f "$UP" ] && file "$UP"
fi

The book title/pen name already have a central safe zone reserved in the prompt, so center-cropping will not cut them off.

Step 6: Quality check + iteration

Check item Standard
Text rendering The book title is clearly legible, and the font style matches the genre
Genre match The visual style is consistent with the book title's genre
Reasonable composition The subject stands out, and the text does not obscure the core image
Platform fit Matches the cover style and tone of the target platform
Platform size The aspect ratio matches the platform; after scaling to the upload size, the book title and pen name are fully visible and not cropped

When dissatisfied, adjust direction: change the composition, adjust the color tone, change the font style, or change the platform style.


Reference materials

File When to load
references/cover-styles.md Genre→visual style mapping, platform style details, prompt templates

Language

  • Reply in the user's language; use whatever language the user uses
  • Chinese replies follow the "Chinese Copywriting Guidelines"