---
name: article-to-wechat-cover
description: 从飞书文档或本地 Markdown 提炼文章主题与风格，调用 OpenRouter 的 Nano Banana / Gemini Flash Image 生成 2.35:1 的微信公众号封面图，并可选上传为微信封面素材。
version: 0.1.0
author: Hermes Agent
license: MIT
metadata:
  hermes:
    tags: [wechat, cover, feishu, lark, markdown, nano-banana, openrouter, image-generation]
---

# Article to WeChat Cover

当用户想要：
- 为一篇飞书文档生成微信公众号封面图
- 为一篇本地 Markdown 文章自动生成公众号头图
- 让封面图主题跟随文章内容自动变化
- 复用 Nano Banana / OpenRouter 图片生成链路做公众号封面
- 在用户确认最终 prompt 后，把生成图片自动插入飞书文档最顶部作为 Hero 图

就用这个 skill。

## 目标

这个 skill 会做三件事：

1. 读取文章内容（飞书文档 URL / token，或本地 Markdown）
2. 用 OpenRouter 文本模型提炼：
   - 文章核心主题
   - 文章视觉风格
   - 适合公众号封面的构图与主视觉
3. 先输出最终版生图 prompt 给用户确认
4. 只有确认后，才用 OpenRouter 图片模型（Nano Banana / Gemini Flash Image）生成 **2.35:1** 微信公众号封面图

默认要求：
- 宽高比固定 `2.35:1`
- 画面体现文章核心主题
- 风格由文章内容语气、领域、表达风格共同决定
- 默认**不渲染多余文字**，避免把公众号封面做成低质海报

## 新增封面方法：汤底 + 佐料 + 文章巧思

这次吸收小小东 X 文章里的封面方法：封面生成不要每篇都从零发散，而是固定一套“汤底”，再从可复用“佐料库”里选一种风格，最后只根据标题/主题改一两个关键元素。

### 固定汤底

核心规则：
- 先理解文章为什么值得被看见。
- 把复杂信息收束成一个清晰、有力、耐看的推荐理由。
- 手机端 3 秒可读。
- 信息少而准，留白有呼吸感。
- 主视觉来自文章/对象本身的气质，不做泛化 AI 科技图。

### 内置 10 组佐料

当前脚本内置：
- 建筑图纸美学
- 科技莫兰迪
- 力量编辑感
- 东方文人
- 电影片头
- 园艺手账
- 治愈线条
- 产品手册
- 艺术展览
- 综艺预告

文本模型会先从这 10 组中选 1 组，输出：
- `selected_recipe_id`
- `selected_recipe_reason`
- `recipe_adaptations`：只允许 1-3 个文章专属改动
- `cover_message`：封面 3 秒内要传达的一句话

### Prompt 分层

生成链路现在分三层：
1. **analysis brief**：理解文章。
2. **review_spec**：给人审的结构化封面方案，包含汤底、佐料、巧思。
3. **execution_spec**：真正喂给图片模型的瘦身 JSON，只保留会影响画面的字段。

这样能避免把流程说明、内部字段、解释文字一股脑塞给图片模型。少点废话，图更稳。

## 输入来源

支持两种：

### 1) 飞书文档

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://xxx.feishu.cn/docx/xxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt
```

### 2) 本地 Markdown

```bash
python3 scripts/run.py from-markdown \
  --input ./article.md \
  --final-prompt-output /tmp/wechat-cover-prompt.txt
```

## 输出

成功后会输出：
- 本地封面图路径（仅在已确认并真正生图后）
- 主题分析 JSON 路径（可选）
- 图片 JSON spec 路径（可选）
- 最终版生图 prompt（可打印，也可写入文件）
- 可选 `feishu_url`
- 可选 `thumb_media_id`

## 必须先确认最终 prompt

这个 skill 现在默认采用两阶段流程：

### 阶段 1：先生成最终版生图 prompt，给用户确认

推荐：

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://g1mu6da08l.feishu.cn/docx/xxxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt
```

或：

```bash
python3 scripts/run.py from-markdown \
  --input ./article.md \
  --final-prompt-output /tmp/wechat-cover-prompt.txt
```

这一步会：
- 先分析文章主题与风格
- 生成最终版生图 prompt
- 在终端打印 prompt 预览
- 可选写入 `--final-prompt-output`
- **不会真的调用图片模型生图**

如果命令输出里看到：

```text
generation_skipped=pending_user_confirmation
```

说明流程正常停在“待确认”阶段。

### 阶段 2：确认后，再真正生图

只有在用户确认最终 prompt 没问题后，才重新执行并加上：

```bash
--confirm-generate
```

例如：

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://g1mu6da08l.feishu.cn/docx/xxxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt \
  --output ./wechat-cover.jpg \
  --confirm-generate
```

经验规则：
- **不要**在第一次分析出 prompt 后立刻自动生图
- 必须先把 final prompt 发给用户审阅
- 用户确认后，才允许 `--confirm-generate`

补充经验：
- 图片模型实际可能返回 `image/jpeg`，即使你手动把输出文件写成 `.png`
- 因此脚本应按返回的 `mime_type` 自动修正输出后缀，避免出现“JPEG 内容却使用 PNG 扩展名”的混淆
- 如果用户显式传入了一个不匹配的输出路径，CLI 最好打印一个 `output_adjusted_from=...` 提示，便于排查

## 统一入口命令

### 飞书文档 → 生成封面

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://g1mu6da08l.feishu.cn/docx/xxxx' \
  --output ./wechat-cover.png
```

### 本地 Markdown → 生成封面

```bash
python3 scripts/run.py from-markdown \
  --input ./article.md \
  --output ./wechat-cover.png
```

## 常用参数

- `--output`：输出图片路径
- `--upload-feishu`：生成后上传飞书云盘
- `--upload-wechat-cover`：直接上传成微信封面素材，返回 `thumb_media_id`
- `--analysis-json`：导出文章主题分析 JSON
- `--dump-json-spec`：导出最终图片 JSON 规格
- `--final-prompt-output`：导出最终版生图 prompt，便于发给用户确认
- `--confirm-generate`：只有用户确认最终 prompt 后，才允许真正生图
- `--insert-into-feishu-doc-top`：生成后把 Hero 图自动插到飞书文档正文最顶部
- `--replace-existing-top-image` / `--no-replace-existing-top-image`：插入 Hero 图时是否替换已有顶部图片
- `--image-model`：覆盖默认图片模型
- `--text-model`：覆盖默认文本模型
- `--provider-order`：OpenRouter provider 顺序，默认 `Vertex AI`
- `--visual-style-hint`：人工补充风格偏好
- `--must-include`：逗号分隔，指定必须出现的视觉元素
- `--must-avoid`：逗号分隔，指定必须避免的视觉元素
- `--allow-text-overlay`：允许封面内出现少量标题文字（默认关闭）

## 与飞书文档 → 微信草稿箱 skill 的关系

这个 skill 不直接替代 `feishu-doc-to-wechat-draft`，而是作为它的前置封面生成步骤。

推荐组合方式：

1. 先用本 skill 生成封面图
2. 若需要，直接 `--upload-wechat-cover` 拿到 `thumb_media_id`
3. 再把这个 `thumb_media_id` 交给 `feishu-doc-to-wechat-draft`

例如：

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://xxx.feishu.cn/docx/xxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt
```

确认 prompt 没问题后，如果你想把生成图直接插回飞书文档最顶部：

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://xxx.feishu.cn/docx/xxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt \
  --confirm-generate \
  --insert-into-feishu-doc-top
```

如果还要同时上传成微信封面素材：

```bash
python3 scripts/run.py from-feishu-doc \
  --doc 'https://xxx.feishu.cn/docx/xxx' \
  --final-prompt-output /tmp/wechat-cover-prompt.txt \
  --confirm-generate \
  --insert-into-feishu-doc-top \
  --upload-wechat-cover
```

然后把输出的 `thumb_media_id` 用于：

```bash
python3 ~/.hermes/skills/productivity/feishu-doc-to-wechat-draft/scripts/run.py publish-feishu-doc-default \
  --doc 'https://xxx.feishu.cn/docx/xxx' \
  --thumb-media-id 'MEDIA_ID'
```

## 设计原则

### 1. 主题来自文章，不靠人工硬写 prompt
脚本会先从标题、摘要、正文提炼主题与风格，再生成图片 prompt。

### 2. 公众号封面优先“像封面”，不是“像 PPT 截图”
默认避免：
- 杂乱文字
- UI 截图感
- 信息图堆砌
- 水印
- logo 拼贴

### 3. 优先横向头图构图
固定 `2.35:1`，适合公众号封面横幅视觉。

## 依赖

- `OPENROUTER_API_KEY`
- 可选：`OPENROUTER_TEXT`（默认 `google/gemini-3.1-flash-lite-preview`）
- 可选：`OPENROUTER_IMAGE`
- 如需读取飞书文档：已可用的 `lark-cli`
- 如需上传微信封面素材：
  - `WECHAT_APP_ID`
  - `WECHAT_APP_SECRET`

## 验证建议

先本地跑：

```bash
python3 scripts/run.py from-markdown --input ./article.md --analysis-json /tmp/analysis.json --dump-json-spec /tmp/spec.json
```

确认：
- analysis 是否抓住主题
- spec 是否保持 `2.35:1`
- 最终图片是否贴合文章主题

## 适用边界

适合：
- 技术文章
- 观点评论
- 方法论总结
- 产品/AI/效率类公众号文章

不适合直接拿来做：
- 强品牌商业广告 KV
- 多页海报
- 需要精确排版文字设计的活动主视觉

这类任务应额外提供人工 art direction。
