改写核心
- 三种改写强度 — 轻度润色(仅修复表达与 AI 痕迹)、平台适配(按平台调整语气篇幅)、深度重写(可调整结构与顺序)
- 8 个目标平台 — Twitter/X、小红书、LinkedIn、朋友圈、微博、知乎、今日头条、微信公众号,各平台自带篇幅与语气规则
- 6 种语气预设 — 轻松随意、直截了当、故事叙述、专业克制、幽默风趣、极简主义
- 8 个 AI 提供商 — DeepSeek、OpenAI、Anthropic、通义千问、智谱 GLM、文心一言、Kimi、豆包,另支持自定义 OpenAI 兼容端点
去痕管线(Humanize Pipeline)
- 36 条 AI 模式检测 — 覆盖结构、词汇、风格三类,按 P0/P1/P2 严重级别分级
- Best-of-N 候选选择 — 生成多个候选并自动挑选去痕效果最佳者
- 自检闭环 — 改写后再做保真校验(fidelity),防止偏离原意
- 两遍审计报告 — 对改写前后做对比审计,量化 AI 痕迹去除情况
- 词汇替换表 — Tier 1/2/3 商务套话、隐喻、互联网黑话自动替换
体验与工程
- 管线进度跟踪 — 实时显示各阶段(检测 → 改写 → 审计)进度
- 断点续跑 — 任务持久化到 IndexedDB,刷新或中断后可恢复
- 响应缓存 — 相同输入不重复调用 API
- 多 API 配置 — 可保存多个 API Profile 并快速切换
- 历史记录 — 本地保存历次改写,可回溯
- 纯本地 — API Key 与数据仅存浏览器本地,调用直连提供商,不经过中间服务器
主操作界面。左侧大面积文本框用于粘贴待处理文案;下方控制条提供「目标平台」「语气微调」「改写强度」三组下拉、当前生效的 API 模型显示,以及「让文案更自然」运行按钮。运行后实时显示管线阶段进度(检测 → 改写 → 验证 → 自检),切换改写强度时下方即时给出该档位说明。
改写完成后的结果面板。逐行/逐段 Diff 对比原文与改写文本,高亮增删改;展示最终成文,支持一键复制。可由此打开下方的去痕审计报告。
弹窗式审计报告。量化本次去痕效果:列出检测到的 AI 写作模式(按结构 / 词汇 / 风格分类,P0/P1/P2 分级)及修复情况;给出保真度指标(段落数对比、长度比、遗漏事实);附两遍审计的剩余问题数与置信度。
历史页。按时间倒序列出历次改写条目,含时间、目标平台、输入与输出内容,可回看每次的改写结果与审计情况。
设置页,分多个分区:
- API 配置 — 管理多个 API Profile(提供商 / 模型 / Key),支持启用、编辑、删除;选「自定义」时强制填写 BaseUrl
- 生成偏好 — 设置默认目标平台、语气、改写强度,首页自动同步
- 外观 — 主题等界面偏好
- 数据与隐私 — 清除缓存 / 历史等本地数据
- 关于 — 版本信息
- Docker(推荐) — 一键部署,无需本地 Node 环境
- 或本地开发:Node.js ≥ 18 + npm(pnpm / yarn)
最简单的运行方式,构建镜像后由 nginx 托管静态产物:
# 克隆仓库
git clone https://github.com/yaowen51888-rich/SayItBetter.git
cd SayItBetter
# 构建并后台启动(映射到 http://localhost:3080)
docker compose up -d --build
# 查看日志 / 停止
docker compose logs -f
docker compose down启动后访问 http://localhost:3080。容器自带健康检查与自动重启。
不用 compose 也可直接构建运行:
docker build -t sayitbetter . && docker run -d -p 8080:8080 sayitbetter
# 克隆仓库
git clone https://github.com/yaowen51888-rich/SayItBetter.git
cd SayItBetter
# 安装依赖
npm install
# 开发模式(默认 http://localhost:3000,带热重载)
npm run dev
# 生产构建(产物输出到 dist/)
npm run build
# 本地预览构建产物
npm run preview- 配置 API — 进入「设置」页,新增 API Profile,选择提供商并填入 API Key
- 输入文本 — 回到首页,粘贴需要处理的文案
- 选择参数 — 选目标平台、语气微调、改写强度
- 运行 — 点击「让文案更自然」,观察管线进度
- 查看结果 — 改写完成后查看对比 Diff、去痕审计报告,并可一键复制
- 回溯 — 在「历史」页查看历次改写记录
| 类别 | 选型 |
|---|---|
| 框架 | React 18 + TypeScript |
| 构建 | Vite 6 |
| 样式 | Tailwind CSS 3 |
| 状态管理 | Zustand |
| AI SDK | Vercel AI SDK(ai、@ai-sdk/openai、@ai-sdk/anthropic) |
| 持久化 | IndexedDB(任务/历史) |
| Markdown | marked |
| 测试 | Vitest + jsdom |
src/
├── pages/ # 页面
│ ├── Home.tsx # 改写工作台
│ ├── Settings.tsx # 设置(API / 生成偏好 / 外观 / 隐私 / 关于)
│ └── History.tsx # 历史记录
├── components/ # 通用组件(侧栏、文本输入、结果面板、Diff、审计报告、管线进度…)
│ └── settings/ # 设置子组件
├── services/
│ ├── ai.ts # AI 调用入口
│ ├── tasks.ts # IndexedDB 任务持久化与续跑
│ ├── cache/ # 响应缓存
│ └── humanize/ # 去痕管线
│ ├── pipeline.ts # 管线编排
│ ├── api-client.ts # 多提供商 API 客户端
│ ├── prompt-builder.ts # Prompt 构造
│ ├── pattern-detector.ts # 36 条 AI 模式检测
│ ├── statistics-detector.ts # 统计特征检测
│ ├── vocabulary-replacer.ts # 词汇替换
│ ├── post-processor.ts # 后处理
│ ├── candidate-scorer.ts # Best-of-N 候选打分
│ ├── fidelity-validator.ts # 保真校验
│ ├── audit-report.ts # 审计报告生成
│ └── validator.ts # 通用校验
├── stores/ # Zustand 状态
│ └── (app / input / result / progress / settings / history)
├── shared/ # 常量、类型、设计 token
└── main.tsx # 应用入口
public/ # logo、favicon、静态资源
doc/ # 产品截图
| 提供商 | 默认模型 |
|---|---|
| DeepSeek | deepseek-v4-pro |
| OpenAI | gpt-5.4-mini |
| Anthropic | claude-sonnet-4-6 |
| 通义千问 | qwen3.6-flash |
| 智谱 GLM | glm-5.2 |
| 文心一言 | ernie-4.0-8k |
| Kimi | kimi-k2.6 |
| 豆包 | doubao-lite |
此外支持任意 OpenAI 兼容的自定义 API 端点。
npm test # 单次运行
npm run test:watch # 监听模式- API Key 与所有数据仅保存在浏览器本地(IndexedDB / localStorage)
- 不收集、不上传任何用户数据
- 所有 AI 调用直接从浏览器发往提供商,不经过任何中间服务器