# RuoYi Chat 模块

## 模块简介

`ruoyi-chat` 是 PoJie 项目的智能聊天系统模块，提供完整的聊天会话管理、消息处理、知识库集成和实时通信功能。该模块通过集成 `ruoyi-ai` 和 `ruoyi-knowledge` 模块，实现了基于知识库的智能问答系统（RAG），支持多种通信方式（REST API、SSE 流式、WebSocket）。

## 功能特性

### 1. 聊天会话管理 ✅

- ✅ 创建和管理聊天会话
- ✅ 支持多用户并发聊天
- ✅ 会话历史记录和导出
- ✅ 会话状态管理
- ✅ 会话标题自动生成和手动编辑

### 2. 消息处理 ✅

- ✅ 实时消息发送和接收
- ✅ 消息类型支持（文本、图片等）
- ✅ 消息历史查询（支持分页和条件筛选）
- ✅ 消息状态跟踪
- ✅ Token 使用量和成本统计

### 3. 知识库集成（RAG）✅

- ✅ 基于知识库的智能问答
- ✅ 上下文理解和构建
- ✅ 向量相似度搜索
- ✅ 智能回复生成
- ✅ 知识库会话管理
- ✅ 知识库内容搜索
- **内部对接模块**：
  - AI 模块：`AiChatService`（统一聊天接口）
  - 知识库模块：`KnowledgeVectorService`（向量检索）

### 4. 实时通信 ✅

- ✅ **REST API**：标准 HTTP 接口
- ✅ **SSE 流式**：服务器推送事件，支持流式对话（`ChatOpenApiController`）
- ✅ **WebSocket**：STOMP 协议，实时双向通信（`ChatStompController`）

### 5. 使用统计 ✅

- ✅ Token 使用量统计
- ✅ 聊天成本计算
- ✅ 用户活跃度分析
- ✅ 模型使用情况
- ✅ 使用记录导出

### 6. 配置管理 ✅

- ✅ 聊天配置管理（键值对配置）
- ✅ 模型配置管理（模型信息、价格、API 配置）
- ✅ 配置分类管理
- ✅ 配置导入导出

## 目录结构

```
ruoyi-chat/
├─ src/main/java/org/dromara/chat/
│  ├─ controller/         # REST 控制器层
│  │  ├─ AIKnowledgeChatController.java    # 知识库聊天控制器
│  │  ├─ ChatSessionController.java        # 会话管理控制器
│  │  ├─ ChatMessageController.java        # 消息管理控制器
│  │  ├─ ChatOpenApiController.java        # 开放 API 控制器（SSE 流式）
│  │  ├─ ChatStompController.java          # WebSocket 控制器（STOMP）
│  │  ├─ ChatConfigController.java         # 配置管理控制器
│  │  ├─ ChatModelController.java          # 模型管理控制器
│  │  └─ ChatUsageTokenController.java     # Token 使用记录控制器
│  ├─ service/            # 核心业务服务层
│  │  ├─ AiKnowledgeChatService.java       # 知识库聊天服务
│  │  ├─ ChatSessionService.java           # 会话管理服务
│  │  ├─ ChatMessageService.java           # 消息管理服务
│  │  ├─ ChatConfigService.java            # 配置管理服务
│  │  ├─ ChatModelService.java             # 模型管理服务
│  │  ├─ ChatUsageTokenService.java        # Token 使用记录服务
│  │  └─ impl/                             # 服务实现类
│  ├─ domain/             # 领域模型
│  │  ├─ bo/              # 业务对象（Business Object）
│  │  ├─ vo/              # 视图对象（View Object）
│  │  ├─ request/         # 请求对象
│  │  └─ *.java           # 实体类（Entity）
│  ├─ mapper/             # MyBatis Mapper 接口
│  ├─ config/             # 配置类（WebSocket 配置等）
│  └─ client/             # Java SDK（统一网关封装）
│     └─ ChatSdk.java
└─ docs/                  # API 使用说明文档
```

## 模块结构

```
org.dromara.chat
├── controller/              # 控制器层
│   ├── AIKnowledgeChatController.java      # 知识库聊天
│   ├── ChatSessionController.java          # 会话管理
│   ├── ChatMessageController.java          # 消息管理
│   ├── ChatOpenApiController.java          # 开放 API（SSE）
│   ├── ChatStompController.java            # WebSocket（STOMP）
│   ├── ChatConfigController.java           # 配置管理
│   ├── ChatModelController.java            # 模型管理
│   └── ChatUsageTokenController.java       # Token 统计
├── service/                 # 服务层
│   ├── AiKnowledgeChatService.java
│   ├── ChatSessionService.java
│   ├── ChatMessageService.java
│   ├── ChatConfigService.java
│   ├── ChatModelService.java
│   ├── ChatUsageTokenService.java
│   └── impl/                # 服务实现
├── domain/                  # 领域模型
│   ├── bo/                  # 业务对象
│   ├── vo/                  # 视图对象
│   ├── request/             # 请求对象
│   ├── ChatSession.java     # 会话实体
│   ├── ChatMessage.java     # 消息实体
│   ├── ChatConfig.java      # 配置实体
│   ├── ChatModel.java       # 模型实体
│   └── ChatUsageToken.java  # Token 使用实体
├── mapper/                  # MyBatis Mapper
├── config/                  # 配置类
│   └── StompWebSocketConfig.java
└── client/                  # Java SDK
    └── ChatSdk.java
```

## 架构设计

```
┌─────────────────────────────────────────────────────────────┐
│                    Chat Controller Layer                    │
├─────────────────────────────────────────────────────────────┤
│  AIKnowledgeChatController │ ChatSessionController          │
│  ChatMessageController     │ ChatConfigController           │
│  ChatModelController       │ ChatUsageTokenController       │
│  ChatOpenApiController     │ ChatStompController            │
│  (SSE 流式)                │ (WebSocket)                    │
└─────────────────────┬───────────────────────────────────────┘
                      │
┌─────────────────────▼───────────────────────────────────────┐
│                    Service Layer                            │
├─────────────────────────────────────────────────────────────┤
│  AiKnowledgeChatService    │ ChatSessionService             │
│  ChatMessageService        │ ChatConfigService              │
│  ChatModelService          │ ChatUsageTokenService          │
└─────────────────────┬───────────────────────────────────────┘
                      │
┌─────────────────────▼───────────────────────────────────────┐
│                 Integration Layer                           │
├─────────────────────────────────────────────────────────────┤
│              RuoYi AI Module                               │
│              └─ AiChatService                              │
│              └─ AiChatHistoryService                       │
│              └─ AiProviderManager                          │
│                                                             │
│              RuoYi Knowledge Module                        │
│              └─ KnowledgeVectorService                     │
│              └─ KnowledgeInfoService                       │
└─────────────────────────────────────────────────────────────┘
```

## 数据库表结构

### 1. 聊天会话表 (chat_session)

存储用户聊天会话信息。

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键ID |
| user_id | BIGINT | 用户ID |
| session_title | VARCHAR(255) | 会话标题 |
| session_content | TEXT | 会话内容 |
| create_by | BIGINT | 创建者 |
| create_time | DATETIME | 创建时间 |
| update_by | BIGINT | 更新者 |
| update_time | DATETIME | 更新时间 |
| remark | VARCHAR(500) | 备注 |

**索引**：`PRIMARY KEY (id)`

### 2. 聊天消息表 (chat_message)

存储聊天消息记录。

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键ID |
| session_id | BIGINT | 会话ID |
| user_id | BIGINT | 用户ID |
| content | LONGTEXT | 消息内容 |
| role | VARCHAR(255) | 对话角色（user/assistant/system） |
| deduct_cost | DOUBLE(20,2) | 扣除金额（默认 0.00） |
| total_tokens | INT(20) | 累计 Tokens（默认 0） |
| model_name | VARCHAR(255) | 模型名称 |
| create_by | BIGINT | 创建者 |
| create_time | DATETIME | 创建时间 |
| update_by | BIGINT | 更新者 |
| update_time | DATETIME | 更新时间 |
| remark | VARCHAR(500) | 备注 |

**索引**：`PRIMARY KEY (id)`

### 3. 聊天配置表 (chat_config)

存储聊天系统配置（键值对形式）。

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键ID |
| category | VARCHAR(255) | 配置类型 |
| config_name | VARCHAR(255) | 配置名称 |
| config_value | TEXT | 配置值 |
| config_dict | VARCHAR(255) | 说明 |
| create_by | BIGINT | 创建者 |
| create_time | DATETIME | 创建时间 |
| update_by | BIGINT | 更新者 |
| update_time | DATETIME | 更新时间 |
| remark | VARCHAR(500) | 备注 |
| version | INT | 版本 |
| del_flag | CHAR(1) | 删除标志（0存在 1删除） |
| update_ip | VARCHAR(128) | 更新IP |

**索引**：
- `PRIMARY KEY (id)`
- `UNIQUE KEY unique_category_key (category, config_name)`

### 4. 聊天模型表 (chat_model)

存储聊天模型配置信息。

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键ID |
| category | VARCHAR(20) | 模型分类 |
| model_name | VARCHAR(50) | 模型名称 |
| model_describe | VARCHAR(255) | 模型描述 |
| model_price | DOUBLE | 模型价格 |
| model_type | CHAR(1) | 计费类型 |
| model_show | CHAR(1) | 是否显示 |
| system_prompt | VARCHAR(255) | 系统提示词 |
| api_host | VARCHAR(255) | 请求地址 |
| api_key | VARCHAR(255) | 密钥 |
| api_url | VARCHAR(50) | 请求后缀 |
| create_by | BIGINT | 创建者 |
| create_time | DATETIME | 创建时间 |
| update_by | BIGINT | 更新者 |
| update_time | DATETIME | 更新时间 |
| remark | VARCHAR(500) | 备注 |

**索引**：`PRIMARY KEY (id)`

### 5. Token 使用记录表 (chat_usage_token)

存储用户 Token 使用统计。

| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | BIGINT | 主键ID |
| user_id | BIGINT | 用户ID |
| token | INT(10) | 待结算 token |
| model_name | VARCHAR(64) | 模型名称 |
| total_token | VARCHAR(255) | 累计使用 token |

**索引**：`PRIMARY KEY (id)`

**数据库脚本位置**：`script/sql/ry_chat.sql`

## API 接口

### 知识库聊天接口 (`/chat/knowledge`)

#### 知识库问答
- **接口**：`POST /chat/knowledge/chat`
- **说明**：基于知识库进行智能问答
- **权限**：`chat:knowledge:chat`
- **参数**：
  - `sessionId` (Long, 必填) - 会话ID
  - `userId` (Long, 必填) - 用户ID
  - `question` (String, 必填) - 问题
  - `knowledgeId` (Long, 必填) - 知识库ID
  - `modelName` (String, 必填) - 模型名称

#### 创建知识库会话
- **接口**：`POST /chat/knowledge/session`
- **说明**：创建知识库聊天会话
- **权限**：`chat:knowledge:session`
- **参数**：
  - `userId` (Long, 必填) - 用户ID
  - `knowledgeId` (Long, 必填) - 知识库ID
  - `sessionTitle` (String, 可选) - 会话标题

#### 搜索知识内容
- **接口**：`GET /chat/knowledge/search`
- **说明**：搜索知识库内容
- **权限**：`chat:knowledge:search`
- **参数**：
  - `knowledgeId` (Long, 必填) - 知识库ID
  - `query` (String, 必填) - 查询内容
  - `limit` (Integer, 可选, 默认5) - 返回数量

#### 构建知识上下文
- **接口**：`GET /chat/knowledge/context`
- **说明**：构建知识库上下文
- **权限**：`chat:knowledge:context`
- **参数**：
  - `knowledgeId` (Long, 必填) - 知识库ID
  - `question` (String, 必填) - 问题

#### 获取聊天历史
- **接口**：`GET /chat/knowledge/history/{sessionId}`
- **说明**：获取知识库聊天历史
- **权限**：`chat:knowledge:history`
- **参数**：
  - `sessionId` (Long, 路径参数) - 会话ID
  - `limit` (Integer, 可选, 默认20) - 返回数量

### 会话管理接口 (`/chat/session`)

- `GET /chat/session/list` - 查询会话列表（分页）
- `GET /chat/session/{id}` - 获取会话详情
- `POST /chat/session` - 创建新会话
- `PUT /chat/session` - 更新会话
- `DELETE /chat/session/{ids}` - 删除会话（批量）
- `POST /chat/session/export` - 导出会话数据

**权限前缀**：`chat:session:*`

### 消息管理接口 (`/chat/message`)

- `GET /chat/message/list` - 查询消息列表（分页）
- `GET /chat/message/{id}` - 获取消息详情
- `POST /chat/message` - 新增消息
- `PUT /chat/message` - 更新消息
- `DELETE /chat/message/{ids}` - 删除消息（批量）
- `POST /chat/message/export` - 导出消息数据

**权限前缀**：`chat:message:*`

### 开放 API 接口 (`/chat`)

#### SSE 流式聊天
- **接口**：`POST /chat/send`
- **说明**：SSE 流式聊天接口，支持 OpenAI 兼容格式
- **认证**：需要登录（`@SaCheckLogin`）
- **响应类型**：`text/event-stream`
- **请求体**：JSON 格式
  ```json
  {
    "model": "gpt-3.5-turbo",
    "messages": [
      {"role": "user", "content": "你好"}
    ],
    "sessionId": "1",
    "temperature": 0.7,
    "max_tokens": 2000
  }
  ```

### WebSocket 接口

#### STOMP 消息映射
- **映射路径**：`/chat/send`
- **说明**：STOMP 协议消息发送
- **订阅主题**：`/topic/session/{sessionId}`
- **配置类**：`StompWebSocketConfig`

### 配置管理接口 (`/chat/config`)

- `GET /chat/config/list` - 查询配置列表（分页）
- `GET /chat/config/{id}` - 获取配置详情
- `POST /chat/config` - 新增配置
- `PUT /chat/config` - 更新配置
- `DELETE /chat/config/{ids}` - 删除配置（批量）
- `POST /chat/config/export` - 导出配置数据

**权限前缀**：`chat:config:*`

### 模型管理接口 (`/chat/model`)

- `GET /chat/model/list` - 查询模型列表（分页）
- `GET /chat/model/{id}` - 获取模型详情
- `POST /chat/model` - 新增模型
- `PUT /chat/model` - 更新模型
- `DELETE /chat/model/{ids}` - 删除模型（批量）
- `POST /chat/model/export` - 导出模型数据

**权限前缀**：`chat:model:*`

### Token 使用记录接口 (`/chat/token`)

- `GET /chat/token/list` - 查询 Token 使用记录列表（分页）
- `GET /chat/token/{id}` - 获取 Token 使用记录详情
- `POST /chat/token` - 新增 Token 使用记录
- `PUT /chat/token` - 更新 Token 使用记录
- `DELETE /chat/token/{ids}` - 删除 Token 使用记录（批量）
- `POST /chat/token/export` - 导出 Token 使用记录数据

**权限前缀**：`chat:token:*`

## 统一网关与协同

### 后端统一网关

Chat 模块可通过 `ruoyi-ai` 模块的统一网关进行对话：

- `POST /api/ai/chat` - 同步聊天
- `POST /api/ai/chat/async` - 异步聊天
- `POST /api/ai/chat/stream` - 流式聊天（SSE）
- `WS /ws/ai/chat` - WebSocket 实时通道

### Chat 模块与 AI/Knowledge 的协同

1. **知识库增强聊天**：
   - 在 `AiKnowledgeChatServiceImpl` 中构建 `AiChatRequest`
   - 调用 `AiChatService.chat`，开启知识库增强（`enableKnowledge=true`）
   - 通过 `KnowledgeVectorService.vectorSimilaritySearch` 进行相关性检索
   - 构建上下文并注入到消息中

2. **聊天历史管理**：
   - 使用 `AiChatHistoryService` 保存和管理聊天记录
   - 支持 Redis 缓存和历史查询

3. **模型管理**：
   - 通过 `AiProviderManager` 获取可用模型列表
   - 支持模型切换和负载均衡

## 使用示例

### 1. 创建知识库会话

```bash
curl -X POST "http://localhost:8080/chat/knowledge/session" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{
    "userId": 1,
    "knowledgeId": 1,
    "sessionTitle": "技术咨询会话"
  }'
```

### 2. 知识库问答

```bash
curl -X POST "http://localhost:8080/chat/knowledge/chat" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "Authorization: Bearer <token>" \
  -d "sessionId=1&userId=1&question=什么是Spring Boot？&knowledgeId=1&modelName=gpt-3.5-turbo"
```

### 3. SSE 流式聊天

```bash
curl -X POST "http://localhost:8080/chat/send" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -H "Accept: text/event-stream" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {"role": "user", "content": "你好，请介绍一下你自己"}
    ],
    "sessionId": "1",
    "temperature": 0.7
  }'
```

### 4. 通过统一网关进行对话

```bash
curl -X POST "http://localhost:8080/api/ai/chat" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <token>" \
  -d '{
    "userId": "1",
    "sessionId": "1",
    "model": "gpt-4o-mini",
    "enableKnowledge": true,
    "knowledgeId": "1",
    "knowledgeLimit": 5,
    "knowledgeThreshold": 0.7,
    "messages": [
      {"role": "user", "content": "什么是Spring Boot？"}
    ]
  }'
```

### 5. 获取聊天历史

```bash
curl -X GET "http://localhost:8080/chat/knowledge/history/1?limit=10" \
  -H "Authorization: Bearer <token>"
```

### 6. 查询会话列表

```bash
curl -X GET "http://localhost:8080/chat/session/list?pageNum=1&pageSize=10" \
  -H "Authorization: Bearer <token>"
```

## Java SDK

### ChatSdk（统一网关封装）

封装类：`org.dromara.chat.client.ChatSdk`

```java
// 初始化 SDK
ChatSdk sdk = new ChatSdk("http://localhost:8080")
    .withToken("Bearer xxx");

// 同步聊天
String result = sdk.chat("{\"model\":\"gpt-4o\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}");

// 流式聊天（SSE）
sdk.chatStream("{\"model\":\"gpt-4o\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}", 
    chunk -> System.out.println(chunk),
    response -> System.out.println("Complete: " + response),
    error -> System.err.println("Error: " + error));
```

## 配置说明

### 应用配置

Chat 模块依赖 `ruoyi-ai` 模块的配置，主要配置在 `application.yml` 中：

```yaml
ruoyi:
  ai:
    # 是否启用 AI 模块
    enabled: true
    
    # 知识库配置
    knowledge:
      enabled: true
      default-search-count: 5
      similarity-threshold: 0.7
      max-context-length: 4000
      
    # 流式响应配置
    stream:
      enabled: true
      buffer-size: 1024
      timeout: 60
```

### WebSocket 配置

WebSocket 配置在 `StompWebSocketConfig` 中：

- **端点路径**：`/ws`
- **消息映射**：`/chat/send`
- **订阅主题**：`/topic/session/{sessionId}`

### 数据库配置

确保已执行 `script/sql/ry_chat.sql` 初始化脚本。

## 依赖模块

### 核心依赖

- **ruoyi-ai**: AI 服务集成
  - `AiChatService` - 统一聊天服务
  - `AiChatHistoryService` - 聊天历史服务
  - `AiProviderManager` - Provider 管理器
- **ruoyi-knowledge**: 知识库服务
  - `KnowledgeVectorService` - 向量检索服务
  - `KnowledgeInfoService` - 知识库信息服务
- **ruoyi-common-core**: 核心工具类
- **ruoyi-common-mybatis**: 数据库操作
- **ruoyi-common-web**: Web 框架支持
- **ruoyi-common-security**: 安全认证（Sa-Token）
- **ruoyi-common-log**: 日志记录
- **ruoyi-common-excel**: Excel 导出

## 开发指南

### 添加新的聊天类型

1. 创建新的 Controller 类，继承 `BaseController`
2. 实现对应的 Service 接口
3. 添加相关的 BO 和 VO 类
4. 配置路由映射和权限注解

### 扩展消息类型

1. 在 `ChatMessage` 实体中添加新字段
2. 更新数据库表结构（修改 `ry_chat.sql`）
3. 修改消息处理逻辑
4. 添加相应的验证规则

### 集成新的 AI 模型

1. 在 `ruoyi-ai` 模块中添加新的 Provider
2. 在 `chat_model` 表中添加模型配置
3. 测试模型兼容性
4. 更新文档

### WebSocket 扩展

1. 在 `StompWebSocketConfig` 中添加新的消息映射
2. 创建对应的 Controller 处理消息
3. 配置订阅主题
4. 更新客户端连接代码

## 认证与权限

### 认证方式

- **登录认证**：基于 Sa-Token，所有写操作需要登录态（`@SaCheckLogin`）
- **权限控制**：管理接口需要相应权限（`@SaCheckPermission`）
- **令牌格式**：`Authorization: Bearer <token>`

### 权限列表

- `chat:knowledge:*` - 知识库聊天权限
- `chat:session:*` - 会话管理权限
- `chat:message:*` - 消息管理权限
- `chat:config:*` - 配置管理权限
- `chat:model:*` - 模型管理权限
- `chat:token:*` - Token 统计权限

### 统一网关权限

统一网关（`/api/ai/*`）需要相应的 AI 模块权限，如 `ai:chat:sync`、`ai:chat:stream` 等。

## 监控和日志

### 关键指标

- 会话创建数量
- 消息发送成功率
- 平均响应时间
- Token 使用量
- 错误率统计
- 知识库检索命中率

### 日志配置

```yaml
logging:
  level:
    org.dromara.chat: DEBUG
    org.dromara.ai: INFO
    org.dromara.knowledge: INFO
```

### 日志记录

- 所有接口调用记录（通过 `@Log` 注解）
- 异常错误日志
- 性能监控日志
- Token 使用日志

## 故障排除

### 常见问题

1. **AI 服务不可用**
   - 检查 `ruoyi-ai` 模块状态
   - 验证 API 密钥配置
   - 查看网络连接
   - 检查 Provider 配置

2. **知识库搜索失败**
   - 确认知识库 ID 有效
   - 检查知识库内容是否已索引
   - 验证搜索权限
   - 查看向量服务状态

3. **会话创建失败**
   - 检查用户权限
   - 验证数据库连接
   - 查看参数格式
   - 检查会话表结构

4. **SSE 流式响应中断**
   - 检查网络连接稳定性
   - 查看超时配置
   - 验证模型响应时间
   - 检查服务器资源

5. **WebSocket 连接失败**
   - 检查 WebSocket 配置
   - 验证 STOMP 端点路径
   - 查看防火墙设置
   - 检查客户端连接代码

### 性能优化

1. **数据库优化**
   - 添加适当索引（session_id, user_id, create_time 等）
   - 定期清理历史数据
   - 使用连接池
   - 考虑分表策略（按时间或用户）

2. **缓存策略**
   - 缓存热门会话
   - 缓存知识库搜索结果
   - 使用 Redis 缓存会话信息
   - 缓存模型配置信息

3. **异步处理**
   - 异步保存消息
   - 后台统计计算
   - 队列处理长任务
   - 异步日志记录

4. **流式响应优化**
   - 调整缓冲区大小
   - 优化模型响应时间
   - 使用连接池管理 SSE 连接
   - 实现背压控制

## 版本历史

- **v1.0.0**: 初始版本，基础聊天功能
- **v1.1.0**: 添加知识库集成（RAG）
- **v1.2.0**: 支持多模型切换
- **v1.3.0**: 增加使用统计功能
- **v1.4.0**: 对接统一 AI 网关与 RAG 能力，完善文档与 SDK
- **v1.5.0**: 添加 SSE 流式支持和 WebSocket 实时通信

## 贡献指南

1. Fork 项目
2. 创建功能分支（`git checkout -b feature/AmazingFeature`）
3. 提交代码变更（`git commit -m 'Add some AmazingFeature'`）
4. 推送到分支（`git push origin feature/AmazingFeature`）
5. 创建 Pull Request
6. 等待代码审查

## 许可证

本项目采用 MIT 许可证，详见 LICENSE 文件。

## 相关文档

- [RuoYi AI 模块文档](../ruoyi-ai/README.md)
- [RuoYi Knowledge 模块文档](../ruoyi-knowledge/README.md)
- [API 使用文档](./docs/API.md)
