AI 辅助剧本创作工具:把 ≥3 章的小说自动转换为结构化剧本(YAML),产出可编辑、可二次打磨的剧本初稿。 前端把它可视化成国内电视剧/短剧文本格式,并支持上传文件、实时进度、暂停续跑与导出。
设计文档:
docs/DESIGN.md;剧本 Schema:docs/SCHEMA.md;接口:docs/API.md;前端:docs/FRONTEND.md。
📺 演示视频:https://www.bilibili.com/video/BV1ZBEt6REX2/
| 生成前(上传 / 粘贴小说) | 生成完成(短剧格式剧本) |
|---|---|
![]() |
![]() |
- 小说 → 剧本:输入整本小说(≥3 章),自动切分章节、逐章转写为结构化剧本 YAML。
- 两种输入:粘贴原文,或上传文件(
.txt/.epub),自动识别编码(UTF-8 / GB18030 / GBK)。 - 记忆驱动的一致性:跨章维护人物/关系/能力/剧情主线,姓名与设定不漂移。
- 实时进度:SSE 流式「打字机」直播当前章生成,进度条 + 按章查看已生成剧本。
- 暂停 / 续跑:随时暂停(真正停止生成、保留已完成章),之后从断点章继续;失败的作业同样可续跑。
- 剧本可视化:按国内剧组通用的短剧文本格式渲染(场次/场景/时间/人物 +
[画面/动作]+角色:台词),跨章分隔。 - 设定 + 角色:同时产出全局设定集(StoryBible)与逐章累积的角色库(CharacterKB)。
- 任务历史:列出过往作业,随时回看或继续;刷新页面自动恢复。
- 导出:合并「设定 + 剧本」下载为
.yaml(原样)或.txt(可视化剧本排版)。 - 容错:LLM 瞬时错误(429/5xx/断连/超时)指数退避自动重试;模型 JSON 小瑕疵自动修复。
单进程二进制(cmd/server):Gin API + 进程内队列 + Worker 合一。由于队列只记录需要完成的小说章节,任务量太少,不依赖 Redis;唯一持久化是 SQLite。事件记忆是一个可选的 Python gRPC 旁路服务。
三阶段流水线(Worker · Eino 编排):
端到端系统流程:
- 异步前后端分离:转换是分钟级长任务,绝不放在 HTTP 请求里。API 入队即返回
jobId,Worker 后台跑,前端轮询 + SSE 看进度。队列与实时进度走进程内 channel + pub/sub(internal/queue,零外部依赖)。 - 三阶段流水线(
internal/pipeline):Phase 0 通读全文产出全局StoryBible;Phase 1 逐章「召回→组装→生成→记忆更新」;Phase 2 合并所有场景为单个screenplay.yaml并做一致性/Schema 校验。 - 三类记忆(
internal/memory,DESIGN §3):EventMemory = mem0(精确旧事实、语义召回,经mem0svcgRPC);CharacterKB = 结构化角色库(逐章增量 diff 合并);RollingSummary = 单层滚动摘要(按全文体量动态预算)。 - 持久化与可恢复(
internal/store):Store接口 + SQLite(modernc.org/sqlite,纯 Go 免 CGO)/ 内存双实现。作业、进度、设定、摘要、角色、已生成场景都落库——进程重启或暂停后能从断点章续跑。 - 统一 LLM 层(
internal/llm):包 Eino 的 OpenAI ChatModel,统一走 OpenAI 兼容/chat/completions(可配BaseURL);内置瞬时错误指数退避重试。 - 文件加载(
pipeline/loader.go):内置正则 + AI 兜底做章节切分;LoadBytes解码 GB18030/GBK 并用标准库archive/zip解析 epub。 - 前端(
frontend/):React 19 + Vite,单页状态机;剧本以短剧文本格式可视化(screenplay.tsx)。
记忆子系统(三件套分工):
backend/ Go 后端(module …/backend,Go 1.26)
cmd/server/ 单进程入口:Gin API + 进程内队列 + Worker
internal/{api,queue,pipeline,memory,store,schema,llm,config}/
gen/ protoc 生成的 gRPC 代码(mem0.proto)
frontend/ React + TypeScript(Vite)
mem0svc/ Python gRPC 服务,封装 mem0 SDK(事件记忆)
proto/ Go ↔ Python 的 gRPC 契约(mem0.proto)
docs/ DESIGN / SCHEMA / API / FRONTEND / PLAN
三个服务(mem0svc / backend / frontend)一并起,无需本地装 Go/Node/Python:
cp .env.example .env # 填入 OPENAI_API_KEY(MEM0_API_KEY 可选)
docker compose up --build
# 前端 http://localhost:5173 · 后端 http://localhost:8080- SQLite 持久化到本机
backend/data/(绑定挂载),作业可断点续跑;停服docker compose down。 - 不配
MEM0_API_KEY时事件记忆自动降级,不影响主流程。 - 自定义后端地址:构建前设
VITE_API_BASE(默认http://localhost:8080/api/v1)。 - LLM 调优(
.env可选):LLM_TIMEOUT_SECONDS(单次调用超时,默认 300)、LLM_MAX_RETRIES(瞬时错误重试次数,默认 10)。
1) 后端(Go ≥ 1.26) — 需先准备配置:
cd backend
cp configs/config.example.yaml configs/config.yaml # 填入 LLM api_key(或设环境变量 OPENAI_API_KEY)
go run ./cmd/server # API + 队列 + Worker,:8080(可用 API_ADDR 覆盖)
curl localhost:8080/api/v1/health # => {"status":"ok"}2) 前端(Node ≥ 20):
cd frontend
npm install
npm run dev # Vite :5173 → 浏览器打开(CORS 已放开,直连 :8080)3) 事件记忆服务(可选,Python ≥ 3.10) — 不启动则 Go 端优雅降级(无语义召回,不影响主流程):
cd mem0svc
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # 填 MEM0_API_KEY
python server.py # gRPC :50051- Gin — HTTP Web 框架(API 层)。
- Viper — 配置读取(
configs/*.yaml+ 环境变量覆盖)。 - goccy/go-yaml — 剧本/设定的 YAML 编解码。
- golang.org/x/text — 小说文件 GB18030/GBK → UTF-8 转码。
- modernc.org/sqlite — 纯 Go SQLite 驱动(免 CGO),持久化作业/进度/状态。
- Eino + eino-ext/model/openai — LLM 编排框架;
internal/llm用其 OpenAI ChatModel 统一发起/chat/completions。 - gRPC-Go + google.golang.org/protobuf — 调用
mem0svc的 gRPC 客户端与 protobuf 运行时。
- mem0 (
mem0ai) — 事件/语义记忆 SDK。 - grpcio / grpcio-tools — Python gRPC 服务端与代码生成。
- python-dotenv — 读取
.env。
- React + TypeScript — UI 框架与类型系统。
- Vite — 构建/开发脚手架(react-ts 模板)。
- serve — 仅在 Docker 前端镜像里托管打包后的静态产物(
serve -s dist)。
- 记忆驱动的逐章转换流水线(全局预分析 → 逐章 召回/组装/生成/记忆更新 → 汇总)。
- 三类记忆的分工设计:EventMemory(mem0) / CharacterKB(结构化角色库) / RollingSummary(动态预算单层滚动摘要)。
- 剧本 YAML Schema 设计(
docs/SCHEMA.md)与短剧文本格式可视化。 - 暂停/续跑(每作业可取消上下文)、LLM 瞬时错误重试、epub/编码解析、断点恢复等编排与实现。
- 上述组件的 Go 实现、Gin 接口编排与前端集成均为本项目原创。
第三方库仅用于通用能力(Web 框架、LLM 编排、记忆服务、构建工具);改编逻辑、记忆编排、Schema 与可视化为原创。





