312 lines
8.3 KiB
Markdown
312 lines
8.3 KiB
Markdown
# Luxx 数据库设计文档
|
|
|
|
## 1. 数据库概述
|
|
|
|
- **类型**: SQLite
|
|
- **ORM**: SQLAlchemy 2.0
|
|
- **连接字符串**: `sqlite:///./chat.db`
|
|
|
|
## 2. ER 关系图
|
|
|
|
```mermaid
|
|
erDiagram
|
|
USER {
|
|
int id PK
|
|
string username UK
|
|
string email UK
|
|
string password_hash
|
|
string role
|
|
int permission_level
|
|
string workspace_path
|
|
bool is_active
|
|
datetime created_at
|
|
}
|
|
|
|
LLM_PROVIDER {
|
|
int id PK
|
|
int user_id FK
|
|
string name
|
|
string provider_type
|
|
string base_url
|
|
string api_key
|
|
string default_model
|
|
int max_tokens
|
|
bool is_default
|
|
bool enabled
|
|
datetime created_at
|
|
}
|
|
|
|
PROJECT {
|
|
string id PK
|
|
int user_id FK
|
|
string name
|
|
string description
|
|
datetime created_at
|
|
}
|
|
|
|
CONVERSATION {
|
|
string id PK
|
|
int user_id FK
|
|
int provider_id FK
|
|
string title
|
|
string model
|
|
text system_prompt
|
|
float temperature
|
|
bool thinking_enabled
|
|
datetime created_at
|
|
}
|
|
|
|
MESSAGE {
|
|
string id PK
|
|
string conversation_id FK
|
|
string role
|
|
text content
|
|
int token_count
|
|
string usage
|
|
datetime created_at
|
|
}
|
|
|
|
AGENT {
|
|
string id PK
|
|
string name
|
|
string role
|
|
string avatar
|
|
text system_prompt
|
|
int provider_id FK
|
|
string model
|
|
string tools
|
|
bool is_active
|
|
int priority
|
|
bool auto_response
|
|
bool mention_trigger
|
|
float temperature
|
|
int max_tokens
|
|
}
|
|
|
|
CHAT_ROOM {
|
|
string id PK
|
|
string name
|
|
string description
|
|
int owner_id FK
|
|
bool is_active
|
|
datetime created_at
|
|
}
|
|
|
|
CHAT_ROOM_AGENT {
|
|
string id PK
|
|
string chat_room_id FK
|
|
string agent_id FK
|
|
bool is_active
|
|
datetime joined_at
|
|
}
|
|
|
|
CHAT_ROOM_MESSAGE {
|
|
string id PK
|
|
string room_id FK
|
|
string sender_type
|
|
string sender_id
|
|
string sender_name
|
|
text content
|
|
string mentions
|
|
string parent_id
|
|
int token_count
|
|
datetime created_at
|
|
}
|
|
|
|
USER ||--o{ LLM_PROVIDER : has
|
|
USER ||--o{ PROJECT : owns
|
|
USER ||--o{ CONVERSATION : creates
|
|
USER ||--o{ CHAT_ROOM : owns
|
|
USER ||--o{ AGENT : creates
|
|
LLM_PROVIDER ||--o{ CONVERSATION : powers
|
|
LLM_PROVIDER ||--o{ AGENT : configures
|
|
CONVERSATION ||--o{ MESSAGE : contains
|
|
CHAT_ROOM ||--o{ CHAT_ROOM_MESSAGE : contains
|
|
CHAT_ROOM ||--o{ CHAT_ROOM_AGENT : has
|
|
AGENT ||--o{ CHAT_ROOM_AGENT : joins
|
|
```
|
|
|
|
## 3. 表设计
|
|
|
|
### users 用户表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | INTEGER | PK | 用户 ID |
|
|
| username | VARCHAR(50) | UNIQUE, NOT NULL | 用户名 |
|
|
| email | VARCHAR(120) | UNIQUE | 邮箱 |
|
|
| password_hash | VARCHAR(255) | - | 密码哈希 |
|
|
| role | VARCHAR(20) | DEFAULT 'user' | 角色 |
|
|
| permission_level | INTEGER | DEFAULT 1 | 权限等级 |
|
|
| workspace_path | VARCHAR(500) | - | 工作空间路径 |
|
|
| is_active | BOOLEAN | DEFAULT 1 | 是否激活 |
|
|
| created_at | DATETIME | - | 创建时间 |
|
|
|
|
**权限等级:** 1=READ_ONLY, 2=WRITE, 3=EXECUTE, 4=ADMIN
|
|
|
|
### llm_providers LLM 提供商表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | INTEGER | PK | 提供商 ID |
|
|
| user_id | INTEGER | FK(users.id) | 所属用户 |
|
|
| name | VARCHAR(100) | NOT NULL | 提供商名称 |
|
|
| provider_type | VARCHAR(50) | NOT NULL | 类型 |
|
|
| base_url | VARCHAR(500) | NOT NULL | API 地址 |
|
|
| api_key | VARCHAR(500) | NOT NULL | API 密钥 |
|
|
| default_model | VARCHAR(100) | NOT NULL | 默认模型 |
|
|
| max_tokens | INTEGER | DEFAULT 8192 | 最大 token |
|
|
| is_default | BOOLEAN | DEFAULT 0 | 是否默认 |
|
|
| enabled | BOOLEAN | DEFAULT 1 | 是否启用 |
|
|
|
|
### projects 项目表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 项目 ID |
|
|
| user_id | INTEGER | FK(users.id) | 所属用户 |
|
|
| name | VARCHAR(255) | NOT NULL | 项目名称 |
|
|
| description | TEXT | - | 描述 |
|
|
| created_at | DATETIME | - | 创建时间 |
|
|
|
|
### conversations 会话表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 会话 ID |
|
|
| user_id | INTEGER | FK(users.id) | 所属用户 |
|
|
| provider_id | INTEGER | FK(llm_providers.id) | LLM 提供商 |
|
|
| title | VARCHAR(255) | NOT NULL | 会话标题 |
|
|
| model | VARCHAR(64) | NOT NULL | 模型名称 |
|
|
| system_prompt | TEXT | NOT NULL | 系统提示词 |
|
|
| temperature | FLOAT | DEFAULT 0.7 | 温度参数 |
|
|
| max_tokens | INTEGER | DEFAULT 2000 | 最大 token |
|
|
| thinking_enabled | BOOLEAN | DEFAULT 0 | 思维链开关 |
|
|
|
|
### messages 消息表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 消息 ID |
|
|
| conversation_id | VARCHAR(64) | FK(conversations.id) | 所属会话 |
|
|
| role | VARCHAR(16) | NOT NULL | user/assistant/system/tool |
|
|
| content | TEXT | NOT NULL | JSON 格式内容 |
|
|
| token_count | INTEGER | DEFAULT 0 | Token 数 |
|
|
| usage | TEXT | - | Token 使用统计 |
|
|
| created_at | DATETIME | - | 创建时间 |
|
|
|
|
**content 格式:** `{"text": "...", "steps": [...]}`
|
|
|
|
### agents Agent 表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | Agent ID |
|
|
| name | VARCHAR(50) | NOT NULL | 名称 |
|
|
| role | VARCHAR(50) | NOT NULL | 角色类型 |
|
|
| avatar | VARCHAR(500) | - | 头像 URL |
|
|
| system_prompt | TEXT | NOT NULL | 系统提示词 |
|
|
| provider_id | INTEGER | FK(llm_providers.id) | LLM 提供商 |
|
|
| model | VARCHAR(100) | - | 模型 |
|
|
| tools | TEXT | - | 工具列表(JSON 数组) |
|
|
| is_active | BOOLEAN | DEFAULT 1 | 是否启用 |
|
|
| priority | INTEGER | DEFAULT 5 | 优先级 |
|
|
| auto_response | BOOLEAN | DEFAULT 1 | 自动响应 |
|
|
| mention_trigger | BOOLEAN | DEFAULT 0 | @ 触发 |
|
|
| temperature | FLOAT | DEFAULT 0.7 | 温度 |
|
|
| max_tokens | INTEGER | DEFAULT 2048 | 最大 token |
|
|
|
|
### chat_rooms 聊天室表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 聊天室 ID |
|
|
| name | VARCHAR(100) | NOT NULL | 聊天室名称 |
|
|
| description | TEXT | - | 描述 |
|
|
| owner_id | INTEGER | FK(users.id) | 所有者 |
|
|
| is_active | BOOLEAN | DEFAULT 1 | 是否启用 |
|
|
| created_at | DATETIME | - | 创建时间 |
|
|
|
|
### chat_room_agents 聊天室成员表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 关联 ID |
|
|
| chat_room_id | VARCHAR(64) | FK(chat_rooms.id) | 聊天室 ID |
|
|
| agent_id | VARCHAR(64) | FK(agents.id) | Agent ID |
|
|
| is_active | BOOLEAN | DEFAULT 1 | 是否启用 |
|
|
| joined_at | DATETIME | - | 加入时间 |
|
|
|
|
### chat_room_messages 聊天室消息表
|
|
|
|
| 字段 | 类型 | 约束 | 说明 |
|
|
|------|------|------|------|
|
|
| id | VARCHAR(64) | PK | 消息 ID |
|
|
| room_id | VARCHAR(64) | FK(chat_rooms.id) | 聊天室 ID |
|
|
| sender_type | VARCHAR(16) | NOT NULL | user/agent/system |
|
|
| sender_id | VARCHAR(64) | NOT NULL | 发送者 ID |
|
|
| sender_name | VARCHAR(50) | NOT NULL | 发送者名称 |
|
|
| content | TEXT | NOT NULL | 消息内容 |
|
|
| mentions | TEXT | - | @ 提及列表(JSON) |
|
|
| parent_id | VARCHAR(64) | - | 回复的消息 ID |
|
|
| token_count | INTEGER | DEFAULT 0 | Token 数 |
|
|
| created_at | DATETIME | - | 创建时间 |
|
|
|
|
## 4. 流程图
|
|
|
|
### 消息流
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant U as 用户
|
|
participant WS as WebSocket
|
|
participant R as ChatRoomService
|
|
participant A as Agent
|
|
participant LLM as LLM
|
|
|
|
U->>WS: 发送消息
|
|
WS->>R: dispatch
|
|
R->>A: 触发 Agent
|
|
A->>LLM: stream_call
|
|
LLM-->>A: SSE 流
|
|
A-->>WS: process_step
|
|
WS-->>U: 实时推送
|
|
```
|
|
|
|
### Agent 调度
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
A[用户消息] --> B{有 @ 提及?}
|
|
|
|
B -->|是| C[触发指定 Agent]
|
|
B -->|否| D[触发 auto_response Agent]
|
|
|
|
C --> E[并行调用]
|
|
D --> E
|
|
E --> F[流式响应]
|
|
F --> G[聚合结果]
|
|
G --> H[WebSocket 推送]
|
|
```
|
|
|
|
## 5. 索引
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
subgraph indexes[推荐索引]
|
|
I1[users.username UNIQUE]
|
|
I2[users.email UNIQUE]
|
|
I3[conversations.user_id]
|
|
I4[messages.conversation_id]
|
|
I5[chat_rooms.owner_id]
|
|
I6[chat_room_messages.room_id]
|
|
end
|
|
```
|
|
|
|
## 6. 迁移
|
|
|
|
```python
|
|
from luxx.core.database import init_db
|
|
init_db() # 创建所有表
|
|
```
|