Generate persona-consistent selfie images using Google Gemini or fal (xAI Grok Imagine) and send them to messaging channels via OpenClaw. Supports multi-reference avatar blending for strong character consistency.
Best for: outfit showcases, full-body shots, fashion content
text
A mirror selfie of this person, [user's context], showing full body reflection.
Best for: close-up portraits, location shots, emotional expressions
text
A selfie of this person, [user's context], looking into the lens.
Best for: non-selfie viewpoints, including explicit third-person requests and scenes that should not read as a selfie
text
A natural third-person photo of this person, [user's context], natural composition, not a selfie.
SignalAuto-Select ModeStrong user keywords: outfit, wearing, clothes, dress, suit, fashionmirrorStrong user keywords: full-body, mirror, reflection, pose, show the lookmirrorStrong user keywords: selfie, close-up, portrait, face, eyes, smile, looking into the lensdirectStrong user keywords: third-person, not a selfie, candid shot, 他拍, 路拍, 抓拍third_personLegacy keywords: travel photo, tourist photo, 旅拍, 打卡照, 风景合影third_person
Default policy:
mirror by default for outfit / full-body / self-presentation requests, even if the user did not explicitly mention a mirror.direct by default for selfie requests focused on face, emotion, immediacy, or in-the-moment presence.third_person only when the user explicitly asks for a non-selfie style or clearly describes a shot that should not read as a selfie.Default mode when no keywords match and timeline is unavailable: mirror
User saysResolution(default)1K2k, 2048, medium res, 中等分辨率2K4k, high res, ultra, 超清, 高分辨率4K
Determine from the user's message:
mirror, direct, or third_person — auto-detect from explicit user intent if not specified#general, @username, channel ID)timeline_resolve is an optional enhancement, not a prerequisite.
timeline_resolve is unavailable in the current environment, skip this step and proceed with Stella's default behavior.Sparse prompt — for example "发张自拍", "发张照片", "想看看你", "send a selfie", "send a photo", "show me what you look like" — and timeline_resolve is available, load and follow references/timeline-integration.md.references/timeline-integration.md even if the photo request itself is not Sparse.timeline_resolve, do not freely rewrite the request into output-slot questions. Use the fixed query rules in references/timeline-integration.md.city plus an exact local date/time anchor from timeline data. If those anchors are missing, do not claim real-world synchronization.fact.status === "empty", is missing result.consumption, or any error occurs, immediately fall back to Step 3 without mentioning timeline failure to the user.Never block image generation on timeline availability. Timeline enrichment is best-effort and should only be used for current-state Sparse prompts or explicit callbacks to a recently resolved timeline scene.
Select mode from the default policy first.
If the request is Sparse, and you loaded references/timeline-integration.md and obtained usable timeline context, apply its Sparse-only merge and prompt rules.
When that timeline enrichment includes outdoor real-world grounding, keep the grounding clause as a separate strong instruction sentence rather than a soft atmosphere phrase like Make it feel like....
Otherwise, use the user's explicit context directly and keep Stella's original fallback behavior:
text
[mirror] A mirror selfie of this person, [user's explicit context if any], showing full body reflection.
[direct] A selfie of this person, [user's explicit context if any], looking into the lens.
[third_person] A natural third-person photo of this person, [user's explicit context if any], natural composition, not a selfie.
Run the Stella script:
bash
node {baseDir}/dist/scripts/skill.js \
--prompt "<ASSEMBLED_PROMPT>" \
--target "<TARGET_CHANNEL>" \
--channel "<CHANNEL_PROVIDER>" \
--caption "<CAPTION_TEXT>" \
--resolution "<1K|2K|4K>" \
--count <NUMBER>
After the script completes, confirm to the user:
Stella supports multiple providers and a gateway-backed send path, so its sensitive runtime environment variables
are explicitly declared in metadata.openclaw.requires.env for OpenClaw's env-injection allowlist.
The skill also sets metadata.openclaw.always: true, so these declarations do not become hard load-time gates.
Actual credential validation remains runtime-driven inside skill.js, based on the selected provider.
VariableRequiredDescriptionGEMINI_API_KEYRequired (if Provider=gemini)Google Gemini API keyFAL_KEYRequired (if Provider=fal)fal.ai API keyLAOZHANG_API_KEYRequired (if Provider=laozhang)laozhang.ai API key ( sk-xxx); get it at api.laozhang.aiProviderOptionalImage provider: gemini, fal, or laozhang``AvatarBlendEnabledOptionalEnable or disable multi-reference avatar blendingAvatarMaxRefsOptionalMaximum number of reference images to blend
Credential requirements are provider-specific:
Provider=gemini: requires GEMINI_API_KEYProvider=fal: requires FAL_KEYProvider=laozhang: requires LAOZHANG_API_KEYWhen Provider=gemini, Stella writes generated files to:
~/.openclaw/workspace/stella-selfie/After successful send, Stella deletes the local file immediately. If send fails, the file is kept for debugging.
Configure in your OpenClaw openclaw.json under skills.entries.stella-selfie.env:
OptionDefaultDescriptionProvider``geminiImage provider: gemini, fal, or laozhang``AvatarBlendEnabled``trueEnable multi-reference avatar blendingAvatarMaxRefs``3Maximum number of reference images to blend
Note for
Provider=falusers: fal's image editing API only accepts HTTP/HTTPS image URLs. Local file paths (fromAvatar/AvatarsDir) are not supported. ConfigureAvatarsURLsinIDENTITY.mdwith public URLs of your reference images to enable image editing with fal.
Note for
Provider=laozhangusers: laozhang.ai uses the Google-native Gemini API format (gemini-3-pro-image-preview). It requires local reference images fromAvatar/AvatarsDirand does not useAvatarsURLs. Supports 1K/2K/4K resolution and 10 aspect ratios. Get your API key at api.laozhang.ai — remember to configure a billing mode in the token settings before use.
openclaw message send.Endpoint / pathWhen usedData sentGoogle Gemini APIProvider=geminiPrompt text and selected local reference images from Avatar / AvatarsDirfal APIProvider=falPrompt text and public reference image URLs from AvatarsURLslaozhang.ai API ( api.laozhang.ai)Provider=laozhangPrompt text and local reference images ( Avatar / AvatarsDir, uploaded as base64)Local OpenClaw CLIAlways for deliveryTarget channel, target id, caption text, and generated media path/URL
~/.openclaw/workspace/IDENTITY.md and local avatar files to build reference context.Provider=gemini, selected local avatar images are uploaded to Gemini as part of normal image generation.Provider=fal, only public http/https avatar URLs are sent; local avatar files are not uploaded to fal directly.Provider=laozhang, local avatar files from Avatar / AvatarsDir are base64-encoded and uploaded to laozhang.ai.~/.openclaw/workspace/stella-selfie/ and deleted after successful send.Before using this skill, you must configure your OpenClaw workspace. See templates/SOUL.fragment.md for the recommended capability snippet to add to your SOUL.md.
Add the following fields to ~/.openclaw/workspace/IDENTITY.md:
markdown
Avatar: ./assets/avatar-main.png
AvatarsDir: ./avatars
AvatarsURLs: https://cdn.example.com/ref1.jpg, https://cdn.example.com/ref2.jpg
Avatar: Path to your primary reference image (relative to workspace root)AvatarsDir: Directory containing multiple reference photos of the same character (different styles, scenes, outfits)AvatarsURLs: Comma-separated public URLs of reference images — required for Provider=fal (local files are not supported by fal's API)Place your reference photos in ~/.openclaw/workspace/avatars/:
jpg, jpeg, png, or webp formatAdd the Stella capability block to ~/.openclaw/workspace/SOUL.md. See README.md ("4. SOUL.md") for the copy/paste snippet.
bash
clawhub install stella-selfie
After installation, complete the configuration steps above before using the skill.