Loading...
Loading...
Generates 9 consistent multi-angle fashion-editorial portraits from a single reference image, with locked identity (face/skin/eyes), preserved hairstyle structure, faithful outfit/accessories, and a unified photography style across all frames. Use when the user says "multi-angle", "multi-angle shots", "九连拍", "多角度九连拍", "9-angle portraits", "fashion lookbook", "model consistency series", "consistent portraits from one photo", "generate 9 angles of this model", or "e-commerce model multi-angle pack". Part of the product-shots ecosystem for cross-border e-commerce apparel and accessory listings.
npx skill4agent add motiful/product-shots product-shots-multi-anglePersona — You are a fashion editorial director specializing in multi-image model campaigns.
REFERENCE_IMAGE{HAIRSTYLE} intactNO loose hairNO reinterpretation{PHOTOGRAPHY_STYLE}where possibleNo accessories — frame doesn't reach them<suggestion>generate_multi_angle_series(user_request) → 9_images
# Step 0 — Pin hard constraints (MUST, before any decision)
load references/hard-constraints.md
→ Reference Image / Analyse-Before-Generate / Hairstyle Intact /
Accessory Fidelity / Crop Boundaries / Style Unity / Override / Batch
keep these in working context for Steps 1-4 — violations break identity / hairstyle /
crop integrity which the validation views (Image 4 back, Image 8 side) cannot recover.
# Step 1 — Reference image gate + constraint pre-check
if user did NOT upload REFERENCE_IMAGE:
abort with: "This skill requires a reference image to guarantee identity consistency.
Please upload a photo and retry."
# NEVER fall back to text-only description.
# Pre-check RULE_001 + RULE_002 setup before extraction proceeds (extracted_vars
# + prompts + outputs are empty at this stage — call gates the workflow entry).
enforce_constraints(extracted_vars={}, prompts=[], outputs=[])
→ see references/hard-constraints.md §Execution Procedure (RULE_001 reference-image
presence; later re-invoked at Step 5 with full payload).
# Step 2 — Extract 14 variables from reference (Vision pass)
extracted_vars = extract_variables(reference_image=REFERENCE_IMAGE)
→ see references/variables-and-workflow.md §Variable Extraction Specifications
REQUIRED = REFERENCE_IMAGE, HAIR_COLOR, HAIRSTYLE, SKIN_TONE, EYE_COLOR,
FACE_SHAPE, OUTFIT, BACKGROUND_COLOR, PHOTOGRAPHY_STYLE, ASPECT_RATIO
OPTIONAL = HAIR_ACCESSORIES, BAG, JEWELRY, OTHER_ACCESSORIES (default "none")
if any required field cannot be extracted with confidence → ask the user to clarify
(do NOT silently default).
# Step 3 — Photography style selection
# Inference sources (per variables-and-workflow.md §Style detection):
# has_explicit_style_specification(user_request) → True if user_request
# contains any keyword in STYLE_KEYWORDS_LIST (e.g., "retro", "flash",
# "muted", "editorial", "soft", "analog")
# has_style_reference_image(context) → True if context.attached_images
# contains an image flagged role="style_reference" by the caller
selected_style = select_or_emit_presets(reference_image=REFERENCE_IMAGE,
has_style_kw=has_explicit_style_specification(user_request))
→ see references/photography-style-presets.md §Execution Procedure
# Returns chosen_style block verbatim OR pauses (emits 3 preset images +
# 5 <suggestion> chips) and waits for user click. Never auto-picks a default.
# Step 4 — Fill 9 task-prompt templates (single batch)
image_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9]
prompts = fill_task_prompts(extracted_vars=extracted_vars,
selected_style=selected_style,
image_ids=image_ids)
→ see references/task-prompts.md §Execution Procedure
+ references/task-prompts-6-9.md (images 6-9)
# Each prompt repeats the full {PHOTOGRAPHY_STYLE} block verbatim.
# Each prompt re-asserts {HAIRSTYLE} intact + NO loose hair where applicable.
images = Skill("product-shots-image-gen",
f"batch_generate: {len(prompts)} prompts | "
f"reference_image={REFERENCE_IMAGE} | "
f"model=gemini-3-pro-image-preview")
# Do NOT substitute with direct API call. product-shots-image-gen owns
# API-key resolution + reference-image preprocessing.
assert images.delivered and len(images) == 9
# Step 5 — Self-check gate (re-validate against hard-constraints)
enforce_constraints(extracted_vars=extracted_vars, prompts=prompts, outputs=images)
→ see references/hard-constraints.md §Execution Procedure (full 8-rule sweep)
critical checks (subset of RULE_003 / RULE_005 / RULE_006):
- Image 4 (back view) — hairstyle structure visible from behind, no loose hair
- Image 8 (side profile) — hairstyle structure visible from side, no loose hair
- Image 5 (extreme close-up) — only eyes/nose/lips visible, no forehead/chin/shoulders
- All 9 — same {PHOTOGRAPHY_STYLE} signature (lighting / shadow direction / grain)
if any check fails → regenerate the affected image(s)
# Step 6 — User overrides (re-render selectively)
on user override of any extracted variable:
extracted_vars = apply_user_overrides(extracted_vars, user_overrides)
→ see references/variables-and-workflow.md §Variable Override Logic
# Internally calls mark_affected_images_for_regeneration(variable_key):
HAIRSTYLE / HAIR_COLOR / HAIR_ACCESSORIES → re-render images 1-9
OUTFIT → re-render 1, 2, 3, 4, 6, 7, 8, 9 (skip 5)
BAG / JEWELRY → re-render 1, 2, 3, 6, 9 (in-frame ones)
PHOTOGRAPHY_STYLE → re-render images 1-9references/hard-constraints.mdreferences/variables-and-workflow.mdreferences/photography-style-presets.md<suggestion>references/task-prompts.md{VARIABLE}references/task-prompts-6-9.mdtask-prompts.md1. Variables → references/variables-and-workflow.md §Variables
14 variables: REFERENCE_IMAGE, HAIR_COLOR, HAIRSTYLE, HAIR_ACCESSORIES,
SKIN_TONE, EYE_COLOR, FACE_SHAPE, OUTFIT, BAG, JEWELRY, OTHER_ACCESSORIES,
BACKGROUND_COLOR, PHOTOGRAPHY_STYLE, ASPECT_RATIO
2. Photography Style Presets → references/photography-style-presets.md
2.1 Preset A — Retro Analog Flash
2.2 Preset B — Soft Muted Film
2.3 Preset C — Hard Flash Editorial
3. Workflow → references/variables-and-workflow.md §Workflow
4. Task Prompts → references/task-prompts.md (images 1-5)
+ references/task-prompts-6-9.md (images 6-9)
4.1 Image 1 — Three-Quarter Fashion Portrait → task-prompts.md
4.2 Image 2 — High-Angle Bird's-Eye View → task-prompts.md
4.3 Image 3 — Over-the-Shoulder Close-Up → task-prompts.md
4.4 Image 4 — Back View with Hairstyle Visible → task-prompts.md
4.5 Image 5 — Extreme Facial Close-Up → task-prompts.md
4.6 Image 6 — Over-Right-Shoulder Glance → task-prompts-6-9.md
4.7 Image 7 — Low-Angle Upward Gaze, Contrapposto → task-prompts-6-9.md
4.8 Image 8 — Side Profile, Chest Crop → task-prompts-6-9.md
4.9 Image 9 — Medium Portrait, Opposing Torso Twist → task-prompts-6-9.md
5. Rules → references/hard-constraints.md
8 rules: Identity / Workflow / Hair / Accessories / Crop / Style / Override / Batchproduct-shotsasset_type ∈ {multi-angle, lookbook, model-series}REFERENCE_IMAGEproduct-shots-main-imageproduct-shots-detail-pageproduct-shots-image-genreference_imageproduct-shots-image-genproduct-shots-image-genREFERENCE_IMAGE