开源项目 · 开发中

BetterTavern

用 SillyTavern 角色卡玩的互动小说。AI 用第一人称写一段故事,结尾给两个选项;想做选项之外的事,可以自己写一句。

目前需要自己运行服务器。手机 App 还没有上架应用商店,用 Expo Go 打开;网页版在本地启动。

iOS · Android · 平板 · 网页
演示 · 段落是预先写好的
雾港守夜人

雾是从海面漫上来的。我走到码头尽头的时候,它已经没过了栏杆。灯塔就在前面,灯却是灭的。 老周在信里说过:雾港的灯一旦灭了,就得有人去点上——可写这封信的人,三天前就不见了。 身后响起一声钟,低沉,潮湿,像是从水底浮上来的。

点选项往下读,也可以改主角的名字、切换夜间模式、打开世界状态。实际使用时,每一段由你配置的模型生成。

角色卡SillyTavern V1、V2、V3,PNG 或 JSON
模型DeepSeek、OpenAI、Grok、Gemini、Hugging Face,或兼容 OpenAI 接口的服务
服务器Python(FastAPI)和 PostgreSQL,可以用 Docker Compose 部署
界面中文 · English · 日本語
01

开始一个故事

需要一张角色卡和主角的名字,其他设置都可以留空。

STEP 1

导入角色卡

支持 SillyTavern 的 V1、V2、V3 角色卡,PNG 或 JSON 文件。卡里的图片用作故事封面,世界书用来搭建开局的世界。

STEP 2

给主角起名字

名字必填。也可以选一个身份(过路的旅人、旧相识……),设定每段写多长、用什么文风。同一张卡可以开好几个故事。

STEP 3

读一段,选一个

AI 用第一人称写下一段,结尾给两个选项。点一个继续;想做别的,点“自己写”。

02

世界状态

开局时,AI 先读角色卡,整理出人物、地点、物品、组织和秘密。之后每一段都参照这些来写,并随剧情更新。

  • 人物、地点、物品、组织,各自记录当前状态
  • 关系图:谁在哪里、谁拿着什么、谁和谁有关系
  • 主角还不知道的秘密默认隐藏,确认后才显示
1 条未揭示的秘密

鼠标移到节点上,相关的关系会高亮;点击查看详情。点一下节点,查看详情和相关的关系。

主角我 · 林深

新来的守夜人。目标:把灯重新点亮。

在灯塔
03

长篇

正文由导演模型写。世界状态、前情摘要和大纲由后台另外整理,不挡下一段;写每一段时,这些都放进上下文,更早的细节导演会去翻原文。

前情摘要

一场戏、一章结束时,后台把前情整理成摘要和全书梗概。原文一直保留;人物和地点的状态另外保存,整理时不会丢。

长程大纲

大纲把主线分成一拍一拍,写每一段时导演都看得到当前这一拍;剧情走偏了,后台会改大纲。还没收回的伏笔另外记在线索表里。

回退

回到前面的某一段重新选。世界状态、摘要和大纲都退回到那一段时的样子。每个存档能回退的次数有上限,默认 1 次。

自己写

选项以外的行动,点“自己写”,用一句话告诉导演你要做什么。

断线续写

网络断了,或者 App 切到后台,回来以后从断的地方接着写,不重复也不缺字。

写结局

在“更多”里点“写结局”,可以说明想要怎样的结局,AI 会写一大段收尾。

04

模型和数据

模型

在“设置 → 模型”里添加:选服务商,贴上 API Key,模型列表会自动出来。可以添加好几个,点一下就能换一个来写故事。费用由模型服务商按用量收取。

sk-…粘贴

Key 加密保存,之后只显示后四位:•••• 3f9a

数据存在哪里

客户端手机、平板、网页
你的服务器故事、世界状态、加密的 Key
模型服务商只收到写这一段需要的前情
  • 故事、世界设定、模型 Key 都保存在你自己运行的服务器上。Key 加密保存,App 里只显示后四位。
  • 只有在写故事的时候,服务器才把需要的前情发给你选的模型服务。
  • 服务器的运行日志不记录故事内容,也不记录 Key。
05

客户端

手机、平板和网页客户端连同一台服务器,账号和故事通用。外观可以跟随系统,也可以固定成浅色或夜间;正文用宋体或黑体,字号可调。

手机

iOS 和 Android

React Native(Expo),两个平台用同一套代码。还没有上架应用商店,目前用 Expo Go 打开。

平板

iPad 和 Android 平板

和手机是同一个 App。屏幕宽的时候正文居中排版,世界面板可以停靠在旁边。

网页

电脑浏览器

有侧栏和键盘快捷键,角色卡文件可以直接拖进窗口导入。本地用 make web 启动。

06

部署

目前没有公共服务,需要在自己的电脑或云主机上运行服务器,客户端连接到它。

需要准备

  • 服务器:Docker;或者 Python 3.12+ 和 uv、PostgreSQL 16
  • 客户端:Node 22.18+;手机上装 Expo Go
  • 模型:一个服务商的 API Key,或者兼容 OpenAI 接口的本地模型

生产环境第一次启动前要生成主密钥和令牌签名密钥。主密钥丢了,已保存的模型 Key 就解不开了,请另外备份。

终端 · Docker
$ git clone https://github.com/Hexthebaldy/BetterTavern.git$ cd BetterTavern# 生成密钥,把输出的两行写进 deploy/.env$ docker compose -f deploy/docker-compose.yml run --rm migrate bettertavern keygen$ docker compose -f deploy/docker-compose.yml up -d# 接口监听 127.0.0.1:8000,对外访问要放在带 TLS 的反向代理后面
07

常见问题

其他问题可以在 GitHub Issues 里提。

不收费,BetterTavern 是开源项目。写故事用的是你自己的模型 Key,费用由模型服务商按用量收取。

是的,目前没有公共服务。故事、世界状态和 Key 都存在你自己运行的服务器上,一台常开的电脑或一台小云主机就够。

还没有上架 App Store 和 Google Play。现在用 Expo Go 打开:在电脑上启动客户端(见上面部署里的“手机”),用手机扫终端里的二维码。手机和电脑要在同一个网络里,或者用 Tailscale 这类组网工具连起来。

SillyTavern 的角色卡:PNG 图片或 JSON 文件,V1、V2、V3 都可以,最大 16 MB。PNG 卡的数据存在图片文件里,压缩过或截图得到的图片会丢掉这些数据,要用原文件。

可以。添加模型时选“自定义兼容端点”,填上兼容 OpenAI 接口的地址。端点在本机或内网时,服务器要设置 ALLOW_PRIVATE_ENDPOINTS=true。

开局时 AI 先整理出世界状态,之后每写完一段,后台都按剧情更新它,下一段参照它来写。一场戏、一章结束时,前情整理成摘要;后台还维护一份大纲,导演写的时候对照;更早的细节,导演会去翻原文。写偏了,可以回到前面某一段重新选。

界面有中文、英文和日文,在“设置 → 语言”里切换。故事正文不限定语言,一般跟着开局时的界面语言、角色卡和你写的话走。

BetterTavern 不收集故事内容。写故事时,需要的前情会发给你选的模型服务商,他们怎么处理数据以各家的条款为准;介意的话,可以用自己电脑上跑的模型。