Wraps fal.ai's virtual try-on API for putting clothing, accessories, glasses, makeup, and hairstyles onto person photos. Requires two images (person + item) and handles the usual proxy boilerplate so you don't have to mess with base64 encoding or billing hooks. Ships with category presets that map user intent like "try on this dress" or "show me with these sunglasses" to the right model settings. Defaults to the nanopro model for 25 second results, but you can swap to gpt for higher quality at 150 seconds. Downloads results locally and reminds you not to serve fal.media URLs directly because of CSP restrictions. Solid if you're building any kind of fashion or appearance preview feature.
npx -y skills add starchild-ai-agent/official-skills --skill image-tryon --agent claude-codeInstalls into .claude/skills of the current project.
Use this skill for all virtual try-on requests on Starchild.
Covers: clothing try-on, accessory try-on, hairstyle preview, makeup preview, glasses try-on, hat try-on, shoes try-on, watch try-on.
Core principle: call the provided script. Do not re-implement proxy/billing plumbing.
Key difference from image-edit: try-on always requires two images — a person photo and a garment/item photo.
⚠️ Execution context — read this first. The code blocks below are Python, not shell commands. Starchild's
bashtool runs/bin/bash -c, which cannot parseexec(open(...))— pasting them directly into a bash command will fail withsyntax error near unexpected token 'open'. Also,exec(open(...))insidepython3 -cfails withNameError: __file__because the script uses__file__for path resolution.Use
python3 - <<'EOF'withfrom exports importwhen calling via the bash tool:python3 - <<'EOF' import sys sys.path.insert(0, "skills/image-tryon") from exports import try_on result = try_on( person_path="uploads/person.jpg", garment_path="uploads/dress.jpg", category="clothing", ) print(result) EOFThe heredoc (
<<'EOF') preserves all quotes and newlines — no escaping needed.
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/person.jpg",
garment_path="uploads/dress.jpg",
category="clothing",
)
# result -> {"success": True, "images": [{"local_path": "output/images/..."}], ...}
The script reads both local files, base64-encodes them, and sends them to fal.ai as data URIs — no manual URL publishing needed.
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_url="https://example.com/person.jpg",
garment_url="https://example.com/jacket.jpg",
category="clothing",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/face.jpg",
garment_path="uploads/sunglasses.jpg",
category="glasses",
)
Never hand the user the raw fal.media URL. fal serves files with restrictive CSP headers. The only reliable delivery path is the already-downloaded local file:
local_path (e.g. output/images/xxx.png) — the script always downloads on success.output/images/ and viewable in the workspace file panel.
send_to_telegram(file_path="output/images/...", message_type="image") or send_to_wechat(file_path="output/images/...", message_type="image").| Parameter | Required | Default | Description |
|---|---|---|---|
person_path | yes* | — | Local workspace file path to the person's photo |
person_url | yes* | — | Public HTTPS URL of the person's photo |
garment_path | yes* | — | Local workspace file path to the garment/item photo |
garment_url | yes* | — | Public HTTPS URL of the garment/item photo |
category | no | "clothing" | Try-on category key (see §5) |
prompt | no | None | Custom prompt — overrides category default when set |
model | no | "nanopro" | Model: "nanopro" (fast ~25s) or "gpt" (best quality ~150s) |
aspect_ratio | no | "3:4" | Output ratio: 1:1, 3:4, 4:3, 9:16, 16:9 |
Image input rules:
person_path OR person_url (one is required).garment_path OR garment_url (one is required).Prompt priority: prompt (full override) > category default prompt.
| User says | Category | Key |
|---|---|---|
| "try on this dress/shirt/jacket/outfit" | Clothing | clothing |
| "put this necklace/scarf/bag on me" | Accessory | accessory |
| "show me with this hairstyle/hair color" | Hairstyle | hairstyle |
| "apply this makeup/lipstick look" | Makeup | makeup |
| "try on these glasses/sunglasses" | Glasses | glasses |
| "put this hat/cap/beanie on me" | Hat | hat |
| "try on these shoes/sneakers/boots" | Shoes | shoes |
| "put this watch on my wrist" | Watch | watch |
| Category | Key | Best for | Photo requirements |
|---|---|---|---|
| Clothing | clothing | Shirts, dresses, jackets, pants, coats, full outfits | Full body or upper body person photo |
| Accessory | accessory | Scarves, bags, belts, jewelry, necklaces, earrings | Relevant body area visible |
| Hairstyle | hairstyle | Haircuts, hair colors, styling changes | Clear face/head photo |
| Makeup | makeup | Lipstick, eyeshadow, foundation, blush, full looks | Clear face close-up |
| Glasses | glasses | Prescription glasses, sunglasses, reading glasses | Clear face photo, front-facing |
| Hat | hat | Caps, beanies, fedoras, sun hats, helmets | Head and shoulders visible |
| Shoes | shoes | Sneakers, heels, boots, sandals, loafers | Full body or lower body photo |
| Watch | watch | Analog, smartwatches, luxury watches | Wrist/arm visible |
| Model | Key | Speed | Quality | Best for |
|---|---|---|---|---|
| NanoPro | nanopro | ~25s | Good | Default for all requests. Fast iteration. |
| GPT Image 2 | gpt | ~150s | Best | When user explicitly asks for "highest quality" or "best quality". |
Decision rules:
nanopro unless the user explicitly requests higher quality.gpt when: user says "highest quality", "best quality", "premium", or the result needs to be photorealistic for professional use.nanopro when: user wants fast results, is trying multiple items, or iterating on looks.# Default (fast)
result = try_on(person_path="me.jpg", garment_path="dress.jpg", category="clothing")
# High quality (user requested)
result = try_on(person_path="me.jpg", garment_path="dress.jpg", category="clothing", model="gpt")
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/person_fullbody.jpg",
garment_path="uploads/summer_dress.jpg",
category="clothing",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/portrait.jpg",
garment_path="uploads/gold_necklace.jpg",
category="accessory",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/face.jpg",
garment_path="uploads/bob_hairstyle.jpg",
category="hairstyle",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/face_closeup.jpg",
garment_path="uploads/evening_makeup.jpg",
category="makeup",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/face_front.jpg",
garment_path="uploads/aviator_sunglasses.jpg",
category="glasses",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/head_shoulders.jpg",
garment_path="uploads/fedora_hat.jpg",
category="hat",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/person_fullbody.jpg",
garment_path="uploads/white_sneakers.jpg",
category="shoes",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/wrist_photo.jpg",
garment_path="uploads/luxury_watch.jpg",
category="watch",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/person.jpg",
garment_path="uploads/vintage_jacket.jpg",
category="clothing",
prompt="The person is wearing the vintage leather jacket from the second image, styled with a casual street fashion look. Keep the person's face and body exactly the same. Add realistic leather texture and natural draping.",
)
exec(open('skills/image-tryon/try_on.py').read())
result = try_on(
person_path="uploads/person.jpg",
garment_path="uploads/outfit.jpg",
category="clothing",
aspect_ratio="9:16", # Full-length portrait
)
| Category | Recommended photo type | Tips |
|---|---|---|
| Clothing | Full body, front-facing | Arms slightly away from body, neutral pose |
| Accessory | Relevant body area visible | Good lighting on the area where accessory goes |
| Hairstyle | Clear head/face, front or 3/4 view | Hair pulled back or current style clearly visible |
| Makeup | Face close-up, front-facing | Clean face, good even lighting, no heavy makeup |
| Glasses | Face front-facing, eyes visible | No existing glasses, clear eye area |
| Hat | Head and shoulders, front-facing | No existing hat, hair visible |
| Shoes | Full body or legs/feet visible | Standing pose, current shoes visible |
| Watch | Wrist/forearm visible | Bare wrist or current watch visible |
When the default category prompt doesn't produce the desired result, use a custom prompt. Follow these guidelines:
[person preservation] + [item description] + [fit/positioning] + [style/mood] + [quality anchors]
Formal outfit:
The person is wearing the navy blue suit from the second image. Keep the person's face, body, and pose exactly the same. The suit should fit perfectly with proper tailoring — clean shoulder line, correct sleeve length, natural lapel lay. Professional fashion photography quality with studio lighting.
Casual street style:
The person is wearing the oversized hoodie from the second image in a relaxed street style. Keep the person's identity and pose the same. The hoodie should drape naturally with realistic fabric weight and casual fit. Urban photography style.
Jewelry combination:
The person is wearing the diamond pendant necklace from the second image. Keep everything about the person the same. The necklace should sit naturally on the collarbone with realistic sparkle and light reflections. The chain length and pendant size should be proportional to the person's frame.
| Error | Cause | Solution |
|---|---|---|
| "Person image error: Either person_path or person_url must be provided" | Missing person photo | Ask user for their photo |
| "Garment/item image error: Either garment_path or garment_url must be provided" | Missing item photo | Ask user for the item photo |
| "File not found" | Invalid file path | Check the file path and try again |
| "Unsupported image format" | Non-image file | Use JPG, PNG, or WebP |
| "Image too large" | File > 10 MB | Resize or compress the image |
| "Unknown category" | Invalid category key | Use one of the 8 valid categories |
| Low quality result | Poor input photos | Use higher resolution, well-lit photos |
| Wrong item placement | Unclear body positioning | Use front-facing photos with target area visible |
image-edit skillimage-portrait skillimage-create skillimage-create skillsickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot