Sn Image Imitate logo

Sn Image Imitate

OrganizationPopular
OpenSenseNova
sn-image-imitate

Generates a new image that imitates the style of a reference image while updating content based on user intent. Uses a three-stage pipeline: image annotation (long caption), caption rewriting, and image generation. Use when user asks to "imitate style", "保持这个风格重画", "按这张图风格生成", or "style transfer with new content".

Overview

PublisherOpenSenseNova
RepositorySenseNova-Skills
Skill namesn-image-imitate
Stars
5.6K
Forks
392
Bundled files
4
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 4 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by OpenSenseNova on GitHub. Read the source before you install it.

Installation

Install the Sn Image Imitate AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/OpenSenseNova/SenseNova-Skills.git /tmp/SenseNova-Skills
mkdir -p .claude/skills
cp -r /tmp/SenseNova-Skills/skills/sn-image-imitate .claude/skills/sn-image-imitate
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Sn Image Imitate in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Sn Image Imitate on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Sn Image Imitate is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

sn-image-imitate

Image style imitation scene skill (tier 1), relying on the sn-image-recognize, sn-text-optimize, and sn-image-generate tools provided by sn-image-base (tier 0).

Features:

  • Extracts high-fidelity long caption from a reference image
  • Rewrites caption according to user requested content change while preserving style and layout
  • Enforces layout-lock constraints during caption rewrite
  • Performs post-generation layout consistency review and bounded retries
  • Returns structured process artifacts for debugging and reproducibility

Non-goals

  • Pure neural style transfer without content change (use dedicated style-transfer tools instead)
  • Local editing / inpainting of specific regions within the reference image
  • Processing video or animation input (only single static images are supported)
  • Batch generation from multiple reference images in one invocation
  • Guaranteeing pixel-level fidelity to the reference; the skill targets layout and style consistency, not exact reproduction

Input Specification

  • reference_image (string, required): local path or URL of the style reference image
  • target_content (string, required): new content user wants in the generated image
  • output_mode (string, default friendly): output mode, friendly or verbose
  • aspect_ratio (string, default 16:9): output aspect ratio for generation
  • image_size (string, default 2k): output image size preset
  • max_attempts (int, default 3): maximum generation attempts for meeting layout consistency
  • layout_threshold (float, default 0.75): minimum layout similarity score to accept result

Environment Variable

Dependency installation and API key configuration are for sn-image-base skill.

The minimum environment variables to configure sn-image-base skill running with SenseNova Token Plan:

ini
SN_BASE_URL="https://token.sensenova.cn/v1"
SN_API_KEY="your-api-key"

Fallback priority is dedicated variable > domain shared variable > global variable. Text calls use SN_TEXT_API_KEY -> SN_CHAT_API_KEY -> SN_API_KEY; vision calls use SN_VISION_API_KEY -> SN_CHAT_API_KEY -> SN_API_KEY; image generation uses SN_IMAGE_GEN_API_KEY -> SN_API_KEY.

Please refer to the Python dependencies and API keys section in sn-image-generate_en.md for more configurations.

API Configuration

All API calls in this skill are executed through the sn_agent_runner.py of the sn-image-base skill, please refer to the sn-image-base skill (README.md) for more details.

  • VLM call: sn-image-recognize (Step 1 & 3)
  • LLM call: sn-text-optimize (Step 2)
  • Image generation call: sn-image-generate (Step 3)

When encountering MissingApiKeyError or needing explicit model control: pass model and auth params explicitly via CLI arguments. See $SN_IMAGE_BASE/references/api_spec.md.

$SN_IMAGE_BASE path explanation: $SN_IMAGE_BASE is the installation directory of the sn-image-base skill (SKILL.md exists). The agent can locate this path by skill name sn-image-base.

Architecture: Main Agent + Worker Agent

This skill uses a two-tier agent architecture:

  • Main Agent: receives user request, normalizes parameters, sends preflight, invokes Worker Agent, and sends final text/image to user
  • Worker Agent: executes fixed 3-step pipeline and returns structured JSON

Responsibility Boundaries:

  • Worker Agent does not send any user-visible message directly
  • Main Agent sends all user-facing responses
  • Worker Agent last message must be and only be the JSON string defined in Return Contract
  • Worker Agent executes VLM/LLM/image calls directly; no nested subagent for these low-level calls

Workflow

Main Agent Workflow

  1. Extract reference_image, target_content, output_mode (default friendly), aspect_ratio (default 16:9), image_size (default 2k), max_attempts (default 3), and layout_threshold (default 0.75)
  2. Validate required inputs:
    • reference_image is provided and resolvable
    • target_content is non-empty
  3. Send preflight message: "Using sn-image-imitate skill to generate a style-consistent image, please wait..."
  4. Start Worker Agent with full normalized parameters and working directory
  5. On Worker result:
    • status=ok: send final summary and generated image
    • status=error: report the actual error

Worker Agent Workflow

Worker Agent receives reference_image, target_content, output_mode, aspect_ratio, image_size, max_attempts, layout_threshold, and the working directory of this skill ($SKILL_DIR).

Error Handling Strategy:

All sn_agent_runner.py calls share the same error handling rules:

  • If the subprocess exits with non-zero code, crashes, or times out: do not fallback, return status=error with the actual error message from stderr or the system error string
  • If the subprocess returns invalid JSON or the JSON lacks an expected result field: return status=error, do not silently continue with empty or default values
  • If the VLM review call fails during Step 3, treat the attempt as incomplete: do not record a score, and either retry the review once or skip to the next attempt depending on remaining budget
Step 0 — Initialization
  1. Generate task_id with format YYYYMMDD_HHMMSS
  2. Create temp directory: /tmp/openclaw/sn-image-imitate/<task_id>/ as TEMP_DIR
  3. Resolve and normalize REFERENCE_IMAGE
  4. Persist user request:
bash
echo "$TARGET_CONTENT" > "$TEMP_DIR/target-content.txt"
Step 1 — Image Annotation (long caption + layout blueprint)

Use prompts/image_annotate.md as system prompt and call sn-image-recognize on reference image.

bash
python "$SN_IMAGE_BASE/scripts/sn_agent_runner.py" sn-image-recognize \
  --system-prompt-path "$SKILL_DIR/prompts/image_annotate.md" \
  --user-prompt "Please annotate this reference image and follow the required output format." \
  --images "$REFERENCE_IMAGE" \
  --output-format json

Parse JSON result, then parse three blocks:

  • SHORT_CAPTION: ...
  • LONG_CAPTION: ...
  • LAYOUT_BLUEPRINT_JSON: { ... }

If parsing fails, LONG_CAPTION is empty, or LAYOUT_BLUEPRINT_JSON is invalid JSON, return status=error.

Persist outputs:

bash
echo "$SHORT_CAPTION" > "$TEMP_DIR/reference-short-caption.txt"
echo "$LONG_CAPTION" > "$TEMP_DIR/reference-long-caption.txt"
echo "$LAYOUT_BLUEPRINT_JSON" > "$TEMP_DIR/layout-blueprint.json"
Step 2 — New long caption generation (content rewrite with layout lock)

Goal: preserve style/layout/visual language from reference long caption while replacing core content by target_content.

Hard constraints to preserve (guided by layout-blueprint.json):

  • visual hierarchy (title/subtitle/body emphasis order)
  • region topology (number of major blocks and their relative positions)
  • reading flow (left-to-right / top-to-bottom / radial / timeline direction)
  • chart type and data encoding form (if present)
  • spacing rhythm and alignment pattern
  • major region bounding boxes and topological relations from blueprint

Preferred system prompt: prompts/caption_rewrite.md (recommended to add). If missing, use inline fallback system prompt:

Rewrite the long caption by preserving style and layout constraints while replacing semantic content according to user target. Do not change block topology, reading order, or visual hierarchy. Keep the caption detailed and directly usable for image generation.

Call sn-text-optimize:

bash
python "$SN_IMAGE_BASE/scripts/sn_agent_runner.py" sn-text-optimize \
  --system-prompt-path "$SKILL_DIR/prompts/caption_rewrite.md" \
  --user-prompt "Reference long caption:\n$LONG_CAPTION\n\nLayout blueprint JSON:\n$LAYOUT_BLUEPRINT_JSON\n\nTarget content:\n$TARGET_CONTENT\n\nReturn only the rewritten long caption." \
  --output-format json

Parse JSON result as NEW_LONG_CAPTION. If empty, return status=error.

Persist output:

bash
echo "$NEW_LONG_CAPTION" > "$TEMP_DIR/new-long-caption.txt"
Step 3 — Image Generation and Layout Review Loop

Execute attempt from 1 to max_attempts sequentially:

Generate Image (using sn-image-base's sn-image-generate tool):

bash
python "$SN_IMAGE_BASE/scripts/sn_agent_runner.py" sn-image-generate \
  --prompt "$CURRENT_PROMPT" \
  --aspect-ratio "$ASPECT_RATIO" \
  --image-size "$IMAGE_SIZE" \
  --save-path "$TEMP_DIR/attempt_<N>.png" \
  --output-format json

VLM configuration requirements:

  • When max_attempts > 1, VLM review is required for each attempt
  • Select VLM model from OpenClaw configuration as parameter for image recognition
  • If no suitable VLM model exists in OpenClaw configuration:
    • Notify user that current parameter combination cannot be executed
    • Suggest adding VLM configuration or setting max_attempts to 1 to skip review
  • If VLM call times out or fails: do not fallback, report the real error directly

Layout Consistency Review (only executed when max_attempts > 1):

Review candidate vs reference using prompts/layout_review.md (with blueprint as structural oracle):

bash
python "$SN_IMAGE_BASE/scripts/sn_agent_runner.py" sn-image-recognize \
  --system-prompt-path "$SKILL_DIR/prompts/layout_review.md" \
  --user-prompt "Reference is image[0], candidate is image[1]. Layout blueprint JSON:\n$LAYOUT_BLUEPRINT_JSON\n\nEvaluate layout similarity and return JSON only." \
  --images "$REFERENCE_IMAGE" "$TEMP_DIR/attempt_<N>.png" \
  --output-format json

Expected review JSON (inside result):

json
{
  "layout_similarity_score": 0.0,
  "style_similarity_score": 0.0,
  "pass": false,
  "major_deviations": [],
  "fix_hints": []
}

Save Attempt Result:

json
{
  "attempt": 1,
  "image": "$TEMP_DIR/attempt_1.png",
  "layout_similarity_score": 0.0,
  "style_similarity_score": 0.0,
  "pass": false,
  "major_deviations": [],
  "timing": {
    "image_generation": { "elapsed_seconds": 12.34, "model": "sn_image_model" },
    "vlm_review": { "elapsed_seconds": 5.67, "model": "sensenova-122b" }
  }
}

Note: elapsed_seconds is read from the --output-format json return of each CLI call; image_generation.model is fixed to the hardcoded placeholder "sn_image_model" (sn-image-generate does not return the model field); vlm_review.model is read from the JSON return of sn-image-recognize. timing.vlm_review is omitted when max_attempts=1.

Early Termination Check (only executed when max_attempts > 1):

Pass criteria:

  • layout_similarity_score >= layout_threshold

  • pass = true

  • If pass: immediately exit the loop, do not continue generating

  • If fail and attempts remain, append correction hints to prompt:

text
Layout correction requirements:
- <fix_hint_1>
- <fix_hint_2>
...
  • If all attempts fail to pass threshold, return highest-score candidate and mark layout_passed=false

Return Contract

Worker Agent final response must be bare JSON (no extra text, no code fence).

Normal Flow

json
{
  "status": "ok",
  "need_main_agent_send": true,
  "output_mode": "friendly|verbose",
  "result": {
    "image": "/tmp/openclaw/sn-image-imitate/<task_id>/attempt_2.png",
    "reference_image": "<resolved_reference_image>",
    "reference_short_caption": "<short caption from step 1>",
    "reference_long_caption": "<long caption from step 1>",
    "layout_blueprint": { "...": "..." },
    "new_long_caption": "<rewritten long caption from step 2>",
    "layout_passed": true,
    "selected_attempt": 2
  },
  "attempts": [
    {
      "attempt": 1,
      "image": "/tmp/openclaw/sn-image-imitate/<task_id>/attempt_1.png",
      "layout_similarity_score": 0.62,
      "style_similarity_score": 0.79,
      "pass": false,
      "major_deviations": ["center panel too narrow", "title block moved to top-right"]
    },
    {
      "attempt": 2,
      "image": "/tmp/openclaw/sn-image-imitate/<task_id>/attempt_2.png",
      "layout_similarity_score": 0.81,
      "style_similarity_score": 0.84,
      "pass": true,
      "major_deviations": []
    }
  ],
  "review": {
    "threshold": 0.75
  },
  "timing": {
    "total_elapsed_seconds": 24.56,
    "annotate": { "elapsed_seconds": 3.21, "model": "sensenova-122b" },
    "rewrite": { "elapsed_seconds": 2.45, "model": "sensenova-122b" },
    "generation_total": { "elapsed_seconds": 11.90, "model": "sn_image_model" },
    "review_total": { "elapsed_seconds": 7.00, "model": "sensenova-122b" }
  }
}

Error Flow

json
{
  "status": "error",
  "error": "<actual_error_message>"
}

Rules:

  • status=ok must include need_main_agent_send: true
  • result.image must be an existing generated image path
  • timing.total_elapsed_seconds covers full worker execution
  • If parsing of Step 1 format fails (including invalid blueprint JSON), return status=error (do not silently continue)
  • attempts must record each generation + review attempt
  • If no attempt passes threshold, return highest-score candidate and set result.layout_passed=false

Output Format

friendly mode (default)

  • One concise sentence: generated image follows reference style and updates to requested content
  • Mention whether layout consistency passed threshold and attempt count
  • Send single image: result.image

verbose mode

Style imitation result
---
Reference short caption: <reference_short_caption>
---
Style/layout cues:
<brief extraction from reference_long_caption + layout_blueprint>
---
New long caption:
<new_long_caption>
---
#1 attempt=<n> layout_score=<0.00> style_score=<0.00> pass=<true|false> [selected]
  deviations: <major_deviations or none>
#2 attempt=<n> layout_score=<0.00> style_score=<0.00> pass=<true|false>
  deviations: <major_deviations or none>
...
---
Layout threshold: <0.75> | Passed: <true|false> | Selected: attempt <n>
Time statistics: Total <total>s | Annotation <t>s | Rewrite <t>s | Generation <t>s×<n> attempts | Review <t>s×<n> attempts
---
Images (selected image)

Call Relationship

  • Bottom-level dependency: sn-image-basesn-image-recognize, sn-text-optimize, sn-image-generate

References

  • prompts/image_annotate.md - Image annotation + layout blueprint system prompt (Step 1, required)
  • prompts/caption_rewrite.md - Caption rewrite system prompt with layout-lock constraints (Step 2, required)
  • prompts/layout_review.md - Candidate-vs-reference layout/style review prompt (Step 3, required)
  • ../sn-image-base/SKILL.md - Base tool behavior and parameter defaults

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Sn Image Imitate AI skill do?

Generates a new image that imitates the style of a reference image while updating content based on user intent. Uses a three-stage pipeline: image annotation (long caption), caption rewriting, and image generation. Use when user asks to "imitate style", "保持这个风格重画", "按这张图风格生成", or "style transfer with new content".

Why use Sn Image Imitate on TypingMind?

Because you install it once and use it with any model. Sn Image Imitate is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Sn Image Imitate in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/OpenSenseNova/SenseNova-Skills/tree/main/skills/sn-image-imitate. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Sn Image Imitate?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Sn Image Imitate?

As many as you like. As long as a model supports skills, you can use Sn Image Imitate with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Sn Image Imitate AI skill free?

Yes. It is published on GitHub by OpenSenseNova under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇