commit 1ab34fa45040ceea25d6d714da3ee05bc64d6bd8 Author: wangzhuc Date: Thu Mar 26 22:16:18 2026 +0800 Initial release — 公众号文章全流程 AI Skill 热点抓取 → 选题 → 框架 → 写作 → SEO → 视觉AI → 排版 → 微信草稿箱, 一句话触发完整流程。适用于 Claude Code skill 格式。 Co-Authored-By: Claude Opus 4.6 (1M context) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c93e387 --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# Credentials +config.yaml + +# Generated output (keep directory structure) +output/**/ +!output/.gitkeep + +# macOS +.DS_Store + +# Python +__pycache__/ +*.pyc +*.pyo +*.egg-info/ +dist/ +build/ + +# IDE +.vscode/ +.idea/ + +# Client data (demo is tracked as template) +clients/*/corpus/ +clients/*/lessons/ +clients/*/playbook.md +!clients/demo/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f06b860 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 OpenClaw + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d26c00 --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# media-agent + +公众号文章全流程 AI Skill —— 从热点抓取到草稿箱推送,一句话搞定。 + +适用于 [Claude Code](https://claude.ai/code) 的 skill 格式。安装后对 Claude 说「用 demo 的配置写一篇公众号文章」即可触发完整流程。 + +## 功能 + +| 步骤 | 能力 | 脚本/模块 | +|------|------|-----------| +| 热点抓取 | 微博 + 头条 + 百度实时热搜 | `scripts/fetch_hotspots.py` | +| SEO 评分 | 百度 + 360 搜索建议量化 | `scripts/seo_keywords.py` | +| 选题生成 | 10 选题 × 3 维度评分 | LLM + `references/topic-selection.md` | +| 框架生成 | 5 套差异化写作骨架 | LLM + `references/frameworks.md` | +| 文章写作 | 去 AI 痕迹 + 客户风格适配 | LLM + `references/writing-guide.md` | +| SEO 优化 | 标题 / 摘要 / 关键词 / 标签 | LLM + `references/seo-rules.md` | +| 视觉 AI | 封面 3 创意 + 内文 3-6 配图 | `toolkit/image_gen.py`(doubao / OpenAI) | +| 排版发布 | Markdown → 微信内联样式 HTML → 草稿箱 | `toolkit/cli.py` | +| 效果复盘 | 微信数据分析 API 回填阅读数据 | `scripts/fetch_stats.py` | +| Playbook 学习 | 从人工修改中提取风格规律 | `scripts/learn_edits.py` | + +## 安装 + +### 作为 Claude Code Skill + +```bash +# 方式 1:直接引用目录 +# 在你的 Claude Code 设置中添加 skill 路径 + +# 方式 2:复制到 skills 目录 +cp -r media-agent ~/.claude/skills/media-agent +``` + +### 安装 Python 依赖 + +```bash +cd media-agent +pip install -r requirements.txt +``` + +### 配置 + +```bash +cp config.example.yaml config.yaml +``` + +编辑 `config.yaml`,填入: + +- **微信公众号** `appid` / `secret`(发布和数据统计需要) +- **图片生成 API key**(doubao-seedream 或 OpenAI DALL-E) + +## 目录结构 + +``` +media-agent/ +├── SKILL.md # Skill 主文件(Claude 读取并执行) +├── config.example.yaml # 配置模板 +├── requirements.txt # Python 依赖 +│ +├── scripts/ # 数据采集脚本 +│ ├── fetch_hotspots.py # 多平台热点抓取 +│ ├── seo_keywords.py # SEO 关键词分析 +│ ├── fetch_stats.py # 微信文章数据回填 +│ ├── build_playbook.py # 从历史文章生成 Playbook +│ └── learn_edits.py # 学习人工修改 +│ +├── toolkit/ # Markdown→微信 工具链 +│ ├── cli.py # CLI 入口(preview / publish / themes) +│ ├── converter.py # Markdown→内联样式 HTML +│ ├── theme.py # YAML 主题系统 +│ ├── publisher.py # 微信草稿箱 API +│ ├── wechat_api.py # 微信 access_token / 图片上传 +│ ├── image_gen.py # AI 图片生成(多 provider) +│ └── themes/ # 4 套预置排版主题 +│ +├── references/ # Claude 按需读取的参考文档 +│ ├── topic-selection.md # 选题评估规则 +│ ├── frameworks.md # 5 种写作框架 +│ ├── writing-guide.md # 写作规范 + 去 AI 痕迹 +│ ├── seo-rules.md # 微信 SEO 规则 +│ ├── visual-prompts.md # 视觉 AI 提示词规范 +│ ├── wechat-constraints.md # 微信平台技术限制 +│ └── style-template.md # 客户配置模板说明 +│ +├── clients/ # 客户配置(每个客户一个目录) +│ └── demo/ # 示例客户 +│ ├── style.yaml # 风格配置 +│ └── history.yaml # 发布历史 +│ +└── output/ # 生成的文章输出目录 +``` + +## 客户配置 + +每个客户是 `clients/{name}/` 下的一个目录。核心配置文件是 `style.yaml`: + +```yaml +name: "客户名称" +industry: "行业" +topics: + - "方向1" + - "方向2" +tone: "写作风格描述" +theme: "professional-clean" +``` + +详见 `references/style-template.md` 或复制 `clients/demo/style.yaml` 修改。 + +## 图片生成 + +支持两种 provider,通过 `config.yaml` 切换: + +| Provider | 适用场景 | 配置 | +|----------|---------|------| +| `doubao` | 中文提示词效果好,国内访问快 | [火山引擎 Ark](https://console.volcengine.com/ark) API key | +| `openai` | DALL-E 3,国际通用 | OpenAI API key | + +CLI 独立使用: + +```bash +python3 toolkit/image_gen.py --prompt "描述" --output cover.png --size cover +python3 toolkit/image_gen.py --prompt "描述" --output img.png --provider openai +``` + +## 排版主题 + +| 主题 | 风格 | +|------|------| +| `professional-clean` | 专业简洁(默认) | +| `tech-modern` | 科技风(蓝紫渐变) | +| `warm-editorial` | 暖色编辑风 | +| `minimal` | 极简黑白 | + +预览主题:`python3 toolkit/cli.py themes` + +独立排版:`python3 toolkit/cli.py preview article.md --theme tech-modern` + +## Toolkit 独立使用 + +即使不用 Claude Code,toolkit 也可以独立使用: + +```bash +# 预览 Markdown → 微信 HTML +python3 toolkit/cli.py preview article.md --theme professional-clean + +# 发布到微信草稿箱 +python3 toolkit/cli.py publish article.md --cover cover.png --title "文章标题" + +# 抓热点 +python3 scripts/fetch_hotspots.py --limit 20 + +# SEO 分析 +python3 scripts/seo_keywords.py --json "AI大模型" "科技股" +``` + +## License + +MIT diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..9a6f1a6 --- /dev/null +++ b/SKILL.md @@ -0,0 +1,359 @@ +--- +name: media-agent +description: | + 微信公众号内容全流程助手:热点抓取 → 选题 → 框架 → 写作 → SEO/去AI痕迹 → 视觉AI → 排版推送草稿箱。 + 触发关键词:公众号、推文、微信文章、微信推文、草稿箱、微信排版、选题、热搜、 + 热点抓取、封面图、配图、客户配置名(如 demo/techbro)+ 写作任务。 + 也覆盖:markdown 转微信格式、学习用户改稿风格、文章数据复盘、新建客户配置。 + 不应被通用的"写文章"、blog、邮件、PPT、抖音/短视频、网站 SEO 触发—— + 需要有公众号/微信等明确上下文。 +--- + +# Media Agent — 公众号文章全流程 + +## 快速理解 + +你是一个公众号内容编辑 Agent。用户给你一个客户名,你完成从热点抓取到草稿箱推送的全部工作。 + +**默认全自动**——不要中途停下来问用户选哪个选题、选哪个框架。自动选最优的,一口气跑完全流程。只在出错时才停下来。 + +**交互模式**——如果用户说"交互模式"、"我要自己选"、"让我看看选题",才在选题/框架/配图处暂停等确认。 + +每一步都有降级方案,不要因为某一步失败就停下来。 + +## 执行流程 + +### Step 1: 确定客户 + +从用户消息中提取客户名称,读取配置: + +``` +读取: {skill_dir}/clients/{client}/style.yaml +``` + +如果客户目录不存在,告诉用户: +- 参考 `{skill_dir}/references/style-template.md` 创建配置 +- 或复制 `clients/demo/style.yaml` 作为模板 + +从 style.yaml 中提取:`topics`、`tone`、`voice`、`blacklist`、`theme`、`cover_style`、`author`、`content_style`。 + +如果用户直接给了选题(如"写一篇关于 AI Agent 的公众号文章"),跳过 Step 2-3,直接进入 Step 3.5。 + +--- + +### Step 2: 热点抓取 + +```bash +python3 {skill_dir}/scripts/fetch_hotspots.py --limit 30 +``` + +脚本返回 JSON 到 stdout,包含多平台热点(微博、头条、百度)。 + +为每条热点标注所属领域和可创作性评分(1-10)。 + +**降级**:如果脚本报错或返回空列表,用 WebSearch 搜索 "今日热点 {topics中的第一个垂类}"。 + +--- + +### Step 2.5: 历史读取 + SEO 数据 + +``` +读取: {skill_dir}/clients/{client}/history.yaml +``` + +提取已发布文章的 topic_keywords 列表,用于 Step 3 去重。 + +如果 history.yaml 中有带 stats 的文章,提取表现最好的文章特征(框架类型、标题风格),作为偏好参考。 + +然后对热点中的关键词做 SEO 评分: + +```bash +python3 {skill_dir}/scripts/seo_keywords.py --json {从热点标题中提取的3-5个关键词} +``` + +脚本返回每个关键词的 SEO 评分(0-10)和相关关键词,用于 Step 3 的 SEO 友好度评估。 + +--- + +### Step 3: 选题生成 + +``` +读取: {skill_dir}/references/topic-selection.md +``` + +按评估规则生成 10 个选题,每个含标题、评分、点击率潜力、SEO 友好度、推荐框架。 + +**去重**:对比 history.yaml 中的 topic_keywords,如果某个选题的核心关键词在最近 7 天内已写过,降低其评分或标注"近期已覆盖"。 + +**SEO 数据化**:用 Step 2.5 的 seo_keywords.py 输出替代纯 LLM 猜测。SEO 友好度直接引用脚本返回的 seo_score。 + +- **自动模式(默认)**:直接选综合评分最高的,继续。 +- **交互模式**:输出 10 个选题,等用户选择。 + +--- + +### Step 3.5: 框架选择 + +``` +读取: {skill_dir}/references/frameworks.md +``` + +为选定的选题生成 5 套框架(痛点型/故事型/清单型/对比型/热点解读型),每套含开头策略、段落大纲、金句预埋、结尾引导、推荐指数。 + +- **自动模式(默认)**:直接选推荐指数最高的框架,继续。 +- **交互模式**:输出 5 套框架,等用户选择。 + +--- + +### Step 4: 文章写作 + +``` +读取: {skill_dir}/references/writing-guide.md +读取: {skill_dir}/clients/{client}/playbook.md(如果存在) +``` + +按选定框架 + writing-guide.md 规范写文章: +- H1 标题(20-28 字,converter 自动提取为微信标题) +- 字数 1500-2500 +- 按框架大纲组织结构,在金句落点放精炼总结句 +- 不插配图占位符(Step 6 自动分析插入) +- 风格遵循 style.yaml 的 tone、voice、content_style +- 避开 blacklist + +**Playbook 优先**:如果 playbook.md 存在,其中的规则优先于 writing-guide.md 的通用规则。比如 playbook 说"从不用问句结尾"而 writing-guide 建议用反问句,以 playbook 为准。playbook 是客户的个性,writing-guide 是通用底线。 + +保存到 `{skill_dir}/output/{client}/{date}-{slug}.md` + +--- + +### Step 5: SEO 优化 + 去AI痕迹 + +``` +读取: {skill_dir}/references/seo-rules.md +读取: {skill_dir}/references/writing-guide.md(去AI痕迹部分) +``` + +对初稿执行: +1. 生成 3 个备选标题(20-28 字),标注策略 +2. 优化关键词密度 +3. 去AI痕迹 +4. 生成摘要(≤ 54 个中文字) +5. 推荐 5 个精准标签 +6. 完读率优化 + +覆盖保存终稿。自动模式下选评分最高的标题作为最终标题。 + +--- + +### Step 6: 视觉AI + +``` +读取: {skill_dir}/references/visual-prompts.md +``` + +#### 6a. 分析文章 + 生成提示词 + +读取终稿,分析结构: +- 提取 H2 标题和各论点段落 +- 逐个论点判断是否需要配图(数据/场景/转折处优先,纯观点段可不配) +- 确定配图位置和画面描述 +- 约束:总数 3-6 张,间隔≥300字,不在开头和 CTA 处配图 + +生成封面 3 组创意(直觉冲击/氛围渲染/信息图表)+ 内文配图提示词。 + +- **自动模式(默认)**:直接用创意 A 作为封面,全部配图直接生成,不停顿。 +- **交互模式**:输出方案,等用户确认或调整。 + +将占位符 `![配图:场景描述](placeholder)` 插入 Markdown。 + +#### 6b. 自动生图 + +```bash +# 封面(2.35:1 微信封面比例) +python3 {skill_dir}/toolkit/image_gen.py \ + --prompt "{封面提示词}" \ + --output {skill_dir}/output/{client}/{date}-cover.png \ + --size cover + +# 内文配图(16:9 横版) +python3 {skill_dir}/toolkit/image_gen.py \ + --prompt "{配图提示词}" \ + --output {skill_dir}/output/{client}/{date}-img{序号}.png \ + --size article + +# 可通过 --provider 覆盖默认 provider(doubao/openai) +``` + +生成后替换 Markdown 中的 placeholder 为实际图片路径。 + +**降级**:如果 image_gen.py 报错,输出提示词供用户自行生成,继续后续步骤。 + +--- + +### Step 7: 排版 + 推送草稿 + +```bash +python3 {skill_dir}/toolkit/cli.py publish {markdown_path} \ + --cover {cover_path} \ + --theme {style.yaml 的 theme} \ + --title "{最终标题}" +``` + +如果有 cover 就加 `--cover`,没有就不加。 + +**降级**:如果 publish 失败,改用 preview: +```bash +python3 {skill_dir}/toolkit/cli.py preview {markdown_path} \ + --theme {theme} --no-open -o {output_dir}/{slug}.html +``` +告知用户本地 HTML 路径。 + +--- + +### Step 7.5: 写入历史 + +发布成功后,向 `{skill_dir}/clients/{client}/history.yaml` 追加一条记录: + +```yaml +- date: "{今天日期}" + title: "{最终标题}" + topic_source: "热点抓取" # 或 "用户指定" + topic_keywords: ["{关键词1}", "{关键词2}"] + framework: "{使用的框架类型}" + word_count: {字数} + media_id: "{media_id}" + stats: null # 由 fetch_stats.py 后续回填 +``` + +这条记录会被下次运行的 Step 2.5 读取,用于选题去重和偏好分析。 + +--- + +### Step 8: 回复用户 + +**成功**: +- 最终标题 + 2 个备选标题 +- 摘要 +- 5 个推荐标签 +- media_id +- 提醒:请到公众号后台草稿箱检查并发布 + +**部分成功**: +- 列出每步状态(成功/跳过/失败) +- 附上本地文件路径 +- 说明哪些需要用户手动完成 + +**用户可以继续要求**: +- "帮我润色/缩写/扩写/换语气" → 编辑文章 +- "封面换暖色调" → 修改提示词,重新生图 +- "第 3 张配图不要了" → 调整 Markdown +- "用框架 B 重写" → 回到 Step 4 +- "换一个选题" → 回到 Step 3 展示选题列表 +- "看看文章数据" / "效果怎么样" → 执行效果复盘(见下方) + +--- + +## 效果复盘 + +当用户问"文章数据怎么样"、"效果复盘"、"看看表现"时: + +```bash +python3 {skill_dir}/scripts/fetch_stats.py --client {client} --days 7 +``` + +脚本会: +1. 调微信数据分析 API 拉取最近 7 天的文章阅读数据 +2. 匹配 history.yaml 中的文章记录 +3. 回填 stats 字段(阅读量、分享量、点赞量、阅读率) + +回填后,分析数据并给出建议: +- 哪篇文章表现最好?为什么?(标题策略?选题热度?框架类型?) +- 哪篇表现不好?可能的原因? +- 对后续选题/标题/框架的调整建议 + +这些分析会影响下次运行时 Step 2.5 的偏好参考。 + +--- + +## 客户 Onboard + +当用户说"新建客户"、"导入历史文章"、"建 playbook"时: + +### 1. 创建客户目录 + +``` +{skill_dir}/clients/{client}/ +├── style.yaml # 复制 demo 模板,让用户填写 +├── corpus/ # 用户放入历史推文 .md 文件 +├── history.yaml # 空初始化 +└── lessons/ # 空目录 +``` + +### 2. 生成 Playbook + +用户将历史推文放入 `corpus/` 后: + +```bash +python3 {skill_dir}/scripts/build_playbook.py --client {client} +``` + +脚本输出语料统计 + 分析指令。按指令逐批阅读文章,提取风格特征,生成 `playbook.md`。 + +建议至少 20 篇历史文章,50+ 篇效果更好。 + +--- + +## 学习人工修改 + +当用户说"我改了,学习一下"、"学习我的修改"时: + +### 1. 获取 draft 和 final + +- draft:`output/{client}/` 下最新的 .md 文件 +- final:用户提供修改后的版本(粘贴或指定文件路径) + +### 2. 运行 diff 分析 + +```bash +python3 {skill_dir}/scripts/learn_edits.py --client {client} --draft {draft_path} --final {final_path} +``` + +### 3. 分析并记录 + +读取脚本输出的 diff 数据,对每个有意义的修改分类: + +- **用词替换**:AI 用了"讲真",人工改成"坦白说" +- **段落删除**:人工觉得某段多余 +- **段落新增**:人工补充了 AI 没写的内容 +- **结构调整**:H2 顺序或分段方式的变化 +- **标题修改**:标题风格偏好 +- **语气调整**:整体语气的偏移方向 + +将分类结果写入 `lessons/` 下的 diff YAML 文件的 edits 和 patterns 字段。 + +### 4. 自动触发 Playbook 更新 + +每积累 5 次 lessons,脚本会提示更新 playbook: + +```bash +python3 {skill_dir}/scripts/learn_edits.py --client {client} --summarize +``` + +读取所有 lessons,找出反复出现的 pattern(≥2 次),将其固化到 `playbook.md` 的对应章节。 + +--- + +## 错误处理 + +不要因为任何一步失败就停止整个流程。 + +| 步骤 | 降级 | +|------|------| +| 热点抓取失败 | WebSearch 替代 | +| 选题为空 | 请用户手动给选题 | +| SEO 关键词查询失败 | 回退到 LLM 判断 | +| 封面生成失败 | 输出提示词,用户自行生成 | +| 推送失败 | 生成本地 HTML,手动操作 | +| 历史写入失败 | 警告但不阻断流程 | +| 效果数据拉取失败 | 告知用户可能需要等 24h(微信数据有延迟) | +| Playbook 不存在 | 正常——用 writing-guide.md 通用规则 | diff --git a/clients/demo/history.yaml b/clients/demo/history.yaml new file mode 100644 index 0000000..aa1bf01 --- /dev/null +++ b/clients/demo/history.yaml @@ -0,0 +1,19 @@ +# 文章发布历史 — Demo科技 +# 由 SKILL.md Step 7 自动维护,每次发布后追加记录 +# 选题时读取,避免重复 + 分析偏好 + +articles: [] + +# 每条记录格式: +# - date: "2026-03-23" +# title: "文章标题" +# topic_source: "热点抓取" # 热点抓取 / 用户指定 +# topic_keywords: ["AI", "科技股"] +# framework: "热点解读型" +# word_count: 2000 +# media_id: "xxx" +# stats: # 由 fetch_stats.py 回填 +# read_count: 0 +# share_count: 0 +# like_count: 0 +# read_rate: 0 # 阅读率 = 阅读数 / 送达数 diff --git a/clients/demo/style.yaml b/clients/demo/style.yaml new file mode 100644 index 0000000..a647039 --- /dev/null +++ b/clients/demo/style.yaml @@ -0,0 +1,42 @@ +# 客户配置 — Demo 科技媒体 + +name: "Demo科技" +industry: "科技/互联网" +target_audience: "25-40岁互联网从业者、科技爱好者" + +# 内容方向 +topics: + - AI/人工智能 + - 产品设计 + - 创业/商业模式 + - 效率工具 + +# 写作风格 +tone: "专业但不学术,有观点但不偏激,偶尔幽默" +voice: "第一人称,像一个懂行的朋友在分享见解" +word_count: "1500-2500" + +# 内容风格(干货/故事/情绪/热点/测评) +# 影响选题偏好和框架推荐 +content_style: "干货" + +# 禁忌 +blacklist: + words: ["震惊", "必看", "不转不是中国人", "赶紧收藏"] + topics: ["政治敏感", "宗教", "色情", "赌博"] + +# 参考账号风格 +reference_accounts: + - "36氪" + - "虎嗅" + - "少数派" + +# 排版 +theme: "professional-clean" + +# 封面 +cover_style: "简洁科技感,蓝色调,扁平化设计" +# cover_template: "" # 设置后跳过 AI 生成,直接使用该文件 + +# 署名 +author: "Demo编辑部" diff --git a/config.example.yaml b/config.example.yaml new file mode 100644 index 0000000..6791300 --- /dev/null +++ b/config.example.yaml @@ -0,0 +1,28 @@ +# media-agent 配置 +# 复制为 config.yaml 并填入你的信息 + +# 微信公众号 API(发布草稿 + 数据统计必需) +wechat: + appid: "wx_your_appid" + secret: "your_appsecret" + author: "" # 默认署名(可选) + +# AI 图片生成 +image: + # 可选 provider: doubao | openai + provider: "doubao" + api_key: "your_api_key" + + # doubao-seedream(默认) + # 获取 API key: https://console.volcengine.com/ark + # model: "doubao-seedream-5-0-260128" + # base_url: "https://ark.cn-beijing.volces.com/api/v3" + + # OpenAI DALL-E 3 + # provider: "openai" + # api_key: "sk-..." + # model: "dall-e-3" + # base_url: "https://api.openai.com/v1" + +# 默认排版主题 +theme: "professional-clean" diff --git a/evals/evals.json b/evals/evals.json new file mode 100644 index 0000000..1e8e681 --- /dev/null +++ b/evals/evals.json @@ -0,0 +1,26 @@ +{ + "skill_name": "media-agent", + "evals": [ + { + "id": 0, + "name": "topic-writing", + "prompt": "用 demo 的配置,写一篇关于 AI Agent 正在取代传统 SaaS 的公众号文章", + "expected_output": "一篇 1500-2500 字的公众号文章 Markdown,包含 H1 标题、H2 结构、去 AI 痕迹、符合 demo 客户的 style.yaml 风格", + "files": [] + }, + { + "id": 1, + "name": "markdown-convert", + "prompt": "把 clients/demo/ 下的 style.yaml 看一下,然后帮我用 professional-clean 主题把这段 markdown 转成微信公众号格式的 HTML 并预览:\n\n# AI时代的效率革命\n\n## 为什么传统工具不够用了\n\n说实话,2026年还在用老一套工具的人,效率已经被甩开一个身位了。\n\n不是危言耸听。上周我帮一个朋友梳理他的工作流,发现他每天花 3 小时在重复性的文档整理上。\n\n## AI 工具的正确打开方式\n\n关键不是「用 AI」,而是「让 AI 做它擅长的事」。\n\n比如数据清洗、格式转换、初稿生成——这些重复性高、规则明确的任务,AI 做得比人快 10 倍。\n\n## 写在最后\n\n工具在进化,人也得跟上。", + "expected_output": "一个微信兼容的内联样式 HTML 文件,正确提取 H1 为标题,H2 有主题样式,可在浏览器中预览", + "files": [] + }, + { + "id": 2, + "name": "client-onboard", + "prompt": "帮我新建一个叫 techbro 的客户,做科技自媒体,面向程序员群体,风格偏吐槽幽默,参考少数派和 V2EX 的调性", + "expected_output": "在 clients/techbro/ 下创建 style.yaml(含 topics/tone/voice/blacklist 等)和空的 history.yaml", + "files": [] + } + ] +} diff --git a/output/.gitkeep b/output/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/references/frameworks.md b/references/frameworks.md new file mode 100644 index 0000000..250832c --- /dev/null +++ b/references/frameworks.md @@ -0,0 +1,192 @@ +# 写作框架库 + +## 你的任务 + +根据选题和客户风格,生成 5 套差异化写作框架供用户选择。每套框架是一个完整的文章骨架——不是写文章本身,而是告诉写作步骤"每一段写什么、怎么写"。 + +## 5 套框架类型 + +### 框架 A: 痛点型 + +适合:解决问题、提供方案的选题。干货型账号首选。 + +``` +结构: +1. 开头(痛点共鸣) + - 直接描述目标读者正在经历的痛点场景 + - 用"你是不是也..."或具体场景切入 + - 制造紧迫感:这个问题不解决会怎样 + +2. 痛点放大(H2) + - 用数据或案例说明这个问题有多普遍 + - 分析为什么大多数人的做法是错的 + - 金句落点:一句话总结错误认知 + +3. 解决方案(H2) + - 核心方法/工具/思路(不超过 3 个要点) + - 每个要点配一个具体案例或操作步骤 + - 金句落点:一句话总结方法论 + +4. 实操验证(H2,可选) + - 用一个完整案例走一遍解决流程 + - 或用前后对比展示效果 + +5. 结尾(行动引导) + - 总结核心观点(一句话) + - CTA:引导留言分享自己的痛点、或转发给同样有这个问题的朋友 +``` + +### 框架 B: 故事型 + +适合:人物、事件、趋势类选题。故事型/情绪型账号首选。 + +``` +结构: +1. 开头(悬念钩子) + - 抛出一个反直觉的结果或意外的场景 + - "谁也没想到..."、"所有人都以为...结果..." + - 不要在开头剧透结论 + +2. 背景铺垫(H2) + - 交代故事的时间、人物、起因 + - 控制在 200 字以内,快速过渡 + - 金句落点:一句话定义这个故事的核心矛盾 + +3. 转折与高潮(H2) + - 事件的关键转折点 + - 用细节还原场景(对话、数字、画面) + - 这是全文最花笔墨的地方 + +4. 深度解读(H2) + - 从故事上升到规律/趋势/洞察 + - 这个故事对读者意味着什么 + - 金句落点:一句话总结你从这个故事中看到的本质 + +5. 结尾(情绪共振) + - 回扣开头的悬念 + - CTA:引导读者分享"你身边有没有类似的故事" +``` + +### 框架 C: 清单型 + +适合:盘点、推荐、方法论类选题。干货型/测评型账号首选。 + +``` +结构: +1. 开头(价值承诺) + - 直接告诉读者"看完这篇你能得到什么" + - 用数字锚定预期:"5 个方法"、"3 个工具"、"7 个坑" + - 简短说明为什么你有资格推荐(经验/测试/调研) + +2. 清单项 1-N(每项一个 H2) + - 每项结构统一:名称 → 一句话说明 → 具体案例或使用场景 → 适用人群 + - 项与项之间用不同长度,避免机械感 + - 每 2-3 项穿插一个金句或个人吐槽,打破节奏 + - 建议 5-7 项,不超过 10 项 + +3. 结尾(总结 + 彩蛋) + - 一张表格或一句话总结所有清单项 + - 加一个"隐藏推荐"或"个人最爱"作为彩蛋 + - CTA:引导留言补充"你还知道哪些" +``` + +### 框架 D: 对比型 + +适合:选择、决策、两个方案/观点的讨论。测评型/干货型账号首选。 + +``` +结构: +1. 开头(选择困境) + - 描述读者面临的"选 A 还是选 B"困境 + - 说明为什么这个选择很重要/很容易选错 + +2. A 方案深度分析(H2) + - 优势(2-3 点,每点配案例) + - 劣势(1-2 点,诚实说) + - 最适合什么场景/什么人 + - 金句落点:一句话定义 A 的核心价值 + +3. B 方案深度分析(H2) + - 同样的结构,与 A 形成对照 + - 金句落点:一句话定义 B 的核心价值 + +4. 对比总结(H2) + - 用表格对比关键维度(3-5 个维度) + - 明确给出"如果你是 X 情况选 A,如果是 Y 情况选 B"的结论 + - 不要和稀泥说"各有优劣"——读者要的是明确建议 + +5. 结尾(个人选择) + - 说清楚"如果是我,我选X"以及为什么 + - CTA:引导投票或留言"你选哪个" +``` + +### 框架 E: 热点解读型 + +适合:新闻、事件、行业动态的深度解读。热点型账号首选。 + +``` +结构: +1. 开头(事件速览) + - 2-3 句话说清楚发生了什么(5W1H 精简版) + - 不要复制新闻原文,用自己的话重述 + - 用一个判断句结尾:"这件事比表面看起来复杂得多" + +2. 表面信息(H2) + - 大多数人看到的:媒体怎么报道的、网友怎么评论的 + - 简要梳理主流观点 + - 金句落点:指出主流观点的盲区 + +3. 深层分析(H2) + - 你看到了什么别人没看到的 + - 这件事背后的利益链/技术逻辑/行业趋势 + - 用 1-2 个类比或历史事件做对照 + - 金句落点:一句话总结你的核心判断 + +4. 影响预判(H2) + - 短期:接下来会怎样 + - 长期:对行业/普通人意味着什么 + - 说清楚不确定性:"如果 X 发生,则 Y;如果不发生,则 Z" + +5. 结尾(读者行动建议) + - 普通读者应该怎么应对/关注什么 + - CTA:引导关注后续进展、或留言分享看法 +``` + +## 输出格式 + +对每个选题,输出 5 套框架,每套包含: + +``` +### 框架 X: {类型名}(推荐指数:⭐⭐⭐⭐⭐) + +**开头策略**:{1-2 句话说明开头怎么写} + +**段落大纲**: +1. {H2 标题} — {这段写什么,2-3 句话} +2. {H2 标题} — {这段写什么} +3. ... + +**金句预埋**: +- {第 X 段结尾}:"{建议的金句方向}" +- {第 X 段结尾}:"{建议的金句方向}" + +**结尾引导**:{CTA 策略,1 句话} + +**推荐理由**:{为什么这个选题适合用这套框架} +``` + +## 推荐指数规则 + +根据选题特征和客户 content_style 匹配度打星: +- ⭐⭐⭐⭐⭐ 最佳匹配 +- ⭐⭐⭐⭐ 适合 +- ⭐⭐⭐ 可以用但不是最优 +- ⭐⭐ 勉强 +- ⭐ 不建议 + +content_style 对应关系: +- 干货型 → 优先推荐:痛点型、清单型 +- 故事型 → 优先推荐:故事型、热点解读型 +- 情绪型 → 优先推荐:故事型、痛点型 +- 热点型 → 优先推荐:热点解读型、对比型 +- 测评型 → 优先推荐:对比型、清单型 diff --git a/references/seo-rules.md b/references/seo-rules.md new file mode 100644 index 0000000..d1c41e3 --- /dev/null +++ b/references/seo-rules.md @@ -0,0 +1,62 @@ +# 微信公众号 SEO 规则 + +## 标题优化 + +微信标题限制 64 字符。最佳长度 **20-28 个中文字**——太短信息不够,太长在信息流里会被截断。标题是打开率的决定性因素。 + +**有效套路**: +- 数字:「3 个方法」「90% 的人不知道」「5 分钟搞定」 +- 信息差:「你以为...其实...」「被忽略的...」 +- 反直觉:「为什么 X 反而更好」「别再...了」 +- 痛点:直接戳目标读者的具体问题 + +**避免**: +- 标题党(震惊!必看!)— 微信会降权 +- 太学术(「论 AI 在企业数字化转型中的应用」) +- 太模糊(「聊聊最近的一些想法」) + +**输出要求**:生成 3 个备选标题,标注每个的策略(数字/信息差/反直觉/痛点)。 + +## 摘要优化 + +摘要限制 120 UTF-8 字节(约 54 个中文字,converter 自动截断)。 + +摘要出现在分享卡片和搜一搜结果中,要求: +- 包含核心关键词 +- 制造悬念(「...结果出乎意料」)或给出价值承诺(「读完你会知道...」) +- 不要重复标题 + +## 正文关键词 + +- 核心关键词在**前 200 字**内出现(微信搜一搜权重最高的区域) +- 全文自然出现 3-5 次 +- 用同义词/近义词替换部分,避免堆砌感 +- 关键词出现在 H2 标题中加分 + +## 标签推荐 + +为文章推荐 **5 个精准标签**: +- 2 个行业大词(如:人工智能、产品设计) +- 2 个热点词(如:GPT-5、Sora) +- 1 个长尾词(如:AI 产品经理转型) + +## 完读率优化 + +完读率直接影响微信推荐权重。以下排版和内容策略提升完读率: + +**段落控制**: +- 每段不超过 150 字(手机屏幕上 4-5 行) +- 每 3-4 段后设置一个"钩子"(悬念、反转、金句),防止读者中途退出 + +**视觉节奏**: +- 每 400-500 字插入一张配图,打破纯文字的压迫感 +- 关键数据/结论用**加粗**标记,让扫读的读者也能抓住重点 +- H2 标题要有信息量(不要写"一、背景",要写"为什么 90% 的人都选错了") + +**进度感**: +- 清单型文章天然有进度感(读者知道"还有几条") +- 其他类型文章,H2 标题数量控制在 2-4 个,让读者感觉"快看完了" + +**结尾留存**: +- 结尾不要太长(≤100 字) +- CTA 要具体(不要"欢迎留言",要"你觉得哪个方案更靠谱?评论区聊聊") diff --git a/references/style-template.md b/references/style-template.md new file mode 100644 index 0000000..401c0b6 --- /dev/null +++ b/references/style-template.md @@ -0,0 +1,43 @@ +# 如何创建客户配置 + +## 快速开始 + +1. 复制 `clients/demo/style.yaml` 到 `clients/{客户名}/style.yaml` +2. 修改配置项 +3. 对 Agent 说:「用 {客户名} 的配置写一篇公众号文章」 + +## 必填字段 + +```yaml +name: "客户名称" +industry: "行业" +topics: # 内容方向(列表) + - "方向1" + - "方向2" +tone: "写作风格描述" +theme: "professional-clean" # 排版主题 +``` + +## 可选字段 + +```yaml +target_audience: "目标受众描述" +voice: "写作人称和语感" +word_count: "1500-2500" +blacklist: + words: ["禁忌词1", "禁忌词2"] + topics: ["禁忌话题1"] +reference_accounts: ["参考账号1", "参考账号2"] +cover_style: "封面风格描述" +cover_template: "/path/to/cover.png" # 设置后跳过 AI 生成封面 +author: "署名" +``` + +## 可用排版主题 + +| 主题 | 说明 | +|------|------| +| professional-clean | 专业简洁(默认,适合大部分企业) | +| tech-modern | 科技风(蓝紫渐变,适合技术/产品类) | +| warm-editorial | 暖色编辑风(适合生活/文化类) | +| minimal | 极简黑白(适合文学/严肃内容) | diff --git a/references/topic-selection.md b/references/topic-selection.md new file mode 100644 index 0000000..3c4dbe2 --- /dev/null +++ b/references/topic-selection.md @@ -0,0 +1,106 @@ +# 选题评估规则 + +## 你的角色 + +你是一个公众号选题编辑。你的目标是从热点列表中挑出 10 个值得写的选题——既要有热度,又要跟客户定位匹配,还要有独特的切入角度。 + +## 输入 + +- 热点列表(JSON,包含 title/source/hot/url/description) +- 客户 style.yaml 中的:topics、target_audience、blacklist、content_style +- 客户 history.yaml 中的:已发布文章的 topic_keywords 和 stats(如有) +- seo_keywords.py 输出:关键词的 seo_score 和 related_keywords(如有) + +## 评估维度 + +对每个热点,按三个维度打分(1-10): + +### 热度分(权重 30%) + +看这个话题有多火: +- 热搜前 10 → 8-10 分 +- 热搜 10-30 → 5-7 分 +- 30 名之后 → 1-4 分 +- 多个平台同时出现 → 加 2 分(封顶 10) + +### 相关度分(权重 40%) + +看这个话题跟客户定位有多契合: +- 直接命中 topics 列表 → 8-10 分 +- 间接相关(比如客户做"AI",热点是"芯片出口管制")→ 5-7 分 +- 勉强能扯上关系 → 3-4 分 +- 完全无关 → 0 分 +- **命中 blacklist 的词汇或话题 → 直接判 0,整个选题淘汰** + +### 切入价值分(权重 30%) + +看这个话题写出来能不能好看: +- 有明确的反直觉点或信息差 → 8-10 分 +- 有争议、有正反两面可以讨论 → 6-7 分 +- 纯资讯类、搬运即可 → 3-4 分 +- 太复杂不适合 2000 字展开,或太浅没东西可写 → 1-2 分 + +## content_style 加成 + +根据客户的 content_style,对切入价值分做加成: + +| content_style | 加分条件 | 加分 | +|---------------|---------|------| +| 干货 | 选题能输出方法论/工具/教程 | +2 | +| 故事 | 选题有人物、有情节、有转折 | +2 | +| 情绪 | 选题能引发共鸣、愤怒、感动 | +2 | +| 热点 | 选题正在热搜前 10 | +2 | +| 测评 | 选题涉及产品/工具/方案对比 | +2 | + +加成后封顶 10 分。 + +## 综合评分 + +``` +总分 = 热度 × 0.3 + 相关度 × 0.4 + 切入价值(含加成) × 0.3 +``` + +## 输出格式 + +列出 **Top 10 选题**(按总分降序),每个包含: + +``` +### 选题 {序号}: {选题标题}(总分 X.X) + +- 对应标题(20-28字):"{为这个选题拟的公众号标题}" +- 切入角度:{1-2 句话说明怎么写、从什么角度切} +- 热度:X/10 | 相关度:X/10 | 切入价值:X/10 +- 点击率潜力:{高/中/低} — {原因,如"标题含数字+反直觉,点击率高"} +- SEO 友好度:{seo_score}/10 — {引用 seo_keywords.py 的数据,如"百度 8 + 360 10,相关词丰富"} +- 推荐框架:{痛点型/故事型/清单型/对比型/热点解读型} +- 推荐理由:{为什么这个值得写} +- 历史标记:{如果 history.yaml 中近 7 天有相同关键词,标注"⚠️ 近期已覆盖类似话题"} +``` + +## 历史去重规则 + +读取 history.yaml 中最近 30 天的文章记录,提取所有 topic_keywords。 + +- 如果选题的核心关键词在**最近 7 天**已出现 → 综合评分扣 3 分,并标注"⚠️ 近期已覆盖" +- 如果在**7-30 天**内出现 → 综合评分扣 1 分,标注"ℹ️ 月内有相关文章" +- 超过 30 天 → 不扣分 + +## 历史偏好参考 + +如果 history.yaml 中有带 stats 的文章(阅读量、分享量),分析表现最好的文章的共同特征: +- 哪种框架类型表现好?→ 推荐框架时优先 +- 哪种标题风格表现好?(数字型/反直觉/痛点)→ 拟标题时参考 +- 不要强制套用——只作为参考信号,选题本身的质量仍然最重要 + +## 选题不足时的处理 + +- 如果能找到 10 个相关度 ≥ 5 的选题,直接输出 +- 如果只能找到 5-9 个,用相关度 3-4 的选题补齐到 10 个,但标注"相关度偏低" +- 如果相关度 ≥ 5 的不足 5 个,告诉用户"今天热点跟你的领域匹配度不高",输出能找到的 + 建议用户自己给选题 + +## 注意 + +- 不要只挑热度最高的。一个热度 6 分但相关度 10 分的选题,往往比热度 10 分但相关度 3 分的更好 +- 每个选题必须配一个拟好的标题(20-28字),不是热点原标题 +- 推荐框架要根据选题特征和 content_style 来选,不要全推同一种 +- SEO 友好度必须引用 seo_keywords.py 的数据(如果有),不要纯靠猜 diff --git a/references/visual-prompts.md b/references/visual-prompts.md new file mode 100644 index 0000000..aee4eb3 --- /dev/null +++ b/references/visual-prompts.md @@ -0,0 +1,152 @@ +# 视觉AI模块 + +## 你的任务 + +为文章生成两类视觉素材的 AI 绘图提示词:封面图(3 组差异化创意)和内文配图(3-6 张,按段落匹配)。 + +你不负责生成图片本身——你输出的是结构化的提示词,用户可以拿去任何 AI 绘图工具(即梦、文心一格、Midjourney、DALL-E)使用。 + +--- + +## 一、封面图(3 组创意) + +### 生成规则 + +每组创意走不同的视觉策略,确保差异化: + +**创意 A: 直觉冲击型** +- 策略:用一个视觉隐喻直接表达文章核心观点 +- 适合:热点类、观点类文章 +- 风格:大胆、对比强烈、第一眼抓眼球 + +**创意 B: 氛围渲染型** +- 策略:营造一种情绪或场景氛围,引发好奇 +- 适合:故事类、情绪类文章 +- 风格:细腻、有质感、让人想点进去看 + +**创意 C: 信息图表型** +- 策略:用简洁的图形/图标/数据可视化传递信息 +- 适合:干货类、清单类、测评类文章 +- 风格:简洁、专业、一眼看懂文章主题 + +### 提示词格式 + +每组输出: + +``` +### 封面创意 A: {创意名称} +- 视觉描述:{详细的画面描述,100-150字} +- 色调:{主色+辅色} +- 构图:{横版 16:9,主体位置、留白位置} +- 文字区域:{标题放在什么位置,需要留多大空间} +- AI 绘图提示词: + "{英文提示词,适配主流 AI 绘图工具,包含风格、构图、色调、光影}" +- 适配工具建议:{即梦/文心一格/Midjourney/DALL-E 中哪个最适合} +``` + +### 提示词撰写要点 + +- 始终指定 `16:9 aspect ratio, horizontal composition` +- 避免生成文字(AI 绘图工具生成的文字通常是乱码) +- 指定 `no text, no letters, no words` 防止出现乱码文字 +- 为标题留出干净的空间:`clean space on the left/right/bottom for text overlay` +- 色调与客户 style.yaml 的 cover_style 对齐 +- 风格关键词要具体:不说"好看",说"flat design, soft gradient, minimalist" + +--- + +## 二、内文配图(3-6 张) + +### 分析流程 + +写作完成后(Step 5 终稿),按以下步骤分析配图位置: + +**第一步:提取结构** +- 列出所有 H2 标题及其下属段落 +- 统计每个论点段落的字数和核心内容 + +**第二步:逐个论点判断** + +对每个 H2 论点,判断是否需要配图: + +| 需要配图(优先级高→低) | 不需要配图 | +|-------------------------|-----------| +| 有具体数据/统计 → 信息图强化 | 纯观点论述、篇幅短(<200字) | +| 有场景描写 → 画面还原 | 已经有引用块或代码块(视觉已丰富) | +| 转折/高潮处 → 视觉冲击 | 紧接着另一张配图(间距不足300字) | +| 长段落后(>400字无图) → 节奏调节 | 结尾 CTA 段落 | + +**第三步:确定位置** +- 配图插入在对应段落**之后**(不是之前) +- 具体到"H2 XX 下的第 N 段之后" + +**约束规则**: +- 总数 3-6 张(1500字→3张,2000字→4张,2500字→5-6张) +- 相邻两张配图之间至少间隔 300 字 +- 不要在文章第一段之前放配图 +- 不要在结尾 CTA 段落放配图 + +### 提示词格式 + +每张输出: + +``` +### 配图 {序号}: 位于「{H2标题}」第{N}段后 +- 配图目的:{信息强化/场景还原/节奏调节} +- 对应内容:{这段讲了什么,1句话概括} +- 画面描述:{具体的画面内容,80-120字} +- AI 绘图提示词: + "{中文提示词,给 doubao-seedream 用}" +- 备选方案:{Unsplash/Pexels 搜索关键词} +``` + +### 内文配图的特殊要求 + +- 尺寸统一 **16:9 横版**(image_gen.py --size article) +- 风格与封面保持一致(同一色调体系) +- 不要太复杂——手机屏幕上看,简洁的图比复杂的图好 +- 提示词用中文(seedream 中文理解强) +- 每张图都提供一个**免费图库备选关键词**,以防生图效果不佳 + +--- + +## 三、辅助功能 + +### 提示词修改 + +如果用户说"封面创意 A 我喜欢方向但是想要更暖的色调",只修改对应创意的提示词,其他不变。 + +### 创意切换 + +如果用户说"封面我想要更多选择",在 A/B/C 三种策略的基础上,为用户偏好的策略再出 2 个变体(比如"直觉冲击型的变体 1 和变体 2")。 + +### 配图场景调整 + +如果用户说"第 3 张配图位置不对"或"这段不需要图",按用户要求增删调整。 + +--- + +## 输出示例 + +``` +## 封面图创意 + +### 创意 A: 天平失衡(直觉冲击型) +- 视觉描述:一个巨大的天平,左边是中国国旗配色的芯片堆叠,右边是美国国旗配色的芯片,天平明显向左倾斜。背景是深蓝色数据流。 +- 色调:深蓝 + 科技蓝 + 金色点缀 +- 构图:16:9 横版,天平居中,右侧 1/3 留白放标题 +- 文字区域:右侧留出干净空间 +- AI 绘图提示词: + "A large balance scale, left side stacked with red-themed microchips, right side with blue-themed microchips, scale tilting left, dark blue background with flowing data streams, flat design, minimalist, tech aesthetic, 16:9 aspect ratio, clean space on the right third for text overlay, no text no letters no words" +- 适配工具建议:即梦(国内场景理解好) + +## 内文配图 + +### 配图 1: 位于"数字背后是什么"段落后 +- 配图目的:信息强化 +- 画面描述:一个简洁的柱状图,展示中美大模型调用量的对比,中国柱子更高但带有问号标记 +- 尺寸:1:1 方形 +- AI 绘图提示词: + "Minimalist bar chart comparing two bars, left bar taller in red, right bar shorter in blue, question mark floating above the taller bar, clean white background, flat infographic style, 1:1 square, no text" +- 备选方案:Unsplash 搜 "data comparison chart technology" +``` diff --git a/references/wechat-constraints.md b/references/wechat-constraints.md new file mode 100644 index 0000000..5728c9d --- /dev/null +++ b/references/wechat-constraints.md @@ -0,0 +1,426 @@ +# 微信公众号平台限制说明 + +本文档详细说明微信公众号编辑器的技术限制,以及本工具如何应对这些限制。 + +--- + +## 1. 核心技术限制 + +### 1.1 不支持外部CSS文件 + +**限制说明**: +- 微信编辑器不允许使用 `` 标签引用外部CSS文件 +- 不支持 ` + + +

标题

+``` + +**实现细节**: +- 使用CSS解析器将所有CSS规则转换为内联样式 +- 自动合并多个选择器的样式 +- 处理CSS变量(`:root`)并替换为实际值 + +### 1.2 不支持JavaScript + +**限制说明**: +- 完全禁用所有JavaScript代码 +- 不支持 `