# LLM Workflow Engine

一个功能强大的 LLM 聊天工作流引擎，兼容 SillyTavern 生态系统。

## 📋 目录

- [功能特性](#功能特性)
- [技术栈](#技术栈)
- [快速开始](#快速开始)
- [项目结构](#项目结构)
- [核心功能](#核心功能)
- [开发指南](#开发指南)
- [配置说明](#配置说明)
- [常见问题](#常见问题)

---

## 功能特性

### 🎯 核心功能

- **多模型支持** - 兼容 OpenAI、Claude、Gemini 等多种 LLM API
- **角色卡系统** - 完整的角色创建、导入、导出功能（兼容 SillyTavern 格式）
- **聊天管理** - 多聊天切换、历史总结、消息编辑
- **预设系统** - 灵活的提示词组件管理，支持拖拽排序
- **世界书** - 动态世界知识注入系统
- **正则替换** - 强大的文本处理规则系统（完全兼容 SillyTavern）

### ✨ 高级功能

- **酒馆助手（Tavern Helper）**
  - JavaScript 沙盒执行引擎
  - 提示词模板系统（支持 `{{var}}`、`{{roll}}`、`{{random}}` 等语法）
  - 脚本管理（全局/角色/预设三种作用域）
  - 代码块渲染功能
  
- **多主题支持** - 完整的 CSS 变量主题系统
- **流式输出** - 实时显示 AI 生成内容
- **消息 Swipes** - 多版本切换和重roll功能
- **API 配置管理** - 安全的 API Key 存储和加密

### 🔒 安全特性

- API Key 加密存储（Fernet 对称加密）
- JavaScript 沙盒隔离执行
- 危险 API 拦截机制
- 环境变量安全管理

---

## 技术栈

### 后端

- **框架**: FastAPI (Python 3.11+)
- **数据库**: 文件系统 + JSON（轻量级，易于备份）
- **WebSocket**: 实时流式通信
- **加密**: Fernet 对称加密（cryptography 库）
- **依赖管理**: pip + requirements.txt

### 前端

- **框架**: React 18 + Vite
- **状态管理**: Zustand（轻量级 Redux 替代）
- **样式**: CSS3 + CSS 变量（支持多主题）
- **Markdown**: react-markdown + remark-gfm
- **HTTP 客户端**: Fetch API

### 部署

- **容器化**: Docker + Docker Compose
- **反向代理**: Nginx
- **开发服务器**: Vite HMR

---

## 快速开始

### 环境要求

- Python 3.11+
- Node.js 18+
- Docker & Docker Compose（可选）

### 本地开发

#### 1. 克隆项目

```bash
git clone https://github.com/your-repo/llm-workflow-engine.git
cd llm-workflow-engine
```

#### 2. 后端启动

```bash
# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 安装依赖
pip install -r backend/requirements.txt

# 启动服务
cd backend
python main.py
```

后端服务将在 `http://localhost:23338` 启动。

#### 3. 前端启动

```bash
cd frontend

# 安装依赖
npm install

# 启动开发服务器
npm run dev
```

前端将在 `http://localhost:5173` 启动，自动代理 API 请求到后端。

### Docker 部署

```bash
# 一键启动
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down
```

访问 `http://localhost:80` 即可使用。

---

## 项目结构

```
llm-workflow-engine/
├── backend/                    # 后端服务
│   ├── api/                   # API 路由
│   │   └── routes/           # 路由处理
│   ├── core/                 # 核心配置
│   ├── models/               # 数据模型
│   ├── services/             # 业务逻辑
│   │   ├── chat_service.py          # 聊天服务
│   │   ├── js_sandbox.py            # JavaScript 沙盒
│   │   ├── script_manager.py        # 脚本管理器
│   │   ├── regex_service.py         # 正则服务
│   │   └── ...
│   ├── utils/                # 工具函数
│   ├── main.py               # 应用入口
│   └── requirements.txt      # Python 依赖
│
├── frontend/                  # 前端应用
│   ├── src/
│   │   ├── components/       # React 组件
│   │   │   ├── Mid/         # 中间区域（聊天框）
│   │   │   ├── SideBarLeft/ # 左侧边栏
│   │   │   │   └── tabs/   # 标签页组件
│   │   │   │       └── TavernHelper/  # 酒馆助手
│   │   │   ├── SideBarRight/# 右侧边栏
│   │   │   └── TopBar/      # 顶部栏
│   │   ├── Store/           # Zustand 状态管理
│   │   ├── styles/          # 全局样式
│   │   ├── types/           # TypeScript 类型定义
│   │   ├── utils/           # 工具函数
│   │   ├── App.jsx          # 根组件
│   │   └── main.jsx         # 应用入口
│   ├── package.json         # Node.js 依赖
│   └── vite.config.js       # Vite 配置
│
├── data/                     # 数据目录（运行时生成）
│   ├── chat/                # 聊天记录
│   ├── preset/              # 预设文件
│   ├── worldbooks/          # 世界书
│   ├── regex/               # 正则规则
│   └── ...
│
├── docker-compose.yml        # Docker 编排
├── .env.example             # 环境变量示例
├── .gitignore               # Git 忽略文件
└── README.md                # 项目文档
```

---

## 核心功能

### 1. 酒馆助手（Tavern Helper）

完全兼容 SillyTavern 酒馆助手的提示词模板系统。

#### 支持的语法

| 语法 | 功能 | 示例 |
|------|------|------|
| `{{var}}` 或 `{{getvar::key}}` | 获取变量 | `{{name}}` |
| `{{setvar::key::value}}` | 设置变量 | `{{setvar::age::25}}` |
| `{{delvar::key}}` | 删除变量 | `{{delvar::temp}}` |
| `{{random::a,b,c}}` | 随机选择（逗号） | `{{random::苹果,香蕉,橙子}}` |
| `{{pick::a\|b\|c}}` | 随机选择（竖线） | `{{pick::剑\|斧\|弓}}` |
| `{{roll XdY}}` | 掷骰子 | `{{roll 3d6}}` |
| `{{// 注释}}` | 注释（不输出） | `{{// 这是注释}}` |

#### 使用示例

```python
from backend.services.js_sandbox import JSSandboxExecutor

sandbox = JSSandboxExecutor()

template = """
{{setvar::character::勇者}}
{{setvar::weapon::{{random::剑,斧,弓}}}}
{{character}}手持{{weapon}}，掷出了：{{roll 1d20}}
{{// 这是注释，不会显示}}
""".strip()

result = sandbox.render_template(template)
print(result)
# 输出: 勇者手持剑，掷出了：15
```

#### 脚本管理

支持三种作用域的脚本：

- **GLOBAL** - 全局脚本，对所有聊天可用
- **CHARACTER** - 角色脚本，绑定到当前角色卡
- **PRESET** - 预设脚本，绑定到当前预设

详细文档：[TAVERN_HELPER_IMPLEMENTATION.md](./TAVERN_HELPER_IMPLEMENTATION.md)

### 2. 正则替换系统

强大的文本处理规则，完全兼容 SillyTavern 格式。

#### 应用位置（placement）

- `0` - System Prompt（系统提示词）
- `1` - User Input（用户输入）
- `2` - AI Output（AI 输出）
- `3` - Quick Reply（快捷回复）
- `4` - World Info（世界书信息）
- `5` - Reasoning/Thinking（推理/思考内容）

#### 规则示例

```json
{
  "id": "hide-thinking-001",
  "scriptName": "隐藏思考标签",
  "findRegex": "<thinking>[\\s\\S]*?<\\/thinking>",
  "replaceString": "",
  "placement": [2],
  "substituteRegex": 0,
  "markdownOnly": false,
  "promptOnly": false,
  "disabled": false
}
```

### 3. 预设系统

灵活的提示词组件管理。

#### 特性

- 多组件拖拽排序
- 角色字段支持（system/user/assistant）
- 注入位置控制（injection_position）
- 注入深度控制（injection_depth）
- 触发条件（injection_trigger）
- 完全兼容 SillyTavern 预设格式

### 4. 聊天管理

完整的聊天生命周期管理。

#### 功能

- 多聊天切换
- 消息编辑和保存
- 消息 Swipes（多版本）
- 右键菜单（编辑/复制/重roll/删除）
- 历史总结
- 智能滚动

---

## 开发指南

### API 路由

所有 API 路由定义在 `backend/api/routes/` 目录下：

- `chatWsRoute.py` - WebSocket 聊天（流式输出）
- `chatsRoute.py` - 聊天管理
- `charactersRoute.py` - 角色卡管理
- `presetsRoute.py` - 预设管理
- `worldbooksRoute.py` - 世界书管理
- `regexRoute.py` - 正则规则管理
- `apiConfigRoute.py` - API 配置管理

### 状态管理

前端使用 Zustand 进行状态管理，store 定义在 `frontend/src/Store/`：

```
Store/
├── Mid/              # 中间区域状态
│   ├── ChatBoxSlice.jsx      # 聊天框状态
│   └── ChatBoxUISlice.jsx    # 聊天框 UI 状态
├── SideBarLeft/      # 左侧边栏状态
├── SideBarRight/     # 右侧边栏状态
└── TopBar/           # 顶部栏状态
```

### 样式系统

使用 CSS 变量实现多主题：

```css
:root {
  --color-bg-primary: #ffffff;
  --color-text-primary: #1a1a1a;
  --color-accent: #667eea;
  /* ... */
}

[data-color-theme='dark'] {
  --color-bg-primary: #1a1a1a;
  --color-text-primary: #ffffff;
  /* ... */
}
```

---

## 配置说明

### 环境变量

创建 `.env` 文件（从 `.env.example` 复制）：

```env
# 后端配置
HOST=0.0.0.0
PORT=23338
DEBUG=True

# 前端代理
VITE_API_URL=http://localhost:23338

# API 加密密钥（自动生成，不要手动修改）
FERNET_KEY=your_generated_key_here
```

### API 配置

API Key 通过前端界面配置，自动加密存储到 `data/apiconfig/` 目录。

⚠️ **注意**：`data/apiconfig/*.json` 已添加到 `.gitignore`，不会被提交到版本控制。

---

## 常见问题

### 1. 前端无法连接后端

**问题**: 前端请求返回 404 或网络连接错误

**解决**:
```bash
# 检查后端是否运行
curl http://localhost:23338/api/health

# 检查前端代理配置
cat frontend/vite.config.js
```

### 2. API Key 不生效

**问题**: 配置了 API Key 但仍然无法调用 LLM

**解决**:
1. 检查 API 配置文件是否存在：`data/apiconfig/`
2. 检查加密密钥是否正确：`.env` 中的 `FERNET_KEY`
3. 重启后端服务

### 3. Docker 部署后无法访问

**问题**: `docker-compose up` 后无法访问服务

**解决**:
```bash
# 查看容器状态
docker-compose ps

# 查看日志
docker-compose logs -f backend
docker-compose logs -f frontend

# 重新构建
docker-compose up -d --build
```

### 4. 正则规则不生效

**问题**: 配置了正则规则但没有效果

**解决**:
1. 检查规则是否启用（disabled: false）
2. 检查 placement 是否正确
3. 检查正则表达式语法
4. 重启后端服务

---

## 贡献指南

1. Fork 项目
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启 Pull Request

---

## 许可证

本项目遵循与 SillyTavern 相同的分发协议。

---

## 致谢

- [SillyTavern](https://github.com/SillyTavern/SillyTavern) - 优秀的开源项目，提供了设计灵感和兼容标准
- [JS-Slash-Runner](https://github.com/N0VI028/JS-Slash-Runner) - Tavern Helper 扩展，提供了 JavaScript 沙盒实现参考

---

**最后更新**: 2026-05-05  
**版本**: 1.0.0
