Change rocket.chat admin logic

This commit is contained in:
ChenKaiLiuG
2026-02-01 08:15:45 +08:00
parent 44ba70efe6
commit f105a7e748
3 changed files with 358 additions and 215 deletions

133
INTRO.md
View File

@@ -7,18 +7,22 @@ TobiichiGPT 將 Open WebUI 這類 AI 對話系統的後端改造成由真人管
### 基本原理
1. **API 中間層** - 提供 OpenAI API 相容端點(`/v1/chat/completions`
2. **訊息轉發** - 將用戶訊息存入資料庫的 `reply_queue` 表格
3. **管理員介面** - 使用對話軟體讓真人管理員查看並回覆
4. **輪詢機制** - API 等待管理員在資料庫中填入回覆後返回給用戶
2. **訊息轉發** - 將用戶訊息轉發到 Rocket.Chat 頻道
3. **管理員介面** - 使用 Rocket.Chat 讓真人管理員查看並回覆
4. **輪詢機制** - API 使用時間戳比較等待管理員在 Rocket.Chat 中回覆
### 技術架構
```
用戶 → Open WebUI → API (FastAPI) → PostgreSQL ← 管理介面 ← 管理員
等待回覆 填寫回覆
返回給用戶 ←──────────────────────────┘
用戶 → Open WebUI → API (FastAPI) → Rocket.Chat ← 管理員
↓ ↓
等待回覆 管理員查看訊息
↓ ↓
輪詢檢查 管理員回覆訊息
↓ ↓
返回給用戶 ←─────────┘
(PostgreSQL 用於記錄追蹤)
```
## 需求分析
@@ -48,21 +52,23 @@ Open WebUI 採用**雙層結構**來組織對話:
理想的管理介面應該呈現:
```
📂 所有對話(按用戶分組
├── 👤 張三 (User A)
│ ├── 💬 對話: "教我 Python" (3 則訊息)
── 💬 對話: "推薦餐廳" (5 則訊息)
│ └── 💬 對話: "旅遊攻略" (2 則訊息)
📂 所有對話(每個對話獨立頻道
├── 💬 張三-chat001 (教我 Python)
│ ├── 💬 張三: "Python 怎麼學?"
── 💬 管理員: "建議從基礎開始..."
── 👤 李四 (User B)
├── 💬 對話: "程式問題" (1 則訊息) ⚠️ 待回覆
└── 💬 對話: "健康諮詢" (4 則訊息)
── 💬 張三-chat002 (推薦餐廳)
├── 💬 張三: "台北有什麼好吃的?"
└── 💬 管理員: "推薦鼎泰豐..."
└── 💬 李四-chat004 (程式問題) ⚠️ 待回覆
└── 💬 李四: "React Hook 怎麼用?"
```
**核心需求**
-用戶分組 - 能看到每個用戶的所有對話
-對話追蹤 - 同一對話的多輪訊息要串在一起
-多層結構 - 支援「用戶 → 對話 → 訊息」的層級關係
-對話隔離 - 每個對話一個獨立頻道
-用戶識別 - 頻道名稱包含用戶名和對話 ID
-簡單直觀 - 不使用 Thread直接在頻道內問答
- ✅ 狀態管理 - 清楚標示哪些對話待回覆
## Rocket.Chat 整合架構
@@ -83,23 +89,26 @@ Open WebUI 採用**雙層結構**來組織對話:
├─────────────────────────────────────────────────────────┤
│ 2. 解析 Headers 提取 user_id, chat_id, user_name │
│ 3. 登入 Rocket.Chat 取得認證 Token │
│ 4. 創建/取得用戶頻道 (#user-{user_id})
│ 5. 在頻道中創建執行緒訊息
│ 6. 輪詢等待管理員在執行緒中回覆
│ 7. 將回覆返回給 Open WebUI
│ 4. 創建/取得對話頻道 ({user_name}-{chat_id[:8]})
│ 5. 發送用戶訊息到頻道,記錄時間戳
│ 6. 輪詢頻道訊息,用時間戳比較等待管理員回覆
│ 7. 將管理員回覆返回給 Open WebUI │
└──────┬──────────────────────────┬───────────────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────────────────┐
│ PostgreSQL │ │ Rocket.Chat + MongoDB │
│ reply_queue │ ├─────────────────────────┤
└─────────────┘ │ 頻道: #user-abc123
── 🧵 chat-001
├── 用戶訊息
└── 管理員回覆
│ (記錄追蹤) │ 頻道: ckliu-68a77282
└─────────────┘── 💬 ckliu: 測試訊息
└── 💬 管理員: ...
│ 頻道: ckliu-a8224bcf │
│ ├── 💬 ckliu: 測試訊息 │
│ └── 💬 管理員: ... │
└─────────────────────────┘
│ 8. 管理員回覆
│ 8. 管理員直接在頻道回覆
┌─────┴──────┐
│ 管理員瀏覽器│
@@ -110,37 +119,45 @@ Open WebUI 採用**雙層結構**來組織對話:
| Open WebUI | Rocket.Chat | 說明 |
|-----------|-------------|------|
| 用戶 (user_id) | 頻道 (Channel) | 每個用戶一個專屬頻道 `#user-{id}` |
| 對話 (chat_id) | 執行緒 (Thread) | 同一對話的多輪訊息在同一執行緒 |
| 訊息 (message) | 訊息 (Message) | 用戶和管理員的對話內容 |
| 對話 (chat_id) | 頻道 (Channel) | 每個對話一個專屬頻道 `{user_name}-{chat_id[:8]}` |
| 訊息 (message) | 訊息 (Message) | 直接在頻道中發送,不使用 Thread |
| 用戶 (user_name) | 頻道名稱前綴 | 用於識別是誰的對話 |
**設計理念**
- 簡化架構,不使用 Thread執行緒
- 每個對話完全獨立,避免複雜的層級結構
- 頻道名稱直接顯示用戶和對話 ID方便識別
### Rocket.Chat 呈現效果
```
Rocket.Chat 介面:
├── 📂 頻道列表
│ ├── #user-abc123 (張三)
│ └── 描述: 用戶: 張三 (ID: abc123...)
│ ├── #user-def456 (李四)
│ └── 描述: 用戶: 李四 (ID: def456...)
│ └── #user-xyz789 (王五)
│ ├── ckliu-68a77282 (最近活躍)
├── ckliu-a8224bcf
│ ├── alice-3f91c2e1
│ └── bob-7d4e9a23
└── 📂 #user-abc123 (張三) 的內容
├── 🧵 [對話 chat-001] "如何學習 Python?"
├── 💬 張三: "如何學習 Python?"
│ └── 💬 管理員: "推薦從基礎開始..."
├── 🧵 [對話 chat-002] "推薦餐廳"
├── 💬 張三: "台北有什麼好吃的?"
└── 💬 管理員: "推薦鼎泰豐..."
└── 🧵 [對話 chat-003] ⚠️ 待回覆
└── 💬 張三: "旅遊攻略"
└── 📂 ckliu-68a77282 頻道內容
├── 💬 **💬 ckliu:**
NPU能吃嗎...
── 💬 管理員回覆:
NPU 是神經處理單元,不能吃喔 😄
├── 💬 **💬 ckliu:**
那有什麼用途?
└── 💬 管理員回覆:
主要用於 AI 運算加速...
```
**特點**
- 每個頻道 = 一個完整對話
- 訊息直接在頻道中,不用點開 Thread
- 管理員看到新頻道就知道有新對話
- 頻道名稱清楚標示用戶和對話 ID
### 資料庫結構
`reply_queue` 表格結構:
`reply_queue` 表格結構(用於記錄追蹤)
```sql
CREATE TABLE reply_queue (
@@ -154,11 +171,16 @@ CREATE TABLE reply_queue (
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW(),
replied_at TIMESTAMP,
rocketchat_room_id VARCHAR(100),
rocketchat_thread_id VARCHAR(100)
rocketchat_room_id VARCHAR(100), -- 儲存頻道 ID
rocketchat_thread_id VARCHAR(100) -- 保留欄位(目前未使用)
);
```
**說明**
- PostgreSQL 僅用於記錄追蹤,非主要邏輯
- 實際對話內容和回覆檢測都在 Rocket.Chat 中進行
- 使用時間戳比較來判斷是否有新的管理員回覆
### 服務列表
| 服務 | 容器名 | Port | 說明 |
@@ -171,8 +193,9 @@ CREATE TABLE reply_queue (
### 技術特點
1. **雙層映射** - 完美對應 Open WebUI 的用戶+對話結構
2. **執行緒隔離** - 每個對話獨立,不會混雜
3. **即時通知** - Rocket.Chat 支援桌面和手機推送
4. **輕量部署** - 共 5 個容器(含初始化容器)
5. **可擴展性** - 支援多管理員協作回覆
1. **一對一映射** - 每個 Open WebUI 對話對應一個 Rocket.Chat 頻道
2. **簡化架構** - 不使用 Thread減少複雜度和潛在問題
3. **時間戳比較** - 使用 ISO 格式時間戳判斷新訊息,簡單可靠
4. **即時通知** - Rocket.Chat 支援桌面和手機推送
5. **輕量部署** - 共 5 個容器(含初始化容器)
6. **可擴展性** - 支援多管理員協作回覆