story-deslop
zenstory-ai/oh-story-claudecode
Detect and remove AI writing patterns from Chinese web fiction, restoring natural prose.
What is story-deslop?
Story-deslop is a specialized tool for Chinese web novel authors to identify and eliminate AI-generated writing artifacts—excessive formality, template-like phrasing, over-polished sentence structures—while preserving plot function and authorial intent. Use it when your prose feels too smooth, repetitive, or lacks the spontaneity of natural storytelling.
- Scans text for AI-flavor markers: banned vocabulary, formulaic sentence patterns, abstract emotion summaries, and rhythmic uniformity
- Classifies issues by severity (light/medium/heavy) and applies targeted fixes via seven processing gates
- Preserves plot-critical content, character names, numbers, and functional punctuation while removing template artifacts
- Detects and eliminates repetitive descriptions, explanation-heavy narration, and ungrounded emotional beats
- Restores natural pacing by varying paragraph length and sentence rhythm to match narrative beats
- Integrates with narrative-writer subagent for execution or runs inline when unavailable
How to install story-deslop
npx skills add https://github.com/zenstory-ai/oh-story-claudecode --skill story-deslop- Node.js runtime (for bundled detection scripts)
- Access to the target text file or passage in Markdown format
- Optional: author memory state (prose_style records) for consistency with established writing habits
How to use story-deslop
- 1.Trigger the skill with `/story-deslop`, `/去AI味`, or mention `「去AI味」` / `「这篇太AI了」` / `「网文去AI味」` in your request
- 2.Paste or reference the text passage or file path you want to analyze
- 3.Review the AI-flavor detection report, which identifies problem locations, types, and original text
- 4.Accept the recommended fixes or specify a processing gate (A–G) to focus on particular issue categories
- 5.Receive the revised text with minimal changes applied; functional writing patterns are preserved and marked `[需复核]` if uncertain
Use cases
- Revise a completed chapter before posting to remove telltale AI smoothness and restore reader engagement
- Polish dialogue tags and emotional reactions that feel formulaic or over-explained
- Fix rhythm issues where every paragraph has identical length or every beat gets equal weight
- Clean up redundant descriptions where the same action or emotion is unpacked across multiple sentences
- Audit opening and closing sections of long works where AI flavor tends to concentrate
- Chinese web novel authors seeking to maintain authentic voice and avoid AI-detection penalties
- Writing coaches and editors working with authors who use AI drafting as a starting point
- Translators and adaptors who need to de-template source material before localization
- Quality-assurance reviewers checking serialized fiction before publication
story-deslop FAQ
It applies minimal, targeted edits—changing one word instead of a sentence, deleting a phrase instead of rewriting a paragraph. Plot, character names, numbers, and narrative function stay intact. Only genuinely template-like or ungrounded content is removed or rephrased.
Functional writing patterns—intentional pauses, rhetorical questions, sparse dialogue tags—are marked `[需复核]` and preserved. You can override any suggestion; the tool respects authorial intent over mechanical rules.
No. Short pieces preserve subjective judgments and cliffhanger endings; long novels are processed chapter-by-chapter with extra scrutiny on opening and closing sections where AI flavor concentrates.
Yes. The tool works standalone. If you have author memory (prose_style records), it will load your established writing habits for consistency; otherwise, it applies universal de-AI standards.
The skill falls back to inline execution in your current session. You'll see a brief note in the technical remarks; the revision process continues without interruption.
Full instructions (SKILL.md)
Source of truth, from zenstory-ai/oh-story-claudecode.
name: story-deslop version: 1.0.0 description: "网文去AI味。检测并清除文本中的AI写作痕迹,让文字回归自然、非模板化。触发方式:/story-deslop、/去AI味、「去AI味」「这篇太AI了」「网文去AI味」。" metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
story-deslop:网文去AI味
文风裁决:正文写作、改写或审稿前先读 references/style-resolution.md,加载本书文风并形成 style_resolution;无作者记忆也执行。当前请求、本书文风和 active 偏好按维度覆盖通用 references;同一裁决交给后续执行者。
你是网文润色专家。你的任务是把 AI 味浓重的网文文本改写自然,降低模板化、书面腔和过度工整感。
核心信念:AI 味的主要问题并非语法错误;更常见的是过度圆滑、工整、解释充分。改写目标是保留剧情功能,同时增加口语、停顿、跳跃和具体动作。
Agent 兼容性:只检查当前运行时的 canonical 目录:Claude
.claude/agents/{agent}.md、OpenCode.opencode/agents/{agent}.md、Codex.codex/agents/{agent}.toml、Antigravity.agents/agents/agent-name/agent.md(agent-name为目标 agent 名),不得因其他端文件存在而误判。Claude 用subagent_type,OpenCode 用subagent工具的agent参数,Codex 用同名agent_type,Antigravity 用invoke_subagent+TypeName。运行时未暴露 custom-agent registry /invoke_subagent、返回未知 agent,或检测到.zcode/(ZCode 3.3.4 不执行项目 custom agents)时降级 solo/direct:报告里一句白话告诉作者「这次由我直接改」,Fallback: project custom agents unavailable -> solo原文只写进报告最后一行「技术备注:」。Spawn 版本提示(不阻断 spawn):先读取项目根
.story-deployed的agents_version。与本版agents_version: 34不一致时(标记缺失、字段缺失/非整数、小于或大于 34)照常按文件存在性检查并 spawn,同时用一句白话提示作者「写作助手是旧版,运行 /story-setup 后新开对话」,Notice: agents bundle 版本不匹配(项目 {N},本版 34)原文写进技术备注行;大于 34 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,Fallback: ... -> solo同样只进技术备注行。
核心哲学
原则 1:改味优先,别当改错
AI味不按语法错误处理,也不需要"修正"。它属于风格问题:过于书面化、过于对仗工整、过于面面俱到。去AI味的本质,是把文字从过度工整拉回具体、自然、可读。
原则 2:改最少,效果最大
去AI味不等于重写。目标是改最少的字,让整段文字的"味"变过来。能改一个词就不改一句,能删一句就不重写一段。没有问题的句子尽量保留原句;人名、地名、数字、章节名、专有名词优先保留。
过度去AI味保护:
- 不得整段删除正文内容。如果某段被标记为多处AI味,应逐句修改而非删除整段
- 删除前必须确认:被删除的内容是否包含伏笔、钩子、角色特征、情节推进、人物记忆、情绪承接、因果锚点等关键信息
- 如果删除会破坏情节连贯性,改为"降AI重写"而非删除
- 删除比例上限按 AI 味等级分级:轻度 ≤15%,中度 ≤25%,重度 ≤35%。重度文本可通过“合并重复描写+重写降AI”产生更大字符差,但仍不得整段删除或删掉剧情功能。超过对应比例应在报告中标记超限风险,并输出分段处理方案
- 如果逐句修改后某段仍不满意,在去AI味报告中标注
[需复核]而非删除,不计入当前等级的删除比例上限 - 对于"疑似AI味但不确定"的内容,在去AI味报告中标注
[需复核],而非插入正文
原则 3:保留创作意图
去AI味只改"怎么说",不改"说什么"。剧情、人设、情节走向一概不动;不新增原文没有的情节、设定、关系或时间线。如果原文有逻辑问题,那不是去AI味的活。
原则 4:按文风保留有功能的语气与停顿
去AI味不是把文字全部磨成句号。质问里的 ?、爆发峰值的少量 ! 可以保留;犹豫、未尽、打断或拖长用动作、短句、换行、逗号或句号重排。默认不保留 …… / ——;本书明确选择并登记的功能性停顿保留,也要清理无功能的 !!! 和随机标点堆砌。
边界:去AI味只处理读感与叙事功能
去AI味治读感,不承诺任何分数结果。若用户贴出工具报告,只把能对应到正文的问题转成具体修改点;不写“0% AI / 100% 真人”,不注水、故意错字或打乱标点。去AI味仍以原文剧情边界为准,不把表达修复变成新增情节或新增事件链。
作者习惯
若作者记忆 state 已存在,改写前用 scripts/author_memory_commit.py query --workspace {工作区} --book-root {书目录} --kind prose_style [--genre {题材}] [--workflow 去AI味] 获取匹配的 active 文风条目(--workspace 必传;--genre 填本书题材类型;总输出 ≤2KB),并交给 inline/spawn 执行者作为自然倾向,不逐条展示或最大化命中,不牺牲连贯、节奏和字数;当前请求、原文剧情功能和本 skill 保护规则优先。用户明确声明长期文风习惯时,改写后按 references/author-memory.md 用 record 写入并按其「回执怎么告诉作者」转告;只记作者明确说的,一次性要求、反复修改、检测器 findings 和助手自己的结果不记录。
自然文本基准
去AI味需要知道自然网文文本的特征。以下是从热门网文中提炼的非模板化写作特征,作为对比基准:
自然文本特征(与AI味对比)
| 维度 | 自然文本 | AI味文本 |
|---|---|---|
| 段落长度 | 随 beat 长短不一:爽点/转折压短,推理/氛围/情绪链放长 | 通篇同一长度,整齐均匀 |
| 句内节奏 | 叙述以逗号长句为主(逗号之间 8-12 字、整句 20-30 字,见 anti-ai-writing.md 规则 3) | 要么长句臃肿,要么通篇碎句像提纲 |
| 对话标签 | 标签低频且不公式化,多用动作/上下文引出;普通"说"可保留 | 几乎每句都有"说道/问道/笑道" |
| 情绪表达 | 直写有上下文支撑,反应带后果 | 空转的情绪总结句,或给每个情绪词配微动作 |
| 比喻 | 生活化("像哈士奇护食") | 文学化("如寒冰般") |
| 语气词 | "嘤""嘶""靠""行吧" | 几乎没有 |
| 省略 | 大量省略,读者自己脑补 | 面面俱到,生怕读者不懂 |
| 排比 | 偶尔1-2个,从不连续3+ | 连续3-5个排比是标配 |
| 结尾 | 动作/对话收尾 | 总结/升华/感慨收尾 |
自然表达替换参考
来自大量网文写作研究:
- 替代"深吸一口气"→ 直接删;若确有功能,改成角色当下动作
- 替代"眼中闪过一丝..."→ "他垂下眼" / "眯起眼"
- 替代"嘴角勾起一抹..."→ "他嘴角一扯" / "乐了"
- 替代"仿佛..."→ 优先直接白描;确需比喻时只留少数生活化、角色化比喻
- 替代"不禁..."→ 直接写动作
- 替代"缓缓开口"→ "说" / 用动作引出对话
检测流程
去 AI 味只有一条管线:确定性检测器 → 按分级选 Gate → 一次定点改写 → 复扫。长篇写作的章末检测与按需审查、story-review 的确定性预检用的是同一套检测器与 Gate,本 skill 是它的独立入口。
Phase 1:AI味扫描
先认篇幅:目标是单个 正文.md(同目录常有 小节大纲.md 或 设定.md)按短篇处理,门禁 F/G 保留短篇卖点(主观审判句、火葬场预告、心死式章尾);正文/ 下逐章文件或章节片段按长篇处理。拿不准问作者一句。
对用户提交的文本做快速扫描,标记AI味浓重的位置。报告写给作者:问题用白话说并附原文,脚本名、检测器类别名、Gate 字母不进报告。
<!-- author-report -->## AI味检测报告
### 整体评估
- AI味等级:{轻度/中度/重度}
- 主要问题:{1-3 个白话描述}
### 问题标记
| 位置 | 类型 | 原文 | 问题 |
|------|------|------|------|
| 第X段 | 套话 | "眼中闪过一丝..." | 典型AI高频词 |
| 第Y段 | 句式 | "...,带着..." / 连续3句排比 | AI惯用句式,过于工整 |
| 第Z段 | 情绪空转 | "一丝悲伤涌上心头" | 只总结情绪,没有落点 |
| 第M段 | 节奏 | 段段4-6句、长度均匀 | 整段同节奏 |
| 第N段 | 重复描写 | 同一动作连续拆写 | 相邻段重复同一瞬间 |
| 第P段 | 解释腔 | "她不知道的是…" / "之所以…是因为" | 叙述者跳出角色解释、剧透或下结论 |
| 第Q段 | 动作清单 | "伸手拿起…取过…放下…转身…" | 像监控录像,缺人物的感受 |
类型 → Gate 速查(选 Gate 用,不写进表):套话 = A,句式 = B,情绪空转 = C,节奏 = D,对话腔调 = E,结尾升华 = F,解释腔 = G,重复描写 = C/D,动作清单 = D/E。
评价只输出 AI味等级(轻度/中度/重度)与问题标记;不做「上乘 / 新人投稿属上乘 / 性价比高」这类横向市场判断——skill 没有平台投稿分布数据,这类措辞是无依据的越权担保。
确定性句式预检(文件模式):当输入是本地正文文件路径时,「AI味扫描」必须先运行本 skill 自带脚本,只报告不修改:
node scripts/check-ai-patterns.js --check --fail-on=blocking <正文文件...>
- 检测器 blocking=必须修,advisory=建议看;轻/中/重分档另按「诊断与分级」定,用来选 Gate。
- severity=blocking 的类别(
not-is-comparison/em-dash/voice-contrast/negation-parade/reverse-not-is/trailer-ending/trailer-summary)是写作/去 AI 味时优先处理的问题:章尾预告与章尾状态总结(trailer-ending/trailer-summary)归 Gate F,其余 blocking 并入 Gate B。 - 其他 findings(碎句号、长段落、微动作、套式反应细节、动作清单、抽象总结、套词、比喻密度、解释链、公文腔、过度精炼、低连接密度、引号强调滥用、
formulaic-parallelism工整并列)只作读感提示;完整类别和修法见references/anti-ai-writing.md。其中工整并列会扫描台词,必须读语境判断,不能因为 hook 对台词低误报豁免就跳过。 - 处理方式:删掉否定铺垫,直接写后项;或改成角色动作、物件细节、身体反应来呈现。
- 若用户只要检测,保留报告不改文。若执行去 AI 味,只改确实损害读感且无叙事功能的问题;功能性写法标
[需复核]并保留。
Phase 2:诊断与分级
用户明确指定 Gate 时,直接使用该范围;未指定时按下表定档、选处理策略:
| AI味程度 | 特征 | 处理策略 |
|---|---|---|
| 轻度 | 少量禁用词,偶有书面腔 | 只过 Gate A + B |
| 中度 | 多处禁用词 + 句式套路 + 心理描写抽象 | 过 Gate A + B + C + D + G |
| 重度 | 全文AI味明显,节奏/对话/结尾/解释腔都有问题 | 完整 7 Gate + 重点段落重写 |
定档只看这六项(阈值是参考值,按题材放宽,如古风的对话标签天然偏多):
| 指标 | 计算方式 | 轻度 | 中度 | 重度 |
|---|---|---|---|---|
| 禁用词密度 | 命中次数 / 千字 | ≤5 | 6-15 | >15 |
| 连续排比段数 | 连续相同句式结构的段落数 | ≤2 | 3-4 | ≥5 |
| 空转情绪句 | 无落点的情绪总结句数 / 总段落数 | ≤10% | 10-25% | >25% |
| 对话标签密度 | "说道/问道/笑道" 等 / 对话句数 | ≤30% | 30-50% | >50% |
| 平均段落句数 | 总句数 / 总段落数 | ≤3 | 3-5 | >5 |
| 重复描写密度 | 同一信息/动作/情绪连续多段拆写的处数 / 千字 | ≤1处/千字 | 2-3处/千字 | ≥4处/千字 |
- 怎么定档:任一项到重度,或四项及以上到中度,按重度;有一项到中度,按中度;六项都在轻度,按轻度。
- 要紧处加一档:本次处理的这段文字里,开头约 500 字、高潮那场戏、最后约 500 字出现重复描写,「重复描写密度」这一项按高一档算(轻→中,中→重)。短篇按全篇、长篇按本章算开头和结尾。
- 禁用词怎么数:banned-words.md 的条目作为连续字符串出现一次算一处,同一处只算一次;
.deslop-whitelist里的词是命中片段的一部分时不算(免得误报世界观术语)。 - 按指标定档后,可按题材语境往下调至多一档,并在报告里写明理由;不往上调。
改写顺序(只排所选 Gate 的先后,不扩大范围):先去泛化与套话(禁用词、抽象情绪、工整对仗、解释腔),再去书面腔,最后回自然节奏、对话差异与结尾落点;做法与范例见 references/anti-ai-writing.md。
Phase 3:逐项清除
Agent 调用:narrative-writer(去AI味执行)
「诊断与分级」完成后,按以下顺序选择执行路径:
- 已在 narrative-writer 子代理内:按选定 Gate 范围 inline 执行,不再 spawn(嵌套 spawn 会被静默降级)。
- 未在子代理内且按顶部顺序找到
narrative-writeragent:按当前运行时调用;Antigravity 用invoke_subagent(TypeName: "narrative-writer"),Claude/OpenCode/Codex 用各自字段。prompt 照 references/agent-calls.md 填,只在交给写手时读。 - agent 不存在或 spawn 失败:主会话 inline 执行。
Gate 规则入口
实际执行者逐项清除前读 references/deslop-gates.md 的删除保护、所选 Gate 细则与「写法抽查」;inline 与 agent 使用同源规则。按上文「改写顺序」排所选 Gate 的先后,不另起一次全篇去味。
Phase 4:确定性收尾(文件模式)
当输入是正文文件路径,且「逐项清除」已落盘修改后,先做句式/段落复扫,再做机械标点兜底(破折号要按功能改写,故先于机械替换报出):
node scripts/check-ai-patterns.js --check --fail-on=blocking <正文文件...>
node scripts/check-degeneration.js --check <正文文件...>
node scripts/normalize-punctuation.js <正文文件...>
作用边界:
check-ai-patterns.js只报告不改写:severity=blocking 的类别优先改正文并复扫;advisory 先通读判断,确属提纲感、解释腔或模板腔再改,功能性写法标[需复核]。- 它只是读感提示;完整类别、例外和修法见
references/anti-ai-writing.md。 check-degeneration.js报告模型退化(逐字复读/打转、末尾截断、占位符、工程词泄漏细纲/情节点等),每条带severity: blocking|advisory。blocking 是退化信号,去AI味改不掉,应回去重新生成那一段再 deslop;advisory(tier2 章节/歧义词)只提示。normalize-punctuation.js机械兜底:保留书级白名单获准的停顿,清除其余残留的……、漏网破折号——/—、双连字符--和独立行---;默认不改变引号风格,也不把有功能的?/ 少量!改成句号。- 知乎盐言短篇可保留
「」;只有用户或项目明确要求时,才给标点脚本加--quote-mode ascii或--quote-mode yan。
视角改写复核(仅本次要求切换视角时):交付前回读原文,逐项核对新增的感知/认知句。原文只说明事件发生,不等于人物已经看见或知道;不得自行补观察时点。没有原文依据的“进门时发现”“后来看到”等句子删去,或只呈现原有、当前场景可见的物件状态;不可得的信息暂不叙述。这个检查先于交付,不能用句式脚本通过代替。
Phase 5:输出润色结果
<!-- author-report -->## 去AI味结果
- AI味:{轻度/中度/重度} → 改后 {轻度/已基本去除};主要问题:{1-3 个白话描述}
- 改了 {N} 处:{最多的 2-4 类,如「删掉"眼中闪过一丝"一类套话 6 处;拆开连续排比 3 处」}
- 字数:{N0} → {N1}({删/增}{百分比}){;超过本档删减上限时写明已分段处理}
### 改前改后
{逐段展示,每处一句说明为什么改;超过 30 处时只展示前 10 处 + 末 5 处,其余按问题类型计数}
### 需要你看一眼
{标 [需复核] 的地方:原文 + 为什么没动或拿不准;没有就写"无"}
### 润色后全文
{文件模式(默认;章节/正文文件、批量与长篇去AI):直接改写落盘,写明改了哪个文件,本节只回 ≤200 字代表性片段,不向父会话返回全文。文本模式(仅限交互式贴入、无文件路径的零散片段):完整输出润色后的文本。}
下一步:{一句话,如「要我接着处理下一章吗?」}
技术备注:{降级或版本提示的原文;没有就删掉这一行}
字数硬约束:删除比例不得超过「诊断与分级」对应上限(轻度 ≤15%、中度 ≤25%、重度 ≤35%)。超限时分段输出并在报告里标记,不得整段删除正文。
收敛终止:
- 同一段连续两轮去 AI 后没有新改动 → 停止该段处理
- 全文上限 3 轮重扫;第 3 轮仍有 ≥10 处改动 → 在报告里标
[需复核],移交人工 - 每轮结束前都要做一遍"再检一次":是否有不符合的地方,有则继续;没有则停
使用场景
| 场景 | 操作 |
|---|---|
| 用户贴一段文字说"太AI了" | 执行完整检测 + 润色流程 |
| 用户说"帮我润色" | 先检测AI味,再润色 |
| 用户说"检查下有没有AI味" | 只做检测,不做修改 |
用户写作中要求 仅标注 / 只检测 / 不要改 | 嵌入式提醒模式:执行「AI味扫描」和「诊断与分级」,跳过「逐项清除」「确定性收尾」「输出润色结果」;输出问题标记表,不修改原文,不写文件 |
参考资料
按需加载以下文件:
| 文件 | 何时加载 |
|---|---|
| references/banned-words.md | 检测和替换禁用词时 |
| references/deslop-gates.md | 逐项清除前:删除保护与所选 Gate 的细则、示例 |
| references/agent-calls.md | 交给 narrative-writer 去味时:prompt 模板 |
| references/anti-ai-writing.md | 去AI味完整指南:预防+改写顺序+范例 |
| scripts/normalize-punctuation.js | 文件模式落盘后做确定性标点收尾;默认保留引号风格 |
| scripts/check-ai-patterns.js | 文件模式「AI味扫描」预检与「确定性收尾」复扫(只看引号外叙述),只报告不改写 |
| scripts/check-degeneration.js | 文件模式「确定性收尾」复扫,只报告不改写 |
| references/author-memory.md + scripts/author_memory_commit.py | 读取或更新跨会话作者文风习惯时 |
流程衔接
流水线: 通用 位置: 润色(共享收尾)
| 时机 | 跳转到 | 命令 |
|---|---|---|
| 继续写作 | story-long-write / story-short-write | /story-long-write 或 /story-short-write |
| 发现结构问题 | story-long-analyze / story-short-analyze | /story-long-analyze 或 /story-short-analyze |
| 准备做封面 | story-cover | /story-cover |
语言
- 跟随用户的语言回复,用户用什么语言就用什么语言回复
- 中文回复遵循《中文文案排版指北》
Related skills
More from zenstory-ai/oh-story-claudecode and the wider catalog.

story-import
Reverse-parse existing novels into structured writing projects compatible with story-long-write and story-short-write workflows.

story-long-analyze
Analyze long-form web novels chapter-by-chapter: extract plot, pacing, characters, and style with causal chains and dual timelines.

story-long-scan
Analyze bestseller rankings across Chinese web novel platforms to identify market trends and popular genres.

story-long-write
Long-form web novel planning and writing with flexible structure, outline, and chapter-by-chapter support.

story-review
Multi-perspective adversarial review for stories with parallel agent spawning and intelligent fallback.

story-setup
Deploy and verify Chinese web fiction writing infrastructure for Claude Code, Codex, Antigravity, ZCode, OpenClaw, Reasonix, and generic agents.