Files
sillytavern-repalice/README.md
2026-04-26 03:34:47 +08:00

280 lines
8.7 KiB
Markdown
Raw Permalink 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.
# SillyTavern Repalice
一个基于 SillyTavern 灵感的 AI 角色扮演聊天应用,具有自定义扩展功能。
## 🏗️ 技术栈
- **前端**: Vue 3 + Vite + TypeScript + Pinia
- **后端**: NestJS + TypeScript
- **共享层**: Zod schemas + TypeScript types
- **LLM**: Vercel AI SDK v4
- **持久化**: 本地文件系统(无数据库)
- **部署**: Docker Compose
## 📁 项目结构
```
sillytavern-repalice/
├── shared/ # 前后端共享模块
│ ├── types/ # TypeScript 类型定义
│ │ ├── sillytavern.types.ts # SillyTavern 兼容格式
│ │ ├── internal.types.ts # 项目内部扩展格式
│ │ └── converters.ts # 数据转换器
│ ├── schemas/ # Zod 运行时验证 schemas
│ │ ├── sillytavern.schemas.ts
│ │ └── internal.schemas.ts
│ └── index.ts # 统一导出
├── server/ # 后端 NestJS 应用
│ ├── src/
│ │ ├── modules/ # 业务模块
│ │ │ ├── chat/ # 聊天管理
│ │ │ ├── character/ # 角色卡管理
│ │ │ ├── llm/ # LLM 集成
│ │ │ ├── import-export/ # 导入导出
│ │ │ └── workflow/ # 工作流引擎
│ │ ├── persistence/ # 持久化层
│ │ │ ├── interfaces/ # 仓储接口
│ │ │ ├── implementations/ # 具体实现
│ │ │ └── file-system/ # 文件系统实现
│ │ ├── controllers/ # 路由控制器
│ │ ├── services/ # 业务逻辑服务
│ │ ├── core/ # 核心基础设施
│ │ │ ├── config/ # 配置管理
│ │ │ ├── filters/ # 异常过滤器
│ │ │ ├── interceptors/ # 拦截器
│ │ │ ├── guards/ # 守卫
│ │ │ └── di/ # 依赖注入 tokens
│ │ ├── tools/ # 工具层
│ │ │ ├── context-chunker.ts # 上下文分块
│ │ │ ├── prompt-assembler.ts # 提示词组装
│ │ │ └── token-counter.ts # Token 计数
│ │ ├── dto/ # 数据传输对象
│ │ └── interfaces/ # 接口定义
│ └── test/ # 测试文件
│ ├── unit/ # 单元测试
│ ├── integration/ # 集成测试
│ └── e2e/ # 端到端测试
├── client/ # 前端 Vue3 应用
│ ├── src/
│ │ ├── components/ # 组件
│ │ │ ├── TopBar/ # 顶部栏
│ │ │ ├── LeftPanel/ # 左侧面板(角色列表、聊天历史)
│ │ │ ├── CenterPanel/ # 中央面板(聊天界面)
│ │ │ ├── RightPanel/ # 右侧面板(角色详情、工作流编辑器)
│ │ │ └── common/ # 通用组件
│ │ ├── layouts/ # 布局组件
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── router/ # 路由配置
│ │ ├── composables/ # 组合式函数
│ │ ├── api/ # API 客户端
│ │ ├── utils/ # 工具函数
│ │ ├── constants/ # 常量定义
│ │ ├── styles/ # 全局样式
│ │ ├── App.vue # 根组件
│ │ └── main.ts # 入口文件
│ └── public/ # 静态资源
├── data/ # 持久化数据目录(运行时生成)
│ ├── characters/ # 角色卡数据
│ ├── chats/ # 聊天记录
│ ├── worldinfo/ # 世界书数据
│ ├── presets/ # 预设配置
│ └── workflows/ # 工作流定义
├── docker/ # Docker 配置
│ ├── backend.Dockerfile
│ ├── frontend.Dockerfile
│ └── nginx/
│ └── default.conf
├── docker-compose.yml # Docker Compose 配置
├── package.json # 根 package.json (monorepo)
└── .env.example # 环境变量示例
```
## 🚀 快速开始
### 前置要求
- Node.js >= 20.x
- npm >= 10.x
- Docker & Docker Compose (可选,用于容器化部署)
### 本地开发
1. **克隆仓库**
```bash
git clone <repository-url>
cd sillytavern-repalice
```
2. **安装依赖**
```bash
npm install
```
3. **配置环境变量**
```bash
cp .env.example .env
# 编辑 .env 文件,填入你的 LLM API 密钥
```
4. **启动开发服务器**
```bash
# 同时启动前后端
npm run dev
# 或者分别启动
npm run dev:server # 后端 http://localhost:3000
npm run dev:client # 前端 http://localhost:5173
# Docker 部署后访问
# 后端: http://localhost:3000
# 前端: http://localhost:23337
```
### Docker 部署
#### 中国大陆用户特别说明
由于网络原因,在中国大陆构建 Docker 镜像可能会遇到依赖下载缓慢或卡死的问题。项目已针对此情况进行了优化:
1. **自动使用国内镜像源**:通过 `.npmrc` 文件配置 `https://registry.npmmirror.com` 作为 npm 镜像源
2. **简化构建流程**:移除 BuildKit cache mount使用更稳定的方式
3. **提供一键构建脚本**
```bash
# Windows 用户PowerShell
.\build-docker.ps1
# Windows 用户CMD
build-docker.bat
# Linux/Mac 用户
chmod +x build-docker.sh
./build-docker.sh
```
4. **详细的故障排除指南**:如果构建仍然失败,请参考 [TROUBLESHOOTING.md](./TROUBLESHOOTING.md)
#### 标准部署流程
```bash
# 构建镜像
npm run docker:build
# 启动服务
npm run docker:up
# 查看日志
npm run docker:logs
# 停止服务
npm run docker:down
```
## 📊 数据架构
### 双格式设计
本项目采用**双数据格式**设计:
1. **SillyTavern 兼容格式** (`shared/types/sillytavern.types.ts`)
- 严格遵循 SillyTavern 官方规范
- 用于导入导出,确保兼容性
- 包含:角色卡 V2/V3、世界书、聊天记录 JSONL
2. **项目内部格式** (`shared/types/internal.types.ts`)
- 继承 SillyTavern 格式并扩展
- 添加自定义字段和功能
- 支持激活方式枚举、RAG 配置、逻辑表达式、工作流等
3. **数据转换器** (`shared/types/converters.ts`)
- 在两种格式之间无缝转换
- 保证导入导出的完整性
### 核心数据类型
- **WorldInfo (世界书)**: 支持 4 种激活方式永久、关键词、RAG、逻辑表达式
- **CharacterCard (角色卡)**: 扩展了分类标签、输出 schema、头像管理等
- **ChatLog (聊天记录)**: 结构化存储,支持表头数据和消息 swipe
- **Workflow (工作流)**: 可视化编排,支持并行执行和动态拼接
- **GenerationPreset (预设)**: LLM 采样参数配置
## 🏛️ 架构设计原则
### MVC 分层架构
- **Model (模型层)**:
- Services (`server/src/services/`)
- Persistence (`server/src/persistence/`)
- **View (视图层)**:
- Components (`client/src/components/`)
- Layouts (`client/src/layouts/`)
- **Controller (控制层)**:
- Controllers (`server/src/controllers/`)
- Router (`client/src/router/`)
### 依赖注入
- 后端使用 NestJS 内置 DI 容器
- 通过 `@Inject()` 装饰器和 Injection Tokens 实现松耦合
- 便于单元测试和模块替换
### 工具层分离
- **Tools Layer** (`server/src/tools/`):
- Context Chunker: 上下文分块管理
- Prompt Assembler: 提示词动态组装
- Token Counter: Token 计数和优化
## 🔧 开发指南
### 添加新功能模块
1. 在 `shared/types/` 中定义类型
2. 在 `shared/schemas/` 中添加 Zod schema
3. 创建后端模块: `server/src/modules/<feature>/`
4. 创建前端组件: `client/src/components/<Feature>/`
5. 实现数据转换器(如需要)
### 测试
```bash
# 运行所有测试
npm test
# 单元测试
cd server && npm run test
# E2E 测试
cd server && npm run test:e2e
```
## 📝 待办事项
当前项目已完成基础架构搭建,后续需要实现:
- [ ] 完整的角色卡 CRUD 操作
- [ ] 聊天界面的实时交互
- [ ] 世界书的可视化管理
- [ ] Vercel AI SDK 集成
- [ ] 工作流编辑器
- [ ] RAG 库管理
- [ ] 导入导出功能
- [ ] 数据迁移工具
## 📄 许可证
MIT
## 🙏 致谢
- [SillyTavern](https://github.com/SillyTavern/SillyTavern) - 灵感来源
- [Vercel AI SDK](https://sdk.vercel.ai/docs) - LLM 抽象层
- [NestJS](https://nestjs.com/) - 后端框架
- [Vue 3](https://vuejs.org/) - 前端框架