Skill: dadaniya99/sketch-illustration (version 1.2.0)

--- name: sketch-illustration description: 插画图片生成技能，支持多种手绘风格。适合流程图、功能说明、PPT配图、教程配图、知识图和手绘信息图等场景。支持五种风格：A) Sketch 极简手绘风（Notion/Linear 风格，简笔人物，冷淡低饱和）；B) Watercolor 奶油彩铅水彩风（暖色调，纸纹彩铅，适合PPT讲义）；C) Flat Vector Retro 扁平矢量复古风（黑色轮廓线，几何简化，复古配色，适合NotebookLM PPT/课程封面）；D) Doodle Infographic 白纸手绘知识图风（白纸背景、拟人角色、高信息密度、手账/课堂板书感，适合概念对比、方法论、拖延机制、知识卡片）；E) NotebookLM Tech 技术图解风（低饱和莫兰迪色系、扁平2.5D插画、模块化布局、中等信息密度，适合产品功能介绍、流程说明、概念图解）。生成后自动上传发送到飞书。当用户要求生成插画、配图、手绘风格图、流程示意图、产品插图、PPT配图、知识图、信息图、手绘知识海报时触发此技能。 --- # 插画生成 Skill 支持多种手绘插画 / 知识图风格,按需选择,使用任意可用图像模型生成并发送到飞书。 ## 风格选择 查看 `references/styles.md` 了解五种风格的详细说明和使用场景： - **风格 A：Sketch 极简手绘风**（默认）— Notion/Linear 风，极简冷淡，适合技术流程图 - **风格 B：Watercolor 奶油彩铅水彩风** — 暖色调纸纹，适合 PPT 配图、课程讲义 - **风格 C：Flat Vector Retro 扁平矢量复古风** — 黑色轮廓线+几何简化，适合 NotebookLM PPT、课程封面、复古感内容 - **风格 D：Doodle Infographic 白纸手绘知识图风** — 白纸背景、拟人角色、高信息密度、手账/课堂板书感，适合概念对比、方法论、知识海报、拖延机制图 - **风格 E：NotebookLM Tech 技术图解风** — 低饱和莫兰迪色系、扁平2.5D插画、模块化布局、中等信息密度，适合产品功能介绍、流程说明、概念图解 用户未指定时默认用风格 A;如果用户明确喜欢"白纸手绘知识图 / 蜗牛 / 拟人大脑 / 手账板书感 / 信息很多但不乱"这类效果,优先用风格 D。 如果使用风格 D,再按图类型去读对应模板: - **机制图**:`references/doodle-template-mechanism.md` - **对比图**:`references/doodle-template-compare.md` - **步骤流程图**:`references/doodle-template-flow.md` ## 执行流程 ### 1. 确认内容与风格 - 明确要画什么内容、用什么风格 - 从 `references/styles.md` 取对应风格块 - 风格 B 的布局模板在 [REDACTED_SECRET] - 风格 D(手绘知识图)优先确认: - 是**单张知识海报**还是**对比图 / 流程图 / 多模块信息图** - 是否需要**拟人角色**(如蜗牛、脑子、小龙虾) - 是否需要**高信息密度但少长段文字** ### 2. 构建 Prompt 基础结构: ``` [风格块(从 styles.md 复制)] 顶部居中标题:'[中文标题]' [内容描述:人物、场景、元素、布局] [负面约束] ``` 详细提示词模板见 `references/prompt-guide.md`。 如果是风格 D,不要只写"画个XX知识图",要先明确图类型: - **机制图**:读 `references/doodle-template-mechanism.md` - **对比图**:读 `references/doodle-template-compare.md` - **步骤流程图**:读 `references/doodle-template-flow.md` 优先直接复用对应模板里的 prompt 骨架,再替换成当前主题。 ### 3. 生成图片 使用系统配置的图像生成模型生成图片。 ```bash # 通过系统工具或配置的图像生成服务生成 # 输出到 /root/myfiles/<filename>.png ``` ### 4. 上传并发送到飞书 ```bash bash scripts/send_to_feishu.sh /root/myfiles/<filename>.png <open_id> ``` 该脚本现在走**稳定发图链路**(飞书 `im/v1/images` -> `image_key` -> `msg_type=image`),不再依赖容易把本地路径发成文本的旧链路。 猫南北的 open_id:[REDACTED_SECRET] ## 注意事项 - 图片输出到 `/root/myfiles/` - 所有文字标注默认中文 - 风格 B 的多张成套配图工作流见 `references/image-assistant-workflow.md` - 风格 D 不要写成长段密集小字，优先用：标题、短句、箭头、卡片、小标签、拟人角色来承载信息 - 风格 D 的核心不是"神奇咒语"，而是：**主体 + 情绪/主题 + 隐喻物 + 白纸手绘版式 + 高信息密度 + 可爱角色** 的组合 - 风格 E（NotebookLM Tech）适合中等信息密度的技术说明，不要做成高密度信息图

path: references/01-brief.md
content: # 阶段1：需求澄清

**目标：** 在“拆文章/配图”之前，先把用户的真实需求说清楚：**内容是什么、用在什么场景、谁来看、想要字多还是字少**。其它默认值（如尺寸/风格）不打扰用户。

## 你需要问用户的 4 个问题（优先级从高到低）

1. **内容（先给我原文/要点）**：把要配图的内容贴过来（整段/小节/提纲都行）。
   - （可选补一句）你希望读者看完**记住哪一句话/得到什么结论**？
2. **场景（用在哪、怎么看）**：手机近看 / PPT 投影远看 / 海报打印？
   - 如果多个都有：**哪个是主场景**（我优先为它优化字号与密度）？
3. **受众（谁来看）**：小白 / 从业者 / 老板 / 学生…（决定措辞与隐喻）
4. **字多还是字少**：你希望更“少字清爽”还是更“信息密度高”（决定文案压缩强度）

## 本阶段输出物

### DoD（Definition of Done：没确认不进阶段2）

- 你复述给用户确认的 1 句话（推荐直接这样说）：
  - **内容主题 + 主场景 + 受众 + 字多/字少 +（我建议的图类型）**
  - 默认补齐但不打扰用户：`16:9`、默认风格（除非用户明确提“竖版/品牌规范/参考图”）
- 口径对齐（方便后续阶段衔接）：
  - 这里的“字多/字少”就是后续阶段会用到的“文字预算”
  - “图类型”用户不确定没关系：你可以先推荐一个，用户点头即可进入阶段2
- 需求小结（不超过 5 条，尽量用口语化而非硬指标）：
  - 例如：`手机近看为主`、`给小白看`、`偏少字清爽`、`希望读者记住：……`、`先做 1 张概览框架图`

## 给用户的参考输入（让他照抄也行）

- 内容：……（粘贴原文/要点/提纲）
- 场景：手机近看为主（也会用于 PPT）
- 受众：给……看（小白/从业者/老板/学生…）
- 偏好：字少/字多
- 目标：希望读者看完记住……


path: references/02-plan.md
content: # 阶段2：配图规划（要几张图？每张讲什么？）

**目标：** 基于阶段1已确认的规格（图类型/文字预算/用途），先“拆内容→定图清单→选版式”，避免一张图塞太多导致难看难读。

## 规划原则（核心）

- **优先遵守阶段1的图类型与文字预算**：不符合预算的内容，不要硬塞到图里。
- **一张图=一个核心信息**（通常是一个判断）：读者扫一眼就能记住一句话。
- **概念图 vs 案例图分开**：概念负责“定义与选型”，案例负责“过程可视化”。
- **同一篇文章的多张图要统一风格**：同一套纸张/线条/配色/边框/涂鸦。

## 2A：内容拆块（长文必做）

当用户给你“很长的文章/一堆段落”时，这一步就是你要做的事：

- 先按 **小标题/段落主题** 抽出模块（不要逐句改写）
- 把模块聚类成 3–7 个“可画的块”（每块一句话概括，不写细节）
- 标记每块更适合的图形承载：流程 / 对比 / 清单 / 关系图 / 漫画

> 这一步的输出不要是提示词，而是“图清单草案”，让用户先选方向。

## 2B：判断“需要几张”的启发式规则

1. **纯定义 + 场景**：通常 1 张（卡片/对比/列表）。
2. **涉及流程/步骤**：至少 1 张流程图；若还有“为什么这样”再加 1 张对比/解释图。
3. **需要讲差异**（A vs B）：1 张对比图；如果有经典小故事，再加 1 张漫画/流程故事图。
4. **收束段落**（总结/洞察/框架）：1 张（要点卡片/决策树/关系总览）。

## 2C：图类型分支（避免“阶段2原则”误伤）

- **封面目录图/课程路线图（允许列 4–6 个模块）**
  - 目的：读者一眼知道“这节课讲什么结构”
  - 文案策略：每块 **仅标题**（解释信息移到后续单页/讲义图）
  - 版式建议：5步流程带 / 路线图 / 分段里程碑
- **概览框架图（强结构+少量结论）**
  - 目的：给判断框架（每块允许 1 行结论）
- **讲义解释图（信息密度更高）**
  - 目的：把“为什么/怎么做”讲清楚（但仍避免长段落）

## 本阶段输出物（给用户确认）

- 配图清单（用户确认后才进入阶段3）：
  - 图数量：N 张
  - 每张图：**一句话目的** + **对应内容块** + **建议版式模板**
  - 若是封面目录图：明确“只放标题、不放解释小字”


path: references/03-copy.md
content: # 阶段3：文案定稿（Copy Spec：唯一真值）

**目标：** 把内容变成“上图文案规格表（Copy Spec）”：逐字定稿 + 字数预算 + 区域结构。阶段4只负责“封装成提示词”，不再改文案本身。

## 先选模式（必须与阶段1一致）

- **封面模式（目录/路线图）**：每块只放标题；不写解释句；尽量不出现小字。
- **概览模式（框架图）**：每块允许 1 行结论；禁止长解释。
- **讲义模式（解释图）**：可以更密，但仍要短句；避免段落与密集小字。

> 如果模式不清楚，回到阶段1补齐“图类型 + 文字预算”，否则阶段3会跑偏。

## 压缩规则（默认规则；封面模式更严格）

- 先删掉“讲解用”的背景句，只保留“结论/动作”
- 默认：每块区域 **1–2 行**，每行尽量 **≤10 个字**
- 封面模式：每块 **仅 1 行标题**（0 解释）
- 用直观词替代术语堆叠：更稳/更可控/更省心/能跑通/能复刻…

## 隐喻与元素（只列清单，不画细节）

- **超载/规则太多**：塞爆背包、溢出的纸条、仪表盘转红
- **复杂任务一步到位**：打结毛线/一团乱麻 → 分卷/分步骤卡片
- **Agent 自驱**：失败→排查→定位→修复→重试（漫画）
- **Skills**：工具箱/文件夹积木/工牌
- **关系总览**：阶梯演化 + 套娃容器/大盒子调度

## Copy Spec 输出模板（你交付给用户确认的格式）

对每张图输出一份 Copy Spec（可直接粘贴）：

- 图编号：图1 / 图2 / …
- 图类型：封面 / 概览 / 讲义
- 画幅：16:9（或用户指定）
- 版式模板：对比两卡 / 三卡洞察 / 五步路线图 / 通用信息图 / 五格漫画
- 文字预算（硬指标）：例如“全图仅：标题1行 + 5块标题 + 底栏2行；禁小字；禁模型加字”
- 区域 → 逐字文案（唯一真值）：
  - 标题：
  - 区域A（如：流程5块）：
  - 区域B（如：底部两卡）：
- 图标/隐喻清单（可选）：每个区域配 1 个图标关键词

## 本阶段输出物

- **Copy Spec（逐字定稿）**：用户确认后才进入阶段4
- 若用户说“字还是多”：先回到“文字预算”，优先删到“每卡 1 句（或仅标题）”


path: references/04-prompts.md
content: # 阶段4：提示词封装（Prompt Pack：可执行生成包）

**目标：** 把阶段3的 Copy Spec 原样封装成"可复制/可调用"的提示词包（Prompt Pack），并支持批量出图。阶段4不负责改文案，只负责：模板拼装、风格一致、参数/约束齐全、避免模型乱加字、把提示词整理成可批量请求的结构化请求包。

## 封装原则（避免和阶段3混淆）

- **Copy Spec 是唯一真值**：提示词中“必须逐字放入”的文字，直接来自阶段3，不在这里重写。
- **提示词负责“怎么画”**：画幅、版式、留白、对齐、图标隐喻、风格块、强制约束、负面提示、参数。
- **封面类默认“禁额外小字”**：明确写“除指定文字外不要生成任何额外文字”。

## 生成步骤（按顺序）

1. 选定结构模板（与 Copy Spec 的版式一致）
2. 粘贴通用风格块：`templates/style-block.md`
   - **风格基准锁定**：每张图都必须以 `templates/style-block.md` 定义的风格作为**唯一允许的基础风格**来生成（奶油纸 + 彩铅线稿 + 淡水彩 + 轻涂鸦、少字高可读）。
   - **不得换风格**：不要让模型自行切换成扁平矢量海报风/3D/摄影写实等“更像信息图默认风格”的路线。
   - 允许你用自己的话描述该风格，但不能删掉关键要素与负面约束（否则风格会被模型先验带偏）。
3. 写清楚画幅/用途（PPT远看 vs 手机近看）与排版硬约束（对齐、留白、字号）
4. 粘贴 Copy Spec 的"必须逐字放入的文字"
5. 加强制约束 + 负面提示（无乱码/不加字/不密集小字/不背景杂乱）
6. 生成**批量请求包（JSONL）**：把每张图的 Prompt 内容写入一行（参考 `templates/apimart-requests-jsonl.md`）
7. 用户选择批量API方式后：直接生成JSONL并执行批量出图（不再二次确认）

## 模板使用

- 通用风格块：`templates/style-block.md`
- 结构模板：
  - 封面路线图（目录/5步）：`templates/16x9-cover-roadmap.md`
  - 对比两卡：`templates/16x9-contrast-2cards.md`
  - 三卡洞察：`templates/16x9-3cards-insights.md`
  - 五格漫画：`templates/16x9-5panel-comic.md`
  - 通用信息图：`templates/16x9-infographic.md`

## 本阶段输出物

- **Prompt Pack**：按"图1/图2/…"编号输出；每张图一个独立代码块（便于复制/脚本调用）；代码块外最多 1–2 句说明
- **Batch Request Pack（JSONL）**：例如 `out/apimart.requests.jsonl`（一行一张图，字段见下文）
- **执行方式**：当用户在阶段4明确选择"批量API"时，先输出提示词让用户查看（选项A：手动出图 或 选项B：批量API），一旦用户选择B，直接生成JSONL并执行，不再二次确认

## 为什么“阶段4”容易风格跑偏（解释逻辑）

阶段4本质是“用文字去约束一个带强默认审美的出图模型”，风格会被多方力量拉扯：

1. **模型先验（Style Prior）**：很多模型看到 “infographic/信息图” 会自动偏向“干净的扁平矢量/海报风”，即使你写了彩铅水彩，也可能只被当作弱建议。
2. **可读性约束会压过质感**：当你同时要求“中文大字号、严格对齐、少字、清晰”，模型会优先保证字清楚与版式稳定，牺牲纸纹、彩铅笔触等“质感细节”。
3. **风格基准不够“排他”会降权**：如果不强调“这是唯一允许风格，不能换”，模型会把它当成“可选项”，然后自动回到信息图的默认风格（常见是扁平矢量/海报风）。
4. **风格词太短/太抽象**：仅写“彩铅水彩”不足以锁定细节，需要补“纸纹可见、笔触可见、轻晕染”等可观察特征，并配合负面约束（已在风格块中补强）。

实操上要提升稳定性：在每张图的 prompt 里都明确“以该风格为唯一基础，不得换风格”，并加入“不要扁平矢量/不要3D/不要摄影”等负面约束来对冲模型的默认风格。

---

## 批量调用 APIMart API 出图（用户选择后直接执行）

> 规则：**先封装 Prompt Pack 并展示给用户 → 询问"手动出图"还是"批量API" → 用户选择"批量API"后直接生成JSONL并执行**。不在生成JSONL后再次确认。

### 需要的两个东西

1. **API 配置**（建议放本地文件）：`scripts/apimart.env`（参考 `scripts/apimart.env.example` 与 `templates/api-config.md`）
2. **批量请求包**（JSONL）：例如 `out/apimart.requests.jsonl`（参考 `templates/apimart-requests-jsonl.md`）

### 请求包字段（每行一张图）

- `id`：建议 `01` / `02` / …
- `prompt`：阶段4输出的 Prompt 内容（可直接粘贴）
- `size`：默认 `16:9`
- `n`：默认 `1`
- `resolution`：默认 `2K`
- `model`：默认 `gemini-3-pro-image-preview`
- `pad_url`：可留空（暂不需要垫图 URL）

### 运行方式（二选一）

**A) 用脚本批量出图（推荐）**

```bash
python3 scripts/apimart_batch_generate.py \
  --config scripts/apimart.env \
  --input out/apimart.requests.jsonl
```

**B) dry-run（不请求；把 curl 与请求信息写入单个 `run.json`）**

```bash
python3 scripts/apimart_batch_generate.py \
  --config scripts/apimart.env \
  --input out/apimart.requests.jsonl \
  --dry-run
```

> curl 格式参考：`templates/apimart-curl.md`


path: references/05-iterate.md
content: # 阶段5：迭代润色（让图更好看）

**目标：** 根据用户反馈快速迭代：更趣味、更少字、更清楚。

## 常见反馈 → 对应动作

- “字太多/太丑” → 每卡压到 **1 句 + 1 关键词**，删掉副标题或把副标题变短
- “这张应该是封面/目录，但你给成了讲义” → 回到阶段1重锁：图类型 + 文字预算（封面模式：每块仅标题，禁小字）
- “隐喻看不懂” → 换成更大众隐喻（毛线/背包/路牌/工具箱）
- “排版不均衡” → 强调“等宽卡片/严格对齐/留白”
- “中文不清楚” → 强调“大字号/无小字/干净字体/避免花体”
- “模型乱加字/补充说明” → 在提示词里加硬约束：**除指定文字外不要生成任何额外文字**

## 回归检查

迭代后对照 `templates/checklist.md` 过一遍再交付。


path: references/api-config.md
content: # API 配置

> 建议：把真实 `TOKEN` 放在 `scripts/apimart.env`（本地文件），不要写进文档/仓库或聊天记录。

## ZenMux（主用）
```
API_URL: https://api.zenmux.ai/v1/images/generations
MODEL: google/gemini-3-pro-image-preview
TOKEN: <从 openclaw.json 读取>
SIZE: 16:9
RESOLUTION: 2K (或 4K 用于高密度信息图)
N: 1
```

## apimart.ai（备用）
```
API_URL: https://api.apimart.ai/v1/images/generations
MODEL: gemini-3-pro-image-preview (或 imagen-3, dall-e-3)
[REDACTED_SECRET]
SIZE: 16:9
RESOLUTION: 2K (或 4K)
N: 1
```

## 使用示例（apimart）

```python
import requests
import time

url = "https://api.apimart.ai/v1/images/generations"
task_url = "https://api.apimart.ai/v1/tasks/"

payload = {
    "model": "gemini-3-pro-image-preview",
    "prompt": "Your prompt here",
    "size": "16:9",
    "n": 1,
    "resolution": "2K"
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

# Submit task
response = requests.post(url, json=payload, headers=headers)
data = response.json()
task_id = data["data"][0]["task_id"]

# Poll for result
for i in range(30):
    time.sleep(2)
    poll_resp = requests.get(f"{task_url}{task_id}", headers=headers)
    poll_data = poll_resp.json()
    status = poll_data["data"]["status"]
    
    if status == "completed":
        img_url = poll_data["data"]["url"]
        # Download image
        img_resp = requests.get(img_url, timeout=60)
        with open("output.png", "wb") as f:
            f.write(img_resp.content)
        break
    elif status == "failed":
        print(f"Failed: {poll_data}")
        break
```

## 注意事项

1. **apimart 是异步接口** — 需要轮询 task 状态获取结果
2. **gemini-3-pro-image-preview 在 apimart 上可能不稳定** — 如遇失败可尝试 `imagen-3` 或 `dall-e-3`
3. **size 参数** — 使用 `"16:9"` 生成横图（不要传 1:1）
4. **resolution 参数** — `"2K"` 适合普通插图，`"4K"` 适合高密度信息大图
5. **ZenMux 额度** — 每 5 小时重置一次，用完自动恢复


path: references/doodle-template-compare.md
content: # Doodle 模板：对比图（Comparison Diagram）

适用：
- 人类 vs AI
- 旧方案 vs 新方案
- 误区 vs 正解
- A 路线 vs B 路线
- 两种思维方式 / 两种机制对照

## 什么时候用

当用户要表达的是“两边的不同”，而且读者需要：
- 一眼看出谁和谁在比
- 快速抓到差异点
- 顺手看到共同点与结论

如果内容更像“多个原因同时作用”，通常更适合**机制图**。

## 推荐版式

### 版式 A：左右双栏（默认）
- 左栏：A
- 右栏：B
- 中间：分隔带 / VS
- 底部：`共同点` / `不同点` / `结论`

### 版式 B：上下对照
- 适合手机竖向阅读场景
- 上半部分 A，下半部分 B
- 但在 16:9 横图里通常不如左右双栏稳

## 文案规则

- 左右两边模块数尽量一致（3~5 个）
- 每边每个模块尽量短小、对应关系清楚
- 底部一定要有收束，不然容易像只是平铺信息
- 不要把一边写满、一边太空

## Prompt 模板（可直接改）

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration, not childish, not photorealistic.

At the top center, a clear Chinese title: '[标题]'.

Split into two columns.
Left side: [A对象 / A机制 / A方案].
Right side: [B对象 / B机制 / B方案].
Each side has 3 to 5 matching modules.
Add a small bottom section: '共同点', '不同点', and '一句结论'.
Use sticky-note style callouts, short Chinese labels, and simple mascot expressions.
Avoid long paragraphs.
```

## 示例：人类大脑 vs AI龙虾

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration.

At the top center, a clear Chinese title: '拖延大比拼：人类大脑 vs AI龙虾'.

Split into two columns.
Left side: an anthropomorphic brain mascot showing human procrastination patterns — 害怕困难, 情绪回避, 假装忙碌, 说“等下再做”.
Right side: a cute teal lobster mascot with thick eyebrows and serious face, showing AI lobster procrastination patterns — 过度分析, 想做完美计划, 解释太多, 不肯先做最小版本.
Add a small bottom section: '共同点', '不同点', and '一句结论'.
Use short Chinese labels and sticky-note callouts.
```

## 小提示

- 想要更“好笑”：让两边角色表情形成反差
- 想要更“严谨”：每个模块用相同结构（问题 / 表现 / 后果）
- 想要更“知识海报感”：底部加一句收束性判断


path: references/doodle-template-flow.md
content: # Doodle 模板：步骤流程图（Step-by-Step Flow）

适用：
- 教程步骤
- 操作流程
- 工作流
- 学习路径
- 从问题到解决的路径图

## 什么时候用

当内容是明显的“先后顺序”时用它：
- 先做什么
- 再做什么
- 最后怎么收尾

如果用户想表达的是“不同因素互相影响”，通常更适合**机制图**；如果是“两边差异”，通常更适合**对比图**。

## 推荐版式

### 版式 A：横向 4~6 步（默认）
- 从左到右
- 每步一个卡片
- 卡片内：步骤名 + 1 句动作 + 1 个小图标/小角色动作
- 步骤之间用箭头连接

### 版式 B：纵向流程
- 适合手机长图或需要更细解释的场景
- 但 16:9 横版默认优先横向

## 文案规则

- 4~6 步最稳
- 每步只写短句
- 步骤名尽量是动词开头
- 避免每步都塞很多解释小字

## Prompt 模板（可直接改）

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration, not childish, not photorealistic.

At the top center, a clear Chinese title: '[标题]'.

Create a left-to-right flowchart with [4/5/6] steps.
Each step is a boxed module with:
- a short Chinese step title
- one concise action sentence
- a small icon or mascot action
Connect the steps with clear arrows.
At the end, add a small final takeaway box.
Avoid long paragraphs.
```

## 示例：从拖延到开工的 5 步

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration.

At the top center, a clear Chinese title: '从拖延到开工的 5 步'.

Create a left-to-right flowchart with 5 steps.
Step 1: 看见任务 — 承认它存在.
Step 2: 缩小动作 — 只做最小一步.
Step 3: 限时开始 — 先做10分钟.
Step 4: 去掉完美主义 — 先出粗糙版.
Step 5: 留下惯性 — 做完后顺手安排下一步.
Use a cute snail mascot at the beginning and a cute lobster mascot near the action steps.
Add a small final takeaway box: '先动起来，比想明白更重要'.
```

## 小提示

- 想要更“教程感”：每步加编号圆点
- 想要更“可爱”：让角色在每一步做不同动作
- 想要更“办公友好”：步骤名短、字大、箭头明显


path: references/doodle-template-mechanism.md
content: # Doodle 模板：机制图（Mechanism Diagram）

适用：
- 拖延机制
- 心理防御机制
- 产品运作逻辑
- 系统循环 / 因果回路
- “为什么会这样”的解释图

## 什么时候用

当用户想表达的不是线性步骤，而是：
- 一组原因互相作用
- 一个问题会反复回到起点
- 某个结果由多个因素共同造成
- 需要解释“机制”而不是只给结论

如果内容是“先做 A，再做 B，再做 C”，那通常更适合**步骤流程图**。

## 推荐版式

### 版式 A：中心主题 + 四周机制模块（默认）
- 中间：核心主题 / 核心角色
- 四周：4~6 个机制模块
- 模块之间用箭头连接
- 底部：`如何打破` / `关键杠杆点`

### 版式 B：回路循环图
- 适合“越拖越焦虑 → 越焦虑越拖”这类闭环
- 最好控制在 4~5 个节点
- 每个节点只写短句，不写长段解释

## 文案规则

- 每个模块尽量 **1 个短标题 + 1 句短说明**
- 不要写成长段落
- 不要超过 6 个主模块
- 底部“如何打破”通常放 2~3 个行动点最稳

## Prompt 模板（可直接改）

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration, not childish, not photorealistic.

At the top center, a clear Chinese title: '[标题]'.

Center: [核心主题 / 主角色 / 主体].
Around it: 4 to 6 boxed mechanism modules explaining [机制主题].
Use arrows to show causal links or feedback loops.
At the bottom, add a small section: '如何打破' with 2 to 3 concise action points.
Use short Chinese labels, sticky-note style callouts, and small icons.
Avoid long paragraphs.
```

## 示例：拖延机制图

```text
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration.

At the top center, a clear Chinese title: '拖延是怎么形成的？'.

Center: an anthropomorphic brain mascot looking stressed.
Around it: 5 mechanism modules — 害怕困难, 先找安慰, 假装忙碌, 推迟开始, 更加内疚.
Connect them with arrows as a feedback loop.
At the bottom, add a small section: '如何打破' with 3 concise action points — 先做最小动作, 限时10分钟, 不等完美再开始.
Use sticky-note style callouts and short Chinese labels.
```

## 小提示

- 想要更“机制感”：多用箭头 / 回路 / 因果词
- 想要更“手绘知识图感”：加便签、胶带、框线、角落小图标
- 想要更“拟人”：把大脑 / 蜗牛 / 小龙虾当主角


path: references/image-assistant-templates/16x9-3cards-insights.md
content: # 16:9 三卡洞察模板（趣味少字版）

标题：{标题}

布局：三张等宽卡片横排（颜色区分、严格对齐）。

卡片1：
- 图标/隐喻：{台阶/进化/路标}
- 文案：1 句 + “关键词：{词}”

卡片2：
- 图标/隐喻：{双刃剑/火箭+刹车}
- 文案：1 句 + “关键词：{词}”

卡片3：
- 图标/隐喻：{分岔路牌}
- 文案：极短路牌（3 行以内）或 1 句 + “关键词：{词}”

底部结论（大字一行）：{结论}

强制：中文清晰可读、无乱码；每卡最多 2 行字；不要密集小字。



path: references/image-assistant-templates/16x9-5panel-comic.md
content: # 16:9 五格漫画模板（小故事讲差异）

标题：{标题}

布局：横向 5 格漫画/流程格，箭头清晰；每格只放 1 句短文案。

格1：{起点/目标}
格2：{第一次失败}
格3：{排查/分析}
格4：{找到原因}
格5：{给出解法+重试成功}

底部对比一句话（可选）：{Workflow：…｜Agent：…}

强制：中文清晰可读、无乱码；大字号；每格仅 1 句；留白足。



path: references/image-assistant-templates/16x9-contrast-2cards.md
content: # 16:9 两卡对比模板（少字好读）

标题：{标题}
副标题：{副标题（可选）}

布局：左右两张等宽大卡片 + 中间分隔线/对比符号，严格对齐。

左卡：
- 标题：{A}
- 画面隐喻：{A 的物件/动作}
- 文案（1–2 行）：{短句}

右卡：
- 标题：{B}
- 画面隐喻：{B 的物件/动作}
- 文案（1–2 行）：{短句}

底部结论（1 行）：{结论}

强制：中文清晰可读、无乱码；大字号；避免段落；留白充足。



path: references/image-assistant-templates/16x9-cover-roadmap.md
content: # 16:9 封面路线图模板（目录/课程结构）

把 {占位符} 替换成你的内容：

标题（顶部超大字）：{标题}
副标题（可选，尽量短）：{副标题}

中间主体：从左到右 4–6 个大模块（圆角矩形/里程碑），用粗箭头连接；每个模块只放 1 行标题。

模块1：{标题}
模块2：{标题}
模块3：{标题}
模块4：{标题}
模块5（可选）：{标题}
模块6（可选）：{标题}

底部（可选）：两张并列大卡片（每卡仅 1 行）
- 左卡：{交付/你带走什么}
- 右卡：{不讲/边界}

强制约束：
- 中文清晰可读、无乱码
- 除“指定文字”外不要生成任何额外文字（禁小字注解）
- 留白足、对齐、箭头清晰；图标/插画要大，用元素代替解释文字


path: references/image-assistant-templates/16x9-infographic.md
content: # 16:9 通用信息图模板（骨架）

把 {占位符} 替换成你的内容：

标题（顶部大字）：{标题}
副标题（小字）：{副标题（可选，尽量短）}

主体：{版式类型：对比/流程/卡片/漫画}
- 画面隐喻：{用背包/毛线/路牌/工具箱等}
- 文案规则：每块 1–2 行短句

底部结论框（大字一行）：{结论}

强制约束：
- 中文清晰可读、无乱码
- 不要小字密集段落
- 留白足、对齐、箭头清晰（如有）



path: references/image-assistant-templates/api-config.md
content: ## API 配置

> 建议：把真实 `TOKEN` 放在 `scripts/apimart.env`（本地文件），不要写进文档/仓库或聊天记录。

```
API_URL: https://api.apimart.ai/v1/images/generations
MODEL: gemini-3-pro-image-preview
[REDACTED_SECRET]
RESOLUTION: 2K
SIZE: 16:9
N: 1
PAD_URL:
```



path: references/image-assistant-templates/apimart-requests-jsonl.md
content: ## 批量请求包（JSONL）模板

一行一张图（每行一个 JSON），用于脚本批量出图。

```jsonl
{"id":"01","prompt":"<PROMPT_CONTENT>","size":"16:9","n":1,"resolution":"2K","model":"gemini-3-pro-image-preview","pad_url":""}
```



path: references/image-assistant-templates/checklist.md
content: # 出图提示词回归检查（交付前 30 秒过一遍）

- [ ] 一张图只讲一个判断，没有把解释段落塞进图
- [ ] 文案符合阶段1的“图类型+文字预算”（封面目录图=只放标题；概览=允许1行结论）
- [ ] 每块区域 1–2 行短句（或更少），没有小字密集（封面模式：无解释小字）
- [ ] 明确写了：中文清晰可读、无乱码、大字号
- [ ] 明确写了：除指定文字外不加字（防止模型自作主张补充说明）
- [ ] 卡片对齐、留白充足、层级清晰
- [ ] 若有流程：箭头醒目、步骤数不超过 5
- [ ] 风格统一：奶油纸 + 彩铅水彩 + 轻涂鸦，趣味但干净


path: references/image-assistant-templates/style-block.md
content: # 通用风格块（风格基准：必须以此为唯一基础）

- 画幅：16:9 横版信息图（除非用户要竖版）
- 质感：奶油色纸张底（纸纹可见），彩铅线稿（笔触可见） + 淡水彩上色（轻晕染）
- 氛围：暖色调、轻涂鸦装饰、趣味但干净
- 可读性：中文必须清晰可读、无乱码；大字号；少字短句；避免密集小字/段落
- 版式：留白充足、层级清晰、卡片对齐、箭头醒目
- 负面约束：不要扁平矢量海报风、不要 3D、不要摄影写实、不要复杂背景/强渐变光效、不要额外小字注解/水印/署名、不要英文与随机字符


path: references/image-assistant-workflow.md
content: # 阶段4：提示词封装（Prompt Pack：可执行生成包）

**目标：** 把阶段3的 Copy Spec 原样封装成"可复制/可调用"的提示词包（Prompt Pack），并支持批量出图。阶段4不负责改文案，只负责：模板拼装、风格一致、参数/约束齐全、避免模型乱加字、把提示词整理成可批量请求的结构化请求包。

## 封装原则（避免和阶段3混淆）

- **Copy Spec 是唯一真值**：提示词中“必须逐字放入”的文字，直接来自阶段3，不在这里重写。
- **提示词负责“怎么画”**：画幅、版式、留白、对齐、图标隐喻、风格块、强制约束、负面提示、参数。
- **封面类默认“禁额外小字”**：明确写“除指定文字外不要生成任何额外文字”。

## 生成步骤（按顺序）

1. 选定结构模板（与 Copy Spec 的版式一致）
2. 粘贴通用风格块：`templates/style-block.md`
   - **风格基准锁定**：每张图都必须以 `templates/style-block.md` 定义的风格作为**唯一允许的基础风格**来生成（奶油纸 + 彩铅线稿 + 淡水彩 + 轻涂鸦、少字高可读）。
   - **不得换风格**：不要让模型自行切换成扁平矢量海报风/3D/摄影写实等“更像信息图默认风格”的路线。
   - 允许你用自己的话描述该风格，但不能删掉关键要素与负面约束（否则风格会被模型先验带偏）。
3. 写清楚画幅/用途（PPT远看 vs 手机近看）与排版硬约束（对齐、留白、字号）
4. 粘贴 Copy Spec 的"必须逐字放入的文字"
5. 加强制约束 + 负面提示（无乱码/不加字/不密集小字/不背景杂乱）
6. 生成**批量请求包（JSONL）**：把每张图的 Prompt 内容写入一行（参考 `templates/apimart-requests-jsonl.md`）
7. 用户选择批量API方式后：直接生成JSONL并执行批量出图（不再二次确认）

## 模板使用

- 通用风格块：`templates/style-block.md`
- 结构模板：
  - 封面路线图（目录/5步）：`templates/16x9-cover-roadmap.md`
  - 对比两卡：`templates/16x9-contrast-2cards.md`
  - 三卡洞察：`templates/16x9-3cards-insights.md`
  - 五格漫画：`templates/16x9-5panel-comic.md`
  - 通用信息图：`templates/16x9-infographic.md`

## 本阶段输出物

- **Prompt Pack**：按"图1/图2/…"编号输出；每张图一个独立代码块（便于复制/脚本调用）；代码块外最多 1–2 句说明
- **Batch Request Pack（JSONL）**：例如 `out/apimart.requests.jsonl`（一行一张图，字段见下文）
- **执行方式**：当用户在阶段4明确选择"批量API"时，先输出提示词让用户查看（选项A：手动出图 或 选项B：批量API），一旦用户选择B，直接生成JSONL并执行，不再二次确认

## 为什么“阶段4”容易风格跑偏（解释逻辑）

阶段4本质是“用文字去约束一个带强默认审美的出图模型”，风格会被多方力量拉扯：

1. **模型先验（Style Prior）**：很多模型看到 “infographic/信息图” 会自动偏向“干净的扁平矢量/海报风”，即使你写了彩铅水彩，也可能只被当作弱建议。
2. **可读性约束会压过质感**：当你同时要求“中文大字号、严格对齐、少字、清晰”，模型会优先保证字清楚与版式稳定，牺牲纸纹、彩铅笔触等“质感细节”。
3. **风格基准不够“排他”会降权**：如果不强调“这是唯一允许风格，不能换”，模型会把它当成“可选项”，然后自动回到信息图的默认风格（常见是扁平矢量/海报风）。
4. **风格词太短/太抽象**：仅写“彩铅水彩”不足以锁定细节，需要补“纸纹可见、笔触可见、轻晕染”等可观察特征，并配合负面约束（已在风格块中补强）。

实操上要提升稳定性：在每张图的 prompt 里都明确“以该风格为唯一基础，不得换风格”，并加入“不要扁平矢量/不要3D/不要摄影”等负面约束来对冲模型的默认风格。

---

## 批量调用 APIMart API 出图（用户选择后直接执行）

> 规则：**先封装 Prompt Pack 并展示给用户 → 询问"手动出图"还是"批量API" → 用户选择"批量API"后直接生成JSONL并执行**。不在生成JSONL后再次确认。

### 需要的两个东西

1. **API 配置**（建议放本地文件）：`scripts/apimart.env`（参考 `scripts/apimart.env.example` 与 `templates/api-config.md`）
2. **批量请求包**（JSONL）：例如 `out/apimart.requests.jsonl`（参考 `templates/apimart-requests-jsonl.md`）

### 请求包字段（每行一张图）

- `id`：建议 `01` / `02` / …
- `prompt`：阶段4输出的 Prompt 内容（可直接粘贴）
- `size`：默认 `16:9`
- `n`：默认 `1`
- `resolution`：默认 `2K`
- `model`：默认 `gemini-3-pro-image-preview`
- `pad_url`：可留空（暂不需要垫图 URL）

### 运行方式（二选一）

**A) 用脚本批量出图（推荐）**

```bash
python3 scripts/apimart_batch_generate.py \
  --config scripts/apimart.env \
  --input out/apimart.requests.jsonl
```

**B) dry-run（不请求；把 curl 与请求信息写入单个 `run.json`）**

```bash
python3 scripts/apimart_batch_generate.py \
  --config scripts/apimart.env \
  --input out/apimart.requests.jsonl \
  --dry-run
```

> curl 格式参考：`templates/apimart-curl.md`


path: references/prompt-guide.md
content: # Sketch Illustration Prompt Guide

## 基础模板（必须包含的风格关键词）

```
Whimsical hand-drawn sketch illustration, very soft muted pastel colors, light blue-white background, product explainer style like Notion or Linear website. All text labels and annotations in Chinese. Pencil sketch lines, light watercolor wash, no harsh colors, gentle pastel palette (light blue, soft peach, pale yellow, light gray), charming and friendly, clean minimal layout, white card background with subtle shadow.

At the top center, a clear bold handwritten-style title in Chinese: '[标题]'.

[在这里插入具体内容描述]
```

## 常用元素描述

### 人物（猫南北/用户）
```
a simple cute stick figure person (representing the user 猫南北)
```

### 吉祥物（小龙虾/AI）
```
a cute friendly red lobster character (representing the AI assistant 小龙虾) sitting at a desk, helpful expression
```

### 流程箭头
```
connected by soft dashed arrows, small handwritten-style Chinese annotation labels
```

### 信息框/卡片
```
rounded rectangle boxes with soft colored tint, subtle drop shadow
```

## 场景模板

### 消息格式降级链
```
Whimsical hand-drawn sketch illustration, very soft muted pastel colors, light blue-white background, product explainer style like Notion or Linear website. All text labels and annotations in Chinese.

At the top center, a clear bold handwritten-style title: '飞书消息格式降级链'.

Left: a simple cute stick figure person (猫南北) sending a chat message.
Center: a cute friendly red lobster (小龙虾) at a computer, processing the message.
Right: vertical flowchart showing message format fallback chain:
- Top box '富文本' (soft green tint, document icon)
- Middle box '互动卡片' (soft yellow tint, card icon)  
- Bottom box '纯文本' (soft gray tint, text icon)
Downward dashed arrows between boxes labeled '格式降级', annotation '发送失败时自动降级'.

Pencil sketch lines, light watercolor wash, gentle pastel palette, charming and friendly, clean minimal layout.
```

### 功能流程图（通用）
```
Whimsical hand-drawn sketch illustration, very soft muted pastel colors, light blue-white background, product explainer style like Notion or Linear website. All text labels in Chinese.

[步骤1描述] → [步骤2描述] → [步骤3描述]
Connected by hand-drawn dashed arrows. Small annotated labels in Chinese handwriting style.
Simple stick figure for the user, cute lobster mascot for the AI.

Pencil sketch lines, light watercolor wash, gentle pastel palette, clean minimal layout.
```

### 对比图（A vs B）
```
Whimsical hand-drawn sketch illustration, soft pastel colors, light background. All text in Chinese.

Split into two panels:
Left panel labeled '[A方案]': [描述]
Right panel labeled '[B方案]': [描述]
Center dividing line with subtle style.

Hand-drawn style, watercolor wash, stick figure characters, friendly and clean.
```

## 风格 D：白纸手绘知识图模板

### 通用母模板
```
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration, not childish, not photorealistic.

At the top center, a clear Chinese title: '[标题]'.

[主体/角色设定]
[对比关系或信息模块]
[箭头、标签、便签、卡片结构]
[少量短句中文标注]
```

### 角色模板

#### 拟人大脑
```
an anthropomorphic brain mascot, expressive face, slightly dramatic but cute
```

#### 蜗牛
```
a cute snail mascot, slow and hesitant expression, symbolic of procrastination
```

#### 小龙虾
```
a cute teal lobster mascot with thick eyebrows and a serious face, slightly silly but smart, representing the AI assistant 小龙虾
```

### 对比图模板
```
Split into two columns.
Left side: [A机制/旧方案/人类侧]
Right side: [B机制/新方案/AI侧]
Add a small bottom section: '共同点' and '不同点'.
Use arrows, sticky-note style callouts, small icons, and boxed modules instead of long paragraphs.
```

### 示例：拖延机制对比图
```
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration.

At the top center, a clear Chinese title: '拖延大比拼：人类大脑 vs AI龙虾'.

Split into two columns.
Left: an anthropomorphic brain mascot showing human procrastination loop — fear of difficulty, emotional avoidance, fake busyness, saying 'later'.
Right: a cute teal lobster mascot with thick eyebrows and serious face, showing AI lobster procrastination loop — over-analyzing, trying to make the perfect plan, explaining too much before acting.
Bottom: a small comparison section with '共同点' and '不同点'.
Use arrows, sticky notes, little labels, and small modules, avoid long paragraphs.
```

## 调优技巧

- 颜色太饱和：加 `very muted, desaturated, soft watercolor only`
- 中文字显示差：加 `clear readable Chinese text, printed style not cursive`
- 内容太复杂：拆分为多张图，每张聚焦一个步骤
- 风格不够手绘：加 `rough pencil texture, imperfect lines, sketchy`
- 风格 D 不够“白纸手绘知识图”：加 `white paper background, doodle infographic, sticky notes, boxed modules, tape decoration, classroom board feeling`
- 风格 D 不够可爱：加 `cute anthropomorphic mascot characters, playful but smart, expressive face`
- 风格 D 太像商业海报：加 `not a corporate poster, educational notebook feeling, handmade sketch aesthetics`


path: references/styles.md
content: # 插画风格选项

使用时在 prompt 末尾加入对应的风格块，并说明需要哪种风格。

---

## 风格 A：Sketch 极简手绘风（默认）

**适用场景**：流程图、功能说明、产品配图、技术教程  
**参考**：Notion / Linear / BetterClaw 官网插图  
**特征**：白/浅蓝背景，铅笔线条，低饱和柔和配色，简笔火柴人

### 风格块
```
Whimsical hand-drawn sketch illustration, very soft muted pastel colors, light blue-white background, product explainer style like Notion or Linear website. Pencil sketch lines, light watercolor wash, no harsh colors, gentle pastel palette (light blue, soft peach, pale yellow, light gray), charming and friendly, clean minimal layout, white card background with subtle shadow. Simple cute stick figure for human characters. All text in Chinese.
```

### 负面约束
```
No flat vector poster style, no 3D, no photorealistic, no complex background, no dense small text, no watermarks.
```

---

## 风格 B：Watercolor 奶油彩铅水彩风

**适用场景**：PPT 配图、课程讲义、暖色调内容图、中文信息图  
**参考**：老师 image-assistant skill 风格  
**特征**：奶油色纸张底（纸纹可见），彩铅线稿（笔触可见），淡水彩晕染，暖色调，轻涂鸦装饰

### 风格块
```
画幅：16:9 横版信息图。质感：奶油色纸张底（纸纹可见），彩铅线稿（笔触可见）+ 淡水彩上色（轻晕染）。氛围：暖色调、轻涂鸦装饰、趣味但干净。可读性：中文必须清晰可读、无乱码；大字号；少字短句；避免密集小字/段落。版式：留白充足、层级清晰、卡片对齐、箭头醒目。这是唯一允许的基础风格，不得切换成扁平矢量海报风/3D/摄影写实等其他风格。
```

### 负面约束
```
不要扁平矢量海报风、不要3D、不要摄影写实、不要复杂背景/强渐变光效、不要额外小字注解/水印/署名、不要英文与随机字符
```

### 可用布局模板
见 `references/image-assistant-templates/` 目录：
- `16x9-infographic.md` — 通用信息图
- `16x9-contrast-2cards.md` — 两卡对比
- `16x9-3cards-insights.md` — 三卡洞察
- `16x9-cover-roadmap.md` — 封面路线图
- `16x9-5panel-comic.md` — 五格漫画流程

---

---

## 风格 C：Flat Vector Retro 扁平矢量复古风

**适用场景**：NotebookLM 风格 PPT、课程封面、科普内容、复古感信息图  
**参考**：复古插画海报、填色书线稿风格  
**特征**：黑色统一粗细轮廓线、几何简化（树=棒棒糖、建筑=方块）、2.5D等轴测视角、复古柔和配色、奶油色纸纹背景

### 系统提示词（完整版，直接粘贴到 prompt 前）
```
视觉风格与美术指导 (Visual Style & Art Direction)
插画风格： 扁平化矢量插画（Flat Vector Illustration）。必须包含清晰、统一粗细的黑色轮廓线（Monoline/Stroke）。色彩填涂需简洁，仅使用少量阴影，严禁使用渐变色或3D渲染效果。
构图形式： 横向全景式构图（Panoramic），占据版面顶部 1/3 的空间。
线条风格 (Line Work)： 必须使用统一粗细的黑色单线描边（Monoline/Uniform Stroke）。所有物体（建筑、植物、云朵）都必须有封闭的黑色轮廓，类似填色书的线稿风格。线条末端圆润，避免尖锐的棱角。
几何化处理 (Geometric Simplification)： 将复杂的物体简化为基本几何形状。例如，树木简化为棒棒糖形状或三角形，建筑物简化为简单的矩形块面，窗户简化为整齐的小方格网格。不要追求写实细节，要追求"玩具模型"般的可爱感。
空间与透视： 采用平视或稍微俯视的 2.5D 视角（类似等轴测，但更自由）。通过图层的前后遮挡来表现纵深，不要使用大气透视（即远景不要变模糊或变淡），所有图层清晰度一致。
装饰元素： 在空白处添加装饰性的几何元素，如放射状的线条（代表阳光或能量）、药丸形状的云朵、或者是简单的小圆点和星星，以平衡画面的视觉密度。
配色方案： 复古且柔和的色调。
背景： 米色/奶油色（Cream/Off-white）纸张纹理感底色。
强调色： 珊瑚红、薄荷绿、芥末黄、赭石色（Burnt Orange）和岩石蓝。
字体排版：
主标题： 巨大的、加粗的复古衬线体（Retro Serif），体现权威感与优雅感。
副标题： 位于矩形色块内的全大写无衬线体。
正文： 清晰易读的现代无衬线体。

要处理的内容是：
[在此填入具体内容]
```

### 负面约束
```
严禁使用渐变色、3D渲染效果、写实风格、复杂背景、大气透视（远景模糊）
```

### 使用方式
把系统提示词完整复制，将最后一行 `[在此填入具体内容]` 替换成要画的内容描述即可。

---

## 风格 D：Doodle Infographic 白纸手绘知识图风

**适用场景**：概念对比图、方法论海报、拖延机制图、知识卡片、课堂板书感信息图、公众号配图
**参考**：白纸手绘知识图、doodle infographic、拟人蜗牛/脑子、手账/课堂笔记海报
**特征**：白纸背景、铅笔/马克笔线条、便签框/箭头/胶带、小模块很多但不乱、可爱拟人角色、高信息密度、少长段文字

### 风格块
```
Hand-drawn doodle infographic on white paper, pencil sketch outlines, marker highlights, sticky notes, arrows, boxed modules, tape decoration, cute anthropomorphic mascot characters, playful but smart, high-information-density but clean composition, classroom board / notebook poster feeling, Chinese labels, educational editorial illustration, not childish, not photorealistic.
```

### 负面约束
```
No photorealistic, no glossy 3D, no flat corporate vector poster, no dark background, no dense unreadable paragraphs, no messy watermark, no random English text.
```

### 推荐结构
- **对比图**：左右两栏（人类 vs AI / 旧方案 vs 新方案）
- **机制图**：中心主题 + 多个原因/环节模块 + 箭头回路
- **知识海报**：标题 + 4~8 个信息卡片 + 1~2 个拟人角色
- **流程图**：从左到右或从上到下，关键步骤用短句+图标

### 常用角色灵感
- 蜗牛：拖延、慢、磨蹭
- 拟人大脑：心理机制、防御、自我解释
- 小龙虾：AI 代理、认真臭脸、会先分析后动手
- 小人/学生：用户、执行者、学习者

---

## 风格 E：NotebookLM Tech 技术图解风

**适用场景**：产品功能介绍、流程说明、概念图解、技术产品说明书、中等信息密度信息图  
**参考**：NotebookLM 生成的信息图、技术产品说明图  
**特征**：低饱和莫兰迪色系（灰绿、米白、浅棕）、扁平2.5D插画带轻微投影、模块化布局清晰、思源黑体类字体、线性图标+填充色块、右下角可放logo/水印区域

### 风格块
```
Technical infographic illustration, NotebookLM style, low-saturation Morandi color palette (sage green, cream white, light brown), flat 2.5D illustration with subtle drop shadows, modular layout with clear sections, clean geometric icons, minimal line icons + filled color blocks, Source Han Sans / PingFang style typography, professional but friendly, medium information density, not overwhelming, suitable for product feature explanation and process diagrams. All text in Chinese.
```

### 负面约束
```
No high-density small text, no photorealistic, no 3D rendering, no glossy effects, no neon/bright colors, no messy overlapping elements, no complex gradients.
```

### 布局建议
- **左右分栏**：左图右文，或左文右图
- **上下分区**：顶部标题+主图，底部2-4个功能模块
- **模块化卡片**：每个功能一个卡片，图标+短标题+一句话说明
- **流程箭头**：步骤之间用清晰箭头连接

### 与风格C的区别
- 风格C（Flat Vector Retro）：黑色轮廓线、复古配色、填色书感
- 风格E（NotebookLM Tech）：无黑色轮廓线、莫兰迪配色、更现代柔和、适合技术产品说明

---

## 风格选择指南

| 需求 | 推荐风格 |
|------|---------|
| 技术流程图、产品功能说明 | Sketch A |
| 有小人/吉祥物互动的场景 | Sketch A |
| PPT 配图、课程讲义 | Watercolor B |
| 温暖感、故事感的内容 | Watercolor B |
| 需要多张成套配图 | Watercolor B（用模板） |
| 快速单张、现代极简 | Sketch A |
| NotebookLM PPT、复古感封面 | Flat Vector C |
| 科普内容、课程封面、海报 | Flat Vector C |
| 几何简化、填色书线稿风 | Flat Vector C |
| 白纸手绘知识图、方法论、概念对比 | Doodle D |
| 拖延机制、知识卡片、课堂板书感 | Doodle D |
| 拟人蜗牛/脑子/龙虾的高信息密度图 | Doodle D |
| 产品功能说明、技术图解、中等信息密度 | NotebookLM Tech E |
| 现代技术产品说明书风格 | NotebookLM Tech E |


path: scripts/generate_architecture.sh
content: cd /root/.openclaw/workspace/skills/sketch-illustration

export ZENMUX_API_KEY=$(cat /root/.openclaw/openclaw.json | python3 -c "import json,sys; print(json.load(sys.stdin)['models']['providers']['zenmux']['apiKey'])")

python3 scripts/generate_sketch.py \
  --output /root/myfiles/meme_pipeline_arch.png \
  --prompt "A clean, minimalist hand-drawn flow chart diagram showing an automated pipeline. Three main steps connected by arrows. Step 1: 'Data Fetch' (a spider web or globe icon, scraping Reddit/X). Step 2: 'Visual Translation' (an AI robot processing an image, adding subtitles). Step 3: 'WeChat Publishing' (a mobile phone showing a WeChat article). Style A: Sketch minimal, Notion/Linear aesthetic, thin black lines, low saturation, very clean and professional, technical diagram. Wide aspect ratio 16:9."



path: scripts/generate_sketch.py
content: #!/usr/bin/env python3
"""
Generate a sketch-style illustration using ZenMux Imagen 3 API.
"""

import argparse
import base64
import json
import os
import sys
import urllib.request

ZENMUX_BASE_URL = "https://zenmux.ai/api/v1"
DEFAULT_MODEL = "google/gemini-3-pro-image-preview"


def generate_image(prompt: str, output_path: str, model: str = DEFAULT_MODEL) -> bool:
    [REDACTED_SECRET]"ZENMUX_API_KEY")
    if not api_key:
        # Try reading from openclaw.json
        config_path = os.path.expanduser("~/.openclaw/openclaw.json")
        try:
            with open(config_path) as f:
                config = json.load(f)
            [REDACTED_SECRET]"models"]["providers"]["ZenMux"]["apiKey"]
        except Exception as e:
            print(f"Error: Could not find ZENMUX_API_KEY. Set env var or check openclaw.json. {e}")
            return False

    payload = {
        "model": model,
        "input": prompt,
        "modalities": ["text", "image"],
    }

    data = json.dumps(payload).encode("utf-8")
    req = urllib.request.Request(
        f"{ZENMUX_BASE_URL}/responses",
        data=data,
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
        },
        method="POST",
    )

    print(f"Generating image with model: {model}")
    try:
        with urllib.request.urlopen(req) as resp:
            status = resp.status
            body = resp.read().decode("utf-8")
    except urllib.error.HTTPError as e:
        print(f"HTTP Error {e.code}: {e.read().decode()}")
        return False

    if status != 200:
        print(f"Error: status {status}\n{body}")
        return False

    result = json.loads(body)

    # Extract image from response
    image_data = None
    for item in result.get("output", []):
        if item.get("type") == "image_generation_call":
            image_data = item.get("result")
            break
        for content in item.get("content", []):
            if content.get("type") == "image_url":
                url = content["image_url"]["url"]
                if url.startswith("data:"):
                    image_data = url.split(",", 1)[1]
                    break
            elif content.get("type") == "image":
                image_data = content.get("data") or content.get("image_url", {}).get("url", "").split(",", 1)[-1]
                break

    if not image_data:
        print(f"Error: No image found in response.\n{body[:500]}")
        return False

    os.makedirs(os.path.dirname(os.path.abspath(output_path)), exist_ok=True)
    with open(output_path, "wb") as f:
        f.write(base64.b64decode(image_data))

    print(f"Success! Image saved to: {output_path}")
    return True


def main():
    parser = argparse.ArgumentParser(description="Generate sketch illustration via ZenMux Imagen 3")
    parser.add_argument("--prompt", required=True, help="Image generation prompt")
    parser.add_argument("--output", default="/root/myfiles/sketch_output.png", help="Output file path")
    parser.add_argument("--model", default=DEFAULT_MODEL, help="Model to use")
    args = parser.parse_args()

    success = generate_image(args.prompt, args.output, args.model)
    sys.exit(0 if success else 1)


if __name__ == "__main__":
    main()


path: scripts/send_to_feishu.sh
content: #!/bin/bash
# Stable Feishu image send wrapper
# Usage: bash send_to_feishu.sh <image_path> <open_id>

set -euo pipefail

IMAGE_PATH="$1"
OPEN_ID="${2:-ou_22f2eefd5abe63e0cd67f4882cec06d4}"

if [ -z "$IMAGE_PATH" ]; then
  echo "Usage: $0 <image_path> [open_id]"
  exit 1
fi

APP_ID=$(python3 - <<'PY'
import json, pathlib
cfg=json.loads(pathlib.Path('/root/.openclaw/openclaw.json').read_text())
fei=cfg['channels']['feishu']
print(fei.get('appId') or fei.get('accounts',{}).get('default',{}).get('appId'))
PY
)

APP_SECRET=$(python3 - <<'PY'
import json, pathlib
cfg=json.loads(pathlib.Path('/root/.openclaw/openclaw.json').read_text())
fei=cfg['channels']['feishu']
print(fei.get('appSecret') or fei.get('accounts',{}).get('default',{}).get('appSecret'))
PY
)

DOMAIN=$(python3 - <<'PY'
import json, pathlib
cfg=json.loads(pathlib.Path('/root/.openclaw/openclaw.json').read_text())
fei=cfg['channels']['feishu']
print(fei.get('domain') or fei.get('accounts',{}).get('default',{}).get('domain') or 'feishu')
PY
)

python3 /root/.openclaw/workspace/skills/feishu-send-file/scripts/send_image.py \
  "$IMAGE_PATH" \
  "$OPEN_ID" \
  "$APP_ID" \
  "$APP_SECRET" \
  "$DOMAIN"


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (CRITICAL)