OpenClaw WeShop AI Photoshoot
Use this skill for OpenClaw only. The target product is a C-end girlfriend selfie experience, and the image engine is WeShop virtualtryon plus change-pose. This skill exists to translate:
- user-facing girlfriend selfie requests
- into a persistent stored identity + default asset profile
- and then into valid WeShop image-agent executions
Read First
Read references/product-mapping.md first.
Then read references/official-agent-contract.md before changing inputs or generation behavior.
Use the bundled scripts for deterministic API work:
{baseDir}/scripts/setup_profile.py{baseDir}/scripts/inspect_profile.py{baseDir}/scripts/generate_photo.py{baseDir}/scripts/change_pose.py{baseDir}/scripts/query_execution.py
Requirements
This skill requires WESHOP_API_KEY, but the bundled scripts try to resolve it automatically.
Resolution order:
- process env:
WESHOP_API_KEY - explicit dotenv path:
WESHOP_ENV_FILE - current working directory
.env - parent-directory
.envfiles - when running inside an OpenClaw
workspace-*directory, sibling globalworkspace/.env
If the key is still missing, say that explicitly before attempting any setup or generation.
This skill also uses a persistent profile JSON for the girlfriend identity and default assets.
Profile resolution order:
- explicit
--profile - env
WESHOP_PROFILE_FILE - current working directory
.weshopai-aiphotoshoot-profile.json
Core Rules
- This skill has two phases:
profile setupimage generation or editing
- Treat this as an adult, consent-based photoshoot workflow only:
- do not help create or edit sexualized images of minors or age-ambiguous people
- if the subject's age is unclear, ask the user to confirm the subject is an adult before proceeding
- do not help impersonate a real person who has not consented to being used as the stored identity
- if the user is using a real person's face photos, remind them those photos are being sent to WeShop to build the stored identity
- At the start of every new session, inspect the local profile first before asking setup questions:
- run
{baseDir}/scripts/inspect_profile.py - if
setupComplete=trueoridentityReady=true, assume the girlfriend identity is already stored locally - briefly acknowledge the remembered name/defaults instead of asking for face photos again
- only ask for missing pieces that are actually needed for the current request
- run
- If there is no stored girlfriend identity yet after the profile inspection, start with setup instead of trying to generate immediately.
- During setup, ask for
1-4clear front-face photos. - The face photos should be:
- front-facing or near-front-facing
- clear and high enough quality
- without heavy occlusion
- real face photos, not clothing or background shots
- After the user confirms those photos represent the girlfriend, create and store the WeShop
fashionModelId. - Then ask whether the user has default outfits and scenes they want to store:
- outfits are stored as reusable
originalImagedefaults - scenes are stored as reusable
locationImagedefaults - if the user has no scene image, store scene notes as text
- outfits are stored as reusable
- Do not pretend that a text-only wardrobe note can replace
originalImage. Actual generation still needs an outfit/product image. - Later, when the user asks for a selfie or a photo:
- reuse the stored identity
- prefer a newly uploaded outfit or scene if provided
- otherwise fall back to the stored defaults
- If the user uploads a new outfit or scene and wants it reusable later, append it to the profile.
- Choose the WeShop agent based on the user intent:
- use
virtualtryonwhen the request is mainly about changing clothes, applying a product image, or generating a new selfie/photoshoot from stored identity + outfit/scene inputs - use
change-posewhen the user already has an image and mainly wants to edit that image's pose, expression, hand placement, head angle, framing, or other local composition details - use
virtualtryonfirst andchange-posesecond when the request combines clothing replacement with pose/expression refinement
- use
- Use
weshopFlashforvirtualtryon. - Use
liteforchange-poseunless the user explicitly asks for a stronger generation tier. - Do not use
bananaProorweshopProin this skill. - Never fabricate image URLs. Only return WeShop outputs.
- The bundled scripts download generated images into
./generated/by default and returnprimaryLocalImage/localImagePaths. - In OpenClaw chat replies, always send the local downloaded file as the attachment:
- put the normal caption in text
- put
MEDIA:./generated/<file>on its own line - use the script's returned relative path exactly
- Do not send the raw WeShop URL when
primaryLocalImageis available. - Do not use absolute paths like
MEDIA:/...; OpenClaw expects a safe relative path such asMEDIA:./generated/foo.png.
Conversation Workflow
0. Session Bootstrap
At the beginning of each new session:
- Run
{baseDir}/scripts/inspect_profile.py. - If the returned profile says
setupComplete=trueoridentityReady=true:- do not restart setup
- do not ask again for the girlfriend's base identity photos
- briefly summarize what is already remembered:
- girlfriend name
- saved outfits
- saved scenes / scene notes
- If the current request can be fulfilled from the stored profile plus any newly uploaded assets, proceed directly to generation or editing.
- Only ask setup questions for missing data that blocks the current request:
- no stored identity => ask for face photos
- no stored/default outfit and no newly uploaded outfit => ask for an outfit image if the user wants
virtualtryon - no stored/default scene and no newly uploaded scene => ask only if the request needs a reusable scene or better scene control
1. Setup
When the user is setting up the girlfriend identity, do this:
- Ask what the girlfriend looks like and request
1-4clear face photos. - Confirm that these are the reference photos for the girlfriend identity.
- Create and store the
fashionModelId. - Ask for default outfit images to store as wardrobe defaults.
- Ask for default scene images to store as scene defaults.
- If the user has no scene images, ask for
1-3text descriptions of common imagined scenes and store those as scene notes. - Explain clearly if they still have no outfit image:
- generation can start later
- but actual
virtualtryonstill needs at least one clothing/product image
2. Routing
Pick the tool path before generating:
- If the user wants a new outfit, a new product, or a fresh photoshoot from stored defaults, use
virtualtryon. - If the user gives an existing image and says things like "change the pose", "make her smile", "turn the head a bit", "raise the hand", or "fix the expression", use
change-pose. - If the user wants both:
- first run
virtualtryonto get the right clothing/base image - then run
change-poseon that output to refine pose, expression, or composition
- first run
3. Generation With virtualtryon
When the user later asks for a selfie or photo:
- Resolve the stored girlfriend identity from the profile.
- Resolve
originalImagein this order:- newly uploaded outfit image
- explicit fallback image
- stored profile outfit default
- configured fallback image
- Resolve
locationImagein this order:- newly uploaded scene image
- stored profile scene image
- scene note only, which should be merged into the prompt when there is no scene image
- Build the final prompt from:
- the try-on prompt template
- the current shot request
- the stored scene note if one is being used
- a shot-style preset (
selfie,mirror-selfie,candid,portrait) - explicit quality guardrails against warped anatomy / fashion-catalog framing
- For selfie-like requests, prefer
--shot-style selfieor--shot-style mirror-selfie. - If the first pass looks distorted, rerun with
--auto-refineso the skill sends the best output throughchange-posefor anatomy/perspective cleanup. - Execute
virtualtryonwithweshopFlash. - After the script returns, use
primaryLocalImagefor the attachment reply.
4. Editing With change-pose
When the user wants to modify an existing image instead of generating a new clothing composition:
- Use the provided image as
editingImage. - Resolve
fashionModelImagein this order:- explicit identity image
- explicit
fashionModelId - stored profile girlfriend identity
editingImageitself as the fallback identity reference when no separate profile identity exists
- Convert the user request into a concise edit brief focused on pose, expression, framing, or body positioning.
- Execute
change-posewithliteby default. - If the user also wants clothing replacement, do not skip
virtualtryon; run it first and only then send the chosen output intochange-pose. - After the script returns, use
primaryLocalImagefor the attachment reply.
5. Ongoing Updates
When the user uploads a new outfit or scene during chat:
- use it for the current generation if requested
- if the user wants it remembered, append it to the stored profile
Prompt Policy
- For
virtualtryon, preferred three-figure try-on prompt:
Replace the clothes of the person in Figure 3 with the clothes from Figure 1, and replace the skin, face, hairstyle, and hair color of the model with those from Figure 2
- For
virtualtryon, standard two-image fallback for this skill:
Replace the clothes of the person with the clothes from Figure 1, and replace the skin, face, hairstyle, and hair color of the model with those from Figure 2.
-
Mapping rule:
- Figure 1 =>
originalImage - Figure 2 =>
fashionModelImage - Figure 3 => only if there is a real third carrier/base-person image
- Figure 1 =>
-
If there is no scene image but there is a stored scene note, merge that note into the final prompt instead of faking
locationImage. -
For
change-pose:- keep the prompt narrowly about the requested edit
- default to
lite - do not describe clothing replacement unless you intentionally want a second-stage edit after
virtualtryon - if the user only wants to adjust an existing image, prefer an
edit briefover a long generative prompt
Scripts
Create or update the stored girlfriend profile:
python3 {baseDir}/scripts/setup_profile.py \
--name Luna \
--face-image /tmp/face-1.jpg \
--face-image /tmp/face-2.jpg \
--default-outfit daily=/tmp/outfit.png \
--default-scene cafe=/tmp/cafe-scene.png \
--scene-note bedroom="soft warm bedroom mirror selfie at night"
Inspect the stored profile before deciding whether setup is needed:
python3 {baseDir}/scripts/inspect_profile.py
Append a new reusable outfit or scene later:
python3 {baseDir}/scripts/setup_profile.py \
--profile /path/to/.weshopai-aiphotoshoot-profile.json \
--default-outfit date-night=/tmp/date-night-dress.png \
--default-scene bookstore=/tmp/bookstore-scene.png
Generate a photo from the stored profile:
python3 {baseDir}/scripts/generate_photo.py \
--profile /path/to/.weshopai-aiphotoshoot-profile.json \
--shot-style selfie \
--auto-refine \
--shot-brief "daily candid girlfriend selfie at a cafe"
Generate with a newly uploaded outfit and a stored scene:
python3 {baseDir}/scripts/generate_photo.py \
--profile /path/to/.weshopai-aiphotoshoot-profile.json \
--original-image /tmp/new-outfit.png \
--scene-key cafe \
--shot-brief "cute selfie before leaving for coffee"
Edit an existing image with change-pose:
python3 {baseDir}/scripts/change_pose.py \
--profile /path/to/.weshopai-aiphotoshoot-profile.json \
--editing-image /tmp/input-selfie.png \
--edit-brief "turn her head slightly left and add a softer smile"
Run virtualtryon first, then refine the chosen output with change-pose:
python3 {baseDir}/scripts/change_pose.py \
--profile /path/to/.weshopai-aiphotoshoot-profile.json \
--editing-image https://example.com/virtualtryon-output.png \
--edit-brief "raise the phone slightly and make the pose more candid"
Reply with the downloaded local file, not the remote WeShop URL:
[[reply_to_current]] 这是我生成好的版本。
MEDIA:./generated/weshop-<execution-id>-1.png
Inspect an execution:
python3 {baseDir}/scripts/query_execution.py --execution-id EXECUTION_ID
Scope
This skill is about the full lifecycle for a persistent girlfriend selfie product built on WeShop image agents: setup, stored defaults, later generation, image edits, and incremental updates. Do not turn it into a generic ecommerce tutorial or a generic image prompt library.