全自动 AI 长篇小说创作引擎。确定性引擎跑完整本书,模型在每个需要判断的位置被精确使用:Engine 按事实路由驱动 Architect / Writer / Editor 三个自主创作代理,语义裁定按需唤醒 Arbiter。从一句话需求到完整小说,全程无需人工干预。
/review on,每次 /next 只放行一个新章节,返工和崩溃恢复不会误消耗许可核心设计:事实层确定,语义层自主。可枚举的状态迁移由确定性代码执行(Engine + Route);边界清晰的判断按需咨询 LLM 函数(Arbiter);开放式创作交给自主的 LLM 循环(Workers)。一句话概括:一个串行确定性 Engine、三个自主 Worker、少数几个按需 Arbiter 函数、一个文件系统事实层。
┌─────────────────────────────────────────────────┐
│ Host / Engine(确定性) │
│ 读 Store → Route → 直接运行 Worker → 循环 │
│ 启动裁定 / 干预分诊 / 失败僵局 → 按需咨询 Arbiter │
└────┬──────────┬──────────┬─────────────┬────────┘
│ │ │ │
┌───▼────┐ ┌───▼───┐ ┌────▼────┐ ┌────▼────┐
│Architect│ │Writer │ │ Editor │ │ Arbiter │
│(LLM循环)│ │(LLM循环)│ │(LLM循环)│ │(LLM函数)│
└───┬────┘ └───┬───┘ └────┬────┘ └─────────┘
└──────────┼──────────┘
│ 工具调用(IO + checkpoint)
┌───────────────▼─────────────────────────────────┐
│ Store │
│ Progress / Checkpoint / Outline / Drafts / ... │
└─────────────────────────────────────────────────┘
| 角色 | 职责 | 工具 |
|---|---|---|
| Arbiter | 语义裁定:启动选规划师、用户干预分诊、失败/僵局出路 | 无(单次 LLM 调用,输出结构化决策) |
| Architect | 生成书名、小说简介、前提、大纲、角色档案、世界规则 | novel_context save_book save_foundation |
| Writer | 自主完成一章的构思、写作、自审和提交 | novel_context read_chapter plan_chapter draft_chapter check_consistency commit_chapter |
| Editor | 阅读原文,从结构和审美两个层面审阅 | novel_context read_chapter save_review save_arc_summary save_volume_summary |
用户需求 → Arbiter 选规划师 → Architect 规划骨架+首弧 → Writer 逐章写作 → Editor 弧级评审
(裁定落盘) ↑ │
├── 重写/打磨 ◄──────┘
│
Architect 展开下一弧/卷
(参考前文摘要+角色快照)
每一步"下一个派谁"由 Engine 的 Route 决策表按 Store 事实推导(万级组合穷举测试钉死),不消耗任何 LLM 调用。
Writer 按固定顺序完成每章(写作内容完全自主,工具调用顺序严格):
novel_context — 加载上下文(前情摘要、伏笔、角色状态、风格规则、相关章节推荐)read_chapter — 回读前文找回语气和节奏plan_chapter — 构思本章目标、冲突、情绪弧线draft_chapter — 写入整章正文check_consistency — 对照状态数据检查一致性(必须在 draft 之后)commit_chapter — 提交终稿,落盘事实字段(arc_end / next_chapter / 反馈池等),下一步由 Engine 按 Route 决策表推导系统内部把运行状态拆成两层:
Phase 采用“只前进不回退”的规则:
init -> premise -> outline -> writing -> complete
\-------> outline ------^
\--------------> writing
含义:
init — 任务已创建,尚未形成稳定设定premise — 已保存故事前提outline — 已保存大纲,可以进入正式写作writing — 已进入章节创作期complete — 全书流程结束规则说明:
writing -> writingoutline -> writingwriting -> premise、complete -> writingFlow 只描述写作期内的活跃流程,允许在几个工作流之间切换:
writing -> reviewing / rewriting / polishing / steering / writing
reviewing -> writing / rewriting / polishing / steering / reviewing
rewriting -> writing / steering / rewriting
polishing -> writing / steering / polishing
steering -> writing / reviewing / rewriting / polishing / steering
含义:
writing — 正常推进下一章reviewing — Editor 正在评审rewriting — 处理必须重写的章节polishing — 处理只需打磨的章节steering — 正在评估并处理用户干预规则说明:
writing -> reviewing,例如章节提交后触发评审reviewing -> rewriting/polishing/writing,由评审结果决定steering -> writing/reviewing/rewriting/polishing,由干预影响范围决定rewriting -> reviewing这些规则现在由代码中的轻量校验统一约束,避免状态回退或跳到不合理的流程分支。
传统方案一次规划所有章节,300+ 章时大纲空洞、节奏像赶进度。本系统采用指南针 + 视野滚动规划,模拟网文作者的真实创作流程:
初始规划 弧结束时 卷结束时
┌────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
│ 终局方向(指南针) │ │ Editor 弧级评审 │ │ Editor 卷级评审 │
│ 起步 2 卷,后续按需 │ │ 弧摘要 + 角色快照 │ │ 卷摘要 │
│ 第1弧详细章节 │ → │ Architect 展开下一弧 │ → │ Architect 自主创建 │
│ 角色 + 世界观 │ │ Writer 继续写作 │ │ 下一卷 + 更新指南针 │
└────────────────────┘ └─────────────────────┘ └─────────────────────┘
500+ 章小说采用三级摘要 + 四级压缩管线 + 智能推荐:
卷(Volume)→ 卷摘要
└── 弧(Arc)→ 弧摘要 + 角色快照 + 风格规则
└── 章(Chapter)→ 章摘要(滑窗最近3章)
当对话超出模型上下文窗口时,按代价从低到高逐级压缩:
ToolResultMicrocompact → LightTrim → StoreSummaryCompact → FullSummary
清理旧工具结果 截断长文本 store 零 LLM 压缩 LLM 摘要兜底
runes × 1.5,不会因为 bytes/4 低估而导致压缩触发滞后# 一键安装(macOS / Linux,无需 Go)
curl -fsSL https://raw.githubusercontent.com/voocel/ainovel-cli/main/scripts/install.sh | sh
# 安装指定版本
curl -fsSL https://raw.githubusercontent.com/voocel/ainovel-cli/v1.2.3/scripts/install.sh | sh -s -- v1.2.3
# 或通过 Go 安装
go install github.com/voocel/ainovel-cli/cmd/ainovel-cli@latest
# 查看版本 / 更新到最新版本
ainovel-cli --version
ainovel-cli update
# 首次运行,自动进入引导流程(选择 Provider → 输入 API Key → Base URL → 模型名)
ainovel-cli
Windows 或手动安装:前往 Releases 下载对应平台的包。 安装脚本会从同一 GitHub Release 下载 SHA256 清单,校验通过后才提取并安装二进制。
--headless 无需 TUI,适合在服务器、NAS、CI 或后台任务中持续运行。它不提供首次配置引导,请先运行一次 ainovel-cli 完成配置,或手动创建 ~/.ainovel/config.json。
# 使用一句话需求启动新任务
ainovel-cli --headless --prompt "写一本东方玄幻长篇,主角从边陲小城起步"
# 从文件读取需求
ainovel-cli --headless --prompt-file prompt.txt
# 在同一目录恢复未完成的任务
ainovel-cli --headless
--prompt 与 --prompt-file 只能在 Headless 模式下使用,且不能同时指定。模型流式输出写入 stdout,运行事件写入 stderr,完整运行日志保存在作品目录的 logs/headless.log。
Docker 镜像适合在服务器/NAS 上运行 headless 长任务,也可以用 -it 进入 TUI。配置和作品目录建议挂载到宿主机:
mkdir -p config workspace
# TUI
docker run --rm -it \
-v "$PWD/config:/root/.ainovel" \
-v "$PWD/workspace:/workspace" \
ghcr.io/voocel/ainovel-cli:latest
# Headless
docker run --rm \
-v "$PWD/config:/root/.ainovel" \
-v "$PWD/workspace:/workspace" \
ghcr.io/voocel/ainovel-cli:latest \
--headless --prompt "写一本东方玄幻长篇,主角从边陲小城起步"
也可以用 Compose:
docker compose run --rm ainovel
docker compose run --rm ainovel --headless --prompt "写一本悬疑短篇"
进入 TUI 后,启动阶段支持两种前置交互:
快速开始:一句话直接进入创作共创规划:与 AI 多轮对话澄清需求,右侧实时同步整理出的创作指令草稿;AI 每轮主动提供 1-3 条引导建议,可连续按数字键组合填入,编辑后发送,按 Ctrl+S 进入正式创作两种模式最终都会收敛为同一份创作指令,再进入同一套创作引擎。
已有较长的世界设定或故事大纲时,可在欢迎页直接从文件创建新书:
/start ./outline.md
/start 会把文件全文作为初始创作要求,交给 Architect 整理为内部设定和动态大纲,不会将文件内容当成已完成章节。导入已有小说并续写仍使用 /import。
每本小说绑定到启动目录,产物落在 {cwd}/output/novel/。换目录启动 = 换一本,cd 回去启动 = 自动从最近 checkpoint 恢复。配置 ~/.ainovel/config.json 全局共享,无需复制。
首次运行时自动引导生成配置文件 ~/.ainovel/config.json。进入 TUI 后可输入 /config 新增或编辑 Provider、保存多个模型并为每个模型设置上下文窗口;保存后立即生效。/model 用于在这些已保存模型之间切换。
也可以手动创建配置文件,参考仓库根目录的 config.example.jsonc。首次引导也会复制一份到 ~/.ainovel/config.example.jsonc,方便本机离线查看。
{
"provider": "openrouter",
"model": "google/gemini-2.5-flash",
"reasoning_effort": "medium",
"providers": {
"openrouter": {
"api_key": "sk-or-v1-xxx",
"base_url": "https://openrouter.ai/api/v1",
"models": [
{ "name": "google/gemini-2.5-flash", "context_window": 200000 },
{ "name": "google/gemini-2.5-pro", "context_window": 1000000 }
],
"extra": {
"user_agent": "my-client/1.0",
"headers": { "X-Custom-Client": "my-client" }
}
}
},
"style": "default"
}
~/.ainovel/config.json — 全局配置./.ainovel/config.json — 项目级覆盖(可选)项目级
.ainovel/是全局~/.ainovel/的镜像:同样的结构、只是根目录从家目录换成当前项目。配置放./.ainovel/config.json,写作规则放./.ainovel/rules/*.md(详见下文「去 AI 味与自定义规则」)。该目录含密钥,已默认加入.gitignore。
覆盖规则说明:
provider、model、reasoning_effort、styleproviders 和 roles 按 key 合并,同名项内部按字段覆盖base_url 时会保留全局配置中的 api_key⚠️
provider(以及roles.*.provider)的值是providers里的 key 名——一根指针,不是协议名。项目级若把provider切到一个全局providers里不存在的账号,必须在项目级同时补上该账号的凭证(api_key/base_url),否则启动会报“未配置凭证”。
providers.<name>.models 为可选模型对象列表:name 是传给 Provider 的模型名,context_window 是模型专属的上下文压缩窗口,json_schema 是原生结构化输出的三态覆盖(true 确认支持、false 确认不支持、省略则采用适配器能力)。自定义中转或能力取决于具体模型时建议明确填写。旧版字符串数组仍可读取,下一次通过 /config 保存时会规范化为对象列表。如果未配置,系统会回退为配置中已经出现过的同 Provider 模型。
上下文窗口按“模型专属值 → 旧顶层 context_window → 模型注册表 → 200K 兜底”的顺序解析。它只影响本地上下文压缩时机,不改变远端 API 的真实请求限制。
/config 只用来编辑 Provider 的定义(协议 / API Key / Base URL / 模型库),不负责“当前用哪个模型”——切换模型与推理强度请用 /model。模型列表支持 ↑↓ 选行、←→ 选字段、Enter 原位编辑模型 ID 或上下文窗口、`D
| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|