# 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 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//` 4. 创建前端组件: `client/src/components//` 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/) - 前端框架