AI-powered WeChat Official Account article generator with multi-stage pipeline
AutoWritingBot 是一个面向高校学院公众号编辑的 AI 写作工具。输入活动信息后,系统自动运行 4 步 Pipeline,依次完成素材整理 → 初稿生成 → 质量评估 → 精炼优化,全程流式输出,支持随时中断和手动批注修改。
支持 DeepSeek、OpenAI、Claude 等任意 OpenAI 兼容 API。
一键触发,自动完成 4 个步骤,无需手动多次提交:
| 步骤 | 任务 | 输出 |
|---|---|---|
| ① | 整理素材 — 结构化分析活动信息 | 画布底部面板 |
| ② | 生成初稿 — 按规范生成完整推文 | Canvas 实时流式更新 |
| ③ | 质量评估 — 自动审核、列出改进点 | 画布底部面板 |
| ④ | 精炼优化 — 依评估修改输出终稿 | Canvas 实时流式更新 |
- 预览 / 编辑模式切换
- 选中文字弹出批注气泡,支持重写 / 修正 / 风格调整三种类型
- 多条批注可一键批量应用
- 一键复制全文 · 导出 Word(
.docx)· 打包下载(.zip,含文稿与编号图片)
AI 输出的文本落定时自动修正,导出时再幂等地兜底一次,无需手动排版:
| 项目 | 规则 |
|---|---|
| 引号 | 英文 " ' → 中文 “” ‘’,按上下文判断开合方向;英文缩写(don't)中的撇号保留 |
| 空格 | 删除中文↔中文、中文↔英文/数字之间的空格;英文单词之间、数字之间的空格保留 |
| 字体 | 标题黑体、正文宋体;英文字符同样走宋体,不回退到西文字体 |
| 字号 | 标题三号(16pt)、小标题四号(14pt)、正文五号(10.5pt) |
| 行距 | 单倍行距 |
Markdown 行首标记(##、-、1.、>)会先被剥离再修正,标记后的空格不受影响。
流式输出过程中不修正——每个分片都跑会让引号在生成时反复跳变;用户在编辑框逐字输入时也不修正,避免顶飞光标。
一次性拿到推文与配图,图片按图片选择器里的勾选顺序编号,与提示词中喂给模型的「图片1、图片2」严格对应:
学院举办AI讲座_2026-07-19.zip
├── 学院举办AI讲座.docx
└── 图片/
├── 图片1_开幕式.jpg
├── 图片2_领导讲话.jpg
└── 图片3_合影.png
扩展名按图片的实际 MIME 类型推导,不信任原文件名。
- 内置 DeepSeek / OpenAI / Anthropic 预设
- 支持任意 OpenAI 兼容 API(自定义 Base URL)
- 多模型配置,随时切换,配置本地加密存储
Pipeline 四个阶段的提示词全部可在「提示词设置」中改写,改动仅覆盖对应阶段,随时可恢复默认:
① 整理素材 · ② 生成初稿 · ③ 质量评估 · ④ 精炼优化
批注应用走独立的编辑提示词——主提示词的「四段结构 + # 标题开头」要求会让局部修改重排全文。
- 上传活动图片,AI 自动识别生成描述
- 附加到推文生成时,AI 在对应段落标注插图位置
- 输入微信公众号文章链接,自动提取正文内容作为风格参考
- Node.js ≥ 18
- 任意 OpenAI 兼容 API Key(如 DeepSeek)
git clone https://github.com/muxia23/AutoWritingBot.git
cd AutoWritingBot
npm install
npm run dev- 点击右上角 「模型管理」,添加 API Key 和模型配置
- 在左侧选择活动类型、参与领导,填写活动描述
- 点击 「开始生成」,等待 Pipeline 自动完成
服务器需已安装 docker 与 git:
curl -fsSL https://raw.githubusercontent.com/muxia23/AutoWritingBot/main/deploy.sh -o deploy.sh
bash deploy.sh 2567 # 参数为端口,默认 2567脚本会拉取代码、构建镜像、重建容器、等待健康检查并校验产物。可重复执行,日常更新跑同一条命令即可。
⚠️ 反向代理请指向http://127.0.0.1:2567,不要用「静态网站」方式指向dist目录。静态方式下域名不经过容器,容器更新不会生效;且 Vite 产物文件名带 hash,残留的旧
index.html会引用已被删除的文件,导致整页白屏——此时重启容器无效,因为请求根本没走到容器。容器内 nginx 已配好防白屏规则:
index.html设no-store,/assets/下的 hash 产物长期强缓存。若外层反代又给index.html加缓存,会盖掉这条规则。
npm run build # 产物输出到 dist/将 dist/ 上传至服务器后,nginx 配置需包含以下内容(React Router + 微信代理):
server {
# ... SSL 证书等配置 ...
root /path/to/dist;
# ✅ React Router 前端路由
location / {
try_files $uri $uri/ /index.html;
}
# ✅ 微信公众号文章代理(解决 CORS)
location /weixin-proxy/ {
proxy_pass https://mp.weixin.qq.com/;
proxy_set_header Host mp.weixin.qq.com;
proxy_set_header User-Agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
proxy_set_header Referer "https://mp.weixin.qq.com/";
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
}
# ✅ OpenAI / Anthropic API 代理(两家官方接口不允许浏览器跨域直连)
# 前端把模型的 API 地址配成 /openai-proxy/v1 或 /anthropic-proxy/v1 即可走这里,
# 内置预设已默认使用代理路径。DeepSeek、豆包(火山方舟)等允许浏览器直连,无需代理。
location /openai-proxy/ {
proxy_pass https://api.openai.com/;
proxy_ssl_server_name on;
proxy_set_header Host api.openai.com;
proxy_http_version 1.1;
proxy_buffering off; # SSE 流式输出不能缓冲
proxy_read_timeout 300s;
}
location /anthropic-proxy/ {
proxy_pass https://api.anthropic.com/;
proxy_ssl_server_name on;
proxy_set_header Host api.anthropic.com;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 300s;
}
}仓库自带的
nginx.conf(Docker 部署使用)已包含上述全部代理配置;本地开发时vite.config.js内置了同样的代理路径,开箱即用。
nginx -t && nginx -s reloadsrc/
├── components/
│ ├── canvas/ # Canvas 编辑器 + 批注组件
│ ├── pipeline/ # Pipeline 状态面板
│ ├── images/ # 图片库相关
│ ├── layout/ # Header、TabNav、Modal
│ └── common/ # Toast、EmptyState 等
├── hooks/
│ ├── usePipeline.js # 4步 Pipeline 状态管理
│ └── useConversation.js
├── services/
│ ├── deepseek.js # LLM API 封装(流式 + 普通)
│ └── api.js # HTTP 层(SSE、AbortController)
├── context/
│ ├── AppContext.jsx # 模型管理、Toast
│ └── PromptContext.jsx
├── pages/
│ ├── ChatGeneratePage.jsx # 主页面
│ ├── ImageLibraryPage.jsx
│ └── PromptPage.jsx
└── utils/
├── formatText.js # 格式修正(引号 / 空格 / Markdown 标记隔离)
├── exportDocx.js # Word 文档构造与下载
├── exportBundle.js # 压缩包组装(文稿 + 编号图片)
├── parseArticle.js # 从模型输出中解析标题与正文
├── constants.js
├── default-prompt.js # 主提示词
└── default-step-prompts.js # Pipeline 各阶段提示词
formatText.js 是纯函数模块,不依赖 React 或 docx,只做字符串进字符串出,且幂等——这是「生成时修正一次、导出时兜底再修正一次」的安全前提,由单元测试锁定。
| 类别 | 技术 |
|---|---|
| 框架 | React 18 + Vite 5 |
| 路由 | React Router DOM 6 |
| 图标 | Lucide React |
| 状态 | React Context + Hooks |
| AI | OpenAI 兼容 SSE 流式接口 |
| 渲染 | react-markdown + remark-gfm |
| 导出 | docx · fflate(zip) |
| 存储 | localStorage(配置/历史)+ IndexedDB(图片二进制) |
| 测试 | Vitest + jsdom |
- 所有配置(API Key、提示词、对话历史)存储在浏览器 localStorage,图片二进制存储在 IndexedDB,均不经过任何中间服务器
- DeepSeek 等支持浏览器跨域的服务商,API 请求由浏览器直接发送至服务商
- OpenAI / Anthropic 官方接口不允许浏览器跨域,请求经由你自己部署的 nginx 反代转发(纯转发、不落盘、不记录),不涉及任何第三方中转
欢迎提交 Issue 和 Pull Request。
# 开发
npm run dev
# 测试
npm test
# 代码检查
npm run lint
# 构建
npm run buildMIT © 2025
如果这个项目对你有帮助,欢迎点个 ⭐