Files
ainovel-clients/README.md
2026-03-17 09:50:32 +08:00

207 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ainovel-cli
全自动 AI 长篇小说创作引擎。基于多智能体协作架构,从一句话需求到完整小说,全程无需人工干预。
<p align="center">
<img src="scripts/sample.gif" alt="ainovel-cli demo" width="800">
</p>
## 特性
- **多智能体协作** — Coordinator 调度 Architect / Writer / Editor 三个专职智能体,各司其职
- **确定性控制面** — 宿主程序通过信号文件驱动流程,不依赖 LLM 判断控制流
- **章节级断点恢复** — 中断后从上次写到的章节续写,不丢失进度
- **自适应上下文策略** — 根据总章节数自动切换全量 / 滑窗 / 分层摘要,支持 500+ 章长篇
- **七维质量评审** — Editor 从设定一致性、角色行为、节奏、叙事连贯、伏笔、钩子、审美品质七个维度评审,审美维度必须引用原文举证
- **用户实时干预** — 写作过程中可随时注入修改意见,系统自动评估影响范围并重写
- **双模式运行** — CLI 一行命令直接跑TUI 交互界面实时观察进度
- **多 LLM 支持** — OpenRouter / Anthropic / Gemini / OpenAI 等等随意切换
## 架构
```
┌─────────────────────────────────────────────────┐
│ Host控制面
│ 读取信号文件 → 确定性决策 → 注入 FollowUp 指令 │
└────────────┬────────────────────────┬───────────┘
│ │
┌───────▼───────┐ ┌────────▼────────┐
│ Coordinator │◄────►│ State Store │
│ (调度中枢) │ │ JSON 持久化) │
└──┬────┬────┬──┘ └─────────────────┘
│ │ │
┌────▼┐ ┌▼───┐ ┌▼─────┐
│Arch.│ │Wri.│ │Edit. │
│建筑师│ │作家 │ │编辑 │
└─────┘ └────┘ └──────┘
```
### 智能体职责
| 智能体 | 职责 | 工具 |
|--------|------|------|
| **Coordinator** | 调度全局,处理评审裁定和用户干预 | `subagent` `novel_context` `ask_user` |
| **Architect** | 生成前提、大纲、角色档案、世界规则 | `novel_context` `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` |
### 写作流程
```
用户需求 → Architect 建基 → Writer 逐章写作 → Editor 评审
↑ │
└── 重写/打磨 ◄───┘
```
Writer 自主决定每章的创作流程,建议路径:
1. `novel_context` — 加载上下文(前情摘要、时间线、伏笔、角色状态、风格锚点、声纹)
2. `read_chapter` — 回读前一章结尾和角色对话,找回语气和节奏
3. `plan_chapter` — 构思本章目标、冲突、情绪弧线
4. `draft_chapter` — 写入整章正文
5. `read_chapter` + `check_consistency` — 自审:回读草稿,对照状态数据检查一致性
6. `commit_chapter` — 提交终稿,更新全局状态(可选附带大纲偏离反馈)
### 长篇分层架构
500+ 章小说采用三级结构自动管理上下文:
```
Volume
└── 弧Arc
└── 章Chapter
└── 场景Scene
```
- **卷摘要** — 压缩整卷为一段话,供后续卷参考
- **弧摘要 + 角色快照** — 弧结束时自动生成,追踪角色状态演变
- **章摘要** — 滑窗加载最近 3 章,远处靠弧/卷摘要覆盖
- **弧边界检测** — 自动识别弧/卷结束,触发对应评审和摘要生成
## 快速开始
```bash
# 安装
go install github.com/voocel/ainovel-cli@latest
# 配置 API Key任选一个 Provider
export LLM_PROVIDER=openrouter
export OPENROUTER_API_KEY=sk-xxx
# CLI 模式:一行启动
ainovel-cli "写一部12章都市悬疑小说主角是刑警暗线是家族秘密"
# TUI 模式:交互界面
ainovel-cli
```
### 环境变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `LLM_PROVIDER` | LLM 提供商(`openrouter` / `anthropic` / `gemini` / `openai` | `openrouter` |
| `OPENROUTER_API_KEY` | OpenRouter API Key | — |
| `ANTHROPIC_API_KEY` | Anthropic API Key | — |
| `GEMINI_API_KEY` | Gemini API Key | — |
| `Z_OPENAI_API_KEY` | OpenAI 兼容接口 API Key通用 | — |
| `Z_OPENAI_BASE_URL` | OpenAI 兼容接口 Base URL | — |
| `NOVEL_STYLE` | 写作风格 | `default` |
### 写作风格
通过 `NOVEL_STYLE` 环境变量切换:
- `default` — 通用风格
- `suspense` — 悬疑推理
- `fantasy` — 奇幻仙侠
- `romance` — 言情
## 输出结构
```
output/{novel_name}/
├── chapters/ # 终稿Markdown
│ ├── 01.md
│ └── ...
├── summaries/ # 章节摘要JSON
├── drafts/ # 章节草稿
├── reviews/ # 评审报告
├── meta/
│ ├── premise.md # 故事前提
│ ├── outline.json # 章节大纲
│ ├── characters.json # 角色档案
│ ├── world_rules.json# 世界规则
│ ├── progress.json # 进度状态
│ ├── timeline.json # 时间线
│ ├── foreshadow.json # 伏笔台账
│ ├── snapshots/ # 角色状态快照(长篇)
│ ├── characters.md # 角色档案(可读版)
│ └── world_rules.md # 世界规则(可读版)
```
## 设计理念
### Agent 驱动原则
**工具负责 IOAgent 负责思考。不要用流水线绑住 Agent 的手脚。**
这是本项目所有设计决策的最高优先级准则。具体要求:
1. **工具只做数据读写** — 工具不包含业务逻辑判断,不强制执行顺序。工具是 Agent 的手和眼,不是 Agent 的脑。
2. **决策权归 Agent** — 规划、写作、打磨、自审都是 Agent 的思考行为不是工具调用节点。Agent 自主决定何时读、何时写、何时审。
3. **不用流水线约束创作** — 不强制"先规划→再按场景写→再打磨→再检查"的固定流程。Writer 可以先写完整章,回读后修改,自审后提交,顺序自定。
4. **给 Agent 感知能力** — Agent 能回读自己写的文字和前文原文,而非只看结构化摘要。风格保持靠阅读原文,不靠字段描述。
5. **Host 只兜底控制流** — 确定性状态机只负责"下一步该做什么"的流程判断,不干预创作内容。
任何新增功能或工具设计,都必须先问:**这是 IO 操作还是思考行为?** 如果是思考,交给 Agent如果是 IO才做成工具。
### 全自动闭环
一句话输入,完整小说输出,中间零人工干预。系统自主完成全部创作决策:
```
"写一部悬疑小说" → 构建世界观 → 设计角色 → 规划大纲
→ 逐章写作 → 质量评审 → 自动重写
→ 弧级摘要 → 角色快照 → 完整成书
```
**自主决策能力:**
- **Architect 自主构建** — 从用户一句话需求推导出完整的前提、大纲、角色关系和世界规则
- **Writer 自主创作** — 每章独立完成规划、写作、打磨、一致性校验的完整闭环
- **Editor 自主评审** — 跨章节分析结构问题,输出裁定(通过 / 打磨 / 重写)及影响范围
- **Coordinator 自主调度** — 根据评审裁定安排重写,根据弧边界触发摘要生成,无需外部指令
- **自动伏笔管理** — 埋设、推进、回收全程由 Agent 自行追踪,不会烂尾
- **自动节奏调控** — 追踪叙事线和钩子类型历史,避免连续章节结构雷同
### 确定性控制面
Agent 负责创造Host 负责兜底。**控制流不交给 LLM 判断**。
Writer 调用 `commit_chapter` 后,宿主程序读取信号文件 `meta/last_commit.json`,确定性地决定下一步:
| 信号 | 宿主动作 |
|------|----------|
| 全部章节完成 | 标记完成,通知 Coordinator 总结全书 |
| `review_required=true` | 注入 Editor 评审指令 |
| `arc_end=true` | 注入弧级评审 + 弧摘要生成指令 |
| `volume_end=true` | 额外注入卷摘要生成指令 |
| 有待重写章节 | 注入重写指令 |
| 以上皆否 | 注入"继续写下一章"指令 |
Editor 评审裁定同理:`accept` → 继续,`polish/rewrite` → 注入修改指令。
这种设计保证:即使 LLM 幻觉或遗忘,宿主层的状态机也能把流程拉回正轨。
## 技术栈
- **Go 1.25** — 主语言
- **[agentcore](https://github.com/voocel/agentcore)** — 多智能体编排框架tool-calling + streaming
- **[litellm](https://github.com/voocel/litellm)** — 统一 LLM 接口适配
- **[Bubble Tea](https://github.com/charmbracelet/bubbletea)** — 终端 TUI 框架
- **[Lip Gloss](https://github.com/charmbracelet/lipgloss)** — 终端样式
## License
MIT