Install
openclaw skills install stella-selfieGenerate persona-consistent selfie images and send to any OpenClaw channel. Supports Gemini, fal, and laozhang.ai providers, multi-reference avatar blending.
openclaw skills install stella-selfieGenerate 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
A mirror selfie of this person, [user's context], showing full body reflection.
Best for: close-up portraits, location shots, emotional expressions
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
A natural third-person photo of this person, [user's context], natural composition, not a selfie.
| Signal | Auto-Select Mode |
|---|---|
| Strong user keywords: outfit, wearing, clothes, dress, suit, fashion | mirror |
| Strong user keywords: full-body, mirror, reflection, pose, show the look | mirror |
| Strong user keywords: selfie, close-up, portrait, face, eyes, smile, looking into the lens | direct |
| Strong user keywords: third-person, not a selfie, candid shot, 他拍, 路拍, 抓拍 | third_person |
| Legacy 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 says | Resolution |
|---|---|
| (default) | 1K |
| 2k, 2048, medium res, 中等分辨率 | 2K |
| 4k, 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:
[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:
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.
| Variable | Required | Description |
|---|---|---|
GEMINI_API_KEY | Required (if Provider=gemini) | Google Gemini API key |
FAL_KEY | Required (if Provider=fal) | fal.ai API key |
LAOZHANG_API_KEY | Required (if Provider=laozhang) | laozhang.ai API key (sk-xxx); get it at api.laozhang.ai |
Provider | Optional | Image provider: gemini, fal, or laozhang |
AvatarBlendEnabled | Optional | Enable or disable multi-reference avatar blending |
AvatarMaxRefs | Optional | Maximum 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:
| Option | Default | Description |
|---|---|---|
Provider | gemini | Image provider: gemini, fal, or laozhang |
AvatarBlendEnabled | true | Enable multi-reference avatar blending |
AvatarMaxRefs | 3 | Maximum 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 / path | When used | Data sent |
|---|---|---|
| Google Gemini API | Provider=gemini | Prompt text and selected local reference images from Avatar / AvatarsDir |
| fal API | Provider=fal | Prompt text and public reference image URLs from AvatarsURLs |
laozhang.ai API (api.laozhang.ai) | Provider=laozhang | Prompt text and local reference images (Avatar / AvatarsDir, uploaded as base64) |
| Local OpenClaw CLI | Always for delivery | Target 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:
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.
clawhub install stella-selfie
After installation, complete the configuration steps above before using the skill.