Luxx/assets/DATABASE.md

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() # 创建所有表
```